From 9c3d22964c137b372357752f6e169f5d7eee1d29 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Mon, 2 Aug 2021 15:16:56 +0800 Subject: [PATCH 001/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=910730=E4=BA=A7=E5=93=81=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=97=AE=E9=A2=98(10,22,23,24)=20https://git.ghzs.com?= =?UTF-8?q?/pm/halo-app-issues/-/issues/1422?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/CommentHelper.kt | 359 ++++++--- .../java/com/gh/gamecenter/entity/MeEntity.kt | 4 +- .../qa/comment/NewCommentAdapter.kt | 165 ++-- .../qa/comment/StairsCommentViewHolder.kt | 237 ++++-- .../qa/comment/base/BaseCommentAdapter.kt | 718 +++++++++++++----- .../qa/comment/base/BaseCommentViewModel.kt | 234 +++--- .../layout/item_article_detail_content.xml | 8 - 7 files changed, 1229 insertions(+), 496 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/CommentHelper.kt b/app/src/main/java/com/gh/common/util/CommentHelper.kt index 317bbe7ed9..07e2324be2 100644 --- a/app/src/main/java/com/gh/common/util/CommentHelper.kt +++ b/app/src/main/java/com/gh/common/util/CommentHelper.kt @@ -27,84 +27,110 @@ import retrofit2.HttpException object CommentHelper { @JvmStatic - fun showCommunityArticleCommentOptions(view: View, - commentEntity: CommentEntity, - showConversation: Boolean, - articleId: String, - communityId: String, - isShowTop: Boolean = false, - ignoreModerator: Boolean = false, - listener: OnCommentOptionClickListener?) { - showCommentOptions(view = view, - commentEntity = commentEntity, - showConversation = showConversation, - articleId = articleId, - communityId = communityId, - isShowTop = isShowTop, - ignoreModerator = ignoreModerator, - listener = listener) + fun showCommunityArticleCommentOptions( + view: View, + commentEntity: CommentEntity, + showConversation: Boolean, + articleId: String, + communityId: String, + isShowTop: Boolean = false, + ignoreModerator: Boolean = false, + listener: OnCommentOptionClickListener? + ) { + showCommentOptions( + view = view, + commentEntity = commentEntity, + showConversation = showConversation, + articleId = articleId, + communityId = communityId, + isShowTop = isShowTop, + ignoreModerator = ignoreModerator, + listener = listener + ) } @JvmStatic - fun showAnswerCommentOptions(view: View, - commentEntity: CommentEntity, - showConversation: Boolean, - answerId: String, - listener: OnCommentOptionClickListener?) { - showCommentOptions(view = view, - commentEntity = commentEntity, - showConversation = showConversation, - answerId = answerId, - listener = listener) + fun showAnswerCommentOptions( + view: View, + commentEntity: CommentEntity, + showConversation: Boolean, + answerId: String, + listener: OnCommentOptionClickListener? + ) { + showCommentOptions( + view = view, + commentEntity = commentEntity, + showConversation = showConversation, + answerId = answerId, + listener = listener + ) } @JvmStatic - fun showVideoCommentOptions(view: View, - commentEntity: CommentEntity, - showConversation: Boolean, - videoId: String, - isVideoAuthor: Boolean, - listener: OnCommentOptionClickListener?) { - showCommentOptions(view = view, - commentEntity = commentEntity, - showConversation = showConversation, - videoId = videoId, - isVideoAuthor = isVideoAuthor, - listener = listener) + fun showVideoCommentOptions( + view: View, + commentEntity: CommentEntity, + showConversation: Boolean, + videoId: String, + isVideoAuthor: Boolean, + isShowTop: Boolean = false, + listener: OnCommentOptionClickListener? + ) { + showCommentOptions( + view = view, + commentEntity = commentEntity, + showConversation = showConversation, + videoId = videoId, + isVideoAuthor = isVideoAuthor, + isShowTop = isShowTop, + listener = listener + ) } - fun showQuestionCommentOption(view: View, - commentEntity: CommentEntity, - questionId: String, - listener: OnCommentOptionClickListener?) { - showCommentOptions(view = view, - commentEntity = commentEntity, - showConversation = false, - questionId = questionId, - isShowTop = true, - ignoreModerator = true, - listener = listener) + fun showQuestionCommentOption( + view: View, + commentEntity: CommentEntity, + questionId: String, + isShowTop: Boolean = false, + listener: OnCommentOptionClickListener? + ) { + showCommentOptions( + view = view, + commentEntity = commentEntity, + showConversation = false, + questionId = questionId, + isShowTop = isShowTop, + ignoreModerator = true, + listener = listener + ) } - private fun showCommentOptions(view: View, - commentEntity: CommentEntity, - showConversation: Boolean, - articleId: String? = null, - communityId: String? = null, - answerId: String? = null, - questionId: String? = null, - videoId: String? = null, - isShowTop: Boolean = false, - ignoreModerator: Boolean = false, - isVideoAuthor: Boolean = false, - listener: OnCommentOptionClickListener? = null) { + private fun showCommentOptions( + view: View, + commentEntity: CommentEntity, + showConversation: Boolean, + articleId: String? = null, + communityId: String? = null, + answerId: String? = null, + questionId: String? = null, + videoId: String? = null, + isShowTop: Boolean = false, + ignoreModerator: Boolean = false, + isVideoAuthor: Boolean = false, + listener: OnCommentOptionClickListener? = null + ) { val context = view.context val dialogOptions = ArrayList() - if (isShowTop && (articleId != null || questionId != null) && commentEntity.me?.isArticleOrAnswerAuthor == true) { + + if (isShowTop && (articleId != null || questionId != null) && (commentEntity.me?.isModerator == true || commentEntity.me?.isContentAuthor == true)) { dialogOptions.add(if (commentEntity.isTop) "取消置顶" else "置顶") } - if (questionId != null && commentEntity.me?.isArticleOrAnswerAuthor == true && !commentEntity.accept) { - dialogOptions.add("采纳") + if (questionId != null && commentEntity.me?.isContentAuthor == true) { + if (commentEntity.accept) { + dialogOptions.add("取消采纳") + } else { + dialogOptions.add("采纳") + } } dialogOptions.add("复制") @@ -114,10 +140,7 @@ object CommentHelper { if (questionId != null && commentEntity.me?.isModerator == true && !commentEntity.choiceness) { dialogOptions.add("加精选") } - if (isVideoAuthor || (videoId != null && commentEntity.user.id == UserManager.getInstance().userId)) { - dialogOptions.add("删除评论") - } else if ((articleId != null || questionId != null) && (commentEntity.user.id == UserManager.getInstance().userId || - commentEntity.me?.isModerator == true || commentEntity.me?.isArticleOrAnswerAuthor == true)) { + if (commentEntity.user.id == UserManager.getInstance().userId || commentEntity.me?.isModerator == true || commentEntity.me?.isContentAuthor == true) { dialogOptions.add("删除评论") } @@ -125,9 +148,10 @@ object CommentHelper { if (ignoreModerator) return@let if (it.isModerator || (it.moderatorPermissions.hideAnswerComment > Permissions.GUEST - || it.moderatorPermissions.topAnswerComment > Permissions.GUEST - || it.moderatorPermissions.hideCommunityArticleComment > Permissions.GUEST - || it.moderatorPermissions.topCommunityArticleComment > Permissions.GUEST)) { + || it.moderatorPermissions.topAnswerComment > Permissions.GUEST + || it.moderatorPermissions.hideCommunityArticleComment > Permissions.GUEST + || it.moderatorPermissions.topCommunityArticleComment > Permissions.GUEST) + ) { dialogOptions.add("管理") } } @@ -138,9 +162,11 @@ object CommentHelper { val inflater = LayoutInflater.from(context) val layout = inflater.inflate(R.layout.layout_popup_container, null) - val popupWindow = BugFixedPopupWindow(layout, - LinearLayout.LayoutParams.WRAP_CONTENT, - LinearLayout.LayoutParams.WRAP_CONTENT) + val popupWindow = BugFixedPopupWindow( + layout, + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ) val container = layout.findViewById(R.id.container) for (text in dialogOptions) { val item = inflater.inflate(R.layout.layout_popup_option_item, container, false) @@ -153,39 +179,72 @@ object CommentHelper { popupWindow.dismiss() listener?.onCommentOptionClick(commentEntity, text) when (text) { - "管理" -> showControlDialog(context, answerId, articleId, communityId, commentEntity, commentEntity.me!!) + "管理" -> showControlDialog( + context, + answerId, + articleId, + communityId, + commentEntity, + commentEntity.me!! + ) "复制" -> copyText(commentEntity.content, context) "投诉" -> { context.ifLogin("回答详情-评论-投诉") { showReportTypeDialog(context) { reportType -> - val commentListener = object : PostCommentUtils.PostCommentListener { - override fun postSuccess(response: JSONObject?) { - Utils.toast(context, "感谢您的投诉") - } + val commentListener = + object : PostCommentUtils.PostCommentListener { + override fun postSuccess(response: JSONObject?) { + Utils.toast(context, "感谢您的投诉") + } - override fun postFailed(error: Throwable?) { - if (error == null) { - Utils.toast(context, "投诉失败,请稍后重试") - } else { - Utils.toast(context, "投诉失败,${error.message}") + override fun postFailed(error: Throwable?) { + if (error == null) { + Utils.toast(context, "投诉失败,请稍后重试") + } else { + Utils.toast(context, "投诉失败,${error.message}") + } } } - } when { answerId != null -> { - PostCommentUtils.postAnswerReportData(context, commentEntity.id, answerId, reportType, commentListener) + PostCommentUtils.postAnswerReportData( + context, + commentEntity.id, + answerId, + reportType, + commentListener + ) } articleId != null -> { - PostCommentUtils.reportCommunityArticleComment(context, communityId, articleId, commentEntity.id, reportType, commentListener) + PostCommentUtils.reportCommunityArticleComment( + context, + communityId, + articleId, + commentEntity.id, + reportType, + commentListener + ) } questionId != null -> { - PostCommentUtils.reportQuestionComment(context, questionId, commentEntity.id, reportType, commentListener) + PostCommentUtils.reportQuestionComment( + context, + questionId, + commentEntity.id, + reportType, + commentListener + ) } else -> { - PostCommentUtils.reportVideoComment(context, videoId, commentEntity.id, reportType, commentListener) + PostCommentUtils.reportVideoComment( + context, + videoId, + commentEntity.id, + reportType, + commentListener + ) } } } @@ -194,14 +253,37 @@ object CommentHelper { "查看对话" -> { if (answerId != null) { - context.startActivity(CommentDetailActivity - .getAnswerCommentIntent(context, commentEntity.id, answerId, null)) + context.startActivity( + CommentDetailActivity + .getAnswerCommentIntent( + context, + commentEntity.id, + answerId, + null + ) + ) } else if (articleId != null) { - context.startActivity(CommentDetailActivity - .getCommunityArticleCommentIntent(context, articleId, commentEntity.id, communityId, null)) + context.startActivity( + CommentDetailActivity + .getCommunityArticleCommentIntent( + context, + articleId, + commentEntity.id, + communityId, + null + ) + ) } else { - context.startActivity(CommentDetailActivity - .getVideoCommentIntent(context, commentEntity.id, videoId, isVideoAuthor, null)) + context.startActivity( + CommentDetailActivity + .getVideoCommentIntent( + context, + commentEntity.id, + videoId, + isVideoAuthor, + null + ) + ) } } } @@ -213,12 +295,14 @@ object CommentHelper { popupWindow.showAutoOrientation(view) } - private fun showControlDialog(context: Context, - answerId: String? = null, - articleId: String? = null, - communityId: String? = null, - comment: CommentEntity, - me: MeEntity) { + private fun showControlDialog( + context: Context, + answerId: String? = null, + articleId: String? = null, + communityId: String? = null, + comment: CommentEntity, + me: MeEntity + ) { val dialogOptions = arrayListOf() val highlight = "置顶评论" val hide = "隐藏评论" @@ -227,19 +311,23 @@ object CommentHelper { var canHideCommentDirectly = false if (me.isModerator || me.moderatorPermissions.topAnswerComment > Permissions.GUEST - || me.moderatorPermissions.topCommunityArticleComment > Permissions.GUEST) { + || me.moderatorPermissions.topCommunityArticleComment > Permissions.GUEST + ) { dialogOptions.add(highlight) if (me.moderatorPermissions.topAnswerComment > Permissions.REPORTER - || me.moderatorPermissions.topCommunityArticleComment > Permissions.REPORTER) { + || me.moderatorPermissions.topCommunityArticleComment > Permissions.REPORTER + ) { canHighlightCommentDirectly = true } } if (me.isModerator || me.moderatorPermissions.hideAnswerComment > Permissions.GUEST - || me.moderatorPermissions.hideCommunityArticleComment > Permissions.GUEST) { + || me.moderatorPermissions.hideCommunityArticleComment > Permissions.GUEST + ) { dialogOptions.add(hide) if (me.moderatorPermissions.hideAnswerComment > Permissions.REPORTER - || me.moderatorPermissions.hideCommunityArticleComment > Permissions.REPORTER) { + || me.moderatorPermissions.hideCommunityArticleComment > Permissions.REPORTER + ) { canHideCommentDirectly = true } } @@ -300,7 +388,10 @@ object CommentHelper { val errorJson = JSONObject(string) val errorCode = errorJson.getInt("code") if (errorCode == 403059) { - Utils.toast(HaloApp.getInstance().application, "权限错误,请刷新后重试") + Utils.toast( + HaloApp.getInstance().application, + "权限错误,请刷新后重试" + ) return } else { Utils.toast(HaloApp.getInstance().application, e.message()) @@ -311,23 +402,31 @@ object CommentHelper { } if (answerId != null) { - DialogUtils.showAlertDialog(context, highlight, highlightDialogHintContent, - "确定", "取消", { - RetrofitManager.getInstance(context).api + DialogUtils.showAlertDialog( + context, highlight, highlightDialogHintContent, + "确定", "取消", { + RetrofitManager.getInstance(context).api .highlightAnswerComment(answerId, comment.id) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(highlightObserver) - }, null) + }, null + ) } else { - DialogUtils.showAlertDialog(context, highlight, highlightDialogHintContent, - "确定", "取消", { - RetrofitManager.getInstance(context).api - .highlightCommunityArticleComment(communityId, articleId, comment.id) + DialogUtils.showAlertDialog( + context, highlight, highlightDialogHintContent, + "确定", "取消", { + RetrofitManager.getInstance(context).api + .highlightCommunityArticleComment( + communityId, + articleId, + comment.id + ) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(highlightObserver) - }, null) + }, null + ) } } @@ -349,7 +448,10 @@ object CommentHelper { val errorJson = JSONObject(string) val errorCode = errorJson.getInt("code") if (errorCode == 403059) { - Utils.toast(HaloApp.getInstance().application, "权限错误,请刷新后重试") + Utils.toast( + HaloApp.getInstance().application, + "权限错误,请刷新后重试" + ) return } else { Utils.toast(HaloApp.getInstance().application, e.message()) @@ -360,30 +462,37 @@ object CommentHelper { } if (answerId != null) { - DialogUtils.showAlertDialog(context, hide, hideDialogHintContent, - "确定", "取消", { - RetrofitManager.getInstance(context).api + DialogUtils.showAlertDialog( + context, hide, hideDialogHintContent, + "确定", "取消", { + RetrofitManager.getInstance(context).api .hideAnswerComment(answerId, comment.id) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(hideObserver) - }, null) + }, null + ) } else { - DialogUtils.showAlertDialog(context, hide, hideDialogHintContent, - "确定", "取消", { - RetrofitManager.getInstance(context).api + DialogUtils.showAlertDialog( + context, hide, hideDialogHintContent, + "确定", "取消", { + RetrofitManager.getInstance(context).api .hideCommunityArticleComment(communityId, articleId, comment.id) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(hideObserver) - }, null) + }, null + ) } } } } } - private fun showReportTypeDialog(context: Context, reportCallback: (reportType: String) -> Unit) { + private fun showReportTypeDialog( + context: Context, + reportCallback: (reportType: String) -> Unit + ) { val reportTypes = arrayListOf("垃圾广告营销", "恶意攻击谩骂", "淫秽色情信息", "违法有害信息", "其它") DialogUtils.showVideoComplaintDialog(context, reportTypes, null) { text -> reportCallback.invoke(text) diff --git a/app/src/main/java/com/gh/gamecenter/entity/MeEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/MeEntity.kt index cd4af55426..53a94a8d8d 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/MeEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/MeEntity.kt @@ -106,8 +106,8 @@ class MeEntity(@SerializedName("is_community_voted") @SerializedName("permissions") val moderatorPermissions: Permissions = Permissions(), - @SerializedName("is_answer_author", alternate = ["is_community_article_author", "is_question_author"]) - val isArticleOrAnswerAuthor: Boolean = false, //用于判断是否是当前评论关联的回答/文章/问题的作者 + @SerializedName("is_answer_author", alternate = ["is_community_article_author", "is_question_author", "is_video_author"]) + val isContentAuthor: Boolean = false, //用于判断是否是当前评论关联的回答/文章/问题/视频的作者 @SerializedName("article_draft") var articleDraft: ArticleDraftEntity? = null,//帖子详情可能返回草稿 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 e0a6637d38..90e6f16681 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 @@ -16,12 +16,14 @@ import com.gh.gamecenter.baselist.ListAdapter import com.gh.gamecenter.entity.CommentEntity import com.gh.gamecenter.gamedetail.rating.edit.RatingEditActivity -class NewCommentAdapter(context: Context, - var mViewModel: NewCommentViewModel, - var mIsShowingConversation: Boolean, - var mCommentCallBackListener: OnCommentCallBackListener, - var mCommentOptionClickListener: OnCommentOptionClickListener? = null, - var mEntrance: String) : ListAdapter(context) { +class NewCommentAdapter( + context: Context, + var mViewModel: NewCommentViewModel, + var mIsShowingConversation: Boolean, + var mCommentCallBackListener: OnCommentCallBackListener, + var mCommentOptionClickListener: OnCommentOptionClickListener? = null, + var mEntrance: String +) : ListAdapter(context) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return if (viewType == ItemViewType.LOADING) { @@ -61,12 +63,28 @@ class NewCommentAdapter(context: Context, val colon = " :" val parentUserName = " ${commentEntity.parentUser?.name} " - val prefixSpan = SpanBuilder(prefix).color(holder.itemView.context, 0, prefix.length, R.color.text_999999).build() + val prefixSpan = SpanBuilder(prefix).color( + holder.itemView.context, + 0, + prefix.length, + R.color.text_999999 + ).build() val parentUserNameSpan = SpanBuilder(parentUserName) - .click(0, parentUserName.length, R.color.text_666666) { - DirectUtils.directToHomeActivity(holder.itemView.context, commentEntity.user.id, 1, mEntrance, "") - }.build() - val colonSpan = SpanBuilder(colon).color(holder.itemView.context, 0, colon.length, R.color.text_999999).build() + .click(0, parentUserName.length, R.color.text_666666) { + DirectUtils.directToHomeActivity( + holder.itemView.context, + commentEntity.user.id, + 1, + mEntrance, + "" + ) + }.build() + val colonSpan = SpanBuilder(colon).color( + holder.itemView.context, + 0, + colon.length, + R.color.text_999999 + ).build() val authorSpan = if (commentEntity.parentUser?.me?.isCommentOwner == true) { SpanBuilder("作者").image(0, "作者".length, R.drawable.ic_hint_author).build() } else { @@ -74,17 +92,18 @@ class NewCommentAdapter(context: Context, } holder.commentContentTv.text = SpannableStringBuilder() - .append(prefixSpan) - .append(parentUserNameSpan) - .append(authorSpan) - .append(colonSpan) - .append(commentEntity.content) + .append(prefixSpan) + .append(parentUserNameSpan) + .append(authorSpan) + .append(colonSpan) + .append(commentEntity.content) } else { holder.commentContentTv.text = commentEntity.content } holder.commentContentTv.setOnLongClickListener(View.OnLongClickListener { isChildLongClick = true - commentEntity.content?.replace(RatingEditActivity.LABEL_REPLACE_REGEX.toRegex(), "")?.copyTextAndToast() + commentEntity.content?.replace(RatingEditActivity.LABEL_REPLACE_REGEX.toRegex(), "") + ?.copyTextAndToast() return@OnLongClickListener true }) @@ -100,23 +119,51 @@ class NewCommentAdapter(context: Context, holder.userBadgeSdv.setOnClickListener { v -> DialogUtils.showViewBadgeDialog(mContext, commentEntity.user.badge) { - MtaHelper.onEvent("进入徽章墙_用户记录", key, commentEntity.user.name + "(" + commentEntity.user.id + ")") + MtaHelper.onEvent( + "进入徽章墙_用户记录", + key, + commentEntity.user.name + "(" + commentEntity.user.id + ")" + ) MtaHelper.onEvent("徽章中心", "进入徽章中心", key) - DirectUtils.directToBadgeWall(mContext, commentEntity.user.id, commentEntity.user.name, commentEntity.user.icon) + DirectUtils.directToBadgeWall( + mContext, + commentEntity.user.id, + commentEntity.user.name, + commentEntity.user.icon + ) } } holder.badgeNameTv.setOnClickListener { v -> holder.userBadgeSdv.performClick() } holder.quoteAuthorBadgeSdv.setOnClickListener { v -> DialogUtils.showViewBadgeDialog(mContext, commentEntity.parentUser!!.badge) { - MtaHelper.onEvent("进入徽章墙_用户记录", key, commentEntity.parentUser!!.name + "(" + commentEntity.parentUser!!.id + ")") + MtaHelper.onEvent( + "进入徽章墙_用户记录", + key, + commentEntity.parentUser!!.name + "(" + commentEntity.parentUser!!.id + ")" + ) MtaHelper.onEvent("徽章中心", "进入徽章中心", key) - DirectUtils.directToBadgeWall(mContext, commentEntity.parentUser!!.id, commentEntity.parentUser!!.name, commentEntity.parentUser!!.icon) + DirectUtils.directToBadgeWall( + mContext, + commentEntity.parentUser!!.id, + commentEntity.parentUser!!.name, + commentEntity.parentUser!!.icon + ) } } holder.commentLikeContainer.setOnClickListener { - CommentUtils.likeComment(mContext, mViewModel.answerId, mViewModel.articleId, - mViewModel.communityId, mViewModel.videoId, mViewModel.questionId, commentEntity, holder.commentLikeCountTv, holder.commentLikeIv, null) + CommentUtils.likeComment( + mContext, + mViewModel.answerId, + mViewModel.articleId, + mViewModel.communityId, + mViewModel.videoId, + mViewModel.questionId, + commentEntity, + holder.commentLikeCountTv, + holder.commentLikeIv, + null + ) } holder.itemView.setOnClickListener { @@ -135,33 +182,40 @@ class NewCommentAdapter(context: Context, when (mViewModel.commentType) { CommentType.ANSWER, CommentType.ANSWER_CONVERSATION -> { - CommentHelper.showAnswerCommentOptions(it, - commentEntity, - mIsShowingConversation, - mViewModel.answerId, - mCommentOptionClickListener) + CommentHelper.showAnswerCommentOptions( + it, + commentEntity, + mIsShowingConversation, + mViewModel.answerId, + mCommentOptionClickListener + ) } CommentType.COMMUNITY_ARTICLE, CommentType.COMMUNITY_ARTICLE_CONVERSATION -> { - CommentHelper.showCommunityArticleCommentOptions(it, - commentEntity, - mIsShowingConversation, - mViewModel.articleId, - mViewModel.communityId, - isShowTop = false, - ignoreModerator = false, - listener = mCommentOptionClickListener) + CommentHelper.showCommunityArticleCommentOptions( + it, + commentEntity, + mIsShowingConversation, + mViewModel.articleId, + mViewModel.communityId, + isShowTop = false, + ignoreModerator = false, + listener = mCommentOptionClickListener + ) } CommentType.VIDEO, CommentType.VIDEO_CONVERSATION -> { - CommentHelper.showVideoCommentOptions(it, - commentEntity, - mIsShowingConversation, - mViewModel.videoId, - mViewModel.isVideoAuthor, - mCommentOptionClickListener) + CommentHelper.showVideoCommentOptions( + it, + commentEntity, + mIsShowingConversation, + mViewModel.videoId, + mViewModel.isVideoAuthor, + false, + mCommentOptionClickListener + ) } } } @@ -182,8 +236,24 @@ class NewCommentAdapter(context: Context, val userHomePageTabPosition = if (mViewModel.commentType.isVideo()) 2 else 1 - holder.commentUserIconDv.setOnClickListener { DirectUtils.directToHomeActivity(mContext, commentEntity.user.id, userHomePageTabPosition, mEntrance, path) } - holder.commentUserNameTv.setOnClickListener { DirectUtils.directToHomeActivity(mContext, commentEntity.user.id, userHomePageTabPosition, mEntrance, path) } + holder.commentUserIconDv.setOnClickListener { + DirectUtils.directToHomeActivity( + mContext, + commentEntity.user.id, + userHomePageTabPosition, + mEntrance, + path + ) + } + holder.commentUserNameTv.setOnClickListener { + DirectUtils.directToHomeActivity( + mContext, + commentEntity.user.id, + userHomePageTabPosition, + mEntrance, + path + ) + } if (commentEntity.priority != 0) { holder.commentBadge.visibility = View.VISIBLE @@ -194,7 +264,12 @@ class NewCommentAdapter(context: Context, private fun initFooterViewHolder(holder: FooterViewHolder) { holder.hint.textSize = 12f - holder.hint.setTextColor(ContextCompat.getColor(holder.itemView.context, R.color.text_B3B3B3)) + holder.hint.setTextColor( + ContextCompat.getColor( + holder.itemView.context, + R.color.text_B3B3B3 + ) + ) if (mIsNetworkError) { holder.loading.visibility = View.GONE holder.hint.setText(R.string.loading_error_network) 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 ea6c9dce03..d0777345a8 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 @@ -20,7 +20,10 @@ import com.gh.gamecenter.manager.UserManager import com.halo.assistant.HaloApp import io.reactivex.disposables.Disposable -class StairsCommentViewHolder(val binding: StairsCommentItemBinding, val isReplyComment: Boolean = false) : BaseRecyclerViewHolder(binding.root) { +class StairsCommentViewHolder( + val binding: StairsCommentItemBinding, + val isReplyComment: Boolean = false +) : BaseRecyclerViewHolder(binding.root) { var isFirstClick = true @@ -32,7 +35,12 @@ class StairsCommentViewHolder(val binding: StairsCommentItemBinding, val isReply binding.commentLikeCount.visibility = View.GONE } else { // 检查是否已点赞 if (userDataEntity != null && userDataEntity.isCommentVoted) { - binding.commentLikeCount.setTextColor(ContextCompat.getColor(mContext, R.color.theme_font)) + binding.commentLikeCount.setTextColor( + ContextCompat.getColor( + mContext, + R.color.theme_font + ) + ) binding.commentLike.setImageResource(R.drawable.comment_vote_select) } binding.commentLikeCount.visibility = View.VISIBLE @@ -56,12 +64,18 @@ class StairsCommentViewHolder(val binding: StairsCommentItemBinding, val isReply } if (parentUser != null && !TextUtils.isEmpty(parentUser.name)) { val name = "${entity.user.name} 回复 ${parentUser.name}" - binding.commentUserName.text = SpanBuilder(name).color((entity.user.name?.length - ?: 0) + 1, (entity.user.name?.length ?: 0) + 3, R.color.text_666666).build() + binding.commentUserName.text = SpanBuilder(name).color( + (entity.user.name?.length + ?: 0) + 1, (entity.user.name?.length ?: 0) + 3, R.color.text_666666 + ).build() } else { binding.commentUserName.text = userInfo.name } - binding.commentUserIcon.display(userInfo.iconBorder?.url, userInfo.icon, userInfo.auth?.icon) + binding.commentUserIcon.display( + userInfo.iconBorder?.url, + userInfo.icon, + userInfo.auth?.icon + ) } else { if (entity.me != null && entity.me!!.isContentOwner && entity.parent == null) { binding.commentAuthor.visibility = View.VISIBLE @@ -70,19 +84,31 @@ class StairsCommentViewHolder(val binding: StairsCommentItemBinding, val isReply } if (parentUser != null && !TextUtils.isEmpty(parentUser.name)) { val name = "${entity.user.name} 回复 ${parentUser.name}" - binding.commentUserName.text = SpanBuilder(name).color((entity.user.name?.length - ?: 0) + 1, (entity.user.name?.length ?: 0) + 3, R.color.text_666666).build() + binding.commentUserName.text = SpanBuilder(name).color( + (entity.user.name?.length + ?: 0) + 1, (entity.user.name?.length ?: 0) + 3, R.color.text_666666 + ).build() } else { binding.commentUserName.text = entity.user.name } - binding.commentUserIcon.display(entity.user.border, entity.user.icon, entity.user.auth?.icon) + binding.commentUserIcon.display( + entity.user.border, + entity.user.icon, + entity.user.auth?.icon + ) } } - fun initCommentViewHolder(holder: StairsCommentViewHolder, mViewModel: NewCommentViewModel, commentEntity: CommentEntity, - mEntrance: String, mIsShowingConversation: Boolean, mCommentOptionClickListener: OnCommentOptionClickListener?, - mCommentCallBackListener: OnCommentCallBackListener) { + fun initCommentViewHolder( + holder: StairsCommentViewHolder, + mViewModel: NewCommentViewModel, + commentEntity: CommentEntity, + mEntrance: String, + mIsShowingConversation: Boolean, + mCommentOptionClickListener: OnCommentOptionClickListener?, + mCommentCallBackListener: OnCommentCallBackListener + ) { val context = holder.binding.root.context var isChildLongClick = false holder.setCommentUserView(binding.root.context, commentEntity) @@ -98,19 +124,34 @@ class StairsCommentViewHolder(val binding: StairsCommentItemBinding, val isReply } else { 24f.dip2px() } - initStairsReplyComment(holder, mViewModel, commentEntity, mEntrance, mIsShowingConversation, mCommentOptionClickListener, mCommentCallBackListener) + initStairsReplyComment( + holder, + mViewModel, + commentEntity, + mEntrance, + mIsShowingConversation, + mCommentOptionClickListener, + mCommentCallBackListener + ) } holder.binding.commentContainer.layoutParams = params if (!TextUtils.isEmpty(mViewModel.videoId)) { - val spannable = TextHelper.getHighlightedSpannableStringThatIsWrappedInsideWrapper(context, commentEntity.content - ?: "") + val spannable = TextHelper.getHighlightedSpannableStringThatIsWrappedInsideWrapper( + context, commentEntity.content + ?: "" + ) //当评论同时满足以下两个条件:①来源于作者;②权重为1时,前端不显示“置顶”标志 if (!(commentEntity.me?.isContentOwner == true && commentEntity.priority == 1)) { if (commentEntity.priority != 0) { spannable.append(" ") - spannable.setSpan(CenterImageSpan(HaloApp.getInstance().application, R.drawable.ic_comment_top), spannable.length - 1, spannable.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + spannable.setSpan( + CenterImageSpan( + HaloApp.getInstance().application, + R.drawable.ic_comment_top + ), spannable.length - 1, spannable.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + ) } } holder.binding.commentContent.text = spannable @@ -131,51 +172,108 @@ class StairsCommentViewHolder(val binding: StairsCommentItemBinding, val isReply holder.binding.sdvUserBadge.setOnClickListener { v -> DialogUtils.showViewBadgeDialog(binding.root.context, commentEntity.user.badge) { - MtaHelper.onEvent("进入徽章墙_用户记录", key, commentEntity.user.name + "(" + commentEntity.user.id + ")") + 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) + DirectUtils.directToBadgeWall( + binding.root.context, + commentEntity.user.id, + commentEntity.user.name, + commentEntity.user.icon + ) } } - var isVote = holder.binding.commentLikeCount.currentTextColor == ContextCompat.getColor(context, R.color.theme_font) + var isVote = holder.binding.commentLikeCount.currentTextColor == ContextCompat.getColor( + context, + R.color.theme_font + ) holder.binding.commentLikeContainer.setOnClickListener { FastClickUtils.click { if (!it) { - if (holder.binding.commentLikeCount.currentTextColor == ContextCompat.getColor(context, R.color.theme_font)) { + if (holder.binding.commentLikeCount.currentTextColor == ContextCompat.getColor( + context, + R.color.theme_font + ) + ) { commentEntity.vote = commentEntity.vote - 1 - holder.binding.commentLikeCount.setTextColor(ContextCompat.getColor(context, R.color.hint)) + holder.binding.commentLikeCount.setTextColor( + ContextCompat.getColor( + context, + R.color.hint + ) + ) holder.binding.commentLike.setImageResource(R.drawable.comment_vote_unselect) holder.binding.commentLikeCount.text = transSimpleCount(commentEntity.vote) - holder.binding.commentLikeCount.visibility = if (commentEntity.vote == 0) View.GONE else View.VISIBLE + holder.binding.commentLikeCount.visibility = + if (commentEntity.vote == 0) View.GONE else View.VISIBLE } else { commentEntity.vote = commentEntity.vote + 1 - holder.binding.commentLikeCount.setTextColor(ContextCompat.getColor(context, R.color.theme_font)) + holder.binding.commentLikeCount.setTextColor( + ContextCompat.getColor( + context, + R.color.theme_font + ) + ) holder.binding.commentLike.setImageResource(R.drawable.comment_vote_select) holder.binding.commentLikeCount.text = transSimpleCount(commentEntity.vote) holder.binding.commentLikeCount.visibility = View.VISIBLE } } else { - if (isVote && holder.binding.commentLikeCount.currentTextColor != ContextCompat.getColor(context, R.color.theme_font)) { + if (isVote && holder.binding.commentLikeCount.currentTextColor != ContextCompat.getColor( + context, + R.color.theme_font + ) + ) { //取消点赞 - CommentUtils.unVoteVideoComment(binding.root.context, mViewModel.videoId, commentEntity, holder.binding.commentLikeCount, holder.binding.commentLike) - } else if (!isVote && holder.binding.commentLikeCount.currentTextColor == ContextCompat.getColor(context, R.color.theme_font)) { + CommentUtils.unVoteVideoComment( + binding.root.context, + mViewModel.videoId, + commentEntity, + holder.binding.commentLikeCount, + holder.binding.commentLike + ) + } else if (!isVote && holder.binding.commentLikeCount.currentTextColor == ContextCompat.getColor( + context, + R.color.theme_font + ) + ) { //点赞 - CommentUtils.voteVideoComment(binding.root.context, mViewModel.answerId, mViewModel.articleId, - mViewModel.communityId, mViewModel.videoId, commentEntity, holder.binding.commentLikeCount, holder.binding.commentLike, null) + CommentUtils.voteVideoComment( + binding.root.context, + mViewModel.answerId, + mViewModel.articleId, + mViewModel.communityId, + mViewModel.videoId, + commentEntity, + holder.binding.commentLikeCount, + holder.binding.commentLike, + null + ) } - isVote = holder.binding.commentLikeCount.currentTextColor == ContextCompat.getColor(context, R.color.theme_font) + isVote = + holder.binding.commentLikeCount.currentTextColor == ContextCompat.getColor( + context, + R.color.theme_font + ) } } } holder.itemView.setOnLongClickListener(View.OnLongClickListener { isChildLongClick = true - CommentHelper.showVideoCommentOptions(holder.binding.commentLikeContainer, - commentEntity, - mIsShowingConversation, - mViewModel.videoId, - mViewModel.isVideoAuthor, - mCommentOptionClickListener) + CommentHelper.showVideoCommentOptions( + holder.binding.commentLikeContainer, + commentEntity, + mIsShowingConversation, + mViewModel.videoId, + mViewModel.isVideoAuthor, + false, + mCommentOptionClickListener + ) return@OnLongClickListener true }) @@ -201,21 +299,53 @@ class StairsCommentViewHolder(val binding: StairsCommentItemBinding, val isReply CommentType.COMMUNITY_QUESTION, CommentType.COMMUNITY_QUESTION_CONVERSATION -> "问题详情-评论管理" } - holder.binding.commentUserIcon.setOnClickListener { DirectUtils.directToHomeActivity(binding.root.context, commentEntity.user.id, 2, mEntrance, path) } - holder.binding.commentUserName.setOnClickListener { DirectUtils.directToHomeActivity(binding.root.context, commentEntity.user.id, 2, mEntrance, path) } + holder.binding.commentUserIcon.setOnClickListener { + DirectUtils.directToHomeActivity( + binding.root.context, + commentEntity.user.id, + 2, + mEntrance, + path + ) + } + holder.binding.commentUserName.setOnClickListener { + DirectUtils.directToHomeActivity( + binding.root.context, + commentEntity.user.id, + 2, + mEntrance, + path + ) + } } //楼层回复 - private fun initStairsReplyComment(holder: StairsCommentViewHolder, mViewModel: NewCommentViewModel, commentEntity: CommentEntity, - mEntrance: String, mIsShowingConversation: Boolean, mCommentOptionClickListener: OnCommentOptionClickListener?, - mCommentCallBackListener: OnCommentCallBackListener) { - holder.binding.replyContainer.visibility = if (commentEntity.reply > 0 || !commentEntity.subCommentList.isNullOrEmpty()) View.VISIBLE else View.GONE - holder.binding.expandMoreLl.visibility = if (commentEntity.reply > 0) View.VISIBLE else View.GONE + private fun initStairsReplyComment( + holder: StairsCommentViewHolder, + mViewModel: NewCommentViewModel, + commentEntity: CommentEntity, + mEntrance: String, + mIsShowingConversation: Boolean, + mCommentOptionClickListener: OnCommentOptionClickListener?, + mCommentCallBackListener: OnCommentCallBackListener + ) { + holder.binding.replyContainer.visibility = + if (commentEntity.reply > 0 || !commentEntity.subCommentList.isNullOrEmpty()) View.VISIBLE else View.GONE + holder.binding.expandMoreLl.visibility = + if (commentEntity.reply > 0) View.VISIBLE else View.GONE var stairsCommentReplyAdapter: StairsCommentReplyAdapter? holder.binding.stairsRv.apply { isNestedScrollingEnabled = false layoutManager = LinearLayoutManager(holder.binding.root.context) - stairsCommentReplyAdapter = StairsCommentReplyAdapter(holder.binding.root.context, mViewModel, commentEntity, mEntrance, mIsShowingConversation, mCommentOptionClickListener, mCommentCallBackListener) + stairsCommentReplyAdapter = StairsCommentReplyAdapter( + holder.binding.root.context, + mViewModel, + commentEntity, + mEntrance, + mIsShowingConversation, + mCommentOptionClickListener, + mCommentCallBackListener + ) if (commentEntity.subCommentList != null) { stairsCommentReplyAdapter?.replyComments?.addAll(commentEntity.subCommentList!!) } @@ -237,7 +367,8 @@ class StairsCommentViewHolder(val binding: StairsCommentItemBinding, val isReply page++ getCommentReply { if (it < 3 || replyComments.size == commentEntity.reply + (commentEntity.subCommentList?.size - ?: 0)) { + ?: 0) + ) { setExpandMoreView(holder, commentEntity, false) } else { setExpandMoreView(holder, commentEntity, true) @@ -249,17 +380,31 @@ class StairsCommentViewHolder(val binding: StairsCommentItemBinding, val isReply } } - private fun setExpandMoreView(holder: StairsCommentViewHolder, commentEntity: CommentEntity, isExpand: Boolean) { + private fun setExpandMoreView( + holder: StairsCommentViewHolder, + commentEntity: CommentEntity, + isExpand: Boolean + ) { if (isExpand) { holder.binding.expandMoreTv.text = if (isFirstClick) { "展开${commentEntity.reply}条回复" } else { "展开更多回复" } - holder.binding.expandMoreIv.setImageDrawable(ContextCompat.getDrawable(holder.binding.root.context, R.drawable.ic_expand_down)) + holder.binding.expandMoreIv.setImageDrawable( + ContextCompat.getDrawable( + holder.binding.root.context, + R.drawable.ic_expand_down + ) + ) } else { holder.binding.expandMoreTv.text = "收起" - holder.binding.expandMoreIv.setImageDrawable(ContextCompat.getDrawable(holder.binding.root.context, R.drawable.ic_shrink_up)) + holder.binding.expandMoreIv.setImageDrawable( + ContextCompat.getDrawable( + holder.binding.root.context, + R.drawable.ic_shrink_up + ) + ) } } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt index d4a7cabdd8..5bf2baf737 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt @@ -28,16 +28,18 @@ import com.gh.gamecenter.qa.article.detail.ArticleDetailViewModel import com.gh.gamecenter.qa.article.detail.CommentItemData import com.gh.gamecenter.qa.comment.CommentActivity import com.gh.gamecenter.qa.comment.OnCommentOptionClickListener +import com.gh.gamecenter.qa.comment.conversation.CommentConversationViewModel import com.gh.gamecenter.qa.entity.ArticleDetailEntity import com.gh.gamecenter.qa.entity.QuestionsDetailEntity import com.gh.gamecenter.qa.video.detail.comment.VideoCommentViewModel -abstract class BaseCommentAdapter(context: Context, - private var mViewModel: BaseCommentViewModel, - private var mType: AdapterType, - private var mEntrance: String, - var commentClosure: ((CommentEntity) -> Unit)? = null) - : ListAdapter(context), ISyncAdapterHandler { +abstract class BaseCommentAdapter( + context: Context, + private var mViewModel: BaseCommentViewModel, + private var mType: AdapterType, + private var mEntrance: String, + var commentClosure: ((CommentEntity) -> Unit)? = null +) : ListAdapter(context), ISyncAdapterHandler { var filterVH: CommentFilterViewHolder? = null @@ -72,26 +74,53 @@ abstract class BaseCommentAdapter(context: Context, override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { return when (viewType) { ItemViewType.ITEM_FOOTER -> { - val binding: ItemArticleDetailCommentFooterBinding = DataBindingUtil.inflate(mLayoutInflater, R.layout.item_article_detail_comment_footer, parent, false) + val binding: ItemArticleDetailCommentFooterBinding = DataBindingUtil.inflate( + mLayoutInflater, + R.layout.item_article_detail_comment_footer, + parent, + false + ) CommentFooterViewHolder(binding) } ITEM_COMMENT_NORMAL -> { - val binding: ItemArticleDetailCommentBinding = DataBindingUtil.inflate(mLayoutInflater, R.layout.item_article_detail_comment, parent, false) + val binding: ItemArticleDetailCommentBinding = DataBindingUtil.inflate( + mLayoutInflater, + R.layout.item_article_detail_comment, + parent, + false + ) CommentItemViewHolder(binding, mType) } ITEM_FILTER -> { - val binding: PieceArticleDetailCommentFilterBinding = DataBindingUtil.inflate(mLayoutInflater, R.layout.piece_article_detail_comment_filter, parent, false) + val binding: PieceArticleDetailCommentFilterBinding = DataBindingUtil.inflate( + mLayoutInflater, + R.layout.piece_article_detail_comment_filter, + parent, + false + ) CommentFilterViewHolder(binding).apply { filterVH = this } } ITEM_ERROR_EMPTY -> { - CommentErrorViewHolder(mLayoutInflater.inflate(R.layout.item_article_detail_comment_empty, parent, false)) + CommentErrorViewHolder( + mLayoutInflater.inflate( + R.layout.item_article_detail_comment_empty, + parent, + false + ) + ) } ITEM_ERROR_CONNECTION -> { - CommentErrorViewHolder(mLayoutInflater.inflate(R.layout.item_article_detail_comment_empty, parent, false)) + CommentErrorViewHolder( + mLayoutInflater.inflate( + R.layout.item_article_detail_comment_empty, + parent, + false + ) + ) } else -> throw IllegalAccessException() @@ -119,8 +148,14 @@ abstract class BaseCommentAdapter(context: Context, override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder) { is CommentItemViewHolder -> { - holder.bindComment(mEntityList[position].commentNormal!!, mViewModel, mEntrance, commentClosure) { deleteCommentEntity -> - val findEntity = mEntityList.find { it.commentNormal != null && it.commentNormal?.id == deleteCommentEntity.id } + holder.bindComment( + mEntityList[position].commentNormal!!, + mViewModel, + mEntrance, + commentClosure + ) { deleteCommentEntity -> + val findEntity = + mEntityList.find { it.commentNormal != null && it.commentNormal?.id == deleteCommentEntity.id } val index = mEntityList.indexOf(findEntity) mEntityList.remove(findEntity) notifyItemRemoved(index) @@ -132,18 +167,26 @@ abstract class BaseCommentAdapter(context: Context, val isArticleDetail = this is ArticleDetailAdapter if (isArticleDetail) { - SyncPageRepository.postSyncData(SyncDataEntity(mViewModel.articleId, + SyncPageRepository.postSyncData( + SyncDataEntity( + mViewModel.articleId, SyncFieldConstants.ARTICLE_COMMENT_COUNT, mViewModel.commentCount, - checkFieldEntity = true)) + checkFieldEntity = true + ) + ) } else { mEntityList[0].commentTop?.reply = (mEntityList[0].commentTop?.reply - ?: 0) - 1 - SyncPageRepository.postSyncData(SyncDataEntity(mEntityList[0].commentTop?.id - ?: "", + ?: 0) - 1 + SyncPageRepository.postSyncData( + SyncDataEntity( + mEntityList[0].commentTop?.id + ?: "", SyncFieldConstants.ARTICLE_COMMENT_REPLY_COUNT, mEntityList[0].commentTop?.reply, - checkFieldEntity = true)) + checkFieldEntity = true + ) + ) //刷新评论详情头部 notifyItemChanged(0) } @@ -163,7 +206,8 @@ abstract class BaseCommentAdapter(context: Context, return Pair(comment.id ?: "", comment) } - inner class CommentFooterViewHolder(var binding: ItemArticleDetailCommentFooterBinding) : RecyclerView.ViewHolder(binding.root) { + inner class CommentFooterViewHolder(var binding: ItemArticleDetailCommentFooterBinding) : + RecyclerView.ViewHolder(binding.root) { fun bindView(isLoading: Boolean, isNetworkError: Boolean, isOver: Boolean) { when { isNetworkError -> { @@ -187,8 +231,13 @@ abstract class BaseCommentAdapter(context: Context, } inner class CommentErrorViewHolder(view: View) : RecyclerView.ViewHolder(view) - inner class CommentFilterViewHolder(var binding: PieceArticleDetailCommentFilterBinding) : RecyclerView.ViewHolder(binding.root) { - fun bindView(article: ArticleDetailEntity? = null, questions: QuestionsDetailEntity? = null, comment: CommentEntity? = null) { + inner class CommentFilterViewHolder(var binding: PieceArticleDetailCommentFilterBinding) : + RecyclerView.ViewHolder(binding.root) { + fun bindView( + article: ArticleDetailEntity? = null, + questions: QuestionsDetailEntity? = null, + comment: CommentEntity? = null + ) { binding.run { val commentCount = mViewModel.commentCount commentHintTv.text = when { @@ -232,7 +281,8 @@ abstract class BaseCommentAdapter(context: Context, private fun updateSortType() { binding.run { - val isLatestSelected = mViewModel.currentSortType == BaseCommentViewModel.SortType.LATEST + val isLatestSelected = + mViewModel.currentSortType == BaseCommentViewModel.SortType.LATEST val selectedTextView = if (isLatestSelected) filterLatestTv else filterOldestTv val unselectedTextView = if (!isLatestSelected) filterLatestTv else filterOldestTv @@ -242,8 +292,10 @@ abstract class BaseCommentAdapter(context: Context, } } - class CommentItemViewHolder(var binding: ItemArticleDetailCommentBinding, var type: AdapterType) - : RecyclerView.ViewHolder(binding.root) { + class CommentItemViewHolder( + var binding: ItemArticleDetailCommentBinding, + var type: AdapterType + ) : RecyclerView.ViewHolder(binding.root) { init { if (type == AdapterType.SUB_COMMENT) { @@ -254,10 +306,13 @@ abstract class BaseCommentAdapter(context: Context, } @SuppressLint("SetTextI18n") - fun bindComment(comment: CommentEntity, - viewModel: BaseCommentViewModel, - entrance: String, - commentClosure: ((CommentEntity) -> Unit)? = null, deleteCallBack: ((comment: CommentEntity) -> Unit)? = null) { + fun bindComment( + comment: CommentEntity, + viewModel: BaseCommentViewModel, + entrance: String, + commentClosure: ((CommentEntity) -> Unit)? = null, + deleteCallBack: ((comment: CommentEntity) -> Unit)? = null + ) { bindComment(binding, viewModel, comment, entrance, deleteCallBack) if (type == AdapterType.COMMENT) { // 帖子详情页面用的样式 @@ -267,32 +322,80 @@ abstract class BaseCommentAdapter(context: Context, binding.root.setOnClickListener { when { viewModel.articleId.isNotEmpty() -> { - CommentActivity.getArticleCommentIntent(binding.root.context, viewModel.articleId, viewModel.commentCount, true, viewModel.communityId, comment, true).apply { - (binding.root.context as AppCompatActivity).startActivityForResult(this, CommentActivity.REQUEST_CODE) + CommentActivity.getArticleCommentIntent( + binding.root.context, + viewModel.articleId, + viewModel.commentCount, + true, + viewModel.communityId, + comment, + true + ).apply { + (binding.root.context as AppCompatActivity).startActivityForResult( + this, + CommentActivity.REQUEST_CODE + ) } MtaHelper.onEvent("帖子详情", "全部评论", "评论正文") } viewModel.videoId.isNotEmpty() -> { - CommentActivity.getVideoCommentReplyIntent(binding.root.context, viewModel.videoId, viewModel.commentCount, comment.me?.isContentOwner == true, true, true, comment).apply { - (binding.root.context as AppCompatActivity).startActivityForResult(this, CommentActivity.REQUEST_CODE) + CommentActivity.getVideoCommentReplyIntent( + binding.root.context, + viewModel.videoId, + viewModel.commentCount, + comment.me?.isContentOwner == true, + true, + true, + comment + ).apply { + (binding.root.context as AppCompatActivity).startActivityForResult( + this, + CommentActivity.REQUEST_CODE + ) } } viewModel.questionId.isNotEmpty() -> { - CommentActivity.getQuestionCommentReplyIntent(binding.root.context, viewModel.questionId, viewModel.communityId, viewModel.commentCount, true, true, comment).apply { - (binding.root.context as AppCompatActivity).startActivityForResult(this, CommentActivity.REQUEST_CODE) + CommentActivity.getQuestionCommentReplyIntent( + binding.root.context, + viewModel.questionId, + viewModel.communityId, + viewModel.commentCount, + true, + true, + comment + ).apply { + (binding.root.context as AppCompatActivity).startActivityForResult( + this, + CommentActivity.REQUEST_CODE + ) } } } - NewLogUtils.logCommentClick("click_comment_area_comment", - comment.user.id ?: "", contentType, comment.id ?: "", bbsId, bbsType) + NewLogUtils.logCommentClick( + "click_comment_area_comment", + comment.user.id ?: "", contentType, comment.id ?: "", bbsId, bbsType + ) } binding.commentCountTv.setOnClickListener { - CommentActivity.getCommentDetailIntent(binding.root.context, comment.id!!, viewModel.communityId, viewModel.articleId, viewModel.videoId, viewModel.questionId, false, comment.floor, entrance, PATH_ARTICLE_DETAIL).apply { + CommentActivity.getCommentDetailIntent( + binding.root.context, + comment.id!!, + viewModel.communityId, + viewModel.articleId, + viewModel.videoId, + viewModel.questionId, + false, + comment.floor, + entrance, + PATH_ARTICLE_DETAIL + ).apply { binding.root.context.startActivity(this) } MtaHelper.onEvent("帖子详情", "全部评论", "回复") - NewLogUtils.logCommentClick("click_comment_area_reply", - comment.user.id ?: "", contentType, comment.id ?: "", bbsId, bbsType) + NewLogUtils.logCommentClick( + "click_comment_area_reply", + comment.user.id ?: "", contentType, comment.id ?: "", bbsId, bbsType + ) } binding.contentTv.text = comment.content binding.commentCountTv.text = viewModel.getCommentText(comment.reply, "回复") @@ -310,14 +413,30 @@ abstract class BaseCommentAdapter(context: Context, val colon = " :" val parentUserName = " ${comment.parentUser?.name} " - val prefixSpan = SpanBuilder(prefix).color(binding.root.context, 0, prefix.length, R.color.text_999999).build() + val prefixSpan = SpanBuilder(prefix).color( + binding.root.context, + 0, + prefix.length, + R.color.text_999999 + ).build() val parentUserNameSpan = SpanBuilder(parentUserName) - .bold(0, parentUserName.length) - .click(0, parentUserName.length, R.color.text_666666) { - DirectUtils.directToHomeActivity(binding.root.context, comment.user.id, 1, entrance, PATH_ARTICLE_DETAIL_COMMENT) - MtaHelper.onEvent("帖子详情", "引用回复区域", "用户名字") - }.build() - val colonSpan = SpanBuilder(colon).color(binding.root.context, 0, colon.length, R.color.text_999999).build() + .bold(0, parentUserName.length) + .click(0, parentUserName.length, R.color.text_666666) { + DirectUtils.directToHomeActivity( + binding.root.context, + comment.user.id, + 1, + entrance, + PATH_ARTICLE_DETAIL_COMMENT + ) + MtaHelper.onEvent("帖子详情", "引用回复区域", "用户名字") + }.build() + val colonSpan = SpanBuilder(colon).color( + binding.root.context, + 0, + colon.length, + R.color.text_999999 + ).build() val authorSpan = if (comment.parentUser?.me?.isCommentOwner == true) { SpanBuilder("作者").image(0, "作者".length, R.drawable.ic_hint_author).build() } else { @@ -325,11 +444,11 @@ abstract class BaseCommentAdapter(context: Context, } binding.contentTv.text = SpannableStringBuilder() - .append(prefixSpan) - .append(parentUserNameSpan) - .append(authorSpan) - .append(colonSpan) - .append(comment.content) + .append(prefixSpan) + .append(parentUserNameSpan) + .append(authorSpan) + .append(colonSpan) + .append(comment.content) } else { binding.contentTv.text = comment.content } @@ -338,7 +457,11 @@ abstract class BaseCommentAdapter(context: Context, } @SuppressLint("SetTextI18n") - fun updateSubComment(comment: CommentEntity, viewModel: BaseCommentViewModel, entrance: String) { + fun updateSubComment( + comment: CommentEntity, + viewModel: BaseCommentViewModel, + entrance: String + ) { val subCommentList = comment.subCommentList val ownerUserId = when { viewModel.articleId.isNotEmpty() -> { @@ -359,60 +482,132 @@ abstract class BaseCommentAdapter(context: Context, binding.subCommentContainer.setRoundedColorBackground(R.color.text_F5F5F5, 5F) subCommentList?.firstOrNull()?.let { - binding.firstSubCommentTv.text = getSubCommentSpanned(it.user.name, if (it.user.id == ownerUserId) "作者" else "", it.content) + binding.firstSubCommentTv.text = getSubCommentSpanned( + it.user.name, + if (it.user.id == ownerUserId) "作者" else "", + it.content + ) } subCommentList?.secondOrNull()?.let { - binding.secondSubCommentTv.text = getSubCommentSpanned(it.user.name, if (it.user.id == ownerUserId) "作者" else "", it.content) + binding.secondSubCommentTv.text = getSubCommentSpanned( + it.user.name, + if (it.user.id == ownerUserId) "作者" else "", + it.content + ) } binding.subCommentContainer.setOnClickListener { - CommentActivity.getCommentDetailIntent(binding.root.context, comment.id!!, viewModel.communityId, viewModel.articleId, viewModel.videoId, viewModel.questionId, false, comment.floor, entrance, PATH_ARTICLE_DETAIL).apply { + CommentActivity.getCommentDetailIntent( + binding.root.context, + comment.id!!, + viewModel.communityId, + viewModel.articleId, + viewModel.videoId, + viewModel.questionId, + false, + comment.floor, + entrance, + PATH_ARTICLE_DETAIL + ).apply { binding.root.context.startActivity(this) } } } - private fun getSubCommentSpanned(name: String?, author: String?, content: String?): SpannableStringBuilder { + private fun getSubCommentSpanned( + name: String?, + author: String?, + content: String? + ): SpannableStringBuilder { val finalAuthor = author ?: "" val finalName = "$name " val colon = " :" - val nameSpan = SpanBuilder(finalName).color(0, finalName.length, R.color.theme_font).build() - val authorSpan = if (finalAuthor.isNotEmpty()) SpanBuilder(finalAuthor).image(0, finalAuthor.length, R.drawable.ic_hint_author).build() else "" + val nameSpan = + SpanBuilder(finalName).color(0, finalName.length, R.color.theme_font).build() + val authorSpan = if (finalAuthor.isNotEmpty()) SpanBuilder(finalAuthor).image( + 0, + finalAuthor.length, + R.drawable.ic_hint_author + ).build() else "" val colonSpan = SpanBuilder(colon).color(0, colon.length, R.color.theme_font).build() - return SpannableStringBuilder().append(nameSpan).append(authorSpan).append(colonSpan).append(content) + return SpannableStringBuilder().append(nameSpan).append(authorSpan).append(colonSpan) + .append(content) } companion object { - fun bindComment(binding: ItemArticleDetailCommentBinding, - viewModel: BaseCommentViewModel, - comment: CommentEntity, - entrance: String, deleteCallBack: ((comment: CommentEntity) -> Unit)? = null) { - val path = if (viewModel is ArticleDetailViewModel) PATH_ARTICLE_DETAIL else PATH_ARTICLE_DETAIL_COMMENT + fun bindComment( + binding: ItemArticleDetailCommentBinding, + viewModel: BaseCommentViewModel, + comment: CommentEntity, + entrance: String, deleteCallBack: ((comment: CommentEntity) -> Unit)? = null + ) { + val path = when { + viewModel.articleId.isNotEmpty() -> { + if (viewModel is CommentConversationViewModel) PATH_ARTICLE_DETAIL_COMMENT else PATH_ARTICLE_DETAIL + } + viewModel.questionId.isNotEmpty() -> { + if (viewModel is CommentConversationViewModel) PATH_QUESTION_DETAIL_COMMENT else PATH_QUESTION_DETAIL + } + viewModel.videoId.isNotEmpty() -> { + if (viewModel is CommentConversationViewModel) PATH_VIDEO_DETAIL_COMMENT else PATH_VIDEO_DETAIL + } + else -> "" + } val mtaKey = if (viewModel is ArticleDetailViewModel) "全部评论" else "评论详情-全部回复" binding.comment = comment - binding.userIconIv.display(comment.user.border, comment.user.icon, comment.user.auth?.icon) + binding.userIconIv.display( + comment.user.border, + comment.user.icon, + comment.user.auth?.icon + ) binding.adoptionTv.goneIf(!comment.accept) val (bbsId, contentType, bbsType) = getLogData(viewModel) binding.userIconIv.setOnClickListener { MtaHelper.onEvent("帖子详情", mtaKey, "用户头像") - DirectUtils.directToHomeActivity(binding.root.context, comment.user.id, 1, entrance, path) - NewLogUtils.logCommentClick("click_comment_area_profile_photo", - comment.user.id ?: "", contentType, comment.id ?: "", bbsId, bbsType) + DirectUtils.directToHomeActivity( + binding.root.context, + comment.user.id, + 1, + entrance, + path + ) + NewLogUtils.logCommentClick( + "click_comment_area_profile_photo", + comment.user.id ?: "", contentType, comment.id ?: "", bbsId, bbsType + ) } binding.userNameTv.setOnClickListener { - DirectUtils.directToHomeActivity(binding.root.context, comment.user.id, 1, entrance, path) + DirectUtils.directToHomeActivity( + binding.root.context, + comment.user.id, + 1, + entrance, + path + ) MtaHelper.onEvent("帖子详情", mtaKey, "用户名字") - NewLogUtils.logCommentClick("click_comment_area_nickname", - comment.user.id ?: "", contentType, comment.id ?: "", bbsId, bbsType) + NewLogUtils.logCommentClick( + "click_comment_area_nickname", + comment.user.id ?: "", contentType, comment.id ?: "", bbsId, bbsType + ) } binding.likeCountTv.text = viewModel.getLikeText(comment.vote) if (comment.me?.isCommentVoted == true) { - binding.likeCountTv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.comment_vote_select, 0, 0, 0) + binding.likeCountTv.setCompoundDrawablesWithIntrinsicBounds( + R.drawable.comment_vote_select, + 0, + 0, + 0 + ) } else { - binding.likeCountTv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.comment_vote_unselect, 0, 0, 0) + binding.likeCountTv.setCompoundDrawablesWithIntrinsicBounds( + R.drawable.comment_vote_unselect, + 0, + 0, + 0 + ) } binding.likeCountTv.setDebouncedClickListener { @@ -425,9 +620,11 @@ abstract class BaseCommentAdapter(context: Context, } else { MtaHelper.onEvent("帖子详情", "评论详情-全部回复", "点赞") } - NewLogUtils.logCommentClick("click_comment_area_like", - comment.user.id ?: "", contentType, comment.id - ?: "", bbsId, bbsType) + NewLogUtils.logCommentClick( + "click_comment_area_like", + comment.user.id ?: "", contentType, comment.id + ?: "", bbsId, bbsType + ) } else { ToastUtils.showToast("已点过赞了") } @@ -436,9 +633,18 @@ abstract class BaseCommentAdapter(context: Context, binding.badgeTv.setOnClickListener { DialogUtils.showViewBadgeDialog(binding.root.context, comment.user.badge) { - MtaHelper.onEvent("进入徽章墙_用户记录", "帖子详情-评论管理", comment.user.name + "(" + comment.user.id + ")") + MtaHelper.onEvent( + "进入徽章墙_用户记录", + "帖子详情-评论管理", + comment.user.name + "(" + comment.user.id + ")" + ) MtaHelper.onEvent("徽章中心", "进入徽章中心", "帖子详情-评论管理") - DirectUtils.directToBadgeWall(binding.root.context, comment.user.id, comment.user.name, comment.user.icon) + DirectUtils.directToBadgeWall( + binding.root.context, + comment.user.id, + comment.user.name, + comment.user.icon + ) } } binding.badgeIv.setOnClickListener { binding.badgeTv.performClick() } @@ -446,13 +652,34 @@ abstract class BaseCommentAdapter(context: Context, binding.moreIv.setOnClickListener { when { viewModel.articleId.isNotEmpty() -> { - showCommunityArticleCommentOptions(it, binding, comment, viewModel, path, deleteCallBack) + showCommunityArticleCommentOptions( + it, + binding, + comment, + viewModel, + path, + deleteCallBack + ) } viewModel.videoId.isNotEmpty() -> { - showVideoCommentOptions(it, binding, comment, viewModel, deleteCallBack) + showVideoCommentOptions( + it, + binding, + comment, + viewModel, + path, + deleteCallBack + ) } viewModel.questionId.isNotEmpty() -> { - showQuestionCommentOption(it, binding, comment, viewModel, deleteCallBack) + showQuestionCommentOption( + it, + binding, + comment, + viewModel, + path, + deleteCallBack + ) } } NewLogUtils.logCommentClick("click_comment_area_more") @@ -476,106 +703,234 @@ abstract class BaseCommentAdapter(context: Context, type = (viewModel as? VideoCommentViewModel)?.videoDetail?.type ?: "" } } - val contentType = if (viewModel.articleId.isNotEmpty()) "帖子评论" else if (viewModel.questionId.isNotEmpty()) "提问帖评论" else "视频帖评论" + val contentType = + if (viewModel.articleId.isNotEmpty()) "帖子评论" else if (viewModel.questionId.isNotEmpty()) "提问帖评论" else "视频帖评论" val bbsType = if (type == "game_bbs") "游戏论坛" else "综合论坛" return Triple(bbsId, contentType, bbsType) } - private fun showQuestionCommentOption(view: View, binding: ItemArticleDetailCommentBinding, comment: CommentEntity, viewModel: BaseCommentViewModel, deleteCallBack: ((comment: CommentEntity) -> Unit)?) { - CommentHelper.showQuestionCommentOption(view, comment, viewModel.questionId, object : OnCommentOptionClickListener { - override fun onCommentOptionClick(entity: CommentEntity, option: String) { - when (option) { - "删除评论" -> { - DialogUtils.showNewAlertDialog(binding.moreIv.context, "提示", "删除评论后,评论下所有的回复都将被删除", "取消", "删除", null, { - viewModel.deleteComment(comment) { - deleteCallBack?.invoke(comment) - } - }) - } - "采纳" -> { - DialogUtils.showNewAlertDialog(binding.root.context, "提示", "确定采纳该评论?", "取消", "确认", null, Gravity.CENTER, false, {}, { - viewModel.acceptQuestionComment(viewModel.questionId, comment) - }) - } - "加精选" -> { - viewModel.highlightQuestionComment(comment) - } - "置顶" -> { - DialogUtils.showNewAlertDialog(binding.root.context, "提示", "是否将此条评论置顶?", "取消", "确认", null, Gravity.CENTER, false, {}, { - commentTop(binding.root.context, viewModel, comment, false) - }) - } - "取消置顶" -> { - DialogUtils.showNewAlertDialog(binding.root.context, "提示", "是否将此条评论取消置顶?", "取消", "确认", null, Gravity.CENTER, false, {}, { - viewModel.updateCommentTop(comment.id - ?: "", top = false, isAgain = false) { isSuccess, errorCode -> - if (isSuccess) { - viewModel.load(LoadType.REFRESH) - } - } - }) - } - } - } - }) - } - - private fun showVideoCommentOptions(view: View, binding: ItemArticleDetailCommentBinding, comment: CommentEntity, viewModel: BaseCommentViewModel, deleteCallBack: ((comment: CommentEntity) -> Unit)?) { - CommentHelper.showVideoCommentOptions(view, comment, false, viewModel.videoId, - comment.me?.isContentOwner == true, object : OnCommentOptionClickListener { - override fun onCommentOptionClick(entity: CommentEntity, option: String) { - when (option) { - "删除评论" -> { - DialogUtils.showNewAlertDialog(binding.moreIv.context, "提示", "删除评论后,评论下所有的回复都将被删除", "取消", "删除", null, { - viewModel.deleteComment(comment) { - deleteCallBack?.invoke(comment) - } - }) - } - } - } - }) - } - - private fun showCommunityArticleCommentOptions(view: View, binding: ItemArticleDetailCommentBinding, comment: CommentEntity, viewModel: BaseCommentViewModel, path: String, deleteCallBack: ((comment: CommentEntity) -> Unit)?) { - CommentHelper.showCommunityArticleCommentOptions( - view, - comment, - false, - viewModel.articleId, - viewModel.communityId, - isShowTop = path == PATH_ARTICLE_DETAIL, - ignoreModerator = true, - listener = object : OnCommentOptionClickListener { - override fun onCommentOptionClick(entity: CommentEntity, option: String) { - when (option) { - "删除评论" -> { - DialogUtils.showNewAlertDialog(binding.moreIv.context, "提示", "删除评论后,评论下所有的回复都将被删除", "取消", "删除", null, { + private fun showQuestionCommentOption( + view: View, + binding: ItemArticleDetailCommentBinding, + comment: CommentEntity, + viewModel: BaseCommentViewModel, + path: String, + deleteCallBack: ((comment: CommentEntity) -> Unit)? + ) { + CommentHelper.showQuestionCommentOption( + view, + comment, + viewModel.questionId, + path == PATH_QUESTION_DETAIL, + object : OnCommentOptionClickListener { + override fun onCommentOptionClick(entity: CommentEntity, option: String) { + when (option) { + "删除评论" -> { + DialogUtils.showNewAlertDialog( + binding.moreIv.context, + "提示", + "删除评论后,评论下所有的回复都将被删除", + "取消", + "删除", + null, + { viewModel.deleteComment(comment) { deleteCallBack?.invoke(comment) } }) - } - "置顶" -> { - DialogUtils.showNewAlertDialog(binding.root.context, "提示", "是否将此条评论置顶?", "取消", "确认", null, Gravity.CENTER, false, {}, { - commentTop(binding.root.context, viewModel, comment, false) + } + "采纳" -> { + DialogUtils.showNewAlertDialog( + binding.root.context, + "提示", + "确定采纳该评论?", + "取消", + "确认", + null, + Gravity.CENTER, + false, + {}, + { + viewModel.acceptQuestionComment( + viewModel.questionId, + comment, + true + ) }) - } - "取消置顶" -> { - DialogUtils.showNewAlertDialog(binding.root.context, "提示", "是否将此条评论取消置顶?", "取消", "确认", null, Gravity.CENTER, false, {}, { - viewModel.updateCommentTop(comment.id - ?: "", top = false, isAgain = false) { isSuccess, errorCode -> + } + "取消采纳" -> { + viewModel.acceptQuestionComment( + viewModel.questionId, + comment, + false + ) + } + "加精选" -> { + viewModel.highlightQuestionComment(comment) + } + "置顶" -> { + DialogUtils.showNewAlertDialog( + binding.root.context, + "提示", + "是否将此条评论置顶?", + "取消", + "确认", + null, + Gravity.CENTER, + false, + {}, + { + commentTop( + binding.root.context, + viewModel, + comment, + false + ) + }) + } + "取消置顶" -> { + DialogUtils.showNewAlertDialog( + binding.root.context, + "提示", + "是否将此条评论取消置顶?", + "取消", + "确认", + null, + Gravity.CENTER, + false, + {}, + { + viewModel.updateCommentTop( + comment.id + ?: "", top = false, isAgain = false + ) { isSuccess, errorCode -> if (isSuccess) { viewModel.load(LoadType.REFRESH) } } }) - } } + } + } + }) + } + private fun showVideoCommentOptions( + view: View, + binding: ItemArticleDetailCommentBinding, + comment: CommentEntity, + viewModel: BaseCommentViewModel, + path: String, + deleteCallBack: ((comment: CommentEntity) -> Unit)? + ) { + CommentHelper.showVideoCommentOptions(view, + comment, + false, + viewModel.videoId, + comment.me?.isContentOwner == true, + path == PATH_VIDEO_DETAIL, + object : OnCommentOptionClickListener { + override fun onCommentOptionClick(entity: CommentEntity, option: String) { + when (option) { + "删除评论" -> { + DialogUtils.showNewAlertDialog( + binding.moreIv.context, + "提示", + "删除评论后,评论下所有的回复都将被删除", + "取消", + "删除", + null, + { + viewModel.deleteComment(comment) { + deleteCallBack?.invoke(comment) + } + }) + } + } + } + }) + } + + private fun showCommunityArticleCommentOptions( + view: View, + binding: ItemArticleDetailCommentBinding, + comment: CommentEntity, + viewModel: BaseCommentViewModel, + path: String, + deleteCallBack: ((comment: CommentEntity) -> Unit)? + ) { + CommentHelper.showCommunityArticleCommentOptions( + view, + comment, + false, + viewModel.articleId, + viewModel.communityId, + isShowTop = path == PATH_ARTICLE_DETAIL, + ignoreModerator = true, + listener = object : OnCommentOptionClickListener { + override fun onCommentOptionClick(entity: CommentEntity, option: String) { + when (option) { + "删除评论" -> { + DialogUtils.showNewAlertDialog( + binding.moreIv.context, + "提示", + "删除评论后,评论下所有的回复都将被删除", + "取消", + "删除", + null, + { + viewModel.deleteComment(comment) { + deleteCallBack?.invoke(comment) + } + }) + } + "置顶" -> { + DialogUtils.showNewAlertDialog( + binding.root.context, + "提示", + "是否将此条评论置顶?", + "取消", + "确认", + null, + Gravity.CENTER, + false, + {}, + { + commentTop( + binding.root.context, + viewModel, + comment, + false + ) + }) + } + "取消置顶" -> { + DialogUtils.showNewAlertDialog( + binding.root.context, + "提示", + "是否将此条评论取消置顶?", + "取消", + "确认", + null, + Gravity.CENTER, + false, + {}, + { + viewModel.updateCommentTop( + comment.id + ?: "", top = false, isAgain = false + ) { isSuccess, errorCode -> + if (isSuccess) { + viewModel.load(LoadType.REFRESH) + } + } + }) + } } - }) + } + + }) if (viewModel is ArticleDetailViewModel) { MtaHelper.onEvent("帖子详情", "全部评论", "更多") @@ -584,16 +939,33 @@ abstract class BaseCommentAdapter(context: Context, } } - private fun commentTop(context: Context, viewModel: BaseCommentViewModel, comment: CommentEntity, isAgain: Boolean) { - viewModel.updateCommentTop(comment.id - ?: "", top = true, isAgain = isAgain) { isSuccess, errorCode -> + private fun commentTop( + context: Context, + viewModel: BaseCommentViewModel, + comment: CommentEntity, + isAgain: Boolean + ) { + viewModel.updateCommentTop( + comment.id + ?: "", top = true, isAgain = isAgain + ) { isSuccess, errorCode -> if (isSuccess) { viewModel.load(LoadType.REFRESH) } else { if (errorCode == 403095) { - DialogUtils.showNewAlertDialog(context, "提示", "当前已有置顶评论,\n是否将此条评论覆盖展示?", "取消", "确认", null, Gravity.CENTER, false, {}, { - commentTop(context, viewModel, comment, true) - }) + DialogUtils.showNewAlertDialog( + context, + "提示", + "当前已有置顶评论,\n是否将此条评论覆盖展示?", + "取消", + "确认", + null, + Gravity.CENTER, + false, + {}, + { + commentTop(context, viewModel, comment, true) + }) } } } @@ -612,6 +984,12 @@ abstract class BaseCommentAdapter(context: Context, const val PATH_ARTICLE_DETAIL = "帖子详情" const val PATH_ARTICLE_DETAIL_COMMENT = "帖子评论详情" + + const val PATH_QUESTION_DETAIL = "问题详情" + const val PATH_QUESTION_DETAIL_COMMENT = "问题评论详情" + + const val PATH_VIDEO_DETAIL = "视频详情" + const val PATH_VIDEO_DETAIL_COMMENT = "视频评论详情" } enum class AdapterType { diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentViewModel.kt index c89da3ade4..9bf9d56f47 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentViewModel.kt @@ -26,8 +26,13 @@ import okhttp3.ResponseBody import org.json.JSONObject import retrofit2.HttpException -abstract class BaseCommentViewModel(application: Application, var articleId: String, var videoId: String, var questionId: String, var communityId: String) - : ListViewModel(application) { +abstract class BaseCommentViewModel( + application: Application, + var articleId: String, + var videoId: String, + var questionId: String, + var communityId: String +) : ListViewModel(application) { protected val mApi: ApiService = RetrofitManager.getInstance(application).api var currentSortType: SortType = SortType.OLDEST @@ -77,7 +82,11 @@ abstract class BaseCommentViewModel(application: Application, var articleId: Str } } - fun mergeListData(commentList: List?, displayFloor: Boolean = false, hasFilter: Boolean = true) { + fun mergeListData( + commentList: List?, + displayFloor: Boolean = false, + hasFilter: Boolean = true + ) { topItemData?.let { val mergedList = arrayListOf().apply { if (hasFilter) { @@ -132,45 +141,61 @@ abstract class BaseCommentViewModel(application: Application, var articleId: Str } fun like(comment: CommentEntity) { - PostCommentUtils.likeComment(getApplication(), null, articleId, communityId, videoId, questionId, comment.id, - object : PostCommentUtils.PostCommentListener { - override fun postSuccess(response: JSONObject?) { - val cloneComment = comment.clone() - if (cloneComment.me == null) { - cloneComment.me = MeEntity() - } - cloneComment.me?.isCommentVoted = true - cloneComment.vote++ - updateComment(cloneComment) - - comment.id?.let { - SyncPageRepository.postSyncData(SyncDataEntity(it, - SyncFieldConstants.ARTICLE_COMMENT_VOTE_COUNT, - comment.vote + 1)) - SyncPageRepository.postSyncData(SyncDataEntity(it, - SyncFieldConstants.ARTICLE_COMMENT_VOTE, - true, - checkFieldEntity = true)) - } + PostCommentUtils.likeComment(getApplication(), + null, + articleId, + communityId, + videoId, + questionId, + comment.id, + object : PostCommentUtils.PostCommentListener { + override fun postSuccess(response: JSONObject?) { + val cloneComment = comment.clone() + if (cloneComment.me == null) { + cloneComment.me = MeEntity() } + cloneComment.me?.isCommentVoted = true + cloneComment.vote++ + updateComment(cloneComment) - override fun postFailed(e: Throwable) { - if (e is HttpException) { - if (e.code() == 403) { - try { - val detail = JSONObject(e.response().errorBody()!!.string()).getString("detail") - if ("voted" == detail) { - ToastUtils.showToast("已经点过赞啦!") - } - } catch (ex: Exception) { - ex.printStackTrace() + comment.id?.let { + SyncPageRepository.postSyncData( + SyncDataEntity( + it, + SyncFieldConstants.ARTICLE_COMMENT_VOTE_COUNT, + comment.vote + 1 + ) + ) + SyncPageRepository.postSyncData( + SyncDataEntity( + it, + SyncFieldConstants.ARTICLE_COMMENT_VOTE, + true, + checkFieldEntity = true + ) + ) + } + } + + override fun postFailed(e: Throwable) { + if (e is HttpException) { + if (e.code() == 403) { + try { + val detail = JSONObject( + e.response().errorBody()!!.string() + ).getString("detail") + if ("voted" == detail) { + ToastUtils.showToast("已经点过赞啦!") } - return + } catch (ex: Exception) { + ex.printStackTrace() } + return } - Utils.toast(getApplication(), "网络异常,点赞失败") } - }) + Utils.toast(getApplication(), "网络异常,点赞失败") + } + }) } @SuppressLint("CheckResult") @@ -188,32 +213,37 @@ abstract class BaseCommentViewModel(application: Application, var articleId: Str else -> null } ?: return observable.compose(observableToMain()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - hideCommentSuccess() - callback.invoke() - } + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + hideCommentSuccess() + callback.invoke() + } - override fun onFailure(e: HttpException?) { - super.onFailure(e) - e?.let { httpException -> - if (httpException.code() == 403) { - val string = e.response().errorBody()?.string() ?: "" - val errorJson = JSONObject(string) - val errorCode = errorJson.getInt("code") - if (errorCode == 403059) { - Utils.toast(getApplication(), "权限错误,请刷新后重试") - return - } else { - Utils.toast(getApplication(), e.message()) - } + override fun onFailure(e: HttpException?) { + super.onFailure(e) + e?.let { httpException -> + if (httpException.code() == 403) { + val string = e.response().errorBody()?.string() ?: "" + val errorJson = JSONObject(string) + val errorCode = errorJson.getInt("code") + if (errorCode == 403059) { + Utils.toast(getApplication(), "权限错误,请刷新后重试") + return + } else { + Utils.toast(getApplication(), e.message()) } } } - }) + } + }) } - fun updateCommentTop(commentId: String, top: Boolean = false, isAgain: Boolean = false, callback: (isSuccess: Boolean, errorCode: Int) -> Unit) { + fun updateCommentTop( + commentId: String, + top: Boolean = false, + isAgain: Boolean = false, + callback: (isSuccess: Boolean, errorCode: Int) -> Unit + ) { val observable = if (top) { val map = hashMapOf() if (isAgain) { @@ -241,62 +271,66 @@ abstract class BaseCommentViewModel(application: Application, var articleId: Str } ?: return observable.subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - super.onResponse(response) - callback.invoke(true, 0) - } + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + callback.invoke(true, 0) + } - override fun onFailure(e: HttpException?) { - super.onFailure(e) - e?.let { - ErrorHelper.handleErrorWithCustomizedHandler(getApplication(), e.response()?.errorBody()?.string(), false) { - if (it == 403095) { - callback.invoke(false, it) - true - } else false - } + override fun onFailure(e: HttpException?) { + super.onFailure(e) + e?.let { + ErrorHelper.handleErrorWithCustomizedHandler( + getApplication(), + e.response()?.errorBody()?.string(), + false + ) { + if (it == 403095) { + callback.invoke(false, it) + true + } else false } } - }) + } + }) } - fun acceptQuestionComment(questionId: String, comment: CommentEntity) { - val body = json { "accept" to true }.toRequestBody() + fun acceptQuestionComment(questionId: String, comment: CommentEntity, accept: Boolean) { + val body = json { "accept" to accept }.toRequestBody() mApi.acceptQuestionComment(questionId, comment.id, body) - .compose(observableToMain()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - super.onResponse(response) - val cloneComment = comment.clone() - cloneComment.accept = true - updateComment(cloneComment) - } + .compose(observableToMain()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + val cloneComment = comment.clone() + cloneComment.accept = accept + updateComment(cloneComment) + } - override fun onFailure(e: HttpException?) { - super.onFailure(e) - ToastUtils.showToast("采纳失败") - } - }) + override fun onFailure(e: HttpException?) { + super.onFailure(e) + ToastUtils.showToast("采纳失败") + } + }) } fun highlightQuestionComment(comment: CommentEntity) { mApi.highlightAnswer(comment.id) - .compose(observableToMain()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - super.onResponse(response) - val cloneComment = comment.clone() - cloneComment.choiceness = true - updateComment(cloneComment) - } + .compose(observableToMain()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + val cloneComment = comment.clone() + cloneComment.choiceness = true + updateComment(cloneComment) + } - override fun onFailure(e: HttpException?) { - super.onFailure(e) - ToastUtils.showToast("加精选失败") - } - }) + override fun onFailure(e: HttpException?) { + super.onFailure(e) + ToastUtils.showToast("加精选失败") + } + }) } private fun updateComment(cloneComment: CommentEntity) { diff --git a/app/src/main/res/layout/item_article_detail_content.xml b/app/src/main/res/layout/item_article_detail_content.xml index fc3f585542..7e3e454f5c 100644 --- a/app/src/main/res/layout/item_article_detail_content.xml +++ b/app/src/main/res/layout/item_article_detail_content.xml @@ -191,14 +191,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" /> - - Date: Mon, 2 Aug 2021 15:37:40 +0800 Subject: [PATCH 002/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA2=E6=9C=9F-?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E5=B1=95=E7=A4=BA-=E5=B8=96=E5=AD=90?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B5(0802UI=E6=B5=8B=E8=AF=951)=20https:?= =?UTF-8?q?//git.ghzs.com/pm/halo-app-issues/-/issues/1346?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../detail/ArticleDetailContentViewHolder.kt | 119 +++++++++++++----- .../QuestionDetailContentViewHolder.kt | 115 ++++++++++++----- .../layout/item_article_detail_content.xml | 1 + 3 files changed, 177 insertions(+), 58 deletions(-) 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 4f7fa9a5e2..8163e67788 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 @@ -8,6 +8,7 @@ import android.view.View import android.view.animation.LinearInterpolator import android.webkit.JavascriptInterface import android.webkit.WebView +import android.widget.LinearLayout import android.widget.TextView import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView @@ -27,8 +28,10 @@ import com.gh.gamecenter.qa.entity.ArticleDetailEntity import com.google.android.flexbox.FlexboxLayout import java.util.* -class ArticleDetailContentViewHolder(var binding: ItemArticleDetailContentBinding, var viewModel: ArticleDetailViewModel) - : RecyclerView.ViewHolder(binding.root) { +class ArticleDetailContentViewHolder( + var binding: ItemArticleDetailContentBinding, + var viewModel: ArticleDetailViewModel +) : RecyclerView.ViewHolder(binding.root) { private var mEntrance = "" val articleImgUrlList = ArrayList() @@ -39,7 +42,15 @@ class ArticleDetailContentViewHolder(var binding: ItemArticleDetailContentBindin richEditor.setInputEnabled(false) richEditor.setPadding(20, 20, 20, 15) richEditor.addJavascriptInterface(JsInterface(article.status), "imagelistener") - richEditor.addJavascriptInterface(OnLinkClickListener(root.context, article.title, article.status, mEntrance, "帖子详情"), "OnLinkClickListener") + richEditor.addJavascriptInterface( + OnLinkClickListener( + root.context, + article.title, + article.status, + mEntrance, + "帖子详情" + ), "OnLinkClickListener" + ) richEditor.setLayoutCallback(object : EmptyCallback { override fun onCallback() { viewModel.articleRenderedLiveData.postValue(true) @@ -71,38 +82,65 @@ class ArticleDetailContentViewHolder(var binding: ItemArticleDetailContentBindin approvalStatusTv.background = R.drawable.bg_approval_status_fail.toDrawable() } } + if (article.status != "pass") { + (statusContainer.layoutParams as LinearLayout.LayoutParams).apply { + topMargin = 7f.dip2px() + statusContainer.layoutParams = this + } + titleTv.setPadding(20f.dip2px(), 16f.dip2px(), 20f.dip2px(), 5f.dip2px()) + } val bbsType = if (article.type == "game_bbs") "游戏论坛" else "综合论坛" followBtn.setOnClickListener { MtaHelper.onEvent("帖子详情", "内容区域", "关注") - NewLogUtils.logArticleDetailClick("click_article_detail_follow", article.user.id - ?: "", "帖子", article.community.id, bbsType) + NewLogUtils.logArticleDetailClick( + "click_article_detail_follow", article.user.id + ?: "", "帖子", article.community.id, bbsType + ) root.context.ifLogin("帖子详情-[关注]用户") { if (followBtn.text == "关注") { viewModel.follow() } else { - DialogUtils.showAlertDialog(root.context, - "取消关注", - "确定要取消关注 ${article.user.name} 吗?", - "确定取消", - "暂不取消", - DialogUtils.ConfirmListener { - viewModel.unfollow() - }, null) + DialogUtils.showAlertDialog( + root.context, + "取消关注", + "确定要取消关注 ${article.user.name} 吗?", + "确定取消", + "暂不取消", + DialogUtils.ConfirmListener { + viewModel.unfollow() + }, null + ) } } } userNameTv.setOnClickListener { MtaHelper.onEvent("帖子详情", "内容区域", "用户名字") - NewLogUtils.logArticleDetailClick("click_article_detail_nickname", article.user.id - ?: "", "帖子", article.community.id, bbsType) - DirectUtils.directToHomeActivity(root.context, article.user.id, 1, mEntrance, "帖子详情") + NewLogUtils.logArticleDetailClick( + "click_article_detail_nickname", article.user.id + ?: "", "帖子", article.community.id, bbsType + ) + DirectUtils.directToHomeActivity( + root.context, + article.user.id, + 1, + mEntrance, + "帖子详情" + ) } userIconIv.setOnClickListener { MtaHelper.onEvent("帖子详情", "内容区域", "用户头像") - NewLogUtils.logArticleDetailClick("click_article_detail_profile_photo", article.user.id - ?: "", "帖子", article.community.id, bbsType) - DirectUtils.directToHomeActivity(root.context, article.user.id, 1, mEntrance, "帖子详情") + NewLogUtils.logArticleDetailClick( + "click_article_detail_profile_photo", article.user.id + ?: "", "帖子", article.community.id, bbsType + ) + DirectUtils.directToHomeActivity( + root.context, + article.user.id, + 1, + mEntrance, + "帖子详情" + ) } titleTv.text = if (article.choicenessStatus == "pass") { SpanBuilder(" ${article.title}").image(0, 1, R.drawable.ic_essence).build() @@ -118,20 +156,31 @@ class ArticleDetailContentViewHolder(var binding: ItemArticleDetailContentBindin } if (article.time.create == article.time.edit) { - releaseTimeTv.text = String.format("发布于%s", NewsUtils.getFormattedTime(article.time.create)) + releaseTimeTv.text = + String.format("发布于%s", NewsUtils.getFormattedTime(article.time.create)) } else { - releaseTimeTv.text = String.format("发布于%s 最后编辑于%s", NewsUtils.getFormattedTime(article.time.create), NewsUtils.getFormattedTime(article.time.edit)) + releaseTimeTv.text = String.format( + "发布于%s 最后编辑于%s", + NewsUtils.getFormattedTime(article.time.create), + NewsUtils.getFormattedTime(article.time.edit) + ) } richEditor.visibility = View.VISIBLE article.community.let { entity -> gameName.text = entity.name val icon = if (!entity.icon.isNullOrEmpty()) entity.icon else entity.game?.getIcon() - val iconSubscript = if (!entity.iconSubscript.isNullOrEmpty()) entity.iconSubscript else entity.game?.iconSubscript + val iconSubscript = + if (!entity.iconSubscript.isNullOrEmpty()) entity.iconSubscript else entity.game?.iconSubscript forumIconView.displayGameIcon(icon, iconSubscript) forumContainer.setOnClickListener { DirectUtils.directForumDetail(forumContainer.context, entity.id, "帖子详情") LogUtils.uploadAccessToBbs(entity.id, "文章内所属论坛") - NewLogUtils.logArticleOrQuestionDetailForumClick("帖子详情页", "click_article_detail_forum", entity.id, bbsType) + NewLogUtils.logArticleOrQuestionDetailForumClick( + "帖子详情页", + "click_article_detail_forum", + entity.id, + bbsType + ) } } @@ -155,9 +204,18 @@ class ArticleDetailContentViewHolder(var binding: ItemArticleDetailContentBindin ImageUtils.display(badgeIv, article.user.badge?.icon) badgeIv.setOnClickListener { DialogUtils.showViewBadgeDialog(root.context, article.user.badge) { - MtaHelper.onEvent("进入徽章墙_用户记录", "帖子详情", "${article.user.name}(${article.user.id})") + MtaHelper.onEvent( + "进入徽章墙_用户记录", + "帖子详情", + "${article.user.name}(${article.user.id})" + ) MtaHelper.onEvent("徽章中心", "进入徽章中心", "帖子详情") - DirectUtils.directToBadgeWall(root.context, viewModel.detailEntity?.user?.id, article.user.name, article.user.icon) + DirectUtils.directToBadgeWall( + root.context, + viewModel.detailEntity?.user?.id, + article.user.name, + article.user.icon + ) } } badgeTv.setOnClickListener { badgeIv.performClick() } @@ -208,9 +266,14 @@ class ArticleDetailContentViewHolder(var binding: ItemArticleDetailContentBindin } i++ } - val intent = ImageViewerActivity.getIntent(binding.root.context, articleImgUrlList, current, - mEntrance + "+(帖子详情[" + binding.titleTv.text.toString() + "])") - (binding.root.context as Activity).startActivityForResult(intent, ImageViewerActivity.REQUEST_FOR_VIEWED_IMAGE) + val intent = ImageViewerActivity.getIntent( + binding.root.context, articleImgUrlList, current, + mEntrance + "+(帖子详情[" + binding.titleTv.text.toString() + "])" + ) + (binding.root.context as Activity).startActivityForResult( + intent, + ImageViewerActivity.REQUEST_FOR_VIEWED_IMAGE + ) } } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt index 75a8833600..e4b2c61fd6 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt @@ -5,6 +5,7 @@ import android.app.Activity import android.view.View import android.webkit.JavascriptInterface import android.webkit.WebView +import android.widget.LinearLayout import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.gh.common.DefaultUrlHandler @@ -19,8 +20,10 @@ import com.gh.gamecenter.qa.editor.OnLinkClickListener import com.gh.gamecenter.qa.entity.QuestionsDetailEntity import java.util.* -class QuestionDetailContentViewHolder(var binding: ItemArticleDetailContentBinding, var viewModel: NewQuestionDetailViewModel) - : RecyclerView.ViewHolder(binding.root) { +class QuestionDetailContentViewHolder( + var binding: ItemArticleDetailContentBinding, + var viewModel: NewQuestionDetailViewModel +) : RecyclerView.ViewHolder(binding.root) { private var mEntrance = "" val questionImgUrlList = ArrayList() @@ -31,8 +34,12 @@ class QuestionDetailContentViewHolder(var binding: ItemArticleDetailContentBindi richEditor.setInputEnabled(false) richEditor.setPadding(20, 20, 20, 15) richEditor.addJavascriptInterface(JsInterface(question.status), "imagelistener") - richEditor.addJavascriptInterface(OnLinkClickListener(root.context, question.title - ?: "", question.status, mEntrance, "问题详情"), "OnLinkClickListener") + richEditor.addJavascriptInterface( + OnLinkClickListener( + root.context, question.title + ?: "", question.status, mEntrance, "问题详情" + ), "OnLinkClickListener" + ) richEditor.setLayoutCallback(object : EmptyCallback { override fun onCallback() { viewModel.questionRenderedLiveData.postValue(true) @@ -63,6 +70,13 @@ class QuestionDetailContentViewHolder(var binding: ItemArticleDetailContentBindi approvalStatusTv.background = R.drawable.bg_approval_status_fail.toDrawable() } } + if (question.status != "pass") { + (statusContainer.layoutParams as LinearLayout.LayoutParams).apply { + topMargin = 7f.dip2px() + statusContainer.layoutParams = this + } + titleTv.setPadding(20f.dip2px(), 16f.dip2px(), 20f.dip2px(), 5f.dip2px()) + } val bbsType = if (question.type == "game_bbs") "游戏论坛" else "综合论坛" followBtn.setOnClickListener { @@ -71,32 +85,52 @@ class QuestionDetailContentViewHolder(var binding: ItemArticleDetailContentBindi viewModel.follow() } else { DialogUtils.showAlertDialog(root.context, - "取消关注", - "确定要取消关注 ${question.user.name} 吗?", - "确定取消", - "暂不取消", - DialogUtils.ConfirmListener { - viewModel.unFollow() - }, null) + "取消关注", + "确定要取消关注 ${question.user.name} 吗?", + "确定取消", + "暂不取消", + DialogUtils.ConfirmListener { + viewModel.unFollow() + }, null + ) } - NewLogUtils.logQuestionDetailClick("click_question_detail_follow", question.user.id - ?: "", "提问帖", question.community.id, bbsType) + NewLogUtils.logQuestionDetailClick( + "click_question_detail_follow", question.user.id + ?: "", "提问帖", question.community.id, bbsType + ) } } userNameTv.setOnClickListener { - DirectUtils.directToHomeActivity(root.context, question.user.id, 1, mEntrance, "问题详情") - NewLogUtils.logQuestionDetailClick("click_question_detail_nickname", question.user.id - ?: "", "提问帖", question.community.id, bbsType) + DirectUtils.directToHomeActivity( + root.context, + question.user.id, + 1, + mEntrance, + "问题详情" + ) + NewLogUtils.logQuestionDetailClick( + "click_question_detail_nickname", question.user.id + ?: "", "提问帖", question.community.id, bbsType + ) } userIconIv.setOnClickListener { - DirectUtils.directToHomeActivity(root.context, question.user.id, 1, mEntrance, "问题详情") - NewLogUtils.logQuestionDetailClick("click_question_detail_profile_photo", question.user.id - ?: "", "提问帖", question.community.id, bbsType) + DirectUtils.directToHomeActivity( + root.context, + question.user.id, + 1, + mEntrance, + "问题详情" + ) + NewLogUtils.logQuestionDetailClick( + "click_question_detail_profile_photo", question.user.id + ?: "", "提问帖", question.community.id, bbsType + ) } - titleTv.text = if (question.finish){ - SpanBuilder(" ${question.title}").image(0, 1, R.drawable.ic_ask_solved_label).build() - }else{ + titleTv.text = if (question.finish) { + SpanBuilder(" ${question.title}").image(0, 1, R.drawable.ic_ask_solved_label) + .build() + } else { SpanBuilder(" ${question.title}").image(0, 1, R.drawable.ic_ask_label).build() } userNameTv.text = question.user.name @@ -107,20 +141,31 @@ class QuestionDetailContentViewHolder(var binding: ItemArticleDetailContentBindi richEditor.setHtml(question.description, true) } if (question.time.create == question.time.edit) { - releaseTimeTv.text = String.format("发布于%s", NewsUtils.getFormattedTime(question.time.create)) + releaseTimeTv.text = + String.format("发布于%s", NewsUtils.getFormattedTime(question.time.create)) } else { - releaseTimeTv.text = String.format("发布于%s 最后编辑于%s", NewsUtils.getFormattedTime(question.time.create), NewsUtils.getFormattedTime(question.time.edit)) + releaseTimeTv.text = String.format( + "发布于%s 最后编辑于%s", + NewsUtils.getFormattedTime(question.time.create), + NewsUtils.getFormattedTime(question.time.edit) + ) } richEditor.visibility = View.VISIBLE question.community.let { entity -> gameName.text = entity.name val icon = if (!entity.icon.isNullOrEmpty()) entity.icon else entity.game?.getIcon() - val iconSubscript = if (!entity.iconSubscript.isNullOrEmpty()) entity.iconSubscript else entity.game?.iconSubscript + val iconSubscript = + if (!entity.iconSubscript.isNullOrEmpty()) entity.iconSubscript else entity.game?.iconSubscript forumIconView.displayGameIcon(icon, iconSubscript) forumContainer.setOnClickListener { DirectUtils.directForumDetail(forumContainer.context, entity.id, "问题详情") LogUtils.uploadAccessToBbs(entity.id, "文章内所属论坛") - NewLogUtils.logArticleOrQuestionDetailForumClick("提问帖详情", "click_question_detail_forum", entity.id, bbsType) + NewLogUtils.logArticleOrQuestionDetailForumClick( + "提问帖详情", + "click_question_detail_forum", + entity.id, + bbsType + ) } } @@ -145,7 +190,12 @@ class QuestionDetailContentViewHolder(var binding: ItemArticleDetailContentBindi ImageUtils.display(badgeIv, question.user.badge?.icon) badgeIv.setOnClickListener { DialogUtils.showViewBadgeDialog(root.context, question.user.badge) { - DirectUtils.directToBadgeWall(root.context, question.user.id, question.user.name, question.user.icon) + DirectUtils.directToBadgeWall( + root.context, + question.user.id, + question.user.name, + question.user.icon + ) } } badgeTv.setOnClickListener { badgeIv.performClick() } @@ -195,9 +245,14 @@ class QuestionDetailContentViewHolder(var binding: ItemArticleDetailContentBindi } i++ } - val intent = ImageViewerActivity.getIntent(binding.root.context, questionImgUrlList, current, - mEntrance + "+(问题详情[" + binding.titleTv.text.toString() + "])") - (binding.root.context as Activity).startActivityForResult(intent, ImageViewerActivity.REQUEST_FOR_VIEWED_IMAGE) + val intent = ImageViewerActivity.getIntent( + binding.root.context, questionImgUrlList, current, + mEntrance + "+(问题详情[" + binding.titleTv.text.toString() + "])" + ) + (binding.root.context as Activity).startActivityForResult( + intent, + ImageViewerActivity.REQUEST_FOR_VIEWED_IMAGE + ) } } } diff --git a/app/src/main/res/layout/item_article_detail_content.xml b/app/src/main/res/layout/item_article_detail_content.xml index 7e3e454f5c..15746b78a2 100644 --- a/app/src/main/res/layout/item_article_detail_content.xml +++ b/app/src/main/res/layout/item_article_detail_content.xml @@ -128,6 +128,7 @@ Date: Mon, 2 Aug 2021 15:43:24 +0800 Subject: [PATCH 003/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA2=E6=9C=9F-?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E8=AF=A6=E6=83=85=E9=A1=B5=E5=BC=95=E5=AF=BC?= =?UTF-8?q?=EF=BC=880802UI=E6=B5=8B=E8=AF=95=EF=BC=89https://git.ghzs.com/?= =?UTF-8?q?pm/halo-app-issues/-/issues/1352#note=5F111430?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../forum/detail/ForumDetailFragment.kt | 44 ++++++++++++------- .../forum/home/CommunityHomeFragment.kt | 4 +- 2 files changed, 29 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt index b77b4ba1c0..dc77c71827 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt @@ -298,9 +298,7 @@ class ForumDetailFragment : BaseLazyTabFragment() { mBinding.followTv.setTextColor(ContextCompat.getColor(requireContext(), if (me.isFollower) R.color.text_999999 else R.color.white)) mBinding.followTv.background = ContextCompat.getDrawable(requireContext(), if (me.isFollower) R.drawable.bg_shape_f5_radius_999 else R.drawable.login_btn_bg) - mBinding.moderatorContainer.post { - showModeratorGuide() - } + showModeratorGuide() } } @@ -309,23 +307,35 @@ class ForumDetailFragment : BaseLazyTabFragment() { if (time >= 2) return mBinding.run { - val location = IntArray(2) - moderatorTv.getLocationOnScreen(location) - moderatorGuideContainer.visibility = View.VISIBLE - moderatorGuideContainer.layoutParams = (moderatorGuideContainer.layoutParams as ViewGroup.MarginLayoutParams).apply { - leftMargin = location[0] - 16F.dip2px() - } - moderatorGuideClose.setOnClickListener { - moderatorGuideContainer.visibility = View.GONE - } - postDelayedRunnable({ tryCatchInRelease { - moderatorGuideContainer.visibility = View.GONE - } - }, 3000) + val location = IntArray(2) + moderatorTv.getLocationOnScreen(location) + moderatorGuideContainer.layoutParams = (moderatorGuideContainer.layoutParams as ViewGroup.MarginLayoutParams).apply { + leftMargin = location[0] - 16F.dip2px() + } + moderatorGuideContainer.alpha = 0F + moderatorGuideContainer.visibility = View.VISIBLE + moderatorGuideContainer.animate().alpha(1F).setDuration(200).start() + moderatorGuideClose.setOnClickListener { + if (moderatorGuideContainer.visibility != View.GONE) { + moderatorGuideContainer.animate().alpha(0F).setDuration(200) + .withEndAction { moderatorGuideContainer.visibility = View.GONE }.start() + } + } - SPUtils.setInt(Constants.SP_FORUM_DETAIL_MODERATOR_GUIDE, ++time) + postDelayedRunnable({ + tryCatchInRelease { + if (moderatorGuideContainer.visibility != View.GONE) { + moderatorGuideContainer.animate().alpha(0F).setDuration(200) + .withEndAction { moderatorGuideContainer.visibility = View.GONE }.start() + } + } + }, 3000) + + SPUtils.setInt(Constants.SP_FORUM_DETAIL_MODERATOR_GUIDE, ++time) + } + }, 1000) } } diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt index 21e4558ca5..fc6fdc8b3b 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt @@ -107,7 +107,7 @@ class CommunityHomeFragment : LazyFragment() { tryCatchInRelease { guideTipIv.animate().alpha(1F).setDuration(200).start() } - }, 100) + }, 500) } SPUtils.setBoolean(Constants.SP_COMMUNITY_HOME_GUIDE, true) } @@ -322,7 +322,7 @@ class CommunityHomeFragment : LazyFragment() { tryCatchInRelease { guideTipIv.animate().alpha(1F).setDuration(200).start() } - }, 100) + }, 500) SPUtils.setBoolean(Constants.SP_COMMUNITY_HOME_VIDEO_GUIDE, true) } From 59da7b6ba653768b06ced370b4646024dac9c501 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Mon, 2 Aug 2021 15:58:45 +0800 Subject: [PATCH 004/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA2=E6=9C=9F-?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E5=B8=96=E5=8F=91=E5=B8=83=E9=A1=B5(0802UI?= =?UTF-8?q?=E6=B5=8B=E8=AF=951,2)=20https://git.ghzs.com/pm/halo-app-issue?= =?UTF-8?q?s/-/issues/1355?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qa/dialog/InputUrlDialogFragment.kt | 1 - .../res/drawable-xxhdpi/ic_choose_activity.webp | Bin 1018 -> 0 bytes .../res/drawable-xxxhdpi/ic_choose_activity.webp | Bin 0 -> 1216 bytes 3 files changed, 1 deletion(-) delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_choose_activity.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_choose_activity.webp diff --git a/app/src/main/java/com/gh/gamecenter/qa/dialog/InputUrlDialogFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/dialog/InputUrlDialogFragment.kt index 27d070417c..09d81212cb 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/dialog/InputUrlDialogFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/dialog/InputUrlDialogFragment.kt @@ -58,7 +58,6 @@ class InputUrlDialogFragment : BaseDialogFragment() { createDialog.setCanceledOnTouchOutside(true) val window = createDialog.window window?.setGravity(Gravity.BOTTOM) - window?.setWindowAnimations(R.style.community_publication_animation) return createDialog } diff --git a/app/src/main/res/drawable-xxhdpi/ic_choose_activity.webp b/app/src/main/res/drawable-xxhdpi/ic_choose_activity.webp deleted file mode 100644 index 38af24a83d9259547fdeafdf17a2a33d631b9383..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1018 zcmVI?5&VBlU|vcEZ7UNT=l_P#>XvR^wE;vpZQvV+TU%x5dF*T$5IMZ?ps&|T7y|8RA$x))tH-vnp`4Sk_wgsIK4*59e^N7z=z7Ftp2Crj$o&2E=|4`?D=p%feGQJP~ z&}aERZideZX8asthR-<%W{v_@P&gps0ssI|5CEM4Dlh;r06vj8m`J6gA|Wn2_yDjH z32XqdB|%eO7X2s85{CW{7aydV&3J%xfb#*+ThIggPf(Xam;LW!fA9FKDb30_eQZFE z1#l0e%<#QE><{Dt>j1Kw`I;Lh=3#k@HZ?b13c-U}Ei4_Ghw$zCY%A{6qaH5 z9a^3oh4;kNL;wK(`+EC}!5{t&keJbpF-dfDwKf_Oa;$+~ShM?V%|JYJJt%2kOBrq< z=@*M-iu?5sEtL@dxkJY>v;`Net6;+xRtzy@E-&unf&m!L=-1r_Itw+j7sPyM27Iqd zSz`@sl}m;0KaYT~h0T$+TC|FG>d&04bCz1@l_;c~bwBCLhU`HnBD)_om%|n7@44&B zMyMHBy>yYfwEtX`^7+}uL;*T0DcHvAGTWPxS6(3C#8J~*uGd2j5E_-0n!P`rT_@Ev zM38uHz`62IWuE5y%SEU;)Mi~IGJB83IjVd!FzHej;WcsP_W9Ap$-GF;Kpx>U25KZ3 z^n~AQyQQ(L{KEk}qaW=XhvLQeLA2YUFaVMGI|)*LYBDe28i>kfkhZg#OL3+H(I|o| zj(a+$RXkUlfH!|KUDspj=EAX73DAOTUDUrdAJRpq>K2UtPzzCI=u1@*Jv<0m9r_lhnV2GS`kv-(#J(b8P#|RP_!#QA!$-OuJY+=tcp!I^ zlf1PtNGy#w_0B#$kR}h5Rk~JzZB|(6-={aeFeZzpxaab25*%#!>LFO}Ar@bkc6YCX z_z%jEi@s!}^Npg59|RhP%YLnH+>FrJjk_r{@3^1dOSy}cu*5J*DTOON)dHkI4LVUC zN)~!}W&0oF{C9C}E`2LjjsS}}**adjyH@rd20Hj8Wm;S=c^KbvaoVZiNdk;iDi#kY o5*P`T;eqfz7}bQ-&4!Ram%~xA&Udc}*eG}k@cdvF!X$tI0E7(PHUIzs diff --git a/app/src/main/res/drawable-xxxhdpi/ic_choose_activity.webp b/app/src/main/res/drawable-xxxhdpi/ic_choose_activity.webp new file mode 100644 index 0000000000000000000000000000000000000000..1cf12aa4928455f0f43bc512a36bffa75ed0e585 GIT binary patch literal 1216 zcmV;x1V8&yNk&Gv1ONb6MM6+kP&il$0000G0000t001`t06|PpNGAaR009S~xNRgg zdb@kfcQ2-h2nHyJ6yO$A$OykF(ByOk5Xc1}97K|&NPWzVd)WSM-oxIufr$Pya@)pH zINSF)#q$OH<;PjocGF_^^S;mBEK}E3S?uGTsO}G1I{G?-t)Q6s(p&_v;FT*KSWEBk z5sq|Z4F4Rdp))4^eVlaY{MAB3r_A?9Z=_?R_gN*KD?g54rE_cWR6&8_shI*ZfQS+i z&`_cV21*R@4@w+e4;velZj= zy8fo?-@5Un8^5~wBBMwaQzX{SzpDAZ2Wm>xy7f%9ernfiT|Us|5n=w(IsUuU1N;Y^&#>2^ z2bTA;g?9(qE4kkWP%!;_(`0AVp1{AVy;A>0y?{SSLb27iilObzKk#Ayc6hNtf!C$M zf(WPoJMCVS_agyx2YQFxP#$YuLn2(I>6+ul)KX^v^4J&8;LZ$|pSuC0op<4g0092{ zM*peIlM+5WICMztm^i1|L|#Xp7{&H7c;Y74N~6m&Lfg7p#~^}k+g z`*h5P$k*b1JuV8&LrPu}^cor)dEPGfpgvMKf|xu2EU5e~F5KW(TiqEg$~i3Av-b}T zkb$N#ZyQf7RF5_)lLhtU9S5QPNsMbSzj|kMoGGe3mBBw9)x{4Z#mculH;gcsKcBU| zN|_swMA}=9mmJXK_}piLDuE+qvlH1D!6+{zNC4~9r}>)pl+)&A?0@G46y-?^b^rK& zUt7@55K2r__K6nDm>0%VjV=w?i!D;=$N2n0d_$=1B6NK_c%-=u6y)R9Qx&DYpgEVy zE&zW|Rn>*mYJ+Sd=u88hNWg1j^-Xe1^A;TU48L3~w`B+09u-P3K|1r>L-HB5ZtS}R zHS!Z$DO38_b9>D^F{&;v#aVAr?01b5;my5)s>D_Z`Ar^+gsRcpSH{}?M2i~TtFuuq zeCLi}9mIYK;1}HN)DBB<#w&&pkOdY<8=)w|@;R4-w&6~^OeAO)f^lhhe-%1%?1-;H zO-veaPr%20BV+|1)M2Z%w5HVzc6Ds2pczJt!29@ansfcsFfdC0(%cq3>Ve6Vjla3o zy(>6MU+tQIJB^(~mf94}ntmgH@@_(rPj>pirbjsvKv?%T_e1-D8UP+m_~6FTi~N6B zCgGa2=muSYanADB#yhPtUtyHSU*VBWNvI0C%VdjL&V&S?M;W3$0x`$el9CV~V Date: Mon, 2 Aug 2021 16:04:00 +0800 Subject: [PATCH 005/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=910802=E4=BA=A7=E5=93=81=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=881=EF=BC=89https://git.ghzs.?= =?UTF-8?q?com/pm/halo-app-issues/-/issues/1423?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qa/answer/BaseAnswerOrArticleItemViewHolder.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/BaseAnswerOrArticleItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/BaseAnswerOrArticleItemViewHolder.kt index f80ce2c016..24a163a8fb 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/BaseAnswerOrArticleItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/BaseAnswerOrArticleItemViewHolder.kt @@ -259,11 +259,11 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH @SuppressLint("CheckResult") fun voteAnswer(entity: AnswerEntity) { + if (entity.status == "pending") { + ToastUtils.showToast("内容审核中") + return + } if (entity.type == "video") { - if (entity.status == "pending") { - ToastUtils.showToast("内容审核中") - return - } RetrofitManager.getInstance(itemView.context) .api.voteVideo(entity.id) .subscribeOn(Schedulers.io()) From e5512604faf5a70e1d48d5b2ab662864c84f5fd5 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Mon, 2 Aug 2021 16:18:39 +0800 Subject: [PATCH 006/151] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=8A=E4=BC=A0?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E7=9A=84=20type=20=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/base/BaseRichEditorViewModel.kt | 231 ++++++++++-------- .../com/gh/common/util/UploadImageUtils.kt | 1 + 2 files changed, 135 insertions(+), 97 deletions(-) diff --git a/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt b/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt index 7a1b1c9e7d..6ffbf5d545 100644 --- a/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt +++ b/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt @@ -75,7 +75,10 @@ abstract class BaseRichEditorViewModel(application: Application) : AndroidViewMo if (File(picturePath).length() > ImageUtils.getUploadFileMaxSize()) { val count = ImageUtils.getUploadFileMaxSize() / 1024 / 1024 val application: Application = getApplication() - Utils.toast(getApplication(), application.getString(R.string.pic_max_hint, count)) + Utils.toast( + getApplication(), + application.getString(R.string.pic_max_hint, count) + ) continue } Utils.log("picturePath = $picturePath") @@ -85,88 +88,110 @@ abstract class BaseRichEditorViewModel(application: Application) : AndroidViewMo } } if (pictureList.size == 0) return + val imageType = when (getRichType()) { + RichType.ARTICLE -> UploadImageUtils.UploadType.community_article + RichType.QUESTION -> UploadImageUtils.UploadType.question + else -> UploadImageUtils.UploadType.poster + } + uploadImageSubscription = UploadImageUtils.compressAndUploadImageList( + imageType, + pictureList, + false, + object : UploadImageUtils.OnUploadImageListListener { + override fun onProgress(total: Long, progress: Long) {} - uploadImageSubscription = UploadImageUtils.compressAndUploadImageList(UploadImageUtils.UploadType.answer, pictureList - , false, object : UploadImageUtils.OnUploadImageListListener { - override fun onProgress(total: Long, progress: Long) {} - - override fun onCompressSuccess(imageUrls: List) { - val chooseImageMd5Map = LinkedHashMap() - imageUrls.forEach { - chooseImageMd5Map[MD5Utils.getUrlMD5(it)] = "" - } - uploadingImage.add(chooseImageMd5Map) - chooseImagesUpload.postValue(chooseImageMd5Map) - } - - override fun onSingleSuccess(imageUrl: Map) { - val map = LinkedHashMap() - for (key in imageUrl.keys) { - map[MD5Utils.getUrlMD5(key)] = FILE_HOST + key.decodeURI() - mapImages[TextUtils.htmlEncode(key).decodeURI()] = imageUrl[key] ?: "" - } - chooseImagesUploadSuccess.postValue(map) - } - - override fun onSuccess(imageUrl: LinkedHashMap, errorMap: Map) { - val uploadMap = uploadingImage.find { it.containsKey(MD5Utils.getUrlMD5(imageUrl.entries.iterator().next().key)) } - uploadMap?.let { - uploadingImage.remove(uploadMap) - } - - val errorSize = pictureList.size - imageUrl.size - if (errorSize > 0) { - val map = LinkedHashMap() - for (key in errorMap.keys) { - map[MD5Utils.getUrlMD5(key)] = "" + override fun onCompressSuccess(imageUrls: List) { + val chooseImageMd5Map = LinkedHashMap() + imageUrls.forEach { + chooseImageMd5Map[MD5Utils.getUrlMD5(it)] = "" + } + uploadingImage.add(chooseImageMd5Map) + chooseImagesUpload.postValue(chooseImageMd5Map) + } + + override fun onSingleSuccess(imageUrl: Map) { + val map = LinkedHashMap() + for (key in imageUrl.keys) { + map[MD5Utils.getUrlMD5(key)] = FILE_HOST + key.decodeURI() + mapImages[TextUtils.htmlEncode(key).decodeURI()] = imageUrl[key] ?: "" } - //value为空会删除PlaceholderImage chooseImagesUploadSuccess.postValue(map) + } + + override fun onSuccess( + imageUrl: LinkedHashMap, + errorMap: Map + ) { + val uploadMap = uploadingImage.find { + it.containsKey( + MD5Utils.getUrlMD5( + imageUrl.entries.iterator().next().key + ) + ) + } + uploadMap?.let { + uploadingImage.remove(uploadMap) + } + + val errorSize = pictureList.size - imageUrl.size + if (errorSize > 0) { + val map = LinkedHashMap() + for (key in errorMap.keys) { + map[MD5Utils.getUrlMD5(key)] = "" + } + //value为空会删除PlaceholderImage + chooseImagesUploadSuccess.postValue(map) + + for (error in errorMap.values) { + if (error is HttpException && error.code() == 403) { + Utils.toast(getApplication(), errorSize.toString() + "张违规图片上传失败") + return + } + } + Utils.toast(getApplication(), errorSize.toString() + "张图片上传失败") + } + } + + override fun onError(errorMap: Map) { + val errorSize = pictureList.size + if (errorSize > 0) { + val map = LinkedHashMap() + for (key in errorMap.keys) { + map[MD5Utils.getUrlMD5(key)] = "" + } + //value为空会删除PlaceholderImage + chooseImagesUploadSuccess.postValue(map) + } for (error in errorMap.values) { if (error is HttpException && error.code() == 403) { - Utils.toast(getApplication(), errorSize.toString() + "张违规图片上传失败") + val e = error.response()?.errorBody()?.string()?.toObject() + if (e != null && e.code == 403017) { + Utils.toast( + getApplication(), + errorSize.toString() + "张图片的宽或高超过限制,请裁剪后上传" + ) + } else { + Utils.toast(getApplication(), errorSize.toString() + "张违规图片上传失败") + } return } } - Utils.toast(getApplication(), errorSize.toString() + "张图片上传失败") - } - } - - override fun onError(errorMap: Map) { - val errorSize = pictureList.size - if (errorSize > 0) { - val map = LinkedHashMap() - for (key in errorMap.keys) { - map[MD5Utils.getUrlMD5(key)] = "" - } - //value为空会删除PlaceholderImage - chooseImagesUploadSuccess.postValue(map) - } - - for (error in errorMap.values) { - if (error is HttpException && error.code() == 403) { - val e = error.response()?.errorBody()?.string()?.toObject() - if (e != null && e.code == 403017) { - Utils.toast(getApplication(), errorSize.toString() + "张图片的宽或高超过限制,请裁剪后上传") - } else { - Utils.toast(getApplication(), errorSize.toString() + "张违规图片上传失败") - } - return + if (errorSize == 1) { + Utils.toast(getApplication(), "图片上传失败") + } else { + Utils.toast(getApplication(), errorSize.toString() + "张图片上传失败") } } - if (errorSize == 1) { - Utils.toast(getApplication(), "图片上传失败") - } else { - Utils.toast(getApplication(), errorSize.toString() + "张图片上传失败") - } - } - }) + }) } fun uploadPoster(picturePath: String) { processDialog.postValue(WaitingDialogFragment.WaitingDialogData("封面上传中...", true)) - uploadImageSubscription = UploadImageUtils.compressAndUploadImage(UploadImageUtils.UploadType.poster, picturePath, false, + uploadImageSubscription = + UploadImageUtils.compressAndUploadImage(UploadImageUtils.UploadType.poster, + picturePath, + false, object : UploadImageUtils.OnUploadImageListener { override fun onSuccess(imageUrl: String) { patchVideoPoster(imageUrl) @@ -186,19 +211,19 @@ abstract class BaseRichEditorViewModel(application: Application) : AndroidViewMo if (id.isEmpty() || videoId.isEmpty()) return val map = hashMapOf("poster" to poster, "type" to getVideoType()) mApi.patchInsertVideo(videoId, map.toRequestBody()) - .compose(observableToMain()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - super.onResponse(response) - mUploadVideoListener?.changePoster(id, poster) - handleUploadPosterResult(false) - } + .compose(observableToMain()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + mUploadVideoListener?.changePoster(id, poster) + handleUploadPosterResult(false) + } - override fun onFailure(e: HttpException?) { - super.onFailure(e) - handleUploadPosterResult(true) - } - }) + override fun onFailure(e: HttpException?) { + super.onFailure(e) + handleUploadPosterResult(true) + } + }) } private fun handleUploadPosterResult(isFailure: Boolean = false) { @@ -237,8 +262,13 @@ abstract class BaseRichEditorViewModel(application: Application) : AndroidViewMo if (localVideoList.isEmpty()) return currentUploadingVideo = localVideoList[0] UploadManager.createUploadTask(currentUploadingVideo?.filePath - ?: "", object : OnUploadListener { - override fun onProgressChanged(uploadFilePath: String, currentSize: Long, totalSize: Long, speed: Long) { + ?: "", object : OnUploadListener { + override fun onProgressChanged( + uploadFilePath: String, + currentSize: Long, + totalSize: Long, + speed: Long + ) { runOnUiThread { val percent = (currentSize * 100 / totalSize.toFloat()).roundTo(1) currentUploadingVideo?.id?.let { @@ -260,9 +290,13 @@ abstract class BaseRichEditorViewModel(application: Application) : AndroidViewMo } private fun postVideoPosterAndInfo(uploadFilePath: String, url: String) { - val localVideoPoster = getApplication().cacheDir.absolutePath + File.separator + System.currentTimeMillis() + ".jpg" + val localVideoPoster = + getApplication().cacheDir.absolutePath + File.separator + System.currentTimeMillis() + ".jpg" try { - val bmp = ThumbnailUtils.createVideoThumbnail(uploadFilePath, MediaStore.Images.Thumbnails.MINI_KIND) + val bmp = ThumbnailUtils.createVideoThumbnail( + uploadFilePath, + MediaStore.Images.Thumbnails.MINI_KIND + ) // bmp 可能为空 FileOutputStream(localVideoPoster).use { out -> bmp?.compress(Bitmap.CompressFormat.PNG, 100, out) @@ -273,7 +307,10 @@ abstract class BaseRichEditorViewModel(application: Application) : AndroidViewMo uploadVideoFailure() return } - uploadImageSubscription = UploadImageUtils.compressAndUploadImage(UploadImageUtils.UploadType.poster, localVideoPoster, false, + uploadImageSubscription = + UploadImageUtils.compressAndUploadImage(UploadImageUtils.UploadType.poster, + localVideoPoster, + false, object : UploadImageUtils.OnUploadImageListener { override fun onSuccess(imageUrl: String) { postVideoInfo(url, imageUrl) @@ -300,20 +337,20 @@ abstract class BaseRichEditorViewModel(application: Application) : AndroidViewMo } val requestBody = map.toRequestBody() mApi.insertVideo(requestBody) - .compose(observableToMain()) - .subscribe(object : Response() { - override fun onResponse(response: JsonObject?) { - super.onResponse(response) - if (response != null) { - uploadVideoSuccess(poster, url, response) - } + .compose(observableToMain()) + .subscribe(object : Response() { + override fun onResponse(response: JsonObject?) { + super.onResponse(response) + if (response != null) { + uploadVideoSuccess(poster, url, response) } + } - override fun onFailure(e: HttpException?) { - super.onFailure(e) - uploadVideoFailure() - } - }) + override fun onFailure(e: HttpException?) { + super.onFailure(e) + uploadVideoFailure() + } + }) } private fun uploadVideoSuccess(poster: String, url: String, data: JsonObject) { diff --git a/app/src/main/java/com/gh/common/util/UploadImageUtils.kt b/app/src/main/java/com/gh/common/util/UploadImageUtils.kt index f95ab6885a..fac65dd176 100644 --- a/app/src/main/java/com/gh/common/util/UploadImageUtils.kt +++ b/app/src/main/java/com/gh/common/util/UploadImageUtils.kt @@ -27,6 +27,7 @@ import java.lang.Exception object UploadImageUtils { enum class UploadType { + community_article, question, answer, suggestion, From 2e9642019bfebdc134b2f16632a98b4cadcf4e02 Mon Sep 17 00:00:00 2001 From: leafwai Date: Mon, 2 Aug 2021 17:08:58 +0800 Subject: [PATCH 007/151] =?UTF-8?q?=E5=BE=AE=E5=8D=9ASDK=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=88=B011.6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 5 +- app/libs/sina-weibo-2.0.3.aar | Bin 278750 -> 0 bytes .../com/gh/common/util/AccessTokenKeeper.java | 29 +++--- .../java/com/gh/common/util/LoginHelper.kt | 47 ++++++---- .../com/gh/common/util/MessageShareUtils.java | 25 ++--- .../java/com/gh/common/util/ShareUtils.java | 17 +--- .../com/gh/gamecenter/WeiBoShareActivity.java | 87 +++++++++++------- .../gh/gamecenter/fragment/LoginFragment.java | 5 +- 8 files changed, 122 insertions(+), 93 deletions(-) delete mode 100644 app/libs/sina-weibo-2.0.3.aar diff --git a/app/build.gradle b/app/build.gradle index 991d51234d..34adee8b24 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -47,8 +47,7 @@ android { ndk { // 如果不添加 `arm64` 调用系统的 PackageManager 的方法读取安装包信息的时候会出现 native 层闪退,草 - // 微博 SDK 没有 64位的 SO,添加了 arm64 又会无法使用微博登录,下个版本更新微博 SDK 刻不容缓了! - abiFilters "armeabi-v7a", "x86" + abiFilters "armeabi", "armeabi-v7a", "arm64-v8a", "x86" } renderscriptTargetApi 18 @@ -344,6 +343,8 @@ dependencies { implementation "com.aliyun.openservices:aliyun-log-android-sdk:${aliyunLog}" implementation "com.github.princekin-f:EasyFloat:${easyFloat}" + implementation 'io.github.sinaweibosdk:core:11.6.0@aar' + implementation project(':libraries:LGLibrary') // implementation project(':libraries:MTA') implementation project(':libraries:QQShare') diff --git a/app/libs/sina-weibo-2.0.3.aar b/app/libs/sina-weibo-2.0.3.aar deleted file mode 100644 index 3b5d73763710b29b135efe9ec4cb361b95a3ef0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 278750 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%0A6sZF4FstFl`Z_eW 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 heu{{dfKhOz(v diff --git a/app/src/main/java/com/gh/common/util/AccessTokenKeeper.java b/app/src/main/java/com/gh/common/util/AccessTokenKeeper.java index 5a81cfbebf..e296f72462 100644 --- a/app/src/main/java/com/gh/common/util/AccessTokenKeeper.java +++ b/app/src/main/java/com/gh/common/util/AccessTokenKeeper.java @@ -2,6 +2,7 @@ package com.gh.common.util; import android.content.Context; import android.content.SharedPreferences; +import android.os.Bundle; import com.sina.weibo.sdk.auth.Oauth2AccessToken; @@ -13,6 +14,7 @@ public class AccessTokenKeeper { private static final String PREFERENCES_NAME = "com_weibo_sdk_android"; private static final String KEY_UID = "uid"; + private static final String KEY_USERNAME = "userName"; private static final String KEY_ACCESS_TOKEN = "access_token"; private static final String KEY_EXPIRES_IN = "expires_in"; private static final String KEY_REFRESH_TOKEN = "refresh_token"; @@ -28,13 +30,14 @@ public class AccessTokenKeeper { return; } - SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND); + SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = pref.edit(); editor.putString(KEY_UID, token.getUid()); - editor.putString(KEY_ACCESS_TOKEN, token.getToken()); + editor.putString(KEY_USERNAME, token.getScreenName()); + editor.putString(KEY_ACCESS_TOKEN, token.getAccessToken()); editor.putString(KEY_REFRESH_TOKEN, token.getRefreshToken()); editor.putLong(KEY_EXPIRES_IN, token.getExpiresTime()); - editor.commit(); + editor.apply(); } /** @@ -48,14 +51,14 @@ public class AccessTokenKeeper { return null; } - Oauth2AccessToken token = new Oauth2AccessToken(); - SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND); - token.setUid(pref.getString(KEY_UID, "")); - token.setToken(pref.getString(KEY_ACCESS_TOKEN, "")); - token.setRefreshToken(pref.getString(KEY_REFRESH_TOKEN, "")); - token.setExpiresTime(pref.getLong(KEY_EXPIRES_IN, 0)); - - return token; + SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE); + Bundle args = new Bundle(); + args.putString(KEY_UID, pref.getString(KEY_UID, "")); + args.putString(KEY_USERNAME, pref.getString(KEY_USERNAME, "")); + args.putString(KEY_ACCESS_TOKEN, pref.getString(KEY_ACCESS_TOKEN, "")); + args.putString(KEY_REFRESH_TOKEN, pref.getString(KEY_REFRESH_TOKEN, "")); + args.putLong(KEY_EXPIRES_IN, pref.getLong(KEY_EXPIRES_IN, 0)); + return Oauth2AccessToken.parseAccessToken(args); } /** @@ -68,9 +71,9 @@ public class AccessTokenKeeper { return; } - SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND); + SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_PRIVATE); SharedPreferences.Editor editor = pref.edit(); editor.clear(); - editor.commit(); + editor.apply(); } } diff --git a/app/src/main/java/com/gh/common/util/LoginHelper.kt b/app/src/main/java/com/gh/common/util/LoginHelper.kt index 69cd9e5dd8..a189bf3aed 100644 --- a/app/src/main/java/com/gh/common/util/LoginHelper.kt +++ b/app/src/main/java/com/gh/common/util/LoginHelper.kt @@ -8,12 +8,11 @@ import com.gh.gamecenter.user.LoginTag import com.halo.assistant.HaloApp import com.lightgame.utils.RuntimeUtils import com.lightgame.utils.Utils -import com.sina.weibo.sdk.WbSdk import com.sina.weibo.sdk.auth.AuthInfo import com.sina.weibo.sdk.auth.Oauth2AccessToken import com.sina.weibo.sdk.auth.WbAuthListener -import com.sina.weibo.sdk.auth.WbConnectErrorMessage -import com.sina.weibo.sdk.auth.sso.SsoHandler +import com.sina.weibo.sdk.openapi.IWBAPI +import com.sina.weibo.sdk.openapi.WBAPIFactory import com.tencent.mm.opensdk.modelmsg.SendAuth import com.tencent.mm.opensdk.openapi.IWXAPI import com.tencent.mm.opensdk.openapi.WXAPIFactory @@ -24,6 +23,7 @@ import org.json.JSONException import org.json.JSONObject import java.lang.ref.WeakReference + /** * 第三方登录辅助类 */ @@ -36,7 +36,7 @@ object LoginHelper { private var mTencent: Tencent // QQ private var mIWXAPI: IWXAPI // 微信 - private var mSsoHandler: WeakReference? = null // 微博 + private lateinit var mWBAPI: IWBAPI // 微博 private var mQqLoginListener: IUiListener @@ -56,11 +56,17 @@ object LoginHelper { Utils.log("QQLoginComplete::$s") try { mTencent.openId = o.getString("openid") - mTencent.setAccessToken(o.getString("access_token"), o.getString("expires_in")) + mTencent.setAccessToken( + o.getString("access_token"), + o.getString("expires_in") + ) val content = JSONObject() content.put("openid", o.getString("openid")) - content.put("access_token_expire", Utils.getTime(context) + o.getLong("expires_in")) + content.put( + "access_token_expire", + Utils.getTime(context) + o.getLong("expires_in") + ) content.put("access_token", o.getString("access_token")) mLoginCallback?.get()?.onLoginSuccess(LoginTag.qq, content) // 回调QQ登录成功 @@ -87,7 +93,6 @@ object LoginHelper { } - // DouYinOpenApiFactory.init(DouYinOpenConfig(Config.DOUYIN_CLIENTKEY)) Utils.log("LoginHelper initialization") @@ -120,7 +125,7 @@ object LoginHelper { @JvmStatic fun onWeiboLoginCallback(requestCode: Int, resultCode: Int, data: Intent?) { - mSsoHandler?.get()?.authorizeCallBack(requestCode, resultCode, data) + mWBAPI.authorizeCallback(requestCode, resultCode, data) } // QQ登录 @@ -160,12 +165,14 @@ object LoginHelper { // 微博登录 @JvmStatic fun loginWithWeibo(loginCallback: LoginCallback, context: Activity) { - WbSdk.install(context, AuthInfo(context, Config.WEIBO_APPKEY, "http://www.sina.com", WEIBO_SCOPE)) - + mWBAPI = WBAPIFactory.createWBAPI(context) //初始化微博分享 mLoginCallback = WeakReference(loginCallback) - mSsoHandler = WeakReference(SsoHandler(context)) - mSsoHandler?.get()?.authorizeClientSso(object : WbAuthListener { - override fun onSuccess(token: Oauth2AccessToken?) { + mWBAPI.registerApp( + context, + AuthInfo(context, Config.WEIBO_APPKEY, "http://www.sina.com", WEIBO_SCOPE) + ) + mWBAPI.authorizeClient(object : WbAuthListener { + override fun onComplete(token: Oauth2AccessToken?) { token?.let { RuntimeUtils.getInstance().runOnUiThread { mAccessToken = token @@ -179,8 +186,12 @@ object LoginHelper { val content = JSONObject() tryWithDefaultCatch { content.put("uid", token.uid) - content.put("access_token", token.token) - content.put("access_token_expire", Utils.getTime(context) + token.expiresTime) + content.put("userName", token.screenName) + content.put("access_token", token.accessToken) + content.put( + "access_token_expire", + Utils.getTime(context) + token.expiresTime + ) content.put("refresh_token", token.refreshToken) // content.put("refresh_token_expire", Utils.getTime(mContext) + 86400 * 30); // refresh_token 有效期30天 mLoginCallback?.get()?.onLoginSuccess(LoginTag.weibo, content)// 微博 登录回调 @@ -188,14 +199,16 @@ object LoginHelper { } } - override fun onFailure(p0: WbConnectErrorMessage?) { + override fun onError(error: com.sina.weibo.sdk.common.UiError?) { mLoginCallback?.get()?.onLoginFailure(LoginTag.weibo, "微博登录需要客户端支持,请先安装微博") } - override fun cancel() { + override fun onCancel() { mLoginCallback?.get()?.onLoginFailure(LoginTag.weibo, "取消授权") } + }) + // 第一次启动本应用,AccessToken 不可用 mAccessToken = AccessTokenKeeper.readAccessToken(context) } 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 62722a16d1..26e52e1ea8 100644 --- a/app/src/main/java/com/gh/common/util/MessageShareUtils.java +++ b/app/src/main/java/com/gh/common/util/MessageShareUtils.java @@ -11,11 +11,6 @@ import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Environment; - -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; @@ -27,13 +22,15 @@ import android.widget.PopupWindow; import android.widget.RelativeLayout; import android.widget.TextView; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + import com.gh.common.Base64ImageHolder; import com.gh.common.constant.Config; import com.gh.gamecenter.R; import com.gh.gamecenter.WeiBoShareActivity; import com.lightgame.utils.Utils; -import com.sina.weibo.sdk.WbSdk; -import com.sina.weibo.sdk.auth.AuthInfo; import com.tencent.connect.auth.QQToken; import com.tencent.connect.share.QQShare; import com.tencent.mm.opensdk.modelmsg.SendMessageToWX; @@ -53,8 +50,6 @@ import java.io.IOException; import java.lang.ref.WeakReference; import java.util.Date; -import static com.gh.common.util.LoginHelper.WEIBO_SCOPE; - /** * Created by khy on 2016/11/8. */ @@ -284,23 +279,23 @@ public class MessageShareUtils { // 分享 switch (type) { - case "qq" : + case "qq": shareWay = ShareWay.qq; qqShare(); break; - case "qq_zone" : + case "qq_zone": shareWay = ShareWay.qqZone; qZoneShare(); break; - case "wechat" : + case "wechat": shareWay = ShareWay.wechat; wechatShare(); break; - case "wechat_moments" : + case "wechat_moments": shareWay = ShareWay.wechatMoments; wechatMomentsShare(); break; - case "save" : + case "save": String savePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Pictures/ghzhushou/"; writeBitmap(savePath, "gh-" + new Date().getTime() + ".jpg", shareBm, true); break; @@ -414,8 +409,6 @@ public class MessageShareUtils { //新浪微博分享 public void weiboShare() { - WbSdk.install(mContext, new AuthInfo(mContext, Config.WEIBO_APPKEY, "http://www.sina.com", WEIBO_SCOPE)); - Activity activity = mActivity.get(); if (activity != null) { Intent intent = WeiBoShareActivity.getWeiboImageShareIntent(activity); diff --git a/app/src/main/java/com/gh/common/util/ShareUtils.java b/app/src/main/java/com/gh/common/util/ShareUtils.java index 667eb403e4..bd04db1eeb 100644 --- a/app/src/main/java/com/gh/common/util/ShareUtils.java +++ b/app/src/main/java/com/gh/common/util/ShareUtils.java @@ -31,8 +31,6 @@ import com.gh.gamecenter.WeiBoShareActivity; import com.gh.gamecenter.entity.ShareEntity; import com.gh.gamecenter.eventbus.EBShare; import com.lightgame.utils.Utils; -import com.sina.weibo.sdk.WbSdk; -import com.sina.weibo.sdk.auth.AuthInfo; import com.tencent.connect.share.QQShare; import com.tencent.connect.share.QzoneShare; import com.tencent.mm.opensdk.modelmsg.SendMessageToWX; @@ -51,8 +49,6 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; -import static com.gh.common.util.LoginHelper.WEIBO_SCOPE; - /** * Created by khy on 2016/9/4. */ @@ -175,7 +171,6 @@ public class ShareUtils { mContext = context.getApplicationContext(); mTencent = Tencent.createInstance(Config.TENCENT_APPID, mContext); //初始化QQ分享 mIWXAPI = WXAPIFactory.createWXAPI(mContext, Config.WECHAT_APPID); //初始化微信分享 - } public static ShareUtils getInstance(Context context) { @@ -215,23 +210,23 @@ public class ShareUtils { // 分享 switch (way) { - case "qq" : + case "qq": mShareType = ShareType.qq; qqShare(); break; - case "qq_zone" : + case "qq_zone": mShareType = ShareType.qqZone; qZoneShare(); break; - case "wechat" : + case "wechat": mShareType = ShareType.wechat; wechatShare(); break; - case "wechat_moments" : + case "wechat_moments": mShareType = ShareType.wechatMoments; wechatMomentsShare(); break; - case "weibo" : + case "weibo": mShareType = ShareType.weibo; sinaWeiboShare(); break; @@ -665,8 +660,6 @@ public class ShareUtils { shareType = "sina_weibo"; LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); - WbSdk.install(mContext, new AuthInfo(mContext, Config.WEIBO_APPKEY, "http://www.sina.com", WEIBO_SCOPE)); - if (mShareEntrance == ShareEntrance.qaDetail) { mTitle = "向你推荐:" + mTitle + " @光环助手 " + shareUrl; mSummary = ""; diff --git a/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java b/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java index 30e3af9026..94c171d1ab 100644 --- a/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java +++ b/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java @@ -13,6 +13,7 @@ import android.util.Base64; import androidx.annotation.NonNull; import com.gh.common.Base64ImageHolder; +import com.gh.common.constant.Config; import com.gh.common.util.BiCallback; import com.gh.common.util.EnergyTaskHelper; import com.gh.common.util.ImageUtils; @@ -25,13 +26,17 @@ import com.sina.weibo.sdk.api.ImageObject; import com.sina.weibo.sdk.api.TextObject; import com.sina.weibo.sdk.api.WebpageObject; import com.sina.weibo.sdk.api.WeiboMultiMessage; +import com.sina.weibo.sdk.auth.AuthInfo; +import com.sina.weibo.sdk.common.UiError; +import com.sina.weibo.sdk.openapi.IWBAPI; +import com.sina.weibo.sdk.openapi.WBAPIFactory; import com.sina.weibo.sdk.share.WbShareCallback; -import com.sina.weibo.sdk.share.WbShareHandler; -import com.sina.weibo.sdk.utils.Utility; import org.greenrobot.eventbus.EventBus; import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.UUID; /** * Created by khy on 2016/11/23. @@ -48,6 +53,11 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { private static final String KET_TYPE = "KET_TYPE"; private static final String KET_SUMMARY = "KET_SUMMARY"; + private static final String WEIBO_SCOPE = ( + "email,direct_messages_read,direct_messages_write," + + "friendships_groups_read,friendships_groups_write,statuses_to_me_read," + + "follow_app_official_microblog," + "invitation_write"); + private String shareUrl; private String mShareStyle; @@ -55,7 +65,7 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { private String mSummary; private String mShareType; - private WbShareHandler mWeiboShareAPI; + private IWBAPI mWBAPI; @NonNull public static Intent getWeiboShareIntent(Context context, String shareUrl, String shareIcon, @@ -103,14 +113,14 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { Utils.toast(this, R.string.share_skip); - mWeiboShareAPI = new WbShareHandler(this); - mWeiboShareAPI.registerApp(); + mWBAPI = WBAPIFactory.createWBAPI(this); + mWBAPI.registerApp(this, new AuthInfo(this, Config.WEIBO_APPKEY, "http://www.sina.com", WEIBO_SCOPE)); if ("NORMAL".equals(mShareStyle)) { if (shareIcon != null) { loadIconAndShare(shareIcon); } else { - onWbShareFail(); + onError(new UiError(0, "", "")); } } else if ("IMAGE".equals(mShareStyle)) { shareImage(); @@ -120,7 +130,7 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { protected void onNewIntent(Intent intent) { super.onNewIntent(intent); - mWeiboShareAPI.doResultIntent(intent, this); //当前应用唤起微博分享后,返回当前应用 + mWBAPI.doResultIntent(intent, this); //当前应用唤起微博分享后,返回当前应用 } private void loadIconAndShare(String iconUrl) { @@ -158,22 +168,37 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { } ImageObject imageObject = new ImageObject(); - imageObject.setImageObject(bgBitmap);//设置缩略图。 注意:最终压缩过的缩略图大小不得超过 32kb。 + imageObject.setImageData(bgBitmap);//设置缩略图。 注意:最终压缩过的缩略图大小不得超过 32kb。 WebpageObject webObject = new WebpageObject(); - webObject.identify = Utility.generateGUID(); + webObject.identify = UUID.randomUUID().toString(); webObject.title = ""; webObject.description = getString(R.string.app_name); webObject.defaultText = getString(R.string.app_name); webObject.actionUrl = shareUrl; - webObject.setThumbImage(bgBitmap); + ByteArrayOutputStream os = null; + try { + os = new ByteArrayOutputStream(); + bitmap.compress(Bitmap.CompressFormat.JPEG, 85, os); + webObject.thumbData = os.toByteArray(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + try { + if (os != null) { + os.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } WeiboMultiMessage weiboMessage = new WeiboMultiMessage();//初始化微博的分享消息 weiboMessage.textObject = textObject; weiboMessage.imageObject = imageObject; weiboMessage.mediaObject = webObject; - mWeiboShareAPI.shareMessage(weiboMessage, false); + mWBAPI.shareMessage(weiboMessage, false); } @Override @@ -189,14 +214,14 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { // 转完后重新置位 Base64ImageHolder.INSTANCE.setImage(""); - Bitmap compressBitmap = compressBitmap(bitmap) ; + Bitmap compressBitmap = compressBitmap(bitmap); ImageObject imageObject = new ImageObject(); - imageObject.setImageObject(compressBitmap); + imageObject.setImageData(compressBitmap); WeiboMultiMessage weiboMessage = new WeiboMultiMessage();//初始化微博的分享消息 weiboMessage.imageObject = imageObject; - mWeiboShareAPI.shareMessage(weiboMessage, false); + mWBAPI.shareMessage(weiboMessage, false); } public Bitmap compressBitmap(Bitmap bitmap) { @@ -223,7 +248,7 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { } @Override - public void onWbShareSuccess() { + public void onComplete() { Utils.toast(this, R.string.share_success_hint); if ("NORMAL".equals(mShareStyle)) { LogUtils.uploadShareResult(ShareUtils.shareType, ShareUtils.shareEntrance.getName(), "success", @@ -240,22 +265,7 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { } @Override - public void onWbShareCancel() { - Utils.toast(this, R.string.share_cancel_hint); - if ("NORMAL".equals(mShareStyle)) { - LogUtils.uploadShareResult(ShareUtils.shareType, ShareUtils.shareEntrance.getName(), "cancel", - ShareUtils.shareEntity.getShareUrl(), ShareUtils.shareEntity.getShareTitle(), ShareUtils.shareEntity.getSummary(), ShareUtils.resourceId); - if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.inviteFriends) { - IntegralLogHelper.INSTANCE.logInviteResult("取消", "微博"); - } - } else { - IntegralLogHelper.INSTANCE.logInviteResult("取消", "微博"); - } - finish(); - } - - @Override - public void onWbShareFail() { + public void onError(UiError uiError) { Utils.toast(this, R.string.share_fail_hint); if ("NORMAL".equals(mShareStyle)) { LogUtils.uploadShareResult(ShareUtils.shareType, ShareUtils.shareEntrance.getName(), "fail", @@ -268,4 +278,19 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { } finish(); } + + @Override + public void onCancel() { + Utils.toast(this, R.string.share_cancel_hint); + if ("NORMAL".equals(mShareStyle)) { + LogUtils.uploadShareResult(ShareUtils.shareType, ShareUtils.shareEntrance.getName(), "cancel", + ShareUtils.shareEntity.getShareUrl(), ShareUtils.shareEntity.getShareTitle(), ShareUtils.shareEntity.getSummary(), ShareUtils.resourceId); + if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.inviteFriends) { + IntegralLogHelper.INSTANCE.logInviteResult("取消", "微博"); + } + } else { + IntegralLogHelper.INSTANCE.logInviteResult("取消", "微博"); + } + finish(); + } } diff --git a/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java index f619a39187..aa3d47f942 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java @@ -302,7 +302,8 @@ LoginFragment extends NormalFragment implements LoginUtils.onCaptchaCallBackList DialogUtils.showQuickLoginPermissionDialog( requireContext(), () -> PermissionHelper.checkReadPhoneStatePermissionBeforeAction(requireContext(), this::startQuickLogin), - () -> {} + () -> { + } ); } } @@ -337,7 +338,7 @@ LoginFragment extends NormalFragment implements LoginUtils.onCaptchaCallBackList toast("手机号码不能为空"); return; } else if (!isAgreePolicy()) { - return; + return; } else if (TextUtils.isEmpty(code)) { toast("验证码不能为空"); return; From e85437379a86d5f48cd3703269d61a276594da42 Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 2 Aug 2021 17:20:44 +0800 Subject: [PATCH 008/151] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=87=91=E6=89=8B?= =?UTF-8?q?=E6=8C=87=E5=8A=9F=E8=83=BD=E6=95=B0=E6=8D=AE=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=20https://git.ghzs.com/pm/halo-app-issues/-/issues/1362?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt index da255a100c..4485e1ad7e 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt @@ -241,7 +241,7 @@ data class GameEntity( @SerializedName("column_recommend") val columnRecommend: LinkEntity? = null, - @SerializedName("simulator_game_config") + @SerializedName("simulator_config_url") val simulatorGameConfig: String? = "", // 本地字段,使用镜像信息 From ebaf4f02f0d49d48f074f7591f735e07e02a8754 Mon Sep 17 00:00:00 2001 From: leafwai Date: Tue, 3 Aug 2021 11:21:03 +0800 Subject: [PATCH 009/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA2=E6=9C=9F-?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E5=B1=95=E7=A4=BA-=E8=AE=BA=E5=9D=9B?= =?UTF-8?q?=E8=AF=A6=E6=83=85-=E7=89=88=E4=B8=BB=E6=88=90=E5=91=98?= =?UTF-8?q?=EF=BC=880802UI=E6=B5=8B=E8=AF=95=EF=BC=89https://git.ghzs.com/?= =?UTF-8?q?pm/halo-app-issues/-/issues/1345?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/item_moderator_task.xml | 4 ++++ app/src/main/res/layout/moderator_list_item.xml | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/app/src/main/res/layout/item_moderator_task.xml b/app/src/main/res/layout/item_moderator_task.xml index 7d28f6597f..b74b4c30db 100644 --- a/app/src/main/res/layout/item_moderator_task.xml +++ b/app/src/main/res/layout/item_moderator_task.xml @@ -31,6 +31,8 @@ android:id="@+id/taskNameTv" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginBottom="-3dp" + android:includeFontPadding="false" android:textColor="@color/text_333333" android:textSize="14sp" android:textStyle="bold" @@ -40,6 +42,8 @@ android:id="@+id/taskDesTv" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:includeFontPadding="false" android:textColor="@color/text_999999" android:textSize="11sp" tools:text="活跃度=发帖数量+回帖数量+回复数量≥20" /> diff --git a/app/src/main/res/layout/moderator_list_item.xml b/app/src/main/res/layout/moderator_list_item.xml index 12eca56525..c7830b67cc 100644 --- a/app/src/main/res/layout/moderator_list_item.xml +++ b/app/src/main/res/layout/moderator_list_item.xml @@ -4,10 +4,13 @@ xmlns:tools="http://schemas.android.com/tools"> + + + @@ -51,6 +54,8 @@ android:id="@+id/userNameTv" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginBottom="-3dp" + android:includeFontPadding="false" android:text="@{entity.name}" android:textColor="@color/text_333333" android:textSize="14sp" @@ -61,6 +66,8 @@ android:id="@+id/labelTv" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="8dp" + android:includeFontPadding="false" android:text="@{entity.nameLabel}" android:textColor="@color/theme_font" android:textSize="12sp" From 8ecc4078bb89e92a5e45567f09083709914c5aeb Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Tue, 3 Aug 2021 15:59:02 +0800 Subject: [PATCH 010/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200803=E4=BA=A7=E5=93=81=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98(1,20,27,31)=20htt?= =?UTF-8?q?ps://git.ghzs.com/pm/halo-app-issues/-/issues/1426?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/gamecenter/entity/ForumVideoEntity.kt | 2 +- .../article/detail/ArticleDetailFragment.kt | 6 +- .../qa/entity/ArticleDetailEntity.kt | 2 +- .../newdetail/NewQuestionDetailFragment.kt | 288 ++++++++++++------ .../video/detail/ForumVideoDetailFragment.kt | 274 ++++++++++++----- .../qa/video/detail/desc/VideoDescFragment.kt | 13 + 6 files changed, 412 insertions(+), 173 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/entity/ForumVideoEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/ForumVideoEntity.kt index 2bf0ce92ee..758eec0148 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/ForumVideoEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/ForumVideoEntity.kt @@ -42,7 +42,7 @@ open class ForumVideoEntity( val original: String = "",//是否原创 //是否原创 yes/no 默认为空字符串 val source: String = "",//转载来源, 当 original=yes @SerializedName("choiceness_status") - val choicenessStatus: String = "",// 精选状态 null, apply(申请), cancel(不予精选或未精选), pass(已精选) + var choicenessStatus: String = "",// 精选状态 null, apply(申请), cancel(不予精选或未精选), pass(已精选) @IgnoredOnParcel var videoIsMuted: Boolean = false, //是否静音标记 var duration: String = "" diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt index a62a9af45b..be5cce416e 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt @@ -347,7 +347,10 @@ class ArticleDetailFragment : BaseCommentFragment() { +class NewQuestionDetailFragment : + BaseCommentFragment() { private var mScrollToCommentArea: Boolean = false private var mIsRecommendsContent: Boolean = false private lateinit var mViewModel: NewQuestionDetailViewModel @@ -51,7 +52,11 @@ class NewQuestionDetailFragment : BaseCommentFragment(QuestionsDetailEntity::class.java.simpleName)?.let { - mViewModel.questionDetail = it - mAdapter?.questionDetailVH?.bindView(it) - updateView() - } + data.getParcelableExtra(QuestionsDetailEntity::class.java.simpleName) + ?.let { + mViewModel.questionDetail = it + mAdapter?.questionDetailVH?.bindView(it) + updateView() + } mReuseNoConn?.performClick() //重新刷新 } else if (requestCode == ImageViewerActivity.REQUEST_FOR_VIEWED_IMAGE && resultCode == Activity.RESULT_OK) { val imageSet = data.extras?.get(ImageViewerActivity.VIEWED_IMAGE) as HashSet @@ -105,11 +112,14 @@ class NewQuestionDetailFragment : BaseCommentFragment - (mBinding.toolbar.layoutParams as ViewGroup.MarginLayoutParams).topMargin = insets.systemWindowInsetTop + (mBinding.toolbar.layoutParams as ViewGroup.MarginLayoutParams).topMargin = + insets.systemWindowInsetTop insets.consumeSystemWindowInsets() } - mSkeletonScreen = Skeleton.bind(skeletonView).shimmer(false).load(R.layout.fragment_article_detail_skeleton).show() + mSkeletonScreen = Skeleton.bind(skeletonView).shimmer(false) + .load(R.layout.fragment_article_detail_skeleton).show() val bbsType = if (mViewModel.questionDetail?.type == "game_bbs") "游戏论坛" else "综合论坛" mBinding.inputContainer.replyTv.text = "说点什么吧" mBinding.inputContainer.replyTv.setRoundedColorBackground(R.color.text_F5F5F5, 19F) mBinding.inputContainer.replyTv.setDebouncedClickListener { - startCommentActivity() - NewLogUtils.logCommentClick("click_comment_area_comment_input_box", mViewModel.questionDetail?.user?.id - ?: "", "提问帖", mViewModel.questionDetail?.id - ?: "", mViewModel.questionDetail?.community?.id ?: "", bbsType) + if (mViewModel.questionDetail?.status == "pass") { + startCommentActivity() + NewLogUtils.logCommentClick( + "click_comment_area_comment_input_box", mViewModel.questionDetail?.user?.id + ?: "", "提问帖", mViewModel.questionDetail?.id + ?: "", mViewModel.questionDetail?.community?.id ?: "", bbsType + ) + } else { + ToastUtils.showToast("内容审核中") + } } mBinding.inputContainer.bottomCommentTv.text = "回答" mBinding.inputContainer.bottomLikeTv.text = "邀请" @@ -159,17 +177,33 @@ class NewQuestionDetailFragment : BaseCommentFragment 56F.dip2px()) { mBinding.forumGameIv.visibility = View.GONE mBinding.userAvatar.visibility = View.VISIBLE - mAttentionMenu?.isVisible = questionDetail.user.id != UserManager.getInstance().userId + mAttentionMenu?.isVisible = + questionDetail.user.id != UserManager.getInstance().userId mBinding.forumTitleTv.text = questionDetail.user.name mIsToolbarUserShow = true } else if (mIsToolbarUserShow && mListRv.computeVerticalScrollOffset() <= 56F.dip2px()) { @@ -321,8 +379,10 @@ class NewQuestionDetailFragment : BaseCommentFragment 0) + NewLogUtils.logSlideArticleOrQuestionDetail( + "提问帖详情", "slide_question_detail_page", + (filterView?.top ?: 0) > 0 + ) if ((filterView?.top ?: 0) > 0) { NewLogUtils.logCommentAreaEnter("提问帖") } @@ -355,12 +415,12 @@ class NewQuestionDetailFragment : BaseCommentFragment(EntranceUtils.KEY_COMMUNITY_DATA)?.id - ?: "", - arguments?.getString(EntranceUtils.KEY_ANSWER_ID) ?: "")) + NewQuestionDetailViewModel.Factory( + HaloApp.getInstance().application, + arguments?.getString(EntranceUtils.KEY_QUESTIONS_ID) ?: "", + arguments?.getParcelable(EntranceUtils.KEY_COMMUNITY_DATA)?.id + ?: "", + arguments?.getString(EntranceUtils.KEY_ANSWER_ID) ?: "" + ) + ) } override fun provideListAdapter(): ListAdapter<*> { return mAdapter - ?: NewQuestionDetailAdapter(requireContext(), mViewModel, BaseCommentAdapter.AdapterType.COMMENT, mEntrance).apply { - mAdapter = this - } + ?: NewQuestionDetailAdapter( + requireContext(), + mViewModel, + BaseCommentAdapter.AdapterType.COMMENT, + mEntrance + ).apply { + mAdapter = this + } } override fun onBackPressed(): Boolean { - if (SyncDataBetweenPageHelper.setResultAndFinish(requireContext(), mViewModel.questionDetail)) { + if (SyncDataBetweenPageHelper.setResultAndFinish( + requireContext(), + mViewModel.questionDetail + ) + ) { return true } @@ -404,7 +475,12 @@ class NewQuestionDetailFragment : BaseCommentFragment { ifLogin("提问贴") { - BbsReportHelper.showReportDialog(mViewModel.questionDetail?.id - ?: "") + BbsReportHelper.showReportDialog( + mViewModel.questionDetail?.id + ?: "" + ) } - NewLogUtils.logSharePanelClick("click_report", mViewModel.questionDetail?.user?.id + NewLogUtils.logSharePanelClick( + "click_report", mViewModel.questionDetail?.user?.id ?: "", "提问帖", mViewModel.questionDetail?.id ?: "", mViewModel.questionDetail?.community?.id - ?: "", bbsType) + ?: "", bbsType + ) } "编辑" -> { val intent = if (questionEntity.me.isModerator) { - QuestionEditActivity.getManagerIntent(requireContext(), questionEntity) + QuestionEditActivity.getManagerIntent( + requireContext(), + questionEntity + ) } else { QuestionEditActivity.getIntent(requireContext(), questionEntity) } - startActivityForResult(intent, QuestionsDetailFragment.QUESTIONS_EDIT_REQUEST) - NewLogUtils.logSharePanelClick("click_modification_question", mViewModel.questionDetail?.user?.id + startActivityForResult( + intent, + QuestionsDetailFragment.QUESTIONS_EDIT_REQUEST + ) + NewLogUtils.logSharePanelClick( + "click_modification_question", mViewModel.questionDetail?.user?.id ?: "", "提问帖", mViewModel.questionDetail?.id - ?: "", mViewModel.questionDetail?.community?.id ?: "", bbsType) + ?: "", mViewModel.questionDetail?.community?.id ?: "", bbsType + ) } "删除" -> { - DialogUtils.showNewAlertDialog(requireContext(), "提示", "删除问题后,其中的所有回答都将被删除", "取消", "删除", {}, { - mListViewModel.moderatorsHideQuestion() - }) - NewLogUtils.logSharePanelClick("click_delete", mViewModel.questionDetail?.user?.id + DialogUtils.showNewAlertDialog( + requireContext(), + "提示", + "删除问题后,其中的所有回答都将被删除", + "取消", + "删除", + {}, + { + mListViewModel.moderatorsHideQuestion() + }) + NewLogUtils.logSharePanelClick( + "click_delete", mViewModel.questionDetail?.user?.id ?: "", "提问帖", mViewModel.questionDetail?.id - ?: "", mViewModel.questionDetail?.community?.id ?: "", bbsType) + ?: "", mViewModel.questionDetail?.community?.id ?: "", bbsType + ) } "解决", "已解决" -> { - val content = if (!questionEntity.finish) "该问题确定标记已解决?" else "该问题确定标记未解决?" + val content = + if (!questionEntity.finish) "该问题确定标记已解决?" else "该问题确定标记未解决?" DialogHelper.showDialog(requireContext(), "提示", content, "确定", "取消", { mListViewModel.postSolveQuestion(!questionEntity.finish) }) - NewLogUtils.logSharePanelClick(if (!questionEntity.finish) "click_solve" else "click_resolved", mViewModel.questionDetail?.user?.id - ?: "", "提问帖", mViewModel.questionDetail?.id - ?: "", mViewModel.questionDetail?.community?.id ?: "", bbsType) + NewLogUtils.logSharePanelClick( + if (!questionEntity.finish) "click_solve" else "click_resolved", + mViewModel.questionDetail?.user?.id + ?: "", + "提问帖", + mViewModel.questionDetail?.id + ?: "", + mViewModel.questionDetail?.community?.id ?: "", + bbsType + ) } } } @@ -488,8 +600,10 @@ class NewQuestionDetailFragment : BaseCommentFragment - (mBinding.toolbar.layoutParams as ViewGroup.MarginLayoutParams).topMargin = insets.systemWindowInsetTop + (mBinding.toolbar.layoutParams as ViewGroup.MarginLayoutParams).topMargin = + insets.systemWindowInsetTop insets.consumeSystemWindowInsets() } mViewModel = viewModelProviderFromParent(ForumVideoDetailViewModel.Factory(mVideoId)) - mSkeleton = Skeleton.bind(mBinding.skeleton).shimmer(false).load(R.layout.fragment_video_detail_skeleton).show() + mSkeleton = Skeleton.bind(mBinding.skeleton).shimmer(false) + .load(R.layout.fragment_video_detail_skeleton).show() mBinding.toolbar.setNavigationOnClickListener { requireActivity().finish() } mOrientationUtils = OrientationUtils(requireActivity(), mBinding.topVideoView) mOrientationUtils?.isEnable = false @@ -231,7 +237,10 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { toast("提交成功") } else { toast("操作成功") - requireActivity().finish() + mForumVideoEntity?.let { + it.choicenessStatus = "pass" + mViewModel.updateDetailLiveData.postValue(it) + } } } else { toast("权限错误,请刷新后重试") @@ -240,7 +249,6 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { mViewModel.applyHighlight.observeNonNull(this) { if (it) { toast("提交成功") - requireActivity().finish() } else { toast("提交失败") } @@ -258,8 +266,10 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { mBinding.gameScoreTv.text = gameEntity.star.toString() mBinding.game = gameEntity mBinding.gameInfoContainer.setOnClickListener { - NewLogUtils.logVideoDetailGameClick("click_game", gameEntity.id, gameEntity.category - ?: "", "") + NewLogUtils.logVideoDetailGameClick( + "click_game", gameEntity.id, gameEntity.category + ?: "", "" + ) GameDetailActivity.startGameDetailActivity(requireContext(), gameEntity, "视频详情") } setDownloadButton(gameEntity) @@ -279,7 +289,12 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { mBinding.toolbar.setNavigationIcon(R.drawable.ic_bar_back_light) mMoreMenuItem?.setIcon(R.drawable.ic_menu_gamedetail_more_light) - mBinding.toolbar.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.transparent)) + mBinding.toolbar.setBackgroundColor( + ContextCompat.getColor( + requireContext(), + R.color.transparent + ) + ) } private fun updateVideoParams() { @@ -303,20 +318,20 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { private fun setUpTopVideo(entity: ForumVideoEntity) { GSYVideoOptionBuilder() - .setIsTouchWigetFull(false) - .setIsTouchWiget(false) - .setRotateViewAuto(false) - .setShowFullAnimation(false) - .setSeekRatio(1f) - .setUrl(entity.url) - .setCacheWithPlay(true) - .setVideoAllCallBack(object : GSYSampleCallBack() { - override fun onQuitFullscreen(url: String?, vararg objects: Any) { - mOrientationUtils?.backToProtVideo() - mBinding.topVideoView.uploadVideoStreamingPlaying("退出全屏") - } - }) - .build(mBinding.topVideoView) + .setIsTouchWigetFull(false) + .setIsTouchWiget(false) + .setRotateViewAuto(false) + .setShowFullAnimation(false) + .setSeekRatio(1f) + .setUrl(entity.url) + .setCacheWithPlay(true) + .setVideoAllCallBack(object : GSYSampleCallBack() { + override fun onQuitFullscreen(url: String?, vararg objects: Any) { + mOrientationUtils?.backToProtVideo() + mBinding.topVideoView.uploadVideoStreamingPlaying("退出全屏") + } + }) + .build(mBinding.topVideoView) mBinding.topVideoView.viewModel = mViewModel mBinding.topVideoView.updateThumb(entity.poster) @@ -336,7 +351,11 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { } mBinding.topVideoView.fullscreenButton.setOnClickListener { - val horizontalVideoView = mBinding.topVideoView.startWindowFullscreen(requireContext(), true, true) as? ForumTopVideoView + val horizontalVideoView = mBinding.topVideoView.startWindowFullscreen( + requireContext(), + true, + true + ) as? ForumTopVideoView if (horizontalVideoView == null) { toastInInternalRelease("全屏失败,请向技术人员提供具体的操作步骤") return@setOnClickListener @@ -355,7 +374,8 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { } override fun provideTabView(position: Int, title: String?): View { - val view = LayoutInflater.from(requireContext()).inflate(R.layout.tab_item_forum_video_detail, null) + val view = LayoutInflater.from(requireContext()) + .inflate(R.layout.tab_item_forum_video_detail, null) val tabTitle = view.findViewById(R.id.tab_title) val tabCount = view.findViewById(R.id.tab_count) if (tabTitle is CheckedTextView) { @@ -372,17 +392,20 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { private fun setDownloadButton(gameEntity: GameEntity?) { if (gameEntity == null) return DownloadItemUtils.setOnClickListener(requireContext(), mBinding.downloadBtn, - gameEntity, 0, null, - mEntrance, "视频详情", null, object : EmptyCallback { - override fun onCallback() { - NewLogUtils.logVideoDetailGameClick("click_game", gameEntity.id, gameEntity.category - ?: "", mBinding.downloadBtn.text.toString()) - } - }, object : EmptyCallback { - override fun onCallback() { - setDownloadButton(gameEntity) - } - }, null) + gameEntity, 0, null, + mEntrance, "视频详情", null, object : EmptyCallback { + override fun onCallback() { + NewLogUtils.logVideoDetailGameClick( + "click_game", gameEntity.id, gameEntity.category + ?: "", mBinding.downloadBtn.text.toString() + ) + } + }, object : EmptyCallback { + override fun onCallback() { + setDownloadButton(gameEntity) + } + }, null + ) // 显示预约 if (gameEntity.isReservable) { @@ -414,28 +437,52 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { when (offStatus) { "dialog" -> { mBinding.downloadBtn.text = "查看" - mBinding.downloadBtn.setTextColor(ContextCompat.getColor(requireContext(), R.color.white)) + mBinding.downloadBtn.setTextColor( + ContextCompat.getColor( + requireContext(), + R.color.white + ) + ) } "updating" -> { mBinding.downloadBtn.text = "更新中" - mBinding.downloadBtn.setTextColor(ContextCompat.getColor(requireContext(), R.color.white)) + mBinding.downloadBtn.setTextColor( + ContextCompat.getColor( + requireContext(), + R.color.white + ) + ) mBinding.downloadBtn.setBackgroundResource(R.drawable.download_button_updating_style) } else -> { mBinding.downloadBtn.text = "暂无" - mBinding.downloadBtn.setTextColor(ContextCompat.getColor(requireContext(), R.color.button_gray)) + mBinding.downloadBtn.setTextColor( + ContextCompat.getColor( + requireContext(), + R.color.button_gray + ) + ) mBinding.downloadBtn.setBackgroundResource(R.drawable.news_detail_comment) } } mBinding.downloadBtn.isClickable = false } } else if (gameEntity.getApk().size == 1) { - setDownloadBtnStatus(requireContext(), gameEntity, mBinding.downloadBtn, PluginLocation.only_game) - val downloadEntity = DownloadManager.getInstance(requireContext()).getDownloadEntityByUrl(gameEntity.getApk()[0].url) + setDownloadBtnStatus( + requireContext(), + gameEntity, + mBinding.downloadBtn, + PluginLocation.only_game + ) + val downloadEntity = DownloadManager.getInstance(requireContext()) + .getDownloadEntityByUrl(gameEntity.getApk()[0].url) if (downloadEntity != null) { if (downloadEntity.status == DownloadStatus.done) { if (SimulatorGameManager.isSimulatorGame(gameEntity)) { - val isInstalled = PackageUtils.isInstalled(context, gameEntity.simulator?.apk?.packageName) + val isInstalled = PackageUtils.isInstalled( + context, + gameEntity.simulator?.apk?.packageName + ) if (isInstalled) { mBinding.downloadBtn.setText(R.string.launch) } else { @@ -458,15 +505,30 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { mBinding.downloadBtn.setText(R.string.downloading) } mBinding.downloadBtn.setBackgroundResource(R.drawable.textview_concern_red_up_round) - mBinding.downloadBtn.setTextColor(ContextCompat.getColorStateList(requireContext(), R.color.white)) + mBinding.downloadBtn.setTextColor( + ContextCompat.getColorStateList( + requireContext(), + R.color.white + ) + ) } } } else { - setDownloadBtnStatus(requireContext(), gameEntity, mBinding.downloadBtn, PluginLocation.only_game) + setDownloadBtnStatus( + requireContext(), + gameEntity, + mBinding.downloadBtn, + PluginLocation.only_game + ) } } - private fun setDownloadBtnStatus(context: Context, gameEntity: GameEntity, downloadBtn: TextView, pluginLocation: PluginLocation) { + private fun setDownloadBtnStatus( + context: Context, + gameEntity: GameEntity, + downloadBtn: TextView, + pluginLocation: PluginLocation + ) { val status = GameUtils.getDownloadBtnText(context, gameEntity, pluginLocation) downloadBtn.setTextColor(Color.WHITE) downloadBtn.text = status @@ -494,8 +556,14 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { } if (mForumVideoEntity?.me!!.isModerator) { val isEnable = mForumVideoEntity?.isHighlighted == true - entities.add(MenuItemEntity("加精选", if (isEnable) - R.drawable.icon_more_panel_essence_unenable else R.drawable.icon_more_panel_essence, isEnable = !isEnable)) + entities.add( + MenuItemEntity( + "加精选", + if (isEnable) + R.drawable.icon_more_panel_essence_unenable else R.drawable.icon_more_panel_essence, + isEnable = !isEnable + ) + ) entities.add(MenuItemEntity("修改活动标签", R.drawable.icon_more_panel_modify_label)) } if (mForumVideoEntity?.me!!.isModerator || mForumVideoEntity?.user?.id == UserManager.getInstance().userId) { @@ -513,28 +581,43 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { requireContext().getString(R.string.share_ghzs_logo) } val shareUtils = ShareUtils.getInstance(requireContext()) - shareUtils.shareParamsDetail(requireActivity(), - shareUrl, - shareIcon, - mForumVideoEntity?.title ?: "", - mForumVideoEntity?.des ?: "", - ShareUtils.ShareEntrance.communityArticle, - mForumVideoEntity?.id, null) + shareUtils.shareParamsDetail( + requireActivity(), + shareUrl, + shareIcon, + mForumVideoEntity?.title ?: "", + mForumVideoEntity?.des ?: "", + ShareUtils.ShareEntrance.video, + mForumVideoEntity?.id, null + ) val bbsType = if (mForumVideoEntity?.type == "game_bbs") "游戏论坛" else "综合论坛" - MoreFunctionPanelDialog.showMoreDialog(requireActivity() as AppCompatActivity, entities, mForumVideoEntity?.title - ?: "", shareUtils) { + MoreFunctionPanelDialog.showMoreDialog( + requireActivity() as AppCompatActivity, entities, mForumVideoEntity?.title + ?: "", shareUtils + ) { when (it.text) { "修改" -> { - startActivityForResult(VideoPublishActivity.getIntent(requireContext(), mForumVideoEntity!!, mEntrance, "视频详情"), ForumVideoDetailActivity.VIDEO_PATCH_REQUEST) - NewLogUtils.logSharePanelClick("click_modification", mForumVideoEntity?.user?.id + startActivityForResult( + VideoPublishActivity.getIntent( + requireContext(), + mForumVideoEntity!!, + mEntrance, + "视频详情" + ), ForumVideoDetailActivity.VIDEO_PATCH_REQUEST + ) + NewLogUtils.logSharePanelClick( + "click_modification", mForumVideoEntity?.user?.id ?: "", "视频帖", mForumVideoEntity?.id - ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType) + ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType + ) } "投诉" -> { BbsReportHelper.showReportDialog(mForumVideoEntity?.id ?: "") - NewLogUtils.logSharePanelClick("click_report", mForumVideoEntity?.user?.id + NewLogUtils.logSharePanelClick( + "click_report", mForumVideoEntity?.user?.id ?: "", "视频帖", mForumVideoEntity?.id - ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType) + ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType + ) } "申请加精" -> { if (mForumVideoEntity?.choicenessStatus == "apply") { @@ -542,33 +625,52 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { return@showMoreDialog } mViewModel.doApplyHighlightCommunityVideo(mVideoId) - NewLogUtils.logSharePanelClick("click_apply_essence", mForumVideoEntity?.user?.id + NewLogUtils.logSharePanelClick( + "click_apply_essence", mForumVideoEntity?.user?.id ?: "", "视频帖", mForumVideoEntity?.id - ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType) + ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType + ) } "加精选" -> { addEssenceForum() - NewLogUtils.logSharePanelClick("click_essence", mForumVideoEntity?.user?.id + NewLogUtils.logSharePanelClick( + "click_essence", mForumVideoEntity?.user?.id ?: "", "视频帖", mForumVideoEntity?.id - ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType) + ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType + ) } "修改活动标签" -> { - ChooseActivityDialogFragment.show(requireActivity() as AppCompatActivity, ChooseActivityDialogFragment.ActivityLabelLocation.BBS_ARTICLE, mForumVideoEntity?.tagActivityId) { label -> + ChooseActivityDialogFragment.show( + requireActivity() as AppCompatActivity, + ChooseActivityDialogFragment.ActivityLabelLocation.BBS_ARTICLE, + mForumVideoEntity?.tagActivityId + ) { label -> if (label != null) { mViewModel.modifyVideoActivityTag(mForumVideoEntity, label) - NewLogUtils.logSharePanelClick("click_modification_activity_tag", mForumVideoEntity?.user?.id + NewLogUtils.logSharePanelClick( + "click_modification_activity_tag", mForumVideoEntity?.user?.id ?: "", "视频帖", mForumVideoEntity?.id - ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType) + ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType + ) } } } "删除" -> { - DialogUtils.showNewAlertDialog(requireContext(), "提示", "删除视频后,其中的所有评论及回复都将被删除", "取消", "删除", {}, { - mViewModel.deleteVideo(mForumVideoEntity?.id ?: "") - }) - NewLogUtils.logSharePanelClick("click_delete", mForumVideoEntity?.user?.id + DialogUtils.showNewAlertDialog( + requireContext(), + "提示", + "删除视频后,其中的所有评论及回复都将被删除", + "取消", + "删除", + {}, + { + mViewModel.deleteVideo(mForumVideoEntity?.id ?: "") + }) + NewLogUtils.logSharePanelClick( + "click_delete", mForumVideoEntity?.user?.id ?: "", "视频帖", mForumVideoEntity?.id - ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType) + ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType + ) } } } @@ -589,11 +691,13 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { if (mForumVideoEntity?.isHighlighted == true) { toast("帖子已经加精") } else { - DialogUtils.showAlertDialog(requireContext(), "加精视频", highlightDialogHintContent, - "确定", "取消", - { - mViewModel.doHighlightThisVideo(mForumVideoEntity?.bbsId ?: "", mVideoId) - }, null) + DialogUtils.showAlertDialog( + requireContext(), "加精视频", highlightDialogHintContent, + "确定", "取消", + { + mViewModel.doHighlightThisVideo(mForumVideoEntity?.bbsId ?: "", mVideoId) + }, null + ) } } @@ -601,7 +705,8 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { super.onActivityResult(requestCode, resultCode, data) if (data == null || resultCode != Activity.RESULT_OK) return if (requestCode == ForumVideoDetailActivity.VIDEO_PATCH_REQUEST) { - val entity = data.getParcelableExtra(ForumVideoEntity::class.java.simpleName) + val entity = + data.getParcelableExtra(ForumVideoEntity::class.java.simpleName) mForumVideoEntity?.let { it.title = entity?.title ?: "" it.des = entity?.des ?: "" @@ -638,7 +743,10 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { super.onPause() mBinding.topVideoView.onVideoPause() val currentPosition = mBinding.topVideoView.getCurrentPosition() - ForumScrollCalculatorHelper.savePlaySchedule(MD5Utils.getContentMD5(mForumVideoEntity?.url), currentPosition) + ForumScrollCalculatorHelper.savePlaySchedule( + MD5Utils.getContentMD5(mForumVideoEntity?.url), + currentPosition + ) DownloadManager.getInstance(requireContext()).removeObserver(dataWatcher) } @@ -648,9 +756,11 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { mBinding.topVideoView.disposableTimer() val stayTime = (System.currentTimeMillis() - startPageTime) / 1000 val bbsType = if (mForumVideoEntity?.type == "game_bbs") "游戏论坛" else "综合论坛" - NewLogUtils.logActivityPause("视频帖详情页", "jump_video_detail ", stayTime, - mForumVideoEntity?.bbs?.id ?: "", bbsType, "视频帖", - mForumVideoEntity?.id ?: "") + NewLogUtils.logActivityPause( + "视频帖详情页", "jump_video_detail ", stayTime, + mForumVideoEntity?.bbs?.id ?: "", bbsType, "视频帖", + mForumVideoEntity?.id ?: "" + ) } override fun onBackPressed(): Boolean { diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescFragment.kt index e8fb2fd061..f93d7730af 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescFragment.kt @@ -4,6 +4,7 @@ import android.view.View import androidx.lifecycle.Observer import androidx.recyclerview.widget.RecyclerView import com.gh.common.util.NewLogUtils +import com.gh.common.util.ShareUtils import com.gh.common.util.observeNonNull import com.gh.common.util.viewModelProviderFromParent import com.gh.gamecenter.R @@ -11,8 +12,11 @@ import com.gh.gamecenter.baselist.LazyListFragment import com.gh.gamecenter.baselist.ListAdapter import com.gh.gamecenter.entity.ForumVideoEntity import com.gh.gamecenter.entity.VideoDescItemEntity +import com.gh.gamecenter.eventbus.EBShare import com.gh.gamecenter.mvvm.Status import com.gh.gamecenter.qa.video.detail.ForumVideoDetailViewModel +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode class VideoDescFragment : LazyListFragment() { @@ -68,4 +72,13 @@ class VideoDescFragment : LazyListFragment Date: Tue, 3 Aug 2021 16:09:05 +0800 Subject: [PATCH 011/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200803=E4=BA=A7=E5=93=81=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=8811?= =?UTF-8?q?=EF=BC=89https://git.ghzs.com/pm/halo-app-issues/-/issues/1426?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../detail/ForumArticleAskListFragment.kt | 15 +++++++++++++++ .../home/ForumArticleAskItemViewHolder.kt | 4 ++++ .../forum/home/ForumArticleListFragment.kt | 18 +++++++++++++++--- .../forum/moderator/ModeratorListViewModel.kt | 3 +++ .../forum/search/UserSearchListViewModel.kt | 1 + .../personalhome/FollowersOrFansViewModel.kt | 3 +++ .../qa/answer/detail/AnswerDetailViewModel.kt | 3 +++ .../article/detail/ArticleDetailViewModel.kt | 2 ++ .../newdetail/NewQuestionDetailViewModel.kt | 3 +++ .../gamecenter/qa/search/user/UserViewModel.kt | 3 +++ .../qa/video/detail/desc/VideoDescViewModel.kt | 3 +++ .../detail/VideoDetailContainerViewModel.kt | 3 +++ 12 files changed, 58 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListFragment.kt index ff073c0796..ceac78c1b4 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListFragment.kt @@ -12,6 +12,7 @@ import com.gh.gamecenter.baselist.ListAdapter import com.gh.gamecenter.baselist.ListFragment import com.gh.gamecenter.eventbus.EBDeleteDetail import com.gh.gamecenter.eventbus.EBTypeChange +import com.gh.gamecenter.eventbus.EBUserFollow import com.gh.gamecenter.forum.home.ForumScrollCalculatorHelper import com.gh.gamecenter.qa.CommunityFragment import com.gh.gamecenter.qa.entity.AnswerEntity @@ -245,4 +246,18 @@ class ForumArticleAskListFragment : ListFragment 1) notifyDataSetChanged() + } + } } \ No newline at end of file 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 a03ef08793..9f06c39b41 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 @@ -11,6 +11,7 @@ import com.gh.gamecenter.R import com.gh.gamecenter.databinding.CommunityAnswerItemBinding import com.gh.gamecenter.entity.CommunityEntity import com.gh.gamecenter.entity.ForumVideoEntity +import com.gh.gamecenter.eventbus.EBUserFollow import com.gh.gamecenter.forum.detail.ForumDetailActivity import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.qa.answer.BaseAnswerOrArticleItemViewHolder @@ -24,6 +25,7 @@ import com.gh.gamecenter.qa.video.detail.ForumVideoDetailActivity import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack import com.shuyu.gsyvideoplayer.utils.OrientationUtils +import org.greenrobot.eventbus.EventBus class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : BaseAnswerOrArticleItemViewHolder(binding.root) { @@ -137,6 +139,8 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B binding.concernBtn.visibility = View.GONE binding.followedUserTv.visibility = View.VISIBLE binding.time.text = " · ${binding.time.text}" + ToastUtils.toast("关注成功") + EventBus.getDefault().post(EBUserFollow(userId, true)) } }) } diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListFragment.kt index 86c54675bd..80b85093c7 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListFragment.kt @@ -12,9 +12,7 @@ import com.gh.gamecenter.R import com.gh.gamecenter.baselist.LazyListFragment import com.gh.gamecenter.databinding.FragmentForumListBinding import com.gh.gamecenter.entity.ForumEntity -import com.gh.gamecenter.eventbus.EBDeleteDetail -import com.gh.gamecenter.eventbus.EBForumRecordChange -import com.gh.gamecenter.eventbus.EBTypeChange +import com.gh.gamecenter.eventbus.* import com.gh.gamecenter.forum.home.ForumScrollCalculatorHelper.Companion.getPlaySchedule import com.gh.gamecenter.forum.home.ForumScrollCalculatorHelper.Companion.savePlaySchedule import com.gh.gamecenter.qa.CommunityFragment @@ -309,4 +307,18 @@ class ForumArticleListFragment : LazyListFragment 1) notifyDataSetChanged() + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListViewModel.kt b/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListViewModel.kt index 6da7016c11..dc9d3b9a7d 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListViewModel.kt @@ -8,6 +8,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.gh.gamecenter.R import com.gh.gamecenter.entity.PersonalEntity +import com.gh.gamecenter.eventbus.EBUserFollow import com.gh.gamecenter.retrofit.BiResponse import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager @@ -17,6 +18,7 @@ import com.lightgame.utils.Utils import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import okhttp3.ResponseBody +import org.greenrobot.eventbus.EventBus import retrofit2.HttpException class ModeratorListViewModel(application: Application, val bbsId: String) : @@ -84,6 +86,7 @@ class ModeratorListViewModel(application: Application, val bbsId: String) : } else { Utils.toast(getApplication(), R.string.concern_cancel) } + EventBus.getDefault().post(EBUserFollow(userId, isFollow)) } override fun onFailure(e: HttpException?) { diff --git a/app/src/main/java/com/gh/gamecenter/forum/search/UserSearchListViewModel.kt b/app/src/main/java/com/gh/gamecenter/forum/search/UserSearchListViewModel.kt index 0585b50a74..2e15dc5606 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/search/UserSearchListViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/search/UserSearchListViewModel.kt @@ -57,6 +57,7 @@ class UserSearchListViewModel(application: Application) : ListViewModel(application) { @@ -204,6 +206,7 @@ class VideoDescViewModel(application: Application) : ListViewModel Date: Tue, 3 Aug 2021 16:28:08 +0800 Subject: [PATCH 012/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200803=E4=BA=A7=E5=93=81=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=8813?= =?UTF-8?q?=EF=BC=89https://git.ghzs.com/pm/halo-app-issues/-/issues/1426?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/gamecenter/forum/detail/ForumDetailFragment.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt index dc77c71827..d5fd3e89ed 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt @@ -404,8 +404,13 @@ class ForumDetailFragment : BaseLazyTabFragment() { R.id.followTv -> { debounceActionWithInterval(R.id.followTv) { ifLogin(mEntrance) { - val forumEntity = ForumEntity(mForumDetail?.id - ?: "", mForumDetail?.game!!, mForumDetail?.name ?: "") + val forumEntity = ForumEntity( + id = mForumDetail?.id ?: "", + game = mForumDetail?.game!!, + name = mForumDetail?.name ?: "", + type = mForumDetail?.type ?: "", + icon = mForumDetail?.icon ?: "" + ) if (mForumDetail?.me?.isFollower == true) { mViewModel?.unFollowForum { From b40543d7b5092f874fed7381fad146f9b73f6fd1 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Tue, 3 Aug 2021 17:30:26 +0800 Subject: [PATCH 013/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200803=E4=BA=A7=E5=93=81=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=8816?= =?UTF-8?q?=EF=BC=89https://git.ghzs.com/pm/halo-app-issues/-/issues/1426?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gh/gamecenter/forum/home/HotForumsAdapter.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/HotForumsAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/home/HotForumsAdapter.kt index 0b812f84df..23b61c43c2 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/HotForumsAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/HotForumsAdapter.kt @@ -59,6 +59,7 @@ class HotForumsAdapter(context: Context, followTv.setBackgroundResource(R.drawable.button_round_f0f8fa) followTv.setTextColor(R.color.theme_font.toColor()) followTv.text = "关注" + ToastUtils.showToast("取消成功") EventBus.getDefault().post(EBForumFollowChange(forumEntity, false)) } } else { From 04252e3b91b64ac2d48729786fa5523feceb08e6 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Tue, 3 Aug 2021 18:20:41 +0800 Subject: [PATCH 014/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200803=E4=BA=A7=E5=93=81=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=8822?= =?UTF-8?q?=EF=BC=89https://git.ghzs.com/pm/halo-app-issues/-/issues/1426?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../setting/GameDownloadSettingFragment.kt | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/setting/GameDownloadSettingFragment.kt b/app/src/main/java/com/gh/gamecenter/setting/GameDownloadSettingFragment.kt index 318163fbde..86ef0d4ffa 100644 --- a/app/src/main/java/com/gh/gamecenter/setting/GameDownloadSettingFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/setting/GameDownloadSettingFragment.kt @@ -1,16 +1,16 @@ package com.gh.gamecenter.setting import android.content.Intent +import android.content.SharedPreferences import android.net.Uri import android.os.Bundle import android.os.Environment +import android.preference.PreferenceManager import android.text.TextUtils -import android.util.Log import android.view.View import butterknife.OnClick import com.gh.common.util.MtaHelper.onEvent import com.gh.common.util.PackageUtils -import com.gh.common.util.SPUtils import com.gh.gamecenter.CleanApkActivity import com.gh.gamecenter.R import com.gh.gamecenter.databinding.FragmentGameDownloadSettingBinding @@ -20,6 +20,7 @@ import java.io.File class GameDownloadSettingFragment: NormalFragment() { private var mBinding: FragmentGameDownloadSettingBinding? = null + private var mSP: SharedPreferences? = null override fun getLayoutId() = 0 @@ -27,14 +28,17 @@ class GameDownloadSettingFragment: NormalFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + mSP = PreferenceManager.getDefaultSharedPreferences(requireContext()) initStatus() } private fun initStatus() { mBinding?.run { - autoInstallSwitch.isChecked = SPUtils.getBoolean(AUTO_INSTALL_SP_KEY) - concernGameSwitch.isChecked = SPUtils.getBoolean(CONCERN_GAME_SP_KEY) - trafficSwitch.isChecked = SPUtils.getBoolean(getTrafficDownloadHintKey()) + mSP?.run { + autoInstallSwitch.isChecked = getBoolean(AUTO_INSTALL_SP_KEY, false) + concernGameSwitch.isChecked = getBoolean(CONCERN_GAME_SP_KEY, false) + trafficSwitch.isChecked = getBoolean(getTrafficDownloadHintKey(), false) + } } } @@ -48,19 +52,19 @@ class GameDownloadSettingFragment: NormalFragment() { onEvent("我的光环_设置", "设置功能", "下载完成自动安装游戏") onEvent("我的光环_设置", "自动安装游戏", if (autoInstallSwitch.isChecked) "关闭" else "打开") autoInstallSwitch.isChecked = !autoInstallSwitch.isChecked - SPUtils.setBoolean(AUTO_INSTALL_SP_KEY, autoInstallSwitch.isChecked) + mSP?.edit()?.putBoolean(AUTO_INSTALL_SP_KEY, autoInstallSwitch.isChecked)?.apply() } R.id.concernGameContainer -> { onEvent("我的光环_设置", "设置功能", "安装完成自动关注游戏") onEvent("我的光环_设置", "自动关注游戏", if (concernGameSwitch.isChecked) "关闭" else "打开") concernGameSwitch.isChecked = !concernGameSwitch.isChecked - SPUtils.setBoolean(CONCERN_GAME_SP_KEY, concernGameSwitch.isChecked) + mSP?.edit()?.putBoolean(CONCERN_GAME_SP_KEY, concernGameSwitch.isChecked)?.apply() } R.id.trafficContainer -> { trafficSwitch.isChecked = !trafficSwitch.isChecked - SPUtils.setBoolean(getTrafficDownloadHintKey(), trafficSwitch.isChecked) + mSP?.edit()?.putBoolean(getTrafficDownloadHintKey(), trafficSwitch.isChecked)?.apply() } R.id.downloadPathContainer -> { From 61ad70d3b87097a252140ac2e103db0c33fd0a0a Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Wed, 4 Aug 2021 10:59:35 +0800 Subject: [PATCH 015/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA2=E6=9C=9F-?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E5=B1=95=E7=A4=BA-=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=B5=81-=E6=8F=90=E9=97=AE=E5=B8=96=E8=AF=84=E8=AE=BA?= =?UTF-8?q?=EF=BC=880804UI=E6=B5=8B=E8=AF=95=EF=BC=89https://git.ghzs.com/?= =?UTF-8?q?pm/halo-app-issues/-/issues/1344#note=5F111919?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../forum/detail/ForumArticleAskListAdapter.kt | 6 ++++++ .../forum/home/ForumArticleAskItemViewHolder.kt | 5 +++-- .../res/drawable-xxxhdpi/ic_ask_label_small.webp | Bin 0 -> 1318 bytes 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_ask_label_small.webp diff --git a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListAdapter.kt index d5885fe719..e4f3f61b7c 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListAdapter.kt @@ -11,6 +11,7 @@ import com.gh.common.constant.ItemViewType import com.gh.common.syncpage.ISyncAdapterHandler import com.gh.common.util.MtaHelper import com.gh.common.util.NewLogUtils +import com.gh.common.util.dip2px import com.gh.gamecenter.R import com.gh.gamecenter.adapter.viewholder.FooterViewHolder import com.gh.gamecenter.baselist.ListAdapter @@ -71,6 +72,11 @@ class ForumArticleAskListAdapter(context: Context, val bbsId: String, val mEntra val binding = answerViewHolder.binding binding.forumNameLl.visibility = View.GONE + val contentMarginTop = if (answer.type == "answer") 3F.dip2px() else 12F.dip2px() + binding.content.layoutParams = (binding.content.layoutParams as ViewGroup.MarginLayoutParams).apply { + topMargin = contentMarginTop + } + val params = binding.includeVoteAndComment.root.layoutParams as LinearLayout.LayoutParams params.width = LinearLayout.LayoutParams.MATCH_PARENT params.leftMargin = 0 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 9f06c39b41..fc61c04c17 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 @@ -45,16 +45,17 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B binding.userIcon.display(entity.user.border, entity.user.icon, entity.user.auth?.icon) binding.forumNameTv.text = entity.bbs.name + binding.content.maxLines = if (entity.type == "answer") 3 else 2 if (entity.type == "answer") { binding.content.goneIf(entity.content.isEmpty()) binding.content.text = entity.content val title = " ${entity.questions.title}" - binding.questionTitle.text = SpanBuilder(title).image(0, 1, R.drawable.ic_ask_label).build() + binding.questionTitle.text = SpanBuilder(title).image(0, 1, R.drawable.ic_ask_label_small).build() } else if (entity.type == "question") { binding.content.goneIf(entity.questions.description.isNullOrEmpty()) binding.content.text = entity.questions.description val title = " ${entity.questions.title}" - binding.title.text = SpanBuilder(title).image(0, 1, R.drawable.ic_ask_label).build() + binding.title.text = SpanBuilder(title).image(0, 1, R.drawable.ic_ask_label_small).build() } else { binding.content.visibility = View.VISIBLE if (entity.type == "video") { diff --git a/app/src/main/res/drawable-xxxhdpi/ic_ask_label_small.webp b/app/src/main/res/drawable-xxxhdpi/ic_ask_label_small.webp new file mode 100644 index 0000000000000000000000000000000000000000..5163a74c6c08c9adcc81fa3b9d26deea21c95e72 GIT binary patch literal 1318 zcmV+>1=;#iNk&E<1pok7MM6+kP&il$0000G0000r001ul06|PpNWuUB00GaSwv8k; zdGO2(>8BqN0Z0+eTOQ4?co*Q?tOYAj-qgkPi!ShD|^eeqPBH6+$@S`cVSym-P*HClvgKF)W^f9Zv>Ep zFabS755F_)z7Wcy;b;bqVc}Rdj!pjEE6GAKkkllZWA_|AI1u7gqO|}vb+ZG2 zNn7i1ER|Ijr>4_1MqGzZ%ibs4Hs!Q^wJk$ac-#h7P&gnq1ONc=7yz9CDmDNx06sAi zh(e+vAsJdvFdzd2wg66?psDX3KCAf6>@iaQnfFKcJ1w7)|IhuI`9NiRx?1{I; z;U_4iTS(8QH!n`QJzLlO^YPTIfB)4kIcdj4eAV?o&8-2QmdM_l)k zMjApKpMex=Z}tA!>KEayA<3ahp8`icjy?SMx)(LR#+ek0qRjQR*Nb%E5@Y`Z-}#iz zR6y&*Ia$BE4@E&yr6<6&%*D8rqNn)=VS7k|aOb~>mY9FJZ)k38yoNqY=$Srb`Y)0D zDgf@CQX->-XBVOn5T2nT>F7~mQm$umCSOn3bT}34_x)h?rJmo~pXtr?D&@}fiBA8r zA`&h03!F~Q#$@90BE5T1YKkzZeJ7HAcIw3M@dd#gI1(BA z@K!Yv;qjR)HwZy*JzhzHGW-3(n(m1kb4Zh2H%c5|_G ze`jz`pJD#*^BdLk-0HzC*4}|FZX0v;=PjmqWj=SqSpn~0U|nLRm4?%OovLXU@&%0Mggp6W;T+ z-jjCvIo#5xo!KSpnxFDfC+<`ny4 Date: Wed, 4 Aug 2021 11:07:51 +0800 Subject: [PATCH 016/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200803=E4=BA=A7=E5=93=81=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=882?= =?UTF-8?q?=EF=BC=89(=E7=AC=AC3=E7=82=B9)=20https://git.ghzs.com/pm/halo-a?= =?UTF-8?q?pp-issues/-/issues/1428?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt index d5fd3e89ed..c8c7f0a314 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt @@ -416,6 +416,7 @@ class ForumDetailFragment : BaseLazyTabFragment() { mViewModel?.unFollowForum { MtaHelper.onEvent("论坛详情", "顶部区域", "取消关注") mForumDetail?.me?.isFollower = false + ToastUtils.showToast("取消关注") initUI() EventBus.getDefault().post(EBForumFollowChange(forumEntity, false)) } From b3b8b6ba296f255c072f70b5101d284191a989bf Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Wed, 4 Aug 2021 12:14:02 +0800 Subject: [PATCH 017/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200803=E4=BA=A7=E5=93=81=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=882?= =?UTF-8?q?=EF=BC=89https://git.ghzs.com/pm/halo-app-issues/-/issues/1428?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../article/detail/ArticleDetailFragment.kt | 409 ++++++++++++----- .../article/detail/ArticleDetailViewModel.kt | 418 ++++++++++-------- .../qa/editor/OnLinkClickListener.kt | 6 - .../video/detail/ForumVideoDetailFragment.kt | 50 ++- .../video/detail/ForumVideoDetailViewModel.kt | 148 ++++--- 5 files changed, 628 insertions(+), 403 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt index be5cce416e..b8ae14cf7a 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt @@ -64,7 +64,11 @@ class ArticleDetailFragment : BaseCommentFragment(ArticleDetailEntity::class.java.simpleName)?.let { - mViewModel.detailEntity = it - mAdapter?.articleDetailVH?.bindView(it) - updateView() - } - data?.getParcelableExtra(ArticleDraftEntity::class.java.simpleName)?.let { - mViewModel.detailEntity?.me?.articleDraft = it - } + data?.getParcelableExtra(ArticleDetailEntity::class.java.simpleName) + ?.let { + mViewModel.detailEntity = it + mAdapter?.articleDetailVH?.bindView(it) + updateView() + } + data?.getParcelableExtra(ArticleDraftEntity::class.java.simpleName) + ?.let { + mViewModel.detailEntity?.me?.articleDraft = it + } mReuseNoConn?.performClick() //重新刷新 } else if (requestCode == ImageViewerActivity.REQUEST_FOR_VIEWED_IMAGE && resultCode == Activity.RESULT_OK) { val imageSet = data?.extras?.get(ImageViewerActivity.VIEWED_IMAGE) as HashSet @@ -123,8 +130,10 @@ class ArticleDetailFragment : BaseCommentFragment(EntranceUtils.KEY_COMMUNITY_DATA)?.id - ?: "")) + ArticleDetailViewModel.Factory( + HaloApp.getInstance().application, + arguments?.getString(EntranceUtils.KEY_COMMUNITY_ARTICLE_ID) ?: "", + arguments?.getParcelable(EntranceUtils.KEY_COMMUNITY_DATA)?.id + ?: "" + ) + ) } override fun provideListAdapter(): ListAdapter<*> { return mAdapter - ?: ArticleDetailAdapter(requireContext(), mViewModel, BaseCommentAdapter.AdapterType.COMMENT, mEntrance).apply { mAdapter = this } + ?: ArticleDetailAdapter( + requireContext(), + mViewModel, + BaseCommentAdapter.AdapterType.COMMENT, + mEntrance + ).apply { mAdapter = this } } override fun onBackPressed(): Boolean { - if (SyncDataBetweenPageHelper.setResultAndFinish(requireContext(), mViewModel.detailEntity)) { + if (SyncDataBetweenPageHelper.setResultAndFinish( + requireContext(), + mViewModel.detailEntity + ) + ) { return true } @@ -183,11 +213,13 @@ class ArticleDetailFragment : BaseCommentFragment - (mBinding.toolbar.layoutParams as ViewGroup.MarginLayoutParams).topMargin = insets.systemWindowInsetTop + (mBinding.toolbar.layoutParams as ViewGroup.MarginLayoutParams).topMargin = + insets.systemWindowInsetTop insets.consumeSystemWindowInsets() } - mSkeletonScreen = Skeleton.bind(skeletonView).shimmer(false).load(R.layout.fragment_article_detail_skeleton).show() + mSkeletonScreen = Skeleton.bind(skeletonView).shimmer(false) + .load(R.layout.fragment_article_detail_skeleton).show() mBinding.inputContainer.bottomLikeIv.setOnClickListener { MtaHelper.onEvent("帖子详情", "底部", "点赞") @@ -212,16 +244,20 @@ class ArticleDetailFragment : BaseCommentFragment @@ -359,6 +412,7 @@ class ArticleDetailFragment : BaseCommentFragment() if (mViewModel.detailEntity?.user?.id == UserManager.getInstance().userId && !mViewModel.detailEntity?.me!!.isModerator && mViewModel.detailEntity?.status == "pass" && mViewModel.detailEntity?.choicenessStatus != "pass") { - entities.add(MenuItemEntity("申请加精", R.drawable.icon_more_panel_essence)) + val isEnable = mViewModel.detailEntity?.choicenessStatus == "apply" + entities.add( + MenuItemEntity( + "申请加精", + if (isEnable) + R.drawable.icon_more_panel_essence_unenable else R.drawable.icon_more_panel_essence, + isEnable = !isEnable + ) + ) } if (mViewModel.detailEntity?.user?.id == UserManager.getInstance().userId && mViewModel.detailEntity?.status == "pass") { entities.add(MenuItemEntity("修改", R.drawable.icon_more_panel_edit)) @@ -446,17 +508,35 @@ class ArticleDetailFragment : BaseCommentFragment { - startActivityForResult(ArticleEditActivity.getPatchIntent(requireContext(), mViewModel.detailEntity!!), ArticleDetailActivity.ARTICLE_PATCH_REQUEST) - NewLogUtils.logSharePanelClick("click_modification", mViewModel.detailEntity?.user?.id + startActivityForResult( + ArticleEditActivity.getPatchIntent( + requireContext(), + mViewModel.detailEntity!! + ), ArticleDetailActivity.ARTICLE_PATCH_REQUEST + ) + NewLogUtils.logSharePanelClick( + "click_modification", mViewModel.detailEntity?.user?.id ?: "", "帖子", mViewModel.detailEntity?.id - ?: "", mViewModel.detailEntity?.community?.id ?: "", bbsType) + ?: "", mViewModel.detailEntity?.community?.id ?: "", bbsType + ) } "投诉" -> { ifLogin("帖子详情") { BbsReportHelper.showReportDialog(mViewModel.detailEntity?.id ?: "") } - NewLogUtils.logSharePanelClick("click_report", mViewModel.detailEntity?.user?.id + NewLogUtils.logSharePanelClick( + "click_report", mViewModel.detailEntity?.user?.id ?: "", "帖子", mViewModel.detailEntity?.id - ?: "", mViewModel.detailEntity?.community?.id ?: "", bbsType) + ?: "", mViewModel.detailEntity?.community?.id ?: "", bbsType + ) } "申请加精" -> { if (mViewModel.detailEntity?.choicenessStatus == "apply") { @@ -498,34 +593,60 @@ class ArticleDetailFragment : BaseCommentFragment { addEssenceForum(mViewModel.detailEntity!!) - NewLogUtils.logSharePanelClick("click_essence", mViewModel.detailEntity?.user?.id + NewLogUtils.logSharePanelClick( + "click_essence", mViewModel.detailEntity?.user?.id ?: "", "帖子", mViewModel.detailEntity?.id - ?: "", mViewModel.detailEntity?.community?.id ?: "", bbsType) + ?: "", mViewModel.detailEntity?.community?.id ?: "", bbsType + ) } "修改活动标签" -> { - ChooseActivityDialogFragment.show(requireActivity() as AppCompatActivity, ChooseActivityDialogFragment.ActivityLabelLocation.BBS_ARTICLE, mViewModel.detailEntity?.tagActivityId) { label -> - if (label != null) { - mViewModel.modifyArticleActivityTag(mViewModel.detailEntity?.community?.id - ?: "", mViewModel.articleId, label) - NewLogUtils.logSharePanelClick("click_modification_activity_tag", mViewModel.detailEntity?.user?.id - ?: "", "帖子", mViewModel.detailEntity?.id - ?: "", mViewModel.detailEntity?.community?.id ?: "", bbsType) - } + ChooseActivityDialogFragment.show( + requireActivity() as AppCompatActivity, + ChooseActivityDialogFragment.ActivityLabelLocation.BBS_ARTICLE, + mViewModel.detailEntity?.tagActivityId + ) { label -> + mViewModel.modifyArticleActivityTag( + mViewModel.detailEntity?.community?.id ?: "", + mViewModel.articleId, + label + ) + NewLogUtils.logSharePanelClick( + "click_modification_activity_tag", + mViewModel.detailEntity?.user?.id ?: "", + "帖子", + mViewModel.detailEntity?.id ?: "", + mViewModel.detailEntity?.community?.id ?: "", + bbsType + ) } } - "删除" -> { - DialogUtils.showNewAlertDialog(requireContext(), "提示", "删除帖子后,其中的所有评论及回复都将被删除", "取消", "删除", {}, { - mViewModel.doHideThisArticle(mViewModel.detailEntity!!.community.id, mViewModel.articleId) - }) - NewLogUtils.logSharePanelClick("click_delete", mViewModel.detailEntity?.user?.id + "删除", "隐藏" -> { + DialogUtils.showNewAlertDialog( + requireContext(), + "提示", + "${it.text}帖子后,其中的所有评论及回复都将被${it.text}", + "取消", + it.text, + {}, + { + mViewModel.doHideThisArticle( + mViewModel.detailEntity!!.community.id, + mViewModel.articleId + ) + }) + NewLogUtils.logSharePanelClick( + "click_delete", mViewModel.detailEntity?.user?.id ?: "", "帖子", mViewModel.detailEntity?.id - ?: "", mViewModel.detailEntity?.community?.id ?: "", bbsType) + ?: "", mViewModel.detailEntity?.community?.id ?: "", bbsType + ) } } } @@ -536,36 +657,55 @@ class ArticleDetailFragment : BaseCommentFragment Permissions.GUEST) { - highlightDialogHintContent = if (permissions.highlightCommunityArticle == Permissions.REPORTER) { - "你的操作将提交给小编审核,确定提交吗?" - } else { - "你的操作将立即生效,确定提交吗?(你的管理权限为:高级)" - } + highlightDialogHintContent = + if (permissions.highlightCommunityArticle == Permissions.REPORTER) { + "你的操作将提交给小编审核,确定提交吗?" + } else { + "你的操作将立即生效,确定提交吗?" + } } when { article.isHighlighted -> toast("帖子已经加精") - else -> DialogUtils.showAlertDialog(requireContext(), "加精帖子", highlightDialogHintContent, - "确定", "取消", - { mViewModel.doHighlightThisArticle(mViewModel.detailEntity!!.community.id, mViewModel.articleId) }, null) + else -> DialogUtils.showAlertDialog( + requireContext(), + "加精帖子", + highlightDialogHintContent, + "确定", + "取消", + { + mViewModel.doHighlightThisArticle( + mViewModel.detailEntity!!.community.id, + mViewModel.articleId + ) + }, + null + ) } } private fun updateView() { val articleDetail = mViewModel.detailEntity ?: return - updateFollowMenu(articleDetail.me.isFollower, articleDetail.user.id == UserManager.getInstance().userId) + updateFollowMenu( + articleDetail.me.isFollower, + articleDetail.user.id == UserManager.getInstance().userId + ) mReuseNoConn?.visibility = View.GONE mListLoading?.visibility = View.GONE mBinding.inputContainer.bottomContainer.visibility = View.VISIBLE mBinding.bottomShadowView.visibility = View.VISIBLE - mBinding.inputContainer.bottomCommentTv.text = mViewModel.getCommentText(mViewModel.detailEntity?.count?.comment - ?: 0, "评论") + mBinding.inputContainer.bottomCommentTv.text = mViewModel.getCommentText( + mViewModel.detailEntity?.count?.comment + ?: 0, "评论" + ) val community = articleDetail.community - val icon = if (!community.icon.isNullOrEmpty()) community.icon else community.game?.getIcon() - val iconSubscript = if (!community.iconSubscript.isNullOrEmpty()) community.iconSubscript else community.game?.iconSubscript + val icon = + if (!community.icon.isNullOrEmpty()) community.icon else community.game?.getIcon() + val iconSubscript = + if (!community.iconSubscript.isNullOrEmpty()) community.iconSubscript else community.game?.iconSubscript mBinding.forumGameIv.displayGameIcon(icon, iconSubscript) ImageUtils.display(mBinding.userAvatar, articleDetail.user.icon) mBinding.forumGameIv.visibility = View.VISIBLE @@ -576,7 +716,8 @@ class ArticleDetailFragment : BaseCommentFragment 56F.dip2px()) { mBinding.forumGameIv.visibility = View.GONE mBinding.userAvatar.visibility = View.VISIBLE - mAttentionMenu?.isVisible = articleDetail.user.id != UserManager.getInstance().userId + mAttentionMenu?.isVisible = + articleDetail.user.id != UserManager.getInstance().userId mBinding.forumTitleTv.text = articleDetail.user.name mIsToolbarUserShow = true } else if (mIsToolbarUserShow && mListRv.computeVerticalScrollOffset() <= 56F.dip2px()) { @@ -592,8 +733,10 @@ class ArticleDetailFragment : BaseCommentFragment 0) + NewLogUtils.logSlideArticleOrQuestionDetail( + "帖子详情页", "slide_article_detail_page", (filterView?.top + ?: 0) > 0 + ) if ((filterView?.top ?: 0) > 0) { NewLogUtils.logCommentAreaEnter("帖子") } @@ -611,10 +754,20 @@ class ArticleDetailFragment : BaseCommentFragment() override fun provideDataObservable(page: Int): Observable> { - return RetrofitManager.getInstance(getApplication()).api.getCommunityArticleCommentList(communityId, articleId, currentSortType.value, page) + return RetrofitManager.getInstance(getApplication()).api.getCommunityArticleCommentList( + communityId, + articleId, + currentSortType.value, + page + ) } override fun mergeResultLiveData() { @@ -60,167 +72,193 @@ class ArticleDetailViewModel(application: Application, fun getArticleDetail() { mApi.getCommunityArticleDetail(communityId, articleId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Response() { - override fun onResponse(response: ArticleDetailEntity?) { - detailEntity = response - topItemData = CommentItemData(articleDetail = response) - commentCount = response?.count?.comment ?: 0 - loadResultLiveData.postValue(LoadResult.SUCCESS) - mergeListData(mListLiveData.value, displayFloor = true) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: ArticleDetailEntity?) { + detailEntity = response + topItemData = CommentItemData(articleDetail = response) + commentCount = response?.count?.comment ?: 0 + loadResultLiveData.postValue(LoadResult.SUCCESS) + mergeListData(mListLiveData.value, displayFloor = true) - NewLogUtils.logForumContentBrowser(articleId, "bbs_article") - } + NewLogUtils.logForumContentBrowser(articleId, "bbs_article") + } - override fun onFailure(e: HttpException?) { - if (e?.code().toString().startsWith("404")) { - loadResultLiveData.postValue(LoadResult.DELETED) - } else { - loadResultLiveData.postValue(LoadResult.NETWORK_ERROR) - } + override fun onFailure(e: HttpException?) { + if (e?.code().toString().startsWith("404")) { + loadResultLiveData.postValue(LoadResult.DELETED) + } else { + loadResultLiveData.postValue(LoadResult.NETWORK_ERROR) } - }) + } + }) } fun cancelLikeArticle() { mApi.postCommunityArticleUnVote(communityId, articleId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Response() { - override fun onResponse(response: VoteEntity?) { - // 赞同减一 - detailEntity?.me?.isCommunityArticleVote = false - detailEntity!!.count.vote-- + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: VoteEntity?) { + // 赞同减一 + detailEntity?.me?.isCommunityArticleVote = false + detailEntity!!.count.vote-- - like.postValue(response) + like.postValue(response) - syncVoteData() - } + syncVoteData() + } - override fun onFailure(e: HttpException?) { - ErrorHelper.handleError(getApplication(), e?.response()?.errorBody()?.string()) - } - }) + override fun onFailure(e: HttpException?) { + ErrorHelper.handleError(getApplication(), e?.response()?.errorBody()?.string()) + } + }) } fun likeArticle() { mApi.postCommunityArticleVote(communityId, articleId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Response() { - override fun onResponse(response: VoteEntity?) { - // 赞同加一 - detailEntity?.me?.isCommunityArticleOppose = false - detailEntity?.me?.isCommunityArticleVote = true - detailEntity!!.count.vote++ + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: VoteEntity?) { + // 赞同加一 + detailEntity?.me?.isCommunityArticleOppose = false + detailEntity?.me?.isCommunityArticleVote = true + detailEntity!!.count.vote++ - like.postValue(response) + like.postValue(response) - syncVoteData() + syncVoteData() - EnergyTaskHelper.postEnergyTask("vote_community_article", articleId) - } + EnergyTaskHelper.postEnergyTask("vote_community_article", articleId) + } - override fun onFailure(e: HttpException?) { - ErrorHelper.handleError(getApplication(), e?.response()?.errorBody()?.string()) - } - }) + override fun onFailure(e: HttpException?) { + ErrorHelper.handleError(getApplication(), e?.response()?.errorBody()?.string()) + } + }) } fun dislikeArticle() { mApi.postCommunityArticleOppose(communityId, articleId) - .subscribeOn(Schedulers.io()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - if (detailEntity?.me?.isCommunityArticleVote == true) { - detailEntity!!.count.vote-- - } - detailEntity?.me?.isCommunityArticleOppose = true - detailEntity?.me?.isCommunityArticleVote = false - - dislike.postValue(true) - - syncVoteData() + .subscribeOn(Schedulers.io()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + if (detailEntity?.me?.isCommunityArticleVote == true) { + detailEntity!!.count.vote-- } + detailEntity?.me?.isCommunityArticleOppose = true + detailEntity?.me?.isCommunityArticleVote = false - override fun onFailure(e: HttpException?) { - ErrorHelper.handleError(getApplication(), e?.response()?.errorBody()?.string()) - } - }) + dislike.postValue(true) + + syncVoteData() + } + + override fun onFailure(e: HttpException?) { + ErrorHelper.handleError(getApplication(), e?.response()?.errorBody()?.string()) + } + }) } fun cancelDislikeArticle() { mApi.postCommunityArticleUnoppose(communityId, articleId) - .subscribeOn(Schedulers.io()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - detailEntity?.me?.isCommunityArticleOppose = false + .subscribeOn(Schedulers.io()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + detailEntity?.me?.isCommunityArticleOppose = false - dislike.postValue(false) + dislike.postValue(false) - syncVoteData() - } + syncVoteData() + } - override fun onFailure(e: HttpException?) { - ErrorHelper.handleError(getApplication(), e?.response()?.errorBody()?.string()) - } - }) + override fun onFailure(e: HttpException?) { + ErrorHelper.handleError(getApplication(), e?.response()?.errorBody()?.string()) + } + }) } private fun syncVoteData() { articleId.apply { - SyncPageRepository.postSyncData(SyncDataEntity(this, + SyncPageRepository.postSyncData( + SyncDataEntity( + this, SyncFieldConstants.ARTICLE_VOTE_COUNT, detailEntity?.count?.vote, - checkFieldEntity = true)) - SyncPageRepository.postSyncData(SyncDataEntity(this, + checkFieldEntity = true + ) + ) + SyncPageRepository.postSyncData( + SyncDataEntity( + this, SyncFieldConstants.ARTICLE_VOTE, detailEntity?.me?.isCommunityArticleVote, - checkFieldEntity = true)) + checkFieldEntity = true + ) + ) } } private fun syncFollowData(isFollow: Boolean) { articleId.apply { - SyncPageRepository.postSyncData(SyncDataEntity(this, + SyncPageRepository.postSyncData( + SyncDataEntity( + this, SyncFieldConstants.IS_FOLLOWER, isFollow, - checkFieldEntity = true)) + checkFieldEntity = true + ) + ) } } fun collectionCommand(isCollection: Boolean, callback: (isFollow: Boolean) -> Unit) { val observable = if (isCollection) { - mApi.postCommunityArticleFavorites(UserManager.getInstance().userId, communityId, articleId) + mApi.postCommunityArticleFavorites( + UserManager.getInstance().userId, + communityId, + articleId + ) } else { - mApi.deleteCommunityArticleFavorites(UserManager.getInstance().userId, communityId, articleId) + mApi.deleteCommunityArticleFavorites( + UserManager.getInstance().userId, + communityId, + articleId + ) } observable - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - EventBus.getDefault().post(EBCollectionChanged(articleId, true, CollectionUtils.CollectionType.communityArticle)) - if (isCollection) { - // 收藏成功 - callback(true) - ToastUtils.showToast(getApplication().getString(R.string.collection_success)) - } else { - // 取消收藏成功 - callback(false) - ToastUtils.showToast(getApplication().getString(R.string.collection_cancel)) - } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + EventBus.getDefault().post( + EBCollectionChanged( + articleId, + true, + CollectionUtils.CollectionType.communityArticle + ) + ) + if (isCollection) { + // 收藏成功 + callback(true) + ToastUtils.showToast(getApplication().getString(R.string.collection_success)) + } else { + // 取消收藏成功 + callback(false) + ToastUtils.showToast(getApplication().getString(R.string.collection_cancel)) } + } - override fun onFailure(e: HttpException?) { - if (isCollection) { - ToastUtils.showToast(getApplication().getString(R.string.collection_failure)) - } else { - ToastUtils.showToast(getApplication().getString(R.string.collection_cancel_failure)) - } + override fun onFailure(e: HttpException?) { + if (isCollection) { + ToastUtils.showToast(getApplication().getString(R.string.collection_failure)) + } else { + ToastUtils.showToast(getApplication().getString(R.string.collection_cancel_failure)) } - }) + } + }) } fun follow() { @@ -238,99 +276,104 @@ class ArticleDetailViewModel(application: Application, mApi.deleteFollowing(targetUserId) } observable - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - super.onResponse(response) - if (isFollow) { - // 关注成功 - mFollowLiveData.postValue(true) - syncFollowData(true) - } else { - // 取消关注成功 - mFollowLiveData.postValue(false) - syncFollowData(false) - } - EventBus.getDefault().post(EBUserFollow(targetUserId, isFollow)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + if (isFollow) { + // 关注成功 + mFollowLiveData.postValue(true) + syncFollowData(true) + } else { + // 取消关注成功 + mFollowLiveData.postValue(false) + syncFollowData(false) } + EventBus.getDefault().post(EBUserFollow(targetUserId, isFollow)) + } - override fun onFailure(e: HttpException?) { - super.onFailure(e) - Utils.toast(getApplication(), R.string.loading_failed_hint) - } - }) + override fun onFailure(e: HttpException?) { + super.onFailure(e) + Utils.toast(getApplication(), R.string.loading_failed_hint) + } + }) } fun doHighlightThisArticle(communityId: String, articleId: String?) { mApi.highlightCommunityArticle(communityId, articleId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - super.onResponse(response) - highlight.postValue(true) - } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + highlight.postValue(true) + } - override fun onFailure(e: HttpException?) { - super.onFailure(e) - highlight.postValue(false) - } - }) + override fun onFailure(e: HttpException?) { + super.onFailure(e) + highlight.postValue(false) + } + }) } fun doApplyHighlightThisArticle(articleId: String?) { mApi.applyHighlightCommunityArticle(articleId) - .compose(observableToMain()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - super.onResponse(response) - applyHighlight.postValue(true) - } + .compose(observableToMain()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + applyHighlight.postValue(true) + } - override fun onFailure(e: HttpException?) { - super.onFailure(e) - applyHighlight.postValue(false) - } - }) + override fun onFailure(e: HttpException?) { + super.onFailure(e) + applyHighlight.postValue(false) + } + }) } fun doHideThisArticle(communityId: String, articleId: String?) { mApi.hideCommunityArticle(communityId, articleId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - super.onResponse(response) - hide.postValue(true) - } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + hide.postValue(true) + } - override fun onFailure(e: HttpException?) { - super.onFailure(e) - hide.postValue(false) - } - }) + override fun onFailure(e: HttpException?) { + super.onFailure(e) + hide.postValue(false) + } + }) } - fun modifyArticleActivityTag(communityId: String, articleId: String, label: ActivityLabelEntity) { - val body = json { "tag_activity_id" to label.id }.toRequestBody() + fun modifyArticleActivityTag( + communityId: String, + articleId: String, + label: ActivityLabelEntity? + ) { + val body = json { "tag_activity_id" to label?.id }.toRequestBody() mApi.modifyArticleActivityTag(communityId, articleId, body) - .compose(observableToMain()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - super.onResponse(response) - detailEntity?.apply { - tagActivityId = label.id - tagActivityName = label.name - updateDetailLiveData.postValue(this) - } + .compose(observableToMain()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + detailEntity?.apply { + tagActivityId = label?.id ?: "" + tagActivityName = label?.name ?: "" + updateDetailLiveData.postValue(this) + ToastUtils.showToast("修改活动标签成功") } + } - override fun onFailure(e: HttpException?) { - super.onFailure(e) - ToastUtils.showToast("修改活动标签失败") - } - }) + override fun onFailure(e: HttpException?) { + super.onFailure(e) + ToastUtils.showToast("修改活动标签失败") + } + }) } override fun hideCommentSuccess() { @@ -357,15 +400,18 @@ class ArticleDetailViewModel(application: Application, // }) // } - class Factory(private val application: Application, - private val articleId: String = "", - private val communityId: String = "") : ViewModelProvider.NewInstanceFactory() { + class Factory( + private val application: Application, + private val articleId: String = "", + private val communityId: String = "" + ) : ViewModelProvider.NewInstanceFactory() { override fun create(modelClass: Class): T { return ArticleDetailViewModel( - application = application, - articleId = articleId, - communityId = communityId) as T + application = application, + articleId = articleId, + communityId = communityId + ) as T } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/editor/OnLinkClickListener.kt b/app/src/main/java/com/gh/gamecenter/qa/editor/OnLinkClickListener.kt index f63dd5fdf4..24bc015607 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/editor/OnLinkClickListener.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/editor/OnLinkClickListener.kt @@ -64,12 +64,6 @@ class OnLinkClickListener(val context: Context, val videoEntity = GsonUtils.fromJson(content, MyVideoEntity::class.java) when (videoEntity.status) { "pass" -> { -// DirectUtils.directToVideoDetail(context, -// videoEntity.id, -// VideoDetailContainerViewModel.Location.VIDEO_HOT.value, -// showComment = false, -// entrance = entrance, -// path = "$path-视频") FullScreenVideoActivity.start(context, title, videoEntity.url, videoEntity.poster) } "fail" -> { diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt index fa3aa265c5..93f5623e0d 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt @@ -249,6 +249,7 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { mViewModel.applyHighlight.observeNonNull(this) { if (it) { toast("提交成功") + mForumVideoEntity?.choicenessStatus = "apply" } else { toast("提交失败") } @@ -546,7 +547,14 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { if (lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED) || mForumVideoEntity != null) { val entities = ArrayList() if (mForumVideoEntity?.user?.id == UserManager.getInstance().userId && !mForumVideoEntity?.me!!.isModerator && mForumVideoEntity?.status == "pass" && mForumVideoEntity?.choicenessStatus != "pass") { - entities.add(MenuItemEntity("申请加精", R.drawable.icon_more_panel_essence)) + val isEnable = mForumVideoEntity?.choicenessStatus == "apply" + entities.add( + MenuItemEntity( + "申请加精", if (isEnable) + R.drawable.icon_more_panel_essence_unenable else R.drawable.icon_more_panel_essence, + isEnable = !isEnable + ) + ) } if (mForumVideoEntity?.user?.id == UserManager.getInstance().userId && mForumVideoEntity?.status == "pass") { entities.add(MenuItemEntity("修改", R.drawable.icon_more_panel_edit)) @@ -566,8 +574,12 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { ) entities.add(MenuItemEntity("修改活动标签", R.drawable.icon_more_panel_modify_label)) } - if (mForumVideoEntity?.me!!.isModerator || mForumVideoEntity?.user?.id == UserManager.getInstance().userId) { - entities.add(MenuItemEntity("删除", R.drawable.icon_more_panel_delete)) + if (mForumVideoEntity?.me!!.isModerator) { + entities.add(MenuItemEntity("隐藏", R.drawable.icon_more_panel_delete)) + } else { + if (mForumVideoEntity?.user?.id == UserManager.getInstance().userId) { + entities.add(MenuItemEntity("删除", R.drawable.icon_more_panel_delete)) + } } val shareUrl = if (isPublishEnv()) { "https://m.ghzs666.com/video/${mForumVideoEntity?.id}" @@ -645,23 +657,21 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { ChooseActivityDialogFragment.ActivityLabelLocation.BBS_ARTICLE, mForumVideoEntity?.tagActivityId ) { label -> - if (label != null) { - mViewModel.modifyVideoActivityTag(mForumVideoEntity, label) - NewLogUtils.logSharePanelClick( - "click_modification_activity_tag", mForumVideoEntity?.user?.id - ?: "", "视频帖", mForumVideoEntity?.id - ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType - ) - } + mViewModel.modifyVideoActivityTag(mForumVideoEntity, label) + NewLogUtils.logSharePanelClick( + "click_modification_activity_tag", mForumVideoEntity?.user?.id + ?: "", "视频帖", mForumVideoEntity?.id + ?: "", mForumVideoEntity?.bbs?.id ?: "", bbsType + ) } } - "删除" -> { + "删除", "隐藏" -> { DialogUtils.showNewAlertDialog( requireContext(), "提示", - "删除视频后,其中的所有评论及回复都将被删除", + "${it.text}视频后,其中的所有评论及回复都将被${it.text}", "取消", - "删除", + it.text, {}, { mViewModel.deleteVideo(mForumVideoEntity?.id ?: "") @@ -685,7 +695,7 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { highlightDialogHintContent = if (permissions.highlightVideo == Permissions.REPORTER) { "你的操作将提交给小编审核,确定提交吗?" } else { - "你的操作将立即生效,确定提交吗?(你的管理权限为:高级)" + "你的操作将立即生效,确定提交吗?" } } if (mForumVideoEntity?.isHighlighted == true) { @@ -743,10 +753,12 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { super.onPause() mBinding.topVideoView.onVideoPause() val currentPosition = mBinding.topVideoView.getCurrentPosition() - ForumScrollCalculatorHelper.savePlaySchedule( - MD5Utils.getContentMD5(mForumVideoEntity?.url), - currentPosition - ) + mForumVideoEntity?.let { + ForumScrollCalculatorHelper.savePlaySchedule( + MD5Utils.getContentMD5(it.url), + currentPosition + ) + } DownloadManager.getInstance(requireContext()).removeObserver(dataWatcher) } diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailViewModel.kt index ae0de54a06..6c72f90629 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailViewModel.kt @@ -21,7 +21,8 @@ import okhttp3.ResponseBody import retrofit2.HttpException import tv.danmaku.ijk.media.exo2.ExoSourceManager -class ForumVideoDetailViewModel(application: Application, val videoId: String) : AndroidViewModel(application) { +class ForumVideoDetailViewModel(application: Application, val videoId: String) : + AndroidViewModel(application) { private val mApi = RetrofitManager.getInstance(getApplication()).api var videoIsMuted = SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true) val detailLiveData = MediatorLiveData>() @@ -38,112 +39,113 @@ class ForumVideoDetailViewModel(application: Application, val videoId: String) : fun getVideoDetail() { mApi.getBbsVideoDetail(videoId) - .compose(observableToMain()) - .subscribe(object : Response() { - override fun onResponse(response: ForumVideoEntity?) { - super.onResponse(response) - if (response != null) { - detailLiveData.postValue(Resource.success(response)) + .compose(observableToMain()) + .subscribe(object : Response() { + override fun onResponse(response: ForumVideoEntity?) { + super.onResponse(response) + if (response != null) { + detailLiveData.postValue(Resource.success(response)) - NewLogUtils.logForumContentBrowser(videoId, "bbs_video") - } + NewLogUtils.logForumContentBrowser(videoId, "bbs_video") } + } - override fun onFailure(e: HttpException?) { - super.onFailure(e) - detailLiveData.postValue(Resource.error(e)) - } - }) + override fun onFailure(e: HttpException?) { + super.onFailure(e) + detailLiveData.postValue(Resource.error(e)) + } + }) } @SuppressLint("CheckResult") fun shareVideoStatistics(videoEntity: ForumVideoEntity?) { if (videoEntity == null) return mApi.shareVideoStatistics(videoEntity.id) - .subscribeOn(Schedulers.io()) - .subscribe(object : BiResponse() { - override fun onSuccess(data: JsonObject) { - val msg = data.get("msg").asString - if ("success" == msg) { - videoEntity.let { - it.share++ - } - needToUpdateShareCount.postValue(videoEntity.share) + .subscribeOn(Schedulers.io()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: JsonObject) { + val msg = data.get("msg").asString + if ("success" == msg) { + videoEntity.let { + it.share++ } + needToUpdateShareCount.postValue(videoEntity.share) } - }) + } + }) } fun deleteVideo(videoId: String) { mApi.deleteVideo(videoId) - .compose(observableToMain()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - deleteLiveData.postValue(true) - } + .compose(observableToMain()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + deleteLiveData.postValue(true) + } - override fun onFailure(e: HttpException?) { - val string = e?.response()?.errorBody()?.string() ?: "" - ErrorHelper.handleError(getApplication(), string) - } - }) + override fun onFailure(e: HttpException?) { + val string = e?.response()?.errorBody()?.string() ?: "" + ErrorHelper.handleError(getApplication(), string) + } + }) } //版主加精 fun doHighlightThisVideo(bbsId: String, videoId: String) { mApi.highlightCommunityVideo(bbsId, videoId) - .compose(observableToMain()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - super.onResponse(response) - highlight.postValue(true) - } + .compose(observableToMain()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + highlight.postValue(true) + } - override fun onFailure(e: HttpException?) { - super.onFailure(e) - highlight.postValue(false) - } - }) + override fun onFailure(e: HttpException?) { + super.onFailure(e) + highlight.postValue(false) + } + }) } //用户申请加精 fun doApplyHighlightCommunityVideo(videoId: String) { mApi.applyHighlightCommunityVideo(videoId) - .compose(observableToMain()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - super.onResponse(response) - applyHighlight.postValue(true) - } + .compose(observableToMain()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + applyHighlight.postValue(true) + } - override fun onFailure(e: HttpException?) { - super.onFailure(e) - applyHighlight.postValue(false) - } - }) + override fun onFailure(e: HttpException?) { + super.onFailure(e) + applyHighlight.postValue(false) + } + }) } - fun modifyVideoActivityTag(videoEntity: ForumVideoEntity?, label: ActivityLabelEntity) { - val body = json { "tag_activity_id" to label.id }.toRequestBody() - mApi.modifyVideoActivityTag(videoEntity?.bbsId,videoId,body) - .compose(observableToMain()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - super.onResponse(response) - videoEntity?.apply { - tagActivityId = label.id - tagActivityName = label.name - updateDetailLiveData.postValue(this) - } + fun modifyVideoActivityTag(videoEntity: ForumVideoEntity?, label: ActivityLabelEntity?) { + val body = json { "tag_activity_id" to label?.id }.toRequestBody() + mApi.modifyVideoActivityTag(videoEntity?.bbsId, videoId, body) + .compose(observableToMain()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + videoEntity?.apply { + tagActivityId = label?.id ?: "" + tagActivityName = label?.name ?: "" + updateDetailLiveData.postValue(this) + ToastUtils.showToast("修改活动标签成功") } + } - override fun onFailure(e: HttpException?) { - super.onFailure(e) - ToastUtils.showToast("修改活动标签失败") - } - }) + override fun onFailure(e: HttpException?) { + super.onFailure(e) + ToastUtils.showToast("修改活动标签失败") + } + }) } fun isTopVideoPartlyCached(topVideoUrl: String): Boolean { From 1f3ae1c687e4a7e39de3852c8756b7e95d9d7e2f Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Wed, 4 Aug 2021 14:21:55 +0800 Subject: [PATCH 018/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200803=E4=BA=A7=E5=93=81=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=881?= =?UTF-8?q?=EF=BC=89=EF=BC=88=E7=AC=AC23=E3=80=8124=E7=82=B9=EF=BC=89https?= =?UTF-8?q?://git.ghzs.com/pm/halo-app-issues/-/issues/1426?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gamecenter/setting/GameDownloadSettingFragment.kt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/gamecenter/setting/GameDownloadSettingFragment.kt b/app/src/main/java/com/gh/gamecenter/setting/GameDownloadSettingFragment.kt index 86ef0d4ffa..dbcb9d2cc1 100644 --- a/app/src/main/java/com/gh/gamecenter/setting/GameDownloadSettingFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/setting/GameDownloadSettingFragment.kt @@ -3,14 +3,17 @@ package com.gh.gamecenter.setting import android.content.Intent import android.content.SharedPreferences import android.net.Uri +import android.os.Build import android.os.Bundle import android.os.Environment import android.preference.PreferenceManager import android.text.TextUtils import android.view.View +import androidx.core.content.FileProvider import butterknife.OnClick import com.gh.common.util.MtaHelper.onEvent import com.gh.common.util.PackageUtils +import com.gh.gamecenter.BuildConfig import com.gh.gamecenter.CleanApkActivity import com.gh.gamecenter.R import com.gh.gamecenter.databinding.FragmentGameDownloadSettingBinding @@ -91,7 +94,12 @@ class GameDownloadSettingFragment: NormalFragment() { private fun startFilePath(dirPath: String) { val intent = Intent(Intent.ACTION_GET_CONTENT) - intent.setDataAndType(Uri.fromFile(File(dirPath)), "file/*") + val uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + FileProvider.getUriForFile(requireContext(), BuildConfig.APPLICATION_ID, File(dirPath)) + } else { + Uri.fromFile(File(dirPath)) + } + intent.setDataAndType(uri, "file/*") intent.addCategory(Intent.CATEGORY_OPENABLE) intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK try { From 871cfd638d8ea5ebab5dd5bb6a41a7627d74a94c Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Wed, 4 Aug 2021 14:26:47 +0800 Subject: [PATCH 019/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA2=E6=9C=9F-?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E5=B1=95=E7=A4=BA-=E5=B8=96=E5=AD=90?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B5(0804UI=E6=B5=8B=E8=AF=951)=20https:?= =?UTF-8?q?//git.ghzs.com/pm/halo-app-issues/-/issues/1346?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/item_article_detail_content.xml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/res/layout/item_article_detail_content.xml b/app/src/main/res/layout/item_article_detail_content.xml index 15746b78a2..17576728bb 100644 --- a/app/src/main/res/layout/item_article_detail_content.xml +++ b/app/src/main/res/layout/item_article_detail_content.xml @@ -146,12 +146,12 @@ android:layout_width="66dp" android:layout_height="16dp" android:layout_centerInParent="true" + android:background="@drawable/bg_approval_status_pending" android:gravity="center" android:includeFontPadding="false" + android:textColor="@color/text_06CEA8" android:textSize="10sp" android:visibility="gone" - android:background="@drawable/bg_approval_status_pending" - android:textColor="@color/text_06CEA8" tools:text="内容审核中" /> @@ -175,6 +175,7 @@ android:id="@+id/originalTv" android:layout_width="28dp" android:layout_height="16dp" + android:layout_marginLeft="20dp" android:layout_marginTop="12dp" android:background="@drawable/bg_border_original" android:gravity="center" @@ -183,7 +184,6 @@ android:textColor="@color/theme_font" android:textSize="10sp" android:visibility="gone" - android:layout_marginLeft="20dp" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/desTv" /> @@ -199,9 +199,10 @@ android:layout_marginLeft="20dp" android:layout_marginTop="25dp" android:drawableLeft="@drawable/ic_choose_activity" - android:drawablePadding="12dp" + android:drawablePadding="8dp" android:includeFontPadding="false" android:textColor="@color/text_FA8500" + android:textSize="12sp" android:visibility="gone" tools:text="第四期新星up主计划" tools:visibility="visible" /> From 489b8143a1354a7a8c5db2bd317f5530fc1dc57f Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Wed, 4 Aug 2021 15:06:44 +0800 Subject: [PATCH 020/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200804=E4=BA=A7=E5=93=81=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=881?= =?UTF-8?q?=EF=BC=89=20(1)=20https://git.ghzs.com/pm/halo-app-issues/-/iss?= =?UTF-8?q?ues/1430?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt | 2 +- .../gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt index b8ae14cf7a..6180d825ba 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt @@ -506,7 +506,7 @@ class ArticleDetailFragment : BaseCommentFragment Date: Wed, 4 Aug 2021 15:45:31 +0800 Subject: [PATCH 021/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200803=E4=BA=A7=E5=93=81=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=882?= =?UTF-8?q?=EF=BC=89=EF=BC=88=E7=AC=AC3=E7=82=B9=EF=BC=89https://git.ghzs.?= =?UTF-8?q?com/pm/halo-app-issues/-/issues/1428?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/gamecenter/forum/detail/ForumDetailFragment.kt | 2 +- .../java/com/gh/gamecenter/forum/home/ForumFragment.kt | 1 + .../java/com/gh/gamecenter/forum/home/ForumViewModel.kt | 2 +- app/src/main/res/layout/hot_forum_item.xml | 9 +++++---- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt index c8c7f0a314..dcfb8abd00 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailFragment.kt @@ -416,7 +416,7 @@ class ForumDetailFragment : BaseLazyTabFragment() { mViewModel?.unFollowForum { MtaHelper.onEvent("论坛详情", "顶部区域", "取消关注") mForumDetail?.me?.isFollower = false - ToastUtils.showToast("取消关注") + ToastUtils.showToast("取消成功") initUI() EventBus.getDefault().post(EBForumFollowChange(forumEntity, false)) } diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumFragment.kt index 47f0bb1a34..deee1ac205 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumFragment.kt @@ -49,6 +49,7 @@ class ForumFragment: LazyFragment(), SwipeRefreshLayout.OnRefreshListener { mUserViewModel?.loginObsUserinfo?.observe(this, Observer { if (!mIsFirst) { if (it?.data == null) { + mViewModel?.followForums?.clear() mBinding?.followForumContainer?.visibility = View.GONE } onRefresh() diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumViewModel.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumViewModel.kt index a2a79caf7d..cc3510a914 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumViewModel.kt @@ -101,7 +101,7 @@ class ForumViewModel(application: Application) : AndroidViewModel(application) { @SuppressLint("CheckResult") fun getHotForum() { - api.getHotForumWithPageSize(1, 100) + api.getHotForum(1) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : Response>() { diff --git a/app/src/main/res/layout/hot_forum_item.xml b/app/src/main/res/layout/hot_forum_item.xml index b351baaeb9..a406056bb3 100644 --- a/app/src/main/res/layout/hot_forum_item.xml +++ b/app/src/main/res/layout/hot_forum_item.xml @@ -25,11 +25,11 @@ app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintRight_toLeftOf="@+id/followTv" + tools:text="龙之谷龙之谷龙之谷龙之谷龙之谷龙之谷龙之谷龙之谷龙之谷龙之谷龙之谷龙之谷龙之谷" /> Date: Wed, 4 Aug 2021 18:44:40 +0800 Subject: [PATCH 022/151] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=A7=AF=E5=88=86?= =?UTF-8?q?=E4=BD=93=E7=B3=BB-=E5=85=89=E8=83=BD=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E3=80=81=E5=85=89=E8=83=BD=E5=B1=8BUI=E6=9B=B4=E6=94=B9=20http?= =?UTF-8?q?s://git.ghzs.com/pm/halo-app-issues/-/issues/1300?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 + .../java/com/gh/common/DefaultUrlHandler.kt | 3 +- .../java/com/gh/common/util/DialogUtils.java | 35 +- .../com/gh/common/util/EnergyTaskHelper.kt | 46 +- .../gh/gamecenter/energy/CommodityFragment.kt | 44 +- .../gamecenter/energy/EnergyCenterActivity.kt | 11 +- .../gamecenter/energy/EnergyCenterFragment.kt | 318 ++++----- .../gamecenter/energy/EnergyHouseFragment.kt | 185 +++-- .../energy/HorizontalTaskAdapter.kt | 8 +- .../com/gh/gamecenter/energy/TaskAdapter.kt | 54 +- .../com/gh/gamecenter/energy/TaskItemData.kt | 5 +- .../com/gh/gamecenter/energy/TaskViewModel.kt | 13 +- .../com/gh/gamecenter/entity/TaskEntity.kt | 2 +- .../fragment/MainWrapperFragment.java | 1 + .../fragment/SearchToolbarFragment.java | 2 +- .../gamedetail/dialog/InviteCodeDialog.kt | 19 +- .../personal/NewPersonalFragment.java | 4 +- .../personalhome/UserHomeViewModel.kt | 4 +- .../border/ChooseAvatarBorderAdapter.kt | 1 + .../questions/edit/QuestionEditViewModel.kt | 7 +- .../gamecenter/security/BindPhoneViewModel.kt | 4 +- .../gh/gamecenter/user/UserRepository.java | 10 +- .../drawable-xxhdpi/bg_commodity_tag.9.png | Bin 4181 -> 0 bytes .../drawable-xxhdpi/bg_energy_center_day.webp | Bin 21504 -> 0 bytes .../bg_energy_center_night.webp | Bin 20696 -> 0 bytes .../drawable-xxhdpi/bg_energy_center_top.webp | Bin 0 -> 75836 bytes .../res/drawable-xxhdpi/bg_energy_house.webp | Bin 89812 -> 31496 bytes .../drawable-xxhdpi/ic_energy_arrow_right.png | Bin 340 -> 0 bytes .../ic_energy_center_done.webp | Bin 9454 -> 0 bytes .../ic_energy_center_invite.webp | Bin 5322 -> 0 bytes .../ic_energy_center_more.webp | Bin 2042 -> 0 bytes .../ic_energy_center_sign.webp | Bin 17000 -> 0 bytes .../ic_energy_center_sign_normal.webp | Bin 4120 -> 0 bytes .../ic_energy_center_signed.webp | Bin 4254 -> 0 bytes .../ic_energy_center_top_energy.webp | Bin 1444 -> 0 bytes .../ic_exchange_commodity.webp | Bin 6850 -> 0 bytes .../drawable-xxhdpi/ic_lottery_paradise.webp | Bin 7794 -> 0 bytes .../bg_bottom_sheet_collapses.webp | Bin 0 -> 16848 bytes .../bg_bottom_sheet_expanded.webp | Bin 0 -> 16960 bytes .../drawable-xxxhdpi/bg_commodity_cover.webp | Bin 0 -> 1226 bytes .../drawable-xxxhdpi/bg_commodity_item.webp | Bin 0 -> 2188 bytes .../drawable-xxxhdpi/bg_commodity_tag.webp | Bin 0 -> 772 bytes .../bg_energy_center_day.webp | Bin 29118 -> 0 bytes .../bg_energy_center_night.webp | Bin 29560 -> 0 bytes .../bg_energy_center_top.webp | Bin 0 -> 114252 bytes .../res/drawable-xxxhdpi/bg_energy_house.webp | Bin 135406 -> 44912 bytes .../bg_energy_house_roll_notice.webp | Bin 0 -> 2136 bytes .../bg_energy_sign_dialog.webp | Bin 0 -> 2312 bytes .../bg_energy_task_btn_finished.webp | Bin 0 -> 934 bytes .../bg_energy_task_btn_normal.webp | Bin 0 -> 872 bytes .../res/drawable-xxxhdpi/bg_energy_value.webp | Bin 0 -> 1808 bytes .../bg_house_bottom_sheet_collapses.webp | Bin 0 -> 16022 bytes .../res/drawable-xxxhdpi/bg_novice_tasks.webp | Bin 0 -> 2670 bytes .../res/drawable-xxxhdpi/bg_task_bottom.webp | Bin 0 -> 908 bytes .../res/drawable-xxxhdpi/bg_task_top.webp | Bin 0 -> 740 bytes .../ic_energy_center_done.webp | Bin 12152 -> 0 bytes .../ic_energy_center_invite.webp | Bin 0 -> 16608 bytes .../ic_energy_center_more.png | Bin 2265 -> 0 bytes .../ic_energy_center_sign.webp | Bin 23438 -> 14936 bytes .../ic_energy_center_sign_normal.webp | Bin 5662 -> 4368 bytes .../ic_energy_center_signed.webp | Bin 5326 -> 4342 bytes .../ic_energy_center_top_energy.webp | Bin 1954 -> 2512 bytes .../ic_energy_tab_indicator.png | Bin 0 -> 1158 bytes .../ic_exchange_commodity.webp | Bin 0 -> 12402 bytes .../drawable-xxxhdpi/ic_lottery_paradise.webp | Bin 0 -> 13486 bytes .../pic_commodity_no_data.webp | Bin 0 -> 29770 bytes .../pic_daily_task_title.webp | Bin 0 -> 15178 bytes .../res/drawable-xxxhdpi/pic_earn_energy.webp | Bin 0 -> 5116 bytes .../res/drawable-xxxhdpi/pic_energy_rule.webp | Bin 0 -> 6544 bytes .../pic_energy_sign_dialog_top.webp | Bin 0 -> 27906 bytes .../drawable-xxxhdpi/pic_exchange_rule.webp | Bin 0 -> 6284 bytes .../drawable-xxxhdpi/pic_fix_task_title.webp | Bin 0 -> 15756 bytes .../pic_novice_task_title.webp | Bin 0 -> 15760 bytes .../drawable/bg_energy_house_roll_notice.xml | 23 - ...und_50dcdc.xml => button_round_00dba4.xml} | 2 +- .../res/drawable/button_round_806f9cef.xml | 9 - ...und_e6f9fa.xml => button_round_ebf9fa.xml} | 2 +- app/src/main/res/drawable/oval_ebf9fa_bg.xml | 7 + app/src/main/res/layout/commodity_item.xml | 32 +- app/src/main/res/layout/daily_task_item.xml | 158 +++-- .../main/res/layout/dialog_energy_sign.xml | 333 +++++++++ .../res/layout/fragment_commodity_list.xml | 16 +- .../res/layout/fragment_energy_center.xml | 636 +++++------------- .../main/res/layout/fragment_energy_house.xml | 506 +++++++------- .../res/layout/layout_filter_category.xml | 2 +- app/src/main/res/layout/novice_task_item.xml | 50 +- app/src/main/res/layout/novice_tasks_item.xml | 26 +- .../main/res/layout/tab_item_commodity.xml | 19 + app/src/main/res/layout/task_bottom_item.xml | 10 + app/src/main/res/layout/task_title_item.xml | 31 +- app/src/main/res/values/colors.xml | 3 +- app/src/main/res/values/strings.xml | 2 +- dependencies.gradle | 1 + 93 files changed, 1385 insertions(+), 1261 deletions(-) delete mode 100644 app/src/main/res/drawable-xxhdpi/bg_commodity_tag.9.png delete mode 100644 app/src/main/res/drawable-xxhdpi/bg_energy_center_day.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/bg_energy_center_night.webp create mode 100644 app/src/main/res/drawable-xxhdpi/bg_energy_center_top.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_energy_arrow_right.png delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_energy_center_done.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_energy_center_invite.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_energy_center_more.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_energy_center_sign.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_energy_center_sign_normal.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_energy_center_signed.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_energy_center_top_energy.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_exchange_commodity.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_lottery_paradise.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/bg_bottom_sheet_collapses.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/bg_bottom_sheet_expanded.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/bg_commodity_cover.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/bg_commodity_item.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/bg_commodity_tag.webp delete mode 100644 app/src/main/res/drawable-xxxhdpi/bg_energy_center_day.webp delete mode 100644 app/src/main/res/drawable-xxxhdpi/bg_energy_center_night.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/bg_energy_center_top.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/bg_energy_house_roll_notice.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/bg_energy_sign_dialog.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/bg_energy_task_btn_finished.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/bg_energy_task_btn_normal.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/bg_energy_value.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/bg_house_bottom_sheet_collapses.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/bg_novice_tasks.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/bg_task_bottom.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/bg_task_top.webp delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_energy_center_done.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_energy_center_invite.webp delete mode 100755 app/src/main/res/drawable-xxxhdpi/ic_energy_center_more.png create mode 100755 app/src/main/res/drawable-xxxhdpi/ic_energy_tab_indicator.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_exchange_commodity.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_lottery_paradise.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/pic_commodity_no_data.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/pic_daily_task_title.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/pic_earn_energy.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/pic_energy_rule.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/pic_energy_sign_dialog_top.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/pic_exchange_rule.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/pic_fix_task_title.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/pic_novice_task_title.webp delete mode 100644 app/src/main/res/drawable/bg_energy_house_roll_notice.xml rename app/src/main/res/drawable/{button_round_50dcdc.xml => button_round_00dba4.xml} (79%) delete mode 100644 app/src/main/res/drawable/button_round_806f9cef.xml rename app/src/main/res/drawable/{button_round_e6f9fa.xml => button_round_ebf9fa.xml} (79%) create mode 100644 app/src/main/res/drawable/oval_ebf9fa_bg.xml create mode 100644 app/src/main/res/layout/dialog_energy_sign.xml create mode 100644 app/src/main/res/layout/tab_item_commodity.xml create mode 100644 app/src/main/res/layout/task_bottom_item.xml diff --git a/app/build.gradle b/app/build.gradle index 991d51234d..3d1d4aef0f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -344,6 +344,8 @@ dependencies { implementation "com.aliyun.openservices:aliyun-log-android-sdk:${aliyunLog}" implementation "com.github.princekin-f:EasyFloat:${easyFloat}" + implementation "io.github.florent37:shapeofview:$shapeOfView" + implementation project(':libraries:LGLibrary') // implementation project(':libraries:MTA') implementation project(':libraries:QQShare') diff --git a/app/src/main/java/com/gh/common/DefaultUrlHandler.kt b/app/src/main/java/com/gh/common/DefaultUrlHandler.kt index 27f8feaa70..afca900773 100644 --- a/app/src/main/java/com/gh/common/DefaultUrlHandler.kt +++ b/app/src/main/java/com/gh/common/DefaultUrlHandler.kt @@ -446,10 +446,11 @@ object DefaultUrlHandler { val name = uri.getQueryParameter("communityName") ?: "" DirectUtils.directToCommunityColumn(context, CommunityEntity(id, name), columnsId, entrance, "") } - contains("zone") -> { + contains("zone") && split("/").size > 2 -> { val gameId = split("/")[2] DirectUtils.directGameZone(context, gameId, url, entrance) } + else -> return false } } return 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 411572e341..610b28ae3b 100644 --- a/app/src/main/java/com/gh/common/util/DialogUtils.java +++ b/app/src/main/java/com/gh/common/util/DialogUtils.java @@ -65,6 +65,7 @@ import com.gh.gamecenter.R; import com.gh.gamecenter.SuggestionActivity; import com.gh.gamecenter.adapter.viewholder.PrivacyPolicyItemViewHolder; import com.gh.gamecenter.databinding.DialogBindPhoneBinding; +import com.gh.gamecenter.databinding.DialogEnergySignBinding; import com.gh.gamecenter.databinding.DialogOverseaConfirmationBinding; import com.gh.gamecenter.databinding.DialogPackageParseErrorBinding; import com.gh.gamecenter.databinding.DialogQuickLoginPermissionBinding; @@ -1927,7 +1928,7 @@ public class DialogUtils { return dialog; } - public static void showEnergyDialog(Context context, String userName, int energy) { + public static void showEnergyDialog(Context context, String userName, long energy) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context, R.style.DialogWindowTransparent); @@ -2183,6 +2184,38 @@ public class DialogUtils { dialog.show(); } + public static void showEnergySignDialog(Context context, int sevenDaySerialSign) { + context = checkDialogContext(context); + + final Dialog dialog = new Dialog(context, R.style.DialogWindowTransparent); + DialogEnergySignBinding binding = DialogEnergySignBinding.inflate(LayoutInflater.from(context)); + + if (sevenDaySerialSign > 7) sevenDaySerialSign = 7; + + for (int i = 1; i <= sevenDaySerialSign; i++) { + int index = (i - 1) * 2; + LinearLayout dayContainer = (LinearLayout) binding.signDaysContainer.getChildAt(index); + ImageView dayIv = (ImageView) dayContainer.getChildAt(1); + dayIv.setImageResource(R.drawable.ic_energy_center_signed); + + if (i != 7) { + int rIndex = (i - 1) * 2 + 1; + LinearLayout lineContainer = (LinearLayout) binding.signDaysContainer.getChildAt(rIndex); + View straightLine = lineContainer.getChildAt(0); + View dottedLine = lineContainer.getChildAt(1); + if (i != sevenDaySerialSign) { + straightLine.setVisibility(View.VISIBLE); + } else { + dottedLine.setVisibility(View.VISIBLE); + } + } + } + + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + dialog.setContentView(binding.getRoot()); + dialog.show(); + } + /** * @param context may be is application context * @return activity context diff --git a/app/src/main/java/com/gh/common/util/EnergyTaskHelper.kt b/app/src/main/java/com/gh/common/util/EnergyTaskHelper.kt index 19a9cdec47..5c63070475 100644 --- a/app/src/main/java/com/gh/common/util/EnergyTaskHelper.kt +++ b/app/src/main/java/com/gh/common/util/EnergyTaskHelper.kt @@ -130,27 +130,39 @@ object EnergyTaskHelper { // 完成弹窗 @JvmStatic fun showCompletePopup(entity: EnergyTaskCompleteEntity) { - val currentActivity = AppManager.getInstance().recentActiveActivity - currentActivity?.run { - val contentView = View.inflate(this, R.layout.popup_energy_task, null) - contentView.run { - findViewById(R.id.taskDesc).text = "恭喜你!完成任务:${entity.name}" - findViewById(R.id.taskEnergy).text = "+${entity.energy}光能" - isFocusable = true - isFocusableInTouchMode = true - setOnClickListener { - if (currentActivity::class.java.simpleName != EnergyCenterActivity::class.java.simpleName) { - currentActivity.startActivity(EnergyCenterActivity.getIntent(currentActivity)) + tryWithDefaultCatch { + val currentActivity = AppManager.getInstance().recentActiveActivity + val popWindow = PopupWindow(LinearLayout.LayoutParams.MATCH_PARENT, 88F.dip2px()) + + currentActivity?.run { + val contentView = View.inflate(this, R.layout.popup_energy_task, null) + contentView.run { + findViewById(R.id.taskDesc).text = "恭喜你!完成任务:${entity.name}" + findViewById(R.id.taskEnergy).text = "+${entity.energy}光能" + isFocusable = true + isFocusableInTouchMode = true + setOnClickListener { + if (popWindow != null && popWindow.isShowing) { + popWindow.dismiss() + } + if (currentActivity !is EnergyCenterActivity) { + currentActivity.startActivity(EnergyCenterActivity.getIntent(currentActivity)) + } } } - } - val popWindow = PopupWindow(contentView, LinearLayout.LayoutParams.MATCH_PARENT, 88F.dip2px()) - popWindow.showAtLocation(currentActivity.window.decorView, Gravity.TOP, 0, 0) - countDownTimer(3) { finish, _ -> - if (finish && popWindow != null && popWindow.isShowing) { - popWindow.dismiss() + popWindow.contentView = contentView + currentActivity.window.decorView.post { + popWindow.showAtLocation(currentActivity.window.decorView, Gravity.TOP, 0, 0) } + + contentView.postDelayed({ + tryCatchInRelease { + if (popWindow != null && popWindow.isShowing) { + popWindow.dismiss() + } + } + }, 3000) } } } diff --git a/app/src/main/java/com/gh/gamecenter/energy/CommodityFragment.kt b/app/src/main/java/com/gh/gamecenter/energy/CommodityFragment.kt index 90d49b237f..e8bb2c0eab 100644 --- a/app/src/main/java/com/gh/gamecenter/energy/CommodityFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/energy/CommodityFragment.kt @@ -56,7 +56,7 @@ class CommodityFragment : ListFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - mListRv.layoutManager = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL) + mListRv?.layoutManager = StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL) mListRv?.layoutParams = (mListRv?.layoutParams as ViewGroup.MarginLayoutParams).apply { leftMargin = 12F.dip2px() rightMargin = 12F.dip2px() @@ -81,11 +81,11 @@ class CommodityFragment : ListFragment() { sizeTv.text = entity.name if (index == mCurrentIndex) { - sizeTv.setTextColor(R.color.theme_font.toColor()) - sizeTv.setBackgroundResource(R.drawable.button_round_e6f9fa) + sizeTv.setTextColor(R.color.white.toColor()) + sizeTv.setBackgroundResource(R.drawable.button_round_00dba4) } else { sizeTv.setTextColor(R.color.text_333333.toColor()) - sizeTv.setBackgroundResource(R.drawable.button_round_f5f5f5) + sizeTv.setBackgroundResource(R.drawable.button_round_ebf9fa) } root.setOnClickListener { @@ -125,7 +125,7 @@ class CommodityFragment : ListFragment() { sizeTv.text = "更多 >" sizeTv.setTextColor(R.color.text_333333.toColor()) - sizeTv.setBackgroundResource(R.drawable.button_round_f5f5f5) + sizeTv.setBackgroundResource(R.drawable.button_round_ebf9fa) root.setOnClickListener { IntegralLogHelper.run { @@ -160,12 +160,12 @@ class CommodityFragment : ListFragment() { } } - mListRv.addOnScrollListener(object : RecyclerView.OnScrollListener() { + mListRv?.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { super.onScrollStateChanged(recyclerView, newState) - if (mEntrance == "光能中心" && mListRv.layoutManager?.itemCount ?:0 == 11) { - mListRv.layoutManager?.run { + if (mEntrance == "光能中心" && mListRv?.layoutManager?.itemCount ?:0 == 11) { + mListRv?.layoutManager?.run { if (childCount > 0 && newState == RecyclerView.SCROLL_STATE_IDLE && mLastVisibleItemPosition >= itemCount - 1) { mBinding.bottom.visibility = View.VISIBLE } else { @@ -177,8 +177,8 @@ class CommodityFragment : ListFragment() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) - if (mEntrance == "光能中心" && mListRv.layoutManager?.itemCount ?:0 == 11) { - mListRv.layoutManager?.run { + if (mEntrance == "光能中心" && mListRv?.layoutManager?.itemCount ?:0 == 11) { + mListRv?.layoutManager?.run { if (mLastPositions == null) { mLastPositions = IntArray((this as StaggeredGridLayoutManager).spanCount) } @@ -209,11 +209,11 @@ class CommodityFragment : ListFragment() { sizeTv.text = entity.name if (index == mCurrentIndex) { - sizeTv.setTextColor(R.color.theme_font.toColor()) - sizeTv.setBackgroundResource(R.drawable.button_round_e6f9fa) + sizeTv.setTextColor(R.color.white.toColor()) + sizeTv.setBackgroundResource(R.drawable.button_round_00dba4) } else { sizeTv.setTextColor(R.color.text_333333.toColor()) - sizeTv.setBackgroundResource(R.drawable.button_round_f5f5f5) + sizeTv.setBackgroundResource(R.drawable.button_round_ebf9fa) } root.setOnClickListener { @@ -243,7 +243,7 @@ class CommodityFragment : ListFragment() { sizeTv.text = "更多 >" sizeTv.setTextColor(R.color.text_333333.toColor()) - sizeTv.setBackgroundResource(R.drawable.button_round_f5f5f5) + sizeTv.setBackgroundResource(R.drawable.button_round_ebf9fa) root.setOnClickListener { IntegralLogHelper.run { @@ -276,11 +276,11 @@ class CommodityFragment : ListFragment() { for (index in 0 until categoryContainer.childCount) { val sizeTv = categoryContainer.getChildAt(index) as TextView if (index == mCurrentIndex) { - sizeTv.setTextColor(R.color.theme_font.toColor()) - sizeTv.setBackgroundResource(R.drawable.button_round_e6f9fa) + sizeTv.setTextColor(R.color.white.toColor()) + sizeTv.setBackgroundResource(R.drawable.button_round_00dba4) } else { sizeTv.setTextColor(R.color.text_333333.toColor()) - sizeTv.setBackgroundResource(R.drawable.button_round_f5f5f5) + sizeTv.setBackgroundResource(R.drawable.button_round_ebf9fa) } } } @@ -325,9 +325,9 @@ class CommodityFragment : ListFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - if (mEntrance == "光能中心") { +// if (mEntrance == "光能中心") { mListRefresh?.isNestedScrollingEnabled = false - } +// } } override fun onDestroyView() { @@ -345,15 +345,15 @@ class CommodityFragment : ListFragment() { override fun onLoadEmpty() { super.onLoadEmpty() // RecyclerView 被隐藏的话会导致不能 AppBar 不能滑动 - mListRv.visibility = View.VISIBLE + mListRv?.visibility = View.VISIBLE } override fun onLoadError() { super.onLoadError() - mListRv.visibility = View.VISIBLE + mListRv?.visibility = View.VISIBLE } fun setNestedScrollingEnabled(enable: Boolean) { - mListRv.isNestedScrollingEnabled = enable + mListRv?.isNestedScrollingEnabled = enable } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/energy/EnergyCenterActivity.kt b/app/src/main/java/com/gh/gamecenter/energy/EnergyCenterActivity.kt index 0005058712..ac81cc2502 100644 --- a/app/src/main/java/com/gh/gamecenter/energy/EnergyCenterActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/energy/EnergyCenterActivity.kt @@ -24,20 +24,11 @@ class EnergyCenterActivity : NormalActivity() { companion object { fun getIntent(context: Context?): Intent? { - return getIntent(context, false, 0) - } - - fun getIntent(context: Context?, isSign: Boolean): Intent? { - return getIntent(context, isSign, 0) + return getIntent(context, 0) } fun getIntent(context: Context?, initTabIndex: Int): Intent? { - return getIntent(context, false, initTabIndex) - } - - fun getIntent(context: Context?, isSign: Boolean = false, initTabIndex: Int): Intent? { val bundle = Bundle() - bundle.putBoolean(EntranceUtils.KEY_IS_SIGN, isSign) bundle.putInt(EntranceUtils.KEY_TAB_INDEX, if (initTabIndex == 0 || initTabIndex == 1) initTabIndex else 0) return getTargetIntent(context, EnergyCenterActivity::class.java, EnergyCenterFragment::class.java, bundle) } diff --git a/app/src/main/java/com/gh/gamecenter/energy/EnergyCenterFragment.kt b/app/src/main/java/com/gh/gamecenter/energy/EnergyCenterFragment.kt index 8dfc4f1c19..b6602b7940 100644 --- a/app/src/main/java/com/gh/gamecenter/energy/EnergyCenterFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/energy/EnergyCenterFragment.kt @@ -1,22 +1,20 @@ package com.gh.gamecenter.energy +import android.graphics.Typeface import android.os.Build import android.os.Bundle import android.util.DisplayMetrics import android.view.LayoutInflater import android.view.View -import android.widget.CheckedTextView -import android.widget.ImageView -import android.widget.LinearLayout -import android.widget.RelativeLayout +import android.widget.* import androidx.fragment.app.Fragment import butterknife.OnClick import com.gh.base.adapter.FragmentAdapter import com.gh.base.fragment.BaseLazyFragment -import com.gh.common.constant.Constants import com.gh.common.util.* import com.gh.gamecenter.R import com.gh.gamecenter.databinding.FragmentEnergyCenterBinding +import com.gh.gamecenter.databinding.TabItemMainBinding import com.gh.gamecenter.entity.CommodityCategoryEntity import com.gh.gamecenter.entity.SignStatusEntity import com.gh.gamecenter.entity.UserInfoEntity @@ -24,8 +22,8 @@ import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.personalhome.UserHomeViewModel import com.gh.gamecenter.user.UserViewModel import com.google.android.material.bottomsheet.BottomSheetBehavior -import com.google.android.material.tabs.TabLayout import com.halo.assistant.HaloApp +import kotlin.math.abs class EnergyCenterFragment : BaseLazyFragment() { @@ -35,11 +33,11 @@ class EnergyCenterFragment : BaseLazyFragment() { private var mUserHomeViewModel: UserHomeViewModel? = null private var mEnergyCenterViewModel: EnergyCenterViewModel? = null private val mTitleList = listOf("赚光能", "兑换区") + private var mTabList = arrayListOf() private var mFragmentsList = ArrayList() private var mCategoryList = ArrayList() private var mUserInfo: UserInfoEntity? = null - private var mEnergy = 0 - private var mAutoSign = false + private var mEnergy = 0L private var mSignStatus: SignStatusEntity? = null private var mInitTabIndex = 0 private var mBehavior: BottomSheetBehavior? = null @@ -52,20 +50,6 @@ class EnergyCenterFragment : BaseLazyFragment() { override fun onFragmentResume() { super.onFragmentResume() - // 6:00-18:59 展示白天背景,否则展示夜晚背景 - if (System.currentTimeMillis() >= TimeUtils.getTimeOfToday(6) - && System.currentTimeMillis() < TimeUtils.getTimeOfToday(19) ) { - mBinding?.run { - background.setImageResource(R.drawable.bg_energy_center_day) - signTitle.setTextColor(R.color.theme_font.toColor()) - } - } else { - mBinding?.run { - background.setImageResource(R.drawable.bg_energy_center_night) - signTitle.setTextColor(R.color.white.toColor()) - } - } - if (NetworkUtils.isNetworkConnected(requireContext())) { if (CheckLoginUtils.isLogin()) { mUserHomeViewModel?.getUserEnergy() @@ -77,7 +61,6 @@ class EnergyCenterFragment : BaseLazyFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mAutoSign = arguments?.getBoolean(EntranceUtils.KEY_IS_SIGN) ?: false mInitTabIndex = arguments?.getInt(EntranceUtils.KEY_TAB_INDEX) ?: 0 if (mInitTabIndex != 0 && mInitTabIndex != 1) mInitTabIndex = 0 @@ -107,13 +90,12 @@ class EnergyCenterFragment : BaseLazyFragment() { mUserHomeViewModel?.energy?.observeNonNull(viewLifecycleOwner) { mEnergy = it - mBinding?.userEnergy?.text = "${it}光能" + mBinding?.userEnergy?.text = it.toString() } mUserHomeViewModel?.sign?.observeNonNull(this) { mSignStatus = it DialogUtils.showSignSuccessDialog(requireContext()) { - initSignView(it) mUserHomeViewModel?.getUserEnergy() refreshTaskList() } @@ -121,18 +103,17 @@ class EnergyCenterFragment : BaseLazyFragment() { mUserHomeViewModel?.signStatus?.observeNonNull(this) { mSignStatus = it - initSignView(it) // 今天未签到且需要自动签到才调用签到接口 - if (!it.todaySignIn && mAutoSign && !ClickUtils.isFastDoubleClick(990)) { + if (!it.todaySignIn && !ClickUtils.isFastDoubleClick(990)) { mUserHomeViewModel?.signIn() } } mBinding?.run { - background.layoutParams = background.layoutParams.apply { - val screenWidth = resources.displayMetrics.widthPixels - height = screenWidth * 400 / 360 - } +// background.layoutParams = background.layoutParams.apply { +// val screenWidth = resources.displayMetrics.widthPixels +// height = screenWidth * 400 / 360 +// } val screenHeight = when { Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1 -> { @@ -154,15 +135,22 @@ class EnergyCenterFragment : BaseLazyFragment() { } mBehavior = BottomSheetBehavior.from(bottomSheet) - val toolbarHeight = screenHeight - DisplayUtils.getStatusBarHeight(resources) - 48F.dip2px() - mBehavior?.peekHeight = screenHeight - 312F.dip2px() +// val toolbarHeight = screenHeight - DisplayUtils.getStatusBarHeight(resources) - 48F.dip2px() + mBehavior?.peekHeight = screenHeight - 320F.dip2px() - val layoutParams = bottomSheet.layoutParams - layoutParams.height = toolbarHeight - bottomSheet.layoutParams = layoutParams +// val layoutParams = bottomSheet.layoutParams +// layoutParams.height = toolbarHeight +// bottomSheet.layoutParams = layoutParams mBehavior?.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() { override fun onStateChanged(bottomSheet: View, newState: Int) { + + if (newState == BottomSheetBehavior.STATE_COLLAPSED) { + mBinding?.topContainer?.visibility = View.VISIBLE + } else { + mBinding?.topContainer?.visibility = View.INVISIBLE + } + if (newState == BottomSheetBehavior.STATE_HIDDEN) { mBehavior?.state = BottomSheetBehavior.STATE_COLLAPSED } @@ -173,30 +161,18 @@ class EnergyCenterFragment : BaseLazyFragment() { } } - override fun onSlide(bottomSheet: View, slideOffset: Float) {} - }) - } - } - - private fun initSignView(entity: SignStatusEntity) { - mBinding?.run { - if (entity.todaySignIn) { - signToday.visibility = View.GONE - signedContainer.visibility = View.VISIBLE - serialSignTv.text = "已连续签到${entity.serialSign}天" - } else { - signToday.visibility = View.VISIBLE - signedContainer.visibility = View.GONE - } - - if (entity.sevenDaySerialSign == 0) return - - for (i in 1..entity.sevenDaySerialSign) { - updateSignedViewForDay(i) - if (i != 7) { - updateLineViewForDay(i, i != entity.sevenDaySerialSign) + override fun onSlide(bottomSheet: View, slideOffset: Float) { + mBinding?.run { + if (slideOffset > 0.95) { + collapsedBg.visibility = View.GONE + expandedBg.visibility = View.VISIBLE + } else { + collapsedBg.visibility = View.VISIBLE + expandedBg.visibility = View.GONE + } + } } - } + }) } } @@ -206,29 +182,6 @@ class EnergyCenterFragment : BaseLazyFragment() { } } - private fun updateSignedViewForDay(day: Int) { - mBinding?.run { - val index = (day - 1) * 2 - val dayContainer = signDaysContainer.getChildAt(index) as RelativeLayout - val dayIv = dayContainer.getChildAt(0) as ImageView - dayIv.setImageResource(R.drawable.ic_energy_center_signed) - } - } - - private fun updateLineViewForDay(day: Int, isStraight: Boolean) { - mBinding?.run { - val index = (day - 1) * 2 + 1 - val lineContainer = signDaysContainer.getChildAt(index) as LinearLayout - val straightLine = lineContainer.getChildAt(0) - val dottedLine = lineContainer.getChildAt(1) - if (isStraight) { - straightLine.visibility = View.VISIBLE - } else { - dottedLine.visibility = View.VISIBLE - } - } - } - private fun initViewpager() { mBinding?.run { mFragmentsList.clear() @@ -249,33 +202,56 @@ class EnergyCenterFragment : BaseLazyFragment() { viewpager.offscreenPageLimit = mFragmentsList.size viewpager.adapter = FragmentAdapter(childFragmentManager, mFragmentsList, mTitleList) + viewpager.doOnScroll( + onPageSelected = { position -> + updateTabTextStyle(position, 0F) + }, + onPageScrolled = { position, positionOffset, _ -> + if (position + 1 != mTabList.size) { + mTabList[position].run { + textSize = (DEFAULT_TAB_TEXT_SIZE + ((1 - positionOffset) * 4)).roundTo(1) +// setTextColor(ColorUtils.blendARGB(TAB_DEFAULT_COLOR, TAB_SELECTED_COLOR, 1 - positionOffset)) + } + mTabList[position + 1].run { + textSize = (DEFAULT_TAB_TEXT_SIZE + ((positionOffset) * 4)).roundTo(1) +// setTextColor(ColorUtils.blendARGB(TAB_DEFAULT_COLOR, TAB_SELECTED_COLOR, positionOffset)) + } + + // 多 tab 切换的时候可能会出现某些 tab 的文字没有回归到原始大小的问题的问题 (positionOffset 不保证连续) + for ((index, tabTv) in mTabList.withIndex()) { + if (abs(index - position) >= 2) { + if (tabTv.textSize != DEFAULT_TAB_TEXT_SIZE) { + tabTv.textSize = DEFAULT_TAB_TEXT_SIZE +// tabTv.setTextColor(TAB_DEFAULT_COLOR) + } + } + } + } + + updateTabTextStyle(position, positionOffset) + } + ) + tabLayout.setupWithViewPager(viewpager) + indicatorView.run { + setupWithTabLayout(tabLayout) + setupWithViewPager(viewpager) + setIndicatorWidth(18) + } for (i in 0 until tabLayout.tabCount) { val tab = tabLayout.getTabAt(i) ?: continue val tabTitle = if (tab.text != null) tab.text.toString() else "" - val tabView = getTabView(tabTitle) - tab.customView = tabView + val tabViewBinding = generateTabView(tabTitle) + mTabList.add(tabViewBinding.tabTitle) + tab.customView = tabViewBinding.root + tab.view.setPadding(0, 0, 0, 0) } viewpager.currentItem = mInitTabIndex - tabLayout.getTabAt(mInitTabIndex)?.let { updateTabStyle(it, true) } + tabLayout.getTabAt(mInitTabIndex)?.let { updateTabTextStyle(mInitTabIndex, 0F) } if (mInitTabIndex == 1) setNestedScrollingEnabledForIndex(mInitTabIndex) - tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { - override fun onTabReselected(tab: TabLayout.Tab?) { - updateTabStyle(tab, true) - } - - override fun onTabUnselected(tab: TabLayout.Tab?) { - updateTabStyle(tab, false) - } - - override fun onTabSelected(tab: TabLayout.Tab?) { - updateTabStyle(tab, true) - } - }) - // 处理BottomSheetBehavior的ViewPager嵌套RecyclerView滑动冲突问题 viewpager.addOnPageChangeListener { if (it == 0) { @@ -289,31 +265,44 @@ class EnergyCenterFragment : BaseLazyFragment() { } } + private fun updateTabTextStyle(selectedPosition: Int, positionOffset: Float) { + for ((index, titleTv) in mTabList.withIndex()) { + if (index == selectedPosition) { +// titleTv.setTextColor(TAB_SELECTED_COLOR) + if (positionOffset == 0F) { + titleTv.setTypeface(null, Typeface.NORMAL) + titleTv.setTypeface(titleTv.typeface, Typeface.BOLD) + } + } else { +// titleTv.setTextColor(TAB_DEFAULT_COLOR) + if (positionOffset == 0F) { + titleTv.setTypeface(null, Typeface.NORMAL) + } + } + } + } + + private fun generateTabView(title: String): TabItemMainBinding { + val binding = TabItemMainBinding.inflate(LayoutInflater.from(requireContext())) + binding.tabTitle.run { + text = title + textSize = DEFAULT_TAB_TEXT_SIZE + setTextColor(TAB_TEXT_COLOR) + } + binding.invisibleTabTitle.run { + text = title + textSize = DEFAULT_TAB_TEXT_SIZE + } + return binding + } + private fun setNestedScrollingEnabledForIndex(index: Int) { (mFragmentsList[0] as TaskFragment).setNestedScrollingEnabled(index == 0) (mFragmentsList[1] as CommodityFragment).setNestedScrollingEnabled(index == 1) mBinding?.bottomSheet?.requestLayout() } - private fun getTabView(title: String): View { - val view = LayoutInflater.from(HaloApp.getInstance().application.baseContext).inflate(R.layout.tab_item_energy_center, null) - val tabTitle = view.findViewById(R.id.tab_title) - if (tabTitle is CheckedTextView) { - tabTitle.text = title - } - return view - } - - private fun updateTabStyle(tab: TabLayout.Tab?, isChecked: Boolean) { - val tabView = tab?.customView - tabView?.run { - val tabIndicator = findViewById(R.id.tab_indicator) - tabIndicator.visibility = if (isChecked) View.VISIBLE else View.INVISIBLE - } - } - - @OnClick(R.id.backIv, R.id.userEnergyContainer, R.id.energyRuleTv, R.id.inviteFriends, R.id.signToday, R.id.signRule, - R.id.oneDay, R.id.twoDay, R.id.threeDay, R.id.fourDay, R.id.fiveDay, R.id.sixDay, R.id.sevenDay) + @OnClick(R.id.backIv, R.id.userEnergyContainer, R.id.energyRuleTv, R.id.signIv, R.id.inviteIv) fun onViewClicked(v: View) { when (v.id) { R.id.backIv -> requireActivity().finish() @@ -338,7 +327,15 @@ class EnergyCenterFragment : BaseLazyFragment() { DirectUtils.directToEnergyRulePage(requireContext()) } - R.id.inviteFriends -> { + R.id.signIv -> { + ifLogin("光能中心-每日签到") { + mSignStatus?.run { + DialogUtils.showEnergySignDialog(requireContext(), sevenDaySerialSign) + } + } + } + + R.id.inviteIv -> { IntegralLogHelper.run { log("click_invite_friend", LOCATION) log("view_invite_friend", "邀请好友页") @@ -348,87 +345,6 @@ class EnergyCenterFragment : BaseLazyFragment() { DirectUtils.directToInviteFriends(requireContext()) } } - - R.id.signRule -> { - IntegralLogHelper.log("click_sign_rule", LOCATION) - DialogUtils.showSignRuleDialog(requireContext()) - } - - R.id.signToday -> { - ifLogin("光能中心-签到气泡") { - dealSignIn() - } - } - - R.id.oneDay -> { - ifLogin("光能中心-1天") { - mSignStatus?.run { - if (!todaySignIn && sevenDaySerialSign == 0) { - dealSignIn() - } - } - } - } - - R.id.twoDay -> { - ifLogin("光能中心-2天") { - mSignStatus?.run { - if (!todaySignIn && sevenDaySerialSign == 1) { - dealSignIn() - } - } - } - } - - R.id.threeDay -> { - ifLogin("光能中心-3天") { - mSignStatus?.run { - if (!todaySignIn && sevenDaySerialSign == 2) { - dealSignIn() - } - } - } - } - - R.id.fourDay -> { - ifLogin("光能中心-4天") { - mSignStatus?.run { - if (!todaySignIn && sevenDaySerialSign == 3) { - dealSignIn() - } - } - } - } - - R.id.fiveDay -> { - ifLogin("光能中心-5天") { - mSignStatus?.run { - if (!todaySignIn && sevenDaySerialSign == 4) { - dealSignIn() - } - } - } - } - - R.id.sixDay -> { - ifLogin("光能中心-6天") { - mSignStatus?.run { - if (!todaySignIn && sevenDaySerialSign == 5) { - dealSignIn() - } - } - } - } - - R.id.sevenDay -> { - ifLogin("光能中心-7天") { - mSignStatus?.run { - if (!todaySignIn && sevenDaySerialSign == 6) { - dealSignIn() - } - } - } - } } } @@ -448,5 +364,7 @@ class EnergyCenterFragment : BaseLazyFragment() { companion object { const val LOCATION = "光能中心" + var TAB_TEXT_COLOR: Int = R.color.text_00DBA4.toColor() + var DEFAULT_TAB_TEXT_SIZE = 16F } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/energy/EnergyHouseFragment.kt b/app/src/main/java/com/gh/gamecenter/energy/EnergyHouseFragment.kt index 167facd369..add79f3e6c 100644 --- a/app/src/main/java/com/gh/gamecenter/energy/EnergyHouseFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/energy/EnergyHouseFragment.kt @@ -1,10 +1,12 @@ package com.gh.gamecenter.energy +import android.graphics.Typeface +import android.os.Build import android.os.Bundle +import android.util.DisplayMetrics import android.view.LayoutInflater import android.view.View -import android.widget.CheckedTextView -import android.widget.ImageView +import android.widget.RelativeLayout import android.widget.TextView import androidx.core.os.bundleOf import androidx.fragment.app.Fragment @@ -14,13 +16,14 @@ import com.gh.base.fragment.BaseLazyFragment import com.gh.common.util.* import com.gh.gamecenter.R import com.gh.gamecenter.databinding.FragmentEnergyHouseBinding +import com.gh.gamecenter.databinding.TabItemCommodityBinding import com.gh.gamecenter.entity.CommodityCategoryEntity import com.gh.gamecenter.entity.SubjectSettingEntity import com.gh.gamecenter.entity.UserInfoEntity import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.personalhome.UserHomeViewModel import com.gh.gamecenter.user.UserViewModel -import com.google.android.material.appbar.AppBarLayout +import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.tabs.TabLayout import com.halo.assistant.HaloApp import kotlin.math.abs @@ -34,13 +37,15 @@ class EnergyHouseFragment: BaseLazyFragment() { private var mCommodityCategories: List? = null private var mUserInfo: UserInfoEntity? = null private val mTitleList = ArrayList() + private var mTabList = arrayListOf() private val mFragments = ArrayList() private val mRollNotices = ArrayList() private var mCurrentSizeIndex = 0 private var mCurrentSize = SubjectSettingEntity.Size() - private var mEnergy = 0 + private var mEnergy = 0L private var mCategoryId = "" private var mInitIndex = 0 + private var mBehavior: BottomSheetBehavior? = null override fun getLayoutId() = 0 @@ -83,7 +88,7 @@ class EnergyHouseFragment: BaseLazyFragment() { mEnergy = it mBinding?.run { userEnergyContainer.visibility = View.VISIBLE - userEnergy.text = "${it}光能" + userEnergy.text = it.toString() } } @@ -103,26 +108,45 @@ class EnergyHouseFragment: BaseLazyFragment() { } mBinding?.run { - appbar.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { _, verticalOffset -> - val invisibleOffset = (104F - 48F).dip2px() - DisplayUtils.getStatusBarHeight(resources) - if (abs(verticalOffset) >= invisibleOffset) { - toolbar.setBackgroundColor(R.color.white.toColor()) - backIv.setImageResource(R.drawable.ic_bar_back) - title.setTextColor(R.color.text_333333.toColor()) - exchangeRuleTv.setTextColor(R.color.text_333333.toColor()) - EnergyRuleIv.setImageResource(R.drawable.icon_doubt_black) - tabLayout.setBackgroundColor(R.color.white.toColor()) - sizeContainer.setBackgroundColor(R.color.white.toColor()) - DisplayUtils.setStatusBarColor(requireActivity(), R.color.white, true) - } else { - toolbar.setBackgroundColor(R.color.transparent.toColor()) - backIv.setImageResource(R.drawable.ic_bar_back_light) - title.setTextColor(R.color.white.toColor()) - exchangeRuleTv.setTextColor(R.color.white.toColor()) - EnergyRuleIv.setImageResource(R.drawable.icon_doubt_white) - tabLayout.setBackgroundColor(R.color.transparent.toColor()) - sizeContainer.setBackgroundColor(R.color.transparent.toColor()) - DisplayUtils.setStatusBarColor(requireActivity(), R.color.transparent, true) +// background.layoutParams = background.layoutParams.apply { +// val screenWidth = resources.displayMetrics.widthPixels +// height = screenWidth * 400 / 360 +// } + + val screenHeight = when { + Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1 -> { + resources.displayMetrics.heightPixels + } + + Build.VERSION.SDK_INT >= Build.VERSION_CODES.R -> { + DisplayMetrics() + .apply { requireActivity().display?.getRealMetrics(this) } + .heightPixels + } + + else -> { + @Suppress("DEPRECATION") + DisplayMetrics() + .apply { requireActivity().windowManager.defaultDisplay.getRealMetrics(this) } + .heightPixels + } + } + + mBehavior = BottomSheetBehavior.from(bottomSheet) + mBehavior?.peekHeight = screenHeight - 288F.dip2px() + + val layoutParams = bottomSheet.layoutParams + layoutParams.height = screenHeight - 40F.dip2px() + bottomSheet.layoutParams = layoutParams + + mBehavior?.addBottomSheetCallback(object : BottomSheetBehavior.BottomSheetCallback() { + override fun onStateChanged(bottomSheet: View, newState: Int) { + if (newState == BottomSheetBehavior.STATE_HIDDEN) { + mBehavior?.state = BottomSheetBehavior.STATE_COLLAPSED + } + } + + override fun onSlide(bottomSheet: View, slideOffset: Float) { } }) } @@ -165,28 +189,69 @@ class EnergyHouseFragment: BaseLazyFragment() { } else super.getPageTitle(position) } } + + viewpager.doOnScroll( + onPageSelected = { position -> + updateTabTextStyle(position, 0F) + }, + onPageScrolled = { position, positionOffset, _ -> + if (position + 1 != mTabList.size) { + mTabList[position].run { + textSize = (DEFAULT_TAB_TEXT_SIZE + ((1 - positionOffset) * 4)).roundTo(1) +// setTextColor(ColorUtils.blendARGB(TAB_DEFAULT_COLOR, TAB_SELECTED_COLOR, 1 - positionOffset)) + } + mTabList[position + 1].run { + textSize = (DEFAULT_TAB_TEXT_SIZE + ((positionOffset) * 4)).roundTo(1) +// setTextColor(ColorUtils.blendARGB(TAB_DEFAULT_COLOR, TAB_SELECTED_COLOR, positionOffset)) + } + + // 多 tab 切换的时候可能会出现某些 tab 的文字没有回归到原始大小的问题的问题 (positionOffset 不保证连续) + for ((index, tabTv) in mTabList.withIndex()) { + if (abs(index - position) >= 2) { + if (tabTv.textSize != DEFAULT_TAB_TEXT_SIZE) { + tabTv.textSize = DEFAULT_TAB_TEXT_SIZE +// tabTv.setTextColor(TAB_DEFAULT_COLOR) + } + } + } + } + + updateTabTextStyle(position, positionOffset) + } + ) + tabLayout.setupWithViewPager(viewpager) + indicatorView.run { + setupWithTabLayout(tabLayout) + setupWithViewPager(viewpager) + setIndicatorWidth(18) + } for (i in 0 until tabLayout.tabCount) { val tab = tabLayout.getTabAt(i) ?: continue val tabTitle = if (tab.text != null) tab.text.toString() else "" - val tabView = getTabView(tabTitle) - tab.customView = tabView + val tabViewBinding = generateTabView( + tabTitle, + i == 0, + i == tabLayout.tabCount - 1 + ) + mTabList.add(tabViewBinding.tabTitle) + tab.customView = tabViewBinding.root + tab.view.setPadding(0, 0, 0, 0) } viewpager.currentItem = mInitIndex - tabLayout.getTabAt(mInitIndex)?.let { updateTabStyle(it, true) } + tabLayout.getTabAt(mInitIndex)?.let { updateTabTextStyle(mInitIndex, 0F) } + setNestedScrollingEnabledForIndex(mInitIndex) + tabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener { override fun onTabReselected(tab: TabLayout.Tab?) { - updateTabStyle(tab, true) } override fun onTabUnselected(tab: TabLayout.Tab?) { - updateTabStyle(tab, false) } override fun onTabSelected(tab: TabLayout.Tab?) { - updateTabStyle(tab, true) tab?.run { mCommodityCategories?.get(position)?.run { IntegralLogHelper.logCommodityCategory( @@ -200,29 +265,53 @@ class EnergyHouseFragment: BaseLazyFragment() { } } }) + + viewpager.addOnPageChangeListener { + setNestedScrollingEnabledForIndex(it) + } } initSize() } - - private fun getTabView(title: String): View { - val view = LayoutInflater.from(HaloApp.getInstance().application.baseContext).inflate(R.layout.tab_item_energy_house, null) - val tabTitle = view.findViewById(R.id.tab_title) - if (tabTitle is CheckedTextView) { - tabTitle.text = title + private fun setNestedScrollingEnabledForIndex(currentIndex: Int) { + mFragments.forEachIndexed { index, fragment -> + (fragment as CommodityFragment).setNestedScrollingEnabled(currentIndex == index) } - return view + + mBinding?.bottomSheet?.requestLayout() } - private fun updateTabStyle(tab: TabLayout.Tab?, isChecked: Boolean) { - val tabView = tab?.customView - tabView?.run { - val tabIndicator = findViewById(R.id.tab_indicator) - tabIndicator.visibility = if (isChecked) View.VISIBLE else View.INVISIBLE + private fun updateTabTextStyle(selectedPosition: Int, positionOffset: Float) { + for ((index, titleTv) in mTabList.withIndex()) { + if (index == selectedPosition) { +// titleTv.setTextColor(TAB_SELECTED_COLOR) + if (positionOffset == 0F) { + titleTv.setTypeface(null, Typeface.NORMAL) + titleTv.setTypeface(titleTv.typeface, Typeface.BOLD) + } + } else { +// titleTv.setTextColor(TAB_DEFAULT_COLOR) + if (positionOffset == 0F) { + titleTv.setTypeface(null, Typeface.NORMAL) + } + } } } + private fun generateTabView(title: String, isFirst: Boolean, isLast: Boolean): TabItemCommodityBinding { + val binding = TabItemCommodityBinding.inflate(LayoutInflater.from(requireContext())) + binding.tabTitle.run { + val padLeft = if (isFirst) 16F.dip2px() else 8F.dip2px() + val padRight = if (isLast) 16F.dip2px() else 8F.dip2px() + setPadding(padLeft, 0, padRight, 0) + text = title + textSize = DEFAULT_TAB_TEXT_SIZE + setTextColor(TAB_TEXT_COLOR) + } + return binding + } + private fun getDefaultSizeFilterArray(): ArrayList { return arrayListOf().apply { add(SubjectSettingEntity.Size(min = -1, max = -1, text = "全部")) @@ -261,11 +350,11 @@ class EnergyHouseFragment: BaseLazyFragment() { val item = sizeContainer.getChildAt(index) val tv = item.findViewById(R.id.size_tv) if (position == index) { - tv.setTextColor(R.color.theme_font.toColor()) - tv.setBackgroundResource(R.drawable.button_round_e6f8fa) + tv.setTextColor(R.color.white.toColor()) + tv.setBackgroundResource(R.drawable.button_round_00dba4) } else { - tv.setTextColor(R.color.text_666666.toColor()) - tv.setBackgroundResource(R.drawable.button_round_f5f5f5) + tv.setTextColor(R.color.text_333333.toColor()) + tv.setBackgroundResource(R.drawable.button_round_ebf9fa) } } } @@ -344,5 +433,7 @@ class EnergyHouseFragment: BaseLazyFragment() { companion object { const val LOCATION = "光能屋" + var TAB_TEXT_COLOR: Int = R.color.text_00DBA4.toColor() + var DEFAULT_TAB_TEXT_SIZE = 14F } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/energy/HorizontalTaskAdapter.kt b/app/src/main/java/com/gh/gamecenter/energy/HorizontalTaskAdapter.kt index 89204f14df..54223e7527 100644 --- a/app/src/main/java/com/gh/gamecenter/energy/HorizontalTaskAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/energy/HorizontalTaskAdapter.kt @@ -37,12 +37,10 @@ class HorizontalTaskAdapter(context: Context, if (task.status == "finished") { taskBtn.text = "已完成" - taskBtn.setTextColor(R.color.text_cccccc.toColor()) - taskBtn.setBackgroundResource(R.drawable.button_round_f5f5f5) + taskBtn.setBackgroundResource(R.drawable.bg_energy_task_btn_finished) } else { - taskBtn.text = "去完成" - taskBtn.setTextColor(R.color.theme_font.toColor()) - taskBtn.setBackgroundResource(R.drawable.button_round_ebfdff) + taskBtn.text = "+${task.energy}光能" + taskBtn.setBackgroundResource(R.drawable.bg_energy_task_btn_normal) } taskNotice.setOnClickListener { diff --git a/app/src/main/java/com/gh/gamecenter/energy/TaskAdapter.kt b/app/src/main/java/com/gh/gamecenter/energy/TaskAdapter.kt index 7c1eaa656c..8caab18f40 100644 --- a/app/src/main/java/com/gh/gamecenter/energy/TaskAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/energy/TaskAdapter.kt @@ -16,6 +16,7 @@ import com.gh.gamecenter.baselist.ListAdapter import com.gh.gamecenter.baselist.LoadStatus import com.gh.gamecenter.databinding.DailyTaskItemBinding import com.gh.gamecenter.databinding.NoviceTasksItemBinding +import com.gh.gamecenter.databinding.TaskBottomItemBinding import com.gh.gamecenter.databinding.TaskTitleItemBinding import com.gh.gamecenter.gamedetail.dialog.InviteCodeDialog import com.gh.gamecenter.manager.UserManager @@ -25,21 +26,19 @@ class TaskAdapter(context: Context) : ListAdapter(context) { private val mEntrance = "光能中心-任务列表" override fun getItemCount(): Int { - return if (mEntityList.isNullOrEmpty()) 0 else mEntityList.size + FOOTER_ITEM_COUNT + return if (mEntityList.isNullOrEmpty()) 0 else mEntityList.size } override fun getItemViewType(position: Int): Int { - return if (position == itemCount - 1) { - ItemViewType.ITEM_FOOTER - } else { - val item = mEntityList[position] - when { + val item = mEntityList[position] + return when { item.noviceTasks != null -> TYPE_NOVICE item.title != null -> TYPE_TITLE - else -> TYPE_DAILY - } + item.dailyTask != null -> TYPE_DAILY + + else -> TYPE_BOTTOM } } @@ -59,6 +58,8 @@ class TaskAdapter(context: Context) : ListAdapter(context) { (oldItem.dailyTask?.id == newItem.dailyTask?.id && oldItem.dailyTask?.status == newItem.dailyTask?.status) } + oldItem?.bottom != null && newItem?.bottom != null -> true + else -> super.areItemsTheSame(oldItem, newItem) } } @@ -75,6 +76,8 @@ class TaskAdapter(context: Context) : ListAdapter(context) { (oldItem.dailyTask?.id == newItem.dailyTask?.id && oldItem.dailyTask?.status == newItem.dailyTask?.status) } + oldItem?.bottom != null && newItem?.bottom != null -> true + else -> super.areContentsTheSame(oldItem, newItem) } } @@ -102,6 +105,8 @@ class TaskAdapter(context: Context) : ListAdapter(context) { TYPE_TITLE -> TaskTitleViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.task_title_item, parent, false)) + TYPE_BOTTOM -> TaskBottomViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.task_bottom_item, parent, false)) + else -> DailyTaskViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.daily_task_item, parent, false)) } } @@ -119,13 +124,7 @@ class TaskAdapter(context: Context) : ListAdapter(context) { is TaskTitleViewHolder -> { holder.binding.run { val titleStr = mEntityList[position].title!! - var top = if (titleStr == "新手任务") 16F.dip2px() else 32F.dip2px() - var bottom = if (titleStr == "新手任务") 16F.dip2px() else 5F.dip2px() - root.layoutParams = (root.layoutParams as ViewGroup.MarginLayoutParams).apply { - topMargin = top - bottomMargin = bottom - } - title.text = titleStr + topPic.setImageResource(if (titleStr == "日常任务") R.drawable.pic_daily_task_title else R.drawable.pic_fix_task_title) } } @@ -135,7 +134,15 @@ class TaskAdapter(context: Context) : ListAdapter(context) { entity = task executePendingBindings() - if (task.isFixed) progress.text = "" +// if (task.isFixed) progress.text = "" + + if (task.status == "finished") { + taskBtn.text = "已完成" + taskBtn.setBackgroundResource(R.drawable.bg_energy_task_btn_finished) + } else { + taskBtn.text = "+${task.energy}光能" + taskBtn.setBackgroundResource(R.drawable.bg_energy_task_btn_normal) + } taskNotice.setOnClickListener { DialogUtils.showEnergyTaskNoticeDialog(mContext, task.name, task.descr) @@ -178,12 +185,14 @@ class TaskAdapter(context: Context) : ListAdapter(context) { } } - is FooterViewHolder -> { - holder.itemView.setPadding(0, 0, 0, 40F.dip2px()) - holder.itemView.layoutParams = holder.itemView.layoutParams.apply { - height = 88F.dip2px() + is TaskBottomViewHolder -> { + holder.binding.run { + val isLastBottom = mEntityList[position].bottom!! + holder.itemView.layoutParams = (holder.itemView.layoutParams as ViewGroup.MarginLayoutParams).apply { + val marginBottom = if (isLastBottom) 40F.dip2px() else 0 + setMargins(16F.dip2px(), 0, 16F.dip2px(), marginBottom) + } } - holder.initFooterViewHolder(mIsLoading, mIsNetworkError, mIsOver) } } } @@ -191,6 +200,7 @@ class TaskAdapter(context: Context) : ListAdapter(context) { inner class NoviceTasksViewHolder(val binding: NoviceTasksItemBinding): BaseRecyclerViewHolder(binding.root) inner class TaskTitleViewHolder(val binding: TaskTitleItemBinding): BaseRecyclerViewHolder(binding.root) inner class DailyTaskViewHolder(val binding: DailyTaskItemBinding): BaseRecyclerViewHolder(binding.root) + inner class TaskBottomViewHolder(val binding: TaskBottomItemBinding): BaseRecyclerViewHolder(binding.root) companion object { private const val TYPE_NOVICE = 900 @@ -198,5 +208,7 @@ class TaskAdapter(context: Context) : ListAdapter(context) { private const val TYPE_TITLE = 901 private const val TYPE_DAILY = 902 + + private const val TYPE_BOTTOM = 903 } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/energy/TaskItemData.kt b/app/src/main/java/com/gh/gamecenter/energy/TaskItemData.kt index 642d79516c..b45ad0db1f 100644 --- a/app/src/main/java/com/gh/gamecenter/energy/TaskItemData.kt +++ b/app/src/main/java/com/gh/gamecenter/energy/TaskItemData.kt @@ -3,5 +3,6 @@ package com.gh.gamecenter.energy import com.gh.gamecenter.entity.TaskEntity data class TaskItemData(var noviceTasks: List? = null, - var title: String? = null, - var dailyTask: TaskEntity? = null) \ No newline at end of file + var title: String? = null, + var dailyTask: TaskEntity? = null, + var bottom: Boolean? = null) \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/energy/TaskViewModel.kt b/app/src/main/java/com/gh/gamecenter/energy/TaskViewModel.kt index 115c0f53f7..ddceebf9b6 100644 --- a/app/src/main/java/com/gh/gamecenter/energy/TaskViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/energy/TaskViewModel.kt @@ -44,21 +44,22 @@ class TaskViewModel(application: Application) } }, {}, { if (mNoviceTasks.isNotEmpty()) { - itemDataList.add(TaskItemData(title = "新手任务")) itemDataList.add(TaskItemData(noviceTasks = mNoviceTasks)) } + itemDataList.add(TaskItemData(title = "日常任务")) + list.forEach { + itemDataList.add(TaskItemData(dailyTask = it)) + } + itemDataList.add(TaskItemData(bottom = mFixedTasks.isEmpty())) + if (mFixedTasks.isNotEmpty()) { itemDataList.add(TaskItemData(title = "常驻任务")) mFixedTasks.forEach { it.isFixed = true itemDataList.add(TaskItemData(dailyTask = it)) } - } - - itemDataList.add(TaskItemData(title = "日常任务")) - list.forEach { - itemDataList.add(TaskItemData(dailyTask = it)) + itemDataList.add(TaskItemData(bottom = true)) } mResultLiveData.postValue(itemDataList) diff --git a/app/src/main/java/com/gh/gamecenter/entity/TaskEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/TaskEntity.kt index 7a091ffb3d..39ef23d208 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/TaskEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/TaskEntity.kt @@ -14,7 +14,7 @@ data class TaskEntity( var descr: String = "", var icon: String = "", var action: String = "", - var energy: Int = 0, + var energy: Long = 0, var done: Int = 0, var limit: Int = 0, var quota: Int = 0, // 任务指标,代表需要做多少个才算完成 diff --git a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java index 02aa569cd7..a88fc67718 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java @@ -51,6 +51,7 @@ import com.gh.gamecenter.forum.home.CommunityHomeFragment; import com.gh.gamecenter.game.GameFragment; import com.gh.gamecenter.message.MessageUnreadRepository; import com.gh.gamecenter.message.MessageUnreadViewModel; +import com.gh.gamecenter.personal.NewPersonalFragment; import com.gh.gamecenter.personal.PersonalFragment; import com.gh.gamecenter.video.detail.HomeVideoFragment; import com.halo.assistant.HaloApp; diff --git a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java index 5dc569109f..3a2d973019 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java @@ -297,7 +297,7 @@ public class SearchToolbarFragment extends BaseLazyFragment implements View.OnCl IntegralLogHelper.INSTANCE.log("click_sign", mLocation); } - startActivity(EnergyCenterActivity.Companion.getIntent(requireContext(), true)); + startActivity(EnergyCenterActivity.Companion.getIntent(requireContext())); break; } } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/dialog/InviteCodeDialog.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/dialog/InviteCodeDialog.kt index 3e0912d04f..5b976c143e 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/dialog/InviteCodeDialog.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/dialog/InviteCodeDialog.kt @@ -7,19 +7,20 @@ import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.FragmentTransaction import com.gh.common.dialog.BaseDraggableDialogFragment import com.gh.common.util.EnergyTaskHelper +import com.gh.common.util.ToastUtils import com.gh.gamecenter.databinding.DialogInviteCodeBinding import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.retrofit.BiResponse import com.gh.gamecenter.retrofit.RetrofitManager import com.gh.gamecenter.security.BindPhoneActivity import com.halo.assistant.HaloApp -import com.lightgame.utils.Utils import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import okhttp3.MediaType import okhttp3.RequestBody import okhttp3.ResponseBody import org.json.JSONObject +import retrofit2.HttpException class InviteCodeDialog : BaseDraggableDialogFragment() { @@ -87,7 +88,21 @@ class InviteCodeDialog : BaseDraggableDialogFragment() { override fun onFailure(exception: Exception) { super.onFailure(exception) - Utils.toast(HaloApp.getInstance().application, "邀请码错误") + if (exception is HttpException) { + try { + val responseBody = exception.response().errorBody() + val string = responseBody!!.string() + val content = JSONObject(string) + when (content.optInt("code")) { + 403091 -> ToastUtils.showToast("你已经是老用户了") + + else -> ToastUtils.showToast("填写邀请码错误") + } + } catch (e: Exception) { + e.printStackTrace() + ToastUtils.showToast("填写邀请码错误") + } + } } }) } diff --git a/app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.java b/app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.java index c799703a24..a44388b9d8 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.java +++ b/app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.java @@ -169,7 +169,7 @@ public class NewPersonalFragment extends BaseLazyFragment { private NewPersonalFunctionGroupAdapter mPersonalFuncGroupAdapter; private boolean mIsLogging = false; - private int mEnergy = 0; + private long mEnergy = 0; @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { @@ -581,7 +581,7 @@ public class NewPersonalFragment extends BaseLazyFragment { IntegralLogHelper.INSTANCE.log("click_energy", "我的光环"); if (mUserInfoEntity != null) { MtaHelper.onEvent("我的光环_新", "领光能", "点击领光能"); - startActivity(EnergyCenterActivity.Companion.getIntent(requireContext(), true)); + startActivity(EnergyCenterActivity.Companion.getIntent(requireContext())); } else { CheckLoginUtils.checkLogin(getContext(), "我的光环-领光能", null); } 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 1e070fa220..9c092580be 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt @@ -34,7 +34,7 @@ class UserHomeViewModel(application: Application, var userId: String) : AndroidV var availableBadge = MutableLiveData() var availableBadgeCount = MutableLiveData() var playGamesCount = MutableLiveData() - var energy = MutableLiveData() + var energy = MutableLiveData() var level = MutableLiveData() var sign = MutableLiveData() var signStatus = MutableLiveData() @@ -145,7 +145,7 @@ class UserHomeViewModel(application: Application, var userId: String) : AndroidV .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : BiResponse() { override fun onSuccess(data: JsonObject) { - energy.postValue(data["energy"].asInt) + energy.postValue(data["energy"].asLong) } }) } diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/border/ChooseAvatarBorderAdapter.kt b/app/src/main/java/com/gh/gamecenter/personalhome/border/ChooseAvatarBorderAdapter.kt index 738041813f..f82f98c7fe 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/border/ChooseAvatarBorderAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/border/ChooseAvatarBorderAdapter.kt @@ -54,6 +54,7 @@ class ChooseAvatarBorderAdapter(context: Context, // 商品挂件但未兑换或者已过期,显示光能 !mIsFree && (borderEntity.expire == null || (borderEntity.expire != null + && borderEntity.expire!! != 0L && borderEntity.expire!! < TimeUtil.currentTime())) -> { isEnable = false holder.binding.descTv.run { diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditViewModel.kt index 77a5ef4941..70ef6ed91a 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditViewModel.kt @@ -219,14 +219,15 @@ class QuestionEditViewModel(application: Application) : BaseRichEditorViewModel( postLiveData.postValue(Resource.success(data)) EventBus.getDefault().post(EBReuse(QuestionEditActivity.QUESTION_POSTED_TAG)) + if (!questionDraftEntity?.id.isNullOrEmpty()) { + EventBus.getDefault().post(EBReuse(QuestionEditActivity.QUESTION_DRAFT_CHANGE_TAG)) + } + if (questionEntity == null) { tryWithDefaultCatch { EnergyTaskHelper.postEnergyTask("post_question", JSONObject(data).optString("_id")) } } - if (!questionDraftEntity?.id.isNullOrEmpty()) { - EventBus.getDefault().post(EBReuse(QuestionEditActivity.QUESTION_DRAFT_CHANGE_TAG)) - } } override fun onFailure(e: HttpException?) { diff --git a/app/src/main/java/com/gh/gamecenter/security/BindPhoneViewModel.kt b/app/src/main/java/com/gh/gamecenter/security/BindPhoneViewModel.kt index 2473e3ed66..1c922aa1d7 100644 --- a/app/src/main/java/com/gh/gamecenter/security/BindPhoneViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/security/BindPhoneViewModel.kt @@ -109,7 +109,7 @@ class BindPhoneViewModel(application: Application) : AndroidViewModel(applicatio 400302 -> finishLiveData.postValue(false) - 403092 -> ToastUtils.showToast("邀请码错误") + 403092 -> ToastUtils.showToast("填写邀请码错误") else -> LoginUtils.outputErrorHint(context, code) } @@ -201,7 +201,7 @@ class BindPhoneViewModel(application: Application) : AndroidViewModel(applicatio 400302 -> finishLiveData.postValue(false) - 403092 -> ToastUtils.showToast("邀请码错误") + 403092 -> ToastUtils.showToast("填写邀请码错误") else -> LoginUtils.outputErrorHint(context, code) } diff --git a/app/src/main/java/com/gh/gamecenter/user/UserRepository.java b/app/src/main/java/com/gh/gamecenter/user/UserRepository.java index ee3edc9947..f993acb2f5 100644 --- a/app/src/main/java/com/gh/gamecenter/user/UserRepository.java +++ b/app/src/main/java/com/gh/gamecenter/user/UserRepository.java @@ -268,7 +268,7 @@ public class UserRepository { if (httpException.code() == 400) { LoginUtils.outputErrorHint(mContext, code); } else if (code == 403092) { - Utils.toast(mContext, "邀请码错误"); + Utils.toast(mContext, "填写邀请码错误"); } else { Utils.toast(mContext, mContext.getString(R.string.login_failure_hint_code, code)); } @@ -458,6 +458,14 @@ public class UserRepository { MessageUnreadRepository.INSTANCE.loadMessageUnreadData(); } + + if (UserManager.getInstance().getLoginTokenEntity() != null) { + if (UserManager.getInstance().getLoginTokenEntity().isFirstLogin()) { + EnergyTaskHelper.postEnergyTask("register"); + } else { + EnergyTaskHelper.postEnergyTask("login"); + } + } } @Override diff --git a/app/src/main/res/drawable-xxhdpi/bg_commodity_tag.9.png b/app/src/main/res/drawable-xxhdpi/bg_commodity_tag.9.png deleted file mode 100644 index 12dd6bfc0f56ff515f45ec05135cac496a4d7806..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4181 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 L-l>}X4h#$cZ*WPQL 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 jOj5*cj=uhT*Z@(70Ei7hFp~N&`5)>(VeD}9 diff --git a/app/src/main/res/drawable-xxhdpi/bg_energy_center_top.webp b/app/src/main/res/drawable-xxhdpi/bg_energy_center_top.webp new file mode 100644 index 0000000000000000000000000000000000000000..ee4e1c291c5915fda220433200a7beb6419a67b3 GIT binary patch literal 75836 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/bg_energy_house.webp b/app/src/main/res/drawable-xxxhdpi/bg_energy_house.webp index 69f6559678f50413c7b05df95d5e9d94b770b554..6066354d5ff765af2b53beb2a07b383db7f841be 100644 GIT binary patch literal 44912 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

`!-e@(Wb_hosQ9``$Fgl)ILRFzsGfr~_`qC6r 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%0A|16a8G|@ex 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 diff --git a/app/src/main/res/drawable-xxxhdpi/bg_energy_house_roll_notice.webp b/app/src/main/res/drawable-xxxhdpi/bg_energy_house_roll_notice.webp new file mode 100644 index 0000000000000000000000000000000000000000..a3b9f475e119a932f0dd7c07e6023050af3d76bb GIT binary patch literal 2136 zcmbtUcTm#_7XAgI6zL^^sEG{}lp-u(A)y5V(ge>SXgEMb7r}r8FySD8frZdJO0P;? z1B(=;C?G{H6cIy_t`Z1@NJ$_h$KK5SaWi{2v$NmKoA=K*-}k*YZ=Qptxw*YC0HBd3 z_BZSeoJ0WtklHUO7zhIZV{3a90t5h{wT?y~<=)=(oF=a?%F^q&kDWIrrSG2{*r?C% zcsD+f{BytFvr1z-P#S=4@F^X*TA_;z3JM}|B*p0Yue;*E^TC4(Eqz66gRad->c@A+ z%O-5&zECIAtDy&Blt;In31m(Pyf&n~OtC$$#l%|p+BYD|M0h^YH7&WWmU}bY z>V@1t&X+5`EiyInymZ?iT)7l*SZ_n#Rq+uV)jjWE)vGweXCrut{Q3XcB!>urJB%UolQM?0Km7Oh^?w`9N=JY(r4hzBsWN z`eAE#FGjGDvAz4&YvZucU~z3TG)=R)eyb+4e{qn$lVTB|@vF zh(~KMZS3q_SDyMc3$_hI0>mY7A1)YvsO{xv@b$UCcK#lE9X(UYm4suucQV2JaS;!6xGYCvs2Xmaig{UM1%ycPFT9^*i`@UZOZq) z`_ZrbH!>eIUwG=qn0#}3;@l|AR{}@+yFNiMTWf0-lfuX}ceFNa$t-E{97-FJ^j%!i zpapp9z8kj?r=Rk%`M;draUIhjP0PUk;^o>V*YZgUOIV%fsEZ2yDL0Wn)|M#6k6h83MvR~^ zBr3$gpH*7Hte5rlwpYoQaQVdvT>F4 zH~E=ONRdUqn+z492)A6+X_oMh2>v_}Y0G>mLh+&=Z)eJ6PS502_LGk>EB;x_06DE{ z8jkuzM=>Q9+bWWy$ludwm z@o!d#jtyWn2a^4+^R{i<&%(#{Y7rfNEv%uh;fx*QSU!Lf^6)Ly@LFq7ItWYDiZ(h>=6aF2b zTW$!`P4Xu5Rsv5@NPA;Kp$QVU0;U!PrnS?f*a#Ib$+>mVna5i4yPnnhZjQ30$-#84 z=!RMyo{>;wzROsRok5s;E$5_NZ6YJaUwUg+ox~d94$urZS)vd}+Kr^+9lxoxy5Zux z7I_C>s&mRav}^J12WC%(RLTbql(?FF9>>;D}~Iv*CQo54Etm)u3wBS5XE)G zzK~Ns^v%{rHum?dg7_qXDpMW2>S1>;9aMEdMjvwg;|TyzCl$_wLyX)NR;1HBbDYl= z48s6GOh@4P)O?!+Mth|Z00i{BganGIOPZh1lzHuW14}pR_YcYLf$@sxkEioTN6z+# zFG|f9QAY|3pXJ!%qT54j5<88tHTQ_s$=C2Gk@mY9Q8@MGARTfV)NipG{`BbDaosGu z-$w|=U58HcoN=7OJ@=0#0-$J3Q7NO^Dc#YqH>)Z;-of?ptJ3}30m!ii50rjj3mKv} z)n{ZdBh=)6*~q!;%&QU)h48D^NH$GI{g;?4?tURJqd$Ge^j4(~joN(>e3l+n@=X2L zia^Ce*drzMa^;aY0XR|h{djEGmBve{Q`y{Xh!mzqP3kZodPDLK~B0;0h*M-?lUKketh~!$KL^jdp(-W9qQas&UoJJBmR{g)- zrwk4*#FuwcUG5qX_evV)G>&4#Nx_c?%;Z{bUV6=VxY_V40OG7uekxr_k=!UhWQSa` zd~zSgkLKU1r+IfXhk3a7BOKf;?szOsl{&X1m=&Y=Q3O2x_8 zhjyIDnhxzdx$-(zN?CVU(1Q6ZJx5obE)zRf62~%&MW1(KX?9s)=vWtZyySA)>oxu~ QQx_4W5)mc|-amzZ0i*OessI20 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/bg_energy_sign_dialog.webp b/app/src/main/res/drawable-xxxhdpi/bg_energy_sign_dialog.webp new file mode 100644 index 0000000000000000000000000000000000000000..b0c53de4afbbbbe0c94cd24b468298a25ca3e527 GIT binary patch literal 2312 zcmWIYbaP|iWMBw)bqWXzu!!JdU|!H7#SECuP<0JQ6=@`jQMZw zKkw}5U{O(ezGn0Ny!=_M9f#c=a#TDgnjAmB=f(cDe|v&|b-eh`vc-J=zslNQpKsay z*{@$8|M&d=KkNOaPW?>PxL+rcy=L!c`~RQ!uS?f>KC5!YzP+aJe$D^?GhV*fKJ4?k zn7W~yZ8$z(Ecr+ z7k{fAEc;)d0T^cr4(tpJ0qYp%GHNNXeqppTl<09$vR^2$qKEMZGs~9k1-t(<@Vvhw z`u_{t12Oe_2CMzw4%Gkua{tBu&r|O;zrJvJ?uYyj{0H9Ocz=!m>%QsF8U8T*HD1Z^ zNA(ZG8ivnIf0#coFJS()LOgW60e@Y_#l>#DQYJX5x@jJImg-k}O3W34k6m3Iwl->O z7EVfG{k4NdPHNx$R{2KG_~(d6CCHQ|x^tbKUc5YEhSyA>%1h>J30REJQKNE%!WU@1q_^?}tdtDm+c?&Hqx3rxfXxGX9hmt@u-W&55qgbG>!0muF00ebl_}#1+f?B6oi)2RyF{ zE`QVOJolsT{Y|EP4m&|u2fbo^MAZ| z^O>{Wy%*ZLQy>Gr~Uma+Z-P6vAB_U zz?1!pX!R_~9cu9|#d8}!rcMwuw2Br;m=ihU)bd`}m#JQU*R#$&XZHKKfFY>4^+S5| z)b#&H+yCYSe(e4iGv9%!{lS`dclZDK_kQo4+K444m%iKWe`LD6RINt(y}R+-sAs{o z>n0st5iGWD=Cp_e3$Hv;J0Z5%YlUe~1aj(YEdKwGQnbJLU-tbJ_v_y$pV;+dlg{>@ zUis;M>L;JX)BT15!?BJ~9?Ek;2x5kO+{{*m`xpH8t6R)Ve15TsE z^m?{%Z;ey1gG<0Aqc;DJjgE277Z(>76wals|0o=H4%A8h z(lgpOs9(*ttaE+rJjyfoyUC~8g`l@;Ow;W`+CdY?lwXceMmhQO;dzd9WoHeu=o3{jtE$2(7hI2dZ1?N;ll!4{^92GERantEdMtbRkDQ~Zw-lLE2k zLvdep;fveMmthD0@!R@y{r~und&P?6E@lVB&40!>8qGWwLH*b0>chsgzi1a*6#Xks zwZDv3lYKyc{2g^i;f(=lHv8+h|HA(1n8g3t=s@3^z+ja6XTSgo#kECKRvhK#xF8im zG>DHy%=WBdw&V!%fX;v&($GK)3l1pFP|$}prgW*5j}drpVe}1=6IG{503U`MS^;RM z<|u-^Q@W9EymB=|tRkdMPL)Qsi(<-Zc9fozxj0olit^iQ~&?~001+-&-t7A zG|>E_CZaE0e@n;Ca=c7ovcaOnT8%jmN_amVG1$W=p7I`{M!JyauqK!Pu>#CIc9zqd IcpQiT0FhqNSpWb4 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/bg_energy_task_btn_normal.webp b/app/src/main/res/drawable-xxxhdpi/bg_energy_task_btn_normal.webp new file mode 100644 index 0000000000000000000000000000000000000000..8a6b06258136a8fd1aff6eae1a832e1a52fc423d GIT binary patch literal 872 zcmV-u1DE_#Nk&Fs0{{S5MM6+kP&il$0000G0002*003(M06|PpNQ3|Y00Gyapp7Io zd3^Vb0^Y|*M8J3TRPJNp;v$x@qX_#VFp?xm$qvp6uKWL|`l)du`ac28Q)w_2i+*Ay znX$)d)R6Gr~lme5dcStN;CpK>IXjgz!Opd-z09^3x1Wqky-E z+&kIECaC`|v?0uR?Xu10{^L}~|0R`3Nw#2jUpQ}tP}A0nlT{$cGo3AC?(8K0{7ipl zp*WVD8}Rf=N0009a*eC73FN|qM7@qqSTEDrCD$;NAB2WCr|G=NJ_|YFMVTot4e1@O@*Tc`XCa+0B_wz7jpmnjY zSe4%WWZChja(lNz38ig$mx&GM=}9V&w9{go<|(gEi2?Nj>TEE772gTi68KBH)c@Ld zrXLkWiP|Bo5gH48ssCHRQy%0002hr?Oc9 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/bg_energy_value.webp b/app/src/main/res/drawable-xxxhdpi/bg_energy_value.webp new file mode 100644 index 0000000000000000000000000000000000000000..f7da39ab224580deccc4a63cb3e08b338dd3ee20 GIT binary patch literal 1808 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/bg_task_bottom.webp b/app/src/main/res/drawable-xxxhdpi/bg_task_bottom.webp new file mode 100644 index 0000000000000000000000000000000000000000..f510454845c2632e8985737dfdc46b2a60ed1a0a GIT binary patch literal 908 zcmWIYbaQKAW?%?+bqWXzu!!JdU|wOD_1-)funCh+Y44_5bqKWaR#(p5OF6-^DkBZ213P0O(?cV@wPT7YrEYGHNNXCNS6;N_4v@ zDJ~S~ty!YL%(7*B!S0Cux=7Zo<~;2G|NGV&?JD2TQP1#)p%;k%8n0ydqxy$oA>$wB z56lagf31+%5?#A4s-rNyX3_K=oA(8J--*1hvGkqJ`zb-+#mY}f=-RB%)X@x21;&QwpwTESi?~o(zWXt;Z)?h!C>wRt4YP$gR73*WXdI z=$h?d+qI=oLSqjXUI*U0$-d`6H;b@<%1rjDGV{)vx<;&C8w%T# z9XmwTK8iCfxu^6XWcHC5uE`bMjX}gKVcrzQaryznzyGg1{{Ou8#!~)Y|L(&Mz!b!> za&h3)reM1U@#K5sM{>7l*#*En{)5}QofkEzr|`^{}1R8`=0x+eg5D7 zc`J)!eOv$c|5ZA5c}`*4p89ra-nSe4{Ss#!{uBAW{_HCmul?e)WfyzMuRni9`;T{x zzei%Ni8c>|LH|6(vZob6y0-t?_%S$EM_B6Er!lMTad0Lh?|35nX zZ=1%CqyP2%|0ggye+VnjyZ_H;m!3;_^434r2aT40e7Y;_^oaunGFn^jHuoJp(!ZQ} ye)4W5mc0gVx;Qrd`76`6hC$;0i=`JPZ!cDvxwhg|_~n3-tSeEoweA9ghyehxcE$Ao literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/bg_task_top.webp b/app/src/main/res/drawable-xxxhdpi/bg_task_top.webp new file mode 100644 index 0000000000000000000000000000000000000000..8b15d65fa80f5c39d9a6c789d925801d463e8fe6 GIT binary patch literal 740 zcmWIYbaT7I#J~{l>J$(bU=hK^z`!5?#PX~R-3$zlJ^>ybKptcKf^8F*nEeso$L_@c zS5VM#|D1meCSeABxvM#EE!JI9n$sxu=J3@0Hb&ZPSEMig=M1>GbO+zj(A4<2Q`-N3 zPd1KvJ^kXXRK?KT^Z)Da^<3MPCV93Z=r&Xm z|9|HH|6Kp?{QsZ!|DVG-_0ySvE>zG1y7q$s!(2u!1=b!0J41;c7yE?^1wt5qFtcpg zUa&i&{|#p&m-Q>=Ty}frSN|L2IT+YeLW=Pz! z{;}FX<^IH-rwhfWF|J$oU9d7i>Qz1_hhfQz3iW20o`eaG^P)GIVKWfPD(7R0&R3Y3 z_sE=PxE@^Hv1bEssrim>Y@EeKr~gIVz$%4X)4G-`C8#k#eJ+TB7tx3aiREfvjiso nH4{2_>aURLSIgc$|Nn+dRj)q_?)kBKl?MZZ-=PJ-G>ZTLq={c? literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_energy_center_done.webp b/app/src/main/res/drawable-xxxhdpi/ic_energy_center_done.webp deleted file mode 100644 index 91b4014f6d8d3ef99cf0b273a5faa6192e3b2e9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12152 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≶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 z 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 *DGRFBK+OdqvKd0^qNGBt>74# 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 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_energy_center_sign.webp b/app/src/main/res/drawable-xxxhdpi/ic_energy_center_sign.webp index 953bfd59dfaa167874b0c9adf5fe14b6dacb52b7..9b8efee3ed5d7b8ba48f1a9cb99f3f6dbb2c2487 100644 GIT binary patch literal 14936 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

a55W%g@JQseXgBbSJKHdgU-ig-{%iTDYeF`iQ- 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 E03_!JVE_OC diff --git a/app/src/main/res/drawable-xxxhdpi/ic_energy_center_sign_normal.webp b/app/src/main/res/drawable-xxxhdpi/ic_energy_center_sign_normal.webp index 1091899a70aa2b0324404956b4236372c6bde15c..5cc40ee9b8a1e13aa9206e12e6256300f3c9f096 100644 GIT binary patch literal 4368 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 Kmg0^80000{>aaWj literal 5662 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 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_energy_center_top_energy.webp b/app/src/main/res/drawable-xxxhdpi/ic_energy_center_top_energy.webp index 5b73fdf836e227f5f08f578c3025fc1ffb54df37..fe0aab95bcb99ca8f6524790049eaf0abd8cb4a9 100644 GIT binary patch literal 2512 zcmV;>2`~0iNk&G<2><|BMM6+kP&il$0000G000120037206|PpNb>;z00B3lG?Jt^ z%g+5EacCkU7D7)X`Z{#&@Y&iYuSFlC(Z&r9+elKR+53Asre~(kKgXxr*$!YQqW_HC zws90x5(Sg{&cxLEnZIhO`9*Agtu&VcZ_hiW+@@f`!hUPKbJ6)@&IpE zCZaB_&ro4?D!QsG)L12ovOQE;CQ2s53(8)DiH6w`0UW2|uXrE`E5uiaU^?;QRtU&^ zib}dgP}}h-1h=UF;|<;m-dA{k#G8-2 z^@F$G@z!VFe!|=TX!|wq_=0vkw4@!sQI9u?$H%wz(@5!&eWOXBrb-u2-aogpA|;v?kGI`LHm${#Dl-z-SR zA5Ao*gL?6M4HHq4DVJ-@L{X*KxvUahX|2@6txiQYa+Yj&ds z{C8_I3C}I^cC$ZSZcmGs(|*(D3nvNy09H^qAg%`h08lIdodGIX09XJ%F&2qKA|W9l zsPj8uKn4kB0K?z8L|40hM|)gaAGv-4{BO*ZFaedq)5F%>eDs`%f&tu>Nh@$=s#$0Pnf{m=5>%Xd=FoxKjfx_E$i)Ar~0FSc*658?mDf5`o|e24#S_QCGY z=dba9YQJEg#lMgLY5t-93;xgckN^MrzSuo#`VRh+8dORG+>#H6rSbkz&?wGba$_%& z)Lin1=PIKXo9y;?WR1T}WnZ~)E%8Qn@ahB&6PpX>no4?Hkf!nkKx*2#_oc{!okh27 zcw9pUHWPaY*u&>C@cv>NHo$f@DuepIWn32!#?{h3@(@JnANC5_tLNbTchfi8D!#ro z+Uqwe7rs)_&LShWr{N@;(ZJ=Uy@mb_v7rt`N&?^j0RI2v;ae*&{iW$Mtn^_=ZV5l~ zyXqxa086V*iezb1&5qDpqA6W267JmTE+&%`yvFdnc;7{5$2k4K{0AmR(|8^$k3-Iin{8Mg=f3)!E+q`06wI}(Ok~|{i$;i6Rsh` zNWX*qtSHLhm`?*m3$Aay)(hvJR0k1HZV{LYUyl31}XM`r#)VMI7K7eb1G&}MYa%I9c4LJnz7v#D+ z6#k&SP=&Y`7fW% z&LD$-)(Zq5+YS$ge{lF~W!7*6)|yzuw>3OwFiMe|^4Pp-_T3;dPjIZjwhvBZSZo8S z%h%KZ9$4nwe-Jqw&_xNqR8$lemDX7(x`EtB#x9tqF4pV9zeaL9B;;&nax~H7 z--{oE*}iZ*x@S=+HCtF_+_Ky@81=8(S|{>VA^#-bIT-za2e+T6)+Xvq?U@du?(4@T z-5>D1j~(77@MdL3N;;ST;)p;_owkMDKi7y+a$e3^%*V@ph0U=oXAHLf8ua|3K`6-p zGa`U|=*)F7-VZ3z++9Ju&*=<*5#>kZFdXgZtAc|-4tc5L@ch^AP=Pi3?;7Q)4A74( zD4}zjun~w3J7geO%elbt{(Rt}i%%E<-8bT6!Y3BD68gcobevxc+P@KL^TZG0EKCm&YsGOZ;koCf*lRuXj`px~qBu=WnawoEywas6Y`0$#o}y ze_pr&mv8+Unf$-crurbvw!w#iIGg{09Uyocq8hqIMAB3Sh3pYq2tVC(`XynOtEb|a z-{U*Q<=9o-b3s3mdi>NB_KXZ!EX1B>*o(}Hb$w_x>*zmmWBeyqP_ zAfkG9mNM)UK0=s_VUB#)VQ!V5nX8Qrg_k0;@YAwj7tQRvnc9|GDaDI^>IC=hw)(!$ zs_S&Uch7<*UkZKtb9^2@%3V>7I_Wxr^OKMD<3zQ9)S}8xpTs6zDbifK(p7@Dng5Sm zy+xIe>Gz1;N$XS2tt5xWt#jFR3``j375W{j<6(*6jbV?*oHTmJ(_%Kxu|cx-1nD%^ z%L{4?>wI?z6M0wPdBwM#EK&iBC=NM`p1CVp@j*#5mV&y310>Bd>*ML&DWQ4uqQq1VF;@$lOS-7^o;ko-jDzQ00010F9mD> literal 1954 zcmV;T2VMA5Nk&GR2LJ$9MM6+kP&il$0000G0000#002J#06|PpNSFZt00AeVu#u$X z4R?qBTcwDINWjlC3Yz6!q7o_64&5lR4vC{dIFN0-Ng)3xHhK~1?eBk)K`D7IAfo>a z+%{5_?Cvqs%ss(7(D!{s#MWn=S4}@H%hWej9>2DIAyRh7yes|^mhCDBu5B4QK`F(z ztdo;=*^TXvdFR~Ls}!+*6ti4#E*@HwQrl`zqLWcBIws~kL=@EGz&aqJWBhF+IvT`@ zL!{Zxuv307wn-Op3B9k%<$_B-}%wgq<3sW>;)`$UU4 zcZqf&3I+i<1Vo-^mr>f(0v<2cmwYqhFp+egI@r#I`Ds1Me^?cddVCH}Pf zs{b?VVDuUNhxIc5AOCCnZ^1w87yM86zX3n4*E{%O@|eB@<^xz4^S(R}??09PEFX;C z?e@iS*GzBvPx+rv|M2|H{Kx+j+ynVv^gr{ToZsI*XMKJC$$Jm}u7_#~^I9{kHgvaB zno;4&;pWjw_hn|350t*b-d+VMoMZ84K9;2dFdLxPFkBA%+=#cZv<@J}-*r?H@?%B+ zIWYaXZGN<0o|z5H)fd9r-|b!h3Epl;9^OuME0XMr0p4;N$(RxQ9Z+=Dayy-1DPSW8Yv^;|+1^FVQ#fBkfc~@9B_xT3 z-UV3tYD>Izrx9#EJvS8)e{60}ZX=c>{KKb_vHPJ;1D^{taMu zb`VM5%)m`%4OQ?(*p5<5zNjJDf3TNahxYWGtG{r|K#%$g~cPu-s6uHY(%y~%dn#byR39wQ$W{tCZx*8X=30-#Q1=D;=^%RscD{Z? z`1R@SQGgoyE1W!3V@qFRX~8&q-TL_RqsqRtmwl}PNd}dk-(F)hanf6YMauW+Ry05V z2BW_J<{_xCqBN49^6BJ1FPq#c^T0RsZEme4<#S@1fOJ$A*5yPVe3hr6O@fCXN~iz7 z@wI8Hb=xOmKbq=&YTIkpBIQ?L?nlLV-|t)9Qo6Fj3m^DPPpVED_efc0EA3cG8}V$9Dmnu^G#DXnVF+o zlo>ghsHdWG@6V+X4u2Gm$HqRBQ!N?9dO|bYJ%@7Ot6OQtKaRT`%L!Vdrv7CpEWP$Q!S}8h zb$^~vF!R%1(d@hz^9WI>KXkmD;nf>vt_Si3%zIjb<;Oj0 zER*)lD{$%{^FI1nA?wt+(|Dk`X6J=c7|s$EL^B{(boV~l&bY8CW8%AKygxZz8UITh(%~ogHjCElDaDIqPI5Oiw<#aaki2k&*Og|D*;z{L*)=Z{!`f8 zANU#Jp)Xi3KxAuU_A5~7U6x3>Pj(H*W+>fo8}Rve>>rVpFbnRKcca)j^L5@@w8t{D z`7zl8>*=mbaOhS+5E|SFid-5%kA7?AV6(qF9nnjIg_v`I#Do0%X~G$a#l595g>7bg!}*EGp7+!^HKT5}o@Tftnbqo@!{>=KFs+!W!5B0Py0@N&o-= diff --git a/app/src/main/res/drawable-xxxhdpi/ic_energy_tab_indicator.png b/app/src/main/res/drawable-xxxhdpi/ic_energy_tab_indicator.png new file mode 100755 index 0000000000000000000000000000000000000000..87d6ec6bc261ae1fb17074e61c8fdad216f0cd80 GIT binary patch literal 1158 zcmV;11bO?3P)jdN^m?!+u{chB^Dl^)+zhk7VyYHH-P=)p9n~c{;PYU$(b%$Y0UgtQ zD#MYrBnhK>dlp$Ziq>qUF?e+L``HG?A}^!5yKv_u`|;OqL7I~8v%A8Kc=UOUc?YP? zn~6vg%L>xa+?VzOv+g4Wm`L!=*nZ8Or8u*EJEKrFHg)z|FPk+UqSy@M4^ zr&HLA2E`&>s6J;eZ~-BFj(CIkoBnakxe~ziwGr*W=uXGsg-!ykFXS3Dfa)!dMbc~; zMD%I=tv|csT`urQ@3owtilX|6tB@i;5eTizF(^EWvecE(jKaS_8~)HfMAS8Zz6gWe z4?;2w+~_`poTD-1%Qk2*{5^1wd$Iq&a!07C*+zZvM9~`MAf~G((Sh=833A71Y+ajE zLD4;^X)i%ERZa;+-=)sGCv(Y_rssnFXYbXFP47VUCD3Iqn3qCDJ|Ga1s)A0yd-axTDs@X<*?+0x5E zs_7Ufavbz4RE{8?6ZjVoA{!?Q^0n8)ucn?UU5zI11s+1>?y{PaNx+g<@P}TVolpL0 zekl4V#vDMo%JJcg0SX4>6mSM~9F=i|B&ZJ+AHq_UdQfjM@~$|R?8F~>JC`%}x?`w& z1Igs4z;aiCDh@2uc-T%u=>2@D7v2XAMOIsauW-u-M!(new=EU)E3r6;WUQ;n9Y9o$NhH;OwG#+^ z!sss0^xU!lpVL^12C1EqBo*i%N zNRKXjjapw2SaPV;YRPBn{1}uQ>95axjGfznawp2I2&*q_FVjmY`zO5}hyeqL44~#1 zmUY;!hq2eSM_e9*=E@_rs*uD|H0eVvA0G8#@F1y~%#34s#_?EV-1N*yzW=Q3k5@Y4 YKU0KQFv{vm#sB~S07*qoM6N<$f+K)A;s5{u literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_exchange_commodity.webp b/app/src/main/res/drawable-xxxhdpi/ic_exchange_commodity.webp new file mode 100644 index 0000000000000000000000000000000000000000..ee29433c00aa20afda3a8f0ec787cf0ed0e68b5d GIT binary patch literal 12402 zcmV-&FpbYrNk&F$FaQ8oMM6+kP&il$0000G0002r007?r06|PpNQedi00BqFFp?w@ zdhX>Pw10#U5qbGP-o~DaK?w4aXF0MJgt85WBE?V)a@$)B*^(_=|(8N%5aa6M|E!)_Y6KLOIMfBRmz^`}hk^|1N)yDR8=Ba?g0G=O}v#}EoV zwSP~}QVj|-dTC53`M)ny&UvB2HX~6dRNu0Ki0IM9g=t~DP83R`kBDYO3QTnReoCb%6}Avx3{2RVct_PmKs=~uAe9j>oebog6$tD1n*uFg*^L#`qpPeLBIK}@*e(P z6nH~*v%eM|=Ra2p-sN~mZH55gjGu9q7%04qw(J{(VSk3!E2(wwafIWgJ?|=~eA6BQ z%glPkv>*7tfaXZMN+J*W0-$~(P{*_jHz0yIQyHP90;r`CRm2gj^fO85Zm+ZWTey7V zt09hnrN937*Z+R)cU2KfhTw8=fg1EQTzvYKK;1^DP@oFl43n{*bzB+sTgL&C{g9(7 zCa>i9Q5GBn?{UO?H8n&_IChVK<5EvIN1Z8hTG}5K042Y5iXuW~2-VN;2&o~CfF%{Q z8Lh;L9g5n`dkuvm{LBvWNJtzIjYT+U8;gh*IdQkf7f4{Fc zt;>4^)6D5<@8Q!gOl@bpM&MiFO#?T*L@?0AtyCcn-SiHD&yg%d?m~QK*gFKo@vewD znu1u{bjB+LO~lb>7Ij3#wokmlCq73+vISexZ^JL}TevOZMH3L4U)~D4w|bj-&P8D> z6s@S4fOQ+Tjl*p`XsYECYbv75vVU)N4n#b9Y8+ zp?4Nn$nd$hcEe^Hmsb?uNe;d*u}XrNh7l$1V-BBPDXH%Q5zS`Kk0ohB%i97#L^0;h z6xKBE6yT{zA#-u^lz>l?xmw!`p10?dyJ!!1UWzb})5m`8wkzv(5+9Ah#_w`p{VTBP zDRv+4v0>+{aQO0h71Rfo-fpSi^d%57FV?95gD!JHx}M{@)-(tTgxH-$wTzE;b4OOqVG0bRwPMn3 zKx|ga)@JTZVoKDl5F;YZ4#bxYWn{Tib*9J}rgV+v)QFPS>Y4`CK+R}I*Jzokq(<~e z^@OBG#8es5DV3vACuTOLODiRaPo+O`-zWZ4T%Ib?8PR0jY>W|2LY;_^sdetWiF26E zc+V;cV!G#Tm;KM@CRfhY84za`C1i*#+fTb_$JR8LQ*jXkWIVA#hEM$K)D3q8M2%d& zA`xf6j3uci7b5l#j63i8NIy4Q8DkJF4`hf32Syy0J=V$PL6V{jrsb)%GQ{ptCsFnz zF85RA46q3^n0AuS%@PA`R9j@Cw)q*SP;;$`B0UNlqVUw)C5W|Ye>i_v_xZ$4&WSJp zPnst~#EyTT$kV0n7r4oJewe|y7*jHQ`mK}sIJx!jT%IaM2IxC6Awlfj_K97e1jJ2N z_zc)Z%U4Sf+fLC9JI?srmLMWcbPt*>TzR zpR)bjWEI62+*2kHajWde8{BNw+z&R?BR?SC299MW(xZ0|c@+Zm)RNXp5>3wfwjCXt4io z{^$Bj`+w~h%KqGX=gO0q|J8qU{owxh@RR+|vyaW+?ti;{0)Cl)i~jrj!~Ms*SM{Ix zo}mAfe^vj5{wMe6<@fzR`@iy@>p!-Co%R6!as7+$)8fO}%ltR}k6;hw|K9)adpUo~ z{jvB!{j~qX{*(Uq|No&c=fB=R?EZiJfO-IMlz(Xai}z#T|JnZ{e|0-{{9Wts_mBL4 z=Kufo7U@s={*3=C`%m`I?;o}Q;s0@dKmRlNQTs{jKgjQyy@0!18|PSQz5u9-XHYB1v6PFhlQbJ8p;zBV)|O?#>Z?l+E*dmZL7<^qL@&`E8C~kzD5wW4GrH>mDFNS7UNpTvlTl zudQ|@ehrA8VthZfh44cmsIwIUtMlTF<$GQ)(rX5JSyFWffEbAQO6 zVP*z8p_H_igCz2+zOyH+@dlG7k={JQVG5J+{omzhMmJ9Fe%xK?q8F6v(?bxKoOZ

iWu}c}I-?{2lJP+_ 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 ^1} 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/pic_commodity_no_data.webp b/app/src/main/res/drawable-xxxhdpi/pic_commodity_no_data.webp new file mode 100644 index 0000000000000000000000000000000000000000..1344da702c2623bd6650215f4f52108b995aadfe GIT binary patch literal 29770 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 z%0D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 BMp^&> literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/pic_daily_task_title.webp b/app/src/main/res/drawable-xxxhdpi/pic_daily_task_title.webp new file mode 100644 index 0000000000000000000000000000000000000000..e603bf17a830c1de5ec3f3643b8d207423ea7533 GIT binary patch literal 15178 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 E0Jg=s&Hw-a literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/pic_earn_energy.webp b/app/src/main/res/drawable-xxxhdpi/pic_earn_energy.webp new file mode 100644 index 0000000000000000000000000000000000000000..a3e201dc65404747653b967a2c389c927be0710e GIT binary patch literal 5116 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/pic_energy_rule.webp b/app/src/main/res/drawable-xxxhdpi/pic_energy_rule.webp new file mode 100644 index 0000000000000000000000000000000000000000..99123d170e1fa8b2a3b1e68eb43d3fb44bd8cf3a GIT binary patch literal 6544 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 CXcy}M literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/pic_energy_sign_dialog_top.webp b/app/src/main/res/drawable-xxxhdpi/pic_energy_sign_dialog_top.webp new file mode 100644 index 0000000000000000000000000000000000000000..0411424735b2647cca1cb7bf4ea701249fb1a295 GIT binary patch literal 27906 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 CH(Qbb literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/pic_fix_task_title.webp b/app/src/main/res/drawable-xxxhdpi/pic_fix_task_title.webp new file mode 100644 index 0000000000000000000000000000000000000000..69be1e0cfbe328190b982de7f3c36984646c2250 GIT binary patch literal 15756 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 K&^J^70000$kl#cA literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/pic_novice_task_title.webp b/app/src/main/res/drawable-xxxhdpi/pic_novice_task_title.webp new file mode 100644 index 0000000000000000000000000000000000000000..b434c29ede4c76c2365a54b87ff1bbeceeca44e2 GIT binary patch literal 15760 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 - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/button_round_50dcdc.xml b/app/src/main/res/drawable/button_round_00dba4.xml similarity index 79% rename from app/src/main/res/drawable/button_round_50dcdc.xml rename to app/src/main/res/drawable/button_round_00dba4.xml index f7edbb30dc..3667aa72af 100644 --- a/app/src/main/res/drawable/button_round_50dcdc.xml +++ b/app/src/main/res/drawable/button_round_00dba4.xml @@ -4,6 +4,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/button_round_806f9cef.xml b/app/src/main/res/drawable/button_round_806f9cef.xml deleted file mode 100644 index 5e0baa7e01..0000000000 --- a/app/src/main/res/drawable/button_round_806f9cef.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/button_round_e6f9fa.xml b/app/src/main/res/drawable/button_round_ebf9fa.xml similarity index 79% rename from app/src/main/res/drawable/button_round_e6f9fa.xml rename to app/src/main/res/drawable/button_round_ebf9fa.xml index 76845b1e20..fc010012c3 100644 --- a/app/src/main/res/drawable/button_round_e6f9fa.xml +++ b/app/src/main/res/drawable/button_round_ebf9fa.xml @@ -4,6 +4,6 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/oval_ebf9fa_bg.xml b/app/src/main/res/drawable/oval_ebf9fa_bg.xml new file mode 100644 index 0000000000..e71c0485b2 --- /dev/null +++ b/app/src/main/res/drawable/oval_ebf9fa_bg.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/commodity_item.xml b/app/src/main/res/layout/commodity_item.xml index 2dbc0472de..48db33802d 100644 --- a/app/src/main/res/layout/commodity_item.xml +++ b/app/src/main/res/layout/commodity_item.xml @@ -19,25 +19,30 @@ android:layout_marginLeft="4dp" android:layout_marginRight="4dp" android:layout_centerHorizontal="true" - android:background="@drawable/background_shape_white_radius_8"> + android:background="@drawable/bg_commodity_item"> - + app:layout_constraintTop_toTopOf="parent"> + + + - + android:background="#E9F3FF"> - + - + - + - + - + - - + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_energy_sign.xml b/app/src/main/res/layout/dialog_energy_sign.xml new file mode 100644 index 0000000000..c15580ff07 --- /dev/null +++ b/app/src/main/res/layout/dialog_energy_sign.xml @@ -0,0 +1,333 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_commodity_list.xml b/app/src/main/res/layout/fragment_commodity_list.xml index 8dcb7c7e85..7728db8e52 100644 --- a/app/src/main/res/layout/fragment_commodity_list.xml +++ b/app/src/main/res/layout/fragment_commodity_list.xml @@ -21,7 +21,7 @@ android:id="@+id/header" android:layout_width="match_parent" android:layout_height="48dp" - android:background="@color/white"> + android:background="@color/transparent"> + android:layout_width="156dp" + android:layout_height="120dp" + android:src="@drawable/pic_commodity_no_data" /> + android:text="暂时没有商品哦~" + android:textColor="#A4EBEB" + android:textSize="14sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_energy_center.xml b/app/src/main/res/layout/fragment_energy_center.xml index d21d260deb..bd28bc16db 100644 --- a/app/src/main/res/layout/fragment_energy_center.xml +++ b/app/src/main/res/layout/fragment_energy_center.xml @@ -3,19 +3,140 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/cl" + android:background="@color/white" android:layout_width="match_parent" android:layout_height="match_parent"> + android:layout_height="match_parent" + android:background="@color/white"> + android:layout_height="400dp" + android:scaleType="fitXY" + android:src="@drawable/bg_energy_center_top" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + android:layout_width="73dp" + android:layout_height="22dp" + android:layout_marginTop="13dp" + android:layout_marginLeft="47dp" + android:clipChildren="false" + android:gravity="center_vertical"> + android:textSize="14sp" + android:text="0"/> - - + + + + android:src="@drawable/pic_energy_rule" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_energy_house.xml b/app/src/main/res/layout/fragment_energy_house.xml index e763261203..65c0104cfe 100644 --- a/app/src/main/res/layout/fragment_energy_house.xml +++ b/app/src/main/res/layout/fragment_energy_house.xml @@ -1,261 +1,228 @@ - - + android:layout_height="wrap_content"> - + - + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintLeft_toLeftOf="parent" /> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:background="#FF4DCCD3" /> + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_height="44dp" + android:paddingBottom="8dp"> + + + + + + android:background="#CCFCFF" /> - - + + + + + + + android:layout_height="wrap_content"> - + - + - \ No newline at end of file + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_filter_category.xml b/app/src/main/res/layout/layout_filter_category.xml index 39114e595e..95530ac5e5 100644 --- a/app/src/main/res/layout/layout_filter_category.xml +++ b/app/src/main/res/layout/layout_filter_category.xml @@ -10,7 +10,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - android:background="@color/white"> + android:background="#F5FEFF"> + android:orientation="vertical"> - - + app:layout_constraintTop_toBottomOf="@+id/taskName" /> \ No newline at end of file diff --git a/app/src/main/res/layout/novice_tasks_item.xml b/app/src/main/res/layout/novice_tasks_item.xml index 3b92c2b200..d329a2d096 100644 --- a/app/src/main/res/layout/novice_tasks_item.xml +++ b/app/src/main/res/layout/novice_tasks_item.xml @@ -1,9 +1,27 @@ - + android:layout_height="175dp" + android:layout_marginTop="16dp"> + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/tab_item_commodity.xml b/app/src/main/res/layout/tab_item_commodity.xml new file mode 100644 index 0000000000..65a346b6cb --- /dev/null +++ b/app/src/main/res/layout/tab_item_commodity.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/task_bottom_item.xml b/app/src/main/res/layout/task_bottom_item.xml new file mode 100644 index 0000000000..aa9beac9b4 --- /dev/null +++ b/app/src/main/res/layout/task_bottom_item.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/task_title_item.xml b/app/src/main/res/layout/task_title_item.xml index d9658bd13a..f4418f6168 100644 --- a/app/src/main/res/layout/task_title_item.xml +++ b/app/src/main/res/layout/task_title_item.xml @@ -1,18 +1,23 @@ - + android:layout_height="wrap_content" + android:layout_marginTop="20dp" + android:layout_marginLeft="16dp" + android:layout_marginRight="16dp"> - - + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index bd5f95e43a..b2abcc72d7 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -149,7 +149,6 @@ #EBFDFF #7CE7F8 #E6F8FA - #E6F9FA #91F0FD #F6FBFF #50DCDC @@ -267,6 +266,8 @@ #DAF7F1 #FFE5E6 #17C2A1 + #0089D1 + #00DBA4 #99666666 #6621282E diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bad7f7b25f..3f7db4ad0a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -807,7 +807,7 @@ 立即更换手机号 好友邀请码 输入好友邀请码 - 温馨提示:\n当你填写邀请码成功后,你和邀请人都能获取光能,被\n邀请人必须是新用户,否则无法成功邀请 + 温馨提示:\n当你填写邀请码成功后,你和邀请人都能获取光能,必\n须是新用户才能填写邀请码获取光能哦! 举报原因 头像、昵称、背景图、签名含有违规信息 diff --git a/dependencies.gradle b/dependencies.gradle index 3c5425669d..2c8b67124d 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -110,6 +110,7 @@ ext { nanohttpd = "2.3.1" aliyunLog = "2.5.14" easyFloat = "1.3.4" + shapeOfView = "1.4.7" sentry = "3.2.0" } \ No newline at end of file From 8c529f07242734566f3529050498d0444a66d15c Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Thu, 5 Aug 2021 10:19:24 +0800 Subject: [PATCH 023/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA2=E6=9C=9F-?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E5=B1=95=E7=A4=BA-=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=B5=81-=E6=8F=90=E9=97=AE=E5=B8=96=E8=AF=84=E8=AE=BA?= =?UTF-8?q?=EF=BC=880804UI=E6=B5=8B=E8=AF=95=EF=BC=89https://git.ghzs.com/?= =?UTF-8?q?pm/halo-app-issues/-/issues/1344#note=5F111919?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gh/common/util/SpanBuilder.kt | 8 ++++++++ .../forum/home/ForumArticleAskItemViewHolder.kt | 12 ++++++++++-- .../res/drawable-xxxhdpi/ic_ask_label_small.webp | Bin 1318 -> 0 bytes 3 files changed, 18 insertions(+), 2 deletions(-) delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_ask_label_small.webp diff --git a/app/src/main/java/com/gh/common/util/SpanBuilder.kt b/app/src/main/java/com/gh/common/util/SpanBuilder.kt index dec35a5c5f..b8200f2271 100644 --- a/app/src/main/java/com/gh/common/util/SpanBuilder.kt +++ b/app/src/main/java/com/gh/common/util/SpanBuilder.kt @@ -3,6 +3,7 @@ package com.gh.common.util import android.content.Context import android.graphics.Color import android.graphics.Typeface +import android.graphics.drawable.Drawable import android.text.SpannableStringBuilder import android.text.Spanned import android.text.TextPaint @@ -70,6 +71,13 @@ class SpanBuilder(content: CharSequence) { return this } + //添加图标 + fun image(start: Int, end: Int, drawable: Drawable): SpanBuilder { + val imageSpan = CenterImageSpan(drawable) + spannableString.setSpan(imageSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + return this + } + fun click(start: Int, end: Int, colorRes: Int, isUnderlineText: Boolean = false, onClick: () -> Unit): SpanBuilder { val clickSpan = object : ClickableSpan() { override fun updateDrawState(ds: TextPaint) { 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 fc61c04c17..5dd3bfe4c1 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 @@ -50,12 +50,20 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B binding.content.goneIf(entity.content.isEmpty()) binding.content.text = entity.content val title = " ${entity.questions.title}" - binding.questionTitle.text = SpanBuilder(title).image(0, 1, R.drawable.ic_ask_label_small).build() + val drawable = R.drawable.ic_ask_label.toDrawable() + drawable?.run { + setBounds(0, 0, 16F.dip2px(), 16F.dip2px()) + binding.questionTitle.text = SpanBuilder(title).image(0, 1, this).build() + } } else if (entity.type == "question") { binding.content.goneIf(entity.questions.description.isNullOrEmpty()) binding.content.text = entity.questions.description val title = " ${entity.questions.title}" - binding.title.text = SpanBuilder(title).image(0, 1, R.drawable.ic_ask_label_small).build() + val drawable = R.drawable.ic_ask_label.toDrawable() + drawable?.run { + setBounds(0, 0, 16F.dip2px(), 16F.dip2px()) + binding.title.text = SpanBuilder(title).image(0, 1, this).build() + } } else { binding.content.visibility = View.VISIBLE if (entity.type == "video") { diff --git a/app/src/main/res/drawable-xxxhdpi/ic_ask_label_small.webp b/app/src/main/res/drawable-xxxhdpi/ic_ask_label_small.webp deleted file mode 100644 index 5163a74c6c08c9adcc81fa3b9d26deea21c95e72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1318 zcmV+>1=;#iNk&E<1pok7MM6+kP&il$0000G0000r001ul06|PpNWuUB00GaSwv8k; zdGO2(>8BqN0Z0+eTOQ4?co*Q?tOYAj-qgkPi!ShD|^eeqPBH6+$@S`cVSym-P*HClvgKF)W^f9Zv>Ep zFabS755F_)z7Wcy;b;bqVc}Rdj!pjEE6GAKkkllZWA_|AI1u7gqO|}vb+ZG2 zNn7i1ER|Ijr>4_1MqGzZ%ibs4Hs!Q^wJk$ac-#h7P&gnq1ONc=7yz9CDmDNx06sAi zh(e+vAsJdvFdzd2wg66?psDX3KCAf6>@iaQnfFKcJ1w7)|IhuI`9NiRx?1{I; z;U_4iTS(8QH!n`QJzLlO^YPTIfB)4kIcdj4eAV?o&8-2QmdM_l)k zMjApKpMex=Z}tA!>KEayA<3ahp8`icjy?SMx)(LR#+ek0qRjQR*Nb%E5@Y`Z-}#iz zR6y&*Ia$BE4@E&yr6<6&%*D8rqNn)=VS7k|aOb~>mY9FJZ)k38yoNqY=$Srb`Y)0D zDgf@CQX->-XBVOn5T2nT>F7~mQm$umCSOn3bT}34_x)h?rJmo~pXtr?D&@}fiBA8r zA`&h03!F~Q#$@90BE5T1YKkzZeJ7HAcIw3M@dd#gI1(BA z@K!Yv;qjR)HwZy*JzhzHGW-3(n(m1kb4Zh2H%c5|_G ze`jz`pJD#*^BdLk-0HzC*4}|FZX0v;=PjmqWj=SqSpn~0U|nLRm4?%OovLXU@&%0Mggp6W;T+ z-jjCvIo#5xo!KSpnxFDfC+<`ny4 Date: Thu, 5 Aug 2021 10:48:52 +0800 Subject: [PATCH 024/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200804=E4=BA=A7=E5=93=81=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=881?= =?UTF-8?q?=EF=BC=89(=E7=AC=AC10=E7=82=B9)=20https://git.ghzs.com/pm/halo-?= =?UTF-8?q?app-issues/-/issues/1430#note=5F112113?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/gamecenter/personalhome/home/UserHistoryAdapter.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryAdapter.kt b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryAdapter.kt index 05db4b7992..28b38e43b6 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryAdapter.kt @@ -265,6 +265,7 @@ class UserHistoryAdapter(context: Context, "community_article_vote" -> "赞同了帖子" "community_article" -> if (isEdit) "修改了帖子" else "发布了帖子" "update-answer" -> "更新了回答" + "video" -> "发布了视频" else -> "" } } @@ -278,6 +279,7 @@ class UserHistoryAdapter(context: Context, "community_article_vote" -> "赞同了帖子" "community_article" -> "发布了帖子" "update-answer" -> "更新了回答" + "video" -> "发布了视频" else -> "" } } From 2d3f70dd129aba803d7f717b902e69758aa1cdfd Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Thu, 5 Aug 2021 14:48:09 +0800 Subject: [PATCH 025/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200804=E4=BA=A7=E5=93=81=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=881?= =?UTF-8?q?=EF=BC=89(12)=20https://git.ghzs.com/pm/halo-app-issues/-/issue?= =?UTF-8?q?s/1430?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../background/BackgroundPreviewFragment.kt | 199 ++++++++++++------ 1 file changed, 131 insertions(+), 68 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/background/BackgroundPreviewFragment.kt b/app/src/main/java/com/gh/gamecenter/personalhome/background/BackgroundPreviewFragment.kt index eebe5cd7a2..250b4c16f0 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/background/BackgroundPreviewFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/background/BackgroundPreviewFragment.kt @@ -19,6 +19,7 @@ import com.gh.gamecenter.CropImageActivity import com.gh.gamecenter.R import com.gh.gamecenter.databinding.FragmentBackgroundPreviewBinding import com.gh.gamecenter.entity.BackgroundImageEntity +import com.gh.gamecenter.entity.ErrorEntity import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.normal.NormalFragment import com.gh.gamecenter.user.UserViewModel @@ -29,6 +30,7 @@ import com.zhihu.matisse.engine.impl.PicassoEngine import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers +import retrofit2.HttpException import java.io.File class BackgroundPreviewFragment : NormalFragment() { @@ -45,14 +47,20 @@ class BackgroundPreviewFragment : NormalFragment() { override fun getLayoutId(): Int = 0 override fun getInflatedLayout(): View { - mBinding = DataBindingUtil.inflate(layoutInflater, R.layout.fragment_background_preview, null, false) + mBinding = DataBindingUtil.inflate( + layoutInflater, + R.layout.fragment_background_preview, + null, + false + ) return mBinding.root } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mLocalPath = arguments?.getString(EntranceUtils.KEY_LOCAL_PATH) ?: "" - backgroundImageEntity = arguments?.getParcelable(BackgroundImageEntity::class.java.simpleName) + backgroundImageEntity = + arguments?.getParcelable(BackgroundImageEntity::class.java.simpleName) mUserViewModel = viewModelProvider(UserViewModel.Factory(HaloApp.getInstance().application)) mUserViewModel.uploadBackground.observeNonNull(this) { @@ -73,7 +81,8 @@ class BackgroundPreviewFragment : NormalFragment() { } private fun changeViewParams() { - val screenHeight = DisplayUtils.px2dip(requireContext(), DisplayUtils.getScreenHeight().toFloat()) + val screenHeight = + DisplayUtils.px2dip(requireContext(), DisplayUtils.getScreenHeight().toFloat()) val picProportion = if (screenHeight > 640) 6 / 13f else 9 / 16f val width = mBinding.previewMineIv.width val height = mBinding.previewMineIv.height @@ -84,13 +93,16 @@ class BackgroundPreviewFragment : NormalFragment() { mineGhIvParams.topMargin = ((height - realHeight) / 2).toInt() + 1f.dip2px() mBinding.mineGhIv.layoutParams = mineGhIvParams - val personalHomeIvParams = mBinding.personalHomeIv.layoutParams as ConstraintLayout.LayoutParams + val personalHomeIvParams = + mBinding.personalHomeIv.layoutParams as ConstraintLayout.LayoutParams //最后+1dp是因为预览图有1dp的边框 personalHomeIvParams.topMargin = ((height - realHeight) / 2).toInt() + 1f.dip2px() mBinding.personalHomeIv.layoutParams = personalHomeIvParams - val changeBackgroundTvParams = mBinding.changeBackgroundTv.layoutParams as ConstraintLayout.LayoutParams - changeBackgroundTvParams.topMargin = (realHeight + (height - realHeight) / 2 + 26f.dip2px()).toInt() + val changeBackgroundTvParams = + mBinding.changeBackgroundTv.layoutParams as ConstraintLayout.LayoutParams + changeBackgroundTvParams.topMargin = + (realHeight + (height - realHeight) / 2 + 26f.dip2px()).toInt() mBinding.changeBackgroundTv.layoutParams = changeBackgroundTvParams mBinding.mineContainer.visibility = View.VISIBLE @@ -101,20 +113,42 @@ class BackgroundPreviewFragment : NormalFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) mLocalPath = arguments?.getString(EntranceUtils.KEY_LOCAL_PATH) ?: "" - backgroundImageEntity = arguments?.getParcelable(BackgroundImageEntity::class.java.simpleName) + backgroundImageEntity = + arguments?.getParcelable(BackgroundImageEntity::class.java.simpleName) mOriginBitmap = BitmapUtils.getBitmapByFile(mLocalPath, Bitmap.Config.ARGB_8888) if (mOriginBitmap == null) return mTempBitmap = Bitmap.createBitmap(mOriginBitmap!!) mBinding.mineGhIv.setImageBitmap(mOriginBitmap) mBinding.personalHomeIv.setImageBitmap(mOriginBitmap) - val screenHeight = DisplayUtils.px2dip(requireContext(), DisplayUtils.getScreenHeight().toFloat()) + val screenHeight = + DisplayUtils.px2dip(requireContext(), DisplayUtils.getScreenHeight().toFloat()) if (screenHeight > 640) { - mBinding.previewMineIv.setImageDrawable(ContextCompat.getDrawable(requireContext(), R.drawable.preview_mine_full)) - mBinding.previewHomeIv.setImageDrawable(ContextCompat.getDrawable(requireContext(), R.drawable.preview_home_full)) + mBinding.previewMineIv.setImageDrawable( + ContextCompat.getDrawable( + requireContext(), + R.drawable.preview_mine_full + ) + ) + mBinding.previewHomeIv.setImageDrawable( + ContextCompat.getDrawable( + requireContext(), + R.drawable.preview_home_full + ) + ) } else { - mBinding.previewMineIv.setImageDrawable(ContextCompat.getDrawable(requireContext(), R.drawable.preview_mine)) - mBinding.previewHomeIv.setImageDrawable(ContextCompat.getDrawable(requireContext(), R.drawable.preview_home)) + mBinding.previewMineIv.setImageDrawable( + ContextCompat.getDrawable( + requireContext(), + R.drawable.preview_mine + ) + ) + mBinding.previewHomeIv.setImageDrawable( + ContextCompat.getDrawable( + requireContext(), + R.drawable.preview_home + ) + ) } mBinding.normalTitle.text = "预览" @@ -159,14 +193,19 @@ class BackgroundPreviewFragment : NormalFragment() { } mBinding.commitTv.setOnClickListener { - PermissionHelper.checkStoragePermissionBeforeAction(requireContext(), object : EmptyCallback { - override fun onCallback() { - mTempBitmap?.let { - val filePath: String = "${requireContext().cacheDir.absolutePath}${File.separator}${MD5Utils.getContentMD5(mLocalPath)}.webp" - savePicture(filePath, it) + PermissionHelper.checkStoragePermissionBeforeAction( + requireContext(), + object : EmptyCallback { + override fun onCallback() { + mTempBitmap?.let { + val filePath: String = + "${requireContext().cacheDir.absolutePath}${File.separator}${ + MD5Utils.getContentMD5(mLocalPath) + }.webp" + savePicture(filePath, it) + } } - } - }) + }) } } @@ -201,51 +240,73 @@ class BackgroundPreviewFragment : NormalFragment() { mPostDialog = WaitingDialogFragment.newInstance("加载中...") mPostDialog?.show(childFragmentManager, null) Single.just(bitmap) - .map { - if (mBinding.alphaSeek.progress == 100) { - it - } else { - BitmapUtils.getTransparentBitmap(bitmap, Bitmap.Config.ARGB_8888, mBinding.alphaSeek.progress) - } + .map { + if (mBinding.alphaSeek.progress == 100) { + it + } else { + BitmapUtils.getTransparentBitmap( + bitmap, + Bitmap.Config.ARGB_8888, + mBinding.alphaSeek.progress + ) } - .map { - BitmapUtils.saveBitmap(it, path) - path - } - .flatMap { - uploadImage(it) - } - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ - mPostDialog?.dismiss() - val entity = BackgroundImageEntity(backgroundImageEntity?.id - ?: "", it, opacity = mBinding.alphaSeek.progress, blur = mBinding.blurSeek.progress) - mUserViewModel.changeUserInfo(GsonUtils.toJson(entity), UserViewModel.TYPE_BACKGROUND) - }, { - it.printStackTrace() - mPostDialog?.dismiss() - }) + } + .map { + BitmapUtils.saveBitmap(it, path) + path + } + .flatMap { + uploadImage(it) + } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + mPostDialog?.dismiss() + val entity = BackgroundImageEntity( + backgroundImageEntity?.id + ?: "", + it, + opacity = mBinding.alphaSeek.progress, + blur = mBinding.blurSeek.progress + ) + mUserViewModel.changeUserInfo( + GsonUtils.toJson(entity), + UserViewModel.TYPE_BACKGROUND + ) + }, { + it.printStackTrace() + mPostDialog?.dismiss() + }) } private fun uploadImage(path: String): Single { return Single.create { - UploadImageUtils.uploadImage(UploadImageUtils.UploadType.user_background, path, object : UploadImageUtils.OnUploadImageListener { - override fun onSuccess(imageUrl: String) { - it.onSuccess(imageUrl) - } + UploadImageUtils.uploadImage( + UploadImageUtils.UploadType.user_background, + path, + object : UploadImageUtils.OnUploadImageListener { + override fun onSuccess(imageUrl: String) { + it.onSuccess(imageUrl) + } - override fun onError(e: Throwable?) { - it.onError(e ?: Throwable()) - } + override fun onError(e: Throwable?) { + if (e is HttpException) { + val entity = + e.response()?.errorBody()?.string()?.toObject() + if (entity?.code == 403033) { + toast("图片违规") + } + } + it.onError(e ?: Throwable()) + } - override fun onProgress(total: Long, progress: Long) { + override fun onProgress(total: Long, progress: Long) { - } + } - }) + }) } } @@ -254,15 +315,15 @@ class BackgroundPreviewFragment : NormalFragment() { PermissionHelper.checkStoragePermissionBeforeAction(activity, object : EmptyCallback { override fun onCallback() { Matisse.from(activity) - .choose(MimeType.ofImage()) - .showSingleMediaType(true) - .countable(true) - .addFilter(GhMatisseFilter()) - .maxSelectable(1) - .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) - .thumbnailScale(0.85f) - .imageEngine(PicassoEngine()) - .forResult(MEDIA_STORE_REQUEST) + .choose(MimeType.ofImage()) + .showSingleMediaType(true) + .countable(true) + .addFilter(GhMatisseFilter()) + .maxSelectable(1) + .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) + .thumbnailScale(0.85f) + .imageEngine(PicassoEngine()) + .forResult(MEDIA_STORE_REQUEST) } }) } @@ -273,7 +334,8 @@ class BackgroundPreviewFragment : NormalFragment() { if (requestCode == MEDIA_STORE_REQUEST && resultCode == Activity.RESULT_OK) { val selectedPaths = Matisse.obtainPathResult(data) if (selectedPaths.size > 0) { - val intent = BackgroundClipActivity.getIntent(requireContext(), selectedPaths[0], mEntrance) + val intent = + BackgroundClipActivity.getIntent(requireContext(), selectedPaths[0], mEntrance) startActivityForResult(intent, REQUEST_CODE_IMAGE_CROP) } } else if (requestCode == REQUEST_CODE_IMAGE_CROP && resultCode == Activity.RESULT_OK) { @@ -282,11 +344,12 @@ class BackgroundPreviewFragment : NormalFragment() { mOriginBitmap = BitmapUtils.getBitmapByFile(imagePath, Bitmap.Config.ARGB_8888) if (mOriginBitmap == null) return val progress = mBinding.blurSeek.progress - mTempBitmap = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && progress != 0) { - BitmapUtils.getBlurBitmap(requireContext(), mOriginBitmap, progress) - } else { - Bitmap.createBitmap(mOriginBitmap!!) - } + mTempBitmap = + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1 && progress != 0) { + BitmapUtils.getBlurBitmap(requireContext(), mOriginBitmap, progress) + } else { + Bitmap.createBitmap(mOriginBitmap!!) + } mBinding.mineGhIv.setImageBitmap(mTempBitmap) mBinding.personalHomeIv.setImageBitmap(mTempBitmap) } From 50f7dd2c63ef5ee5bb4da4c02d1d756052113adf Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Thu, 5 Aug 2021 15:49:12 +0800 Subject: [PATCH 026/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=910805=E4=BA=A7=E5=93=81=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=97=AE=E9=A2=98(3,4)=20https://git.ghzs.com/pm/halo?= =?UTF-8?q?-app-issues/-/issues/1434?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/Extensions.kt | 305 +++++++++++------- .../detail/ArticleDetailContentViewHolder.kt | 39 +-- .../article/detail/ArticleDetailFragment.kt | 12 +- .../qa/editor/OnLinkClickListener.kt | 19 +- .../newdetail/NewQuestionDetailFragment.kt | 12 +- .../QuestionDetailContentViewHolder.kt | 42 ++- .../qa/video/detail/ForumTopVideoView.kt | 7 +- .../video/detail/ForumVideoDetailFragment.kt | 2 +- .../detail/comment/VideoCommentFragment.kt | 45 ++- .../video/detail/desc/VideoDescViewModel.kt | 216 +++++++------ 10 files changed, 395 insertions(+), 304 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/Extensions.kt b/app/src/main/java/com/gh/common/util/Extensions.kt index e6f0495c50..508dcafb79 100644 --- a/app/src/main/java/com/gh/common/util/Extensions.kt +++ b/app/src/main/java/com/gh/common/util/Extensions.kt @@ -69,17 +69,17 @@ import kotlin.math.abs * 创建以 activity 为观察者上下文的 viewModel */ inline fun FragmentActivity.viewModelProvider( - provider: ViewModelProvider.Factory? = null + provider: ViewModelProvider.Factory? = null ) = - ViewModelProviders.of(this, provider).get(VM::class.java) + ViewModelProviders.of(this, provider).get(VM::class.java) /** * 创建以 activity 为观察者上下文的 viewModel * 额外的 key: 用于区分单 activity 多 viewModel 的情况 (如首页tab) */ inline fun Fragment.viewModelProviderFromParent( - provider: ViewModelProvider.Factory? = null, - key: String = "" + provider: ViewModelProvider.Factory? = null, + key: String = "" ) = if (key.isEmpty()) { ViewModelProviders.of(requireActivity(), provider).get(VM::class.java) } else { @@ -90,28 +90,33 @@ inline fun Fragment.viewModelProviderFromParent( * 创建以 activity 为观察者上下文的 viewModel */ inline fun FragmentActivity.viewModelProviderFromParent( - provider: ViewModelProvider.Factory? = null + provider: ViewModelProvider.Factory? = null ) = - ViewModelProviders.of(this, provider).get(VM::class.java) + ViewModelProviders.of(this, provider).get(VM::class.java) /** * 创建以 fragment 为观察者上下文的 viewModel */ inline fun Fragment.viewModelProvider( - provider: ViewModelProvider.Factory? = null + provider: ViewModelProvider.Factory? = null ) = - ViewModelProviders.of(this, provider).get(VM::class.java) + ViewModelProviders.of(this, provider).get(VM::class.java) /** * * ViewPager Extensions * */ -fun ViewPager.doOnPageSelected(action: (position: Int) -> Unit) = addOnPageChangeListener(onSelected = action) +fun ViewPager.doOnPageSelected(action: (position: Int) -> Unit) = + addOnPageChangeListener(onSelected = action) fun ViewPager.addOnPageChangeListener(onSelected: ((position: Int) -> Unit)? = null) { val listener = object : ViewPager.OnPageChangeListener { - override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { // Do nothing. } @@ -126,11 +131,17 @@ fun ViewPager.addOnPageChangeListener(onSelected: ((position: Int) -> Unit)? = n addOnPageChangeListener(listener) } -fun ViewPager.doOnScroll(onStateChanged: ((state: Int) -> Unit)? = null, - onPageScrolled: ((position: Int, positionOffset: Float, positionOffsetPixels: Int) -> Unit)? = null, - onPageSelected: ((position: Int) -> Unit)? = null) { +fun ViewPager.doOnScroll( + onStateChanged: ((state: Int) -> Unit)? = null, + onPageScrolled: ((position: Int, positionOffset: Float, positionOffsetPixels: Int) -> Unit)? = null, + onPageSelected: ((position: Int) -> Unit)? = null +) { val listener = object : ViewPager.OnPageChangeListener { - override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { onPageScrolled?.invoke(position, positionOffset, positionOffsetPixels) } @@ -150,13 +161,19 @@ fun ViewPager.doOnScroll(onStateChanged: ((state: Int) -> Unit)? = null, * Fragment related */ inline fun Fragment.fragmentFromActivity() = - parentFragmentManager.findFragmentByTag(T::class.java.simpleName) as? T - ?: parentFragmentManager.fragmentFactory.instantiate(requireContext().classLoader, T::class.java.canonicalName) as T + parentFragmentManager.findFragmentByTag(T::class.java.simpleName) as? T + ?: parentFragmentManager.fragmentFactory.instantiate( + requireContext().classLoader, + T::class.java.canonicalName + ) as T inline fun Fragment.fragmentFromParentFragment() = - childFragmentManager.findFragmentByTag(T::class.java.simpleName) as? T - ?: childFragmentManager.fragmentFactory.instantiate(requireContext().classLoader, T::class.java.canonicalName) as T + childFragmentManager.findFragmentByTag(T::class.java.simpleName) as? T + ?: childFragmentManager.fragmentFactory.instantiate( + requireContext().classLoader, + T::class.java.canonicalName + ) as T /** @@ -164,7 +181,12 @@ inline fun Fragment.fragmentFromParentFragment() = */ // 监听滚动距离 -fun RecyclerView.doOnScrolledSpecificDistance(distanceX: Int = 0, distanceY: Int = 0, singleTimeEvent: Boolean = false, action: () -> Unit) { +fun RecyclerView.doOnScrolledSpecificDistance( + distanceX: Int = 0, + distanceY: Int = 0, + singleTimeEvent: Boolean = false, + action: () -> Unit +) { val listener = object : RecyclerView.OnScrollListener() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) @@ -186,10 +208,10 @@ fun RecyclerView.doOnScrolledSpecificDistance(distanceX: Int = 0, distanceY: Int */ inline fun ViewGroup.toBinding(): T { return T::class.java.getMethod( - "inflate", - LayoutInflater::class.java, - ViewGroup::class.java, - Boolean::class.java + "inflate", + LayoutInflater::class.java, + ViewGroup::class.java, + Boolean::class.java ).invoke(null, layoutInflater, this, false) as T } @@ -288,11 +310,11 @@ fun String.insert(index: Int, string: String): String { */ fun String.replaceUnsupportedHtmlTag(): String { return this.replace("", "") - .replace("", "") - .replace("", "") + .replace("", "") + .replace("", "") + .replace("", "") } fun String.containHtmlTag(): Boolean { @@ -307,8 +329,8 @@ fun String.containHtmlTag(): Boolean { fun Fragment.showRegulationTestDialogIfNeeded(action: (() -> Unit)) { if (UserManager.getInstance().userShouldTakeRegulationBaseOnLastRemind()) { DialogUtils.showRegulationTestDialog(requireContext(), - { DirectUtils.directToRegulationTestPage(requireContext()) }, - { action.invoke() }) + { DirectUtils.directToRegulationTestPage(requireContext()) }, + { action.invoke() }) } else { action() } @@ -317,8 +339,8 @@ fun Fragment.showRegulationTestDialogIfNeeded(action: (() -> Unit)) { fun Context.showRegulationTestDialogIfNeeded(action: (() -> Unit)) { if (UserManager.getInstance().userShouldTakeRegulationBaseOnLastRemind()) { DialogUtils.showRegulationTestDialog(this, - { DirectUtils.directToRegulationTestPage(this) }, - { action.invoke() }) + { DirectUtils.directToRegulationTestPage(this) }, + { action.invoke() }) } else { action() } @@ -417,14 +439,15 @@ fun String.removeInsertedContent(): String { // 去除视频相关文本 fun String.removeVideoContent(): String { - val videoRegex = "(?s)

" + val videoRegex = + "(?s)
" return this.replace(videoRegex.toRegex(), "") } // 完全地清除所有 Html 格式 fun String.clearHtmlFormatCompletely(): String { return Html.fromHtml(this).toString().replace('\n', 32.toChar()) - .replace(160.toChar(), 32.toChar()).replace(65532.toChar(), 32.toChar()).trim { it <= ' ' } + .replace(160.toChar(), 32.toChar()).replace(65532.toChar(), 32.toChar()).trim { it <= ' ' } } // 如果该字符串长度超过固定长度的话,从头开始截取固定长度并返回 @@ -554,19 +577,23 @@ fun PopupWindow.showAutoOrientation(anchorView: View, distanceY: Int = 0, distan * 权限相关 */ fun Fragment.checkReadPhoneStateAndStoragePermissionBeforeAction(action: (() -> Unit)) { - PermissionHelper.checkReadPhoneStateAndStoragePermissionBeforeAction(requireContext(), object : EmptyCallback { - override fun onCallback() { - action.invoke() - } - }) + PermissionHelper.checkReadPhoneStateAndStoragePermissionBeforeAction( + requireContext(), + object : EmptyCallback { + override fun onCallback() { + action.invoke() + } + }) } fun Fragment.checkReadPhoneStatePermissionBeforeAction(action: (() -> Unit)) { - PermissionHelper.checkReadPhoneStatePermissionBeforeAction(requireContext(), object : EmptyCallback { - override fun onCallback() { - action.invoke() - } - }) + PermissionHelper.checkReadPhoneStatePermissionBeforeAction( + requireContext(), + object : EmptyCallback { + override fun onCallback() { + action.invoke() + } + }) } fun Fragment.checkStoragePermissionBeforeAction(action: (() -> Unit)) { @@ -578,11 +605,13 @@ fun Fragment.checkStoragePermissionBeforeAction(action: (() -> Unit)) { } fun FragmentActivity.checkReadPhoneStateAndStoragePermissionBeforeAction(action: (() -> Unit)) { - PermissionHelper.checkReadPhoneStateAndStoragePermissionBeforeAction(this, object : EmptyCallback { - override fun onCallback() { - action.invoke() - } - }) + PermissionHelper.checkReadPhoneStateAndStoragePermissionBeforeAction( + this, + object : EmptyCallback { + override fun onCallback() { + action.invoke() + } + }) } fun FragmentActivity.checkReadPhoneStatePermissionBeforeAction(action: (() -> Unit)) { @@ -613,20 +642,27 @@ fun List.secondOrNull(): T? { /** * TextView related. */ -fun TextView.setTextWithHighlightedTextWrappedInsideWrapper(text: CharSequence, - wrapper: String = Constants.DEFAULT_TEXT_WRAPPER, - @ColorRes - highlightColorId: Int = R.color.theme_font, - copyClickedText: Boolean = false, - highlightedTextClickListener: (() -> Unit)? = null) { - TextHelper.highlightTextThatIsWrappedInsideWrapper(this, text, wrapper, highlightColorId, object : SimpleCallback { - override fun onCallback(arg: String) { - if (copyClickedText) { - arg.copyTextAndToast("已复制:$arg") +fun TextView.setTextWithHighlightedTextWrappedInsideWrapper( + text: CharSequence, + wrapper: String = Constants.DEFAULT_TEXT_WRAPPER, + @ColorRes + highlightColorId: Int = R.color.theme_font, + copyClickedText: Boolean = false, + highlightedTextClickListener: (() -> Unit)? = null +) { + TextHelper.highlightTextThatIsWrappedInsideWrapper( + this, + text, + wrapper, + highlightColorId, + object : SimpleCallback { + override fun onCallback(arg: String) { + if (copyClickedText) { + arg.copyTextAndToast("已复制:$arg") + } + highlightedTextClickListener?.invoke() } - highlightedTextClickListener?.invoke() - } - }) + }) } fun TextView.setTextChangedListener(action: (s: CharSequence, start: Int, before: Int, count: Int) -> Unit) { @@ -667,7 +703,10 @@ fun List.safelyGetInRelease(index: Int): T? { * @param shrankText 未展开时的文字 * @param expandedText 展开后的文字 */ -fun ExpandTextView.setTextWithInterceptingInternalUrl(shrankText: CharSequence, expandedText: CharSequence) { +fun ExpandTextView.setTextWithInterceptingInternalUrl( + shrankText: CharSequence, + expandedText: CharSequence +) { var shrankSsb = shrankText.interceptUrlSpanAndRoundImageSpan() var expandedSsb = expandedText.interceptUrlSpanAndRoundImageSpan() @@ -675,23 +714,42 @@ fun ExpandTextView.setTextWithInterceptingInternalUrl(shrankText: CharSequence, if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { while (shrankSsb.contains("\n\n")) { val index = shrankSsb.indexOf("\n\n", 0, true) - shrankSsb = SpannableStringBuilder(shrankSsb.subSequence(0, index)).append(shrankSsb.subSequence(index + "\n".length, shrankSsb.length)) + shrankSsb = SpannableStringBuilder( + shrankSsb.subSequence( + 0, + index + ) + ).append(shrankSsb.subSequence(index + "\n".length, shrankSsb.length)) } while (expandedSsb.contains("\n\n")) { val index = expandedSsb.indexOf("\n\n", 0, true) - expandedSsb = SpannableStringBuilder(expandedSsb.subSequence(0, index)).append(expandedSsb.subSequence(index + "\n".length, expandedSsb.length)) + expandedSsb = SpannableStringBuilder( + expandedSsb.subSequence( + 0, + index + ) + ).append(expandedSsb.subSequence(index + "\n".length, expandedSsb.length)) } } // 去掉多余的 P 标签换行 if (expandedSsb.endsWith("\n", true)) { - expandedSsb = SpannableStringBuilder((expandedSsb.subSequence(0, expandedSsb.length - "\n".length))) + expandedSsb = + SpannableStringBuilder((expandedSsb.subSequence(0, expandedSsb.length - "\n".length))) } movementMethod = CustomLinkMovementMethod.getInstance() - shrankSsb = TextHelper.updateSpannableStringWithHighlightedSpan(context, shrankSsb, highlightedTextClickListener = null) - expandedSsb = TextHelper.updateSpannableStringWithHighlightedSpan(context, expandedSsb, highlightedTextClickListener = null) + shrankSsb = TextHelper.updateSpannableStringWithHighlightedSpan( + context, + shrankSsb, + highlightedTextClickListener = null + ) + expandedSsb = TextHelper.updateSpannableStringWithHighlightedSpan( + context, + expandedSsb, + highlightedTextClickListener = null + ) setShrankTextAndExpandedText(shrankSsb, expandedSsb) } @@ -699,32 +757,41 @@ fun CharSequence.interceptUrlSpanAndRoundImageSpan(): SpannableStringBuilder { return SpannableStringBuilder.valueOf(this).apply { getSpans(0, length, URLSpan::class.java).forEach { setSpan( - object : ClickableSpan() { - override fun updateDrawState(ds: TextPaint) { - super.updateDrawState(ds) - ds.color = ContextCompat.getColor(HaloApp.getInstance().application, R.color.theme_font) - ds.isUnderlineText = false - } + object : ClickableSpan() { + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.color = ContextCompat.getColor( + HaloApp.getInstance().application, + R.color.theme_font + ) + ds.isUnderlineText = false + } - override fun onClick(widget: View) { - if (!DefaultUrlHandler.interceptUrl(widget.context, it.url, "")) { - widget.context.startActivity(WebActivity.getIntent(widget.context, it.url, true)) - } + override fun onClick(widget: View) { + if (!DefaultUrlHandler.interceptUrl(widget.context, it.url, "")) { + widget.context.startActivity( + WebActivity.getIntent( + widget.context, + it.url, + true + ) + ) } - }, - getSpanStart(it), - getSpanEnd(it), - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + } + }, + getSpanStart(it), + getSpanEnd(it), + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE ) removeSpan(it) } getSpans(0, length, ImageSpan::class.java).forEach { setSpan( - CenterImageSpan(it.drawable), - getSpanStart(it), - getSpanEnd(it), - Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + CenterImageSpan(it.drawable), + getSpanStart(it), + getSpanEnd(it), + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE ) removeSpan(it) } @@ -833,22 +900,22 @@ inline fun testChannelOnly(f: () -> Unit) { * 倒计时,单位s */ inline fun countDownTimer( - timeInSeconds: Long, - crossinline block: (finish: Boolean, remainingTime: Long) -> Unit + timeInSeconds: Long, + crossinline block: (finish: Boolean, remainingTime: Long) -> Unit ): Disposable { var subscribe: Disposable? = null subscribe = Observable.interval(0, 1000, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - if (it < timeInSeconds) { - block.invoke(false, timeInSeconds - it) - } else { - block.invoke(true, 0) - if (subscribe != null && !subscribe!!.isDisposed) { - subscribe?.dispose() - } + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + if (it < timeInSeconds) { + block.invoke(false, timeInSeconds - it) + } else { + block.invoke(true, 0) + if (subscribe != null && !subscribe!!.isDisposed) { + subscribe?.dispose() } } + } return subscribe } @@ -857,17 +924,17 @@ inline fun countDownTimer( * @start 起始时间 */ inline fun countUpTimer( - start: Long, - period: Long = 1000, - crossinline block: (millisUntilFinished: Long) -> Unit + start: Long, + period: Long = 1000, + crossinline block: (millisUntilFinished: Long) -> Unit ): Disposable { var startTime = start return Observable.interval(0, period, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - startTime += period - block.invoke(startTime) - } + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + startTime += period + block.invoke(startTime) + } } /** @@ -875,10 +942,10 @@ inline fun countUpTimer( */ inline fun rxTimer(interval: Long, crossinline block: (times: Long) -> Unit): Disposable { return Observable.interval(0, interval, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe { - block.invoke(it) - } + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { + block.invoke(it) + } } fun LottieAnimationView.doOnAnimationEnd(action: () -> Unit) { @@ -944,13 +1011,17 @@ fun List?.checkSameFromStringArray(check2: List?): Boolean { fun EditText.showKeyBoard() { this.postDelayed({ this.requestFocus() - val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager + val inputMethodManager = + context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager inputMethodManager.showSoftInput(this, 0) }, 300) } -fun SeekBar.doOnSeekBarChangeListener(progressChange: ((progress: Int) -> Unit)? = null, onStopTrackingTouch: (() -> Unit)? = null) { +fun SeekBar.doOnSeekBarChangeListener( + progressChange: ((progress: Int) -> Unit)? = null, + onStopTrackingTouch: (() -> Unit)? = null +) { this.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { progressChange?.invoke(progress) @@ -969,14 +1040,22 @@ fun SeekBar.doOnSeekBarChangeListener(progressChange: ((progress: Int) -> Unit)? fun observableToMain(): ObservableTransformer { return ObservableTransformer { upstream -> upstream.subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) + .observeOn(AndroidSchedulers.mainThread()) } } fun singleToMain(): SingleTransformer { return SingleTransformer { upstream -> upstream.subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) + .observeOn(AndroidSchedulers.mainThread()) + } +} + +fun clickToastByStatus(status: String, action: () -> Unit) { + when (status) { + "pending" -> ToastUtils.showToast("内容审核中") + "fail" -> ToastUtils.showToast("内容审核不通过") + else -> action.invoke() } } 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 8163e67788..41be61404c 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 @@ -250,30 +250,25 @@ class ArticleDetailContentViewHolder( runOnUiThread { binding.richEditor.replaceDfImageByUrl(url) } } else -> { - if (status == "pending") { - ToastUtils.showToast("内容审核中") - return - } else if (status == "fail") { - ToastUtils.showToast("内容审核不通过") - return - } - var current = 0 - var i = 0 - val size = articleImgUrlList.size - while (i < size) { - if (url.contains(articleImgUrlList.get(i))) { - current = i + clickToastByStatus(status) { + var current = 0 + var i = 0 + val size = articleImgUrlList.size + while (i < size) { + if (url.contains(articleImgUrlList.get(i))) { + current = i + } + i++ } - i++ + val intent = ImageViewerActivity.getIntent( + binding.root.context, articleImgUrlList, current, + mEntrance + "+(帖子详情[" + binding.titleTv.text.toString() + "])" + ) + (binding.root.context as Activity).startActivityForResult( + intent, + ImageViewerActivity.REQUEST_FOR_VIEWED_IMAGE + ) } - val intent = ImageViewerActivity.getIntent( - binding.root.context, articleImgUrlList, current, - mEntrance + "+(帖子详情[" + binding.titleTv.text.toString() + "])" - ) - (binding.root.context as Activity).startActivityForResult( - intent, - ImageViewerActivity.REQUEST_FOR_VIEWED_IMAGE - ) } } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt index 6180d825ba..9753c79f21 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt @@ -225,10 +225,8 @@ class ArticleDetailFragment : BaseCommentFragment { - FullScreenVideoActivity.start(context, title, videoEntity.url, videoEntity.poster) - } - "fail" -> { - Utils.toast(context, "视频审核未通过") - } - "pending" -> { - Utils.toast(context, "视频正在审核中") - } + clickToastByStatus(videoEntity.status){ + FullScreenVideoActivity.start(context, title, videoEntity.url, videoEntity.poster) } } } @@ -79,11 +71,8 @@ class OnLinkClickListener(val context: Context, @JavascriptInterface fun onVideoClick(url: String, poster: String) { - when (status) { - "pending" -> ToastUtils.showToast("内容审核中") - "fail" -> ToastUtils.showToast("内容审核不通过") - else -> FullScreenVideoActivity.start(context, title, url, poster) + clickToastByStatus(status){ + FullScreenVideoActivity.start(context, title, url, poster) } - } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailFragment.kt index 7a0726a386..2fd5981bc4 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailFragment.kt @@ -160,15 +160,13 @@ class NewQuestionDetailFragment : mBinding.inputContainer.replyTv.text = "说点什么吧" mBinding.inputContainer.replyTv.setRoundedColorBackground(R.color.text_F5F5F5, 19F) mBinding.inputContainer.replyTv.setDebouncedClickListener { - if (mViewModel.questionDetail?.status == "pass") { + clickToastByStatus(mViewModel.questionDetail?.status ?: "") { startCommentActivity() NewLogUtils.logCommentClick( "click_comment_area_comment_input_box", mViewModel.questionDetail?.user?.id ?: "", "提问帖", mViewModel.questionDetail?.id ?: "", mViewModel.questionDetail?.community?.id ?: "", bbsType ) - } else { - ToastUtils.showToast("内容审核中") } } mBinding.inputContainer.bottomCommentTv.text = "回答" @@ -177,7 +175,7 @@ class NewQuestionDetailFragment : updateStartButton() mBinding.inputContainer.bottomLikeIv.setOnClickListener { mViewModel.questionDetail?.let { - if (it.status == "pass") { + clickToastByStatus(mViewModel.questionDetail?.status ?: "") { startActivity( QuestionsInviteActivity.getIntent( requireContext(), @@ -185,8 +183,6 @@ class NewQuestionDetailFragment : "$mEntrance+(问题详情)" ) ) - } else { - ToastUtils.showToast("内容审核中") } } } @@ -194,15 +190,13 @@ class NewQuestionDetailFragment : mBinding.inputContainer.bottomStarIv.setOnClickListener { debounceActionWithInterval(it.id) { ifLogin("问题详情") { - if (mViewModel.questionDetail?.status == "pass") { + clickToastByStatus(mViewModel.questionDetail?.status ?: "") { mViewModel.postFavoriteQuestion() NewLogUtils.logCommentClick( "click_comment_area_collect", mViewModel.questionDetail?.user?.id ?: "", "提问帖", mViewModel.questionDetail?.id ?: "", mViewModel.questionDetail?.community?.id ?: "", bbsType ) - } else { - ToastUtils.showToast("内容审核中") } } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt index e4b2c61fd6..e19b36a443 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt @@ -84,7 +84,8 @@ class QuestionDetailContentViewHolder( if (followBtn.text == "关注") { viewModel.follow() } else { - DialogUtils.showAlertDialog(root.context, + DialogUtils.showAlertDialog( + root.context, "取消关注", "确定要取消关注 ${question.user.name} 吗?", "确定取消", @@ -229,30 +230,25 @@ class QuestionDetailContentViewHolder( runOnUiThread { binding.richEditor.replaceDfImageByUrl(url) } } else -> { - if (status == "pending") { - ToastUtils.showToast("内容审核中") - return - } else if (status == "fail") { - ToastUtils.showToast("内容审核不通过") - return - } - var current = 0 - var i = 0 - val size = questionImgUrlList.size - while (i < size) { - if (url.contains(questionImgUrlList.get(i))) { - current = i + clickToastByStatus(status) { + var current = 0 + var i = 0 + val size = questionImgUrlList.size + while (i < size) { + if (url.contains(questionImgUrlList.get(i))) { + current = i + } + i++ } - i++ + val intent = ImageViewerActivity.getIntent( + binding.root.context, questionImgUrlList, current, + mEntrance + "+(问题详情[" + binding.titleTv.text.toString() + "])" + ) + (binding.root.context as Activity).startActivityForResult( + intent, + ImageViewerActivity.REQUEST_FOR_VIEWED_IMAGE + ) } - val intent = ImageViewerActivity.getIntent( - binding.root.context, questionImgUrlList, current, - mEntrance + "+(问题详情[" + binding.titleTv.text.toString() + "])" - ) - (binding.root.context as Activity).startActivityForResult( - intent, - ImageViewerActivity.REQUEST_FOR_VIEWED_IMAGE - ) } } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumTopVideoView.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumTopVideoView.kt index 2f342f29c6..e366c6b6f6 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumTopVideoView.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumTopVideoView.kt @@ -39,7 +39,7 @@ class ForumTopVideoView @JvmOverloads constructor(context: Context, attrs: Attri var viewModel: ForumVideoDetailViewModel? = null var uuid = UUID.randomUUID().toString() var thumbImage: SimpleDraweeView = findViewById(R.id.thumbImage) - var pendingView: View = findViewById(R.id.pendingView) + var pendingView: TextView = findViewById(R.id.pendingView) var titleTv: TextView = findViewById(R.id.title) init { @@ -411,8 +411,9 @@ class ForumTopVideoView @JvmOverloads constructor(context: Context, attrs: Attri uploadVideoStreamingPlaying("暂停播放") } - fun setPendingStatus(isPending: Boolean) { - if (isPending) { + fun setVideoStatus(status: String) { + if (status == "pending" || status == "fail") { + pendingView.text = if (status == "pending") "审核中...请耐心等待" else "审核不通过" pendingView.visibility = View.VISIBLE mBottomContainer?.visibility = View.GONE mStartButton?.visibility = View.GONE diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt index 705f210bc0..9bf07df59e 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt @@ -337,7 +337,7 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { mBinding.topVideoView.viewModel = mViewModel mBinding.topVideoView.updateThumb(entity.poster) - mBinding.topVideoView.setPendingStatus(entity.status == "pending" || entity.status == "fail") + mBinding.topVideoView.setVideoStatus(entity.status) if (entity.status == "pass" && NetworkUtils.isWifiConnected(requireContext())) { if (mViewModel.isTopVideoPartlyCached(entity.url)) { mBinding.topVideoView.startPlayLogic(isAutoPlay = true) diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentFragment.kt index be3fb9c021..c99fe9b1ef 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentFragment.kt @@ -40,8 +40,10 @@ class VideoCommentFragment : LazyListFragment(application) { +class VideoDescViewModel(application: Application) : + ListViewModel(application) { var topVideoDetail: ForumVideoEntity? = null var handleSuccessLiveData = MutableLiveData() override fun provideDataObservable(page: Int): Observable>? { - return RetrofitManager.getInstance(getApplication()).api.getRecommendVideo(topVideoDetail?.id, page) + return RetrofitManager.getInstance(getApplication()).api.getRecommendVideo( + topVideoDetail?.id, + page + ) } override fun mergeResultLiveData() { @@ -62,10 +66,8 @@ class VideoDescViewModel(application: Application) : ListViewModel() { - override fun onSuccess(data: ResponseBody) { - topVideoDetail?.let { - it.me.isVoted = true - it.count.vote = it.count.vote + 1 - handleSuccessLiveData.postValue(true) - ToastUtils.showToast("点赞爆棚,视频能让更多人看见!") - SyncPageRepository.postSyncData(SyncDataEntity(videoId, SyncFieldConstants.ARTICLE_VOTE, true, checkFieldEntity = true)) - SyncPageRepository.postSyncData(SyncDataEntity(videoId, SyncFieldConstants.ARTICLE_VOTE_COUNT, it.count.vote, checkFieldEntity = true)) - } + .api.voteVideo(videoId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: ResponseBody) { + topVideoDetail?.let { + it.me.isVoted = true + it.count.vote = it.count.vote + 1 + handleSuccessLiveData.postValue(true) + ToastUtils.showToast("点赞爆棚,视频能让更多人看见!") + SyncPageRepository.postSyncData( + SyncDataEntity( + videoId, + SyncFieldConstants.ARTICLE_VOTE, + true, + checkFieldEntity = true + ) + ) + SyncPageRepository.postSyncData( + SyncDataEntity( + videoId, + SyncFieldConstants.ARTICLE_VOTE_COUNT, + it.count.vote, + checkFieldEntity = true + ) + ) } + } - override fun onFailure(exception: Exception) { - super.onFailure(exception) - } - }) + override fun onFailure(exception: Exception) { + super.onFailure(exception) + } + }) } @SuppressLint("CheckResult") private fun undoVoteVideo(videoId: String) { RetrofitManager.getInstance(getApplication()) - .api.undoVoteVideo(videoId) - .subscribeOn(Schedulers.io()) - .subscribe(object : BiResponse() { - override fun onSuccess(data: ResponseBody) { - topVideoDetail?.let { - it.me.isVoted = false - it.count.vote = it.count.vote - 1 - handleSuccessLiveData.postValue(true) - SyncPageRepository.postSyncData(SyncDataEntity(videoId, SyncFieldConstants.ARTICLE_VOTE, false, checkFieldEntity = true)) - SyncPageRepository.postSyncData(SyncDataEntity(videoId, SyncFieldConstants.ARTICLE_VOTE_COUNT, it.count.vote, checkFieldEntity = true)) - } + .api.undoVoteVideo(videoId) + .subscribeOn(Schedulers.io()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: ResponseBody) { + topVideoDetail?.let { + it.me.isVoted = false + it.count.vote = it.count.vote - 1 + handleSuccessLiveData.postValue(true) + SyncPageRepository.postSyncData( + SyncDataEntity( + videoId, + SyncFieldConstants.ARTICLE_VOTE, + false, + checkFieldEntity = true + ) + ) + SyncPageRepository.postSyncData( + SyncDataEntity( + videoId, + SyncFieldConstants.ARTICLE_VOTE_COUNT, + it.count.vote, + checkFieldEntity = true + ) + ) } + } - override fun onFailure(exception: Exception) { - super.onFailure(exception) - } - }) + override fun onFailure(exception: Exception) { + super.onFailure(exception) + } + }) } fun postFavorite() { @@ -125,10 +155,8 @@ class VideoDescViewModel(application: Application) : ListViewModel() { - override fun onSuccess(data: ResponseBody) { - topVideoDetail?.let { - it.me.isVideoFavorite = true - it.count.favorite++ - handleSuccessLiveData.postValue(true) - } - ToastUtils.toast("收藏成功") + .api.collectVideo(UserManager.getInstance().userId, videoId) + .compose(singleToMain()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: ResponseBody) { + topVideoDetail?.let { + it.me.isVideoFavorite = true + it.count.favorite++ + handleSuccessLiveData.postValue(true) } + ToastUtils.toast("收藏成功") + } - override fun onFailure(exception: Exception) { - super.onFailure(exception) - Utils.toast(getApplication(), exception.localizedMessage) - } - }) + override fun onFailure(exception: Exception) { + super.onFailure(exception) + Utils.toast(getApplication(), exception.localizedMessage) + } + }) } @SuppressLint("CheckResult") private fun undoFavoriteVideo(videoId: String) { RetrofitManager.getInstance(getApplication()) - .api.undoCollectVideo(UserManager.getInstance().userId, videoId) - .compose(singleToMain()) - .subscribe(object : BiResponse() { - override fun onSuccess(data: ResponseBody) { - topVideoDetail?.let { - it.me.isVideoFavorite = false - it.count.favorite-- - handleSuccessLiveData.postValue(true) - } - ToastUtils.toast("取消收藏") + .api.undoCollectVideo(UserManager.getInstance().userId, videoId) + .compose(singleToMain()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: ResponseBody) { + topVideoDetail?.let { + it.me.isVideoFavorite = false + it.count.favorite-- + handleSuccessLiveData.postValue(true) } + ToastUtils.toast("取消收藏") + } - override fun onFailure(exception: Exception) { - super.onFailure(exception) - Utils.toast(getApplication(), exception.localizedMessage) - } - }) + override fun onFailure(exception: Exception) { + super.onFailure(exception) + Utils.toast(getApplication(), exception.localizedMessage) + } + }) } fun followCommand() { @@ -189,31 +217,35 @@ class VideoDescViewModel(application: Application) : ListViewModel() { - override fun onResponse(response: ResponseBody?) { - super.onResponse(response) - topVideoDetail?.let { - if (!it.me.isFollower) { - ToastUtils.showToast("关注成功") - } - it.me.isFollower = !it.me.isFollower - } - handleSuccessLiveData.postValue(true) - - topVideoDetail?.run { - SyncPageRepository.postSyncData(SyncDataEntity(id, - SyncFieldConstants.IS_FOLLOWER, - me.isFollower, - checkFieldEntity = true)) - EventBus.getDefault().post(EBUserFollow(user.id, me.isFollower)) + .compose(observableToMain()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + topVideoDetail?.let { + if (!it.me.isFollower) { + ToastUtils.showToast("关注成功") } + it.me.isFollower = !it.me.isFollower } + handleSuccessLiveData.postValue(true) - override fun onFailure(e: HttpException?) { - super.onFailure(e) - ToastUtils.showToast("加载失败,请检查网络状态") + topVideoDetail?.run { + SyncPageRepository.postSyncData( + SyncDataEntity( + id, + SyncFieldConstants.IS_FOLLOWER, + me.isFollower, + checkFieldEntity = true + ) + ) + EventBus.getDefault().post(EBUserFollow(user.id, me.isFollower)) } - }) + } + + override fun onFailure(e: HttpException?) { + super.onFailure(e) + ToastUtils.showToast("加载失败,请检查网络状态") + } + }) } } \ No newline at end of file From 912b7280cddf6bf1dc1e886267738b9765080479 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Thu, 5 Aug 2021 17:15:48 +0800 Subject: [PATCH 027/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=910805=E4=BA=A7=E5=93=81=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=88=E7=AC=AC5=E7=82=B9?= =?UTF-8?q?=EF=BC=89https://git.ghzs.com/pm/halo-app-issues/-/issues/1434?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt index fc6fdc8b3b..a0f088b40d 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt @@ -367,6 +367,8 @@ class CommunityHomeFragment : LazyFragment() { @Subscribe(threadMode = ThreadMode.MAIN) fun onEventMainThread(status: EBTypeChange) { + if (mBinding?.viewPager?.currentItem != 0) return + if (status.type == CommunityFragment.EB_SHOW_QUESTION_BUTTON) { setPutQuestionButtonStatus(View.VISIBLE) } else if (status.type == CommunityFragment.EB_HIDE_QUESTION_BUTTON) { @@ -377,6 +379,7 @@ class CommunityHomeFragment : LazyFragment() { private fun setPutQuestionButtonStatus(visibility: Int) { mBinding?.run { if (communityEditBtn.visibility == visibility) return + if (visibility == View.GONE) { val animation = AnimationUtils.loadAnimation(context, R.anim.button_anim_exit) communityEditBtn.startAnimation(animation) From c06f397d12252ef38e502b8882191c64211eb4bd Mon Sep 17 00:00:00 2001 From: leafwai Date: Fri, 6 Aug 2021 10:08:34 +0800 Subject: [PATCH 028/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=910805=E4=BA=A7=E5=93=81=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=889,10,12=EF=BC=89https://git?= =?UTF-8?q?.ghzs.com/pm/halo-app-issues/-/issues/1434?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dialog/ApplyModeratorDialogFragment.kt | 24 ++- .../forum/moderator/ApplyModeratorActivity.kt | 9 +- .../forum/moderator/ApplyModeratorFragment.kt | 158 ++++++++++-------- .../forum/moderator/ModeratorListFragment.kt | 10 +- .../forum/moderator/ModeratorListViewModel.kt | 20 ++- .../res/layout/dialog_apply_moderator.xml | 40 +---- .../main/res/layout/item_moderator_task.xml | 4 +- .../main/res/layout/moderator_list_item.xml | 1 - 8 files changed, 144 insertions(+), 122 deletions(-) diff --git a/app/src/main/java/com/gh/common/dialog/ApplyModeratorDialogFragment.kt b/app/src/main/java/com/gh/common/dialog/ApplyModeratorDialogFragment.kt index 7d617e9454..789fbd76d2 100644 --- a/app/src/main/java/com/gh/common/dialog/ApplyModeratorDialogFragment.kt +++ b/app/src/main/java/com/gh/common/dialog/ApplyModeratorDialogFragment.kt @@ -1,6 +1,5 @@ package com.gh.common.dialog -import android.graphics.Paint import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -9,9 +8,13 @@ import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.FragmentTransaction import com.gh.base.fragment.BaseDialogFragment import com.gh.common.util.DirectUtils +import com.gh.common.util.SpanBuilder import com.gh.common.util.dip2px +import com.gh.common.view.CustomLinkMovementMethod +import com.gh.gamecenter.R import com.gh.gamecenter.databinding.DialogApplyModeratorBinding + class ApplyModeratorDialogFragment : BaseDialogFragment() { private lateinit var binding: DialogApplyModeratorBinding private var groupNumber = "" @@ -28,14 +31,17 @@ class ApplyModeratorDialogFragment : BaseDialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding.groupTv.text = groupNumber - binding.groupTv.paint.flags = Paint.UNDERLINE_TEXT_FLAG - binding.groupTv.setOnClickListener { - DirectUtils.directToQqGroup( - requireContext(), - binding.groupTv.text.toString() - ) - } + val startText = "版主考核群:" + val text= "$startText$groupNumber\n感谢你对论坛建设的支持\n请加入版主考核群并联系群主进行版主资格考核" + binding.desTv.text = SpanBuilder(text) + .click(startText.length, startText.length + groupNumber.length, R.color.theme_font,true) { + DirectUtils.directToQqGroup( + requireContext(), + groupNumber + ) + } + .build() + binding.desTv.movementMethod = CustomLinkMovementMethod.getInstance() binding.confirmTv.setOnClickListener { dismissAllowingStateLoss() mCallBack?.invoke() diff --git a/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorActivity.kt b/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorActivity.kt index 5e96bb8289..195f6f6eb2 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorActivity.kt @@ -9,12 +9,14 @@ import com.gh.common.util.DisplayUtils import com.gh.common.util.EntranceUtils import com.gh.gamecenter.NormalActivity import com.gh.gamecenter.R +import com.gh.gamecenter.entity.ApplyModeratorStatusEntity class ApplyModeratorActivity : NormalActivity() { companion object { - fun getIntent(context: Context, bbsId: String): Intent { + fun getIntent(context: Context, bbsId: String, status: ApplyModeratorStatusEntity): Intent { val bundle = Bundle() bundle.putString(EntranceUtils.KEY_BBS_ID, bbsId) + bundle.putParcelable("status", status) return getTargetIntent( context, ApplyModeratorActivity::class.java, @@ -34,10 +36,11 @@ class ApplyModeratorActivity : NormalActivity() { setStatusBarTransparent() } - private fun setStatusBarTransparent(){ + private fun setStatusBarTransparent() { DisplayUtils.transparentStatusBar(this) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR + window.decorView.systemUiVisibility = + View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR } } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorFragment.kt index 4e90cd518a..b7c2e15466 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorFragment.kt @@ -30,15 +30,17 @@ class ApplyModeratorFragment : NormalFragment() { private var mAdapter: ModeratorTaskAdapter? = null private var mDataList = ArrayList() private var mBbsId = "" + private var mStatus = ApplyModeratorStatusEntity() override fun getInflatedLayout() = FragmentApplyModeratorBinding - .inflate(layoutInflater, null, false) - .apply { mBinding = this } - .root + .inflate(layoutInflater, null, false) + .apply { mBinding = this } + .root override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mBbsId = arguments?.getString(EntranceUtils.KEY_BBS_ID) ?: "" + mStatus = arguments?.getParcelable("status") ?: ApplyModeratorStatusEntity() val factory = ApplyModeratorViewModel.Factory(mBbsId) mDataList = getModeratorTaskList() mViewModel = viewModelProvider(factory) @@ -68,81 +70,93 @@ class ApplyModeratorFragment : NormalFragment() { mBinding?.groupTv?.text = it.qqGroup } }) + if (mStatus.status == "todo"){ + mBinding?.run { + applyTv.text = "审核中" + applyTv.alpha = 0.4F + applyTv.setOnClickListener(null) + addGroupContainer.visibility = View.VISIBLE + } + } } private fun getModeratorTaskList(): ArrayList { return arrayListOf( - ApplyModeratorTaskEntity().apply { - taskName = "通过礼仪考试" - taskIcon = R.drawable.ic_moderator_task_etiquette - taskAction = View.OnClickListener { - val taskState = if (finishedTask) "已完成" else "未完成" - NewLogUtils.logApplyModeratorFinishClick(taskName, taskState) - if (!finishedTask) { - DirectUtils.directToRegulationTestPage(requireContext()) - } - } - }, - - ApplyModeratorTaskEntity().apply { - taskName = "完成实名认证" - taskIcon = R.drawable.ic_moderator_task_id_card - taskAction = View.OnClickListener { - val taskState = if (finishedTask) "已完成" else "未完成" - NewLogUtils.logApplyModeratorFinishClick(taskName, taskState) - if (!finishedTask) { - val currentActivity = AppManager.getInstance().currentActivity() - AvoidOnResultManager.getInstance(currentActivity as AppCompatActivity) - .startForResult( - UserInfoEditActivity.getIntent( - context, - UserViewModel.TYPE_ID_CARD - ), object : - Callback { - override fun onActivityResult(resultCode: Int, data: Intent?) { - - } - }) - } - } - }, - - ApplyModeratorTaskEntity().apply { - taskName = "论坛活跃度" - taskIcon = R.drawable.ic_moderator_task_activity - taskDescription = "活跃度=发帖数量+回帖数量+回复数量≥20" - taskAction = View.OnClickListener { - val taskState = if (finishedTask) "已完成" else "未完成" - NewLogUtils.logApplyModeratorFinishClick(taskName, taskState) - if (!finishedTask) { - startActivity( - ForumDetailActivity.getIntent( - requireContext(), - mBbsId, - "版主申请" - ) - ) - } - } - }, - - ApplyModeratorTaskEntity().apply { - taskName = "论坛精品帖≥2" - taskIcon = R.drawable.ic_moderator_task_choiceness - taskAction = View.OnClickListener { - val taskState = if (finishedTask) "已完成" else "未完成" - NewLogUtils.logApplyModeratorFinishClick(taskName, taskState) - if (!finishedTask) { - startActivity( - ForumDetailActivity.getIntent( - requireContext(), - mBbsId, - "版主申请" - ) - ) - } + ApplyModeratorTaskEntity().apply { + taskName = "通过礼仪考试" + taskIcon = R.drawable.ic_moderator_task_etiquette + taskAction = View.OnClickListener { + val taskState = if (finishedTask) "已完成" else "未完成" + NewLogUtils.logApplyModeratorFinishClick(taskName, taskState) + if (!finishedTask) { + DirectUtils.directToRegulationTestPage(requireContext()) } } + finishedTask = mStatus.condition.etiquette + }, + + ApplyModeratorTaskEntity().apply { + taskName = "完成实名认证" + taskIcon = R.drawable.ic_moderator_task_id_card + taskAction = View.OnClickListener { + val taskState = if (finishedTask) "已完成" else "未完成" + NewLogUtils.logApplyModeratorFinishClick(taskName, taskState) + if (!finishedTask) { + val currentActivity = AppManager.getInstance().currentActivity() + AvoidOnResultManager.getInstance(currentActivity as AppCompatActivity) + .startForResult( + UserInfoEditActivity.getIntent( + context, + UserViewModel.TYPE_ID_CARD + ), object : + Callback { + override fun onActivityResult(resultCode: Int, data: Intent?) { + + } + }) + } + finishedTask = mStatus.condition.idCard + } + }, + + ApplyModeratorTaskEntity().apply { + taskName = "论坛活跃度" + taskIcon = R.drawable.ic_moderator_task_activity + taskDescription = "活跃度=发帖数量+回帖数量+回复数量≥20" + taskAction = View.OnClickListener { + val taskState = if (finishedTask) "已完成" else "未完成" + NewLogUtils.logApplyModeratorFinishClick(taskName, taskState) + if (!finishedTask) { + startActivity( + ForumDetailActivity.getIntent( + requireContext(), + mBbsId, + "版主申请" + ) + ) + } + } + finishedTask = mStatus.condition.activity + }, + + ApplyModeratorTaskEntity().apply { + taskName = "论坛精品帖≥2" + taskIcon = R.drawable.ic_moderator_task_choiceness + taskAction = View.OnClickListener { + val taskState = if (finishedTask) "已完成" else "未完成" + NewLogUtils.logApplyModeratorFinishClick(taskName, taskState) + if (!finishedTask) { + startActivity( + ForumDetailActivity.getIntent( + requireContext(), + mBbsId, + "版主申请" + ) + ) + } + } + finishedTask = mStatus.condition.choiceness + } ) } diff --git a/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListFragment.kt index e0ce7310ff..e75c13cd20 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListFragment.kt @@ -13,6 +13,7 @@ import com.gh.common.constant.Constants import com.gh.common.util.* import com.gh.gamecenter.NewsDetailActivity import com.gh.gamecenter.R +import com.gh.gamecenter.entity.ApplyModeratorStatusEntity import com.gh.gamecenter.eventbus.EBUserFollow import com.gh.gamecenter.normal.NormalFragment import kotterknife.bindView @@ -33,6 +34,7 @@ class ModeratorListFragment : NormalFragment() { private var mAdapter: ModeratorListAdapter? = null private var mBbsId: String = "" private var mBbsType: String = "" + private var mStatus: ApplyModeratorStatusEntity = ApplyModeratorStatusEntity() override fun getLayoutId(): Int = R.layout.fragment_moderator_list override fun onCreate(savedInstanceState: Bundle?) { @@ -75,6 +77,10 @@ class ModeratorListFragment : NormalFragment() { mNoConnection.visibility = View.VISIBLE } }) + + mViewModel?.statusEntity?.observe(this, Observer { + it?.run { mStatus = this } + }) } @@ -107,7 +113,8 @@ class ModeratorListFragment : NormalFragment() { requireContext().startActivity( ApplyModeratorActivity.getIntent( requireContext(), - mBbsId + mBbsId, + mStatus ) ) } @@ -130,6 +137,7 @@ class ModeratorListFragment : NormalFragment() { override fun onResume() { super.onResume() mViewModel?.getModeratorsInfo() + mViewModel?.getModeratorsApplyStatus() } override fun onStop() { diff --git a/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListViewModel.kt b/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListViewModel.kt index dc9d3b9a7d..82a8efcad9 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListViewModel.kt @@ -7,6 +7,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.gh.gamecenter.R +import com.gh.gamecenter.entity.ApplyModeratorStatusEntity import com.gh.gamecenter.entity.PersonalEntity import com.gh.gamecenter.eventbus.EBUserFollow import com.gh.gamecenter.retrofit.BiResponse @@ -27,10 +28,27 @@ class ModeratorListViewModel(application: Application, val bbsId: String) : val moderators = MutableLiveData>() val qqGroupNumber = MutableLiveData() val isModerators = MutableLiveData() + val statusEntity = MutableLiveData() init { getModerators() - getModeratorsInfo() + } + + fun getModeratorsApplyStatus() { + RetrofitManager.getInstance(getApplication()).api.getApplyModeratorStatus(bbsId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: ApplyModeratorStatusEntity?) { + super.onResponse(response) + statusEntity.postValue(response) + } + + override fun onFailure(e: HttpException?) { + super.onFailure(e) + statusEntity.postValue(null) + } + }) } fun getModerators() { diff --git a/app/src/main/res/layout/dialog_apply_moderator.xml b/app/src/main/res/layout/dialog_apply_moderator.xml index 7c3ff8b2e8..9cd630d545 100644 --- a/app/src/main/res/layout/dialog_apply_moderator.xml +++ b/app/src/main/res/layout/dialog_apply_moderator.xml @@ -22,6 +22,7 @@ android:id="@+id/titleTv" android:layout_width="match_parent" android:layout_height="wrap_content" + android:includeFontPadding="false" android:text="提交申请成功" android:textAlignment="center" android:textColor="@color/text_333333" @@ -31,58 +32,31 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - - - - - - - + app:layout_constraintTop_toBottomOf="@+id/titleTv" + app:lineHeight="22dp" + tools:text="版主考核群:\n感谢你对论坛建设的支持\n请加入版主考核群并联系群主进行版主资格考核" /> + android:paddingLeft="16dp" + android:paddingRight="16dp"> Date: Fri, 6 Aug 2021 10:17:12 +0800 Subject: [PATCH 029/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA2=E6=9C=9F-?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E5=B1=95=E7=A4=BA-=E6=8F=90=E9=97=AE?= =?UTF-8?q?=E5=B8=96=E8=AF=A6=E6=83=85=E9=A1=B5(0806UI=E6=B5=8B=E8=AF=951)?= =?UTF-8?q?=20https://git.ghzs.com/pm/halo-app-issues/-/issues/1347?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/item_article_detail_comment.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/item_article_detail_comment.xml b/app/src/main/res/layout/item_article_detail_comment.xml index fe90d85ad0..369e1070cf 100644 --- a/app/src/main/res/layout/item_article_detail_comment.xml +++ b/app/src/main/res/layout/item_article_detail_comment.xml @@ -148,8 +148,8 @@ Date: Fri, 6 Aug 2021 11:07:10 +0800 Subject: [PATCH 030/151] =?UTF-8?q?=E8=B0=83=E6=95=B4=20Kotlin=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC=EF=BC=8C=E4=BF=AE=E5=A4=8D=20XAPK=20=E8=A7=A3?= =?UTF-8?q?=E5=8E=8B=E5=9C=A8=204.4=20=E4=BB=A5=E4=B8=8B=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E7=9A=84=E9=97=AA=E9=80=80=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/xapk/XapkUnzipThread.kt | 35 +++++++++++++------ build.gradle | 2 +- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/gh/common/xapk/XapkUnzipThread.kt b/app/src/main/java/com/gh/common/xapk/XapkUnzipThread.kt index 067ea0f210..f5379c7333 100644 --- a/app/src/main/java/com/gh/common/xapk/XapkUnzipThread.kt +++ b/app/src/main/java/com/gh/common/xapk/XapkUnzipThread.kt @@ -46,7 +46,7 @@ class XapkUnzipThread(private var mDownloadEntity: DownloadEntity, val absolutePath = Environment.getExternalStorageDirectory().absolutePath val xapkFile = File(path) - ZipFile(xapkFile).use { zip -> + val unzipClosure: (zip: ZipFile) -> Unit = { zip -> for (zipEntry in zip.entries().asSequence()) { val outputFile = if (zipEntry.name.getExtension() == XapkInstaller.XAPK_DATA_EXTENSION_NAME) { File(absolutePath + File.separator + zipEntry.name) @@ -91,7 +91,7 @@ class XapkUnzipThread(private var mDownloadEntity: DownloadEntity, bytes = input.read(buffer) if (canceled) { mUnzipListener.onCancel(mDownloadEntity) - return + return@use } else { // 防止多次短时间内多次触发onProgress方法导致阻塞主线程(低端机会出现十分明显的卡顿) debounceActionWithInterval(-1, 500) { @@ -104,6 +104,16 @@ class XapkUnzipThread(private var mDownloadEntity: DownloadEntity, mUnzipListener.onNext(mDownloadEntity, outputFile.path) } } + + // Kotlin 1.4.X 在安卓 4.4 以下使用 use 默认关闭 ZipFile 的流时会触发 + // java.lang.IncompatibleClassChangeError: interface not implemented 的 Error (Throwable) + // 但实测是不影响解压的,所以这里换用 let 不关闭流,确保不闪退,并且不影响解压结果 + // 帮用户解压了,但游戏能不能安装就看天吧 (毕竟支持4.X的游戏也不多了) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + ZipFile(File(path)).use { unzipClosure.invoke(it) } + } else { + ZipFile(File(path)).let { unzipClosure.invoke(it) } + } mUnzipListener.onSuccess(mDownloadEntity) } catch (e: Exception) { if (BuildConfig.DEBUG) throw e @@ -208,18 +218,21 @@ class XapkUnzipThread(private var mDownloadEntity: DownloadEntity, private fun getUnzipSize(path: String): Long { var totalSize = 0L - // 这里安卓5.0以下使用use会报错闪退 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - ZipFile(File(path)).use { - for (entry in it.entries()) { - totalSize += entry.size - } - } - } else { - for (entry in ZipFile(File(path)).entries()) { + + val calculateSizeClosure: (zip: ZipFile) -> Unit = { zip -> + for (entry in zip.entries()) { totalSize += entry.size } } + + // Kotlin 1.4.X 在安卓 4.4 以下使用 use 默认ZipFile 的流时会触发 + // java.lang.IncompatibleClassChangeError: interface not implemented 的 Error (Throwable) + // 实测是不影响解压,所以这里换用 let 不关闭流,确保不闪退 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + ZipFile(File(path)).use { calculateSizeClosure.invoke(it) } + } else { + ZipFile(File(path)).let { calculateSizeClosure.invoke(it) } + } return totalSize } } \ No newline at end of file diff --git a/build.gradle b/build.gradle index 1c432c2040..fa4e698040 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ apply from: 'dependencies.gradle' buildscript { - ext.kotlin_version = '1.3.72' + ext.kotlin_version = '1.4.20' repositories { google() From 8b7cd92ae80c1187f57061c488d28fba4d1fb284 Mon Sep 17 00:00:00 2001 From: juntao Date: Fri, 6 Aug 2021 11:21:46 +0800 Subject: [PATCH 031/151] =?UTF-8?q?=E5=BE=AE=E8=B0=83=20chucker=20?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/build_with_chucker_open.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/build_with_chucker_open.sh b/scripts/build_with_chucker_open.sh index 93d8cc8d62..627a86469f 100755 --- a/scripts/build_with_chucker_open.sh +++ b/scripts/build_with_chucker_open.sh @@ -9,8 +9,8 @@ build_time_without_divider=$(TZ=Asia/Shanghai date +'%Y%m%d%H%M')L git checkout app/build.gradle git checkout gradle.properties -sed -i '/debugImplementation "com.github.nichbar.chucker:library:$chucker"/c\ implementation "com.github.nichbar.chucker:library:$chucker"' app/build.gradle -sed -i '/releaseImplementation "com.github.nichbar.chucker:library-no-op:$chucker"/c\' app/build.gradle +sed -i '/debugImplementation "com.github.nichbar.chucker:library:${chucker}"/c\ implementation "com.github.nichbar.chucker:library:${chucker}"' app/build.gradle +sed -i '/releaseImplementation "com.github.nichbar.chucker:library-no-op:${chucker}"/c\' app/build.gradle ./gradlew --stop ./gradlew clean From 30865239d2e100bae2293ffe196bb6e09453634a Mon Sep 17 00:00:00 2001 From: leafwai Date: Fri, 6 Aug 2021 11:31:09 +0800 Subject: [PATCH 032/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200806=E4=BA=A7=E5=93=81=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98(3)https://git.ghz?= =?UTF-8?q?s.com/pm/halo-app-issues/-/issues/1436?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../forum/moderator/ModeratorListFragment.kt | 13 ------ .../res/layout/fragment_moderator_list.xml | 42 ++----------------- 2 files changed, 3 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListFragment.kt index e75c13cd20..409663d637 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListFragment.kt @@ -25,11 +25,9 @@ class ModeratorListFragment : NormalFragment() { private val mReuseLoading by bindView(R.id.reuse_ll_loading) private val mNoConnection by bindView(R.id.reuse_no_connection) private val mNoneData by bindView(R.id.reuse_none_data) - private val mGroupContainer by bindView(R.id.groupContainer) private val mToolbar by bindView(R.id.toolbar) private val mDoubtIv by bindView(R.id.doubtIv) private val mApplyTv by bindView(R.id.applyTv) - private val mGroupTv by bindView(R.id.groupTv) private var mViewModel: ModeratorListViewModel? = null private var mAdapter: ModeratorListAdapter? = null private var mBbsId: String = "" @@ -45,10 +43,6 @@ class ModeratorListFragment : NormalFragment() { val factory = ModeratorListViewModel.Factory(mBbsId) mViewModel = viewModelProvider(factory) - mViewModel?.qqGroupNumber?.observe(this, Observer { - mGroupTv.text = it - }) - mViewModel?.isModerators?.observe(this, Observer { if (it) { mApplyTv.background = R.drawable.bg_forum_follow.toDrawable() @@ -67,7 +61,6 @@ class ModeratorListFragment : NormalFragment() { mNoConnection.visibility = View.GONE if (it.isNotEmpty()) { mNoneData.visibility = View.GONE - mGroupContainer.visibility = View.VISIBLE mAdapter?.setListData(it) } else { mNoneData.visibility = View.VISIBLE @@ -119,12 +112,6 @@ class ModeratorListFragment : NormalFragment() { ) } } - mGroupTv.setOnClickListener { - DirectUtils.directToQqGroup( - requireContext(), - mGroupTv.text.toString() - ) - } } @Subscribe(threadMode = ThreadMode.MAIN) diff --git a/app/src/main/res/layout/fragment_moderator_list.xml b/app/src/main/res/layout/fragment_moderator_list.xml index 3623fb3664..d2542d46a9 100644 --- a/app/src/main/res/layout/fragment_moderator_list.xml +++ b/app/src/main/res/layout/fragment_moderator_list.xml @@ -52,46 +52,10 @@ android:layout_below="@+id/toolbarContainer" android:background="@color/white"> - - - - - - - - - - - - - - - + android:layout_height="wrap_content" /> Date: Fri, 6 Aug 2021 11:46:27 +0800 Subject: [PATCH 033/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=910805=E8=BF=90=E8=90=A5=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=97=AE=E9=A2=98(4,6,8)=20https://git.ghzs.com/pm/ha?= =?UTF-8?q?lo-app-issues/-/issues/1435?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../newdetail/NewQuestionDetailFragment.kt | 14 ++- .../detail/desc/VideoDescTopViewHolder.kt | 94 +++++++++++++------ .../qa/video/publish/VideoPublishFragment.kt | 5 - 3 files changed, 75 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailFragment.kt index 2fd5981bc4..e5f9b9b733 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailFragment.kt @@ -479,8 +479,12 @@ class NewQuestionDetailFragment : if ((questionEntity.me.isModerator || questionEntity.user.id == UserManager.getInstance().userId) && questionEntity.status == "pass") { entities.add(MenuItemEntity("编辑", R.drawable.icon_more_panel_edit)) } - if (questionEntity.me.isModerator || questionEntity.user.id == UserManager.getInstance().userId) { - entities.add(MenuItemEntity("删除", R.drawable.icon_more_panel_delete)) + if (questionEntity.me.isModerator) { + entities.add(MenuItemEntity("隐藏", R.drawable.icon_more_panel_delete)) + } else { + if (questionEntity.user.id == UserManager.getInstance().userId) { + entities.add(MenuItemEntity("删除", R.drawable.icon_more_panel_delete)) + } } val shareIcon = if (questionEntity.images.isNotEmpty()) { questionEntity.images[0] @@ -550,13 +554,13 @@ class NewQuestionDetailFragment : ) } - "删除" -> { + "删除", "隐藏" -> { DialogUtils.showNewAlertDialog( requireContext(), "提示", - "删除问题后,其中的所有回答都将被删除", + "${it.text}问题后,其中的所有回答都将被${it.text}", "取消", - "删除", + it.text, {}, { mListViewModel.moderatorsHideQuestion() diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt index 13333ab040..83ace2c312 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt @@ -17,8 +17,14 @@ import com.gh.gamecenter.entity.ForumVideoEntity import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.qa.video.detail.ForumVideoDetailViewModel -class VideoDescTopViewHolder(val binding: ItemVideoDescTopBinding, var mIsExpand: Boolean, var mShrinkHeight: Int, var mExpandHeight: Int, - val mVideoDetailViewModel: ForumVideoDetailViewModel, val mViewModel: VideoDescViewModel) : BaseRecyclerViewHolder(binding.root) { +class VideoDescTopViewHolder( + val binding: ItemVideoDescTopBinding, + var mIsExpand: Boolean, + var mShrinkHeight: Int, + var mExpandHeight: Int, + val mVideoDetailViewModel: ForumVideoDetailViewModel, + val mViewModel: VideoDescViewModel +) : BaseRecyclerViewHolder(binding.root) { private var mIsAnimationFinish = true fun bindData(entity: ForumVideoEntity) { binding.entity = entity @@ -26,53 +32,79 @@ class VideoDescTopViewHolder(val binding: ItemVideoDescTopBinding, var mIsExpand binding.executePendingBindings() if (entity.original == "yes") { binding.originalTv.visibility = View.VISIBLE - binding.activityNameTv.layoutParams = (binding.activityNameTv.layoutParams as ConstraintLayout.LayoutParams).apply { - leftMargin = 8f.dip2px() - } + binding.activityNameTv.layoutParams = + (binding.activityNameTv.layoutParams as ConstraintLayout.LayoutParams).apply { + leftMargin = 8f.dip2px() + } } if (entity.choicenessStatus == "pass") { - binding.titleTv.text = SpanBuilder(" ${entity.title}").image(0, 1, R.drawable.ic_essence).build() + binding.titleTv.text = + SpanBuilder(" ${entity.title}").image(0, 1, R.drawable.ic_essence).build() } initAnimation(entity) val bbsType = if (entity.bbs?.type == "game_bbs") "游戏论坛" else "综合论坛" binding.userAvatar.setOnClickListener { DirectUtils.directToHomeActivity(binding.root.context, entity.user.id, "视频详情", "") - NewLogUtils.logVideoDetailClick("click_detail_tab_profile_photo", entity.user.id, - "视频贴", entity.bbs?.id ?: "", bbsType) + NewLogUtils.logVideoDetailClick( + "click_detail_tab_profile_photo", entity.user.id, + "视频贴", entity.bbs?.id ?: "", bbsType + ) } binding.userNameTv.setOnClickListener { DirectUtils.directToHomeActivity(binding.root.context, entity.user.id, "视频详情", "") - NewLogUtils.logVideoDetailClick("click_detail_tab_nickname", entity.user.id, - "视频贴", entity.bbs?.id ?: "", bbsType) + NewLogUtils.logVideoDetailClick( + "click_detail_tab_nickname", entity.user.id, + "视频贴", entity.bbs?.id ?: "", bbsType + ) } binding.likeContainer.setOnClickListener { debounceActionWithInterval(it.id, 2000) { mViewModel.postVote() - NewLogUtils.logVideoDetailClick("click_detail_tab_like", entity.user.id, - "视频贴", entity.bbs?.id ?: "", bbsType, entity.id) + NewLogUtils.logVideoDetailClick( + "click_detail_tab_like", entity.user.id, + "视频贴", entity.bbs?.id ?: "", bbsType, entity.id + ) } } binding.collectContainer.setOnClickListener { debounceActionWithInterval(it.id) { mViewModel.postFavorite() - NewLogUtils.logVideoDetailClick("click_detail_tab_collect", entity.user.id, - "视频贴", entity.bbs?.id ?: "", bbsType, entity.id) + NewLogUtils.logVideoDetailClick( + "click_detail_tab_collect", entity.user.id, + "视频贴", entity.bbs?.id ?: "", bbsType, entity.id + ) } } binding.concernBtn.setOnClickListener { if (entity.user.id != UserManager.getInstance().userId) { debounceActionWithInterval(it.id) { - mViewModel.followCommand() - NewLogUtils.logVideoDetailClick("click_detail_tab_follow", entity.user.id, - "视频贴", entity.bbs?.id ?: "", bbsType) + if (!entity.me.isFollower) { + mViewModel.followCommand() + } else { + DialogHelper.showDialog( + binding.concernBtn.context, + "提示", + "确定要取消关注 ${entity.user.name} 吗?", + "确定取消", + "暂不取消", + { + mViewModel.followCommand() + }) + } + NewLogUtils.logVideoDetailClick( + "click_detail_tab_follow", entity.user.id, + "视频贴", entity.bbs?.id ?: "", bbsType + ) } } } binding.shareContainer.setOnClickListener { share(entity) - NewLogUtils.logVideoDetailClick("click_detail_tab_share", entity.user.id, - "视频贴", entity.bbs?.id ?: "", bbsType, entity.id) + NewLogUtils.logVideoDetailClick( + "click_detail_tab_share", entity.user.id, + "视频贴", entity.bbs?.id ?: "", bbsType, entity.id + ) } } @@ -83,7 +115,9 @@ class VideoDescTopViewHolder(val binding: ItemVideoDescTopBinding, var mIsExpand } else mShrinkHeight mExpandHeight = if (mExpandHeight == 0) { - getTextViewHeight(binding.titleTv) + getTextViewHeight(binding.desTv) + getTextViewHeight(binding.activityNameTv) + + getTextViewHeight(binding.titleTv) + getTextViewHeight(binding.desTv) + getTextViewHeight( + binding.activityNameTv + ) + (if (binding.desTv.visibility == View.VISIBLE) binding.desTv.marginTop else 0) + (if (binding.activityNameTv.visibility == View.VISIBLE) binding.activityNameTv.marginTop else 0) } else mExpandHeight @@ -97,7 +131,8 @@ class VideoDescTopViewHolder(val binding: ItemVideoDescTopBinding, var mIsExpand } //若标题未超过一行或无描述内容和活动标签,箭头不显示 - val ellipsisCount = binding.titleTv.layout.getEllipsisCount(binding.titleTv.lineCount - 1) + val ellipsisCount = + binding.titleTv.layout.getEllipsisCount(binding.titleTv.lineCount - 1) binding.expandMoreIv.goneIf(entity.des.isEmpty() && entity.tagActivityName.isEmpty() && ellipsisCount == 0) } binding.expandMoreIv.setOnClickListener { @@ -139,20 +174,23 @@ class VideoDescTopViewHolder(val binding: ItemVideoDescTopBinding, var mIsExpand } else { "https://resource.ghzs.com/page/video_play/video/video.html?video=${entity.id}" } - ShareUtils.getInstance(binding.root.context).showShareWindowsCallback(binding.root.context as Activity, + ShareUtils.getInstance(binding.root.context) + .showShareWindowsCallback(binding.root.context as Activity, (binding.root.context as Activity).window.decorView, shareUrl, shareIcon, entity.title, entity.des, ShareUtils.ShareEntrance.video, entity.id, object : ShareUtils.ShareCallBack { - override fun onSuccess(label: String) { - if ("短信" == label || "复制链接" == label) mVideoDetailViewModel.shareVideoStatistics(entity) - } + override fun onSuccess(label: String) { + if ("短信" == label || "复制链接" == label) mVideoDetailViewModel.shareVideoStatistics( + entity + ) + } - override fun onCancel() { - } - }) + override fun onCancel() { + } + }) } private fun updateTitleContainerHeight(newHeight: Int) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt index e259483ded..fcd7e126d3 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt @@ -656,11 +656,6 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { return } - if (!isDraft && !mBinding.originalTv.isChecked && !mBinding.reprintTv.isChecked) { - toast("请选择内容来源") - return - } - if (!isDraft && mViewModel.selectActivityLabelEntity != null && !mBinding.originalTv.isChecked) { toast("本次活动内容要求原创") return From 4784d689f8d85a5ca7bdc2d53672d82bdb417132 Mon Sep 17 00:00:00 2001 From: juntao Date: Fri, 6 Aug 2021 12:00:31 +0800 Subject: [PATCH 034/151] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=86=85=E5=B5=8C?= =?UTF-8?q?=E7=BD=91=E9=A1=B5=E7=9A=84=E4=B8=80=E4=BA=9B=E7=A9=BA=E6=8C=87?= =?UTF-8?q?=E9=92=88=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/halo/assistant/fragment/WebFragment.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/halo/assistant/fragment/WebFragment.java b/app/src/main/java/com/halo/assistant/fragment/WebFragment.java index c719db43be..de1e952572 100644 --- a/app/src/main/java/com/halo/assistant/fragment/WebFragment.java +++ b/app/src/main/java/com/halo/assistant/fragment/WebFragment.java @@ -571,12 +571,12 @@ public class WebFragment extends LazyFragment implements IScrollable { return false; } else if (!TextUtils.isEmpty(mGameName)) { return false; - } else if (mIsWebPageHandleBackPressed) { + } else if (mWebView != null && mIsWebPageHandleBackPressed) { mWebView.callHandler("onBackPressed", retValue -> { // do nothing }); return true; - } else if (mWebView.canGoBack()) { + } else if (mWebView != null && mWebView.canGoBack()) { mWebView.goBack(); return true; } else if (isDisplayingLogoutPage()) { @@ -632,7 +632,9 @@ public class WebFragment extends LazyFragment implements IScrollable { @Override public void scrollToTop() { - mWebView.scrollTo(0, 0); + if (mWebView != null) { + mWebView.scrollTo(0, 0); + } } /** From c509c6bb380df8faf439194094b4f36d71bea7d5 Mon Sep 17 00:00:00 2001 From: juntao Date: Fri, 6 Aug 2021 12:01:23 +0800 Subject: [PATCH 035/151] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E6=96=B9=E5=BC=8F=E5=90=AF=E5=8A=A8=E6=A8=A1?= =?UTF-8?q?=E6=8B=9F=E5=99=A8=E6=B8=B8=E6=88=8F=E5=A4=B1=E8=B4=A5=E7=9A=84?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/gamecenter/MainActivity.java | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index ad1acc99ce..021731a673 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -61,6 +61,7 @@ import com.gh.common.util.PackageUtils; import com.gh.common.util.PlatformUtils; import com.gh.common.util.QuickLoginHelper; import com.gh.common.util.SPUtils; +import com.gh.common.util.SentryHelper; import com.gh.common.util.ShareUtils; import com.gh.common.util.ToastUtils; import com.gh.common.util.UrlFilterUtils; @@ -93,6 +94,7 @@ import com.github.piasy.biv.BigImageViewer; import com.github.piasy.biv.loader.fresco.FrescoImageLoader; import com.google.android.exoplayer2.upstream.cache.Cache; import com.google.gson.Gson; +import com.google.gson.JsonSyntaxException; import com.google.gson.reflect.TypeToken; import com.halo.assistant.HaloApp; import com.lightgame.download.DownloadEntity; @@ -553,17 +555,27 @@ public class MainActivity extends BaseActivity { break; case HOST_LAUNCH_SIMULATOR_GAME: String json = getIntent().getStringExtra(EntranceUtils.KEY_GAME); - GameEntity gameEntity = GsonUtils.getGson().fromJson(json, new TypeToken() { - }.getType()); - DownloadEntity downloadEntity = SimulatorGameManager.findDownloadEntityByUrl(gameEntity.getApk().get(0).getUrl()); - if (downloadEntity != null) { - File file = new File(downloadEntity.getPath()); - if (!file.exists()) { - ToastUtils.INSTANCE.showToast("文件已被删除,无法启动"); - return; - } + try { + GameEntity gameEntity = GsonUtils.getGson().fromJson(json, new TypeToken() { + }.getType()); + DownloadEntity downloadEntity = SimulatorGameManager.findDownloadEntityByUrl(gameEntity.getApk().get(0).getUrl()); + if (downloadEntity != null) { + File file = new File(downloadEntity.getPath()); + if (!file.exists()) { + ToastUtils.INSTANCE.showToast("文件已被删除,无法启动"); + return; + } - SimulatorGameManager.launchSimulatorGame(downloadEntity, gameEntity); + SimulatorGameManager.launchSimulatorGame(downloadEntity, gameEntity); + } + } catch (JsonSyntaxException exception) { + exception.printStackTrace(); + toast("模拟器游戏启动失败,请联系客服反馈相关信息"); + SentryHelper.INSTANCE.onEvent( + "SIMULATOR_SHORTCUT_LAUNCH_ERROR", + "raw_json", + json + ); } break; case KEY_MARKET_DETAILS: From dcc9352301629af67d62e0f82feab759029e095e Mon Sep 17 00:00:00 2001 From: juntao Date: Fri, 6 Aug 2021 14:34:43 +0800 Subject: [PATCH 036/151] =?UTF-8?q?=E8=B0=83=E6=95=B4=20Kotlin=20=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- buildSrc/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index f96cf65788..aaa1d7b0e7 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -1,6 +1,6 @@ buildscript { ext { - kotlinVersion = "1.3.72" + kotlinVersion = "1.4.20" } repositories { google() @@ -20,7 +20,7 @@ dependencies { implementation "com.android.tools.build:gradle:4.1.0" implementation "commons-io:commons-io:2.4" implementation "org.javassist:javassist:3.25.0-GA" - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion" } repositories { google() From ec37c7a6f85c2966d64260ad88db1a93edebc935 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Mon, 9 Aug 2021 09:28:17 +0800 Subject: [PATCH 037/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200806=E4=BA=A7=E5=93=81=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98(7)=20https://git.?= =?UTF-8?q?ghzs.com/pm/halo-app-issues/-/issues/1436?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../video/detail/ForumVideoDetailFragment.kt | 1 + .../video/detail/ForumVideoDetailViewModel.kt | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt index 9bf07df59e..f9e195317e 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt @@ -209,6 +209,7 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { } else { updateToolbarParams(mVideoHeight / 2) } + mViewModel.addHistoryRecord(entity) } else { mBinding.container.visibility = View.GONE if (it.exception != null && it.exception.code() == 404) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailViewModel.kt index 6c72f90629..862c6020c0 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailViewModel.kt @@ -6,14 +6,19 @@ import android.net.Uri import android.text.TextUtils import androidx.lifecycle.* import com.gh.common.constant.Constants +import com.gh.common.history.HistoryDatabase import com.gh.common.json.json +import com.gh.common.runOnIoThread import com.gh.common.util.* import com.gh.gamecenter.entity.ActivityLabelEntity import com.gh.gamecenter.entity.ForumVideoEntity +import com.gh.gamecenter.entity.MyVideoEntity +import com.gh.gamecenter.entity.User import com.gh.gamecenter.mvvm.Resource import com.gh.gamecenter.retrofit.BiResponse import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager +import com.gh.gamecenter.video.detail.VideoDetailContainerViewModel import com.google.gson.JsonObject import com.halo.assistant.HaloApp import io.reactivex.schedulers.Schedulers @@ -148,6 +153,25 @@ class ForumVideoDetailViewModel(application: Application, val videoId: String) : }) } + fun addHistoryRecord(videoEntity: ForumVideoEntity) { + val videoHistory = MyVideoEntity().apply { + id = videoEntity.id + poster = videoEntity.poster + url = videoEntity.url + vote = videoEntity.count.vote + length = videoEntity.length + time = System.currentTimeMillis() + title = videoEntity.title + user = User( + videoEntity.user.id, videoEntity.user.name, videoEntity.user.icon + ) + commentCount = videoEntity.count.comment + videoStreamRecord = 0 + } + + runOnIoThread { tryCatchInRelease { HistoryDatabase.instance.videoHistoryDao().addVideo(videoHistory) } } + } + fun isTopVideoPartlyCached(topVideoUrl: String): Boolean { val cache = ExoSourceManager.getCacheSingleInstance(HaloApp.getInstance().application, null) val key = Uri.parse(topVideoUrl).toString() From 95dba71bb9f5316d5e85b2c47ad65e1fa16cb82c Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 9 Aug 2021 10:17:16 +0800 Subject: [PATCH 038/151] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E7=99=BB=E5=BD=95=20JS=20Api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/DefaultJsApi.kt | 13 +++++++++++++ .../com/halo/assistant/fragment/WebFragment.java | 2 ++ 2 files changed, 15 insertions(+) diff --git a/app/src/main/java/com/gh/common/DefaultJsApi.kt b/app/src/main/java/com/gh/common/DefaultJsApi.kt index 071486612a..4d3c2fcef3 100644 --- a/app/src/main/java/com/gh/common/DefaultJsApi.kt +++ b/app/src/main/java/com/gh/common/DefaultJsApi.kt @@ -45,6 +45,8 @@ import kotlin.collections.ArrayList class DefaultJsApi(var context: Context) { + private var mLoginHandler: CompletionHandler? = null + @JavascriptInterface fun isGhzs(msg: Any): String { return "true" @@ -374,6 +376,17 @@ class DefaultJsApi(var context: Context) { } } + @JavascriptInterface + fun loginWithCallback(msg: Any, handler: CompletionHandler) { + mLoginHandler = handler + login(msg) + } + + fun onLogin() { + mLoginHandler?.complete(true) + mLoginHandler = null + } + @Keep internal data class ImageEvent(var imageList: ArrayList = arrayListOf(), var position: Int = 0) diff --git a/app/src/main/java/com/halo/assistant/fragment/WebFragment.java b/app/src/main/java/com/halo/assistant/fragment/WebFragment.java index de1e952572..47dab53c06 100644 --- a/app/src/main/java/com/halo/assistant/fragment/WebFragment.java +++ b/app/src/main/java/com/halo/assistant/fragment/WebFragment.java @@ -612,6 +612,8 @@ public class WebFragment extends LazyFragment implements IScrollable { .equals(Constants.EB_QUIT_LOGIN)) { mWebView.reload(); } + } else { + mJsApi.onLogin(); } } } From ef701190907df20f3c4cd41692cfd5bda2d491b5 Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 9 Aug 2021 11:56:16 +0800 Subject: [PATCH 039/151] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8D=20?= =?UTF-8?q?Loghub=20=E6=97=A5=E5=BF=97=E4=B8=8A=E6=8A=A5=20logstore=20?= =?UTF-8?q?=E9=94=99=E4=B9=B1=E7=9A=84=E9=97=AE=E9=A2=98=20https://github.?= =?UTF-8?q?com/aliyun/aliyun-log-android-sdk/issues/68?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/loghub/LoghubHelper.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/common/loghub/LoghubHelper.kt b/app/src/main/java/com/gh/common/loghub/LoghubHelper.kt index 708965bdbd..bc3895ddd4 100644 --- a/app/src/main/java/com/gh/common/loghub/LoghubHelper.kt +++ b/app/src/main/java/com/gh/common/loghub/LoghubHelper.kt @@ -41,7 +41,7 @@ object LoghubHelper { // 每次发送前会把日志保存到本地的binlog文件,只有发送成功才会删除,保证日志上传At Least Once setPersistent(1) // 持久化的文件名,需要保证文件所在的文件夹已创建。配置多个客户端时,不应设置相同文件 - setPersistentFilePath(HaloApp.getInstance().application.filesDir.absolutePath + "/log.dat") + setPersistentFilePath(HaloApp.getInstance().application.filesDir.absolutePath + "/${logStore}.dat") // 是否每次AddLog强制刷新,高可靠性场景建议打开 setPersistentForceFlush(1) // 持久化文件滚动个数,建议设置成10。 From 096d19751a6c8d790b788d7a9227db34e3387935 Mon Sep 17 00:00:00 2001 From: leafwai Date: Mon, 9 Aug 2021 15:15:41 +0800 Subject: [PATCH 040/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=910805=E4=BA=A7=E5=93=81=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=889=EF=BC=89https://git.ghzs.?= =?UTF-8?q?com/pm/halo-app-issues/-/issues/1434?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/gamecenter/forum/moderator/ApplyModeratorFragment.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorFragment.kt index b7c2e15466..162603cfa3 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorFragment.kt @@ -62,15 +62,15 @@ class ApplyModeratorFragment : NormalFragment() { groupTv.text.toString() ) } + groupTv.text = mStatus.qqGroup } mAdapter?.setListData(mDataList) mViewModel?.statusEntity?.observe(this, Observer { it?.let { checkStatus(it) - mBinding?.groupTv?.text = it.qqGroup } }) - if (mStatus.status == "todo"){ + if (mStatus.status == "todo") { mBinding?.run { applyTv.text = "审核中" applyTv.alpha = 0.4F @@ -115,8 +115,8 @@ class ApplyModeratorFragment : NormalFragment() { } }) } - finishedTask = mStatus.condition.idCard } + finishedTask = mStatus.condition.idCard }, ApplyModeratorTaskEntity().apply { From d9c2371488e681d08d19474ad62f94c9cac2614c Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Mon, 9 Aug 2021 15:42:15 +0800 Subject: [PATCH 041/151] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E5=86=97=E4=BD=99?= =?UTF-8?q?=E7=9A=84=E8=B5=84=E6=BA=90=E6=96=87=E4=BB=B6=20https://git.ghz?= =?UTF-8?q?s.com/halo/android/assistant-android/-/issues/33?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/res/drawable-xxhdpi/bg_badge_btn.webp | Bin 7108 -> 0 bytes .../res/drawable-xxhdpi/bg_badge_light.webp | Bin 80306 -> 0 bytes .../bg_congratulations_words.webp | Bin 8174 -> 0 bytes .../drawable-xxhdpi/bg_energy_center_top.webp | Bin 75836 -> 0 bytes .../res/drawable-xxhdpi/bg_energy_dialog.webp | Bin 5850 -> 0 bytes .../res/drawable-xxhdpi/bg_energy_house.webp | Bin 31496 -> 0 bytes app/src/main/res/drawable-xxhdpi/bg_login.webp | Bin 17964 -> 0 bytes .../res/drawable-xxhdpi/bg_personal_info.webp | Bin 9598 -> 0 bytes .../drawable-xxhdpi/bg_quick_login_dialog.webp | Bin 14948 -> 0 bytes .../res/drawable-xxhdpi/bg_receive_badge.webp | Bin 11090 -> 0 bytes .../main/res/drawable-xxhdpi/bg_view_badge.webp | Bin 10652 -> 0 bytes .../main/res/drawable-xxhdpi/ic_login_logo.webp | Bin 16076 -> 0 bytes .../drawable-xxhdpi/pic_dialog_shortcut.webp | Bin 15346 -> 0 bytes .../main/res/drawable-xxhdpi/pic_no_data.webp | Bin 13442 -> 0 bytes app/src/main/res/drawable-xxxhdpi/bg_login.webp | Bin 25076 -> 0 bytes .../res/drawable-xxxhdpi/ic_login_logo.webp | Bin 21196 -> 0 bytes 16 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/src/main/res/drawable-xxhdpi/bg_badge_btn.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/bg_badge_light.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/bg_congratulations_words.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/bg_energy_center_top.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/bg_energy_dialog.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/bg_energy_house.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/bg_login.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/bg_personal_info.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/bg_quick_login_dialog.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/bg_receive_badge.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/bg_view_badge.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/ic_login_logo.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/pic_dialog_shortcut.webp delete mode 100644 app/src/main/res/drawable-xxhdpi/pic_no_data.webp delete mode 100644 app/src/main/res/drawable-xxxhdpi/bg_login.webp delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_login_logo.webp diff --git a/app/src/main/res/drawable-xxhdpi/bg_badge_btn.webp b/app/src/main/res/drawable-xxhdpi/bg_badge_btn.webp deleted file mode 100644 index 6f90dac570693ecdd9fbd3423b8406fdbb79d07a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7108 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 rgR!f$a~M9P(%^s)M~uSjjMB3`A#O6t}YSBx!C_ z>Y)XG_ZdlVHoRTH`LqW5Ol}XoBy~X%yNlt|7aN?lEdL)sY@ISH=>QbvbC{I;jX!QY zCac*o;8+a`rW=Hhnj;iJ`#aUR!tnKt$UPJ5v1J}K@E6+%|Fe9efR1x zKC(yhWN(n<1DYx=kj2Q?$=2!3I8q6OsBTn9tjL5Cuxb#D9E9XEyfU6RznX$ z$R!Og$ZC#elGJMEi9PhK(TvzSu*IBf05Qk*1(Kv+#q5wAx1DGIz7S~q&0 zl8qDD7)#-!RuU`1EW~5D-j-`2IdAmFjHBw>B@u7}O!fGrH8|U^FpIHsD|sHkATVE( zSP-qAThCCTz4qVAi^=C-e)kX4HIRvZKYgt?FL5&F9(isul*nbE4i{woq7K+To#K)z zg6f@#2S;KOvPMqke|Rvu=g1&-h|U-}vKjYS@|^arF8c|h+yQFDz*Rk5-z4H_mL8)n zw{00GhjWe!%>h&}XwNcV%V3vou^?uAIPrcAEUX$evL~|hiOxUo6tyN3OM80)7eaQZUj5_{Os*20wKXU!EubP3P zYIO>048ij}=B4VzA}f-^ z&D_GnywVAXw<^GYgdLN?@>(Zh?jW4s=*TUnIhdJy)Wz^kL{Qp(XR19Kht2(zANAkK z(O4%#G1K5t!|S4vpYVLd*lp&|{u-kfGbWy+n?HHmb0}OR(1W^b7 zf4D|fG+!%?xYa}M#4}XiRdwd_f#04z!y!NbsYRFcxQYW@PXx>XWrM@zA@KA3QpW(# zF6(~B<+>zcZ=C^*j&u#{Amk5XNVl!Lr~U8`px$fEKOk~$J<8cPYZnOuy7r~a4Y7Mi zv!@M%|G;OO9!#`wHhi?MrdhlRn7hafOT$h801862X6P)F#+!4Vw5Mf?i2pEIRa%Yi z000IDZK&z8YfxVKyJ=WoJ)x;r^AJk%Xq6)`=*70Id>k5kvWw;A!3P>2$0%ahKL!6? u7WGR5m*IotBgT2Bpt4(_qE#N0qBCS`-hIAg;Nv^iB){}JIxheK0001c<=8a< diff --git a/app/src/main/res/drawable-xxhdpi/bg_badge_light.webp b/app/src/main/res/drawable-xxhdpi/bg_badge_light.webp deleted file mode 100644 index cccfe2d78845b2edfb28fbe6c6956e749690370b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 80306 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 {m^G@we7zS~9b_kx|> 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 diff --git a/app/src/main/res/drawable-xxhdpi/bg_congratulations_words.webp b/app/src/main/res/drawable-xxhdpi/bg_congratulations_words.webp deleted file mode 100644 index eb5247ef066963dc5f01e60307e71f208b3ec72b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8174 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 UE$U;jxrhk@jJ7bo-~a#s0KMD=KmY&$ diff --git a/app/src/main/res/drawable-xxhdpi/bg_energy_center_top.webp b/app/src/main/res/drawable-xxhdpi/bg_energy_center_top.webp deleted file mode 100644 index ee4e1c291c5915fda220433200a7beb6419a67b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75836 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 = arrayListOf(), + @SerializedName("download_dialog") + var downloadDialog: ArrayList? = arrayListOf(), - var auth: Auth? = null, + var auth: Auth? = null, - @SerializedName("auth_dialog") - var authDialog: AuthDialogEntity? = null, + @SerializedName("auth_dialog") + var authDialog: AuthDialogEntity? = null, - @SerializedName("is_related") - var isRelated: Boolean = false, + @SerializedName("is_related") + var isRelated: Boolean = false, - @SerializedName("rating_open") - var isRatingOpen: Boolean = false, + @SerializedName("rating_open") + var isRatingOpen: Boolean = false, - @SerializedName("zone_open") - var isZoneOpen: Boolean = false, + @SerializedName("zone_open") + var isZoneOpen: Boolean = false, - @SerializedName("show_comment") - var showComment: Boolean = false, // 游戏评论是否打开 + @SerializedName("show_comment") + var showComment: Boolean = false, // 游戏评论是否打开 - // 分类,取值有 online (网络游戏) , local (单机游戏), welfare (福利游戏),simulator(模拟器游戏) - @SerializedName("category") - private var mCategory: String? = "", - // 7天下载量 - var download: Int = 0, - // subject -> imageSlide - val games: List? = null, + // 分类,取值有 online (网络游戏) , local (单机游戏), welfare (福利游戏),simulator(模拟器游戏) + @SerializedName("category") + private var mCategory: String? = "", + // 7天下载量 + var download: Int = 0, + // subject -> imageSlide + val games: List? = null, - //首页设置 - @SerializedName("home_setting") - val homeSetting: HomeSetting = HomeSetting(), - var linkType: String = "", - @SerializedName("index_plugin") - var indexPlugin: String = "open", + //首页设置 + @SerializedName("home_setting") + val homeSetting: HomeSetting = HomeSetting(), + var linkType: String = "", + @SerializedName("index_plugin") + var indexPlugin: String = "open", - // 游戏版本 (本地字段),供下载统计使用 - var gameVersion: String = "", + // 游戏版本 (本地字段),供下载统计使用 + var gameVersion: String = "", - // icon 角标 - @SerializedName("icon_subscript") - var mIconSubscript: String? = null, + // icon 角标 + @SerializedName("icon_subscript") + var mIconSubscript: String? = null, - @SerializedName("info") - var info: GameInfo? = null, + @SerializedName("info") + var info: GameInfo? = null, - @SerializedName("permission_dialog_status") - var permissionDialogStatus: String? = "", // 权限弹窗,off(关闭)、on(开启),默认:off + @SerializedName("permission_dialog_status") + var permissionDialogStatus: String? = "", // 权限弹窗,off(关闭)、on(开启),默认:off - // 镜像数据,细节见 [RegionSettingHelper] - @SerializedName("mirror_status") - var mirrorStatus: String? = "", - @SerializedName("mirror_data") - var mirrorData: GameEntity? = null, + // 镜像数据,细节见 [RegionSettingHelper] + @SerializedName("mirror_status") + var mirrorStatus: String? = "", + @SerializedName("mirror_data") + var mirrorData: GameEntity? = null, - // 游戏评分 - @SerializedName("new_star") - val star: Float = 10F, - // 游戏评分数量 - @SerializedName("comment_count") - var commentCount: Int = 0, - // 是否支持不安装直接评论 - @SerializedName("direct_comment") - var directComment: Boolean = false, - // xxx人想玩 - @SerializedName("h5_link") - private var mH5Link: LinkEntity? = null, - val visit: Int = 0, - @SerializedName("played_time") - val playedTime: Long = 0, - @SerializedName("played_game_id") - val playedGameId: String = "", - @SerializedName("mutex_package") - val mutexPackage: List? = null, - @SerializedName("version_number") - private val mVersionNumber: String = "",// 无版号无内购无弹窗、无版号无内购有弹窗、无版号有内购、有版号 - @SerializedName("plugin_link") - val pluginLink: List = arrayListOf(), - @SerializedName("p_button_add_word") - var pluginDesc: String = "", //插件功能描述 - var pluggableCollection: GameCollectionEntity? = null, //插件化包所在的合集 - @SerializedName("assign_remark") - val assignRemark: AssignRemark = AssignRemark(), - @SerializedName("zone_setting") - var zone: ZoneEntity = ZoneEntity(), - @SerializedName("comment_description") - var commentDescription: String = "", - @SerializedName("ignore_comment") - var ignoreComment: Boolean = false, - @SerializedName("overseas_address_dialog") - var overseasAddressDialog: OverseasAddressDialog? = null, - var simulator: SimulatorEntity? = null, - @SerializedName("simulator_type") - var simulatorType: String = "", - @SerializedName("is_recently_played") - var isRecentlyPlayed: Boolean = false, - var active: Boolean = true, - @SerializedName("package_dialog") - val packageDialog: PackageDialogEntity? = null, - @SerializedName("top_video") - val topVideo: SimpleVideoEntity? = null, - @SerializedName("column_recommend") - val columnRecommend: LinkEntity? = null, + // 游戏评分 + @SerializedName("new_star") + val star: Float = 10F, + // 游戏评分数量 + @SerializedName("comment_count") + var commentCount: Int = 0, + // 是否支持不安装直接评论 + @SerializedName("direct_comment") + var directComment: Boolean = false, + // xxx人想玩 + @SerializedName("h5_link") + private var mH5Link: LinkEntity? = null, + val visit: Int = 0, + @SerializedName("played_time") + val playedTime: Long = 0, + @SerializedName("played_game_id") + val playedGameId: String = "", + @SerializedName("mutex_package") + val mutexPackage: List? = null, + @SerializedName("version_number") + private val mVersionNumber: String = "",// 无版号无内购无弹窗、无版号无内购有弹窗、无版号有内购、有版号 + @SerializedName("plugin_link") + val pluginLink: List = arrayListOf(), + @SerializedName("p_button_add_word") + var pluginDesc: String = "", //插件功能描述 + var pluggableCollection: GameCollectionEntity? = null, //插件化包所在的合集 + @SerializedName("assign_remark") + val assignRemark: AssignRemark = AssignRemark(), + @SerializedName("zone_setting") + var zone: ZoneEntity = ZoneEntity(), + @SerializedName("comment_description") + var commentDescription: String = "", + @SerializedName("ignore_comment") + var ignoreComment: Boolean = false, + @SerializedName("overseas_address_dialog") + var overseasAddressDialog: OverseasAddressDialog? = null, + var simulator: SimulatorEntity? = null, + @SerializedName("simulator_type") + var simulatorType: String = "", + @SerializedName("is_recently_played") + var isRecentlyPlayed: Boolean = false, + var active: Boolean = true, + @SerializedName("package_dialog") + val packageDialog: PackageDialogEntity? = null, + @SerializedName("top_video") + val topVideo: SimpleVideoEntity? = null, + @SerializedName("column_recommend") + val columnRecommend: LinkEntity? = null, - @SerializedName("simulator_config_url") - val simulatorGameConfig: String? = "", + @SerializedName("simulator_config_url") + val simulatorGameConfig: String? = "", - // 本地字段,使用镜像信息 - var useMirrorInfo: Boolean = false, - // 本地字段,曝光用 - var displayContent: String = "", - var isPlatformRecommend: Boolean = false, - // 从启动弹窗跳转到对应游戏列表时候记录的启动弹窗数据 (ugly ugly ugly) - var welcomeDialogId: String? = null, - var welcomeDialogTitle: String? = null + // 本地字段,使用镜像信息 + var useMirrorInfo: Boolean = false, + // 本地字段,曝光用 + var displayContent: String = "", + var isPlatformRecommend: Boolean = false, + // 从启动弹窗跳转到对应游戏列表时候记录的启动弹窗数据 (ugly ugly ugly) + var welcomeDialogId: String? = null, + var welcomeDialogTitle: String? = null ) : Parcelable { constructor(id: String?) : this() { @@ -264,7 +265,8 @@ data class GameEntity( } @IgnoredOnParcel - private var entryMap: androidx.collection.ArrayMap? = androidx.collection.ArrayMap() + private var entryMap: androidx.collection.ArrayMap? = + androidx.collection.ArrayMap() @IgnoredOnParcel var gameLocation: GameLocation? = null @@ -286,7 +288,7 @@ data class GameEntity( var name: String? get() = if (shouldUseMirrorInfo()) { mirrorData?.mName?.removeSuffix(".") + if (shouldShowNameSuffix) mirrorData?.nameSuffix - ?: "" else "" + ?: "" else "" } else { mName?.removeSuffix(".") + if (shouldShowNameSuffix) nameSuffix else "" } @@ -319,7 +321,9 @@ data class GameEntity( @IgnoredOnParcel val nameWithoutSuffix: String? - get() = if (shouldUseMirrorInfo()) mirrorData?.mName?.removeSuffix(".") else mName?.removeSuffix(".") + get() = if (shouldUseMirrorInfo()) mirrorData?.mName?.removeSuffix(".") else mName?.removeSuffix( + "." + ) @IgnoredOnParcel var isReservable: Boolean @@ -363,14 +367,37 @@ data class GameEntity( mBrief = value } + @IgnoredOnParcel + var hideSizeInsideDes: Boolean = false + + @IgnoredOnParcel + val decoratedDes: String? + get() = if ( + (apk != null && apk!!.size > 0) + && !hideSizeInsideDes + && ((TextUtils.isEmpty(briefStyle) + || briefStyle?.contains("size") == true) + || briefStyle?.contains("recommend") == true) + ) { + getApk()[0].size + " " + brief + } else { + brief + } + @IgnoredOnParcel val downloadOffText: String? get() = if (shouldUseMirrorInfo()) mirrorData?.mDownloadOffText else mDownloadOffText @IgnoredOnParcel var tagStyle: ArrayList - get() = if (shouldUseMirrorInfo()) mirrorData?.mTagStyle?.apply { removeAll { it.name.toLowerCase(Locale.getDefault()) == "mod版" } } - ?: arrayListOf() else mTagStyle + get() = if (shouldUseMirrorInfo()) mirrorData?.mTagStyle?.apply { + removeAll { + it.name.toLowerCase( + Locale.getDefault() + ) == "mod版" + } + } + ?: arrayListOf() else mTagStyle set(value) { mTagStyle = value } @@ -583,61 +610,66 @@ data class GameEntity( } @Parcelize - data class Dialog(var title: String = "", - var content: String = "", - var sites: List = listOf(), - @SerializedName("close_button_text") - var closeButtonText: String = "", - @SerializedName("confirm_button") - var confirmButton: LinkEntity = LinkEntity(), - var rule: Rule = Rule(), - // 值可能是 ONCE_A_DAY / EVERY_TIME_OPEN - var alert: String = "") : Parcelable { + data class Dialog( + var title: String = "", + var content: String = "", + var sites: List = listOf(), + @SerializedName("close_button_text") + var closeButtonText: String = "", + @SerializedName("confirm_button") + var confirmButton: LinkEntity = LinkEntity(), + var rule: Rule = Rule(), + // 值可能是 ONCE_A_DAY / EVERY_TIME_OPEN + var alert: String = "" + ) : Parcelable { @Parcelize data class Rule( - @SerializedName("package") - var packageName: String = "", - var models: ArrayList = arrayListOf(), - @SerializedName("system_versions") - var systemVersions: ArrayList = arrayListOf(), - @SerializedName("notice_versions") - var noticeVersions: ArrayList = arrayListOf() + @SerializedName("package") + var packageName: String = "", + var models: ArrayList = arrayListOf(), + @SerializedName("system_versions") + var systemVersions: ArrayList = arrayListOf(), + @SerializedName("notice_versions") + var noticeVersions: ArrayList = arrayListOf() ) : Parcelable @Parcelize data class Site( - var url: String = "", - var text: String = "" + var url: String = "", + var text: String = "" ) : Parcelable } @Parcelize - data class PluginLink(@SerializedName("link_id") - var linkId: String = "", - var title: String = "", - @SerializedName("link_type") - var linkType: String = "", // article,Q&A,dialog - @SerializedName("link_text") - var linkText: String = "", - var content: String = "", - @SerializedName("link_community") - var community: CommunityEntity? = CommunityEntity(), - var display: Display? = null) : Parcelable { + data class PluginLink( + @SerializedName("link_id") + var linkId: String = "", + var title: String = "", + @SerializedName("link_type") + var linkType: String = "", // article,Q&A,dialog + @SerializedName("link_text") + var linkText: String = "", + var content: String = "", + @SerializedName("link_community") + var community: CommunityEntity? = CommunityEntity(), + var display: Display? = null + ) : Parcelable { fun getLinkEntity(): LinkEntity { return LinkEntity( - link = linkId, - title = title, - type = linkType, - text = linkText, - community = community, - display = display + link = linkId, + title = title, + type = linkType, + text = linkText, + community = community, + display = display ) } } @Parcelize - data class OverseasAddressDialog(var status: String? = "", var link: String? = "") : Parcelable { + data class OverseasAddressDialog(var status: String? = "", var link: String? = "") : + Parcelable { fun isEnable(): Boolean { return status == "show" || status == "show&download" } @@ -661,44 +693,45 @@ data class GameEntity( @Parcelize data class AssignRemark( - @SerializedName("first_line") - val firstLine: String = "", - @SerializedName("second_line") - val secondLine: String = "", - @SerializedName("marked_red") - val markedRed: Boolean = false, - val recommend: Boolean = false, - @SerializedName("start_time") - val startTime: Long = 0, - @SerializedName("end_time") - val endTime: Long = 0 + @SerializedName("first_line") + val firstLine: String = "", + @SerializedName("second_line") + val secondLine: String = "", + @SerializedName("marked_red") + val markedRed: Boolean = false, + val recommend: Boolean = false, + @SerializedName("start_time") + val startTime: Long = 0, + @SerializedName("end_time") + val endTime: Long = 0 ) : Parcelable @Parcelize data class Auth( - val switch: String? = null, // 开关 - @SerializedName("time_start") - val timeStart: String? = "", // 开始时间 - @SerializedName("time_end") - val timeEnd: String? = "" // 结束时间 + val switch: String? = null, // 开关 + @SerializedName("time_start") + val timeStart: String? = "", // 开始时间 + @SerializedName("time_end") + val timeEnd: String? = "" // 结束时间 ) : Parcelable } @Parcelize data class SimpleGame( - @SerializedName("_id") - var id: String? = null, - @SerializedName("name") - var mName: String? = "", - @SerializedName("name_suffix") - var nameSuffix: String? = null, - @SerializedName("icon") - private var mIcon: String? = null, - @SerializedName("ori_icon") - private var mRawIcon: String? = null, - @SerializedName("icon_subscript") - var iconSubscript: String? = null, - var active: Boolean = false) : Parcelable { + @SerializedName("_id") + var id: String? = null, + @SerializedName("name") + var mName: String? = "", + @SerializedName("name_suffix") + var nameSuffix: String? = null, + @SerializedName("icon") + private var mIcon: String? = null, + @SerializedName("ori_icon") + private var mRawIcon: String? = null, + @SerializedName("icon_subscript") + var iconSubscript: String? = null, + var active: Boolean = false +) : Parcelable { @IgnoredOnParcel val name: String? diff --git a/app/src/main/java/com/gh/gamecenter/mygame/MyFollowedGameAdapter.kt b/app/src/main/java/com/gh/gamecenter/mygame/MyFollowedGameAdapter.kt index 0081ebf127..567f86c876 100644 --- a/app/src/main/java/com/gh/gamecenter/mygame/MyFollowedGameAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/mygame/MyFollowedGameAdapter.kt @@ -62,7 +62,6 @@ class MyFollowedGameAdapter(context: Context, var mViewModel: MyFollowedGameView holder.run { binding.run { gameItemIncluded.game = gameEntity - gameItemIncluded.hideSize = true moreBtn.visibility = View.GONE initServerType(gameEntity) initShortcut(gameEntity, mEntrance, path,newPath) diff --git a/app/src/main/java/com/gh/gamecenter/mygame/MyFollowedGameViewModel.kt b/app/src/main/java/com/gh/gamecenter/mygame/MyFollowedGameViewModel.kt index 64f74940ee..434f672f56 100644 --- a/app/src/main/java/com/gh/gamecenter/mygame/MyFollowedGameViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/mygame/MyFollowedGameViewModel.kt @@ -29,6 +29,7 @@ class MyFollowedGameViewModel(application: Application) override fun mergeResultLiveData() { mResultLiveData.addSource(mListLiveData) { + it.forEach { game -> game.hideSizeInsideDes = true } mResultLiveData.postValue(it) } } diff --git a/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt b/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt index 80b50b9de5..bbc62d301e 100644 --- a/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/mygame/MyReservationAdapter.kt @@ -15,7 +15,6 @@ import com.gh.gamecenter.R import com.gh.gamecenter.adapter.viewholder.FooterViewHolder import com.gh.gamecenter.adapter.viewholder.GameViewHolder import com.gh.gamecenter.baselist.ListAdapter -import com.gh.gamecenter.baselist.LoadType import com.gh.gamecenter.databinding.ItemFollowedGameBinding import com.gh.gamecenter.entity.GameEntity import com.gh.gamecenter.eventbus.EBDownloadStatus @@ -58,7 +57,6 @@ class MyReservationAdapter(context: Context, var mViewModel: MyReservationViewMo val newPath = "预约Tab_新" holder.binding.gameItemIncluded.game = gameEntity - holder.binding.gameItemIncluded.hideSize = true holder.initServerType(gameEntity) holder.initShortcut(gameEntity, mEntrance, path, newPath) holder.binding.executePendingBindings() diff --git a/app/src/main/java/com/gh/gamecenter/mygame/MyReservationViewModel.kt b/app/src/main/java/com/gh/gamecenter/mygame/MyReservationViewModel.kt index ba53e4273c..9d2ab213cb 100644 --- a/app/src/main/java/com/gh/gamecenter/mygame/MyReservationViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/mygame/MyReservationViewModel.kt @@ -4,7 +4,6 @@ import android.annotation.SuppressLint import android.app.Application import com.gh.common.repository.ReservationRepository import com.gh.common.runOnUiThread -import com.gh.common.util.MtaHelper import com.gh.common.util.createRequestBody import com.gh.download.DownloadManager import com.gh.gamecenter.baselist.ListViewModel @@ -37,6 +36,7 @@ class MyReservationViewModel(application: Application) : ListViewModel + gameEntity.hideSizeInsideDes = true addGamePositionAndPackage(gameEntity, index) } mResultLiveData.postValue(it) diff --git a/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameAdapter.kt b/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameAdapter.kt index f042f245c2..1acd25a705 100644 --- a/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameAdapter.kt @@ -30,7 +30,6 @@ import com.gh.gamecenter.adapter.viewholder.FooterViewHolder import com.gh.gamecenter.adapter.viewholder.GameViewHolder import com.gh.gamecenter.adapter.viewholder.ReuseViewHolder import com.gh.gamecenter.baselist.ListAdapter -import com.gh.gamecenter.baselist.LoadType import com.gh.gamecenter.databinding.ItemPlayedGameBinding import com.gh.gamecenter.entity.GameEntity import com.gh.gamecenter.eventbus.EBDownloadStatus @@ -102,7 +101,6 @@ open class PlayedGameAdapter(context: Context, if (mIsMyPlayedGame) { holder.initDownloadButtonOffset() } - holder.binding.gameItemIncluded.hideSize = true holder.binding.gameItemIncluded.game = gameEntity holder.binding.executePendingBindings() diff --git a/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameViewModel.kt b/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameViewModel.kt index 02bf110a82..c3193b6dac 100644 --- a/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/mygame/PlayedGameViewModel.kt @@ -28,7 +28,10 @@ class PlayedGameViewModel(application: Application, var userId: String) } override fun mergeResultLiveData() { - mResultLiveData.addSource(mListLiveData) { mResultLiveData.postValue(it) } + mResultLiveData.addSource(mListLiveData) { + it.forEach { game -> game.hideSizeInsideDes = true } + mResultLiveData.postValue(it) + } } @SuppressLint("CheckResult") diff --git a/app/src/main/res/layout/game_item.xml b/app/src/main/res/layout/game_item.xml index 468763bcda..741a4d7275 100644 --- a/app/src/main/res/layout/game_item.xml +++ b/app/src/main/res/layout/game_item.xml @@ -23,10 +23,6 @@ name="isShowSuffix" type="Boolean" /> - - @@ -172,7 +168,7 @@ android:ellipsize="end" android:includeFontPadding="false" android:singleLine="true" - android:text="@{(game.apk.size > 0 && !hideSize && (TextUtils.isEmpty(briefStyle)||briefStyle.contains(`size`)||briefStyle.contains(`recommend`))) ? game.getApk().get(0).getSize() + ` ` + game.brief : game.brief }" + android:text="@{game.decoratedDes}" android:textColor="@color/text_999999" android:textSize="10sp" tools:text="巫妖王再怒霜之哀殤又飢渴" /> From d14e09187ee7f18cf81e2e9d1d480ee278db229f Mon Sep 17 00:00:00 2001 From: juntao Date: Thu, 26 Aug 2021 18:10:26 +0800 Subject: [PATCH 119/151] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=85=89=E7=8E=AF?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E4=BC=98=E5=8C=96=E6=B1=87=E6=80=BB=E7=AC=AC?= =?UTF-8?q?=E4=B8=89=E5=91=A8=EF=BC=881=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gamecenter/entity/WelcomeDialogEntity.kt | 8 +- .../fragment/MainWrapperViewModel.kt | 103 ++++++++++-------- 2 files changed, 65 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/entity/WelcomeDialogEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/WelcomeDialogEntity.kt index a4c96ab45e..9a9e5d3bfd 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/WelcomeDialogEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/WelcomeDialogEntity.kt @@ -5,6 +5,8 @@ import kotlinx.android.parcel.Parcelize @Parcelize data class WelcomeDialogEntity( - @SerializedName("_id") - var id: String? = "", - var time: Long? = 0):LinkEntity() \ No newline at end of file + @SerializedName("_id") + var id: String? = "", + var time: Long? = 0, + var packages: ArrayList? = arrayListOf() +) : LinkEntity() \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperViewModel.kt b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperViewModel.kt index 6ba8364183..4146dc225f 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperViewModel.kt @@ -8,6 +8,7 @@ import androidx.lifecycle.MutableLiveData import com.gh.common.constant.Constants import com.gh.common.util.CheckLoginUtils import com.gh.common.util.HomeBottomBarHelper +import com.gh.common.util.PackageUtils import com.gh.gamecenter.BuildConfig import com.gh.gamecenter.entity.ConcernEntity import com.gh.gamecenter.entity.SimpleGameEntity @@ -44,23 +45,23 @@ class MainWrapperViewModel(application: Application) : AndroidViewModel(applicat @SuppressLint("CheckResult") private fun getHomeNavBar() { mSensitiveApi.getHomeNavBar(HaloApp.getInstance().channel, BuildConfig.VERSION_NAME) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : BiResponse() { - override fun onSuccess(data: SubjectRecommendEntity) { - HomeBottomBarHelper.updateDefaultGameBarData(data) - navBar.postValue(data) - } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: SubjectRecommendEntity) { + HomeBottomBarHelper.updateDefaultGameBarData(data) + navBar.postValue(data) + } - override fun onFailure(exception: Exception) { - if (exception is HttpException && exception.code() == 404) { - navBar.postValue(null) - HomeBottomBarHelper.updateDefaultGameBarData(SubjectRecommendEntity()) - } else { - navBar.postValue(HomeBottomBarHelper.getDefaultGameBarData()) - } + override fun onFailure(exception: Exception) { + if (exception is HttpException && exception.code() == 404) { + navBar.postValue(null) + HomeBottomBarHelper.updateDefaultGameBarData(SubjectRecommendEntity()) + } else { + navBar.postValue(HomeBottomBarHelper.getDefaultGameBarData()) } - }) + } + }) } fun getDiscoveryData(immediately: Boolean) { @@ -69,14 +70,14 @@ class MainWrapperViewModel(application: Application) : AndroidViewModel(applicat if (currentTimeMills - mLastRequestDiscoveryTime > mIntervalRequestDiscoveryData || immediately) { mLastRequestDiscoveryTime = currentTimeMills mApi - .getZiXunConcern(UserManager.getInstance().userId, 1) - .subscribeOn(Schedulers.io()) - .subscribe(object : Response>() { - override fun onResponse(response: List?) { - super.onResponse(response) - concernData.postValue(response) - } - }) + .getZiXunConcern(UserManager.getInstance().userId, 1) + .subscribeOn(Schedulers.io()) + .subscribe(object : Response>() { + override fun onResponse(response: List?) { + super.onResponse(response) + concernData.postValue(response) + } + }) } } } @@ -86,22 +87,38 @@ class MainWrapperViewModel(application: Application) : AndroidViewModel(applicat */ @SuppressLint("CheckResult") fun requestOpeningData() { - val lastId = PreferenceManager.getDefaultSharedPreferences(getApplication()).getString(Constants.SP_LAST_OPENING_ID, "") - val lastTime = PreferenceManager.getDefaultSharedPreferences(getApplication()).getLong(Constants.SP_LAST_OPENING_TIME, 0) + val lastId = PreferenceManager.getDefaultSharedPreferences(getApplication()) + .getString(Constants.SP_LAST_OPENING_ID, "") + val lastTime = PreferenceManager.getDefaultSharedPreferences(getApplication()) + .getLong(Constants.SP_LAST_OPENING_TIME, 0) val openType = if (HaloApp.getInstance().isNewForThisVersion) "first" else "not_first_time" mSensitiveApi.getOpeningDialog(HaloApp.getInstance().channel, lastId, lastTime, openType) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : BiResponse() { - override fun onSuccess(data: WelcomeDialogEntity) { + .subscribeOn(Schedulers.io()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: WelcomeDialogEntity) { + // 类型为游戏时判断是否本地已安装该游戏,已安装不弹弹窗 + if (data.type == "game") { + if (data.packages == null) { + openingDialog.postValue(data) + } else { + for (packageName in data.packages!!) { + if (PackageUtils.isInstalled(getApplication(), packageName)) { + openingDialog.postValue(null) + return + } + } + openingDialog.postValue(data) + } + } else { openingDialog.postValue(data) } + } - override fun onFailure(exception: Exception) { - openingDialog.postValue(null) - } - }) + override fun onFailure(exception: Exception) { + openingDialog.postValue(null) + } + }) } @@ -109,17 +126,17 @@ class MainWrapperViewModel(application: Application) : AndroidViewModel(applicat fun requestReserveDialog() { if (CheckLoginUtils.isLogin()) { mApi.getReserveDialog(UserManager.getInstance().userId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : BiResponse>() { - override fun onSuccess(data: List) { - reserveDialog.postValue(data) - } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BiResponse>() { + override fun onSuccess(data: List) { + reserveDialog.postValue(data) + } - override fun onFailure(exception: Exception) { - reserveDialog.postValue(null) - } - }) + override fun onFailure(exception: Exception) { + reserveDialog.postValue(null) + } + }) } } From 3fc60a57b603294d0e6bd2fbf7ecd0856b669ea4 Mon Sep 17 00:00:00 2001 From: juntao Date: Thu, 26 Aug 2021 18:18:52 +0800 Subject: [PATCH 120/151] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=85=89=E7=8E=AF?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E4=BC=98=E5=8C=96=E6=B1=87=E6=80=BB=E7=AC=AC?= =?UTF-8?q?=E5=9B=9B=E5=91=A8(1)=20https://git.ghzs.com/pm/halo-app-issues?= =?UTF-8?q?/-/issues/1454?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/gamecenter/packagehelper/PackageRepository.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt index de00423c69..64709e8cfc 100644 --- a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt +++ b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt @@ -283,6 +283,11 @@ object PackageRepository { for (apk in apkList) { if (apk.packageName == installedPkgName && !TextUtils.isEmpty(apk.ghVersion) && !PackageUtils.isSignedByGh(HaloApp.getInstance().application, apk.packageName)) { + // 使用了镜像的游戏无需插件化 + if (game.shouldUseMirrorInfo()) { + return false + } + // 如果该包是合集且安装了合集内任意一个光环的游戏包都不显示插件化 game.collection.forEach { collection -> if (collection.packages.contains(apk.packageName)) { From 113f1d3ed8c83add951495dcac6f48b8daf51ea7 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Thu, 26 Aug 2021 18:28:26 +0800 Subject: [PATCH 121/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA3=E6=9C=9F-?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E5=B1=95=E7=A4=BA-=E5=A4=B4=E5=83=8F?= =?UTF-8?q?=E4=BF=A1=E6=81=AF(20210826UI=E6=B5=8B=E8=AF=95)=20https://git.?= =?UTF-8?q?ghzs.com/pm/halo-app-issues/-/issues/1406?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/fragment_home.xml | 288 +++++++++--------- .../main/res/layout/fragment_new_personal.xml | 134 ++++---- app/src/main/res/layout/fragment_personal.xml | 79 ++--- 3 files changed, 252 insertions(+), 249 deletions(-) diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 55fd8e57c4..7e12debc5b 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -57,15 +57,15 @@ app:layout_constraintTop_toTopOf="parent"> + app:layout_constraintTop_toTopOf="parent" + app:placeholderImage="@drawable/bg_home_user_info" + app:placeholderImageScaleType="fitXY" /> + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + tools:layout_height="96dp" + tools:layout_width="96dp" /> + tools:visibility="visible" /> + app:layout_constraintTop_toTopOf="@+id/user_icon" + tools:text="我的名字很长的哟" /> + android:paddingLeft="4dp" + android:paddingRight="4dp" + android:visibility="gone" + tools:visibility="visible"> + android:paddingLeft="4dp" + android:visibility="gone" + tools:visibility="visible"> + android:layout_marginRight="2dp" + android:layout_toRightOf="@+id/badge_icon" + android:gravity="center_vertical" + android:orientation="horizontal"> + android:src="@drawable/ic_my_badge" + android:visibility="gone" + tools:visibility="visible" /> + android:visibility="gone" + tools:text="3" + tools:visibility="visible" /> + android:src="@drawable/ic_badge_tv" + android:visibility="gone" + tools:visibility="visible" /> + android:visibility="gone" + tools:visibility="visible" /> - + android:src="@drawable/ic_regulation_tag" + tools:visibility="visible"> + app:layout_constraintTop_toBottomOf="@+id/regulation_and_badge_container" + tools:visibility="visible"> + app:placeholderImage="@drawable/ic_auth" + app:roundAsCircle="true" /> @@ -301,33 +301,33 @@ android:id="@+id/user_introduce" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="16dp" android:layout_marginLeft="16dp" + android:layout_marginTop="16dp" android:layout_marginRight="16dp" + android:ellipsize="end" android:includeFontPadding="false" android:lineSpacingExtra="5dp" android:maxLines="2" - android:ellipsize="end" + android:text='@{TextUtils.isEmpty(entity.introduce)?"这是一个很神秘的崽~":entity.introduce}' android:textColor="@color/white" android:textSize="12sp" - android:text='@{TextUtils.isEmpty(entity.introduce)?"这是一个很神秘的崽~":entity.introduce}' - tools:text="这是我的个性签名呀欢迎大家来撩,特别长的签名,很长很长,这是我的个性签名呀欢迎大家来撩,特别长的签名,很长很长,这是我的个性签名呀欢迎大家来撩,特别长的签名,很长很长这是我的个性签名呀欢迎大家来撩,特别长的签名,很长很长这是我的个性签名呀欢迎大家来撩,特别长的签名,很长很长这是我的个性签名呀欢迎大家来撩,特别长的签名,很长很长" app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintTop_toBottomOf="@+id/auth_container" /> + app:layout_constraintTop_toBottomOf="@+id/auth_container" + tools:text="这是我的个性签名呀欢迎大家来撩,特别长的签名,很长很长,这是我的个性签名呀欢迎大家来撩,特别长的签名,很长很长,这是我的个性签名呀欢迎大家来撩,特别长的签名,很长很长这是我的个性签名呀欢迎大家来撩,特别长的签名,很长很长这是我的个性签名呀欢迎大家来撩,特别长的签名,很长很长这是我的个性签名呀欢迎大家来撩,特别长的签名,很长很长" /> + tools:visibility="visible"> + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toTopOf="parent" /> + android:orientation="horizontal" + app:layout_constraintLeft_toRightOf="@+id/recent_visit_tv" + app:layout_constraintTop_toTopOf="parent"> + imageUrl="@{entity.lastVisitor.icon}" + visibleGone="@{!TextUtils.isEmpty(entity.lastVisitor.icon)}" + android:layout_width="12dp" + android:layout_height="12dp" /> @@ -376,27 +376,27 @@ android:id="@+id/today_visit_tv" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:includeFontPadding="false" android:layout_marginTop="5dp" + android:includeFontPadding="false" + android:text="@string/today_visit" android:textColor="@color/white" android:textSize="10sp" - android:text="@string/today_visit" - app:layout_constraintTop_toBottomOf="@+id/recent_visit_tv" - app:layout_constraintLeft_toLeftOf="parent" /> + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toBottomOf="@+id/recent_visit_tv" /> + app:layout_constraintRight_toRightOf="@+id/recentVisitRightContainer" + app:layout_constraintTop_toBottomOf="@+id/recentVisitRightContainer" /> + android:orientation="horizontal" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintTop_toBottomOf="@+id/user_introduce"> + android:orientation="horizontal" + android:paddingLeft="16dp" + android:paddingTop="20dp" + android:paddingRight="12dp" + android:paddingBottom="20dp"> + android:orientation="horizontal" + android:paddingLeft="12dp" + android:paddingTop="20dp" + android:paddingRight="12dp" + android:paddingBottom="20dp"> + android:orientation="horizontal" + android:paddingLeft="12dp" + android:paddingTop="20dp" + android:paddingRight="24dp" + android:paddingBottom="20dp"> + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="@+id/user_icon" + tools:visibility="visible"> + android:textSize="14sp" /> + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="@+id/user_icon" /> + tools:visibility="visible"> + app:layout_constraintRight_toRightOf="@+id/user_change_bg_btn" + app:layout_constraintTop_toBottomOf="@+id/user_change_bg_btn"> + android:textSize="12sp" /> + app:layout_constraintRight_toRightOf="parent" /> + app:navigationIcon="@null"> @@ -678,37 +678,37 @@ android:layout_height="wrap_content" android:layout_marginLeft="8dp" android:layout_marginTop="3dp" + android:text="@{entity.name}" android:textColor="@color/white" android:textSize="14sp" - android:text="@{entity.name}" tools:text="姓名" /> + android:src="@drawable/ic_share" + android:visibility="gone" /> + android:src="@drawable/ic_user_home_more" + android:visibility="gone" /> diff --git a/app/src/main/res/layout/fragment_new_personal.xml b/app/src/main/res/layout/fragment_new_personal.xml index 8e69fafcb0..211c18ba2b 100644 --- a/app/src/main/res/layout/fragment_new_personal.xml +++ b/app/src/main/res/layout/fragment_new_personal.xml @@ -3,15 +3,16 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/list_refresh" - android:fitsSystemWindows="false" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="@color/white"> + android:background="@color/white" + android:fitsSystemWindows="false"> + @@ -53,11 +54,11 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:avatar_width="64dp" - app:badge_width="18dp" /> + app:badge_width="18dp" + app:border_width="4dp" /> + app:layout_constraintTop_toTopOf="@+id/personal_user_icon_container" + tools:visibility="gone" /> + tools:text="姓名" + tools:visibility="visible" /> + android:paddingLeft="4dp" + android:visibility="gone" + tools:visibility="visible"> + android:layout_marginRight="2dp" + android:layout_toRightOf="@+id/personal_badge_icon" + android:gravity="center_vertical" + android:orientation="horizontal"> + android:src="@drawable/ic_my_badge" + android:visibility="gone" + tools:visibility="visible" /> + android:visibility="gone" + tools:text="3" + tools:visibility="visible" /> + android:src="@drawable/ic_badge_tv" + android:visibility="gone" + tools:visibility="visible" /> + android:visibility="gone" + tools:visibility="visible" /> @@ -179,10 +181,10 @@ android:id="@+id/personal_home" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingTop="15dp" android:paddingLeft="15dp" - android:paddingBottom="15dp" + android:paddingTop="15dp" android:paddingRight="6dp" + android:paddingBottom="15dp" android:text="个人主页" android:textColor="@color/white" android:textSize="12sp" @@ -200,15 +202,15 @@ app:layout_constraintTop_toTopOf="@+id/personal_user_icon_container" /> + app:layout_constraintTop_toTopOf="@+id/personal_home" /> @@ -216,14 +218,14 @@ android:id="@+id/personal_energy_container" android:layout_width="match_parent" android:layout_height="92dp" - android:layout_marginTop="156dp" android:layout_marginLeft="16dp" + android:layout_marginTop="156dp" android:layout_marginRight="16dp" - android:orientation="horizontal" android:gravity="center" + android:orientation="horizontal" + app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintLeft_toRightOf="parent" - app:layout_constraintBottom_toBottomOf="parent"> + app:layout_constraintLeft_toRightOf="parent"> + android:textSize="11sp" /> + android:paddingTop="16dp" + android:visibility="gone"> + android:textSize="11sp" /> @@ -300,9 +302,9 @@ android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" - android:paddingTop="16dp" android:gravity="center_horizontal" - android:orientation="vertical"> + android:orientation="vertical" + android:paddingTop="16dp"> + android:textSize="11sp" /> + android:orientation="vertical" + android:paddingTop="16dp"> + android:textSize="11sp" /> + android:orientation="vertical" + android:paddingTop="16dp"> + android:textSize="11sp" /> @@ -456,7 +458,7 @@ android:textColor="@android:color/white" android:textSize="8sp" android:textStyle="bold" - tools:text="12"/> + tools:text="12" /> diff --git a/app/src/main/res/layout/fragment_personal.xml b/app/src/main/res/layout/fragment_personal.xml index 0031da120c..9c286e02e5 100644 --- a/app/src/main/res/layout/fragment_personal.xml +++ b/app/src/main/res/layout/fragment_personal.xml @@ -3,15 +3,15 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/list_refresh" - android:fitsSystemWindows="false" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:fitsSystemWindows="false"> + android:background="@drawable/shadow_personal_bg" + android:visibility="gone" /> + app:badge_width="18dp" + app:border_width="4dp" /> + app:layout_constraintTop_toTopOf="@+id/personal_user_icon_container" + tools:visibility="gone" /> + tools:text="姓名" + tools:visibility="visible" /> + android:paddingLeft="4dp" + android:visibility="gone" + tools:visibility="visible"> + android:layout_marginRight="2dp" + android:layout_toRightOf="@+id/personal_badge_icon" + android:gravity="center_vertical" + android:orientation="horizontal"> + android:src="@drawable/ic_my_badge" + android:visibility="gone" + tools:visibility="visible" /> + android:visibility="gone" + tools:text="3" + tools:visibility="visible" /> + android:src="@drawable/ic_badge_tv" + android:visibility="gone" + tools:visibility="visible" /> + android:visibility="gone" + tools:visibility="visible" /> @@ -199,10 +200,10 @@ android:id="@+id/personal_home" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:paddingTop="15dp" android:paddingLeft="15dp" - android:paddingBottom="15dp" + android:paddingTop="15dp" android:paddingRight="6dp" + android:paddingBottom="15dp" android:text="个人主页" android:textColor="@color/white" android:textSize="12sp" @@ -221,15 +222,15 @@ + app:layout_constraintTop_toTopOf="@+id/personal_home" /> @@ -333,7 +334,7 @@ android:textColor="@android:color/white" android:textSize="8sp" android:textStyle="bold" - tools:text="12"/> + tools:text="12" /> From 0e2f5fdf5351b49ac27e8abc7f7096cd83b427dd Mon Sep 17 00:00:00 2001 From: leafwai Date: Thu, 26 Aug 2021 18:34:01 +0800 Subject: [PATCH 122/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E6=B5=8F=E8=A7=88=E5=99=A8=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96(0826=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E3=80=810826UI=E6=B5=8B=E8=AF=95)https://git.ghzs.com?= =?UTF-8?q?/pm/halo-app-issues/-/issues/1323?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/constant/Constants.java | 2 + .../download/server/BrowserInstallHelper.kt | 4 +- .../gamedetail/GameDetailFragment.kt | 112 ++++++++------- .../ic_install_method_hint.png | Bin 0 -> 4126 bytes .../ic_install_method_hint.webp | Bin 1106 -> 0 bytes .../main/res/layout/detail_download_item.xml | 127 +++++++++++------- 6 files changed, 142 insertions(+), 103 deletions(-) create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_install_method_hint.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_install_method_hint.webp 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 eb4fe155e3..37581a95e7 100644 --- a/app/src/main/java/com/gh/common/constant/Constants.java +++ b/app/src/main/java/com/gh/common/constant/Constants.java @@ -163,6 +163,8 @@ public class Constants { public static final String SP_SHOULD_SHOW_GAMEDETAIL_USE_BROWSER_TO_INSTALL_HINT = "should_show_gamedetail_use_browser_to_install_hint"; // 第一次普通安装推荐使用浏览器安装提示 public static final String SP_SHOULD_SHOW_USE_BROWSER_TO_INSTALL_HINT = "should_show_use_browser_to_install_hint"; + // 游戏详情切换安装方式显示开关 + public static final String SP_SWITCH_INSTALL_VISIBLE = "sp_switch_install_visible"; //模拟器管理引导 public static final String SP_SIMULATOR_GUIDE = "simulator_guide"; diff --git a/app/src/main/java/com/gh/download/server/BrowserInstallHelper.kt b/app/src/main/java/com/gh/download/server/BrowserInstallHelper.kt index 661df11f89..ffddb4963d 100644 --- a/app/src/main/java/com/gh/download/server/BrowserInstallHelper.kt +++ b/app/src/main/java/com/gh/download/server/BrowserInstallHelper.kt @@ -29,7 +29,9 @@ object BrowserInstallHelper { private val mContext by lazy { HaloApp.getInstance().application } private val mAllInstalledPackageList: ArrayList by lazy { - PackageUtils.getAllPackageNameIncludeSystemApps(HaloApp.getInstance().applicationContext) + PackageUtils.getAllPackageNameIncludeSystemApps(HaloApp.getInstance().applicationContext).apply { + add(HaloApp.getInstance().applicationContext.packageName) + } } private fun getServer(): DownloadServer { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index d5b9ea12de..af58bb4297 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -76,6 +76,7 @@ import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack import com.shuyu.gsyvideoplayer.utils.OrientationUtils import com.shuyu.gsyvideoplayer.video.base.GSYVideoView import io.reactivex.disposables.Disposable +import kotlinx.android.synthetic.main.dialog_download.view.* import kotlinx.android.synthetic.main.piece_game_detail_video.* import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe @@ -172,11 +173,17 @@ class GameDetailFragment : NormalFragment() { @BindView(R.id.recommendAgeIv) lateinit var recommendAgeIv: ImageView - @BindView(R.id.concern_btn) - lateinit var mConcernBtn: TextView + @BindView(R.id.tv_concern) + lateinit var mConcernTv: TextView - @BindView(R.id.reserve_btn) - lateinit var mReserveBtn: TextView + @BindView(R.id.iv_concern) + lateinit var mConcernIv: ImageView + + @BindView(R.id.tv_reserve) + lateinit var mReserveTv: TextView + + @BindView(R.id.iv_reserve) + lateinit var mReserveIv: ImageView @BindView(R.id.reserve_guide_container) lateinit var mReserveGuideContainer: View @@ -184,8 +191,11 @@ class GameDetailFragment : NormalFragment() { @BindView(R.id.closeIv) lateinit var mReserveGuideClose: View - @BindView(R.id.switch_btn) - lateinit var mSwitchBtn: TextView + @BindView(R.id.tv_switch) + lateinit var mSwitchTv: TextView + + @BindView(R.id.iv_switch) + lateinit var mSwitchIv: ImageView @BindView(R.id.browser_install_hint_container) lateinit var mBrowserInstallContainer: View @@ -524,7 +534,8 @@ class GameDetailFragment : NormalFragment() { } mToolbar.setNavigationOnClickListener { requireActivity().finish() } - mConcernBtn.visibility = View.VISIBLE + mConcernIv.visibility = View.VISIBLE + mConcernTv.visibility = View.VISIBLE } @Subscribe(threadMode = ThreadMode.MAIN) @@ -822,7 +833,8 @@ class GameDetailFragment : NormalFragment() { mLoading.visibility = View.GONE mNoConnection.visibility = View.GONE mNoneDataView.visibility = View.VISIBLE - mConcernBtn.visibility = View.GONE + mConcernIv.visibility = View.GONE + mConcernTv.visibility = View.GONE toast("内容可能已被删除") } else { mLoading.visibility = View.GONE @@ -1154,9 +1166,12 @@ class GameDetailFragment : NormalFragment() { @OnClick( R.id.reuse_no_connection, R.id.gamedetail_kaifu_hint, - R.id.concern_btn, - R.id.reserve_btn, - R.id.switch_btn, + R.id.iv_concern, + R.id.tv_concern, + R.id.iv_reserve, + R.id.tv_reserve, + R.id.iv_switch, + R.id.tv_switch, R.id.closeIv, R.id.recommendCloseIv ) @@ -1173,7 +1188,7 @@ class GameDetailFragment : NormalFragment() { mAppBarLayout.setExpanded(false, true) mIsScrollToKaiFu = true } - R.id.concern_btn -> { + R.id.iv_concern, R.id.tv_concern -> { ifLogin("游戏详情-[关注]") { if (mNewGameDetailEntity != null && mNewGameDetailEntity!!.me.isGameConcerned) { DialogUtils.showCancelDialog( @@ -1186,7 +1201,7 @@ class GameDetailFragment : NormalFragment() { } } } - R.id.reserve_btn -> { + R.id.iv_reserve, R.id.tv_reserve -> { if (mGameEntity != null && SimulatorGameManager.isSimulatorGame(mGameEntity!!)) { startActivity(SimulatorGameActivity.getIntent(requireContext())) return @@ -1244,7 +1259,7 @@ class GameDetailFragment : NormalFragment() { } } } - R.id.switch_btn -> { + R.id.iv_switch, R.id.tv_switch -> { val intent = ShellActivity.getIntent( requireContext(), ShellActivity.Type.SWITCH_INSTALL_METHOD, @@ -1263,21 +1278,11 @@ class GameDetailFragment : NormalFragment() { private fun updateConcernMenuIcon(isConcerned: Boolean) { if (isConcerned) { - mConcernBtn.text = "已关注" - mConcernBtn.setCompoundDrawablesWithIntrinsicBounds( - null, - ContextCompat.getDrawable(requireContext(), R.drawable.ic_gamedetail_concerned), - null, - null - ) + mConcernTv.text = "已关注" + mConcernIv.background = R.drawable.ic_gamedetail_concerned.toDrawable() } else { - mConcernBtn.text = "关注" - mConcernBtn.setCompoundDrawablesWithIntrinsicBounds( - null, - ContextCompat.getDrawable(requireContext(), R.drawable.ic_gamedetail_concern), - null, - null - ) + mConcernTv.text = "关注" + mConcernIv.background = R.drawable.ic_gamedetail_concern.toDrawable() } } @@ -1320,41 +1325,26 @@ class GameDetailFragment : NormalFragment() { private fun showReserveBtn(isShow: Boolean = false) { if (mGameEntity != null && SimulatorGameManager.isSimulatorGame(mGameEntity!!)) { - mReserveBtn.visibility = View.VISIBLE - mReserveBtn.text = "管理" - mReserveBtn.setCompoundDrawablesWithIntrinsicBounds( - null, - ContextCompat.getDrawable( - requireContext(), - R.drawable.ic_gamedetail_simulator_manage - ), - null, - null - ) + mReserveIv.visibility = View.VISIBLE + mReserveTv.visibility = View.VISIBLE + mReserveTv.text = "管理" + mReserveIv.background = R.drawable.ic_gamedetail_simulator_manage.toDrawable() return } if (isShow) { - mReserveBtn.visibility = View.VISIBLE + mReserveIv.visibility = View.VISIBLE + mReserveTv.visibility = View.VISIBLE if (ReservationRepository.thisGameHasBeenReserved(mGameEntity?.id ?: "")) { - mReserveBtn.text = "已预约" - mReserveBtn.setCompoundDrawablesWithIntrinsicBounds( - null, - ContextCompat.getDrawable(requireContext(), R.drawable.ic_gamedetail_reserved), - null, - null - ) + mReserveTv.text = "已预约" + mReserveIv.background = R.drawable.ic_gamedetail_reserved.toDrawable() } else { - mReserveBtn.text = "预约" - mReserveBtn.setCompoundDrawablesWithIntrinsicBounds( - null, - ContextCompat.getDrawable(requireContext(), R.drawable.ic_gamedetail_reserve), - null, - null - ) + mReserveTv.text = "预约" + mReserveIv.background = R.drawable.ic_gamedetail_reserve.toDrawable() } } else { - mReserveBtn.visibility = View.GONE + mReserveIv.visibility = View.GONE + mReserveTv.visibility = View.GONE } } @@ -1457,7 +1447,9 @@ class GameDetailFragment : NormalFragment() { "取消", { mBrowserInstallContainer.visibility = View.GONE - mSwitchBtn.visibility = View.VISIBLE + SPUtils.setBoolean(Constants.SP_SWITCH_INSTALL_VISIBLE, true) + mSwitchIv.visibility = View.VISIBLE + mSwitchTv.visibility = View.VISIBLE BrowserInstallHelper.hideGameDetailUseBrowserToInstallHint() BrowserInstallHelper.logOrdinaryBrowserEvent(BrowserInstallHelper.Type.SWITCH_INSTALL_GUIDE_QUIT) } @@ -1465,7 +1457,13 @@ class GameDetailFragment : NormalFragment() { } } else { mBrowserInstallContainer.visibility = View.GONE - mSwitchBtn.visibility = View.GONE + } + if (SPUtils.getBoolean(Constants.SP_SWITCH_INSTALL_VISIBLE, false)) { + mSwitchIv.visibility = View.VISIBLE + mSwitchTv.visibility = View.VISIBLE + } else { + mSwitchIv.visibility = View.GONE + mSwitchTv.visibility = View.GONE } } diff --git a/app/src/main/res/drawable-xxxhdpi/ic_install_method_hint.png b/app/src/main/res/drawable-xxxhdpi/ic_install_method_hint.png new file mode 100644 index 0000000000000000000000000000000000000000..2f50ce093d28fc4ac668b941e8f785a5c6810a84 GIT binary patch literal 4126 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_install_method_hint.webp b/app/src/main/res/drawable-xxxhdpi/ic_install_method_hint.webp deleted file mode 100644 index 14046b745614e84b8851aad62e73714ac6517734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1106 zcmV-Y1g-m0Nk&FW1ONb6MM6+kP&il$0000G0000t001`t06|PpNX`HN00Ez%sF5T! zxNyuYfSwl-0fHT}FRxCUh3j zPbL>rS=Rl~t7Bi6lA@dJiy>5XP{Z(g~m9BZN6W3-lcZE9J0F0 zmmjT3;|+UgDiLY0Ji}C0r?$p0swSFU|wzb9r)eXJ-Hp( z!JFpK_y;fs=nv6v(?4ZimT&64WWInNPoBkofFG*2LTf{0oc=dTi!gu5Khj_Dy}&<) ze>wj_*H_R3^iW#WZkeAOh5M^?yu#KiL}k9P3EMUiPAvTK(7-?3ZoT}kbG>Ml>Rc#u z9yrC0J7cFZ6MkWXmbg5^dCL#Lln8b`G2DPW2Cy$M0RI2+WB&GRFZjiDR_G_emfj+h z_1Db*zjOu1U!<&s6xU98>C!(g+qA&P^9!YthSAWMmj`ZQtoB{f-kXO1)idY+nVjVQJFICN7w@42ihPPK?4AMcpVilm9h1y_jD2wLiTkrX6;e5PYId`2XzX zSaVN3?d;wvwfb}P>))|)J;J+6s~z26Ut;J5$w%o+OzTOwcjz~Q^Dh_@q%_%BE^BY84U>}Mx z+QwriS5-dCiKeslbF*4;nC7>A;(J4RfBwb&o&Ude$MDzxh6DRTXg7$3eskVd?8wLe z{r~^`xjb}l`MCY9gohmHg&aTXFLJlp{xD|$EI9xj1es4=j3!6e>bb$de!U&_Sy#!j zd>i)a0buCOm%){#9)DJF5DSs)aICPHO(JuEDgaIExXt~9CXLvC!}tB_&Xst@|1p=j z7Zcx7?@iZr$#D&&Wh(#rb1IeeL-^6Z=hcV9`3z9Tyj$B)jXsw4%=S)LkJ9%2#g*ooB2r*j1YnArbphmGQ@1_m+1+9P6Y+z; z+MQb`=>7&i#4X61Pg3o*0oo*8oPz7QY?MPX9+kQ#trdyXpe=qBx0`;_n4ocDiVr2o Y59IDHKyF1Ux?BDpW>_}2`ThU^0BTb*WB>pF diff --git a/app/src/main/res/layout/detail_download_item.xml b/app/src/main/res/layout/detail_download_item.xml index a6c0a7641d..a143a5f716 100644 --- a/app/src/main/res/layout/detail_download_item.xml +++ b/app/src/main/res/layout/detail_download_item.xml @@ -81,7 +81,7 @@ android:layout_height="40dp" android:background="@drawable/bg_install_hint" android:visibility="gone" - tools:visibility="visible"> + tools:visibility="gone"> - + android:paddingTop="10dp" + android:paddingEnd="20dp" + android:paddingBottom="10dp"> - - - + + + + + + + + - + android:layout_marginStart="24dp" + android:layout_marginLeft="24dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/iv_switch" + app:layout_constraintTop_toTopOf="parent" /> + From 609e4a49b830a103aaec40f0a30b2ecdcbc56c94 Mon Sep 17 00:00:00 2001 From: juntao Date: Fri, 27 Aug 2021 09:45:18 +0800 Subject: [PATCH 123/151] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=85=89=E7=8E=AF?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E4=BC=98=E5=8C=96=E6=B1=87=E6=80=BB=E7=AC=AC?= =?UTF-8?q?=E4=B8=89=E5=91=A8(0827=E6=B5=8B=E8=AF=95=201,2)=20https://git.?= =?UTF-8?q?ghzs.com/pm/halo-app-issues/-/issues/1449?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/gamecenter/entity/HelpEntity.kt | 1 + .../gamedetail/rating/RatingCommentItemViewHolder.kt | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/entity/HelpEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/HelpEntity.kt index b54068678a..7adf74f309 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/HelpEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/HelpEntity.kt @@ -7,6 +7,7 @@ import kotlinx.android.parcel.Parcelize @Parcelize data class HelpEntity(@SerializedName("_id") val id: String = "", + @SerializedName(value = "title", alternate = ["index_title"]) val title: String = "", val type: String = "", val content: String = ""): Parcelable \ No newline at end of file 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 58ab1a5ed6..94a79b17e1 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 @@ -264,11 +264,11 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR }, auditText.length - 3, auditText.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) audit.text = auditText audit.movementMethod = LinkMovementMethod() + } - comment.post { - comment.visibility = View.INVISIBLE - vote.visibility = View.INVISIBLE - } + comment.post { + comment.visibility = View.INVISIBLE + vote.visibility = View.INVISIBLE } } } From 1c754a6dd03ab9f777111478ab70ed6814fa2082 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Fri, 27 Aug 2021 10:41:42 +0800 Subject: [PATCH 124/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E9=A6=96=E9=A1=B5=E8=BD=AE=E6=92=AD?= =?UTF-8?q?=E5=9B=BE=E6=98=BE=E7=A4=BA=E8=83=8C=E6=99=AF=E8=89=B2=E5=8A=9F?= =?UTF-8?q?=E8=83=BD(20210827=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=981)=20http?= =?UTF-8?q?s://git.ghzs.com/pm/halo-app-issues/-/issues/1321?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt index a653a70a31..8fadf9083f 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt @@ -286,6 +286,7 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { val field = ViewPager::class.java.getDeclaredField("mRestoredCurItem") field.isAccessible = true field.set(viewPager, mDefaultSelectedTab) + mLastSelectedPosition = mDefaultSelectedTab } viewPager.adapter = FragmentAdapter(childFragmentManager, fragmentList, tabTitleList) tabLayout.setupWithViewPager(mBinding?.viewPager) From f508e103c11106e293d43bcd388ef6fe3aa29ebc Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Fri, 27 Aug 2021 11:38:38 +0800 Subject: [PATCH 125/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E9=80=82=E9=BE=84=E7=AD=89=E7=BA=A7?= =?UTF-8?q?=E6=8F=90=E7=A4=BA(20210827UI=E6=B5=8B=E8=AF=95=E9=97=AE?= =?UTF-8?q?=E9=A2=98)=20https://git.ghzs.com/pm/halo-app-issues/-/issues/1?= =?UTF-8?q?397?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/gamedetail_body.xml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/layout/gamedetail_body.xml b/app/src/main/res/layout/gamedetail_body.xml index 198176e672..a3cd992b4f 100644 --- a/app/src/main/res/layout/gamedetail_body.xml +++ b/app/src/main/res/layout/gamedetail_body.xml @@ -109,9 +109,10 @@ @@ -122,18 +123,18 @@ android:layout_height="wrap_content" android:ellipsize="end" android:includeFontPadding="false" - android:lineSpacingExtra="4dp" + android:lineSpacingExtra="2dp" android:maxLines="2" android:textColor="@color/text_333333" android:textSize="16sp" android:textStyle="bold" - tools:text="地海争霸2-最后的火之高兴和霜之哀伤" /> + tools:text="地海争霸2" /> @@ -143,21 +144,21 @@ android:layout_width="76dp" android:layout_height="14dp" android:layout_marginLeft="8dp" - android:src="@drawable/ic_recommend_age8" android:visibility="gone" app:layout_constraintBottom_toBottomOf="@+id/gameIconContainer" app:layout_constraintStart_toEndOf="@+id/gameIconContainer" + tools:src="@drawable/ic_recommend_age8" tools:visibility="visible" /> Date: Fri, 27 Aug 2021 11:49:06 +0800 Subject: [PATCH 126/151] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=9B=B8=E5=85=B3=E4=BC=98=E5=8C=96(0826?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=202~5)=20https://git.ghzs.com/pm/halo-app-is?= =?UTF-8?q?sues/-/issues/1244?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gamecenter/download/DownloadFragment.kt | 2 +- .../download/UpdatableGameAdapter.kt | 4 +- .../download/UpdatableGameViewModel.kt | 52 ++++++++++++------- 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt b/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt index c91c12f4e8..13288f7ee1 100644 --- a/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt @@ -49,8 +49,8 @@ class DownloadFragment : BaseFragment_TabLayout() { override fun initFragmentList(fragments: MutableList) { fragments.add(GameDownloadFragment()) - fragments.add(GameUpdateFragment()) fragments.add(UpdatableGameFragment()) + fragments.add(GameUpdateFragment()) fragments.add(InstalledGameFragment()) } diff --git a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt index 767f802c92..ac8e8c8e14 100644 --- a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt @@ -255,9 +255,9 @@ class UpdatableGameAdapter(private var mViewModel: UpdatableGameViewModel) : root.setOnClickListener { if (isUpdateIgnored) { - mViewModel.undoIgnoredUpdate(update.packageName) + mViewModel.undoIgnoredUpdate(update.packageName, update.version ?: "") } else { - mViewModel.ignoreUpdate(update.packageName) + mViewModel.ignoreUpdate(update.packageName, update.version ?: "") } popupWindow.dismiss() } diff --git a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt index 1e4977a50f..c9fcabf2b1 100644 --- a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt @@ -132,8 +132,10 @@ class UpdatableGameViewModel( // 找到我的版本 for (packageName in packageNameList) { - val samePackageNameUpdateList = packageNameAndUpdateListMap[packageName] ?: arrayListOf() - val installedSignature = PackageUtils.getApkSignatureByPackageName(getApplication(), packageName) + val samePackageNameUpdateList = + packageNameAndUpdateListMap[packageName] ?: arrayListOf() + val installedSignature = + PackageUtils.getApkSignatureByPackageName(getApplication(), packageName) val isInstalledSignByGh = PackageUtils.isSignedByGh(getApplication(), packageName) val installedGhId = if (isInstalledSignByGh) PackageUtils.getGhId(packageName) else null val installedVersionName = PackageUtils.getVersionNameByPackageName(packageName) ?: "" @@ -150,20 +152,20 @@ class UpdatableGameViewModel( mismatchedVersionUpdateList.add(update) } } - } else if (mDownloadedGameIdAndPackageNameDao.getRawString().contains(packageName)) { - // 光环曾经下载过对应包名的游戏,找到对应游戏ID的更新作为我的版本 - val idAndPackageNameString = mDownloadedGameIdAndPackageNameDao.getRawString() + } else if (samePackageNameUpdateList.find { it.signature == installedSignature } != null) { + // 存在同包名同签名的游戏,以同包名同签名的游戏作为我的版本 for (update in samePackageNameUpdateList) { - if (matchedVersionUpdate == null && idAndPackageNameString.contains(update.id)) { + if (installedSignature == update.signature) { matchedVersionUpdate = update } else { mismatchedVersionUpdateList.add(update) } } - } else if (samePackageNameUpdateList.find { it.signature == installedSignature } != null) { - // 存在同包名同签名的游戏,以同包名同签名的游戏作为我的版本 + } else if (mDownloadedGameIdAndPackageNameDao.getRawString().contains(packageName)) { + // 光环曾经下载过对应包名的游戏,找到对应游戏ID的更新作为我的版本 + val idAndPackageNameString = mDownloadedGameIdAndPackageNameDao.getRawString() for (update in samePackageNameUpdateList) { - if (installedSignature == update.signature) { + if (matchedVersionUpdate == null && idAndPackageNameString.contains(update.id)) { matchedVersionUpdate = update } else { mismatchedVersionUpdateList.add(update) @@ -193,10 +195,19 @@ class UpdatableGameViewModel( } } + // 不存在匹配版本 + // 或者匹配版本与已安装版本相同,但没有其它可更新版本的不需要添加进列表中 + if (matchedVersionUpdate == null || + (matchedVersionUpdate.version == installedVersionName + && mismatchedVersionUpdateList.isEmpty()) + ) { + continue + } + // TODO 我的版本应该不会为空吧? packageUpdateList.add( PackageUpdate( - matchedVersionUpdate!!, + matchedVersionUpdate, mismatchedVersionUpdateList ) ) @@ -216,24 +227,25 @@ class UpdatableGameViewModel( val ignoredPackageUpdateList: ArrayList = arrayListOf() // 被隐藏的我的游戏列表 val permanentSuppressedUpdatePackageNameList = mSuppressUpdateDao.getAll() - val ignoredUpdatePackageNameList = mIgnoredUpdateDao.getAll() + val ignoredUpdateList = mIgnoredUpdateDao.getAll() mCachedMatchedVersionValidUpdateList.clear() for (packageUpdate in packageUpdateList) { - val packageName = packageUpdate.matchedVersionUpdate.packageName + val matchedPackageName = packageUpdate.matchedVersionUpdate.packageName + val matchedVersionName = packageUpdate.matchedVersionUpdate.version val currentlyUpdatableVersion = packageUpdate.matchedVersionUpdate.currentVersion // 类型不为单机游戏/gj单机的游戏或选择了临时隐藏或永久隐藏的不需要显示其它版本 if ((packageUpdate.matchedVersionUpdate.category != "local" && packageUpdate.matchedVersionUpdate.category != "gjlocal") - || permanentSuppressedUpdatePackageNameList?.contains(packageName) == true - || SPUtils.getBoolean(SP_TEMPORARY_SUPPRESS_UPDATE_PREFIX + packageName + currentlyUpdatableVersion) + || permanentSuppressedUpdatePackageNameList?.contains(matchedPackageName) == true + || SPUtils.getBoolean(SP_TEMPORARY_SUPPRESS_UPDATE_PREFIX + matchedPackageName + currentlyUpdatableVersion) ) { packageUpdate.mismatchedVersionUpdateList.clear() } // 被忽略的更新不需要显示其它版本 - if (ignoredUpdatePackageNameList?.contains(packageName) == true) { + if (ignoredUpdateList?.contains(matchedPackageName + matchedVersionName) == true) { // 若我的版本与当前应用版本一致那么取其它版本的第一个来替换成我的版本 (避免出现忽略更新列表显示按钮为启动的问题) // if (packageUpdate.matchedVersionUpdate.version == PackageUtils.getVersionNameByPackageName(packageName) // && packageUpdate.mismatchedVersionUpdateList.isNotEmpty()) { @@ -247,7 +259,7 @@ class UpdatableGameViewModel( // 2. 按钮为启动的我的游戏 // 3. 忽略更新的游戏 when { - ignoredUpdatePackageNameList?.contains(packageName) == true -> { + ignoredUpdateList?.contains(matchedPackageName + matchedVersionName) == true -> { ignoredPackageUpdateList.add(packageUpdate) } packageUpdate.matchedVersionUpdate.version == currentlyUpdatableVersion -> { @@ -475,13 +487,13 @@ class UpdatableGameViewModel( setUpdatableList(mRawUpdatableList) } - fun ignoreUpdate(packageName: String) { - mIgnoredUpdateDao.add(packageName) + fun ignoreUpdate(packageName: String, versionName: String) { + mIgnoredUpdateDao.add(packageName + versionName) setUpdatableList(mRawUpdatableList) } - fun undoIgnoredUpdate(packageName: String) { - mIgnoredUpdateDao.delete(packageName) + fun undoIgnoredUpdate(packageName: String, versionName: String) { + mIgnoredUpdateDao.delete(packageName + versionName) setUpdatableList(mRawUpdatableList) } From 29cd798ca8d60188c4a57356552268a9426ea42e Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Fri, 27 Aug 2021 12:00:57 +0800 Subject: [PATCH 127/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E5=BC=80=E6=9C=8D=E8=A1=A8=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BC=98=E5=8C=96=EF=BC=880826=E6=B5=8B=E8=AF=95=20?= =?UTF-8?q?=E7=AC=AC3=E3=80=814=E3=80=815=E3=80=816=E7=82=B9=EF=BC=89https?= =?UTF-8?q?://git.ghzs.com/pm/halo-app-issues/-/issues/1220#note=5F115199?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/common/databind/BindingAdapters.java | 4 +- .../main/java/com/gh/common/util/TimeUtils.kt | 12 ++ .../servers/GameServersContentFragment.kt | 138 ++++++++++++------ .../servers/GameServersContentViewModel.kt | 58 +++++--- 4 files changed, 147 insertions(+), 65 deletions(-) diff --git a/app/src/main/java/com/gh/common/databind/BindingAdapters.java b/app/src/main/java/com/gh/common/databind/BindingAdapters.java index 2a429ff747..a93c5a6f91 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -769,8 +769,8 @@ public class BindingAdapters { } else { TagStyleEntity typeTag = new TagStyleEntity(); typeTag.setName(test.getType() != null ? test.getType() : ""); - typeTag.setBackground("FFF3E0"); - typeTag.setColor("FA8500"); + typeTag.setBackground("E8F3FF"); + typeTag.setColor("1383EB"); tagStyle.add(typeTag); TagStyleEntity timeTag = new TagStyleEntity(); 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 ae99de688f..b257128781 100644 --- a/app/src/main/java/com/gh/common/util/TimeUtils.kt +++ b/app/src/main/java/com/gh/common/util/TimeUtils.kt @@ -174,6 +174,18 @@ object TimeUtils { return calendar.timeInMillis } + @JvmStatic + fun getTimeOfDayOffsetAndHour(dayOffset: Int, hour: Int): Long { + val calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8")) + calendar.timeInMillis = getJavaTimestamp(System.currentTimeMillis()) + calendar.set(Calendar.DAY_OF_YEAR, calendar[Calendar.DAY_OF_YEAR] + dayOffset) + calendar.set(Calendar.HOUR_OF_DAY, hour) + 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) { diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt index 41527d616f..14b3998b92 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt @@ -24,6 +24,8 @@ import com.lightgame.download.DataWatcher import com.lightgame.download.DownloadEntity import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +import java.text.SimpleDateFormat +import java.util.* /** * 开服表内容 fragment @@ -81,6 +83,7 @@ class GameServersContentFragment : BaseFragment() { mViewModel?.listLiveData?.observe(this, androidx.lifecycle.Observer { if (it.first == "down") { mAdapter?.submitList(it.second, isShowPullDownTip = false, isDown = true, downSize = it.third) + mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.VISIBLE } else { mAdapter?.submitList(it.second, mShowPullDownTipFlag || mBinding?.pullDownTip?.visibility == View.VISIBLE) } @@ -109,6 +112,8 @@ class GameServersContentFragment : BaseFragment() { mBinding?.recyclerView?.run { if (translationY != 0F) { animate().translationY(0F).setDuration(200).start() + hidePullDownTip() + mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.GONE } } @@ -134,50 +139,55 @@ class GameServersContentFragment : BaseFragment() { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) if (dy != 0) hidePullDownTip() + if (mLayoutManager?.findFirstVisibleItemPosition() == 0) { + mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.GONE + } else if (dy != 0) { + mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.VISIBLE + } val position = mLayoutManager?.findFirstVisibleItemPosition() ?: 0 - if (RecyclerView.NO_POSITION == position) return + if (RecyclerView.NO_POSITION == position || position < 1) return val dataList = mViewModel?.listLiveData?.value?.second - val gameEntity = dataList?.get(position + 1) + val gameEntity = dataList?.get(position - 1) val kaifuTimeHint = gameEntity?.kaifuTimeHint // 悬挂的文案 -// val timeGameEntity = dataList?.get(position) -// val fixedTopHint = timeGameEntity?.fixedTop ?: false -// if (fixedTopHint) { -// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv -// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.text = "热门开服" -// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.tag = timeGameEntity?.kaifuTimeHint -// mBinding?.kaifuTimeContainer?.kaifuItemHeader?.setImageResource(R.drawable.ic_kaifu_hot) -// } else { -// val timeHint = timeGameEntity?.kaifuTimeHint -// val dateFm = SimpleDateFormat("yyyy-MM-dd (EEEE) HH:mm", Locale.CHINA) -// if (timeHint == null || timeHint == 0L) { -// val serverEntity = timeGameEntity?.serverEntity -// if (serverEntity != null) { -// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.text = dateFm.format(serverEntity.getTime() * 1000) -// mBinding?.kaifuTimeContainer?.kaifuItemHeader?.setImageResource(R.drawable.kaifu_time_icon) -// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.tag = serverEntity.getTime() -// } -// } else { -// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.text = dateFm.format(timeHint * 1000) -// mBinding?.kaifuTimeContainer?.kaifuItemHeader?.setImageResource(R.drawable.kaifu_time_icon) -// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.tag = timeHint -// } -// } -// -// // 悬挂界面移动 -// if (kaifuTimeHint != null && kaifuTimeHint != 0L) { -// val buttom = mLayoutManager?.findViewByPosition(position)?.bottom ?: 0 -// if (buttom <= mBinding?.kaifuTimeContainer?.kaifuItemTime?.height ?: 0) { -// mLlParams?.topMargin = buttom - (mBinding?.kaifuTimeContainer?.kaifuItemTime?.height -// ?: 0) -// } else { -// mLlParams?.topMargin = 0 -// } -// } else { -// mLlParams?.topMargin = 0 -// } -// mBinding?.kaifuTimeContainer?.kaifuItemTime?.layoutParams = mLlParams + val timeGameEntity = dataList?.get(position - 1) + val fixedTopHint = timeGameEntity?.fixedTop ?: false + if (fixedTopHint) { + mBinding?.kaifuTimeContainer?.kaifuItemTimeTv + mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.text = "热门开服" + mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.tag = timeGameEntity?.kaifuTimeHint + mBinding?.kaifuTimeContainer?.kaifuItemHeader?.setImageResource(R.drawable.ic_kaifu_hot) + } else { + val timeHint = timeGameEntity?.kaifuTimeHint + val dateFm = SimpleDateFormat("yyyy-MM-dd (EEEE) HH:mm", Locale.CHINA) + if (timeHint == null || timeHint == 0L) { + val serverEntity = timeGameEntity?.serverEntity + if (serverEntity != null) { + mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.text = dateFm.format(serverEntity.getTime() * 1000) + mBinding?.kaifuTimeContainer?.kaifuItemHeader?.setImageResource(R.drawable.kaifu_time_icon) + mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.tag = serverEntity.getTime() + } + } else { + mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.text = dateFm.format(timeHint * 1000) + mBinding?.kaifuTimeContainer?.kaifuItemHeader?.setImageResource(R.drawable.kaifu_time_icon) + mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.tag = timeHint + } + } + + // 悬挂界面移动 + if (kaifuTimeHint != null && kaifuTimeHint != 0L) { + val bottom = mLayoutManager?.findViewByPosition(position)?.bottom ?: 0 + if (bottom <= mBinding?.kaifuTimeContainer?.kaifuItemTime?.height ?: 0) { + mLlParams?.topMargin = bottom - (mBinding?.kaifuTimeContainer?.kaifuItemTime?.height + ?: 0) + } else { + mLlParams?.topMargin = 0 + } + } else { + mLlParams?.topMargin = 0 + } + mBinding?.kaifuTimeContainer?.kaifuItemTime?.layoutParams = mLlParams } }) mBinding?.removeFilter?.setOnClickListener { @@ -269,9 +279,51 @@ class GameServersContentFragment : BaseFragment() { mViewModel?.run { this.day = day this.hour = hour -// this.type = type - this.tags = tags - onRefreshPage() + if (day != null && hour != null && tags == this.tags) { + val time = when (day) { + "today" -> TimeUtils.getTimeOfDayOffsetAndHour(0, hour.toInt()) + "tomorrow" -> TimeUtils.getTimeOfDayOffsetAndHour(1, hour.toInt()) + else -> TimeUtils.getTimeOfDayOffsetAndHour(2, 0) + } + val isExist = isExistTime(time) + val proximateTime = mViewModel?.getProximateTime(time) + if (proximateTime != null) { + val position = mViewModel?.getPositionByTime(proximateTime) ?: 0 + mLayoutManager?.scrollToPositionWithOffset(position + 1, 0) + mBinding?.run { + recyclerView.post { + if (mLayoutManager?.findLastVisibleItemPosition() == mAdapter!!.itemCount - 1 + && !mAdapter!!.isNextOver() + && !mAdapter!!.isNextLoading()) { + mViewModel?.run { + loadData(action = "up") + } + } else if (!isExist) { + kaifuTimeContainer.kaifuItemTime.visibility = View.GONE + val canScrollVertically = recyclerView.canScrollVertically(-1) + noMatchView.translationY = 0F + noMatchView.visibility = View.VISIBLE + recyclerView.translationY = if (canScrollVertically) 40F.dip2px().toFloat() else -(8F.dip2px().toFloat()) + postDelayedRunnable({ + tryCatchInRelease { + noMatchView.animate().translationY(-(40F.dip2px().toFloat())).setDuration(200).start() + recyclerView.animate().translationY(recyclerView.translationY - 40F.dip2px().toFloat()).setDuration(200) + .withEndAction { + kaifuTimeContainer.kaifuItemTime.visibility = View.VISIBLE + }.start() + } + }, 2000) + } + } + } + } else { + this.tags = tags + onRefreshPage() + } + } else { + this.tags = tags + onRefreshPage() + } } } @@ -325,7 +377,7 @@ class GameServersContentFragment : BaseFragment() { override fun loadDone() { super.loadDone() mBinding?.recyclerView?.visibility = View.VISIBLE - mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.GONE +// mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.VISIBLE mBinding?.noConnectionContainer?.reuseNoConnection?.visibility = View.GONE mBinding?.reuseNoneData?.visibility = View.GONE mBinding?.loadingContainer?.reuseLlLoading?.visibility = View.GONE diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt index 6a26ee7df5..782ec66a73 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt @@ -6,10 +6,7 @@ import androidx.collection.ArrayMap import androidx.collection.arrayMapOf import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.MutableLiveData -import com.gh.common.util.ApkActiveUtils -import com.gh.common.util.EntranceUtils -import com.gh.common.util.UrlFilterUtils -import com.gh.common.util.countOccurrences +import com.gh.common.util.* import com.gh.download.DownloadManager import com.gh.gamecenter.baselist.LoadStatus import com.gh.gamecenter.entity.GameEntity @@ -36,6 +33,8 @@ class GameServersContentViewModel(application: Application) var prevId: String? = null var nextId: String? = null var isInit = true + var mKaiFuTimeList = arrayListOf() + private var mTimePositionMap = hashMapOf() init { loadData() @@ -231,17 +230,15 @@ class GameServersContentViewModel(application: Application) val gameEntity = listLiveData.value?.second?.find { it.kaifuTimeHint != null } val serverEntity = gameEntity?.serverEntity val nextServerEntity = entity.serverEntity - if (serverEntity == null || nextServerEntity == null) { - i++ - continue - } - val time = serverEntity.getTime() - val nextTime = nextServerEntity.getTime() - if (time != nextTime) { - val kaiFuTimeEntity = GameEntity() - kaiFuTimeEntity.kaifuTimeHint = time - list.add(i, kaiFuTimeEntity) - i++ + if (serverEntity != null && nextServerEntity != null) { + val time = serverEntity.getTime() + val nextTime = nextServerEntity.getTime() + if (time != nextTime) { + val kaiFuTimeEntity = GameEntity() + kaiFuTimeEntity.kaifuTimeHint = time + list.add(i, kaiFuTimeEntity) + i++ + } } } @@ -333,15 +330,36 @@ class GameServersContentViewModel(application: Application) } private fun recordIndex(list: ArrayList) { + mKaiFuTimeList.clear() + mTimePositionMap.clear() var index = 0 - list.forEach { - if (it.kaifuTimeHint != null) return@forEach - it.sequence = index++ - if (it.serverRemaining != null) { - for (remainingGame in it.serverRemaining!!) { + list.forEachIndexed { i, entity -> + if (entity.kaifuTimeHint != null) { + mKaiFuTimeList.add(entity.kaifuTimeHint!!) + mTimePositionMap[entity.kaifuTimeHint!!] = i + } + entity.sequence = index++ + if (entity.serverRemaining != null) { + for (remainingGame in entity.serverRemaining!!) { remainingGame.sequence = index++ } } } } + + fun isExistTime(time: Long): Boolean { + return mKaiFuTimeList.contains(time / 1000) + } + + fun getProximateTime(time: Long): Long? { + if (mKaiFuTimeList.isEmpty()) return null + if (time >= TimeUtils.getJavaTimestamp(mKaiFuTimeList.first()) && time <= TimeUtils.getJavaTimestamp(mKaiFuTimeList.last())) { + return mKaiFuTimeList.firstOrNull { TimeUtils.getJavaTimestamp(it) >= time } + } + return null + } + + fun getPositionByTime(time: Long): Int? { + return mTimePositionMap[time] + } } \ No newline at end of file From 7516db3a609f86eb627a91cc884afd9404d011a6 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Fri, 27 Aug 2021 15:54:34 +0800 Subject: [PATCH 128/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E5=BC=80=E6=9C=8D=E8=A1=A8=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BC=98=E5=8C=96=EF=BC=880827=E6=B5=8B=E8=AF=95=201?= =?UTF-8?q?=EF=BC=89https://git.ghzs.com/pm/halo-app-issues/-/issues/1220#?= =?UTF-8?q?note=5F115509?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/databind/BindingAdapters.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/gh/common/databind/BindingAdapters.java b/app/src/main/java/com/gh/common/databind/BindingAdapters.java index a93c5a6f91..2a429ff747 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -769,8 +769,8 @@ public class BindingAdapters { } else { TagStyleEntity typeTag = new TagStyleEntity(); typeTag.setName(test.getType() != null ? test.getType() : ""); - typeTag.setBackground("E8F3FF"); - typeTag.setColor("1383EB"); + typeTag.setBackground("FFF3E0"); + typeTag.setColor("FA8500"); tagStyle.add(typeTag); TagStyleEntity timeTag = new TagStyleEntity(); From f0ab3338929e2d40461aba52f2f88be053056333 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Fri, 27 Aug 2021 16:06:26 +0800 Subject: [PATCH 129/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E9=A6=96=E9=A1=B5=E8=BD=AE=E6=92=AD?= =?UTF-8?q?=E5=9B=BE=E6=98=BE=E7=A4=BA=E8=83=8C=E6=99=AF=E8=89=B2=E5=8A=9F?= =?UTF-8?q?=E8=83=BD(20210826UI=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98)=20htt?= =?UTF-8?q?ps://git.ghzs.com/pm/halo-app-issues/-/issues/1321?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fragment/HomeSearchToolWrapperFragment.kt | 40 +++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt index 8fadf9083f..7d43906964 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt @@ -63,6 +63,9 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { private var mIsBannerShow = false private var mHomeTab: SubjectRecommendEntity? = null + private var mHomeTabPosition = -1 + private var mOffsetRatio = 0f + private var mOffsetCritical = 0.7f override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -101,6 +104,7 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { mDefaultSelectedTab = mViewModel?.defaultTabPosition ?: 0 } mHomeTab = it?.find { tab -> tab.type == "home" } + mHomeTabPosition = it.indexOf(mHomeTab) initViewPager(it) // 当 tab 为一个的时候隐藏顶部 tab 栏,停用 nestedScroll @@ -305,9 +309,9 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { } fun onScrollChanged(totalHeight: Int, offset: Int) { + mOffsetRatio = offset / totalHeight.toFloat() if (mIsBannerShow && offset >= totalHeight) { mIsBannerShow = false - mBinding?.indicatorView?.updateIndicatorDrawable(R.drawable.ic_home_tab_indicator_colorful.toDrawable()) mHomeTab?.primaryColor = Color.WHITE mHomeTab?.useLightStyle = false mIsDisplayingLightContent = false @@ -315,23 +319,31 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { DisplayUtils.setLightStatusBar(requireActivity(), !mIsDisplayingLightContent) mTabSelectedColor = TAB_SELECTED_COLOR mTabDefaultColor = TAB_DEFAULT_COLOR + mBinding?.indicatorView?.updateIndicatorDrawable(R.drawable.ic_home_tab_indicator_colorful.toDrawable()) updateTabTextStyle(mLastSelectedPosition, 0f) - } else if (!mIsBannerShow && offset < totalHeight) { + } else if (offset < totalHeight) { mIsBannerShow = true - mBinding?.indicatorView?.updateIndicatorDrawable(R.drawable.ic_home_tab_indicator_white.toDrawable()) - mHomeTab?.primaryColor = mCurrentSelectBannerColor - mHomeTab?.useLightStyle = true - mIsDisplayingLightContent = true - updateAppBarColorWhenScrollChanged(mCurrentSelectBannerColor) + val colorInBetween = + ColorUtils.blendARGB(mCurrentSelectBannerColor, Color.WHITE, mOffsetRatio) + mHomeTab?.primaryColor = colorInBetween + mHomeTab?.useLightStyle = mOffsetRatio < mOffsetCritical + mIsDisplayingLightContent = mOffsetRatio < mOffsetCritical + updateAppBarColorWhenScrollChanged(colorInBetween) DisplayUtils.setLightStatusBar(requireActivity(), !mIsDisplayingLightContent) - mTabSelectedColor = TAB_DEFAULT_COLOR_LIGHT - mTabDefaultColor = TAB_DEFAULT_COLOR_LIGHT + mTabSelectedColor = + if (mOffsetRatio < mOffsetCritical) TAB_DEFAULT_COLOR_LIGHT else TAB_SELECTED_COLOR + mTabDefaultColor = + if (mOffsetRatio < mOffsetCritical) TAB_DEFAULT_COLOR_LIGHT else TAB_DEFAULT_COLOR + mBinding?.indicatorView?.updateIndicatorDrawable( + if (mOffsetRatio < mOffsetCritical) R.drawable.ic_home_tab_indicator_white.toDrawable() else + R.drawable.ic_home_tab_indicator_colorful.toDrawable() + ) updateTabTextStyle(mLastSelectedPosition, 0f) } } private fun updateAppBarColorWhenScrollChanged(color: Int) { - if (color != Color.WHITE) { + if (color != Color.WHITE && mOffsetRatio >= 1f) { mCurrentSelectBannerColor = color mHomeTab?.primaryColor = mCurrentSelectBannerColor } @@ -341,8 +353,12 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { fun changeAppBarColor(color: Int) { mCurrentSelectBannerColor = color if (mIsBannerShow) { - mHomeTab?.primaryColor = mCurrentSelectBannerColor - updateAppBarStyle(color, color != Color.WHITE) + val colorInBetween = + ColorUtils.blendARGB(color, Color.WHITE, mOffsetRatio) + mHomeTab?.primaryColor = colorInBetween + if (mBinding?.viewPager?.currentItem == mHomeTabPosition) { + updateAppBarStyle(colorInBetween, colorInBetween != Color.WHITE) + } } } From 0b213253ce2ccc8b79d49f56a8697839686d3dcf Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Fri, 27 Aug 2021 16:11:56 +0800 Subject: [PATCH 130/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E5=BC=80=E6=9C=8D=E8=A1=A8=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BC=98=E5=8C=96=EF=BC=880827=E6=B5=8B=E8=AF=95=201?= =?UTF-8?q?=EF=BC=89https://git.ghzs.com/pm/halo-app-issues/-/issues/1220#?= =?UTF-8?q?note=5F115509?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gh/common/databind/BindingAdapters.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/gh/common/databind/BindingAdapters.java b/app/src/main/java/com/gh/common/databind/BindingAdapters.java index 2a429ff747..d7fa0f91dc 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -760,9 +760,13 @@ public class BindingAdapters { if (test != null // 这个判断用于开测表列表 && !"type_tag".equals(test.getGameTag())) { - if ("custom".equals(test.getGameTag()) && !TextUtils.isEmpty(test.getText())) { + if ("custom".equals(test.getGameTag())) { TagStyleEntity typeTag = new TagStyleEntity(); - typeTag.setName(test.getText() != null ? test.getText() : ""); + if (!TextUtils.isEmpty(test.getText())) { + typeTag.setName(test.getText() != null ? test.getText() : ""); + } else { + typeTag.setName(test.getType() != null ? test.getType() : ""); + } typeTag.setBackground("E8F3FF"); typeTag.setColor("1383EB"); tagStyle.add(typeTag); From 759cacf933724937f27ea61477ad4cc166c52cd0 Mon Sep 17 00:00:00 2001 From: leafwai Date: Fri, 27 Aug 2021 17:32:34 +0800 Subject: [PATCH 131/151] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=B8=B8=E6=88=8F?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E5=BC=95=E5=AF=BC=E5=AE=9E=E4=BD=93=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/NewLogUtils.kt | 2 +- .../gamecenter/entity/GameGuidePopupEntity.kt | 26 +++---------------- 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/NewLogUtils.kt b/app/src/main/java/com/gh/common/util/NewLogUtils.kt index b863173ee4..57f0907634 100644 --- a/app/src/main/java/com/gh/common/util/NewLogUtils.kt +++ b/app/src/main/java/com/gh/common/util/NewLogUtils.kt @@ -1141,7 +1141,7 @@ object NewLogUtils { } //点击引导浮窗链接 - fun logGuidePopLinkClick(guideId: String, linkType: String, linkTitle: String){ + fun logGuidePopLinkClick(guideId: String, linkType: String? = "", linkTitle: String? = ""){ val json = json { "event" to "guide_pop_link_click" "payload" to json { diff --git a/app/src/main/java/com/gh/gamecenter/entity/GameGuidePopupEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/GameGuidePopupEntity.kt index e3e64c94ea..3551ec0126 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/GameGuidePopupEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/GameGuidePopupEntity.kt @@ -4,25 +4,7 @@ import com.google.gson.annotations.SerializedName data class GameGuidePopupEntity( @SerializedName("_id") - var id: String = "", - var content: String = "", - var jump: Jump -) { - data class Jump( - var type: String = "", - var title: String = "", - var link: String = "", - @SerializedName("link_text") - var linkText: String = "", - var text: String = "", - @SerializedName("link_community") - var linkCommunity: CommunityEntity? = null, - var display: Display? = Display(), - ) { - data class Display( - var slide: Boolean = false, - var recommend: Boolean = false, - var refresh: Boolean = false - ) - } -} + val id: String = "", + val content: String = "", + val jump: LinkEntity +) From f2e7a64e9946654bcea1c64c819d1a20dd17f825 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Mon, 30 Aug 2021 10:04:59 +0800 Subject: [PATCH 132/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E9=80=82=E9=BE=84=E7=AD=89=E7=BA=A7?= =?UTF-8?q?=E6=8F=90=E7=A4=BA(0830=E6=B5=8B=E8=AF=95=E5=8F=8D=E9=A6=882)?= =?UTF-8?q?=20https://git.ghzs.com/pm/halo-app-issues/-/issues/1397?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gamecenter/gamedetail/desc/GameDetailInfoItemAdapter.kt | 3 +++ .../java/com/gh/gamecenter/gamedetail/entity/DetailEntity.kt | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameDetailInfoItemAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameDetailInfoItemAdapter.kt index 8d402e37d5..a460a49528 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameDetailInfoItemAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/GameDetailInfoItemAdapter.kt @@ -37,6 +37,9 @@ class GameDetailInfoItemAdapter(val context: Context, val gameInfo: GameInfo, pr if (gameInfo.updateTime != 0L) { datas.add(GameInfoItemData(title = "更新时间", info = TimeUtils.getFormatTime(gameInfo.updateTime))) } + if (gameInfo.recommendAge.isNotEmpty()) { + datas.add(GameInfoItemData(title = "适龄等级", info = gameInfo.recommendAge)) + } if (!gameInfo.permissions.isNullOrEmpty()) { datas.add(GameInfoItemData(title = "权限及用途", info = "查看")) } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/entity/DetailEntity.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/entity/DetailEntity.kt index 9032c53c4a..8503757698 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/entity/DetailEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/entity/DetailEntity.kt @@ -138,7 +138,9 @@ data class GameInfo( var manufacturer: String = "", var permissions: List? = null, @SerializedName("privacy_policy_url") - var privacyPolicyUrl: String? = null + var privacyPolicyUrl: String? = null, + @SerializedName("recommend_age") + var recommendAge: String = "",//适龄等级 ) : Parcelable @Keep From bb0378c216c4b622c29b8bed79c13a51f9287f09 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Mon, 30 Aug 2021 11:26:35 +0800 Subject: [PATCH 133/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E6=B8=B8=E6=88=8F=E7=A4=BC=E5=8C=85?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=88=E7=AC=AC=E4=BA=8C=E6=9C=9F=EF=BC=89?= =?UTF-8?q?(0830=E6=B5=8B=E8=AF=952)=20https://git.ghzs.com/pm/halo-app-is?= =?UTF-8?q?sues/-/issues/1325?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qa/answer/detail/SimpleAnswerDetailActivity.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/SimpleAnswerDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/SimpleAnswerDetailActivity.kt index 26ba780c05..5c06d50528 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/SimpleAnswerDetailActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/SimpleAnswerDetailActivity.kt @@ -9,6 +9,14 @@ import com.gh.gamecenter.NormalActivity class SimpleAnswerDetailActivity : NormalActivity() { + override fun provideNormalIntent(): Intent? { + return getTargetIntent( + this, + SimpleAnswerDetailActivity::class.java, + SimpleAnswerDetailFragment::class.java + ) + } + companion object { @JvmStatic fun getIntent(context: Context, answerId: String, entrance: String, path: String): Intent { From c77f0cf8178db2495e11b6016144cf5ec728a336 Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 30 Aug 2021 11:44:42 +0800 Subject: [PATCH 134/151] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=9B=B8=E5=85=B3=E4=BC=98=E5=8C=96=EF=BC=88?= =?UTF-8?q?20210827UI=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98=20&=200827?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=EF=BC=89=20https://git.ghzs.com/pm/halo-app-?= =?UTF-8?q?issues/-/issues/1244?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/gamecenter/download/GameDownloadFragment.java | 12 ++++-------- .../gh/gamecenter/download/UpdatableGameAdapter.kt | 2 ++ .../gh/gamecenter/download/UpdatableGameViewModel.kt | 4 +++- .../gh/gamecenter/packagehelper/PackageRepository.kt | 3 ++- app/src/main/res/layout/item_updatable_game.xml | 3 +-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java index 8b72fc1079..f0817d295a 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java @@ -239,11 +239,7 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi mNoDataSkipBtn.setText("去首页看看"); mNoDataSkipBtn.setOnClickListener(v -> MainActivity.skipToMainActivity(getActivity(), MainWrapperFragment.INDEX_HOME)); mDownloadingHintContainer.setOnClickListener(v -> { - int downloadingPosition = adapter.getDoneList().size() + 2; - - if (adapter.getItemCount() > downloadingPosition) { - mDownloadmanagerRv.scrollToPosition(downloadingPosition); - } + mDownloadmanagerRv.scrollToPosition(adapter.getItemCount() - 1); }); mDownloadmanagerRv.setHasFixedSize(true); @@ -280,9 +276,9 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi if (adapter.getDoneList().size() != 0 && position == adapter.getDoneList().size()) { - int buttom = layoutManager.findViewByPosition(position).getBottom(); - if (buttom <= mDownloadmanagerHeadRl.getHeight()) { - rparams.topMargin = buttom - mDownloadmanagerHeadRl.getHeight(); + int bottom = layoutManager.findViewByPosition(position).getBottom(); + if (bottom <= mDownloadmanagerHeadRl.getHeight()) { + rparams.topMargin = bottom - mDownloadmanagerHeadRl.getHeight(); mDownloadmanagerHeadRl.setLayoutParams(rparams); } else { rparams.topMargin = 0; diff --git a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt index ac8e8c8e14..ad953d615c 100644 --- a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt @@ -121,6 +121,8 @@ class UpdatableGameAdapter(private var mViewModel: UpdatableGameViewModel) : is BlankDividerViewHolder -> { if (itemData.divider == UpdatableGameViewModel.GREY) { holder.binding.container.setBackgroundColor(R.color.text_F5F5F5.toColor()) + } else if (itemData.divider == UpdatableGameViewModel.BLUE) { + holder.binding.container.setBackgroundColor(R.color.bg_F2F7FC.toColor()) } else { holder.binding.container.setBackgroundColor(Color.WHITE) } diff --git a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt index c9fcabf2b1..87cefb70ed 100644 --- a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt @@ -297,6 +297,7 @@ class UpdatableGameViewModel( for (update in packageUpdate.mismatchedVersionUpdateList) { updatableDataItemList.add(UpdatableDataItem(otherVersionUpdate = update)) } + updatableDataItemList.add(UpdatableDataItem(divider = BLUE)) } } else { updatableDataItemList.add(UpdatableDataItem(normalUpdate = packageUpdate.matchedVersionUpdate)) @@ -329,8 +330,8 @@ class UpdatableGameViewModel( if (invalidPackageUpdateList.isNotEmpty()) { if (updatableDataItemList.size != 0) { updatableDataItemList.add(UpdatableDataItem(divider = WHITE)) - updatableDataItemList.add(UpdatableDataItem(divider = GREY)) } + updatableDataItemList.add(UpdatableDataItem(divider = GREY)) updatableDataItemList.add(UpdatableDataItem(header = "以下游戏有其他版本可以更新")) for (packageUpdate in invalidPackageUpdateList) { if (packageUpdate.mismatchedVersionUpdateList.isNotEmpty()) { @@ -345,6 +346,7 @@ class UpdatableGameViewModel( for (update in packageUpdate.mismatchedVersionUpdateList) { updatableDataItemList.add(UpdatableDataItem(otherVersionUpdate = update)) } + updatableDataItemList.add(UpdatableDataItem(divider = BLUE)) } } else { updatableDataItemList.add(UpdatableDataItem(normalUpdate = packageUpdate.matchedVersionUpdate)) diff --git a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt index 64709e8cfc..1a3e64e588 100644 --- a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt +++ b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt @@ -245,7 +245,8 @@ object PackageRepository { private fun addCurrentlyInstalledVersionIfValid(game: GameEntity) { for (apk in game.getApk()) { if (apk.version == PackageUtils.getVersionNameByPackageName(apk.packageName) - && apk.signature == PackageUtils.getApkSignatureByPackageName(mApplication, apk.packageName)) { + && (TextUtils.isEmpty(apk.signature) + || apk.signature == PackageUtils.getApkSignatureByPackageName(mApplication, apk.packageName))) { currentVersionList.add(GameUpdateEntity().apply { id = game.id name = game.name diff --git a/app/src/main/res/layout/item_updatable_game.xml b/app/src/main/res/layout/item_updatable_game.xml index ff27ce1813..ea7a8c2434 100644 --- a/app/src/main/res/layout/item_updatable_game.xml +++ b/app/src/main/res/layout/item_updatable_game.xml @@ -86,14 +86,13 @@ From b08aa46992f6ce1d77ffad154ec0ec315fbe614b Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 30 Aug 2021 14:20:25 +0800 Subject: [PATCH 135/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E4=B8=8B=E8=BD=BD=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E4=BC=98=E5=8C=96=20(0830=E6=B5=8B=E8=AF=95)?= =?UTF-8?q?=20https://git.ghzs.com/pm/halo-app-issues/-/issues/1244?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/gamecenter/download/UpdatableGameViewModel.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt index 87cefb70ed..61caac6850 100644 --- a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt @@ -196,9 +196,10 @@ class UpdatableGameViewModel( } // 不存在匹配版本 - // 或者匹配版本与已安装版本相同,但没有其它可更新版本的不需要添加进列表中 + // 或者匹配版本与已安装版本相同,但不是插件化没有其它可更新版本的不需要添加进列表中 if (matchedVersionUpdate == null || (matchedVersionUpdate.version == installedVersionName + && !matchedVersionUpdate.isPluggable && mismatchedVersionUpdateList.isEmpty()) ) { continue @@ -262,7 +263,8 @@ class UpdatableGameViewModel( ignoredUpdateList?.contains(matchedPackageName + matchedVersionName) == true -> { ignoredPackageUpdateList.add(packageUpdate) } - packageUpdate.matchedVersionUpdate.version == currentlyUpdatableVersion -> { + packageUpdate.matchedVersionUpdate.version == currentlyUpdatableVersion + && !packageUpdate.matchedVersionUpdate.isPluggable -> { invalidPackageUpdateList.add(packageUpdate) } else -> { From 58c576b950ea4f23afb14af8977ec3ad21997c5d Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Mon, 30 Aug 2021 14:25:53 +0800 Subject: [PATCH 136/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E5=BC=80=E6=9C=8D=E8=A1=A8=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BC=98=E5=8C=96=EF=BC=880827=E6=B5=8B=E8=AF=95=202?= =?UTF-8?q?=EF=BC=89https://git.ghzs.com/pm/halo-app-issues/-/issues/1220#?= =?UTF-8?q?note=5F115509?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gh/common/util/TimeUtils.kt | 12 ----- .../servers/GameServersContentFragment.kt | 48 ++----------------- .../servers/GameServersContentViewModel.kt | 33 ++----------- 3 files changed, 8 insertions(+), 85 deletions(-) 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 b257128781..ae99de688f 100644 --- a/app/src/main/java/com/gh/common/util/TimeUtils.kt +++ b/app/src/main/java/com/gh/common/util/TimeUtils.kt @@ -174,18 +174,6 @@ object TimeUtils { return calendar.timeInMillis } - @JvmStatic - fun getTimeOfDayOffsetAndHour(dayOffset: Int, hour: Int): Long { - val calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT+8")) - calendar.timeInMillis = getJavaTimestamp(System.currentTimeMillis()) - calendar.set(Calendar.DAY_OF_YEAR, calendar[Calendar.DAY_OF_YEAR] + dayOffset) - calendar.set(Calendar.HOUR_OF_DAY, hour) - 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) { diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt index 14b3998b92..fffdb8b763 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt @@ -279,51 +279,9 @@ class GameServersContentFragment : BaseFragment() { mViewModel?.run { this.day = day this.hour = hour - if (day != null && hour != null && tags == this.tags) { - val time = when (day) { - "today" -> TimeUtils.getTimeOfDayOffsetAndHour(0, hour.toInt()) - "tomorrow" -> TimeUtils.getTimeOfDayOffsetAndHour(1, hour.toInt()) - else -> TimeUtils.getTimeOfDayOffsetAndHour(2, 0) - } - val isExist = isExistTime(time) - val proximateTime = mViewModel?.getProximateTime(time) - if (proximateTime != null) { - val position = mViewModel?.getPositionByTime(proximateTime) ?: 0 - mLayoutManager?.scrollToPositionWithOffset(position + 1, 0) - mBinding?.run { - recyclerView.post { - if (mLayoutManager?.findLastVisibleItemPosition() == mAdapter!!.itemCount - 1 - && !mAdapter!!.isNextOver() - && !mAdapter!!.isNextLoading()) { - mViewModel?.run { - loadData(action = "up") - } - } else if (!isExist) { - kaifuTimeContainer.kaifuItemTime.visibility = View.GONE - val canScrollVertically = recyclerView.canScrollVertically(-1) - noMatchView.translationY = 0F - noMatchView.visibility = View.VISIBLE - recyclerView.translationY = if (canScrollVertically) 40F.dip2px().toFloat() else -(8F.dip2px().toFloat()) - postDelayedRunnable({ - tryCatchInRelease { - noMatchView.animate().translationY(-(40F.dip2px().toFloat())).setDuration(200).start() - recyclerView.animate().translationY(recyclerView.translationY - 40F.dip2px().toFloat()).setDuration(200) - .withEndAction { - kaifuTimeContainer.kaifuItemTime.visibility = View.VISIBLE - }.start() - } - }, 2000) - } - } - } - } else { - this.tags = tags - onRefreshPage() - } - } else { - this.tags = tags - onRefreshPage() - } +// this.type = type + this.tags = tags + onRefreshPage() } } diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt index 782ec66a73..a996940a49 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt @@ -33,8 +33,6 @@ class GameServersContentViewModel(application: Application) var prevId: String? = null var nextId: String? = null var isInit = true - var mKaiFuTimeList = arrayListOf() - private var mTimePositionMap = hashMapOf() init { loadData() @@ -330,36 +328,15 @@ class GameServersContentViewModel(application: Application) } private fun recordIndex(list: ArrayList) { - mKaiFuTimeList.clear() - mTimePositionMap.clear() var index = 0 - list.forEachIndexed { i, entity -> - if (entity.kaifuTimeHint != null) { - mKaiFuTimeList.add(entity.kaifuTimeHint!!) - mTimePositionMap[entity.kaifuTimeHint!!] = i - } - entity.sequence = index++ - if (entity.serverRemaining != null) { - for (remainingGame in entity.serverRemaining!!) { + list.forEach { + if (it.kaifuTimeHint != null) return@forEach + it.sequence = index++ + if (it.serverRemaining != null) { + for (remainingGame in it.serverRemaining!!) { remainingGame.sequence = index++ } } } } - - fun isExistTime(time: Long): Boolean { - return mKaiFuTimeList.contains(time / 1000) - } - - fun getProximateTime(time: Long): Long? { - if (mKaiFuTimeList.isEmpty()) return null - if (time >= TimeUtils.getJavaTimestamp(mKaiFuTimeList.first()) && time <= TimeUtils.getJavaTimestamp(mKaiFuTimeList.last())) { - return mKaiFuTimeList.firstOrNull { TimeUtils.getJavaTimestamp(it) >= time } - } - return null - } - - fun getPositionByTime(time: Long): Int? { - return mTimePositionMap[time] - } } \ No newline at end of file From 125c78fccd66babfa3d448c265fcadba1393fdce Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 30 Aug 2021 15:44:14 +0800 Subject: [PATCH 137/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E5=85=89=E7=8E=AF=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=B1=87=E6=80=BB=E7=AC=AC=E5=9B=9B=E5=91=A8?= =?UTF-8?q?=20(0827=E6=B5=8B=E8=AF=95)=20https://git.ghzs.com/pm/halo-app-?= =?UTF-8?q?issues/-/issues/1454?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/filter/RegionSettingHelper.kt | 4 +--- app/src/main/java/com/halo/assistant/HaloApp.java | 3 +++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/gh/common/filter/RegionSettingHelper.kt b/app/src/main/java/com/gh/common/filter/RegionSettingHelper.kt index 726c7945e3..3e85b88ace 100644 --- a/app/src/main/java/com/gh/common/filter/RegionSettingHelper.kt +++ b/app/src/main/java/com/gh/common/filter/RegionSettingHelper.kt @@ -11,7 +11,6 @@ import com.gh.gamecenter.entity.GameEntity import com.gh.gamecenter.retrofit.BiResponse import com.gh.gamecenter.retrofit.RetrofitManager import com.halo.assistant.HaloApp -import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.functions.Function import io.reactivex.schedulers.Schedulers @@ -62,13 +61,12 @@ object RegionSettingHelper { @SuppressLint("CheckResult") @JvmStatic fun getRegionSetting() { - debounceActionWithInterval(R.string.app_name, 3000) { + debounceActionWithInterval(R.string.app_name, 5000) { // 使用默认的 Schdulers.io() 可能会触发 OOM RetrofitManager.getInstance(HaloApp.getInstance().application) .sensitiveApi .getRegionSetting(HaloApp.getInstance().channel) .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : BiResponse() { override fun onSuccess(data: RegionSetting) { updateSettingsInMemory(data) diff --git a/app/src/main/java/com/halo/assistant/HaloApp.java b/app/src/main/java/com/halo/assistant/HaloApp.java index 147b15fb01..466267a384 100644 --- a/app/src/main/java/com/halo/assistant/HaloApp.java +++ b/app/src/main/java/com/halo/assistant/HaloApp.java @@ -20,6 +20,7 @@ import com.gh.common.FixedRateJobHelper; import com.gh.common.constant.Config; import com.gh.common.constant.Constants; import com.gh.common.exposure.ExposureManager; +import com.gh.common.filter.RegionSettingHelper; import com.gh.common.loghub.LoghubUtils; import com.gh.common.tracker.Tracker; import com.gh.common.util.DataUtils; @@ -215,6 +216,8 @@ public class HaloApp extends MultiDexApplication { DataUtils.getGid(); FixedRateJobHelper.begin(); + + RegionSettingHelper.getRegionSetting(); PackageRepository.initData(); From 65becdac8542b69ec1b9d36e2ab0f101115271ad Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 30 Aug 2021 15:49:42 +0800 Subject: [PATCH 138/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E4=B8=8B=E8=BD=BD=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E4=BC=98=E5=8C=96=20(0830UI=E6=B5=8B?= =?UTF-8?q?=E8=AF=95)=20https://git.ghzs.com/pm/halo-app-issues/-/issues/1?= =?UTF-8?q?244?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/gamecenter/download/UpdatableGameViewModel.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt index 61caac6850..245cfbe3ac 100644 --- a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt @@ -354,6 +354,7 @@ class UpdatableGameViewModel( updatableDataItemList.add(UpdatableDataItem(normalUpdate = packageUpdate.matchedVersionUpdate)) } } + updatableDataItemList.add(UpdatableDataItem(divider = WHITE)) } if (ignoredPackageUpdateList.isNotEmpty()) { From 49500768db39a2b0a3d040392d61331e7dee755f Mon Sep 17 00:00:00 2001 From: leafwai Date: Mon, 30 Aug 2021 16:28:17 +0800 Subject: [PATCH 139/151] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=AD=A3=E5=BC=8F?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E5=BE=AE=E5=8D=9A=E5=88=86=E4=BA=AB=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E4=B8=8D=E6=98=BE=E7=A4=BA=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/proguard-rules.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/proguard-rules.txt b/app/proguard-rules.txt index 02a39fdf44..5dbda15ef8 100644 --- a/app/proguard-rules.txt +++ b/app/proguard-rules.txt @@ -51,7 +51,7 @@ } ### weiboSdk --keep class com.sina.weibo.sdk.* { *; } +-keep class com.sina.weibo.sdk.** { *; } -dontwarn android.webkit.WebView -dontwarn android.webkit.WebViewClient From 989c3706dd7af47ce60e91b0c51d98f1295997d2 Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 30 Aug 2021 17:09:17 +0800 Subject: [PATCH 140/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E4=B8=93=E9=A2=98=E6=8E=A8=E8=8D=90?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96=20(20210?= =?UTF-8?q?826=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98=203)=20https://git.ghzs?= =?UTF-8?q?.com/pm/halo-app-issues/-/issues/1390?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/util/DownloadItemUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java index b83dfb8087..e34029d0ba 100644 --- a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java +++ b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java @@ -402,7 +402,7 @@ public class DownloadItemUtils { holder.gameDes.setVisibility(View.GONE); holder.recommendTv.setText(recommendStyle.getText()); - if ("none".equals(recommendStyle.getType())) { + if (TextUtils.isEmpty(recommendStyle.getIcon())) { holder.recommendIv.setVisibility(View.GONE); } else { holder.recommendIv.setVisibility(View.VISIBLE); From 11b414fd29674e3284e9a84150a221fbc2f31719 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Mon, 30 Aug 2021 17:35:50 +0800 Subject: [PATCH 141/151] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A6=96=E9=A1=B5ind?= =?UTF-8?q?icator=E4=B8=8D=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/view/TabIndicatorView.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/gh/common/view/TabIndicatorView.java b/app/src/main/java/com/gh/common/view/TabIndicatorView.java index 60345ad447..363705ab6e 100644 --- a/app/src/main/java/com/gh/common/view/TabIndicatorView.java +++ b/app/src/main/java/com/gh/common/view/TabIndicatorView.java @@ -112,10 +112,10 @@ public class TabIndicatorView extends View implements ViewPager.OnPageChangeList this.mIndicatorSpace = DisplayUtils.dip2px(getContext(), space); } - private int getIndicatorSpace() { + private int getIndicatorSpace(int position) { if (mIndicatorSpace != 0) return mIndicatorSpace; if (mIndicatorWidth != 0) { - View tag = getTabViewByPosition(0); + View tag = getTabViewByPosition(position); if (tag != null) return (tag.getWidth() - mIndicatorWidth) / 2; } return 0; @@ -174,15 +174,15 @@ public class TabIndicatorView extends View implements ViewPager.OnPageChangeList right += (int) (nextTabView.getRight() * positionOffset + tabView.getRight() * (1.f - positionOffset)); } - left += getIndicatorSpace(); - right -= getIndicatorSpace(); + left += getIndicatorSpace(position); + right -= getIndicatorSpace(position); top = tabView.getTop() + getPaddingTop(); bottom = tabView.getBottom() - getPaddingBottom(); range.set(left, top, right, bottom); } else { - left = tabView.getLeft() + getIndicatorSpace(); - right = tabView.getRight() - getIndicatorSpace(); + left = tabView.getLeft() + getIndicatorSpace(position); + right = tabView.getRight() - getIndicatorSpace(position); top = tabView.getTop() + getPaddingTop(); bottom = tabView.getBottom() - getPaddingBottom(); range.set(left, top, right, bottom); From 758c331af559ab1a5a00913c1e24b8c07e8bda45 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Mon, 30 Aug 2021 19:12:49 +0800 Subject: [PATCH 142/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA3=E6=9C=9F-?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E5=B1=95=E7=A4=BA-=E7=A4=BE=E5=8C=BA?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E9=A1=B5(20200830UI=E6=B5=8B=E8=AF=95)=20htt?= =?UTF-8?q?ps://git.ghzs.com/pm/halo-app-issues/-/issues/1405?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/fragment_search_default.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/layout/fragment_search_default.xml b/app/src/main/res/layout/fragment_search_default.xml index 3e240eda72..1f73e69e92 100644 --- a/app/src/main/res/layout/fragment_search_default.xml +++ b/app/src/main/res/layout/fragment_search_default.xml @@ -119,7 +119,8 @@ android:textSize="14sp" android:textStyle="bold" app:layout_constraintLeft_toLeftOf="parent" - app:layout_constraintTop_toBottomOf="@id/hot_tag_flex_container" /> + app:layout_constraintTop_toBottomOf="@id/hot_tag_flex_container" + app:lazyPaddingTop="@{!isExistHistory && !isExistHotTag ? 16 : 32}" /> Date: Mon, 30 Aug 2021 21:28:49 +0800 Subject: [PATCH 143/151] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=B8=B8=E6=88=8F?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E5=BC=95=E5=AF=BC=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/constant/Config.java | 2 +- .../java/com/gh/gamecenter/retrofit/service/ApiService.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/gh/common/constant/Config.java b/app/src/main/java/com/gh/common/constant/Config.java index f86960d656..80323f7fb8 100644 --- a/app/src/main/java/com/gh/common/constant/Config.java +++ b/app/src/main/java/com/gh/common/constant/Config.java @@ -334,7 +334,7 @@ public class Config { }); RetrofitManager.getInstance(HaloApp.getInstance().getApplication()) - .getApi().getGameGuidePopup(Build.MANUFACTURER, Build.VERSION.RELEASE, Build.MODEL, channel, Constants.API_VERSION) + .getApi().getGameGuidePopup(Build.MANUFACTURER, Build.VERSION.RELEASE, Build.MODEL, channel, BuildConfig.VERSION_NAME) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new BiResponse() { 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 80aa3ed59b..c9f7977534 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 @@ -3275,7 +3275,7 @@ public interface ApiService { /** * 获取引导浮窗 */ - @GET("api_go/games_guide_popup") + @GET("api_go/games/guide_popup") Single getGameGuidePopup( @Query("manufacture") String manufacture, @Query("android_version") String systemVersion, From 8a5f11e6bdbddb9f4bc7d6e3bb61025919a61327 Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 30 Aug 2021 21:31:43 +0800 Subject: [PATCH 144/151] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E6=97=A7=E6=B8=B8=E6=88=8F=E6=9B=B4=E6=96=B0=20tab?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gh/gamecenter/download/DownloadFragment.kt | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt b/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt index 13288f7ee1..441bbd238a 100644 --- a/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt @@ -50,14 +50,12 @@ class DownloadFragment : BaseFragment_TabLayout() { override fun initFragmentList(fragments: MutableList) { fragments.add(GameDownloadFragment()) fragments.add(UpdatableGameFragment()) - fragments.add(GameUpdateFragment()) fragments.add(InstalledGameFragment()) } override fun initTabTitleList(tabTitleList: MutableList) { tabTitleList.add(getString(R.string.download_game)) tabTitleList.add(getString(R.string.download_tab_update)) - tabTitleList.add(getString(R.string.download_tab_update)) tabTitleList.add(getString(R.string.download_tab_installed)) } From 0640aee554ba15d85b97bf750ff10a2d6c3a3989 Mon Sep 17 00:00:00 2001 From: leafwai Date: Mon, 30 Aug 2021 21:36:43 +0800 Subject: [PATCH 145/151] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=B8=B8=E6=88=8F?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E5=BC=95=E5=AF=BC=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/gamecenter/gamedetail/GameDetailFragment.kt | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index 7cca15513f..de3f098b5d 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -1476,15 +1476,7 @@ class GameDetailFragment : NormalFragment() { mInstallContainer.visibility = View.VISIBLE NewLogUtils.logGuidePopShow(gameGuidePopupEntity.id) mInstallContainer.setDebouncedClickListener { - requireContext().startActivity( - WebActivity.getIntent( - requireContext(), - gameGuidePopupEntity.jump.link, - gameGuidePopupEntity.jump.title, - false, - 1 - ) - ) + DirectUtils.directToLinkPage(requireContext(), gameGuidePopupEntity.jump, mEntrance, "游戏详情") NewLogUtils.logGuidePopLinkClick( gameGuidePopupEntity.id, gameGuidePopupEntity.jump.type, From c196d5cdf504e60e00dbccf1d02d65089285c46f Mon Sep 17 00:00:00 2001 From: leafwai Date: Tue, 31 Aug 2021 14:23:37 +0800 Subject: [PATCH 146/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E5=B0=8F=E7=B1=B3=E7=AD=89=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E7=AC=AC=E4=B8=89=E6=96=B9=E5=AE=89=E8=A3=85=E5=BC=95?= =?UTF-8?q?=E5=AF=BC=E5=8A=9F=E8=83=BD-=E5=AE=A2=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=EF=BC=88=E6=B5=8B=E8=AF=951=E3=80=812=E3=80=814=EF=BC=8C?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=9F=8B=E7=82=B90830=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=EF=BC=89https://git.ghzs.com/pm/halo-app-issues/-/issues/1410?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/constant/Config.java | 2 +- .../com/gh/common/constant/Constants.java | 2 - .../gamedetail/GameDetailFragment.kt | 54 ++++++++++++------- .../main/res/layout/detail_download_item.xml | 2 +- 4 files changed, 36 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/gh/common/constant/Config.java b/app/src/main/java/com/gh/common/constant/Config.java index 80323f7fb8..88ef4887c6 100644 --- a/app/src/main/java/com/gh/common/constant/Config.java +++ b/app/src/main/java/com/gh/common/constant/Config.java @@ -230,7 +230,7 @@ public class Config { } @Nullable - public static GameGuidePopupEntity getGameGuidePopupEntityEntity() { + public static GameGuidePopupEntity getGameGuidePopupEntity() { if (mGameGuidePopupEntity == null) { try { String json = SPUtils.getString(Constants.SP_GAME_DETAIL_INSTALL_GUIDE_CONTENT); 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 37581a95e7..3405395391 100644 --- a/app/src/main/java/com/gh/common/constant/Constants.java +++ b/app/src/main/java/com/gh/common/constant/Constants.java @@ -6,8 +6,6 @@ import com.halo.assistant.HaloApp; public class Constants { - public static final String API_VERSION = "v5d2d0"; - public static final int SEND_NEWS_FEEDBACK = 0x126; public static final int SEND_COMMENT_FEEDBACK = 0x127; diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index de3f098b5d..f232e6948b 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -268,6 +268,12 @@ class GameDetailFragment : NormalFragment() { private val dataWatcher = object : DataWatcher() { override fun onDataChanged(downloadEntity: DownloadEntity) { + if (downloadEntity.status == DownloadStatus.add || downloadEntity.status == DownloadStatus.done || downloadEntity.status == DownloadStatus.downloading || downloadEntity.status == DownloadStatus.pause || downloadEntity.status == DownloadStatus.redirected) { + showInstallHint() + } + if (downloadEntity.status == DownloadStatus.cancel) { + hideInstallHint() + } if (mGameEntity != null && mGameEntity!!.getApk().size == 1) { val url = mGameEntity!!.getApk()[0].url if (downloadEntity.url == url) { @@ -303,7 +309,6 @@ class GameDetailFragment : NormalFragment() { ) } } else if (downloadEntity.status == DownloadStatus.done) { - showInstallHint() if (downloadEntity.gameId == mViewModel.game?.id) { hideRecommendView() } @@ -321,8 +326,6 @@ class GameDetailFragment : NormalFragment() { downloadEntity.name ) } - } else if (downloadEntity.status == DownloadStatus.downloading) { - showInstallHint() } } } @@ -551,18 +554,7 @@ class GameDetailFragment : NormalFragment() { if (gameResource.status == Status.SUCCESS) { mViewModel.logHistory(gameResource.data!!) mGameEntity = gameResource.data - val isInstalled = PackageUtils.isInstalledFromAllPackage( - requireContext(), - mGameEntity?.simulator?.apk?.packageName - ) - val status = GameUtils.getDownloadBtnText( - requireContext(), - mGameEntity, - PluginLocation.only_game - ) - if (status == getString(R.string.install) && !isInstalled) { - showInstallHint() - } + controlInstallHint() // 添加启动弹窗的相关信息 if (mEntrance.contains(EntranceUtils.ENTRANCE_WELCOME) && mEntrance.countOccurrences("+") <= 1 @@ -1314,10 +1306,15 @@ class GameDetailFragment : NormalFragment() { if (isShowReserveBtn()) { showReserveBtn(true) val isFirstIn = SPUtils.getBoolean(Constants.SP_GAME_DETAIL_RESERVE_GUIDE, true) + val gameGuidePopupEntity = Config.getGameGuidePopupEntity() if (isFirstIn && mGameEntity?.downloadOffStatus == null) { showReserveGuide(true) SPUtils.setBoolean(Constants.SP_GAME_DETAIL_RESERVE_GUIDE, false) } + if (gameGuidePopupEntity != null) { + showReserveGuide(false) + SPUtils.setBoolean(Constants.SP_GAME_DETAIL_RESERVE_GUIDE, false) + } } else { showReserveBtn(false) } @@ -1467,11 +1464,23 @@ class GameDetailFragment : NormalFragment() { } } + private fun controlInstallHint() { + val status = GameUtils.getDownloadBtnText( + requireContext(), + mGameEntity, + PluginLocation.only_game + ) + if (status == getString(R.string.downloading) || status == getString(R.string.install) || status == getString(R.string.unzipping)) { + showInstallHint() + } + if (status == getString(R.string.download) || status == getString(R.string.expand) || status == getString(R.string.launch) || status == getString(R.string.open)){ + hideInstallHint() + } + } + private fun showInstallHint() { - val gameGuidePopupEntity = Config.getGameGuidePopupEntityEntity() + val gameGuidePopupEntity = Config.getGameGuidePopupEntity() if (SPUtils.getBoolean(Constants.SP_GAME_DETAIL_INSTALL_GUIDE, true) && gameGuidePopupEntity != null) { - showReserveGuide(false) - SPUtils.setBoolean(Constants.SP_GAME_DETAIL_RESERVE_GUIDE, false) mInstallHintTv.text = gameGuidePopupEntity.content mInstallContainer.visibility = View.VISIBLE NewLogUtils.logGuidePopShow(gameGuidePopupEntity.id) @@ -1480,17 +1489,21 @@ class GameDetailFragment : NormalFragment() { NewLogUtils.logGuidePopLinkClick( gameGuidePopupEntity.id, gameGuidePopupEntity.jump.type, - gameGuidePopupEntity.jump.title + gameGuidePopupEntity.jump.linkText ) } mInstallCloseIv.setDebouncedClickListener { - mInstallContainer.visibility = View.GONE + hideInstallHint() SPUtils.setBoolean(Constants.SP_GAME_DETAIL_INSTALL_GUIDE, false) NewLogUtils.logGuidePopClose(gameGuidePopupEntity.id) } } } + private fun hideInstallHint() { + mInstallContainer.visibility = View.GONE + } + private fun initRecommendUI() { val recommendPopupList = mViewModel.recommendPopupLiveData.value mRecommendPopupEntity = @@ -1615,6 +1628,7 @@ class GameDetailFragment : NormalFragment() { } if (mGameEntity != null && (mGameEntity!!.getApk().size == 1 || mGameEntity!!.isReservable)) { DetailDownloadUtils.detailInitDownload(detailViewHolder, true) + controlInstallHint() } showBrowserInstallHintIfNeeded() diff --git a/app/src/main/res/layout/detail_download_item.xml b/app/src/main/res/layout/detail_download_item.xml index a143a5f716..4084fb4aa0 100644 --- a/app/src/main/res/layout/detail_download_item.xml +++ b/app/src/main/res/layout/detail_download_item.xml @@ -80,7 +80,7 @@ android:layout_width="match_parent" android:layout_height="40dp" android:background="@drawable/bg_install_hint" - android:visibility="gone" + android:visibility="visible" tools:visibility="gone"> Date: Tue, 31 Aug 2021 17:11:13 +0800 Subject: [PATCH 147/151] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=AE=89=E8=A3=85?= =?UTF-8?q?=E5=BC=95=E5=AF=BC=E6=98=BE=E7=A4=BA=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/GameUtils.java | 15 +++++++++++++++ .../gamedetail/GameDetailFragment.kt | 19 ++++++++++++------- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/GameUtils.java b/app/src/main/java/com/gh/common/util/GameUtils.java index 76f251db73..5d9b9940bf 100644 --- a/app/src/main/java/com/gh/common/util/GameUtils.java +++ b/app/src/main/java/com/gh/common/util/GameUtils.java @@ -19,6 +19,7 @@ import com.gh.gamecenter.entity.SettingsEntity; import com.gh.gamecenter.manager.PackagesManager; import com.lightgame.download.DownloadEntity; import com.lightgame.download.DownloadStatus; +import com.lightgame.utils.Utils; import java.util.ArrayList; import java.util.List; @@ -272,4 +273,18 @@ public class GameUtils { return null; } + public static boolean checkDownloadStatus(Context context, GameEntity gameEntity, DownloadStatus downloadStatus){ + DownloadEntity downloadEntity; + for (ApkEntity apkEntity : gameEntity.getApk()) { + // filter by packageName + downloadEntity = DownloadManager.getInstance(context).getDownloadEntityByUrl(apkEntity.getUrl()); + if (downloadEntity != null) { + if (downloadEntity.getStatus().equals(downloadStatus)){ + return true; + } + } + } + return false; + } + } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index f232e6948b..62a86af9e3 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -268,11 +268,13 @@ class GameDetailFragment : NormalFragment() { private val dataWatcher = object : DataWatcher() { override fun onDataChanged(downloadEntity: DownloadEntity) { - if (downloadEntity.status == DownloadStatus.add || downloadEntity.status == DownloadStatus.done || downloadEntity.status == DownloadStatus.downloading || downloadEntity.status == DownloadStatus.pause || downloadEntity.status == DownloadStatus.redirected) { - showInstallHint() - } - if (downloadEntity.status == DownloadStatus.cancel) { - hideInstallHint() + if (downloadEntity.gameId == mViewModel.gameId) { + if (downloadEntity.status == DownloadStatus.add || downloadEntity.status == DownloadStatus.done || downloadEntity.status == DownloadStatus.downloading || downloadEntity.status == DownloadStatus.pause || downloadEntity.status == DownloadStatus.redirected) { + showInstallHint() + } + if (downloadEntity.status == DownloadStatus.cancel) { + hideInstallHint() + } } if (mGameEntity != null && mGameEntity!!.getApk().size == 1) { val url = mGameEntity!!.getApk()[0].url @@ -1470,10 +1472,13 @@ class GameDetailFragment : NormalFragment() { mGameEntity, PluginLocation.only_game ) - if (status == getString(R.string.downloading) || status == getString(R.string.install) || status == getString(R.string.unzipping)) { + val isPause = GameUtils.checkDownloadStatus(requireContext(), mGameEntity, DownloadStatus.pause) + val isDownloading = GameUtils.checkDownloadStatus(requireContext(), mGameEntity, DownloadStatus.downloading) + val isDone = GameUtils.checkDownloadStatus(requireContext(), mGameEntity, DownloadStatus.done) + if (isDownloading || status == getString(R.string.install) || status == getString(R.string.unzipping) || isPause || isDone) { showInstallHint() } - if (status == getString(R.string.download) || status == getString(R.string.expand) || status == getString(R.string.launch) || status == getString(R.string.open)){ + if ((status == getString(R.string.download) && !isPause && !isDownloading) || (status == getString(R.string.expand) && !isPause && !isDownloading && !isDone) || status == getString(R.string.launch) || status == getString(R.string.open)){ hideInstallHint() } } From c3fb8b9c89f8575bfde166ece5462a27a7e010da Mon Sep 17 00:00:00 2001 From: juntao Date: Tue, 31 Aug 2021 18:08:09 +0800 Subject: [PATCH 148/151] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B8=96=E5=AD=90?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B5=E5=BA=95=E9=83=A8=E7=9A=84=E9=98=B4?= =?UTF-8?q?=E5=BD=B1=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/fragment_article_detail.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/fragment_article_detail.xml b/app/src/main/res/layout/fragment_article_detail.xml index f9cd36a780..1321ea403c 100644 --- a/app/src/main/res/layout/fragment_article_detail.xml +++ b/app/src/main/res/layout/fragment_article_detail.xml @@ -63,7 +63,7 @@ android:id="@+id/listContainer" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_above="@id/bottomShadowView" + android:layout_above="@id/input_container" android:layout_below="@id/toolbar" android:descendantFocusability="beforeDescendants" android:focusableInTouchMode="true"> From 20149b6041dc59b040f36e1b6231d5627da8ba77 Mon Sep 17 00:00:00 2001 From: leafwai Date: Tue, 31 Aug 2021 20:57:16 +0800 Subject: [PATCH 149/151] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E6=B8=B8=E6=88=8F?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E5=BC=95=E5=AF=BC=E6=98=BE=E7=A4=BA=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/constant/Config.java | 11 ------ .../com/gh/common/constant/Constants.java | 3 +- .../java/com/gh/common/util/GameUtils.java | 15 -------- .../gamedetail/GameDetailFragment.kt | 37 +++++-------------- .../main/res/layout/detail_download_item.xml | 2 +- 5 files changed, 12 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/com/gh/common/constant/Config.java b/app/src/main/java/com/gh/common/constant/Config.java index 88ef4887c6..8069568eb7 100644 --- a/app/src/main/java/com/gh/common/constant/Config.java +++ b/app/src/main/java/com/gh/common/constant/Config.java @@ -231,16 +231,6 @@ public class Config { @Nullable public static GameGuidePopupEntity getGameGuidePopupEntity() { - if (mGameGuidePopupEntity == null) { - try { - String json = SPUtils.getString(Constants.SP_GAME_DETAIL_INSTALL_GUIDE_CONTENT); - if (!TextUtils.isEmpty(json)) { - mGameGuidePopupEntity = GsonUtils.fromJson(json, GameGuidePopupEntity.class); - } - } catch (Exception e) { - e.printStackTrace(); - } - } return mGameGuidePopupEntity; } @@ -341,7 +331,6 @@ public class Config { @Override public void onSuccess(GameGuidePopupEntity data) { mGameGuidePopupEntity = data; - SPUtils.setString(Constants.SP_GAME_DETAIL_INSTALL_GUIDE_CONTENT, GsonUtils.toJson(data)); } }); } 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 3405395391..18ca0d4dae 100644 --- a/app/src/main/java/com/gh/common/constant/Constants.java +++ b/app/src/main/java/com/gh/common/constant/Constants.java @@ -221,8 +221,7 @@ public class Constants { public static final String SP_FORUM_DETAIL_MODERATOR_GUIDE = "forum_detail_moderator_guide"; // 游戏详情安装引导 public static final String SP_GAME_DETAIL_INSTALL_GUIDE = "game_detail_install_guide"; - // 游戏详情安装引导内容 - public static final String SP_GAME_DETAIL_INSTALL_GUIDE_CONTENT = "game_detail_install_guide_content"; + public static final String SP_SHOULD_SHOW_GAME_DETAIL_INSTALL_GUIDE = "should_show_game_detail_install_guide"; //手机号码匹配规则 public static final String REGEX_MOBILE = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$"; diff --git a/app/src/main/java/com/gh/common/util/GameUtils.java b/app/src/main/java/com/gh/common/util/GameUtils.java index 5d9b9940bf..dfeeade1e3 100644 --- a/app/src/main/java/com/gh/common/util/GameUtils.java +++ b/app/src/main/java/com/gh/common/util/GameUtils.java @@ -272,19 +272,4 @@ public class GameUtils { } return null; } - - public static boolean checkDownloadStatus(Context context, GameEntity gameEntity, DownloadStatus downloadStatus){ - DownloadEntity downloadEntity; - for (ApkEntity apkEntity : gameEntity.getApk()) { - // filter by packageName - downloadEntity = DownloadManager.getInstance(context).getDownloadEntityByUrl(apkEntity.getUrl()); - if (downloadEntity != null) { - if (downloadEntity.getStatus().equals(downloadStatus)){ - return true; - } - } - } - return false; - } - } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index 62a86af9e3..af01177cb8 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -271,9 +271,7 @@ class GameDetailFragment : NormalFragment() { if (downloadEntity.gameId == mViewModel.gameId) { if (downloadEntity.status == DownloadStatus.add || downloadEntity.status == DownloadStatus.done || downloadEntity.status == DownloadStatus.downloading || downloadEntity.status == DownloadStatus.pause || downloadEntity.status == DownloadStatus.redirected) { showInstallHint() - } - if (downloadEntity.status == DownloadStatus.cancel) { - hideInstallHint() + SPUtils.setBoolean(Constants.SP_SHOULD_SHOW_GAME_DETAIL_INSTALL_GUIDE, true) } } if (mGameEntity != null && mGameEntity!!.getApk().size == 1) { @@ -541,6 +539,14 @@ class GameDetailFragment : NormalFragment() { mToolbar.setNavigationOnClickListener { requireActivity().finish() } mConcernIv.visibility = View.VISIBLE mConcernTv.visibility = View.VISIBLE + + if (mViewModel.game != null) { + if (SPUtils.getBoolean(Constants.SP_SHOULD_SHOW_GAME_DETAIL_INSTALL_GUIDE, false) && !mViewModel.game!!.isReservable) { + if (mViewModel.game!!.downloadOffText?.isEmpty() == true){ + showInstallHint() + } + } + } } @Subscribe(threadMode = ThreadMode.MAIN) @@ -556,7 +562,6 @@ class GameDetailFragment : NormalFragment() { if (gameResource.status == Status.SUCCESS) { mViewModel.logHistory(gameResource.data!!) mGameEntity = gameResource.data - controlInstallHint() // 添加启动弹窗的相关信息 if (mEntrance.contains(EntranceUtils.ENTRANCE_WELCOME) && mEntrance.countOccurrences("+") <= 1 @@ -1466,23 +1471,6 @@ class GameDetailFragment : NormalFragment() { } } - private fun controlInstallHint() { - val status = GameUtils.getDownloadBtnText( - requireContext(), - mGameEntity, - PluginLocation.only_game - ) - val isPause = GameUtils.checkDownloadStatus(requireContext(), mGameEntity, DownloadStatus.pause) - val isDownloading = GameUtils.checkDownloadStatus(requireContext(), mGameEntity, DownloadStatus.downloading) - val isDone = GameUtils.checkDownloadStatus(requireContext(), mGameEntity, DownloadStatus.done) - if (isDownloading || status == getString(R.string.install) || status == getString(R.string.unzipping) || isPause || isDone) { - showInstallHint() - } - if ((status == getString(R.string.download) && !isPause && !isDownloading) || (status == getString(R.string.expand) && !isPause && !isDownloading && !isDone) || status == getString(R.string.launch) || status == getString(R.string.open)){ - hideInstallHint() - } - } - private fun showInstallHint() { val gameGuidePopupEntity = Config.getGameGuidePopupEntity() if (SPUtils.getBoolean(Constants.SP_GAME_DETAIL_INSTALL_GUIDE, true) && gameGuidePopupEntity != null) { @@ -1498,17 +1486,13 @@ class GameDetailFragment : NormalFragment() { ) } mInstallCloseIv.setDebouncedClickListener { - hideInstallHint() + mInstallContainer.visibility = View.GONE SPUtils.setBoolean(Constants.SP_GAME_DETAIL_INSTALL_GUIDE, false) NewLogUtils.logGuidePopClose(gameGuidePopupEntity.id) } } } - private fun hideInstallHint() { - mInstallContainer.visibility = View.GONE - } - private fun initRecommendUI() { val recommendPopupList = mViewModel.recommendPopupLiveData.value mRecommendPopupEntity = @@ -1633,7 +1617,6 @@ class GameDetailFragment : NormalFragment() { } if (mGameEntity != null && (mGameEntity!!.getApk().size == 1 || mGameEntity!!.isReservable)) { DetailDownloadUtils.detailInitDownload(detailViewHolder, true) - controlInstallHint() } showBrowserInstallHintIfNeeded() diff --git a/app/src/main/res/layout/detail_download_item.xml b/app/src/main/res/layout/detail_download_item.xml index 4084fb4aa0..a143a5f716 100644 --- a/app/src/main/res/layout/detail_download_item.xml +++ b/app/src/main/res/layout/detail_download_item.xml @@ -80,7 +80,7 @@ android:layout_width="match_parent" android:layout_height="40dp" android:background="@drawable/bg_install_hint" - android:visibility="visible" + android:visibility="gone" tools:visibility="gone"> Date: Wed, 1 Sep 2021 10:10:58 +0800 Subject: [PATCH 150/151] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E6=B8=B8=E6=88=8F?= =?UTF-8?q?=E5=AE=89=E8=A3=85=E5=BC=95=E5=AF=BC=E6=98=BE=E7=A4=BA=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gamedetail/GameDetailFragment.kt | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index af01177cb8..46c05296a1 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -77,6 +77,7 @@ import com.shuyu.gsyvideoplayer.utils.OrientationUtils import com.shuyu.gsyvideoplayer.video.base.GSYVideoView import io.reactivex.disposables.Disposable import kotlinx.android.synthetic.main.dialog_download.view.* +import kotlinx.android.synthetic.main.download_dialog_installed_item.* import kotlinx.android.synthetic.main.piece_game_detail_video.* import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe @@ -539,14 +540,6 @@ class GameDetailFragment : NormalFragment() { mToolbar.setNavigationOnClickListener { requireActivity().finish() } mConcernIv.visibility = View.VISIBLE mConcernTv.visibility = View.VISIBLE - - if (mViewModel.game != null) { - if (SPUtils.getBoolean(Constants.SP_SHOULD_SHOW_GAME_DETAIL_INSTALL_GUIDE, false) && !mViewModel.game!!.isReservable) { - if (mViewModel.game!!.downloadOffText?.isEmpty() == true){ - showInstallHint() - } - } - } } @Subscribe(threadMode = ThreadMode.MAIN) @@ -562,6 +555,7 @@ class GameDetailFragment : NormalFragment() { if (gameResource.status == Status.SUCCESS) { mViewModel.logHistory(gameResource.data!!) mGameEntity = gameResource.data + controlInstallHint() // 添加启动弹窗的相关信息 if (mEntrance.contains(EntranceUtils.ENTRANCE_WELCOME) && mEntrance.countOccurrences("+") <= 1 @@ -1471,6 +1465,24 @@ class GameDetailFragment : NormalFragment() { } } + private fun controlInstallHint() { + if (mGameEntity != null) { + val status = GameUtils.getDownloadBtnText( + requireContext(), + mGameEntity, + PluginLocation.only_game + ) + val isLaunch = (status == getString(R.string.launch) || status == getString(R.string.open)) + if (SPUtils.getBoolean(Constants.SP_SHOULD_SHOW_GAME_DETAIL_INSTALL_GUIDE, false) && !mGameEntity!!.isReservable) { + if (mGameEntity!!.downloadOffText?.isEmpty() == true && !isLaunch) { + showInstallHint() + } else { + hideInstallHint() + } + } + } + } + private fun showInstallHint() { val gameGuidePopupEntity = Config.getGameGuidePopupEntity() if (SPUtils.getBoolean(Constants.SP_GAME_DETAIL_INSTALL_GUIDE, true) && gameGuidePopupEntity != null) { @@ -1486,13 +1498,18 @@ class GameDetailFragment : NormalFragment() { ) } mInstallCloseIv.setDebouncedClickListener { - mInstallContainer.visibility = View.GONE + hideInstallHint() SPUtils.setBoolean(Constants.SP_GAME_DETAIL_INSTALL_GUIDE, false) NewLogUtils.logGuidePopClose(gameGuidePopupEntity.id) } } } + private fun hideInstallHint() { + mInstallContainer.visibility = View.GONE + } + + private fun initRecommendUI() { val recommendPopupList = mViewModel.recommendPopupLiveData.value mRecommendPopupEntity = @@ -1622,6 +1639,7 @@ class GameDetailFragment : NormalFragment() { showBrowserInstallHintIfNeeded() DownloadManager.getInstance(context).addObserver(dataWatcher) + controlInstallHint() } override fun onPause() { From 4a04f6bb0ff857b6b81977830e298715ae021f6d Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Wed, 1 Sep 2021 12:35:46 +0800 Subject: [PATCH 151/151] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BC=80=E6=9C=8D?= =?UTF-8?q?=E8=A1=A8=E6=B8=B8=E6=88=8F=E5=88=86=E7=B1=BB=E7=AD=9B=E9=80=89?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E4=B8=BA=E7=A9=BA=E8=80=8C=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E9=97=AA=E9=80=80=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../servers/GameServersContentFragment.kt | 44 +++++++++++-------- .../servers/GameServersContentViewModel.kt | 4 +- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt index fffdb8b763..5264ec8614 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt @@ -81,6 +81,8 @@ class GameServersContentFragment : BaseFragment() { mViewModel = viewModelProvider() // mViewModel?.type = arguments?.getString(EntranceUtils.KEY_TYPE, "开服") mViewModel?.listLiveData?.observe(this, androidx.lifecycle.Observer { + if (it.second.isEmpty()) return@Observer + if (it.first == "down") { mAdapter?.submitList(it.second, isShowPullDownTip = false, isDown = true, downSize = it.third) mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.VISIBLE @@ -145,8 +147,8 @@ class GameServersContentFragment : BaseFragment() { mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.VISIBLE } val position = mLayoutManager?.findFirstVisibleItemPosition() ?: 0 - if (RecyclerView.NO_POSITION == position || position < 1) return val dataList = mViewModel?.listLiveData?.value?.second + if (position == RecyclerView.NO_POSITION || position < 1 || dataList?.isEmpty() == true) return val gameEntity = dataList?.get(position - 1) val kaifuTimeHint = gameEntity?.kaifuTimeHint @@ -232,14 +234,10 @@ class GameServersContentFragment : BaseFragment() { } }, 2000) } else { - if (!canScrollVertically) { - recyclerView.translationY = -(48F.dip2px().toFloat()) - } + recyclerView.translationY = if (canScrollVertically) 0F else -(48F.dip2px().toFloat()) } } else { - if (!canScrollVertically) { - recyclerView.translationY = -(48F.dip2px().toFloat()) - } + recyclerView.translationY = if (canScrollVertically) 0F else -(48F.dip2px().toFloat()) } recyclerView.viewTreeObserver.removeOnGlobalLayoutListener(this) } @@ -334,11 +332,13 @@ class GameServersContentFragment : BaseFragment() { override fun loadDone() { super.loadDone() - mBinding?.recyclerView?.visibility = View.VISIBLE // mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.VISIBLE - mBinding?.noConnectionContainer?.reuseNoConnection?.visibility = View.GONE - mBinding?.reuseNoneData?.visibility = View.GONE - mBinding?.loadingContainer?.reuseLlLoading?.visibility = View.GONE + mBinding?.run { + recyclerView.visibility = View.VISIBLE + noConnectionContainer.reuseNoConnection.visibility = View.GONE + reuseNoneData.visibility = View.GONE + loadingContainer.reuseLlLoading.visibility = View.GONE + } // mBinding?.refreshLayout?.finishRefresh() } @@ -346,18 +346,24 @@ class GameServersContentFragment : BaseFragment() { if (!isAdded) return super.loadError() toast(R.string.loading_failed_hint) - mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.GONE - mBinding?.noConnectionContainer?.reuseNoConnection?.visibility = View.VISIBLE - mBinding?.reuseNoneData?.visibility = View.GONE - mBinding?.loadingContainer?.reuseLlLoading?.visibility = View.GONE + mBinding?.run { + kaifuTimeContainer.kaifuItemTime.visibility = View.GONE + noConnectionContainer.reuseNoConnection.visibility = View.VISIBLE + reuseNoneData.visibility = View.GONE + loadingContainer.reuseLlLoading.visibility = View.GONE + pullDownTip.visibility = View.GONE + } } override fun loadEmpty() { super.loadEmpty() - mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.GONE - mBinding?.noConnectionContainer?.reuseNoConnection?.visibility = View.GONE - mBinding?.reuseNoneData?.visibility = View.VISIBLE - mBinding?.loadingContainer?.reuseLlLoading?.visibility = View.GONE + mBinding?.run { + kaifuTimeContainer.kaifuItemTime.visibility = View.GONE + noConnectionContainer.reuseNoConnection.visibility = View.GONE + reuseNoneData.visibility = View.VISIBLE + loadingContainer.reuseLlLoading.visibility = View.GONE + pullDownTip.visibility = View.GONE + } } private fun scrollToTop() { diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt index a996940a49..ce8af17fcc 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt @@ -188,9 +188,9 @@ class GameServersContentViewModel(application: Application) isInit = false when { - data.size < 10 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_OVER)) list.size == 0 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_EMPTY)) - list.size > 0 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_LOADED)) + data.size < 10 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_OVER)) + else -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_LOADED)) } }

D&mB2Eq&#x?ISK4v*$dazxAtkdLCMkozniJD}!qn$r28nvOZUp> z%IBGQ9{Qt}$(mo44c&L2-;jTmA@5p& zM{H@>j)RoAH!$NVkX5egO*9t8jOc)DqsI+|bi6e&)Fk?1V7o%oJP*iF)wKU-%VnkU zY+gH{qyWxo3qCD9U_kbfAoC^@&u{)!c#pGsj3o>qXf{Q%fg3&+2p7$!T~{Yb{N2K% z{gIo-ju|vBO?-j42DJN=`p5>TrpFPBk?EvX$O;-*UjWAPHj$`_C_SoA@dWDYDh7AG zJgq^nHAzy*IJ5Lve54Y(n1weQDAiB+R}B@Q#cO5zAXeG5LwcwVe)iufpKFvi0fI@WP%}ih*-DJ$i0Aw1qE$ zv%o1#OmBXl zk^s&}PzD@^!Upsm+fR0R4vR`@OGbf9;_d<_i4#2kgn%j1Q2hV_JARYke*S6%i|!J1 zyc*wJID;N>V}Dwdvmo!+ z15)hwr|e(Kc@3|e7%O1vc4|XKEX1OrI8wC0utEdgEMY}X=idaC(NC9B{8@xs)7(pZ zWYlnyBnFaMkXiu4Uue0D9pc7=N+jcr!ZX|xa{}P~g?L2(@*WdCfCNiklDA4vb@lf= zo{`qo-J^uB)}fJt7}Jz9MMPg{MDasnoT760{e5R`NN?J_QRY z;tzY`B?j3Ju~{!&!X2t{J5&f6)T4XvzP80v=wujv&F{&0<5tezG^}*gM!!{zpSdK* zPCs2!AOA6*aD9x*U4hT`t_i@@R@W?z3fJjM+Oi0Phl=4m&->#G@kvE%;*YGosOSZ) zGHLwRbI-zE5PT}rHdHQ@jDfjB-{krMF(AHiAYFdFfM|$c4L9xsp;Vkr^O+MbQ*0-{ zEk0T^x#&D%`DU}OvPP!9uJ!zxZ1P`t%2u!Pzq@{=cArSC@cL}_fBBn8Lwm-hiT&*L z07?@;$nP>%jlGH>9KOB#gr7dAZn%OI3J*x3P60}Z@56%lYTXnuy}S>A)#k37I(-B9 zt8gJQ5+0Mi@gBj1|5>RkShP^RuKiq3C?ubkOsmd0_1T2Rv(=J2fb=Y*xA^<|dY{Pp z?xUFPZe1Ndy!bgnS2oR|?u@-*X9_ z@lN_ZKyeV5<6>W=a#I4V3v;5ppa_$lpeAC7Z zKytZ);}Sl~grZYl*$8T(g4p<6Et=0h+OING08dy&ZTl$V000rnIBp3!UP=G}00006 zes}PA5RvDIhAqi_aeVHhlL|&B1-8JDYS{+mVXF!G*HXtpD8B`?JaR7`&XVsIm`-sV z|D+ei3)seanNtxR7jbgpT~VCmI+{?QwtiVjxr4;kWDFR!?r7zu5ix2XT!pEr}ZD-{=b_zUa;NA5W@h&*lOLTOdB+%1hOIEZ3B^P`bF;~$2Cak zHVk*_wPd>12*GvUolv=j_vaKZdWFD{l;8;&#cmd@8m?wrTjc-xUM-GuABz(Fo$U!t zyZQrcy5PUgFHMKjd=HfGro)s*I{LgeP|irdo_BI7qrgFqI?vEZwjd(3_6iMA-g+?X zAUwF6X0dj}-%CMt0>qK$ItuVQ_V_CYn)Oo11lewJxjVDxn_X38c|0M{I?eU$7_R|- z3h}!$`XF4$xV7p;?W2ytE!I=X7yJo4n(N>v9=Vml0tKjnVr%g*(Gw23@;L&VHK#UCv(rU&N+YlC=0gl0T#qTkCg#4DhvD%IR?UU$@9;)z&jzd~kM9izwk2 zPmfA<%4%r_R~rt;>%O4a*Q#0f*M=wGr&i@! zyeD9}x0pwI8*c1;d2i~|W3X2l4)V#5KQQU?j!w*r3oE&dx z>0>PPhpA*e%uNz=%B~2{t+hb>h3NqZ z^Gfs^*ndD6WO-nZPFyZawXwh%@Nt^c3_$xp0;xw9 zbm6VW+wo`_@V_tR1KL-evc9lrW|dYrj`CAZ&?0WqN_+FVj(#%CI6P{dzbDfal(h7> zq574pihon&{l`#Qy6=xt#uftQz_^{r407N9w`JQ^uQo-&F701|e{Vah?{G)(I{%p& zB!Fh;4-uE$@LMTkCMKh6TG3($rd{*lZ)@xb4rUR7(e01E>WY)w!ArB~a9vQE2vV0+ z3T7VVU;KlJ7~ZvZ_M&sRb@hcUZjkhS2o>*>U;5ze89{T4^$gh_N3o89rF!y-?u zgi@(}*^u`5!FVE`2xb)cPiU0u?pEROw35GHhVE*?MbUN;&!c3 zXL2K!KiKS7VObI3C99`)FU};I1>@$$(+80=&8lt%&-(88#R-ETi?z6Zx$@a)#dH*y zEc^@5So1FK>CQOs-6a~c(wn@}hSX@P?bbUrRhW*S?+v!0kZnfNRG;cn+83cY7){uvSsCnpS3YY_pl1vu*305(D z8qg<&@)rJ2#Go0Ces%ai@JB2>=p1d)oYHD$Hm57Xz|m5!^kJKve+tDuWwJYrh(EZ zOK0Lq1_dMfh$kBIJO?!hzVtyU%%UEC1EkH616Ft5DfBwJ1f~{8u`iMxJb!PoBqT=* zqWAB1$006+nuJE)<@y@wNx}PK5=m36c3|h}(7K_S^n%Rp5_1bvFY56haPW5-2#Hag zoG%3nW!1gYJ>l?&oSSf=)n2L%x(+s-ZA?hxzN0iRO@n1z<)q^M)_l~@Srcp`#Y9$0+CS>Z57wde=8&=LXN z4)Fy4kAzrFh*n1y4x4F0&l9DFG}U5bp-Youv_lyU%=4B0 zDx+rDs?S3x+yH&48rettENg}(Km2#IE#%-va87e}GpXc|DO{)}%j4VTzlx=K{G0AHJ;NEcNV3PR z8D7G)A~*^8pxjhg<%LS7NK7FrPTsCZ_H-@ofMnQq}f*#axnN!C&}@p zO41cGsDsfPNaKpyhccO_K2iusWeeBJ_4L=4B2m|~o*x#nLxHF}@8b!x5u)Dd2hw*`QE;j@-v*@w2t`Y$96JAkF-fRgmj8R!-l>eJn?%W^d zK&*$uy1v|)14feCog~rp0>`a8c=i&!bv$!WQFNC$uY@#L`3if86SeqeRIb| zzB1+ljO9X`=01jw+Sj=A&4+%~;nzK35E*iwjZa{D_cWJA?96+kKHGRbc7!k>X_@uv zm65KT>-V%LQYO}uvo(uH!Ou3$?VoqgM(A-)T2Leg7P$^Z1Z&yRZszExE0cG|8Zih`1J zAbW7U>6n%_@=?Jgw$0Dnwz%1-BA4jHJfWUVWP&uxXEe}~iECu|^{}8GXt$DpzJ0um z9Y2cv*(s{4%Lkdj7v0w6HF_JLzF` zuY&G!$FPcVu1vFrI`o5AeFH3xg2A)NPI~e^B3|t>@=LED@cQ~cy0(7xDiW?pZ3!1I zP^S?{ZY6Git!{Nhm{qLcd+Xj-(t+U@BDhHKQD-NCkG+0GT18>WVU3tZQc!xL93}lN zS%ckug?MrL#<>ZL`kV(FB=r2LTS5n%Y@!P$bu8)DRFXvulnzm3lC;tsw(Vtg|~4 zqa){WyEdZC;_*N#Z%qm@#^CRU^0{Fo%7jB_{uBcxDe{ub3^eGy5bhoa&gT@muzFt| zycM{$MwvL;Og83MnlZ=tGV@sY09Pnrk06ghc4IUf82g)!CCuE&^A^yrCX%3`W9*%? zfB+y$23k~^4ZG<>B}5?bh1I)N18=89mv>^v zMq;LIgGV>{)lyVBYVq&<{Z$+pdWrIDmAE}tHjI+5 zuTAI8@WyS}6)>Zh>OyZoAQ*~8h>aZiet!ogG%Z*spxIp&O*=?GwfAn@XiLeMF2Abo z^NybT3hR>U_iq*+i-o7E(naWe5+prYY>Ra_I|F#|E@CrafL-4BR!)>WUyQ$_e1V4d zJ6d^pz2~Hb-Atf+{3=a$RipBr2^(Xj6Dj?ep_3cxC_VIv58Hcr5}j;?YbsYfYkwmC zp-2>f*X4GL+HH2P!m`jdhP^`1LTI5O9^bJVG{OP+V%z0m%O)F%U#BtEBiW;5XIyx}R|_7evP-n8b&GLhRXpu`533a8K5pqo@&xmr zK+l4WRHeFh<#{wC*a=SlB1_Q?wbojg0`feVf9d(`S48ml2=dcHB;QQB=Fg{a)-%t$ zoU?O;=^^p<9Uhc_Hi%BIi(lHeua|GslfO7FsUO=PLA#@YE+P=~^)_*Ue1dvW&SI9v z10!q&F0fg8^r`Wxas`@ZIs-<9oAX;>M8im6&8B}T3=tR}ma>_n#Uj8m+~OZ=@m3P< zO(WRk8wix7w}o$a31-MD&XlrW`>uDJyXtG`c1fRnH5cnO>u~hK-y^{LN_3Ck?iY%h zJ|j#ru-VolgE984{jg)Bx0s6}&f*$j<;ble7j=vV5LVneJ`NCmVFKVHlxroZVS_Av zq!O}daiWo)YO(AVuERipxj&+__Td_?&(BXIptl<~8Zg_8>T{qn>)3N$#kTOW4|mp? zQV3mG^Jqw6qfW6A(SRfJn!80NzJp3wDYnZG8!_4YD|mOt6*C9uTX3Gm>X8@s zbchi27Sn>;x7RF+YC7E498cDzdlZ6V^XDwT!^+Gu{* zQjaMx9L?AwuEBi| z>?;!E^s>)4fG(7`HnOt<6bbz}LI^~TyBti4hj5U`itL-+z#E|DPY!0)nIm&6+RUoa zI$?W!2Y;foXUY;~9Q=R*pt(~Zv`zJGGQM2ca`jmY(?9(yD2j~z;VJ+dN;!YMy}B_N zVKmpDt0kmkfi)JpsaQ6Co|Oi*Vr#}jT|oqka)+XNPM<*)nMg`ft>&Le+)Y}NfF8I< z!t-nzRwxt-92oTUl`=i371&bxW+-<Rzv_ksgfB0tgfJVP=VCVhl;4&IHELIaNI03q8{|~tv_nktr*j*9X!t8LVO;UW}V}lqf&sLdB*AbUoe5u)*m}40hbyN zr%4cLL^zsHa!j3g*rYY-Vuf;1vKFU2CBV{OQvKbJ9$Xv>99j<=#9VF#JMDYfMLnK$ zPEoD*>M$sGGPYP+eHKYf`BaTukL$^0Xx$;@Wv*aAS5~=Wiej;1{+Hv=*{RcVu>hg% zj-m?u_WW=p5y31&9mFX|5is_ms=kHL*;6#6IkUF;=6c z_C0U-I#L=2li%&$2HhP~TYNc${XB4JYi_n(W#ppplve`s_*4yI8dM5P5Us)hAaZDJ zljtrY*w31Ixp8x{&Z6ZGgp3E~Gi4f*Mj6{6>|15#Yz zpnytdG=mw!>OHFsGQx*6TAiXNJ3B+ykJ0XaUfSNI$WyvD2ZCw7oZIMckc{Lm4B@9g z)b6+OwV>@)&Xk@c*ADHhE0+w+4 z0M?1%oJdg5jGiW@F5RVOe(F4XA6z+{Ti4GCBFFBeQE^v~;j>}Pc*&g5!gYB3K(yAp z?o8Ece#pywz3-8LmTXE)?JAu3KvaiEZ-G;}Eo@8KH>QX7Yo0!H>iGCFf3fEYOKhJW z4Xx<-_rr9Xh9kVsl#I=ZxU(Fp;Atrz!(2{wAmSbUAK-IbcXb#BJb4L2+28`W{oQWs z>XZ)z?6JnNp98CNW_9fH(A%J^SoFrfS!+S@{*%4XX=ArR@w7eg z4-5qFygvwf5@b#d9=8?0(|GAHrL;qL%-`N11Tn$l|qVnjM(w+fr?kX z)7cE)Jaun-=}o#*6ac3fTpB7Eha^FGQG(&AX8g)f_vEojfkE&a)^a`5cYo{k9bV46 zz1I?>?Uwf>$u>Pb1FQmwO^227c*0H&4T|PEi57kPTmP ztf5WlpMRv_Q7G{>%MF-<2FHYl&@?$=lb}p->5%+}I_`Q!j^eBLx++@oZ6+*rz0quCpd)~c-~x3jKpE~`#y8Y0hjuI)ts zME0Vvp>yNcOCW9MT05zHuuv(C&O*cb5uo`p*M43)wUodg&`=P`ddO4&Gb1} z_}8}KlteiqHtI7xEcMAF-lAv{p>^)1&Y7S1Ow*PdIz*uF(v}hX|6UD7;(R?W3$7mD z6pH$!M*s(YTPwD|W&qenaMd|OiZ6u0)j@sICQuC!0uqxKfBzVwFzonfwe6HkWSf^A zxbEh1<*rp0g@NIco83koa)$}Q$x5^w*a%!YCL}`&55E;UwrUzZKs)yo5HgLu@HUVK2v> z@k=VCp9Yt#heH$4^u0vvx*R$YD*SSX2g>RVV@tM|d4$}^6qk}`ffw%U?zQ7$3FN&< zr@pJ^YTV5k!w5tZMAZ3B@U)6C;sek8a{bk;r;;G9x1VhAm~-2rQN(M`@;d^7h{%Qp zRtIvKoM_a8?yj4A+LWhJi2yLyEewrxmOol?<3Su;1&DOxd5p`U8@vHE-HJOtDp}LU{X^Lz_fs7B9o5dB~83wMbSi9so>eb&D{{VWB;u zK*0s)@ybEaBY(}RsWWtIb%gFp29pZqUhP3Bt%l`Pt=={SRJ$8zX(R{!trd2>#1zxuAQKn|$S z!?;ugxbp9Vcx3~1;Z2!yOvw(l019c=9*g^t8SX&@3kFR=)!-+Ak1She0cwxm@1U;$ zc-!aD0WdM9R|HKshR-h4`P9_%{=DC*vv8SJcfp@4D4x03aLXX$yM{=sG*gT_X<1X* zkIS51{oU&No4MwZN#*Li94CI?w~Me|LD^+X%6#k_JY!)>)BDA$+d<0yM}{_rBYeGy871qjp7nWF?oVIxR$Fw zMYZn5%grL(%-8h`ZR%X&PNUl#vPS(MSNNk?Gw|q^yEca2Unp&PtLrH238hP8dZ2*F znqQI;YT>%+4H9-M1XpY3FUWt2%rXXS@al!Kvj%kIvQFvCY*((qn9x#}O7NDYS+)&BP&$Aw^loV3VxBTs$Kjysr*v>&Vh{lQzrtjqHdjQduhM~$-p=Z z*+OuhiPD&FWG@yal|vDpgxaX0W^)3YPbjkEhi4V@fyYBYHN-c;lB|)8)2d zMHx-;%=aMz=dffZ^ZUu)lbeGCDu%fnL*Rv$AXb_$rM6$Fv18}w`H{=ErMpCmH^k%h zoj(rJ!EUtjsDp7+EUipn-9UB z)A5PM`6H!2cDn_;wW>$hg|qU|{$$-FE&N)awgNGTZy2v{q3CrNu2*6-d39VTi$0P* zkJMJW%<^&{BNH#(7Pm+4R>QL-+VCm^6R4xcUziXg!vCjGNvosK3Dv9H4LUp=bqSu?k9lZN7uyin>eoeX6ysBOx`G9 zS6sh$Wx(e2Glj`^6o*K2XQ?`jGj0WRiM$=`XO;(Ew1Jd#9P~BkDu`CIcBR{61_~Df z$I$rxRtz)_6@Zx;iws6kI2nZQ-WUq3DBOHw!$AL`rZeYZn7Vo%?zPtpE?FLALtwAq z>lFedm&bh5pr3_56rOm!%dIcjE%Ine(JUzSU0~5FoPv6O&GcXM^#1wUdb1Mcnl;dK zImhAEJ4mxvW4ON)Q!~BM0SMJes54SoGCLT&1PsTA?!O!ur@m#{j3>_|9KIO=7rpHl z!9jkAeP>uCX+iC}VK0L~ZHKHY1M^1LT}y$`9PL`RT$Tbc#G-T{Lay=NB)O~$Y`fky z&Rug;sY|I9kFX2D4U>iI!T{eFaPzhUF5Ap*azfw}-^@WasE~k?7C z1*5TSDWCv)d|=Sp1C;h){!3Uhf<%t4ArHR4fpeq;X4T#UqMp#GHn2{}t+uIzu9wbqMhU$atf4rcYGUc3sCyr#V<9dp`axmP*`ti&|$AJn`NdD*Q z2@+4WlN;CSU8|08n8%Mcyb2aRlEt!A^t;^J2lXF)-EXb5)L5ryTUI-{1J91Lpo737 z^cuK#^!*%QJM8Nn7+7>7#q)DJajN(WH*y0a}gI=CC ze`FGqR^8U=-^I*V@gAc@uI;KvoZbIB2BNb`qiEV1o+e1$5qg+rYaeCRLxjDPN6TEh zQwjTg3?$*sF@ttD@)QG&Zgq0KpTv}5^Q#IRH}1{z^dcF5KQ@UB>WC!5;A}lP#kMh| zh>6%)=7D0Np^C`&rfQ;HR5A6tWl}G&p|tPaO=;6E`8uaO*|!TZ11RBdZoCOM)mPQ9 zXUZnYs-NE6j+MEQl;B&6b9=ajH^jhix@ct9I@BX#GhEo@*Py?O8xGd#Dx(Yzz@#0G zO6ulwA_I#5;9FhnS7|7*4dqqljHLB7D0~VrOF}`sf7fzNMw3hz8dfy?fj{Yw{ta;h zaYz64?(u#0FL9{58uc8X9 zv{s*|ZGSUZDEGI%BW()O;iHbC5avkRcnS~TGHsKi6~0;!&y}7iQMdJVsiYe|=Xfmd z<=ISNO&@0;s-7by;dz4hF*f!4?@C;bfy2&XzL;$WF+53|^mKw6HNjbOB~`x}mXdv= z6icW-t?q~eu3DH+aq2efj3zRl7XZWr-Hi)CC7tKD#~4wf3+qM z@A^zS92u^yLZ*{xQ`JEOS}ArXB`n}a_hOcR!_jb_C5F7|T`>9};aOMANI_vINEohf zfj|HsKN+J3^qs98M_4rjD7VD3`YiP7PZc@4czTd3=*J~7u}wuoT%-ZEiWbReIgTiR z$bPoGXAb&8qbduIyhBB;utO&tyllHOq&?&UMy!2N7N^UT>Nt|8gZLl9aw4^}umR?f ziasJZ;T|a(C0IvIvS;LvY!BBq3bYK7P8y3SdUW!#n-3ka|Eg(GJ7NMhSG&dmd#5T? zEv@*&j|f$6dtTM)>>QB`KgM6Hlty`sPX9$!6vcn@-K>tB0sJxrKV zaPA0uc@V4tIH;YQe*Bd2w4Tglm;=Hf%c7i^JPEE65BEJ>_$VnnGBuFTiq#$A!vIU& zDeM1+Tnc`0>MB zUL+xV@p4|h>HWsy;!2U|A@im89RVr>^?>4iVF8S!c4-_&h=w+t@cx$DMrpo&lYqmi zQT-7ez7`V0&KF*gE2-p(Gkw=OSd?)nZn^!saXIhWl-G(;QFJhM-i%2Jh=~KQ=MJlP zot%|4P7`=9TYI_2R)hA-R8!B%CQ+xWe6A}lz?szC%WTTB9z@=kR~Cwxg0$#Y6znvY z`Xw!fF`ujznF3?s&+u!GsGMX=vgTN|CHD42avua@5_lBXeqXn#Yc22URf(V1NC)98 zE#MhbuNTY9aWGm;&L(+ff>sn$k1Sv&|4Y)sJ5?z}4yO@#yi_2c!?o(VIe$(ClwDR0CmndWA31p}CG478EBz^YxM#uV8J(wE1P-Ka&LJp*6I<-UoxMmCpo z`)}&?(QAKHi^}SwP{wKd>XAsd0CR?NjhAbk+F-YGOO4t;~!e@H5Fx*-{z{#n&V4t@HK*vm3pyh9w zf|f!^jM1%|=>Frwv6yv#){C_NyOHEQeBBgDV`f^~e(S#;QGiCY$)36YQ$5UT71uB; z@tl5jh$ffdpdBp2GxG}+TEyOV$&~&%z+L@ktNr?ywGc+@WCxDztv%vv(`tE+zz>`| z*A?&C;PX{+eU`<+z&+WkM;v5quJ>iTa|qpVqnzWuvgC|r*XbN(G7hQ;b$>k-0^dav zq`S-Ut6z=7@(oFnI6Cp+*(r;V9{82)I5&+8cUy#LgWnpqACHM< z1^Z|?qfZ*nLxx(k^{;6EG znDTtb^xq;{;c5R?ZKl){VC2~O_F9AZAWr)wR%u->{c9=o(KNoFEN|#$k*%j-!N$c1 z`IHitZ+M#3CWT*9|1KBpbv+|9()AsGiBkr#Q|8U6R*w}ZP4Vv+@=eu3c-byNO#XsY zp!I8fFVUmb8Q%9Y7<%kDHX1%GI@7>5HR(?WWczab=o~)V-O@e?487W+|7CRCogH09 z`yo)S=KNfB5lqJPDl>CrIZc2T3zDek0BQ}LNF%Flu=W%gVQ&W_46#)vuuZY(A*z=42oyE{`9sMwv+Iikg$q`IAZB z?haE^O@XuV0gfta-E;7Tui{SHBxTLV8E^0wA{+N`^7Sk<$i6gNzOvO;cxA|BcI%EA z-xtRA872Hr{@?6>!WnJ~qua>=-y-GR@*JF~S7)gevDOPxU*A_TDebMrz~X}TBmaL& zd?h{Z81Fs|2?B1-rBtKe$K;8`s#A!HYpXfqQlERM#SK`r=nZWss^!j85&MQmxeD5p z=zXKzI#p@atNv8?pOneCVQW7U4)o+=5Bv{aVMQ8E{)q35je^cb-OsPwWjP4{o07>J z-BeoKc)O-zGQVE|7n7oCT!pBcV>U+V5HHRN8}i#nVG+Co$thLqYpua>)iHxVB|df9 zy_Hkkv6G~@E&Y(bbpLISQ>QiD0O4^NruJE$PrA9@u_zgA0=l_BV5>k( zz!_18BIZtqVI#4{l6T-k9X976X-5l2a z^bX>3p;N?{LN-|MG?Wd}dJ2M@w&)lS*13-`cXAoHPJha)hzGR-rG=qc)TZthPZwPV zB|wp=;fcQr_K>YNy#IsZI+|ek9hOv~M6_Cq8xNriN-rI+!G2t;jWKF5Ep{kxLIrdVgVl zy85gP^oS89wmSjsZme8>@r;J~7~!`c00LgzzPH}&FtS#%%kpoi33OJ?Q@>pXOT}c; zQup1OgQv#()yOYAB2&|7<#sh$Ih&usJtdq;{KI$1WhJpF6(9?DoHhCQ)wt_?pQ9Uq zT7^P8_<)!p~L87>vkO>3@p$CAceTuDG5stpCqXKFUT+4Sl` zDsB_%bg@+I7Q%ZNS3JaeU-q&n@Y=^4R8@iYR669eFq>V;)3JQ%#-NM$ZUh`UlWss=@_WmS_QPtgGt|&kJZEnnZRrd(yqy7^rfsjMKmQD$H z3mQ6mzFYyZ3X)*PWE11mm*$hbN?>ErL~pDmEQOGAL8VEgGGpkS#vOK7nF6!URDsle}w) zZK?ow)TH~f-`){?1$)iCPOv(Y0X;}fu9ljj?JZ1xN7%_Mlvr&Mo{?3f2=S50ePr{$?NNzZ05ODK{s1 zZ->utdi`)o~xiY3=3XGnRuR7&W`;d3<){s%nt58C&q^ zKKU5%c-7y}2^H(FV=Jx}%T`RcCxOu0mQy^seL>Z#2U>my$-vtc{sv01v_GJd2*H~N zTS}Dd;OO$4Cj+f`ddY*%e9K!vHU+S1)at;>E7w3GJEm^q6St2lEM6=MX{9=)|H?~y z1KatN8)0d+J|Zv;Ze!=t76>S2yX1UKcIYTxuokXubeX z=9_n+dQ_MzSG$wCQ?$!w4*+%LE1*NrD9v6YM2~UieO}IX*cOiKSPuV(kCU>n=>18- z_>1GB^H+cmVx?1mOic9;rdu7IuV~WqWJWoK7q49l{>np6WF-e9K*9d&OMxvV zLg2S+b~zQQ7_(nHl^|=KaG~xX7bsEsc!551{br8R1n3U7Kg62Tj}Ika(?8l5d)2{8 z6A<)AfX=BhGTmJ{A<%w=p#$0nxusqQtlElllNXoocsd9|YN+$*H}9F$Vu#}r8K8hf zH%gpbM{LsG2I)#NnMx8Hpdx84iL*s!%D**?6@^hKkW?GSZll!>{A`qhN86U~bVY!! zmon8yjtw^{X8{H0qcE;B(k!%pVi7wZk-=yte9W5b0(&i$9uKDcjbLn&B+U(q_xAo{z{5Cc0hyh?l9=$dFL5_a8aAp%repx>X^{~HLw8<9SWR&E?{@6 zJHp!)n;06pb>7%_Q?m4zpvb7)CinPE4ViX{9tccWV+Wg3wMJM7#p6d;8BZr^DbkhD z0((+nAB6eYjL$5DJQHzY#qZPHyK!Z^#6%5ttB(=I;I&+04xt6!`r3b!;SUpjjC?}R zL4JW!?k>m2^%w&@qa(_8RhU()H{eV-c8P5WA7NWF(htB8pR}+4I?|9_YyZ zUTZFKC-J^Mmg?2e4iLMkd(pz}AEfzQtk+o)-FzS3(iJF;(`+VLgsGf=Yg-IefrEv# zF-*?u&@;Zr3!-Se##~_g8uZcR6RV#Kl*#HC-&uJ%0x*FujqRNmgWXZ&ElQ0m-eYBS zk)|3_NeUb+8LV6aauqlMbDY8;;jv8tGo@;1IQD8a`QHx}9i;E=x6q8i6&_rw5@wLJ z*aSxCEWQ~4Z#U~Ihan#WywjTYHYDz9nDSp|Y;s0q%lQra6_G<~+p3Mt&s1Dxh$lT- z1k6n4Oo&xk?!Cp2g91_2+1SVgx2ZnsP^dz&q?#n4nPnO&K9#y8V($U$ms?@u@V?yN z3NdL3vSJ``8e40G{14Ppl-5FkSmxmj#U%p3t}d>ga7EEMs*M;`dnzg+bF6|~d4AZL ztFK0ep1C=F3|jDn@8t+oTfJT9(Lh&G`58KjeYt0#gS^`MOh}HOmlV%{COOF$XaVpn zRbzuiqZ_#mY-ABj3cx(8Z@Cbi!+5_sRZ(%>_k~M1v+e?db8W#dy0u$q{|Ydyh3yL> zU!~*zZ%A?zF4N=|GS$uH07F2$zX+l^Y0dWMqgq2?DY;)b!!t>4pZDw^3B1UUdwpR7 zI=*`~SFFzi=Nbs+VNYnl8*?wCDh39Ts+(qCBe}?f2G&u*#`kj6^S31og92qPi|H~?%#aCm8wUi#5oCWnxF|%aLo|vFdJLrUV<+v&ASzw!@D=vgnlOv zd@t$?74&us;#l9c|2vAFv@Jijx6neGM7<-v70J3<`rI%^^MP))7!G+=(xJ5)TuFV5 zWi;`zzT8{^(EZIAg523y>WeT%brG__wICc_QHLkn)V>&Ut86*9{dt-6VwWOq`N~dL zuVOB+&)$y;RG#skFY$ip#B{$|m-%(_^2ke31zSZ5WyHZ_2gf}?-=Dh9t6a%M^dxW9 z!kUqYWu|iIz(uVH0ly8Pw}3+VwHSOh*QhwmIdj$acc?A3>|i2CrTzmc z_;tEh=hOy@hb&sr+=4kbTniiSB_3jt!07T;(aNN)er)&NP~^)n{=x6*EKdQ-<}HN7 zcfNNa1PqJyQ~xL{@kJ!PtQ8&|(Od^El^Q_uH*4JE#fP->f7S``vyZ`1B3^bMrk$n3 z%2dZ@5!1E%u|FNHrR##$;+fQ-Xk#W%Ck@aza~7p}YM?+jtTib)$!7nD6hFWs+GGYl=&e>T3hZZ|w4|N;gB07uo{)$7RE)3g7K_vVX-@1>cl367M_=-28!;+( zG1-}I@T)py7Ytn00MUxijkawL%8WcUG)MaZ+A&R;{*;q(erfLFJr1&ZlNWpG0)3NV zbJgTISXd!@I5cC50@THtb5?E0)maumcE;e1Mw(AyZbq>Nm14m^rz#OeEwaCrC}R+| z7w`mFb?j&Xq{Mijjnw03I1G;?rGKvjQUm}hka$k2{ZrzYjl&ma>X-~*`^i(M@meg} zW5YS($)0g-r+Ly4YVE9tN-^(`(P1+8h6at0J~X@*%AYiZ9e$!QvrlDUs@ceEe7&OS zL-+WwzFZE|LH}iWmQGIob|7zC(+3jx%b)^x?PAI@;AuiWtkdIavr{|Gz)2D+V|YKt zzwwoUole1yc+>^m@s6N$Nz+8`GvICfwt{;wp(19DH-0y_x7e9s4|_|#*W1SB|017J z#}FRd(XRdNTQ9Q9kid&{#O>oGWXhRL3M%Qme6tFWm~2CWP6AcGjlzAKkXBq4 z(xO>sM0`<^Eo6u(UVgLtJuFyuMlf{BaWN>QoObFvo6_PN#+p%nXdRZ#ha|Av-?t}3 zhQ;hU;(+AncVX5@Gy&*#yWIA5X|G?*ml^8{(k$ce$u%h} zu{gT*37k7BN&v5V&9ztUwh1S{M=3Svjoe1pJk3pR~lF>6${+pRyYtq`(HH;JK1ky7DD-`D{;I1Aj~9|+E969o12 zD~vVUdBEDiqe-PpMI_(uh>G}wAdKBYWlz8#D=+n4(Xt`zWJv3K8L7h~tISONme(q) zoO~?i<;*EeP{gn?xvo|AXtcQj0Lzb0A(QWjnswNN{Tz;@t=!89b;^P@t040nlH7)R zTuRIsdB_sj-T;FkBdUMQ{;vyDc45N(uu~Q14G$%Xra>oS)ZgEgiG;qkfwq!siR|XR z+jbn^UPf=Oe#M8@2DL>zy>BwEAfJRXlbzo%q?219h8$6D-;qo>4qA}w4gQb z0BePU6i$8@rD3?unXLYMxH}IP!5tbm%BJ0m$vV~J;NGljimc+AOvp=5+A2U#KJxFQ zpZi2jPC!p#}>xTQrK633?nq(401BUzuQ~mzC>s}ClgSZ;s>FD2BH5X zJh>?GeDvj(e)Sl-s7uZrmW^w^<`OAjP}r6xp{@6XlaWJ7`Bj#EIYH~- z66RWiL_BwU=a^JeyC5G~t(0IBMUx#{DmUrv`ftEEqBsAQhiXOV&vT$)cG~%7$}jxG zhb28a81x=`e(YPn_w^;887m-Wb7;UXH}NMv&t9w7O(t))3=?y@oN|fLiCeB38423l zs*FG@KLG_eAs`?cr)KC_39Jfr$-Y2CD@clz4thv|4z5#0b__8Nws(R?2Z5TV{)^7P zcYFM}5NM{F4pvmJKsNj>;p%Tct5k3#pb;)HUMuCT@D~@0dmp>dxI5l~de>c$tnd_z z69#NB_dHuf_jEu_J<%w&@vLBBcgv8M$Xln-vXPB^9f({om1Vdu3R`^^g&HTdiJZTH zzV)QB3$`AJ5ZA<=^|O5Jp3r<`@+{7mqNWX_5BM=Pi`EMex8WPsBo;Q(xkrx_ z)f71?uz2Al(0dpN1@H}50b#a#!bQy6#;j@MY>n0+wJ$l&t*8_!)#Dk9{5I8s4xw_9 zb{i6$jDUdlAuyJXkZ7> zhw;{OudRW)xr4q=47EDTdR{*DD+&TZA0lq zP{uJRXnI?tE(xqx7$zMYXoS(GoIBpQQGkB->(nOY-nDV)twEU9#$YZQTGWRV+`P=& z;WA+bCJfekMWM~sjlZm>A`vK~^Z}JT?17&GQGk+|qqQ`KfOgozILt&2#pS$)0!Yq1 z72IU^vLF>EL2SN9bVk3r*=#Q^%qf0fLrQhn{V)Fb*Iti(^;{Ae;x#H$6O!roQ6*97JNeR8ddEC<3>GVjZ{eumc-Lj;-v3T&EMg{ zL~{C=dz5<|phR_l@IyLa%9ErP-2!;eh-tX=X;x{1d!Zck6OOg_T|53~J&E1l*K(5` z!)fh6AzN_x6luNHnu_9K-Ng*CNoFROq%9jU(y#0yg@dyrmY;kV5_|r9iB&He6yJyr z(oo)S;6;N%FTs4}1HzkGFKEt&oyaBl58_ft@`RP~fF1moa@jViJpTUz6h0Pl1xnjt zMe(G;TG4T0h^7QlT$_v;!$75A)#je9Sxs9*fG~K1Q;^tOHBXoxNwD>eOHXNFy7Ua| z{Y{aa=%xc=`IXIh0dvy~HzL1F*^(CA#eNary<;h(fixfGRa^^>$!G&Mo_flD=#O!G zGjav>xn5Nptdy(eIx@{QS*HMC#8FE6eC;EHON3{$v8Ft$F|J;eS42$kmB9sX;Xpmec-6>TG4sfm~L|bepMgT^ULQ*vX zINWxR^?c)!I-ogkw5?XXA;&=zBblpIUaRsD6PjsLf)@{yqw?hJxNwHF0e2&WHN!E- z&+r+zpgw$|p&&D^cu#qV77ItmLKiG}2uZrergJaYJ-+eA4>m^;M3g^UKH=8`6gG&o zn~9}-nVVskPNGlcep}?KxmlpFZR!r2rUSf{>G>W?>0-z&%gl@XrlyN85h&Is?Xz84 zW~Z@sUjX=idvD^{y5Odx4nq2-+f^1f?T{sqy`kQhq@eX<%Py!)TS9~14jY*26Q*zo zLnZP5G-=i`YA@WTo-;y?5p^bzkQx2mNV}I)p43-S@*yXUogaz)?0A2&A&|uDlPS^x zS4aoUeVk~K=RQ2&Kf9|_*;W;| z*=&`~-3Lj7Ehvj%n6bATeILnP+c8%7p5Eu+=LWyXub%`@@ra*u`1;C(xdtha8aXH? zZP4*Uu{~5V?k^lOqB;Y68ofaG97EJ|*uk6H0u^6SDbSy;Qa$(~u8t)4BR8o7Gl0mk zDu&urW+hLDg+3RE4W9~96lJ_M!c9@_kt-K#18Om4Q9%g%27HP%69%uXrnxM>^?x&E z34)rBe@2fXl4Jp3bc?MTGQMQM#pxT*sB(L7hO{wGMj60DwLGVA zdb$@RFt*5`7OV3c{ncRq?BDI6kP5ehMF~vFZcBfC0=~H*NR59OYP8a`gMHe8zHNTl zSFTw|(EeB%|1@{{(p%?`U}M!L^Ba0+I-x;k@?*Czr1{cgavd2VIqL$Axu-Q z^E}F#uj%@0?n^K`AbHfOLkb^&55d8vzHjo$$~ljvrc57hfX;w|yiaV0s6*pskM17w z^H6AHHOhjH%eua@ickGwroM$6Si`*F6*#%Sp2Y5ULT_P`#5-=ieFyNu5(}?IQxMyg zP(%S;GXr)>^>*hNTU(jKG7W{?`3&R?gmm|T^8HxiUGd}krCm z^9QBW`-9g7XdNO;vvXB!u72Pg9htQt-WFKU(74xcxAW_8JGJCKh(QED*^Oo$72Q2S zoHQouDpnC?cxT-%^EAq0eu*j^Puotyug$3J^9InGbUk)De0gN9%IQ%=xN8=c{zfE5 zf%1srATpUP)e(UJV)jI8IE2CMFt;6|IV&OQ`wm476oiNM`q5^mZ0ZiYxmfjtH*$46 z37~@i0QwxBIYMpa!vy7D0}g`X;ID~ z>GE%Up_bTsXAYGpl|vfK;fqbVW%3Hk3{mJFL24r204nOGzFx^Z330zU+K5<-5$IlP zVAde%h=R6`uBNnA(C1B#;p;d+ThpuU3(hSuouMd?F77LJe}IRBDo(T%+}DG-Aue6W zt8hf;S|HG~vHsRjK!LS&x=#V)Sz>=kHgM@L1PR9b9DO~jqt4_ENZ|}SVnD&Y(@mm< zKc^LSafGWOvD7?@to8Lxn>tK^X4FUm3U7Hd#}Phex0hCred*gWffQjnUNURZ=5SGQ zxr73XwKkG3PJh=#c1XN_0r`e00NCnFNl@93VF<+F7hTU(NmY%z)2Dx<&3U$qXNoIO zOK;ePOg;xurCl&bEMn7^U{HUZSP5dh@0(pJsevUK=N}wj`mnT;_sP~3&oP^?GB$zM zGrWc}+BDh{?EL82Y5m{l?3}MWA^4mvJMq`X-y&70Dms!I!qJ&CKUlHP_Egv=#z3** z_gL!98$p&_X^@#kCaMEHXQsphBksvMA+^Z&Du>H2XusNL(>kLW5&mqvhI#8I0Bhe- zM!Lm0#p#H1y7aM>c#ZdA%#nm45suXt7dyFV9~6H!3lWJH1yX8(U;!2cmLD9bi*@7FTV!(=2hd(%fdg| zAwK1Er;F#}M+1Rpy#8kM>kaq&mnHF_0%7k8ie0)`{dkbtpa_H2Vpwh0G#culUE*VIt22 zXQw7q7rma8-?W^!c3jXA?*e)tLZE6oJ@$8|ggmR?W%Z!FoLQ&5Yv*#*gjujlvDElz z@5s7)Zd8?!;FP1th60xto8uS>2;lsXKM+5JH!=ZuDo@H|d9?|STrDR>cd`EP73XEm z*_wxUie4v!s1FIdIk^Ct$DV+^;7K()MItLFN`?SZY<3 z)sy+{v`g6C3oCV3I%D%GwF1+DFkfUh71AKBHzyD>L{H&}{&#Pb+AV4UB54vF8F>bD z3Y6y;p=J_QMzztNdA9{$+zl;Gmo|V8!24S+jxyqWSed6R&rH%GOt|ICI9ChKUH&3rs~7 zn2L4cy}}CT(URB#_J!ma4vZKR|0^u<3JZ3-Pow^**z@9e3l)`I4`9CIb(OSN!}(`! zFw8agbmQ5^wbk`;K&A@``l?`^JMC&fGL-{_DAG}8)5veMwxL}j0kRDww)(2a;3T7m zsfx&yX51N3ty+gSEKd4nUeA6Yb$IXlJT}|7rxk3gDIi9OVykXb*!3T0HIllLS2wX- zn=-XHOb+$}4O_r51m=wN6>3eMF`9}8?r7;$qr7D5X@sbfbK(?=v?Y)7Z<&%ZIKpWX z0cha+b#4Dq+#jErN`4(Pw5W^v^_JSK9~EMrAFe7u3v(BvvjS%~iRj5GI+PF8e$l$^ z$d5dwHhZ5paijB)ya!SbP5@2dUe}1i?S`x42UGnKWe0B;UDg&`+<)?lKQ8@9k^7PCZO~@D+GBxMC(2@a{%*(4VA9mELzw zk40_ZrT#wdC&R|o@BRF1@XKB+#kLMI3DRP)gVeC&jREa$_pR+cs3n!F%o5!isPHB< z<2rX=`019lK@jPXnT*BNT_4oscqPyU;!lumSWy&xo$pK+O}V1ko^F6^HdZyF@6?D& zJgqmPNf*m0$>NcKKI0Xwm_4QBDx!~OA=!4=EM5H=GZh&04}&u`qDXh1Z&$_vldUeO)cCpy( z^BVUkMh8cK=QMcWc1J*U9?wQ`Lfle$^Xt`Erm=yTsdi0BC+|vOt+a(jD2DW6h|r+U z6#9~1kxeel$x5Pu$F~f{gM)2J*crO7kQ1bic@dp&E&kKx-kW(?)JKXNJjtc2DOpM7 zEcZdQ!d**oju#RP&zO&3bkKu^Att+wzH(ug*@M zp`1%rz0M@}bHwKx$|>E+Ug#`-7$q{*x-uiW(o;MbdIwh_ zD0Z*>9_5%}WwNoYbGqK=Z};`L(#iFKgXUTDPuk4r`70C2athrFE3A7vK4FPsDHHH! zMJ;BWx=_C;Q`YF$nZuCtU6=3crWLQey{j+m>nqDi6isNw%!S)Uj%te+k6NZLZdCza zy+;<52bRAJe?IccR!pBFw@U)+J@5mDFbz?0c|RA#FCFY7gnrmD%$G+pID(&*i{e-d z1#rr}DnZNZ+#D#Q3rnN^Te?$Mj-qv_y(o7ojRKf3g-zQcURKy48M03&7#ly!QWW-~ zdwVQse+cxn5Fzpk?5~9fjzr7d<3hH14haELSkjZ|dtd<4)sM=@r2A<-PDYOCR1so7 z5{t-rXiyhuKl9YgG} zXv}KwwiZxwgiNgnmh$@S1NRZ7PsROw2NA>=w$XZ6y*pS8bco+V+WL>Blu$frIq39% z+(MPnEmlk8r|qNs=&>d)Fv|3W({2a-Iw>Fb2Pml#R|T&Rf!YuW@tMP&{2V2svD&wZ zpbN)=*8u&Q8MA_*_c5NP*o!~4CkTmyZ5nx5tf5W$Hc$t1(Dk(rz09FIFO)K{ry4$H zA|)4)-Ine{uX#P+xrKPYb3+lD(nZh8$z`V?QB9Uj^O53yE;49f`35(I$2oufe$Y^6 zNvelr!1dp^6THL7eV^w(yVZg(HN5vZHFQ3N!o;UeFxB&M-3-9uj4I%2hGa0j?&W6n zJ)8jyFkiW(3@I%g)o>lI6>+leKXrpf3Y;MhCo^I&x11uu3Q_uuW&!DN8iWiembb5t1$c zhY7(C+s8lYJ)=$Z^rq-Ont!%L6k(m=6ER5$ZUDQOJr_3n!c$2kXbJdfIP-!V_j5)wuvXAU z4Z*p?bJn2?^}&FssU1+N0$2K0u%YgH2RQlb?=FsCHUVq5a^6aCuQ}&!y5l;x(=qp- zDj%I~2Yq;_kXv5osE#z*A{Wo72`XE&k|wWc@J?pjO37lFTLczGIxh!|035B;{e8cQ zk2-8ACHwbqY6d`m$OAUEf_ZAYUF4BX6CnY(<2_OS;MxZQ#T4$xLU6O0)KO?xWH@p&BxoJ( z@6rwnshJ_aNFu@5eJJ76TZ`{)^a6{fMcr^V-f)pXZ6csBE(F;#v?hz@%1-ga8i8fg zzJLRv#rV0QEiO_ZE_t&z3<2vj>zgf-fdwjtFOKi0;^%mX8xg{CC1G6$a*m#Z#Su(!%||?<457O8-ggD6ih;BUkpFmj#&e zXvD1&kPiKogt>dx?RdumBRjY)F~4BIN49lsv<;@^Xt^4$oLvEqf7W+$4qGw?jnsJd zV{#$B^%fk5JG)$cW?;m);AQJo*8Lh{3WW{ z6YiFfE(Ll4erG=SoUCI)^%N2Hc}O$3naiP}&<$?6BP5hNY-GxZtk>Qrs{d#7@MY9= z3>Ev;>u&HL5q0-%Hau<3D7*CC#2*zSf!Ci^B^Z^Jc}k6VIG^Yn>48s2#~2fB-iq7a zSJ)BdH5wd{>d{U?ypY=`@e~l$1N0T(b-$hRB;ddlNLN6NaL6%~5ikh-K$=ft+Au_N zB1Od*4Peuaqnz#`hQ$V7~={BfURc-XKj-M;MTrTXK!Xm=#P39Hr%+N{jU&0`&H6=D?_2`H6Cr%+7YX}+|n zWeer6&ItBFpyT`5uTIXyB#F_HKDY%tC-6&r`VcA!=TPs$zIxH>a4p_LkT7t%@zOr` z*O5`44}&u*dXYbLIL${Oa?9DVJ32Y2cV=kGJ5pxLs$bO-4JHui0abW zB)WO|IQS1zFWUv5iqP_OU*$h#c23KzaK_`Sz$rww6-Sfsl}!U|LCJ}#r8@eLAbZLb z$fb?oCp_>WE(3oNs z7wm#9Q{?yj29xSVq-EAW<`|6Xo+^g#W+@ijZt0lss2aT2uL!gv>3qt6Wa$0F`ExM| z6jPR8^8)A_8?p*aRh3AM3GV5VLM#s6zcp$=^U%2%>&v&5O-&3_xI@z=R+B(e+EYgP zikbF0sxmUY(Q(E`4P7&V@75EIYSuhT@n$a!qdkjKRnYA(RcUcyQD6oZXYdG$9d#k$ zd5|=ZY?=J9Njn_~9A)c@m)bt+wPm!S#@dU7s2r{S^&^cLYdQ%rs_er99|t8!d8Goq zX^>&VexohtZHs_^i5u0Ee$^fo+LW}sKV&glnoWhMd*C=Pi1XglzK`gqtBoPV<-kc$ zRy8t^qMSHfRExbS4~`4mD$&7d?4xNk$Ic(IWPhgmiw$^+wblH>gCW}Jb{j4UQ+Gbl z^;bX71r_P9dB)jHKKg|e*U4(V{C+Sy_Y{fptt#{v!NMi%i)eV-I&f_JkW6qUZ;h|A zDow9%MzboFeq=M^&P8P8y_$8c!=y)_VUZJdM8EY^npjA=M?b%jgk`?#kuPjlP89MP zvr^xjDAA3BL0QwecP%KFKE<(ddh$|wQ7x1T>Rni=K#LwWu=SND{duj6sj*lYx0WyM za!wYv2M12GpkKz=^Xi~c3_yXJdZ)5K=kIhinG!Ba|02?J0_QRPH^1vtg?0RHT?$?N zsXNd(Ofg6L?t0uCwEz0kX0AST1l0`lLvGv#dXBe26`_m`;jJ|hhihwom8HKHOnKJV z<#TJ9x#gUYeLRr5jUdSU?+A#?-T^Tmvm`CNEM~w;_~&jA2DVAyqwShGgi)gT_WvK1 z)>Dv%wYaZ7A}ozujlWhd4T*bRUV?OvPa}5r53N4vd1fHlhXQ>dtURljXR)iIHXz7A za#(bE_q=aVlr+vYjED#OVe=}1)+y>%D1R$JxATw_HjM?L10pfaU3=cN^a!NmZlsp| z$I36gYH*)g5I+@loC?0ekD-loVR9`t0BcT88=`o|*NibnUL`?eQHt;5i@&~&3QGN5 zkf+kdF9VR$#n30;+^!7F%R_&}%*kD&Y(=_>rc3(udwz$^YjhbRF2j5Kbnl{89EZoc zRdg{wOR8 zXYtRQz)7aLpa+j2f5wW>fpFe4tq0%B!)tb;I1Lp|)-y0azzQ9Saxgg*gSbd0v`Uy% zQj1tGZBH#AZ}Npzf>WeVxN4i7VtWcIF(a6wuqG2+IV-E9SNswjyEnnvXc~1b?KQ*= z8T~a2U~Ki+oEvCB=N!jd;IdFa9(QAvfz@VMs7KRB)w6U6s3=nDx6*D*}#MyBV65gjSQN~ z!YBbt;)z1;WUKi5KVI0s*4w@pz<3)$^1>uUB5+Pr-;>eP?O(JM$d$~lVecA;GA8#f;I>d6rN-ABjetba$$7aMvXiVxiQpWL|>V?GQ zKch3^e9cFmC3H&%4`a+f#mj)9RF`sD$htrhj zUjpBh!0GGK6!M&60WDTtA;(<>Ay;}a9Y`$}RIYD)6`wScnd>$|ZmviVNPhv6IscBl zorAe%G2x{A+REa^3210Blwtr}_~`f*acT(;9WrSPkAWp7*%pAxPtJ^+?uG2QKX+tY zqd&dZ+Nm-l*gcyle;*#ectQjXXV;pBU}Il>YQJI>&IeuKxoGYm5&>n)^5?#&vm50# zbo$ggPMLdd1GHI1uGo$bO?ZIlNG0mqn*6ryCAbpvNm9y|C_WIB+yxI)w>}qtrZh*_ z;sKilLGxQ{{ItN9vy;zQk&e`7tt`#nAx)e8MGM`Xs+ej%k3oZ&K|%?rfBUmO@CyUz zb|=$g(SN^mMY(3$ zibNq0NG@>4ArG#1(0gQy#*n~qtq}unx39;oyb=#rNpkTs-s9gGLPt1P`)@ZYUIzgI%+4`#0mcMx&!*cOX%wJ z#b^k{#n;#TS!1Tilyo8 ztq^Z55MOJjct5q)0#rzsl&LYx!Sh)wM*n544@{fUG;LuemSpbelVQBsCk4YY3}P_^ zcA3bu#@Y9vb0b8GcLy_|6aZng4gnEwnTEKYaT?&n)BPEE1^%At8^3pG7bIhR<( zu??GcvK6L!ky43F*mil@{Ssp#AKO4TDcVG19|M4Xzylm~!v(e+bM z20kEZQ@?SvHaeuwGCa4&wRr)j8B-#!$cL}pJ6ajo zdp2BI%RqYhr1Rb3Cnemily#*ku{#30?||k`!UET%Dt2CsLHW!il1J+7`FJnNEl*E{ z!8*`3d1Etrxcb1Q`zMxIm(Gqaww*~gbR9TFb9o)EFsJs99Vq`4USEWcg?r1A6BY<@ zV9~qxTb@1o_M1ac@xTwgy`h3o>{Ib}Qx}JZd0jpaA8q&^)X7Pw(RizBkqoNK-zKzW z0i-6SD)>&oCe~&Z>nLHP5lhC}fJUF%u20>52V!*@P|bVO78(yUgp{;2OF$9`%X}&t z7_MC0wYKIu84?qql;oD8g@OcRVz|Mmh&N4so%u%s%E+jx^@RwE!!qMHDx`jQ8UOu7 zy?G_pJg?#e_6#?G0~4rPMy#gF0n0y35C@%rEWmJRGTYaoT1%ald84x1WHbTLD!CF@ z_ZS67JsYDoY_m=@kGY*j^554*stco)dt-m67A@z<!?Mcs(Zs1C?=G+#)}tgT!$GpB21GAT-Z|B&PTpgS=JUY>Qgdyj50mG_zMK4 zaTNc)b}WOPfqBMCs*u{})$1tXv>PuX-EX&L{1wbUdBL|_ouDcQSsF6kWZl4KlxZor z$6&^ep{M1c;Rz)Ld}LGxmIA63bE$>%=kSl+XMOd{$+f>ao%*8Q)@l^JOhZ*KY2nF% z&GtRqb9?CYH+1L4#=GY%CrbPTapN2t;OSCZav4v=?n?dD|4RL22p@Yf9{_pVo8$yB zz9bX@0j=oIRSVD%j#6Z3ihGbu1R_0*um=Q51f{63+4qB0{wm2EW6)>>JKl>-{{wjdTZ>!E2sFqXy`x<(d)EWzF<*eHD6LEQOcAU$Tq=BP> z(8U3dnTmjlznd~!Y+x3YwOmOH1ZN@myc-UpWv$Cb$wnpu6>?}cfsAAY} zXiv$`AyEw2gdkrv*VT#9_H+g2rwirGXK!2~YHqVqAp&{#b-WfO!1wi~d zqXTT2M)1{wlC!6XeXip3z4MGxblXR6S=Vs;E3vOlFW;9~857Lh5-Wye0BQm`g`d%}?Gk7WY;iYg zmaAz0T4&eiRla`92)6)ribZ0?;D{lJHNJP+1l{1l zL;L{_-rY?f{Pbc_^<}8a$b@;F*FJInf8aAH)~OCOu1;q*?eTw%XYGMi<}!PF$oaRl z0<)jzH|Xi+GPOstSml$DPj;|c^)aBK-@$C~Sb9U8^vjfMOsH0x-n(KHC){?G(te!# zyDwI4T^?wknR;GP??J*0D_l08B{Z2NHYtjodlal$VFTT`k{^3M4qxxZZ4kC|?!E+{ z?8;2m?#eiKBk7rt_&P!fZ0pe6Wf5ASTBo1|NofjcS~>Us9|g zKjFIyoKcJNRRNhJ?IbODI4{*RA9kndskoi@(&G*jAtK-ynn_sC&lk^vW08sbg2IkY zqvQKkndJD(L{d-)W`Lb};D{(-iKm`qBMgo(yXKj6RTFsb3l03~4pf#&xFncRB4a#@ z57GGayMIFyw6;XO5ya_2R|{-Ru{lO0RGol0TDd$-p`D^yhHvZ8^U;o#qN_ZP`CNw@ z+x?MIE)jn)T&x&$f>YH*ik!0=+KD;OVYS^=?7R;pr~$uc<(jc+;vf)Sbj(U_Gfqsd zL?}vBKIEh~(TGbr|HBK!Xtd0ZMZTU;f&YgGg_i?dZSvK;Z67mGG$-jpT6GD!k9Hgi z?r5X1Qdak0R6o?1RUXytP%*Ael#~JTVqD)c@AIx7fY26u?@b%3L(@MDB48FIf9gP2 z)N$Yy5~)-_Je^yHnN(l5jXD+P4v-BI;I3Q_++T zSm?j+t8yl$2kKPRfom5r9sB(VK|sP6H&j;=wQxraWzD(vo9(!sY>pybH~o$kD59!K zC%le)X|8Ds)$>k+khu>Q-@Rp} zeyhUvtStFPo-WPKcQMs>HJmwdwP{~V!cn!}wBC3o@~2kpaFF)-E%YRE2ZoQva$c-} zf;^R^DYLDiG(hIeIccZ<2h4lF!4%pR*p8j;E?}}Ca%dPHO#}vj9Y<d1$Kl`@mKR)g>s#< zb;iYe*8F!=vae;cpa(`l=Xqp0iRrY-MGVxrz?sA6N$`1{10a0MhK1G8i-ZPd=)%fv zk~=F!P(aEA7$TACY@R?C4+^C@kDwxUXRlNC9$Bym6n|=Z5%aygGLl1rm337tI%JZ( z{>c`^&;BB!)_?Zm9B9EYgN8z^Avjc3=~}qh<4hvopWcztN(4iIn({pqqA^f+(!c`N z0T@TA!7_h=M35O2vekzl&B`Bn5RBx60lc1kY!_MkqhEUB-5Svbr-0+l{lhtSyUA>` z$4HDTMWEi_4M|ANyo9`QlV=WL81kz~HG z`%r?8_pYHx(zyZMQ@Az-yS(tauY-jR))PMh7)p@6n7nw&jF}v$c(C9Fq|8TaSU_9pA`@0Vf)XtyLt`4UzgBq?k3yz zzjX@4#x-xwoe9PQ#+ZgjpoSHLR`tP46#c37J=g1bvH3w5FVGg;WS3KtoB3+kX~w$e ziFU)J^djx4G#?pdX4Rur`WE!7=I0Ki`U~ummOURWNfatp`NVn%dd|scs|?#pu+DA4 za49FQbG1m3UebE#gAN|&N-naX+qFoLL`z?1jy1}Wqg^a_c+HN|VW1QNh&c!7dXfLU zLAwu$a6;q*BmXEl4QR1a`B<825)XDbW5s|A892oNA-Z56_`9Z)YY4(_XX)ex9a<# zAI9a==-Jl3B9>fAoo0XQ00Ukpc1UnC{lgGIJ!_!wVv|hTxuD zvy5Z}JgjB5pT&)>u64fS-hrlRBL2BNAD?&el zuQZru1ygNUU51C~!L!Z@kcd1C(p#QgZnaP2ReeL0`Hru>=JHf7tnafq(6^( zgV+YdWJr2hon1Zc+xT}cXoM6oKEYO%C~&Xeu(?`tdrs|{m1;P0p8#a%(QQ<~%}eQ1 z>|U*_sok$0tZIoQlGDX|>A(G5@NNBch-SOLWN-3mmNYwQIm`sUhlw6Q;(5$L^3COlT>9=cTt0poe_>;#^Wd#CA^09 zJR<+s5w!0Q+>zk)P~RIsjy=O&?)=tPdOmnCvuBZY!rCmgsMhsvjo8ctT0ImLgM)$6BTZu7u4Q3;)?i zAa>)?)Uk?t_a)agv#)5)erbn(HmM{Be#PfGh(duKa48Eva>3{)%!c_R4T{m=fZ+9H z3s|o752Q-<%9ISK+X1L*xsIUj5e)8tmX&;YD2h8Wx9A>PU-Y#cRY1y0E0touG}F>l zujc&<6u`;>Aj|i>F(WF1Qt*5r?}X30O0-XfLAm!(q`3St;X=VbO1^}Tq&Gb`9%OfT7?JpK?dr$`BFs4tYnCLJoeH(Z$+0DR+tDf)%?3U(>?+TOdja_M=R6;?_z@21cWV-EXKkwQ{7b zrh9ZciJ^h@AE13VU74k>jhx*0>jR>20IvX7r!}=Wyx!aOW8W*uMfAhISx^jb#!a~iUOqX8|uNJV_87``G(gV;QKsXBf1Z;oSG1|v1AbdNqH0E9)vxCuZ$O{MaE<|vgO{T8>wcu z?e1}ffFcaHxT-0#@jSA14olO7@F^YIanW;GQ;|E$bJ<{tyV8E_uD`VNlTz@h*Xd{` zFon9Er9C_(n<-kG*e8r-zaEwyrHXCZes$Ba=w4hScK?G8pnr%93V zO$k3kstK|qCThuP#e{2E>!Z}(N~K`A9h5$>?)LF1+`QgurRQ=1?$|!h!FMOWTm($G zJb(4~3x*AYzVkBFF~JZn(@gPbD}i~+F#XG$iI4eePLyKA!q-Yiw2xf{GfR>Iqme~^ zAMQxRi~CHpe4vjx`>@q*5Bj`r-*ZfwEqSqXY1H?_6e#sIds=Jq=*+YRp@F|AZUU`> ztJ5eUnqm&0JC`|_JCgBPAGpcma#0{UVH|$W3jC7jv_+gr^owr=0p=zd*)-#PNYX~A zJ=tNG8bv^AYwIBdVu_Yu{iAHp`EP&WZ$lg07XM`swC5+%{M(s)2zFw=$x>3g+$PHn za;^@G>T>F~!vb+ zfuE5kJ@b_mn@tEF>wG^D4<~W;+mn1lu7=eZV-=Akf~`W^$e%4ua|=yw z_aZ2<<5FX0xV?LSD|*AEx5Xfb$4j0k z$L+`cr=%{jAOza5H$NHN`6(are4az4wLH%zFE`j?v!+?{vYTS@V}aB!jl;iAYlRJ~ z-I-AwhyY~b+~KT!3QSHhit9LOX*_Vo&n*>(X$h-nTJc}vE_El;{$YvPK5oZ~BCort z<)zZDlh8==go)AR`f{!^zD+git@FEa3T;Q+xCq*^d{KBP_y{8%T)aA=5Kn8HQW_c_ zKvO#aBXd##yN`z`NqSIp!1+I}?e`0A}NbM>j zQIHi-1hylJfzt=$*({fb-~aYwbH}gzod3*zFZ%894s{4kQD3eOvhBJQ^3Ss7{lTli zpkZc!pC~_3O1~#u!I4@tyn4l+(|RU{@RmbcG*^-G76KNV>ZV}@hKhFhRY3791yO~t z{|M3={b>D%ldUw4)&_C$?ltLXKd;N+dG*PA0=B?>SZct0!sNuB9$?zVO6@z$Iu9MS zd4Ute4rZl_Bbz9Jq(=>udEkDUUOsM<-}JXWc)85j3ei7xf~zxWICx#QI#ZPlQ%Bds zs>7T;y~*Ht)kj{Hg7pM!h_VGl@Yxm;=jBP$C>`ov%1qT3pf@Q7P6_J7=kkFCd(JtE zPVsqe*QN`Ky{38T$VxsiJWjway@cSruHpmV@HIO;boulG$Z-(*v!e;*=Q2yfK+lfM=#{!KCqnbWa+<7`{)wNJio@hT2fvY5~aM|fZfc!tellxJXN{#a@c z_!(IeP|G}^C7uoF5)lx{&e^E@N{pz!vN?}XfZuhj zoyIc=E(#aoOzdxa-9*}VDjb%i%H`<*Nt3@j?RJ8fSaHSN-AC#)tu3;px6Zwiqksjc zinJc5Dq1AFxSB9DBB&W)g=A%h;7edue`OJ5H-K2YLe*|mENwhzdKyE85>Hj#(Imc6 zSrZV1xJH@)UC-V9NqHXr8ylgkqxu;_+bucB9}&eIACBZD^(h)x@?jLa+E4x1yWPhq zcQm(?MmmcHP+)+DbqBy-Kj7sE^v1{?_U?ud_XvXnRi7%sLzA3X$1 zM35GwG1{-u$Xz^C_y2TB%Fc_!Ed9)=nk^VGLj2Oieq8mrcNYD0K6YDyO&c@Kgs{8z zNn*!%v2a-mD76J@G~H`7kVdDeH6=(!R@WVH(;3W&pl1Kn&I9 zL;#8I8J^i;waE~C$dO=(o`*xl1$*2e%#syLdojL@FuLQG7^Vs&%c?<-?78ziZ`yuR zk0MK%<5Wja$lSXi<{p&|{-KEjiE8c8G8T8+i2(EsDZ@i2iL3>QNNgNh+uMRGk2jUq z3mop>e%lgDT59T9U0D4gk+7qxxX{^)=ja4sj+vqdnx^q(e1ArNLpfe@(HwmG$ zM8NBN-`i1TU7Ku^5cqi9>4oihPdl>kSO0yHB7tDk-k+Hz6UHm96B4jq1Uz zSy&S77whblN||i=C>M>;$m{i3#t4bRl*$$z>!2Kd*cSkW{#!rFj3*_zURv4u45*`F zFqxYAX#{4{PZr4FXaU#N4tni=(gY4|Dhe1pV76`?PU5=c8_~z$01+j8`5|pfoLKAz zTY4+u=rIhl=|K~0f{s=woNND1Y&lVi3rE6C7rNvr;%+!egV@u^aQTBJW^zi9AHySS z!Q@<(-7ERc9Ku;t(k0^(Vl24MgIY8`?m;&vO#Zss}WFP9v@ zuk($)FRnC9N#b#m01UOJ<{ur;Y5Dz|xk1ig_mf=>u8HMuTzI>u_rLJ~WyU-pS_?nN z5TN!k1gQS+B4@!qn}-Gn|N57NHut`p}V=`V@WZ|PE-SZzfHRQ{6ya9llN*RXVckt}% zSFBrdlYGK+f?t?j^At3FlZFyfP?!y7R_w=AJ7-Fjx5TEQf{+Nt~ zB$ApQf%DSQpQh@-`_7irvq*Rg-|itYTbu1j)R&@G;{Lwq6G3gf_Ci0*Jpo}^og`c9 zb3b{P*^@Kq{-&)f!?JTk7iU)t-q<({Ck1bFveN(TR^$?SG`bN4O_an9AH$eZY%*tb z2DCoi)nso6#8~Fz_^x9U{e$Te5E~TC!Y`l`GY5eXKZY!nbAk$t1t=-r4yf&RjI*ju z|M@EXwGjva7wnogcft@f7zjCb)YvMlbPcs{oPp9KUv}7ecJKQZz3hC+ONm2;VmGV% zg^ZCHHFCIKLxvzTxS^}FcB7`GW1wQ&jrPW@fW*ixs#lgYp6+e|c<3|$WB?!FX7{UGBB5{r)h}F|gprFMRhfWb@;O&7Sp+e5Ibyd6Y-z?ADBOP(a z^E6-ESgImpwLfy}79nB?X6GF3o^~NU;=D|dk*R~y=II4$c#pLHpL zO;m1Irm;U02}?1;;p|BH`5qFY8do>r(oR1@#zB7tKtooz^)sKy(Gr!Pf?9N=m8PakNIICrI1?BJ6mv^^cT8@M;O<}HqB=?6N#l{w z-8di@gtuUXE8oVX4smle{ysXcx$z+hIR=NmON|^64d60>+GQfD> zY&D@RsTOqUu<1F+_BujoZ+FpZQ1yx4%B;hK(~tL@EE$`Eh1OKO*cH2w|7+dJ|2^y6 z+4h&$o3rs8=;DU~woaL3;0fY{*;G{w>Tt)U_dQ#z{A&%gtTe!-&Nva2B5t1tCB)b_ zg*&pSr{E8Q_bn=lViU(APGf~xxBwRVW;TD9N?kBS00BhHH3#Acxr)clhE>zP$N!4& zVmd+Z7f39%Br`p^AJJyT@-%{w9>9L{h^62K|4IDHcXkUH*iz9wEe1U;^yGmdch&qx0VC$TMS~5)SW<^jxyC-0fJA7uaJwRPhpl{0A;Xnut z+rqW*F_WQeAzfWwlRSAC&&ry5QXxJU)C$Gn?*v&v)nx+qj&aRdIUOhnybgbds;s>3S&_b#fw7T$h`-ew+xr+4E}U_fyjR;8!5c2|M1!3=y0CnXsOFtE{qIexQ730cJlB``$-6iQDO z2r@DsMCL5Hgd#hYzfX6JY&(W0mQ#mGk}oOpz-Sf;7#zD_5qu#Dg?6K+ zIVyEUR0|R9>I4U1`6z$@$5eZp#aUyWviGqz^kNVklkl(IAP=$y%3>+M7a?o!07EDC zi-4{^J{4X*CYg?aCRiU2D0^F-# z5Xqnl8)!Z%#J8IU#wjA~K|n@RMOu%G!Ji>%r>tJf%j=jc-~{VQ2JdE0OG^= z+5&b{|Ii=ZeLXinYaS7A4=^2kTYFHULheU$ z(P_@oQ{yXU*7u5#NN8MqmAQQo+f*CM#~iON@)rg?$!qi}?g|Ypnq&~esgp#%s3fu| zGxmO5&<4oBI^x^NY5+uI!)csfScKbR5Ho_yzf>aE3p}>lYxfAxPRvH+(D{buUu$4K z`Y^sSTz(E_xVWA4nuuHuXRs4#xe*fCfaON$t@9GwM##F(dYZV-QV~iM5~?cB5so;ur6OD;^EhdN=f_FnFkpsv!S5o2yIQv zt?{=N%C|;Bq6}~V9J#_;wiPsqOoh9zc;uQlqUYT$!=te~sXJB^bwM?|Gl#kMU$5E` z!duvQ-o8=Jvm?VlazWea-6!wEPQz!v28>3Pcm$L2F3RfP28R;gl8rx-f#1Vq4IAT* z*_el&!B}JcQ3GU%4R9)^hdQaXxYhsI8&N~C(xD_rih_*L;8!r)U;qf$ZOE7~DyL3b zb-hwkI%<|Q=1(ZCnyUZ;OiH2!fG$)CHekd3vd@r*66Z*y$q%5J4iGB>QHKTX)qIYg z+ifY3HD^7A$RFH^y!#?MUM}Wr^!VvlZk#khqG}M?#t227Z+pmWmT@f!LN^4E@)F;Z zMBc#zJvTN26mB7H9RWHGleVzk0@S!711I4o1l^%B<}-N>v}LNN1!tL`K8;>#(`O$J zTOt)I!xznnq@ZKv@}w%PP4rs@Ssl{h&RaK-HrSYK<{XjNgVN8Rfs)|&ZtUQWQArD8KJvhDI&DuFL*T)65Rql4eXvvVJ_eR z216AoWhMSF85a`?w@k)@;t~9*1mwFp#bvA`=-4n7d-&Dsj77{4B`;}YT340^8S1i}<-wPmqiJGi zK8*X!bxa~9yy*_;=d-kbqq3IM-&iFX0Z&jCpl3=!wtm^K&D9J@!bMfjNVSvPg8?R~ z1-+|~cS>C+TvZCzh=HfBaK(h9JcN(c;r`S3HO9fzsV&XuTM{+D=J6{{_QG}<;u zEbhtWS7EjlG)5EiXSU4P1?f?gQcZ@h0}{w16{B~?jrnN;hq&lEYkM3A6&G+XGcfp* zuV{OUJ`f-U(E*!iv1X9wvqKa|iht10oqowmhv1#sr8jX%fT<(Jq(ou7=~k7xNxgxj zW(QHH8>L-5gH~6|9KmBb#DML$oN1_G6$@-A?QG?TMqkXjB?>-!ud&RSRu9z@aMJvfT+1II`No=EA3V^8Lf z0^X>~B&23JjrTepf(@lsQJ&_{jO%5?2d5gijEGpmI=;7WDf7|*Pnl@VJvF_J<+&S@ z^3Mr1mj)qkyQA z!p}z*S==9lF}ccWI9G@O0Z+bpQLIK3zAK=kXOL27uIB(%#7&ZGT%4L8P*?}%2K@mp zTI-3YAT0*mC>N!$rZ-re6SI|OECF(LFUq{)HTsH7sD)u!$zY(I*X!KCjKxreXWA{G z`xKXv@cwT{H)AvZP&AhV@PONI`4RuoR7<VChTrpetBM0TK>P@7; zGuFs9)aQiQ{$%^Fg3V39zgIt|zLxxyV#Mb2i$*PDJgJ9G*H5@7fG!1oni2;XZ@I_h zweFz!)}vYRS4}BcEYhZsGtSuo*`*L=B^FH>4V0gM1`G*Ceef11LE-h;u3)Il1w(ky zDg<%cH#RWElu}lD0I4mpl(a|is!$HyHLM9N&2(0Z=D}WCSjDC*!s`Huy`Rib@Dm_P z3}>1V8Yb2!t-mO0RIdjiaQK;*2*tz+Om5jze#4y?(ICt)L4RBz^bh6F!%rfidm~Uk!k<{W8pzf@x3LlxF`W4z{@H<9nJ-AQ!Tv- z(|nswh5Tfpok5H7QEAf)edKzgX->hZkAfkgCMtr8_M5=_x~tXUdshEm8HIcV#WFi? z4_QDyZ)Y)YR->$`rIGjeD9wIYCoMrW8v4hQy@X`G2CK%VOW zlfIuIlK#y3 zD{8|rZWVrC+d@6@zO5>$=Gfi0V(UM~@zfHr1}{CB9lo+{r5ysdV&L$(yvub-JYME5ux%f_j7#axMO!pvX z&|3%1HV7Tuf4?9P2dQv_qbk!$Dk-iJ0O`8a;f{TW zfByMBI@`Sz#e^5A(!z<*|lkEg#%KI9fl5_wy z+kMC!4jGgEoUifa#yOuVk6AKu-GaqBigzdf(}e&j4*R+9Ne-?SX^hZ>iWobddU`@) zgnMeb#}xrJl=jEAxOeWocet`cjFgGWy|Gf? zo@j8tdPI%=?t}5~&O_Jigw4H4UQynzDzT_R;!bPgQnU64G-wabRajpj=vt zk9+6W2w2R1%{G|{IoH?M!+jFK3MhneOWTe_?sTq;xRM6u*f9KXV3V572PBk`Zt9f1&vXkkXLBTlNI&B>#GoYct%%A{Xs=@erEr4=U#*zGlf2amX)Kr#M(g#0MhinE%UG%T3nA4+N zi0NoqZiUu+?PHla-MquXRD$xfBtrlV1tMxXCCX`Hz~LCS00WVJxgfL!Uil;C$!mUw zWdC$KE?uWFY^^qg8T`)QW&I4k73I==qEH@fLz>~|J@hN7p*gnBq_0YD!smRA*UmUR z?wqTySW7E`hhk?xqu>HDYu(8}F9Q?+07W0m&}hLDIgz=P)V=xRcM@A?szW_n2+zcl zhO%~pi4~<^00V^Enw%oVurs>yI(-4|yCIWM6rw*LMcYKuF81?j76=!O(-yrnH1c~{ z1GFua^j1v+7Hf=lt){}Dr$HgFV9tNVfnW=ioDW8uxe)Y5y_pXa*V|BTdenee?7wka zNQ!xI4)6G5tg4i36btv3Qc&Z-iNJR)NH>^q3j2r5$LDu>h1wY?1u2RQxC(na11d!+ z#5k>uSZ-!d$z#FbedlL$=jHtjz7^%ti9{c%3)JRocD|KL)aFtJ>0!ko1>GZhjjli#fX8#XmC}p=00hJWbX+!8LVHvvF%Cap`}=hxhn$JLrN*fxj4O<7wcB(CTI*mT722@A3T zLXWFAgAjjs;j&1|c!pt-)R-W`RvGg)Bx&tjLC=uH?QxCfi$&;Da5w~do|swAhkMXFv|;U=uYN%?2TCmI4my}Jp)8rgk_PW8TR;Fmj;m-fnbrda zQP3hBF}R2@3>iDQMR;+J$~G7D$GI>g|ME6-iw{`H(xm5 z^SW}b#FjuhwEzpntjMOo82z7YQz%sWA(Tvj8JG`EumBT%RGF|Ju|Z-&^{Ub!AykZ+ zr69YTbcMg4E(*OANiMTQ2<2$C{P02Qs|oj}HbOx0uSX#aL++F;;FpnlF>@lO3>jQ8 z;Dd(6FOi~st!DjRTr+g(iwme~+Q(ue3Qym0w{JpBN!j9Ls=*-i4(4qO)s8B-MSXOu zH2g(dy8b|+15Zt1 z@UdE_gaKFLk2Jr9*PXGXrMO|5oeagAKjJ!DqlEm*%nhy{@ z8hwVxpY}QsID3aCO^;_|mtb#nNKmkYTan)*7B^b9=5U&ZiMo(jm8hqJMuQnNfN@k- z)bZm#$rCs&ENkD_9$Z^#G^qSC;c<>ujAvDj4jq|D^?Z~@iDa-ON@NAYM|a2wS@tqr z(2Lh=tW_NA1pq*<2EpS5|B++jc0+bTQ5>JR#sSp!)%vUKjZtABmLuA@wvQZ#7?z8L zYv8L@mV152YEgpt=-Nf>quR>UI38vo0000e%7C1kn$vGNA)^TxH#0R-_g9}EU2{!F z_=mgeXWWc~000PfywGj4c{LXGha0G8RU9RM=5a6m3ZsNpT$%Q0jIv170Aznk zwDz;>Dsp@^rllGJY&HM@0000MEOG<~iq?s!kW}bdI8F|HP`?IqN`}t zkCfgVs+p4hMIIK<9c$PEHpP@oLO|9Jdd|tmUfcix00beyfsA2b07!m-pg((0|B+wu z>Hfj6^YexDJMka%JMka%BSjfQpP$O<3@6)3;a<$#|@)FbF?2|!|hjK3<2SJqN z0U{qx3V%ulKdEHED=?qb@0n|}zd0kWFKYIPnyF-_W$5WzV21QiPDBdPiLZ8sGcp}_ zJn(c)5B-Z}%JyNrXT>Z8+WF z6MX;x00000tdxk^-xpOiSh=FtSgJYF0Hmh~bb`>fcEAJSH~;_u0GO=AKzvTa0C>5Y zKiR1Nm8Aw{~g|Yc?2mTHPrL5(x>h#GM{~%;c<>v_5xWwjm zh+UCgJ3s&iTBy*8yG(WU47s~#Q&C43tz0c$332YH^LOSeIbM%4!isOblyCgD000WV W-f$Lr^d!Il00000000000000P1_Vj~ diff --git a/app/src/main/res/drawable-xxhdpi/bg_energy_dialog.webp b/app/src/main/res/drawable-xxhdpi/bg_energy_dialog.webp deleted file mode 100644 index a98c71b6c91ccca5cefc832e8ae1767adb40d103..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5850 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 diff --git a/app/src/main/res/drawable-xxhdpi/bg_energy_house.webp b/app/src/main/res/drawable-xxhdpi/bg_energy_house.webp deleted file mode 100644 index 3457cb9ef9671dbf4f04b8981206078c79d1ab85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 31496 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 diff --git a/app/src/main/res/drawable-xxhdpi/bg_personal_info.webp b/app/src/main/res/drawable-xxhdpi/bg_personal_info.webp deleted file mode 100644 index 55df36927106a49262f6f0ce9ae8d8a9f37b00ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9598 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 D4g|Rn diff --git a/app/src/main/res/drawable-xxhdpi/bg_quick_login_dialog.webp b/app/src/main/res/drawable-xxhdpi/bg_quick_login_dialog.webp deleted file mode 100644 index 8a663f076fbffa50de0e5b52002f98bfe0f1fda9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14948 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 J3R3{U{{hRBolO7$ diff --git a/app/src/main/res/drawable-xxhdpi/bg_view_badge.webp b/app/src/main/res/drawable-xxhdpi/bg_view_badge.webp deleted file mode 100644 index e845954f4b0830f0c40180b323150dbeccece14c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10652 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 diff --git a/app/src/main/res/drawable-xxhdpi/ic_login_logo.webp b/app/src/main/res/drawable-xxhdpi/ic_login_logo.webp deleted file mode 100644 index 16c8241b4d65ddc164db8781e9f4eeeb70ab2447..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16076 zcmV;-J~P2mNk&G*J^%n$MM6+kP&il$0000G0002p001ii06|PpNFodX00HMmHb9~N z{~UWnWT?ue$PD~p+qS%kwtaijQlk`icNpB=8QjP5;_mLwGmg8o=ncW$y@M8acfA>` znjHUK$8lcgl`^>=C!+ro051+H@%`9UN1|`Ph@pSzm>0LB53d~aUGZRic9Ylt`LvsS zM)#@dUx$1~!a5y@C!aHJU&j=m1!sdbpU6l3xT>Bbsrk3NMn3J8HhxJdpxYhtd2e+N zNHX*{SO*OQOEHicJ}xlKOzjgnr}HjaGo*dM%R zkcWJ7PhanF{7gRk6mM`WCLeyD7yL{<{S?avk&oZkqP8Ai&+~&NW#h=_k11(E%G+cE zZ=}%YB3rmdTQ9PST{UHUZx{Z~tj9&RagCPxWFu>92)tz{t|c?qoor<%Q~r1D#Z5mm z9mr<>WWssfZd`V#H6+_vS8c8RSfP|M#(sPVRq0GNw7tqfJF-V1G~SNH21^adme!Ge zu_sfdGxj7(2yxq!#6Yej+0-K3_jaWPH_omM=T_U5rQ8v_vWJVdD^c8SyK;$pVOQ>R zF?Qt*M|Snom;ZhF-qHfY-%?em~ou97iVDldwbEsob$AuIN>mda&G&O zSQ0wt+J_m?n(Db-coL=uE$u=R=$>g0euMUa({>;#nLgxs>-)XQ2`g*G`Fb(cVC}bV z-!8EQtnTUCb%FIGe7Pa;#%^w3EioM4*)rBQ`_vTPTH}>3_M$4hH``I)>rfVWv;TCD zZ{?Zd2QROG-FM}n;eWJS$My1w5K4FY@GwX&%T;S(p7f&Hrpy9$rqS> z&sVuKF&{pQjv9*|_#XEcR&(Gpny>4>9{COr*L2B?&v0nbW&?hn8{yiq{~vmXD`M`? z{hJm|jxYcJ^8e3f{+TY9Yi3@_uls73%k^_6F2gjJ%eA0_O2K6=v%gmcP;r&Z!g)=+ ztLkc(v9Bq|c$ZiIRzk}7hK$cs2~&u@6=ZN;AY*)Sg*9Z}-2*s9)=rm_wH~6ixdYBx z--{23@BY29Wlo_kd3pTTLObHS36D9dW~fd4M1`XoC?*ZwTI9(mbRo^P(3`Z!x8{a= z8$}C^gw0$qiB$~03jGwW=%BixWc3fi3|);8sgE9UkzSV|1b^V(2Qc}iEQZTMUWI2` ziWRb~oUm3`QS7!L!NHvMx+noIj%qQrgjffF9K=UMFGm-qKpY2g9b8Nx)!=Y`fl2Vs;YB}lGeMY=?8 zli`B!Er6eea^~_7{~jhYCo1L8(O5XntrxmU#fg6(0!$T}Tk?ZKYAbMndzTEr8=)M4 zi`)a4uP$6RGl*2$qb=Bk5ORIe-m9eoH1u4`68@j%onONlXW1Cw_*8Ho^`w z(MmU=bAs>(cULGOIG+f$09@i?{FsTSPAi^Ld?|f6C7u?y<5r=qn)9*R zP`u>cITWHb-4a4S3SR-JCyZpqCxOyRNRvBv?%Y`cj1^`8K!)78bLY+oo#%w=YG0H3 zH(|sdh2jfMhlF;-p9X+FLUYFDeePf&-^EwrYdJ>v^jdr+KG|N}&~@q3rOTFm6gDke zwro)iVTFm(rGz;O0Uk}OguOyP!)zfxbHn?t1DHzQ{Vpd^m~=kmLO+;D{f*E?AqQ#x znak$p5;7R}a4}Biw)ZUqu*J)0JWyZDQ?4DU{~N=E@(Pu7_2q^UzYWIw+&Qqt#!Zwb zslJppO%f-HL(&7dg==M_fmOi z4R(85E1-|552v@ToX%u*n{Z(tcNL0#gjrytgbGY4;@<`tN)SK7lI$cV2J0zJUjA1A zFiy?0u2B$DWeZ}4690hv8TYs~D$|5v+yfyi^M|kq#_xotmeiB3LT>>t+m;c)c%`T^ z$$RepL_{~|76&eJ(bu@{0d8)%N~F-5aU^hweg?niLN#WLkQYGu5z|zss_u|(PL-$0 zwE>h3H+D3xkk)kMV}wH;JBEjchksWH#w-gqZ{EE5m0@{cho>a3t4I9M7_MFc;v1{% z6{<5Ch<^lQL*nl`n3dcoCx9iC6l24n{+AG!1#B`BCqd^WB3kS}pLDv*5ud+-&>ZmZ zy{n<&iZHILal8=4tPv)GJ;j{?fNM!2K0vKHiOa!fle%d6o9Jl3eA2qVGUpEHC7i9% z?g~+SasY1yvl|RypM(P3J1!DHh&xG~hx&G@xKLKAry~WCyGVP|8{V3GfJp-XA_z!M znr9foiH`!CnfPG4j97nX2KQP`sr83q8=b^Qb&hlh(x z%XJrW0hp3Bsw-uS7cN2`CA@*o&h)~$lX;mH#+g!c?Bm7&i=_uG!TzYL8i0|+Zvy`( z_uc^@-JTVl;~;e*qv;UtcN;$dO7mfiGcM#d8?%;Ksc7x5XPbFEMZMn5AJZmh@TB$B{xGy=AVdv z+=87eOhu|#A&=05_yd;oCNUw%qT^B(rOHw+AYeo+5j6*}Tj3-kIn_650UYD{X$X2w zy5ll+A^r$Dul#**>u&!dai*RQv&VF5*d~JH^RTuuiBV8)Asuhr^Cl6|%d`N_C{W{c zcT9B!fG1oN4aG=*z9T}{x@0z7OG`4n)S@-gw`$>%cr70Q+*Nsd*Pk#Ui@^D2p zG|-ojm-yIJJxmqUGSghRHEH67JAP_4&FoJNvIpGagx4Wb%Z8BlYgsK z*5f>EW;m=(7t6f~HGyd=559(2<&T-lQ&R$kyNvr~c*8J=J-Asq7VDc6{DL{*0Fe8X z%0g%kT`&>~Fd+Q4kkQ6Xk_7`%7_^CFLq2Cv+jpO#12$3%244~%}@o(e0I=>qB> zQn;8MRy%)ABzoT$=KaS0P2{;fEA){?Yo^{m1ry<==#Q0_&%7Kdpb; z{`vp^=cn~wun$yvJIxcsKQ8|<{onkT{?G4!|NsB}^#0TQNAlnKpU|Jt-|_vxKZ$=4 z|1bT!{Ez=H@m~x7wm#szz<)^oz5gftSMUG+Z>aC+zv4fv`;-3f{hR)W?9a#t^ndRk z`8}~e#{cN|1^*TP-~YF`5A!eYzwy66{#$?3fAaqs{?Gsa(Le21?ce*~kq_s;-GBXm zr2lE~0slY$|F8%B-(x@E9+~|v{@wkH_EW&0>>t&CvVXPxxL+^- zCH)`!r~TjW{+^%4`WyB8{TH|g^e^ZC?8RX^RM+k+5gc0?f)zP|Npn# zFR+i=fBydCKdN8w|2dQ2HQ$2P6?XJ%B)`yKQ(9CyW@7^gYGyHlHyY{tHp4(o8^f;G z8~?X)og0rO$pd(AwhpWQ_Dk(eV8W`LAL{dU0$D5$yHfyiJaE196-NSn_;QC?4YbZw zjCQsjaE>OD57Nrz@1r`X28I{UaMTxNTyFL{i>FOO+rOx#Ll{#-@Fk{|5v7B%SFt^t00SBnZa`~E>S;D77WEDkAj1;vD`L<^apA&)25k zP8Fh1{+V#$oUZvoa=^5uq^2ZgHz-7=<&?~1Ak^Y~ARVAgbhLXElZ0cuHW8ID^xuNU zx6!Be&Vjccsac^^QI79A!j)Y_cI9ui z+ulC>jcaMDiF;}G$JYgCT#++oknRacyQrfAfu}m6er0)v2-u;wUA%tP!TX5X@#6lg z(537Y6rxqE18}fI$yc>mNgLshnv;IRjKnL^N1@WR5qZ^FK zF>2ezLQ$m6`ul!E1gRa@5G{*Nht+KOR!K2AXtSm2Q!x4mKLxE&GQ9II*h+2f=Nx{= z77P%53LPsxcVTkwOHiBzO$c)i&e{s8MROg)tQ~%#NW(#opGAOJj%q`0CN5Pa8$=z` z&UDOO^2JJ6^(NSIjy+w+?8e7~4mS_5@(Jb&NtGrqu)7GHa~|B{93APNJqLeKw*n81 zrxEcNhRHIXGvPI<6p^WC;KN2z9_)bdaft;l{>lUeB3J}%)&lqltK>mu*uXbSJSEZh zk;`ka|KT-ifJ)%E5Qbc?j2!=g@$uuvAoe>^0 zQ9L!wo405xHtq&Sx^=e< zEX`;qXoIeForc}9jea|&4yu!WKCO8-U~q^P1-4#N=&VWyW*SP;W*y*9I#&?>P99fK zvF5TvQFgKd@r){RkM$4l>sBO(k2S*(CyEW}_pl@X^YQ1s9dpT>lyFcZVg7r|&-r{k zmYzOZ$gb7KDv^;2tY3T%Oj>GR26qnz8M(_^R99=JtP8@W+oY&4hS7l}nX>DU@UGmM zipPVGTBn9gCwU*|xI8?eghyi;bGONc~QQYUF6Qqx}slnj<-`wB7&+WxK z+`8-?MRTx4EUxD&N(Ca=A8=Y20k9gR?qV!M=I4^-D_m4}O=fisU8FS{Mg?mW zdMp(FZeJ`lox=w3X)7vwatP|C`Y;elYsX62Rvj=XX*j(oxgOd;cEW%M;XbNPi&?7e zUR^$T6uh}Y@?O7=o*Z^JZkjJffae-_RK0P=>O}1=bXmKs226A?#25-0_jwJSR+QvV z-m{z_k*`I_WC|W-QS~I+%4n(1<;g zCDxabKYclr6(qhpGP|fyaQeeZl75}IjsfmDJr~{H(i2Z9@ZcFhFE>I+ zT4nAvDfxMK;ngtg!if}v=w9=3vIWu$W>{-zMy%lMC)ZaWFD=06NvDPJWGhvEKfw@1 zp%)G@EOO_mm=Bbi*8ODl@1a?RYMXSJpsW2J;27t3`eC|}vIsL? zQ{VZVwFm)!OG6|2aW_pc9!fc3Nq9w5AGGg-vv$kYNJdkQm*9?RKOcP$Y%(pFUkHOE zmV@k`ffmpu6#eW3Hq|uu8l~0lyJM7W=l*u=XRVho7JA#Va|R%4b;FpvcQt25Mv3`?_jr1K(A*TAT{Qjp#lSP*gkp;=I~XQ0G@*P z14J#h>cgm1`|Edf_A<6}CWe9S`C$KT*J&_zgwHaIR5;zi2y8k|(zUo8#S@W@d=Ir$ zk>evLBwzrH%tY5B!(OzPK6LqyzdeGT<=a(WQBBUWDde#T(SIJ%S@$W=>=*!j+$u$_ z%eoHo&Rs)jzHFnFu1bzS_XdeFm-(nLBRHoK&)ICI1^lHYM~oF@8vFH()jLZRmqoS{ zdCtaGqBsyUdh4}-r5E!^Uj55j2|P^$*oQj?&vfG8nuc!WX0hko!)M-q8Eia)Sa4AJ zyh0MU2KP|NdH#o7w9E(kf|>95qSw{@@@natF3$f|cZICpi~jRG&+6-0er`tzSUPFW zUtgJfoudp!Kg!HIMv_GJK+DMEqJJU7zz~NxQ^&_(016tkHdKj@qU#AU!;I-1VB^XI zI)&M5rW}?lqL0p`p^c_wXQhqBlD_Y4Qs%!h{7^HMjKc+Z&8PQgqh(3P4Ms1O=WH6q zI2#(-bN;R167R~Pq-D}O*Xb7W8b{sq=psGiN~@=IX5uf?Q%sOaSmIjnkmB+%R zP8gSKIslqs?-U2fvYy0&+7~e6>*%Bfhu0YJP4FxC6t4*NR9wDEUPJE_W!b>Pk%91v z|GWXKLU)R)dPLqhfyy2~wqe7%yW5&@JVhis)tH}@5(nZ`5g-CrWIbtdsP1aMT+IuR zz-3!P2i5-2SESLpZ-_zY0wqm`6X%mxT4#zNAs6z_QmzVeDqj^Lw-F31c(eq6h+Z%^ zZ|i-&>G-1rhrX*pkor59Pz07Q;n}XZL~6LG6)e{09BEC|Vq2s4s!L8VM0kV5S3@d< zN45)o58^FdQ7A|(-FO(W5%yQe&^B2y&~FwQ)A`8uF-eeE133Shh(RE&fM$n}v7!1>der+5McFSyE zx4(}AY#;yX@kwdbyScQDdeuBlZy3)2z$n#`$*3DVqcAI2bU$!sTi+-NlG8Q7kx_}- zQwRN4N4?$*h1657llhGkQ3YlIrt|QWxvV9}t~uz}wbtmIZd!7L_!p27V<_5BBtf3E zYX|QS5C;}(IyHR{3OY?iIX&ZjFrrH%r0`4pZZujOzq1! z3WoI4+o#ve!M-p^2f$^0k#FOV3I%-1KnIL3!qm%fuwQh!cl&|!l2H2`d={c&p5;Yy z8U%M10D@8Ev(pRMjGB#AO&oQiA>R=Sj5c`wk&Oro=bKiRWE_np))716B4jJdwU=ZSY8)~dDGu|K|+%s;z z1M^1weNATa8;P%|%x#W-{&%k#_A*sr!8#v7922U7 zNau9JW#8C*1{y^}Y?22@FaKG7hESy007}Q8j5cE$-F1yDaQMi_m|(y^S~O9>=~Y$( z-)pt{<5j?=zud7LODdf`U#l~TFQaEnu~%+8?K*s8Mz}GD!gvJO%u*NNZaB*fA+m6(pAo1bK*jys9OMi}5Va>Mnn#l`ke4 z{=#fNw_&+C4`@Zsm92RYEhybId-+wT>-PcRb3|zQiwh_p+=kTyLPOi5B6F*UU!r&j z1>@&^)9Z7Q60;&@0~ZyAqX7DtIRgXx?VRMA%m`DGUi69Cx6ZS*4|NJ0s^UtQWiz(D zJ5Ze-X3te9IV293aVJ*e4zlAX3!PYE-g-GaBI1w|HekNK8CCNus)ZG<8yH2xt}m39 z6LKBc%-m2}PRh%8BVT?K6;%6>s!I5iQm#=8dKpmVKLDxI9@oqh0l3A)nc@xy)xnU0v$e0Z$ zzUJszuYsljA?VB&sS{azgIKo79Nh3z?B)eFTG(^%N;>+Ls4C5ZI2JQjuc8)gUcB7) znAwhVsTC2K`<2p6I-7pYN4mV8KADR6eiO0K>5~ZNaFyh+s;W3KQNBcpiRIP7D%cLE z(l2e4qb5)?f(LTDyUY@6|2s`}A00*LsnRbNa1_e&4>92-3y-h8j6*n}O6mZ3YTdqh z>(huit*@{Ylb1tV`DV^69omiQCaVEO%wTMUEfvbi$USfOCx_H|e5tLS%rHkT-4i=myr+Fth&QL~rtGQqKQ zVOWdnp;5lQJ|$(*Na1_K6!PhGBYi47?_(}7&7q{rK5cJFO9jKMhRax0qeJERi|Hk5ui}p2QVzi;Vu)qU~L#kq<+)f2j&V# zV#O@>$h=+%yo5Q^dH0b`B){6!j*!PsStbfQ2Cv-iQ8)kxoFk~@oIA0TYl+5hk-tXJ zYXs~gDm|)<1SX3Rev*Fhg23QcXnOin%e}Q=FrG1~8#D69GpKXzF`|~NN$h!obhUvMN65%f?>xU(7;`qQ@XC>s8R*$Sp+Q$jlZvUSnr&_ zD(19}lSx$o_FaJtl6rCe6HHKR`bbamoVUt04kO_ISpogYT7ZF`qQ=sz?QkEM=VZt-1Lcs#|IqdlO7LypMq8f{+=nnb zYYSYK?7dt0`>_jc$k^NZE`V9zM#lyB{i`+}cD0mU^Np4{$ zxbC?u$!z>gvTMK68STG(QFED+<7s(D?Wuz$2$b;1>H&b8eKI#-x-;PJ2JRT$)oc^e zeQ*zSF3xn;;K??0v>lb^gg)DNks2i_QURA8szJ~?A=4ZLkg<>9EL>*}2Ww$S@v(iQ zT&rOW&!U`tAXB3+MPh>L-TCeZTx`8KExlb}W3muO)j@SSD#Lkp(!ouBEToc1!F8J| zo*wnuzZTM}?Tgw;!jhtn5}K3$VDG?6=|VB$+i7ORZdxyCnChfiBP51nH;hcZOs#2e z1coSfw)L7=kShA4;AD}?^(w0LWgJ3|`8}avvvBd$w>l34T5B}b1!+`}_*qUx{;#X` z!b~3|Hw-9MrZx85N2jQ^jJ`@@{!brTqwpyX(q<6;e+Cb z_X}Dq{aX!htM4bG-$;}&`mjTZnCmcCQ4$=nW;5!)KW8PGJ|lh;^EyX!n|rx?GC+GC z8u>~2Y%-dI;I6g=e1__j^uQ8Ds!)$8ABc9yY+cV(Sr4W+qFl100OveNIm@g@jd83L z0*sD*u1bN1=l$VuFBhG_F!r_WD6i=AYNTr!o-HlIkOlh?^BWhAURGSGG{VcWzrFSG zK``}4&cy?;OZ`a@^K-6XR1;2=m(h#L1_#HLoxU5&2!wjAk9~6|!D88E&+k&);B(|e z@`lIFKuXnw0SaH4q|oVqTvRK?Rq@>9E>Q%ke_MLQIR)pNKalVakDU7*sz1{{7)Zw# z{|5^vA&YoTXvyjvezz1CSkgK$eZ~*dT0YIfjfiLRBJuL%?&lJ&*1yij6_F?g{*7|;JhOju_>Sb- z3H=|J)_>aE4u*ye>u7-D;Z24>}*Je?xE>Ox1G_S!=>Hht{f_TBA9YpS7{^0z}Jh)hxk6cnr>Yl?N}N_ zyz{+PfJ$|=B0oLB7^o3u>F&tiJSLPUcJx6Iw-7V?nWSTDS5G}qm=QFyU9_^DE7k zZG{4Ln$eo*GxRb1^cmTaxprrKf(nngf$d0vx|w?7mIIOwjX?DUh67F^YfBKc3Z0uw z>L@ymG6{W19+At9_?TNcHs;)BWfJ<|u~#qnpTtboxM#q`9c6HKs2?ly`4>YAW0D#~ z0x=!KLS1K4#&im3PXpO*kYI#fBdN+t6?D!NBmQ}&Hh+MgtED~oBmCEyw`pn9kKX6#v961WS3_bEq2Xs18EkX0u*2)ce zIst}Nh)r@i6AXaLi_m^W1MZ)AlWtVpWIyP@{$~f+zYl!z^WM@7P{W#|B?5LLOEMQZ z1W(zOxk51bk=W}^w8~SBynVqm?VMjIkrN&*F*24?PMKLBmqfYSbqggoI#7K%o1T(1 zmTnSIaK2v@b4u_Kc*P>dAyguM)6>llqCTo7(s4fHi@1IniJW>7pE%|y4HD?>hOs;x zK+&7waCS{RUQEW0PU-Mr2_b5&2}q={_F%ytw7fV4ac}23kpuX@Xbl90F}a zzt6zgz9>_%6jETstY>xw+)Y7|w`N5ZzZoU8(X9|Z>$N0jdldHb^A=BZN(769V_&>* z>T_#)pv(%pQyVWr+Dpc~_1$d)oe=DL26bn-rxBnHwcxsvEC_xJC6~UA2_ohw`g;Nj z8)J@<)_}q}`aiAX&`cdY;?MV^Uu4A31ZCnTD9xT>^i|ccDlWK(8!gznB=ew6Tz`&2 zEG)r~7WWZ5Sbn+2_T`vx;ZZnh$wP1;PsGaV=C;P&O$|+ne*bVj-9707%)|6VhIbLb z^9qd(hf@nAGH;mGWn;SFKsm>U?f``Y6_1HJ8EaMrpTZ>EDuIRNDx7_KJ{VogS0B(; zu-voUL4jG6Lyyg>`gV1+%y+F58$$4|O=my2dd*zB>USLfr9l_a$ld~(PzOnTGvRqZ ziOsY%%(+GkgdKeA8K`XRY1HW))_Y=Oaf+Y)CjAZ&b*8u8_Hz33ZV3jnVRbPFr)mV~ zLrFCT03<(w=-X;c6IvqdQ>;FckPIjM7~_-Qvqwv1U=kow;|n{4gfo2_&o-aHh$}&T zJE_?69C_n@6W66yK3C8lck@myKUJ6I2R(S|8(F3 zF!uNnT=X`Nn4S3r_0O~z#*MIFbIZjDZgzEhmomGr=f6W@x|=!^@Wt$6-@s=~WRmiKM*AANd^(BxQ%i%){)mWAL-kzY;6U!iRO6P>!8U0H=O3Zb~cYE17!Z#e4=M2ErC8m^#4bSYNB`lmC{tz3WRHxcB{Dw z;Sx4V2!ol_Pm)G!LWn)@bo`lXF3_PrEbwHPpZ&H_)1=yromyaQ7Rda4r)y4ohSdlQ z@>snavD>I3fPYHp#QRW1f`u)sN=V7b%d}-_aG4**D_UVr2?&*R7#S8)EXQ0|{Cltu zn)j(*-z$iTc)n{%t3qm>ZZ7>ynZs~XbWn5+>;5T6oITWwSVyB)q<{eEbAX0kQ_<#D zYy{I9S6_bfvL$w`eMa{EXn%0KJKx%|5DI0G^+~sKdh-45N~N#{;w)Gl|AI07*;^QI z2S+Xn=3wEFsoRjz9p1+qR8p)(UmeaJ0QUlVUg0=M)eR9s-KI-1sMcRKWd{Yu^Bz?y zIs~1of{7GGvD3;yF}#`huimG>A;@QQ9OA>JDzv$Xkt{J9db%f53;e$_NSpg2CJO)zC=|Oa{opO>eQZy zetyZ`Y%osyj!xliTV}lb*w)FQ10M&^e6d9=)ggT?;hdaWr;p#F3(|*V;|ZG)UaVtO9Y@Z$@@@Xt9HI#OMU1pALX5 zC=W|?BE_>EX9YY+yb+LON_=1Rem0VrtW#MIjmrc$*OCA##lpeMt{|_eAS@i1l;~c% zudMaqX0gBZHDx~yLg1e33$0WptdwGlM4;iO1U?mc)fUsKNsZn*&Q=CHgfE5t(i)me zN^`{g7%zLd8-|j?)&imY>Vja`G4 z=cgsPM?<-ll*wWCVLGi~LMk=TJxw={Or?)JXx`Pl9zX86wITjA`EWx1=QB%pynH7< z__2CDPl{7_8zInH_R^E{f@Xzyh!qRt!MZd3)Zpfw8{o4ccgb87B4~6&L&G756r*JR zVC!RKO5p?3oB3?KQVz5y&6vO$pw}iZeZnQoWG z;w!A?k>at>=LgFTZm;Rb`T@|Ne03&MW|wURQ$S(%z%xsgO?wx(nvYF6=D!(8(2z+3 zhRAJCc*GdomLlGM>!`UA!G2XEc1ZBxPt@3u0A%x`u8qzgWisJI!Qb9AjIsJGfSJjM z%gGp5D!vSM%Zm?cXM%wb3hw4-Ndy)v>70Op|6JvC4{SBEFQ$AE`rBVzzmjf^x{i_v5Dq?xTK>K4$^teul# z$|!#OY~h2cRs}t)!essaw>_b+YC;J(arn0%BRB?E*I@OZ&*y17BrP$G%AjmqC0RJ3 zi|gItqE?+x*#svs@~@9gDDw~DXw{?fq5uE@0002K3WXX0IYisw#Af8Zoy}WJyf8V9 zWO6EY!3ylY&{XDcf!mI_%B~+l!#zhC??Hh;yk3r;W5Uo%>7-e-OJa(VSjlgA1Dwcl zyvGJz(V!E%TBr#Ob=%0V(L3Qy0a{I9D-+^lznh0cgzeRyIy0*Bo0(?czejr_@9aR@ za@WIKAhc#hhPksIYSe8Zg0`@*m@Tc4UUWP*3=G1<_XfUxZAjC1X_J%^#ry!W;THg^L#+TnM>QGpo;vl15%wmWU$k6YX9 zqZ|oyR6;|~Q_hEe5b*fo5W#9*pV^5NmLc5r zexqsurr)Q9wO@NrM=}-TYTN`#q>dtO$0c9$aNFW*c811>UdE&^I`G9?a6S}&e_Y;Z;WCIa9Z1BW#f z@n^2Z%mK(iM;{($b{(Ak!<^zHT3TwI__NGwS-NSU?ld)Z^7L`^3liGIK#?`qBB^^B zzqA7O2eb|7uQOBiK~9YF;2YC+a*kK~U`;#!vJ;I29%1hpWe%;HI60y7M|*u{n4!uB z=jxz2TAW_}g2aLa{6)|s+v>itEphP&!a-HdyLy7SWex-}k&B717otPU651l@rU2?4 z5_HP-UX^~^_%Y`NYd0if)(tgpruLh2+myFX=ISyw7_8mXjia=(i%iRh( zD6!ikXxETFC^TG$OJ_~u>wZ5VI-N^pkwBJfnsX#MK!U=qJV$kY_1XoQeYug5*__EZ zdI*8^UKZ6u{`@U^ZyriAK&NQ3(zrzrN!$?POU~4%G#JO zrPB(EtVYzklaFgz%@5^rLa_rpBy7CjTy=W{ z@wiDzTacpZNi8L8!-^_-37?+N#Ud5mnH*1z`c6NyQT_Lm=HC+3?OnoH31?d!xEce# zkHDYEYO2@Jd}ANf?d3-ii(Bu(A=ii;=}5qFpwY)8lQhYq@j>JoN`xV3qgdnE#9rVu z?wkVrIYqr2b9m0yK7HnpgTsoCcx>a!v|If7gmslHBp^lpHxz^cENJ>o+-)_(qx@EcO3E8-D`q@3o*QoLa#~_?Q z7g3C-6ddngX^L?5fFJ@J1Y_R^o~No?CW+7fO6pejdHXX)*l|~o zav`f-FOnaJqNI@BS^hTA8G3O7y_OU_v&g0IvE{uN=P*7f$zyd?fFu5r3gkt^3=BMD zV6!)-76*S1ZH)z(Al4p0{$yjnhY3}U6%**qQtn|}a6G+}m8v&fsssksiZrBr0G}gh z_>Ij#G7NaO+?+m|x74ZD#?VxJs@0MPw?cchKCMfV45@4y?4xC!&iR#)E6}zitg>6o z-at%Qwxb!ech*cd=X2S!D-R~FD!H)Dc~w^DIPVIF*A(ELo)YkLy`SI^j2suVX6)6l z8DX7As0l&IL)epPR-!Y`{`s6$gN=F)BIJ?0;`OZDQ;zdKE!RH6jy77%`4EK-1`G5D zhBkoG5I3qWug`tXjA9w)y+2i%3~4|Ay`thqi-2#Negc08<Ug=|8ZU&i&4o3C%?&LaDAOHB(!s^!Y^c8%Z6TTpx#~xgdXFL^&Zm^x$w) zl%`U<-V7!yv4hELb4q38D!F1+w5x{DbtL<=Hk{|C$xM}dAUf22q^s;RPo4o&;TcA; z%EI`Xxm{HV55rn<6L+Ndr^@z!h>%7?lSm{*Kd`7OklE(&uuq3T?QihW_PvybTM`s$ajN=Ey^1FZ>Am~qcDq%27E$@9_}F( zgTVAlR0_{f0RoglPpU!ok!#WyP#tKj%vjDe1R+xs*MMFC7taCCa;k%$$z}{3n%fJI zrzl@j&;+|A?QdazgHBpaZpnkO_|B`TZE&-)nYiyD@rz@8CxdKsp!qWtF<+HR_5ps2 zKc0%Qz$^cR0i4>eU>nkThVpv`E4 z0MB)GCm$IaQn!{6#KZMep4_RxDycY+hBWQ6A;j)NdjI6+^Q5UCx9BMGCU#Rz*A-y58DzU8^KTb@V}?Jh zHq9Ud=kG-eFfku0_)BqwB$ZYFxFZYg41ARv%KFvNJ6;4=l22Wd_O1=tBs6~dwLBgT zz^_4Fy0gaPy|G_24nAO83XVj;V4U?BMrnq+5(@>1mZdw~ak>OT%1w}Qgkq5U}}3mCpL2n}KWA-YA#Yk9|dTB>#*yBtcdx7^oY`lKUV)z5Vup^yUk(rGNG zP!T*!yM#MKvYFu|hM;U!?^NzMHab`Jm(j!=&7r4`e1@*!IX59(SJC83D}U9Ny{$MT z)B=B?>T~!Smvt%e@s>fzi%)fW%Lv{ebkA3_%%ZiBOiI+ZJt(&HUX-ubi^uuhg<})g zHyy%d45KM|1LlP<0E5Mb2gRAN^On{*xCcvgz9+gDm zirb7f%i~8pz`OJ$*5JAMs%9{TiZ$S2;UFdC4d8Rn;*KUjN>wKrqm|y=HI&8Ib%gZv z3fPPdYtHoGj>nr-M@snzhUrXtij)_aLO^fXBdcqs(=mlP0d zuccj1{3o#U|6%P_sa?}bsH1#~zADxBng4R|^E`S88uZxBR_S{Laq$H~ZE=w&R7|jb zqw7xQ#F7R{p2-D7 z`~;xlhNr;(--`!g+mW>=z1ZVo#sGJGWBd_yR_$;b1ia^borsZH_X0zJlzAm@;N96Z z+J5bMfKFxAD$y-RRV*^qX`|~S$6YtKkDSSFKF2eq1`W>`<{hud6|xWjcnF$2YOXvG z*#jPW(c{dO(d$N4A&lH@p8>smwvUaywzq^CJ8*PjYvod!8_xoJjJx@h_>1eJssp_) zkPfbew60D<#4$_F$n6*WthZS>5W}~=NlY$w63kw}A|d_1H!YY;&ccM?`cJ8Og}=sG zY!r4!$xj_RQ%Lvr&n%)iW4MnC@TfU!=2~*^-S~wAyut@lQolR-`8PLUUa}VIa;yQe zJF^=Fx;-JK96=0mqV~1|RXs8h9cApW_!puOt1%44G^#6D(?=mOzGN(gdS}xCS+h_a z+~6z7q}0Hj5D%}R-3@ppPKdO(G5>1(ao_G|+Dj}!=x1B^{lIYKv@GgOh{`4!ybRdh z5uyNdKSYKeQ$l7sf?bvP=A>N~fMp%FX|NAnu>=z}@>vb6Ix{|(t-baEKc3i18#|E9 Sp!;w1%bpVwDh)D|SZaNe(k}jU?lqQ&mP% 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 diff --git a/app/src/main/res/drawable-xxhdpi/pic_no_data.webp b/app/src/main/res/drawable-xxhdpi/pic_no_data.webp deleted file mode 100644 index 08456bf8ef7c616a75f48369acea2f026670f7a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13442 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 v@1_F$@j4}xFq6tN From c80cd47ccc23081160998fad327cccca1752b367 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Mon, 9 Aug 2021 15:52:38 +0800 Subject: [PATCH 042/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200803=E4=BA=A7=E5=93=81=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=882?= =?UTF-8?q?=EF=BC=89(8)=20=20https://git.ghzs.com/pm/halo-app-issues/-/iss?= =?UTF-8?q?ues/1428?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt | 1 + .../com/gh/gamecenter/qa/comment/base/BaseCommentViewModel.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt index 5bf2baf737..f18b1a04c3 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentAdapter.kt @@ -69,6 +69,7 @@ abstract class BaseCommentAdapter( && oldItem?.commentNormal?.floor == newItem?.commentNormal?.floor && oldItem?.commentNormal?.isTop == newItem?.commentNormal?.isTop && oldItem?.commentNormal?.accept == newItem?.commentNormal?.accept + && oldItem?.commentNormal?.choiceness == newItem?.commentNormal?.choiceness } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentViewModel.kt index 9bf9d56f47..7283ce0748 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentViewModel.kt @@ -324,6 +324,7 @@ abstract class BaseCommentViewModel( val cloneComment = comment.clone() cloneComment.choiceness = true updateComment(cloneComment) + ToastUtils.showToast("加精成功") } override fun onFailure(e: HttpException?) { From 3a60a497e10d63f759e4bba14e4e3b7b4576811d Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Mon, 9 Aug 2021 16:15:18 +0800 Subject: [PATCH 043/151] =?UTF-8?q?=E6=9B=B4=E6=8D=A2=E7=89=88=E4=B8=BB?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=97=AE=E9=A2=98=E6=8F=90=E7=A4=BA=E5=BC=B9?= =?UTF-8?q?=E7=AA=97=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt index 0718f5d519..56a7fa8183 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt @@ -430,7 +430,7 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke mViewModel.selectedTags.addAll(mViewModel.questionEntity?.tags!!) DialogUtils.showAlertDialog(this, "修改问题", if (mViewModel.questionEntity!!.me.moderatorPermissions.updateQuestion == Permissions.REPORTER) - "你的操作将提交给小编审核,确定提交吗?" else "你的操作将立即生效,确定提交吗?(你的管理权限为:高级)", + "你的操作将提交给小编审核,确定提交吗?" else "你的操作将立即生效,确定提交吗?", "确定", "取消", DialogUtils.ConfirmListener { mViewModel.uploadPicAndPatchQuestion(false) }, null) From 2b617e2697144d84dfb39f146485a2df3ae38661 Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 9 Aug 2021 16:35:24 +0800 Subject: [PATCH 044/151] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=8D=95=E6=9C=BA?= =?UTF-8?q?=E6=A8=A1=E6=8B=9F=E5=99=A8-=E9=87=91=E6=89=8B=E6=8C=87?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=90=8E=E5=8F=B0(0809=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E5=8F=8D=E9=A6=88)=20https://git.ghzs.com/pm/halo-app-issues/-?= =?UTF-8?q?/issues/1362?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/download/DownloadManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/download/DownloadManager.java b/app/src/main/java/com/gh/download/DownloadManager.java index 88a4181ac0..3fd672a9e7 100644 --- a/app/src/main/java/com/gh/download/DownloadManager.java +++ b/app/src/main/java/com/gh/download/DownloadManager.java @@ -257,7 +257,7 @@ public class DownloadManager implements DownloadStatusListener { // 下载模拟器游戏配置文件,地址是 "模拟器游戏类型根目录/cheat/" if (!TextUtils.isEmpty(gameEntity.getSimulatorGameConfig())) { - String configFilePath = SimulatorGameManager.getPathByType(gameEntity.getSimulatorType()) + "/cheat/" + gameEntity.getName() + ".ini"; + String configFilePath = SimulatorGameManager.getPathByType(gameEntity.getSimulatorType()) + "/cheat/" + apkEntity.getPackageName()+ ".ini"; AppExecutor.getIoExecutor().execute(() -> { FileUtils.downloadFile(gameEntity.getSimulatorGameConfig(), configFilePath); }); From 66c19c644eea06e0e61f2020404c9651f7605e9d Mon Sep 17 00:00:00 2001 From: leafwai Date: Mon, 9 Aug 2021 17:22:40 +0800 Subject: [PATCH 045/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200809=E8=BF=90=E8=90=A5=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=97=AE=E9=A2=98(1)https://git.ghzs.com/pm/halo-app-?= =?UTF-8?q?issues/-/issues/1438?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/dialog/ApplyModeratorDialogFragment.kt | 14 +++++++++++--- .../entity/ApplyModeratorStatusEntity.kt | 4 +++- .../forum/moderator/ApplyModeratorFragment.kt | 5 +++-- .../forum/moderator/ModeratorListViewModel.kt | 2 ++ 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/gh/common/dialog/ApplyModeratorDialogFragment.kt b/app/src/main/java/com/gh/common/dialog/ApplyModeratorDialogFragment.kt index 789fbd76d2..2a21aff188 100644 --- a/app/src/main/java/com/gh/common/dialog/ApplyModeratorDialogFragment.kt +++ b/app/src/main/java/com/gh/common/dialog/ApplyModeratorDialogFragment.kt @@ -18,6 +18,7 @@ import com.gh.gamecenter.databinding.DialogApplyModeratorBinding class ApplyModeratorDialogFragment : BaseDialogFragment() { private lateinit var binding: DialogApplyModeratorBinding private var groupNumber = "" + private var groupKey = "" private var mCallBack: (() -> Unit)? = null override fun onCreateView( @@ -32,12 +33,12 @@ class ApplyModeratorDialogFragment : BaseDialogFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val startText = "版主考核群:" - val text= "$startText$groupNumber\n感谢你对论坛建设的支持\n请加入版主考核群并联系群主进行版主资格考核" + val text = "$startText$groupNumber\n感谢你对论坛建设的支持\n请加入版主考核群并联系群主进行版主资格考核" binding.desTv.text = SpanBuilder(text) .click(startText.length, startText.length + groupNumber.length, R.color.theme_font,true) { DirectUtils.directToQqGroup( requireContext(), - groupNumber + groupKey ) } .build() @@ -57,11 +58,17 @@ class ApplyModeratorDialogFragment : BaseDialogFragment() { companion object { @JvmStatic - fun show(activity: AppCompatActivity, number: String, callBack: (() -> Unit)?) { + fun show( + activity: AppCompatActivity, + number: String, + key: String, + callBack: (() -> Unit)? + ) { var dialogFragment = activity.supportFragmentManager.findFragmentByTag(ApplyModeratorDialogFragment::class.java.simpleName) as? ApplyModeratorDialogFragment if (dialogFragment != null) { dialogFragment.groupNumber = number + dialogFragment.groupKey = key dialogFragment.mCallBack = callBack val transaction: FragmentTransaction = activity.supportFragmentManager.beginTransaction() @@ -70,6 +77,7 @@ class ApplyModeratorDialogFragment : BaseDialogFragment() { } else { dialogFragment = ApplyModeratorDialogFragment().apply { groupNumber = number + groupKey = key mCallBack = callBack } dialogFragment.show( diff --git a/app/src/main/java/com/gh/gamecenter/entity/ApplyModeratorStatusEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/ApplyModeratorStatusEntity.kt index 5c8a70ab30..bcc0453de0 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/ApplyModeratorStatusEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/ApplyModeratorStatusEntity.kt @@ -9,7 +9,9 @@ data class ApplyModeratorStatusEntity( val condition: Condition = Condition(), val status: String = "", @SerializedName("qq_group") - val qqGroup: String = "" + val qqGroup: String = "", + @SerializedName("qa_group_key") + val qqGroupKey: String = "" ) : Parcelable { @Parcelize data class Condition( diff --git a/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorFragment.kt index 162603cfa3..73c7464c5a 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorFragment.kt @@ -59,7 +59,7 @@ class ApplyModeratorFragment : NormalFragment() { NewLogUtils.logApplyModeratorFApplyOrQQClick("click_QQ_number", UserManager.getInstance().userId) DirectUtils.directToQqGroup( requireContext(), - groupTv.text.toString() + mStatus.qqGroupKey ) } groupTv.text = mStatus.qqGroup @@ -190,7 +190,8 @@ class ApplyModeratorFragment : NormalFragment() { mViewModel?.applyModerator { ApplyModeratorDialogFragment.show( requireActivity() as AppCompatActivity, - mBinding?.groupTv?.text.toString() + mStatus.qqGroup, + mStatus.qqGroupKey ) { mViewModel?.getModeratorsApplyStatus() } diff --git a/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListViewModel.kt b/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListViewModel.kt index 82a8efcad9..df0f3fc78b 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/moderator/ModeratorListViewModel.kt @@ -27,6 +27,7 @@ class ModeratorListViewModel(application: Application, val bbsId: String) : val moderators = MutableLiveData>() val qqGroupNumber = MutableLiveData() + val qqGroupKey = MutableLiveData() val isModerators = MutableLiveData() val statusEntity = MutableLiveData() @@ -77,6 +78,7 @@ class ModeratorListViewModel(application: Application, val bbsId: String) : override fun onSuccess(data: JsonObject) { isModerators.postValue(data["is_moderators"].asBoolean) qqGroupNumber.postValue(data["moderators_qq_group"].asString) + qqGroupKey.postValue(data["moderators_qq_group_key"].asString) } override fun onFailure(exception: Exception) { From 8dc9731299175a4000b23e53783330140bf96e85 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Mon, 9 Aug 2021 20:03:45 +0800 Subject: [PATCH 046/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA2=E6=9C=9F-?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E5=B1=95=E7=A4=BA-=E6=8F=90=E9=97=AE?= =?UTF-8?q?=E5=B8=96=E8=AF=A6=E6=83=85=E9=A1=B5(0806UI=E6=B5=8B=E8=AF=951)?= =?UTF-8?q?=20https://git.ghzs.com/pm/halo-app-issues/-/issues/1347?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/item_article_detail_comment.xml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout/item_article_detail_comment.xml b/app/src/main/res/layout/item_article_detail_comment.xml index 369e1070cf..d91f6b358b 100644 --- a/app/src/main/res/layout/item_article_detail_comment.xml +++ b/app/src/main/res/layout/item_article_detail_comment.xml @@ -151,11 +151,12 @@ android:layout_width="24dp" android:layout_height="24dp" android:layout_centerVertical="true" - android:layout_marginRight="16dp" + android:layout_marginRight="11dp" + android:layout_marginTop="11dp" android:scaleType="centerInside" android:src="@drawable/ic_community_comment_vertical_more" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toTopOf="@+id/userInfoContainer" /> + app:layout_constraintTop_toTopOf="parent" /> Date: Tue, 10 Aug 2021 09:09:59 +0800 Subject: [PATCH 047/151] =?UTF-8?q?=E6=8F=90=E4=BA=A4LGLibrary?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libraries/LGLibrary | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/LGLibrary b/libraries/LGLibrary index ba2591cec4..2c9439afba 160000 --- a/libraries/LGLibrary +++ b/libraries/LGLibrary @@ -1 +1 @@ -Subproject commit ba2591cec44568b233ba7b73e2b4edac06b6535f +Subproject commit 2c9439afba8db0f90de2c1822a5c713f9e6e20e0 From cd4601a9c9141ad688e1409b3627e1f4ba7f65ab Mon Sep 17 00:00:00 2001 From: juntao Date: Tue, 10 Aug 2021 12:00:04 +0800 Subject: [PATCH 048/151] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AE=80=E5=8D=95=E6=96=87=E4=BB=B6=E7=9A=84?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libraries/LGLibrary | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/LGLibrary b/libraries/LGLibrary index 2c9439afba..6fafcf506f 160000 --- a/libraries/LGLibrary +++ b/libraries/LGLibrary @@ -1 +1 @@ -Subproject commit 2c9439afba8db0f90de2c1822a5c713f9e6e20e0 +Subproject commit 6fafcf506ff32306d449323189a29e1eeeb157cc From 5d8f7b3f8d4a5f650cb498c6b82f159b95750a1b Mon Sep 17 00:00:00 2001 From: juntao Date: Tue, 10 Aug 2021 12:02:17 +0800 Subject: [PATCH 049/151] =?UTF-8?q?=E6=A8=A1=E6=8B=9F=E5=99=A8=E6=B8=B8?= =?UTF-8?q?=E6=88=8F=E5=90=AF=E5=8A=A8=E6=97=B6=E6=9B=B4=E6=96=B0=E9=87=91?= =?UTF-8?q?=E6=89=8B=E6=8C=87=E6=96=87=E4=BB=B6=20https://git.ghzs.com/pm/?= =?UTF-8?q?halo-app-issues/-/issues/1362?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/simulator/SimulatorGameManager.kt | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/app/src/main/java/com/gh/common/simulator/SimulatorGameManager.kt b/app/src/main/java/com/gh/common/simulator/SimulatorGameManager.kt index 4212156931..ff93f116bb 100644 --- a/app/src/main/java/com/gh/common/simulator/SimulatorGameManager.kt +++ b/app/src/main/java/com/gh/common/simulator/SimulatorGameManager.kt @@ -15,6 +15,7 @@ import com.gh.gamecenter.entity.SimulatorGameRecordEntity import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.retrofit.BiResponse import com.gh.gamecenter.retrofit.EmptyResponse +import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager import com.gh.gamecenter.room.AppDatabase import com.halo.assistant.HaloApp @@ -86,6 +87,8 @@ object SimulatorGameManager { fun launchSimulatorGame(downloadEntity: DownloadEntity, gameEntity: GameEntity) { val versionFromInstalledApp = PackageUtils.getVersionByPackage(gameEntity.simulator?.apk?.packageName) val shouldShowUpdate = Version(gameEntity.simulator?.apk?.version).isHigherThan(versionFromInstalledApp) + + updateSimulatorConfigFile(gameId = gameEntity.id) if (shouldShowUpdate) { SimulatorDownloadManager.getInstance().showDownloadDialog(AppManager.getInstance().recentActiveActivity, gameEntity.simulator, SimulatorDownloadManager.SimulatorLocation.LAUNCH, gameEntity.id, gameEntity.name @@ -305,4 +308,22 @@ object SimulatorGameManager { .observeOn(AndroidSchedulers.mainThread()) .subscribe(EmptyResponse()) } + + private fun updateSimulatorConfigFile(gameId: String) { + RetrofitManager.getInstance(HaloApp.getInstance().application) + .api + .getGameDigest(gameId) + .map(ApkActiveUtils.filterMapper) + .subscribeOn(Schedulers.io()) + .subscribe(object : Response() { + override fun onResponse(game: GameEntity?) { + game?.let { + if (!TextUtils.isEmpty(game.simulatorGameConfig)) { + val configFilePath = getPathByType(game.simulatorType + "/cheat/" + game.getApk().firstOrNull()?.packageName + ".ini") + FileUtils.downloadAndUpdateFile(game.simulatorGameConfig, configFilePath) + } + } + } + }) + } } \ No newline at end of file From 6dfdbb9ee8d0a8555fcd669a9ceb76097ebaa01d Mon Sep 17 00:00:00 2001 From: leafwai Date: Tue, 10 Aug 2021 15:55:35 +0800 Subject: [PATCH 050/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200809=E4=BA=A7=E5=93=81=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=97=AE=E9=A2=98(5)https://git.ghzs.com/pm/halo-app-?= =?UTF-8?q?issues/-/issues/1439?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../forum/moderator/ApplyModeratorFragment.kt | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorFragment.kt index 73c7464c5a..c711820772 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/moderator/ApplyModeratorFragment.kt @@ -71,12 +71,7 @@ class ApplyModeratorFragment : NormalFragment() { } }) if (mStatus.status == "todo") { - mBinding?.run { - applyTv.text = "审核中" - applyTv.alpha = 0.4F - applyTv.setOnClickListener(null) - addGroupContainer.visibility = View.VISIBLE - } + changeToAudit() } } @@ -186,26 +181,33 @@ class ApplyModeratorFragment : NormalFragment() { } mBinding?.applyTv?.alpha = if (allFinished) 1F else 0.4F val listener = View.OnClickListener { - NewLogUtils.logApplyModeratorFApplyOrQQClick("click_apply", UserManager.getInstance().userId) - mViewModel?.applyModerator { - ApplyModeratorDialogFragment.show( - requireActivity() as AppCompatActivity, - mStatus.qqGroup, - mStatus.qqGroupKey - ) { - mViewModel?.getModeratorsApplyStatus() + if (!ClickUtils.isFastDoubleClick(R.id.applyTv)) { + NewLogUtils.logApplyModeratorFApplyOrQQClick("click_apply", UserManager.getInstance().userId) + mViewModel?.applyModerator { + ApplyModeratorDialogFragment.show( + requireActivity() as AppCompatActivity, + mStatus.qqGroup, + mStatus.qqGroupKey + ) { + mViewModel?.getModeratorsApplyStatus() + changeToAudit() + } } } } mBinding?.applyTv?.setOnClickListener(if (allFinished) listener else null) } if (status.status == "todo") { - mBinding?.run { - applyTv.text = "审核中" - applyTv.alpha = 0.4F - applyTv.setOnClickListener(null) - addGroupContainer.visibility = View.VISIBLE - } + changeToAudit() + } + } + + private fun changeToAudit() { + mBinding?.run { + applyTv.text = "审核中" + applyTv.alpha = 0.4F + applyTv.setOnClickListener(null) + addGroupContainer.visibility = View.VISIBLE } } From 79fc2e1f93ea949863f12b200b2dd8923b617c82 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Tue, 10 Aug 2021 16:48:20 +0800 Subject: [PATCH 051/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200809=E4=BA=A7=E5=93=81=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=97=AE=E9=A2=98(3)=20https://git.ghzs.com/pm/halo-a?= =?UTF-8?q?pp-issues/-/issues/1439?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/ErrorHelper.kt | 65 ++++++++++++------- .../video/detail/desc/VideoDescViewModel.kt | 13 ++++ 2 files changed, 55 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/ErrorHelper.kt b/app/src/main/java/com/gh/common/util/ErrorHelper.kt index 8b9feb51e7..aa8cce174b 100644 --- a/app/src/main/java/com/gh/common/util/ErrorHelper.kt +++ b/app/src/main/java/com/gh/common/util/ErrorHelper.kt @@ -19,10 +19,12 @@ object ErrorHelper { * [customizedHandler] 返回 true 为已处理该错误码,false 则交由 [handleError] 处理 */ @JvmStatic - fun handleErrorWithCustomizedHandler(context: Context, - errorString: String?, - showHighPriorityHint: Boolean = false, - customizedHandler: (code: Int) -> Boolean) { + fun handleErrorWithCustomizedHandler( + context: Context, + errorString: String?, + showHighPriorityHint: Boolean = false, + customizedHandler: (code: Int) -> Boolean + ) { val errorEntity = errorString?.toObject() if (customizedHandler(errorEntity?.code ?: 0)) { @@ -75,8 +77,15 @@ object ErrorHelper { *403057: 游戏评论 *403054: 更新社区文章 *403047: 回答点赞 + *403112: 发布视频贴 + *403113: 修改视频贴 + *403114: 点赞视频贴 */ - private fun handleError(context: Context, showHighPriorityHint: Boolean = false, errorEntity: ErrorEntity) { + private fun handleError( + context: Context, + showHighPriorityHint: Boolean = false, + errorEntity: ErrorEntity + ) { when (errorEntity.code) { 403050, 403051, @@ -89,7 +98,10 @@ object ErrorHelper { 403054, 403069, 403071, - 403047 -> handleErrorWithCommunityBannedDialog(context, errorEntity) + 403047, + 403112, + 403113, + 403114 -> handleErrorWithCommunityBannedDialog(context, errorEntity) 403057, 403068 -> handleErrorWithCommentBannedDialog(context, errorEntity) @@ -122,10 +134,12 @@ object ErrorHelper { 403056 -> Utils.toast(context, "发布失败,字数已达上限") 403020 -> if (showHighPriorityHint) { - DialogUtils.showAlertDialog(context, - "提醒", - "提问过于频繁,请先休息一下哦", - "知道了", null, null, null) + DialogUtils.showAlertDialog( + context, + "提醒", + "提问过于频繁,请先休息一下哦", + "知道了", null, null, null + ) } else { Utils.toast(context, R.string.comment_failed_toofrequent) } @@ -148,12 +162,14 @@ object ErrorHelper { "(非永久)" } val dialogContext = DialogUtils.checkDialogContext(context) - DialogUtils.showAlertDialog(dialogContext, - "提示", - "你因违反《光环助手评论规则》,已被禁言$bannedType,如有疑问,请联系客服(QQ:${Config.getSettings()?.support?.qq})", - "去看看", "关闭", { - dialogContext.startActivity(WebActivity.getCommentRulesIntent(dialogContext)) - }, null) + DialogUtils.showAlertDialog( + dialogContext, + "提示", + "你因违反《光环助手评论规则》,已被禁言$bannedType,如有疑问,请联系客服(QQ:${Config.getSettings()?.support?.qq})", + "去看看", "关闭", { + dialogContext.startActivity(WebActivity.getCommentRulesIntent(dialogContext)) + }, null + ) } private fun handleErrorWithCommunityBannedDialog(context: Context, errorEntity: ErrorEntity) { @@ -163,18 +179,21 @@ object ErrorHelper { "(非永久)" } val dialogContext = DialogUtils.checkDialogContext(context) - DialogUtils.showAlertDialog(dialogContext, - "提示", - "你因违反《问答版块规则》,已被禁言$bannedType,如有疑问,请联系客服(QQ:1562479331)", - "去看看", "关闭", { - dialogContext.startActivity(WebActivity.getCommunityRuleIntent(dialogContext)) - }, null) + DialogUtils.showAlertDialog( + dialogContext, + "提示", + "你因违反《问答版块规则》,已被禁言$bannedType,如有疑问,请联系客服(QQ:1562479331)", + "去看看", "关闭", { + dialogContext.startActivity(WebActivity.getCommunityRuleIntent(dialogContext)) + }, null + ) } @JvmStatic fun handleLoginError(context: Context, httpException: HttpException?) { try { - val errorEntity: ErrorEntity? = httpException?.response()?.errorBody()?.string()?.toObject() + val errorEntity: ErrorEntity? = + httpException?.response()?.errorBody()?.string()?.toObject() when { errorEntity?.code == 403099 -> { Utils.toast(context, "当前账号正在注销,禁止登录") diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescViewModel.kt index e87ed405ce..0cd66822b0 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescViewModel.kt @@ -17,6 +17,7 @@ import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.retrofit.BiResponse import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager +import com.halo.assistant.HaloApp import com.lightgame.utils.Utils import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers @@ -106,6 +107,12 @@ class VideoDescViewModel(application: Application) : override fun onFailure(exception: Exception) { super.onFailure(exception) + if (exception is HttpException) { + ErrorHelper.handleError( + HaloApp.getInstance(), + exception.response()?.errorBody()?.string() + ) + } } }) } @@ -142,6 +149,12 @@ class VideoDescViewModel(application: Application) : override fun onFailure(exception: Exception) { super.onFailure(exception) + if (exception is HttpException) { + ErrorHelper.handleError( + HaloApp.getInstance(), + exception.response()?.errorBody()?.string() + ) + } } }) } From e5778d5b5fefabcb53b75306a4b46c2e64ff50a4 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Tue, 10 Aug 2021 17:39:35 +0800 Subject: [PATCH 052/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200809=E4=BA=A7=E5=93=81=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=88=E7=AC=AC6=E7=82=B9?= =?UTF-8?q?=EF=BC=89https://git.ghzs.com/pm/halo-app-issues/-/issues/1439?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../personalhome/UserHomeFragment.kt | 2 +- app/src/main/res/layout/fragment_home.xml | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeFragment.kt b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeFragment.kt index 226662fccb..d93e75ae50 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeFragment.kt @@ -239,7 +239,7 @@ class UserHomeFragment : NormalFragment() { } userCountContainer.post { - val newHeight = userCountContainer.bottom + (32F + 16F).dip2px() + val newHeight = userCountContainer.bottom + (12F + 16F).dip2px() userBackgroundContainer.layoutParams = userBackgroundContainer.layoutParams.apply { height = newHeight } diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index 35306aeac2..55fd8e57c4 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -400,12 +400,10 @@ @@ -441,7 +443,10 @@ android:id="@+id/user_fans_container" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="24dp" + android:paddingTop="20dp" + android:paddingLeft="12dp" + android:paddingRight="12dp" + android:paddingBottom="20dp" android:gravity="center" android:orientation="horizontal"> @@ -483,7 +488,10 @@ android:id="@+id/user_vote_container" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="24dp" + android:paddingTop="20dp" + android:paddingLeft="12dp" + android:paddingRight="24dp" + android:paddingBottom="20dp" android:gravity="center" android:orientation="horizontal"> From 81fa6a62331d7ce97aff34d67335b1a494595cbc Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Wed, 11 Aug 2021 15:10:51 +0800 Subject: [PATCH 053/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200809=E4=BA=A7=E5=93=81=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=88=E7=AC=AC11=E7=82=B9?= =?UTF-8?q?=EF=BC=89https://git.ghzs.com/pm/halo-app-issues/-/issues/1439?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/gamecenter/fragment/LoginFragment.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java index f619a39187..f6aa862ab7 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/LoginFragment.java @@ -417,8 +417,12 @@ LoginFragment extends NormalFragment implements LoginUtils.onCaptchaCallBackList } // 第三方登录方式登录后跳转绑定手机页面(https://gitlab.ghzs.com/pm/halo-app-issues/-/issues/1206) - if (UserManager.getInstance().getUserInfoEntity() != null - && TextUtils.isEmpty(UserManager.getInstance().getUserInfoEntity().getLoginMobile())) { + boolean isThirdPartyLogin = LoginTag.qq.name().equals(loginType) + || LoginTag.wechat.name().equals(loginType) + || LoginTag.weibo.name().equals(loginType) + || LoginTag.douyin.name().equals(loginType); + if (isThirdPartyLogin + && TextUtils.isEmpty(response.getData().getLoginMobile())) { startActivity(BindPhoneActivity.getLoginSuccessIntent(requireContext())); } } From 2f354425580b2d3891c789231f1d78412ccf2e62 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Wed, 11 Aug 2021 15:38:01 +0800 Subject: [PATCH 054/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=200809=E4=BA=A7=E5=93=81=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=97=AE=E9=A2=98=EF=BC=88=E7=AC=AC14=E7=82=B9?= =?UTF-8?q?=EF=BC=89https://git.ghzs.com/pm/halo-app-issues/-/issues/1439?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/gamecenter/personalhome/home/UserHistoryAdapter.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryAdapter.kt b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryAdapter.kt index 28b38e43b6..4aaf858790 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryAdapter.kt @@ -95,8 +95,8 @@ class UserHistoryAdapter(context: Context, } entity = historyEntity -// userName.visibility = View.GONE topLine.goneIf(position == 0) + forumNameLl.visibleIf(historyEntity.community.id.isNotEmpty()) userIcon.display(historyEntity.user?.border, historyEntity.user?.icon, historyEntity.user?.auth?.icon) executePendingBindings() From 8ee76af30f456fc587e7bb2a6e75a7151315fb02 Mon Sep 17 00:00:00 2001 From: juntao Date: Wed, 11 Aug 2021 15:53:40 +0800 Subject: [PATCH 055/151] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=8D=A0=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/Extensions.kt | 21 +++++++++++++++++++ .../util/GameSubstituteRepositoryHelper.kt | 7 +++++++ .../java/com/gh/common/util/ImageUtils.kt | 2 +- .../java/com/gh/gamecenter/MainActivity.java | 1 + 4 files changed, 30 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/common/util/Extensions.kt b/app/src/main/java/com/gh/common/util/Extensions.kt index 508dcafb79..d1426f0a53 100644 --- a/app/src/main/java/com/gh/common/util/Extensions.kt +++ b/app/src/main/java/com/gh/common/util/Extensions.kt @@ -13,6 +13,7 @@ import android.text.* import android.text.style.ClickableSpan import android.text.style.ImageSpan import android.text.style.URLSpan +import android.util.Log import android.util.TypedValue import android.view.Gravity import android.view.LayoutInflater @@ -258,6 +259,26 @@ fun View.setDebouncedClickListener(action: () -> Unit) { val View.layoutInflater: LayoutInflater get() = LayoutInflater.from(this.context) +fun View.removeFromParent() { + postDelayed(object : Runnable { + override fun run() { + try { + if (parent == null) { + Utils.log(javaClass.simpleName, "getParent() returning Null") + } else { + try { + (parent as ViewGroup).removeView(this@removeFromParent) + } catch (ex: Exception) { + Utils.log(javaClass.simpleName, "Cannot remove from parent layout") + } + } + } catch (ex: Exception) { + Utils.log(javaClass.simpleName, Log.getStackTraceString(ex)) + } + } + }, 100) +} + fun isPublishEnv(): Boolean { return BuildConfig.FLAVOR != "internal" } diff --git a/app/src/main/java/com/gh/common/util/GameSubstituteRepositoryHelper.kt b/app/src/main/java/com/gh/common/util/GameSubstituteRepositoryHelper.kt index 0e73d3dfe2..c8c6a22bc7 100644 --- a/app/src/main/java/com/gh/common/util/GameSubstituteRepositoryHelper.kt +++ b/app/src/main/java/com/gh/common/util/GameSubstituteRepositoryHelper.kt @@ -93,6 +93,13 @@ object GameSubstituteRepositoryHelper { val game = collection.data?.find { game -> isThisGameUnique(game, gameIdList) } game?.let { collection.data?.remove(game) + + collection.data?.size?.let { remainingSize -> + // 记录被替换游戏的数量,10个以上的时候触发 + if (remainingSize % 10 == 0) { + SentryHelper.onEvent("game_substitute", "substituted_size", "${50 - remainingSize}") + } + } // 产品说要记录补充专题的曝光数,所以这个游戏附带了所在专题的名字 game.subjectName = collection.name return game diff --git a/app/src/main/java/com/gh/common/util/ImageUtils.kt b/app/src/main/java/com/gh/common/util/ImageUtils.kt index e467e58530..8b04fbad33 100644 --- a/app/src/main/java/com/gh/common/util/ImageUtils.kt +++ b/app/src/main/java/com/gh/common/util/ImageUtils.kt @@ -312,7 +312,7 @@ object ImageUtils { if (url == null) return // 部分自适应宽高图片需要一个 TARGET_WIDTH 来避免加载过小图片 - val width = (view?.getTag(TARGET_WIDTH) as? Int) ?: view?.layoutParams?.width + val width = (view?.getTag(TARGET_WIDTH) as? Int) ?: view?.width?.coerceAtLeast(view.layoutParams?.width ?: 0) val height = view?.layoutParams?.height var lowResUrl = "" diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index 021731a673..00b256d173 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -453,6 +453,7 @@ public class MainActivity extends BaseActivity { if (view != null) { view.setVisibility(View.GONE); + ExtensionsKt.removeFromParent(view); } checkDialog(); From 2496c1d96e40930e1403df9ac4dc6233a99fa19d Mon Sep 17 00:00:00 2001 From: juntao Date: Wed, 11 Aug 2021 16:28:31 +0800 Subject: [PATCH 056/151] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=85=A8=E5=B1=8F?= =?UTF-8?q?=E7=BD=91=E9=A1=B5=E7=BD=91=E7=BB=9C=E5=BC=82=E5=B8=B8=E5=8A=A0?= =?UTF-8?q?=E8=BD=BD=E5=A4=B1=E8=B4=A5=E6=97=B6=E6=97=A0=E6=B3=95=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/halo/assistant/fragment/WebFragment.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/halo/assistant/fragment/WebFragment.java b/app/src/main/java/com/halo/assistant/fragment/WebFragment.java index 47dab53c06..620dfc567a 100644 --- a/app/src/main/java/com/halo/assistant/fragment/WebFragment.java +++ b/app/src/main/java/com/halo/assistant/fragment/WebFragment.java @@ -15,6 +15,8 @@ import android.view.View; import android.webkit.JavascriptInterface; import android.webkit.ValueCallback; import android.webkit.WebChromeClient; +import android.webkit.WebResourceError; +import android.webkit.WebResourceRequest; import android.webkit.WebSettings; import android.webkit.WebView; import android.webkit.WebViewClient; @@ -133,6 +135,7 @@ public class WebFragment extends LazyFragment implements IScrollable { private boolean mIsWebPageHandleBackPressed; private boolean mIsOpenNativePage;//网页打开新页面是否重新打开一个原生页面 private boolean mIsHorizontalDispatcherEnabled; + private boolean mIsWebPageSuccessfullyLoaded = true; // 页面是否成功加载 private String mBackConfirmationContent; private String mGameName; private String mIsCloseButton;//h5游戏是否显示关闭按钮 hide(隐藏)、open(开启) @@ -408,6 +411,16 @@ public class WebFragment extends LazyFragment implements IScrollable { } }, 100); } + + if (!"Webpage not available".equals(mWebView.getTitle())) { + mIsWebPageSuccessfullyLoaded = true; + } + } + + @Override + public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { + super.onReceivedError(view, request, error); + mIsWebPageSuccessfullyLoaded = false; } }); @@ -571,7 +584,7 @@ public class WebFragment extends LazyFragment implements IScrollable { return false; } else if (!TextUtils.isEmpty(mGameName)) { return false; - } else if (mWebView != null && mIsWebPageHandleBackPressed) { + } else if (mWebView != null && mIsWebPageHandleBackPressed && mIsWebPageSuccessfullyLoaded) { mWebView.callHandler("onBackPressed", retValue -> { // do nothing }); From 799c22093fd3d399e59ec7533602ca8f6ba14c4a Mon Sep 17 00:00:00 2001 From: juntao Date: Wed, 11 Aug 2021 16:38:06 +0800 Subject: [PATCH 057/151] =?UTF-8?q?=E5=A4=84=E7=90=86=E7=BC=96=E8=AF=91?= =?UTF-8?q?=E8=AD=A6=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/layout/user_history_item.xml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/app/src/main/res/layout/user_history_item.xml b/app/src/main/res/layout/user_history_item.xml index 1581d13717..d9d94ea3ca 100644 --- a/app/src/main/res/layout/user_history_item.xml +++ b/app/src/main/res/layout/user_history_item.xml @@ -41,16 +41,6 @@ app:layout_constraintTop_toTopOf="parent" tools:visibility="visible" /> - - Date: Wed, 11 Aug 2021 18:14:56 +0800 Subject: [PATCH 058/151] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=AE=80=E5=8D=95?= =?UTF-8?q?=E7=9A=84=E6=89=A9=E5=A4=A7=E7=82=B9=E5=87=BB=E5=8C=BA=E5=9F=9F?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/Extensions.kt | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/Extensions.kt b/app/src/main/java/com/gh/common/util/Extensions.kt index d1426f0a53..adff801404 100644 --- a/app/src/main/java/com/gh/common/util/Extensions.kt +++ b/app/src/main/java/com/gh/common/util/Extensions.kt @@ -6,6 +6,7 @@ import android.content.ClipboardManager import android.content.Context import android.graphics.Bitmap import android.graphics.Canvas +import android.graphics.Rect import android.graphics.drawable.Drawable import android.graphics.drawable.GradientDrawable import android.os.Build @@ -15,10 +16,7 @@ import android.text.style.ImageSpan import android.text.style.URLSpan import android.util.Log import android.util.TypedValue -import android.view.Gravity -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup +import android.view.* import android.view.inputmethod.InputMethodManager import android.widget.EditText import android.widget.PopupWindow @@ -66,6 +64,9 @@ import java.util.concurrent.TimeUnit import java.util.regex.Pattern import kotlin.math.abs + + + /** * 创建以 activity 为观察者上下文的 viewModel */ @@ -279,6 +280,23 @@ fun View.removeFromParent() { }, 100) } +/** + * 扩大 View 的点击区域 + */ +fun View.enlargeTouchArea(enlargedSizeInPx: Int = 4F.dip2px()) { + val parent = parent as View + + parent.post { + val rect = Rect() + getHitRect(rect) + rect.top -= enlargedSizeInPx + rect.left -= enlargedSizeInPx + rect.bottom += enlargedSizeInPx + rect.right += enlargedSizeInPx + parent.touchDelegate = TouchDelegate(rect, this) + } +} + fun isPublishEnv(): Boolean { return BuildConfig.FLAVOR != "internal" } From 18f7b695e54e9c56fa08605b0a60008e01463936 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Wed, 11 Aug 2021 18:26:45 +0800 Subject: [PATCH 059/151] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E5=B8=96=E5=86=85=E5=AE=B9=E6=9D=A5=E6=BA=90?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E5=BF=85=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qa/video/publish/VideoPublishFragment.kt | 308 ++++++++++++------ .../res/layout/dialog_game_detail_more.xml | 55 ++-- 2 files changed, 248 insertions(+), 115 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt index fcd7e126d3..0354af5f3c 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt @@ -59,7 +59,8 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { override fun getLayoutId(): Int = 0 override fun getInflatedLayout(): View { - mBinding = FragmentVideoPublishBinding.inflate(LayoutInflater.from(requireContext()), null, false) + mBinding = + FragmentVideoPublishBinding.inflate(LayoutInflater.from(requireContext()), null, false) return mBinding.root } @@ -72,8 +73,10 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { mViewModel = viewModelProvider() mViewModel.videoDraft = arguments?.getParcelable(VideoDraftEntity::class.java.simpleName) mViewModel.videoPatch = arguments?.getParcelable(ForumVideoEntity::class.java.simpleName) - mViewModel.communityEntity = arguments?.getParcelable(CommunityEntity::class.java.simpleName) - mViewModel.selectActivityLabelEntity = arguments?.getParcelable(ActivityLabelEntity::class.java.simpleName) + mViewModel.communityEntity = + arguments?.getParcelable(CommunityEntity::class.java.simpleName) + mViewModel.selectActivityLabelEntity = + arguments?.getParcelable(ActivityLabelEntity::class.java.simpleName) mViewModel.type = arguments?.getString(BbsType::class.java.simpleName) ?: "" mIsForumSelectionDisabled = arguments?.getBoolean(IS_FORUM_SELECTION_DISABLED) ?: false @@ -102,17 +105,31 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { } mBinding.uploadButton.setOnClickListener { - PermissionHelper.checkStoragePermissionBeforeAction(requireActivity(), object : EmptyCallback { - override fun onCallback() { - startActivityForResult(LocalMediaActivity.getIntent(requireContext(), LocalMediaActivity.ChooseType.VIDEO, 1, "发视频帖"), BaseRichEditorActivity.INSERT_VIDEO_CODE) - NewLogUtils.logChooseMedia("view_media", "视频帖", "视频") - } - }) + PermissionHelper.checkStoragePermissionBeforeAction( + requireActivity(), + object : EmptyCallback { + override fun onCallback() { + startActivityForResult( + LocalMediaActivity.getIntent( + requireContext(), + LocalMediaActivity.ChooseType.VIDEO, + 1, + "发视频帖" + ), BaseRichEditorActivity.INSERT_VIDEO_CODE + ) + NewLogUtils.logChooseMedia("view_media", "视频帖", "视频") + } + }) } mBinding.videoPosterPatchHint.setOnClickListener { startMediaStore() } mBinding.forumContainer.setOnClickListener { if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { - startActivityForResult(GameActivity.getIntent(requireContext(), GameActivity.SELECT_GAME_TITLE), REQUEST_GAME_CODE) + startActivityForResult( + GameActivity.getIntent( + requireContext(), + GameActivity.SELECT_GAME_TITLE + ), REQUEST_GAME_CODE + ) } else { ChooseForumActivity.startChooseForumActivity(requireActivity()) NewLogUtils.logChooseForumPanelEnter("发视频帖") @@ -125,9 +142,10 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { } else 0L AppExecutor.uiExecutor.executeWithDelay(Runnable { ChooseActivityDialogFragment.show( - requireActivity() as AppCompatActivity, - ChooseActivityDialogFragment.ActivityLabelLocation.BBS_VIDEO, - mViewModel.selectActivityLabelEntity?.id) { + requireActivity() as AppCompatActivity, + ChooseActivityDialogFragment.ActivityLabelLocation.BBS_VIDEO, + mViewModel.selectActivityLabelEntity?.id + ) { mViewModel.selectActivityLabelEntity = it mBinding.activityTitle.text = it?.name mBinding.activityTitle.setTextColor(if (it != null) R.color.text_FA8500.toColor() else R.color.text_333333.toColor()) @@ -156,7 +174,10 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { } } mBinding.reprintUrlTv.setOnClickListener { - InputUrlDialogFragment.show(requireActivity() as AppCompatActivity, mBinding.reprintUrlTv.text.toString()) { + InputUrlDialogFragment.show( + requireActivity() as AppCompatActivity, + mBinding.reprintUrlTv.text.toString() + ) { mBinding.reprintUrlTv.text = it } } @@ -180,7 +201,12 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { setForumName() if (mIsForumSelectionDisabled && mViewModel.type == BbsType.GAME_BBS.value) { mBinding.forumContainer.isEnabled = false - mBinding.chooseForumTv.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null) + mBinding.chooseForumTv.setCompoundDrawablesWithIntrinsicBounds( + null, + null, + null, + null + ) } } if (mViewModel.selectActivityLabelEntity != null) { @@ -188,11 +214,20 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { mBinding.activityTitle.setTextColor(if (mViewModel.selectActivityLabelEntity != null) R.color.text_FA8500.toColor() else R.color.text_333333.toColor()) } - PermissionHelper.checkStoragePermissionBeforeAction(requireActivity(), object : EmptyCallback { - override fun onCallback() { - startActivityForResult(LocalMediaActivity.getIntent(requireContext(), LocalMediaActivity.ChooseType.VIDEO, 1, "发视频帖"), BaseRichEditorActivity.INSERT_VIDEO_CODE) - } - }) + PermissionHelper.checkStoragePermissionBeforeAction( + requireActivity(), + object : EmptyCallback { + override fun onCallback() { + startActivityForResult( + LocalMediaActivity.getIntent( + requireContext(), + LocalMediaActivity.ChooseType.VIDEO, + 1, + "发视频帖" + ), BaseRichEditorActivity.INSERT_VIDEO_CODE + ) + } + }) } } } @@ -215,7 +250,10 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { toast("保存成功") requireActivity().finish() } else if (it.status == Status.ERROR) { - ErrorHelper.handleError(requireContext(), it.exception?.response()?.errorBody()?.string()) + ErrorHelper.handleError( + requireContext(), + it.exception?.response()?.errorBody()?.string() + ) } } mViewModel.postLiveData.observeNonNull(this) { @@ -233,7 +271,10 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { }, 1000) UploadManager.deleteUploadData(mVideoFileEntity?.path) } else if (it.status == Status.ERROR) { - ErrorHelper.handleError(requireContext(), it.exception?.response()?.errorBody()?.string()) + ErrorHelper.handleError( + requireContext(), + it.exception?.response()?.errorBody()?.string() + ) } } } @@ -248,7 +289,8 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { super.onActivityResult(requestCode, resultCode, data) if (data == null || resultCode != Activity.RESULT_OK) return if (requestCode == BaseRichEditorActivity.INSERT_VIDEO_CODE) { - val localVideoList = data.getParcelableArrayListExtra(LocalVideoEntity::class.java.name) + val localVideoList = + data.getParcelableArrayListExtra(LocalVideoEntity::class.java.name) ?: arrayListOf() if (localVideoList.isNotEmpty()) { initUpload(localVideoList[0].filePath, localVideoList[0].poster) @@ -258,7 +300,8 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { mBinding.videoPoster.setImageURI("file://$imagePath") mUpdatedPosterPath = imagePath ?: "" } else if (requestCode == ChooseForumActivity.CHOOSE_FORUM_REQUEST) { - val community = data.getParcelableExtra(EntranceUtils.KEY_COMMUNITY_DATA) + val community = + data.getParcelableExtra(EntranceUtils.KEY_COMMUNITY_DATA) mViewModel.communityEntity = community mViewModel.type = community?.type ?: "" if (mViewModel.type == BbsType.GAME_BBS.value) { @@ -272,7 +315,8 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { setForumName() } } else if (requestCode == REQUEST_CHOOSE_DRAFT) { - val draftEntity = data.getParcelableExtra(VideoDraftEntity::class.java.simpleName) + val draftEntity = + data.getParcelableExtra(VideoDraftEntity::class.java.simpleName) if (draftEntity != null) { mViewModel.videoDraft = draftEntity setVideoDraft() @@ -304,7 +348,14 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { mBinding.reprintUrlTv.isEnabled = false } if (mVideoFileEntity == null) { - mVideoFileEntity = VideoFileEntity("", videoPatch.url, videoPatch.poster, videoPatch.length, videoPatch.length, videoPatch.format) + mVideoFileEntity = VideoFileEntity( + "", + videoPatch.url, + videoPatch.poster, + videoPatch.length, + videoPatch.length, + videoPatch.format + ) } handleUploadSuccess(videoPatch.url) mBinding.deleteVideoIv.visibility = View.GONE @@ -314,8 +365,10 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { private fun setVideoDraft() { mViewModel.videoDraft?.let { if (it.bbsId.isNotEmpty() && it.game != null) { - mViewModel.communityEntity = CommunityEntity(it.bbsId, it.game?.name - ?: "", icon = it.game?.icon, iconSubscript = it.game?.iconSubscript) + mViewModel.communityEntity = CommunityEntity( + it.bbsId, it.game?.name + ?: "", icon = it.game?.icon, iconSubscript = it.game?.iconSubscript + ) mViewModel.gameEntity = it.game } mViewModel.gameEntity = it.game @@ -325,7 +378,8 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { if (it.tagActivityId.isNotEmpty() && it.tagActivityName.isNotEmpty()) { mBinding.activityTitle.text = it.tagActivityName mBinding.activityTitle.setTextColor(R.color.text_FA8500.toColor()) - mViewModel.selectActivityLabelEntity = ActivityLabelEntity(it.tagActivityId, it.tagActivityName) + mViewModel.selectActivityLabelEntity = + ActivityLabelEntity(it.tagActivityId, it.tagActivityName) } if (it.url.isNotEmpty()) { ImageUtils.display(mBinding.videoPoster, it.poster) @@ -350,7 +404,10 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { if (poster.isNotEmpty()) { ImageUtils.display(mBinding.videoPoster, poster) } else { - val thumbnail = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Images.Thumbnails.MINI_KIND) + val thumbnail = ThumbnailUtils.createVideoThumbnail( + videoPath, + MediaStore.Images.Thumbnails.MINI_KIND + ) mBinding.videoPoster.setImageBitmap(thumbnail) } @@ -400,20 +457,31 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { } } - mVideoFileEntity = VideoFileEntity(videoPath, null, poster, timeInSecond, videoFile.length(), format) + mVideoFileEntity = + VideoFileEntity(videoPath, null, poster, timeInSecond, videoFile.length(), format) createUploadTask(videoPath) } private fun createUploadTask(videoPath: String) { mBinding.uploadStatus.text = "视频上传中..." UploadManager.createUploadTask(videoPath, object : OnUploadListener { - override fun onProgressChanged(uploadFilePath: String, currentSize: Long, totalSize: Long, speed: Long) { + override fun onProgressChanged( + uploadFilePath: String, + currentSize: Long, + totalSize: Long, + speed: Long + ) { runOnUiThread { mBinding.uploadInfoContainer.visibility = View.VISIBLE mBinding.uploadStatus.text = "视频上传中..." mBinding.uploadSpeed.visibility = View.VISIBLE mBinding.pauseButton.visibility = View.VISIBLE - mBinding.uploadSpeed.text = (SpeedUtils.getSpeed(speed) + "预计还需" + SpeedUtils.getRemainTime(totalSize, currentSize, speed)) + mBinding.uploadSpeed.text = + (SpeedUtils.getSpeed(speed) + "预计还需" + SpeedUtils.getRemainTime( + totalSize, + currentSize, + speed + )) mBinding.uploadProgress.update(((360 * currentSize) / totalSize).toInt(), "") } } @@ -471,14 +539,20 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { if (mViewModel.communityEntity != null) { if (mViewModel.type == BbsType.GAME_BBS.value) { mBinding.chooseForumTv.text = mViewModel.communityEntity?.name - mBinding.forumIconView.displayGameIcon(mViewModel.communityEntity?.icon, mViewModel.communityEntity?.iconSubscript) + mBinding.forumIconView.displayGameIcon( + mViewModel.communityEntity?.icon, + mViewModel.communityEntity?.iconSubscript + ) setForumUI() } else if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { if (mViewModel.gameEntity == null) { mBinding.chooseForumTv.text = "选择游戏" } else { mBinding.chooseForumTv.text = mViewModel.gameEntity?.name - mBinding.forumIconView.displayGameIcon(mViewModel.gameEntity?.icon, mViewModel.gameEntity?.iconSubscript) + mBinding.forumIconView.displayGameIcon( + mViewModel.gameEntity?.icon, + mViewModel.gameEntity?.iconSubscript + ) setForumUI() } } @@ -495,7 +569,12 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { private fun setForumUI() { mBinding.forumIconView.visibility = View.VISIBLE mBinding.forumContainer.background = R.drawable.bg_shape_f5_radius_999.toDrawable() - mBinding.chooseForumTv.setCompoundDrawablesWithIntrinsicBounds(null, null, R.drawable.ic_article_edit_choose_forum_arrow_gray.toDrawable(), null) + mBinding.chooseForumTv.setCompoundDrawablesWithIntrinsicBounds( + null, + null, + R.drawable.ic_article_edit_choose_forum_arrow_gray.toDrawable(), + null + ) mBinding.chooseForumTv.setTextColor(R.color.text_333333.toColor()) } @@ -525,7 +604,10 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { } R.id.menu_draft -> { NewLogUtils.logVideoDraftClick() - startActivityForResult(VideoDraftActivity.getIntent(requireContext()), REQUEST_CHOOSE_DRAFT) + startActivityForResult( + VideoDraftActivity.getIntent(requireContext()), + REQUEST_CHOOSE_DRAFT + ) } } } @@ -546,26 +628,35 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { private fun startMediaStore() { try { - PermissionHelper.checkStoragePermissionBeforeAction(requireContext(), object : EmptyCallback { - override fun onCallback() { - var intent: Intent? = null - when { - mVideoFileEntity?.url?.isNotEmpty() == true -> { - val videoEntity = VideoEntity(length = mVideoFileEntity?.length - ?: 0, url = mVideoFileEntity?.url ?: "") - intent = PosterEditActivity.getIntentByVideo(requireContext(), videoEntity) - } - mVideoFileEntity?.path?.isNotEmpty() == true -> { - intent = PosterEditActivity.getIntentByPath(requireContext(), mVideoFileEntity?.url - ?: "") - } - else -> { - throwExceptionInDebug("video not found") + PermissionHelper.checkStoragePermissionBeforeAction( + requireContext(), + object : EmptyCallback { + override fun onCallback() { + var intent: Intent? = null + when { + mVideoFileEntity?.url?.isNotEmpty() == true -> { + val videoEntity = VideoEntity( + length = mVideoFileEntity?.length + ?: 0, url = mVideoFileEntity?.url ?: "" + ) + intent = PosterEditActivity.getIntentByVideo( + requireContext(), + videoEntity + ) + } + mVideoFileEntity?.path?.isNotEmpty() == true -> { + intent = PosterEditActivity.getIntentByPath( + requireContext(), mVideoFileEntity?.url + ?: "" + ) + } + else -> { + throwExceptionInDebug("video not found") + } } + startActivityForResult(intent, REQUEST_CODE_IMAGE_CROP) } - startActivityForResult(intent, REQUEST_CODE_IMAGE_CROP) - } - }) + }) } catch (e: Exception) { toast(R.string.media_image_hint) e.printStackTrace() @@ -578,18 +669,28 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { if (mViewModel.videoPatch == null && mViewModel.videoDraft == null) { if (mBinding.title.text.isNotEmpty() || mBinding.videoDes.text.isNotEmpty()) { - DialogUtils.showNewAlertDialog(requireContext(), "提示", "是否保存内容再退出?", "不保存", "保存并退出", Gravity.CENTER, true, { - requireActivity().finish() - }, { - verifyData(true) - }) + DialogUtils.showNewAlertDialog( + requireContext(), + "提示", + "是否保存内容再退出?", + "不保存", + "保存并退出", + Gravity.CENTER, + true, + { + requireActivity().finish() + }, + { + verifyData(true) + }) return true } } if (mViewModel.videoPatch != null && mViewModel.videoDraft == null) { return if (mViewModel.videoPatch?.title != mBinding.title.text.toString() || - mViewModel.videoPatch?.des != mBinding.videoDes.text.toString()) { + mViewModel.videoPatch?.des != mBinding.videoDes.text.toString() + ) { showBackDialog() true } else false @@ -600,7 +701,8 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { } private fun logButtonClick(event: String) { - val bbsType = if (mViewModel.type.isNotEmpty()) if (mViewModel.type == "game_bbs") "游戏论坛" else "综合论坛" else "" + val bbsType = + if (mViewModel.type.isNotEmpty()) if (mViewModel.type == "game_bbs") "游戏论坛" else "综合论坛" else "" val originalType = if (mBinding.originalTv.isChecked && !mBinding.reprintTv.isChecked) { "原创" } else if (!mBinding.originalTv.isChecked && mBinding.reprintTv.isChecked) { @@ -608,14 +710,17 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { } else { "未勾选" } - NewLogUtils.logPublishVideoClick(event, mViewModel.communityEntity?.id + NewLogUtils.logPublishVideoClick( + event, mViewModel.communityEntity?.id ?: "", bbsType, mViewModel.selectActivityLabelEntity?.name - ?: "", mBinding.videoDes.text.toString().count(), originalType) + ?: "", mBinding.videoDes.text.toString().count(), originalType + ) } private fun checkDraft(): Boolean { if (mViewModel.videoDraft != null && (mViewModel.videoDraft?.title != mBinding.title.text.toString() - || mViewModel.videoDraft?.des != mBinding.videoDes.text.toString())) { + || mViewModel.videoDraft?.des != mBinding.videoDes.text.toString()) + ) { showBackDialog() return true } @@ -623,18 +728,28 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { } private fun showBackDialog() { - DialogUtils.showNewAlertDialog(requireContext(), "提示", "是否保存修改内容用于下次编辑?", "不保存", "保存并退出", Gravity.CENTER, true, { - requireActivity().finish() - }, { - verifyData(true) - }) + DialogUtils.showNewAlertDialog( + requireContext(), + "提示", + "是否保存修改内容用于下次编辑?", + "不保存", + "保存并退出", + Gravity.CENTER, + true, + { + requireActivity().finish() + }, + { + verifyData(true) + }) } private fun verifyData(isDraft: Boolean) { if (ClickUtils.isFastDoubleClick()) return if (mViewModel.videoPatch == null) { if (!isDraft && mVideoFileEntity != null && - !File(mVideoFileEntity?.path ?: "").exists()) { + !File(mVideoFileEntity?.path ?: "").exists() + ) { toast("提交失败,视频文件不存在") handleFileNotFound() return @@ -655,6 +770,10 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { toast("请填写标题") return } + if (!isDraft && !mBinding.originalTv.isChecked && !mBinding.reprintTv.isChecked) { + toast("请选择内容来源") + return + } if (!isDraft && mViewModel.selectActivityLabelEntity != null && !mBinding.originalTv.isChecked) { toast("本次活动内容要求原创") @@ -675,22 +794,21 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { mViewModel.videoPatch!! } else { ForumVideoEntity( - id = mViewModel.videoDraft?.id ?: "", - title = title.toString(), - des = des.toString(), - url = mVideoFileEntity?.url ?: "", - size = mVideoFileEntity?.size ?: 0, - format = mVideoFileEntity?.format ?: "", - length = mVideoFileEntity?.length ?: 0, - poster = mViewModel.videoDraft?.poster ?: "", - bbsId = mViewModel.communityEntity?.id ?: "", - type = mViewModel.type, - gameId = mViewModel.gameEntity?.id ?: mViewModel.communityEntity?.game?.id - ?: "", - original = if (mBinding.originalTv.isChecked) "yes" else if (mBinding.reprintTv.isChecked) "no" else "", - source = if (mBinding.reprintTv.isChecked) mBinding.reprintUrlTv.text.toString() else "", - tagActivityId = mViewModel.selectActivityLabelEntity?.id ?: "", - tagActivityName = mViewModel.selectActivityLabelEntity?.name ?: "" + id = mViewModel.videoDraft?.id ?: "", + title = title.toString(), + des = des.toString(), + url = mVideoFileEntity?.url ?: "", + size = mVideoFileEntity?.size ?: 0, + format = mVideoFileEntity?.format ?: "", + length = mVideoFileEntity?.length ?: 0, + poster = mViewModel.videoDraft?.poster ?: "", + bbsId = mViewModel.communityEntity?.id ?: "", + type = mViewModel.type, + gameId = mViewModel.gameEntity?.id ?: mViewModel.communityEntity?.game?.id ?: "", + original = if (mBinding.originalTv.isChecked) "yes" else if (mBinding.reprintTv.isChecked) "no" else "", + source = if (mBinding.reprintTv.isChecked) mBinding.reprintUrlTv.text.toString() else "", + tagActivityId = mViewModel.selectActivityLabelEntity?.id ?: "", + tagActivityName = mViewModel.selectActivityLabelEntity?.name ?: "" ) } if (mUpdatedPosterPath.isEmpty() && videoData.poster.isNotEmpty()) { @@ -704,10 +822,13 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { val posterPath = if (mUpdatedPosterPath.isNotEmpty()) { mUpdatedPosterPath } else { - val localVideoPoster = requireActivity().cacheDir.absolutePath + File.separator + System.currentTimeMillis() + ".jpg" + val localVideoPoster = + requireActivity().cacheDir.absolutePath + File.separator + System.currentTimeMillis() + ".jpg" try { - val bmp = ThumbnailUtils.createVideoThumbnail(mVideoFileEntity?.path - ?: "", MediaStore.Images.Thumbnails.MINI_KIND) + val bmp = ThumbnailUtils.createVideoThumbnail( + mVideoFileEntity?.path + ?: "", MediaStore.Images.Thumbnails.MINI_KIND + ) // bmp 可能为空 FileOutputStream(localVideoPoster).use { out -> bmp?.compress(Bitmap.CompressFormat.PNG, 100, out) @@ -719,7 +840,12 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { } localVideoPoster } - mViewModel.postVideoPosterAndContent(isDraft, videoData, posterPath, mVideoFileEntity?.path) + mViewModel.postVideoPosterAndContent( + isDraft, + videoData, + posterPath, + mVideoFileEntity?.path + ) } } diff --git a/app/src/main/res/layout/dialog_game_detail_more.xml b/app/src/main/res/layout/dialog_game_detail_more.xml index 7ec5123f2e..2041687489 100644 --- a/app/src/main/res/layout/dialog_game_detail_more.xml +++ b/app/src/main/res/layout/dialog_game_detail_more.xml @@ -143,36 +143,43 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/share_container" /> - - + - + - - + + + + + + app:layout_constraintTop_toBottomOf="@+id/action_scrollview" /> \ No newline at end of file From 06b5b885e9c2b490a611ee3ed69cbc6ca7f16515 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Wed, 11 Aug 2021 21:05:42 +0800 Subject: [PATCH 060/151] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E5=B8=96=E8=AF=A6=E6=83=85=E5=B1=95=E5=BC=80=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../video/detail/desc/VideoDescTopViewHolder.kt | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt index 83ace2c312..ec8392871c 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt @@ -115,11 +115,16 @@ class VideoDescTopViewHolder( } else mShrinkHeight mExpandHeight = if (mExpandHeight == 0) { - getTextViewHeight(binding.titleTv) + getTextViewHeight(binding.desTv) + getTextViewHeight( - binding.activityNameTv - ) + + var height = getTextViewHeight(binding.titleTv) + + getTextViewHeight(binding.desTv) + (if (binding.desTv.visibility == View.VISIBLE) binding.desTv.marginTop else 0) + - (if (binding.activityNameTv.visibility == View.VISIBLE) binding.activityNameTv.marginTop else 0) + (if (binding.activityNameTv.visibility == View.VISIBLE || binding.originalTv.visibility == View.VISIBLE) binding.activityNameTv.marginTop else 0) + if (binding.activityNameTv.visibility == View.VISIBLE || binding.originalTv.visibility == View.VISIBLE) { + height += if (binding.activityNameTv.visibility == View.VISIBLE) getTextViewHeight( + binding.activityNameTv + ) else binding.originalTv.measuredHeight + } + height } else mExpandHeight if (mIsExpand) { @@ -130,10 +135,10 @@ class VideoDescTopViewHolder( updateTitleContainerHeight(mShrinkHeight) } - //若标题未超过一行或无描述内容和活动标签,箭头不显示 + //若标题未超过一行或无描述内容、活动标签、原创标签,箭头不显示 val ellipsisCount = binding.titleTv.layout.getEllipsisCount(binding.titleTv.lineCount - 1) - binding.expandMoreIv.goneIf(entity.des.isEmpty() && entity.tagActivityName.isEmpty() && ellipsisCount == 0) + binding.expandMoreIv.goneIf(entity.des.isEmpty() && entity.tagActivityName.isEmpty() && entity.original != "yes" && ellipsisCount == 0) } binding.expandMoreIv.setOnClickListener { NewLogUtils.logVideoDetailClick(if (!mIsExpand) "click_detail_tab_down" else "click_detail_tab_up") From 4f28c545916f0fe190b16ae1745b9f9c9c84dcd8 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Wed, 11 Aug 2021 22:47:07 +0800 Subject: [PATCH 061/151] =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E6=B4=BB=E5=8A=A8url?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=86=E7=B1=BBid=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/util/DirectUtils.kt | 4 ++-- .../java/com/gh/gamecenter/forum/home/ForumActivityAdapter.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) 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 f479daeecf..38f1039e32 100644 --- a/app/src/main/java/com/gh/common/util/DirectUtils.kt +++ b/app/src/main/java/com/gh/common/util/DirectUtils.kt @@ -1515,14 +1515,14 @@ object DirectUtils { * 跳转至活动详情 */ @JvmStatic - fun directToActivityDetail(context: Context, activityId: String, entrance: String) { + fun directToActivityDetail(context: Context, activityId: String, categoryId: String, entrance: String) { var url: String = if (isPublishEnv()) { Constants.ACTIVITY_DETAIL_ADDRESS } else { Constants.ACTIVITY_DETAIL_ADDRESS_DEV } - url = String.format(Locale.CHINA, "%s&id=%s×tamp=%d", url, activityId, (Date().time / 1000 / 1000.toFloat()).roundToInt()) + url = String.format(Locale.CHINA, "%s&id=%s&category_id=%s×tamp=%d", url, activityId, categoryId, (Date().time / 1000 / 1000.toFloat()).roundToInt()) directToWebView(context, url, entrance) } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityAdapter.kt index 533c9aa95b..7ac584ee5e 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityAdapter.kt @@ -125,7 +125,7 @@ class ForumActivityAdapter(context: Context, if (status == "正在评奖") ToastUtils.toast("活动正在评奖中") if (status == "奖励发放中") ToastUtils.toast("活动奖励发放中~") if (status == "已结束") ToastUtils.toast("活动已结束~") - DirectUtils.directToActivityDetail(mContext, activityEntity.id, mEntrance) + DirectUtils.directToActivityDetail(mContext, activityEntity.id, mViewModel.categoryId, mEntrance) } } } From 2c98c38721a401d827ff40c1c27179e4765932dd Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Wed, 11 Aug 2021 23:05:33 +0800 Subject: [PATCH 062/151] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E8=B4=B4=E8=AF=A6=E6=83=85=E5=8E=9F=E5=88=9B=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E8=A2=AB=E5=88=87=E5=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qa/video/detail/desc/VideoDescTopViewHolder.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt index ec8392871c..d6e1656793 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt @@ -16,6 +16,7 @@ import com.gh.gamecenter.databinding.ItemVideoDescTopBinding import com.gh.gamecenter.entity.ForumVideoEntity import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.qa.video.detail.ForumVideoDetailViewModel +import kotlin.math.max class VideoDescTopViewHolder( val binding: ItemVideoDescTopBinding, @@ -120,9 +121,10 @@ class VideoDescTopViewHolder( (if (binding.desTv.visibility == View.VISIBLE) binding.desTv.marginTop else 0) + (if (binding.activityNameTv.visibility == View.VISIBLE || binding.originalTv.visibility == View.VISIBLE) binding.activityNameTv.marginTop else 0) if (binding.activityNameTv.visibility == View.VISIBLE || binding.originalTv.visibility == View.VISIBLE) { - height += if (binding.activityNameTv.visibility == View.VISIBLE) getTextViewHeight( - binding.activityNameTv - ) else binding.originalTv.measuredHeight + height += max( + getTextViewHeight(binding.activityNameTv), + binding.originalTv.measuredHeight + ) } height } else mExpandHeight From a5aceb3d1f4c2f9f1be9a3009f6939e1cb3d1a0c Mon Sep 17 00:00:00 2001 From: leafwai Date: Fri, 13 Aug 2021 16:13:01 +0800 Subject: [PATCH 063/151] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=BE=AE=E5=8D=9A=20?= =?UTF-8?q?SDK=20https://git.ghzs.com/halo/android/assistant-android/-/iss?= =?UTF-8?q?ues/30?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/gamecenter/MainActivity.java | 11 +++++++++++ .../java/com/gh/gamecenter/WeiBoShareActivity.java | 10 ++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index ad1acc99ce..a7bd79df41 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -100,6 +100,9 @@ import com.lightgame.download.DownloadStatus; import com.lightgame.download.FileUtils; import com.lightgame.utils.AppManager; import com.lightgame.utils.Utils; +import com.sina.weibo.sdk.auth.AuthInfo; +import com.sina.weibo.sdk.openapi.IWBAPI; +import com.sina.weibo.sdk.openapi.WBAPIFactory; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -144,6 +147,7 @@ import static com.gh.common.util.EntranceUtils.KEY_NEXT_TO; import static com.gh.common.util.EntranceUtils.KEY_TO; import static com.gh.common.util.EntranceUtils.KEY_TYPE; import static com.gh.common.util.ExtensionsKt.observableToMain; +import static com.gh.common.util.LoginHelper.WEIBO_SCOPE; import static com.gh.gamecenter.fragment.MainWrapperFragment.INDEX_PERSONAL; import static com.gh.gamecenter.personal.PersonalFragment.LOGIN_TAG; import static com.gh.gamecenter.personal.PersonalFragment.LOGOUT_TAG; @@ -317,6 +321,7 @@ public class MainActivity extends BaseActivity { deleteSimulatorGame(); QuickLoginHelper.getPhoneInfo(this); + initWBSDK(); } //上传关注视频浏览记录 @@ -966,4 +971,10 @@ public class MainActivity extends BaseActivity { context.startActivity(intent); } + //需要提前初始化微博sdk,否则第一次分享或授权登录会失败 + private void initWBSDK() { + IWBAPI mWBAPI = WBAPIFactory.createWBAPI(this); + mWBAPI.registerApp(this, new AuthInfo(this, Config.WEIBO_APPKEY, "http://www.sina.com", WEIBO_SCOPE)); + } + } diff --git a/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java b/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java index 94c171d1ab..2c5d447df9 100644 --- a/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java +++ b/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java @@ -127,10 +127,12 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { } } - - protected void onNewIntent(Intent intent) { - super.onNewIntent(intent); - mWBAPI.doResultIntent(intent, this); //当前应用唤起微博分享后,返回当前应用 + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (mWBAPI != null) { + mWBAPI.doResultIntent(data, this); + } } private void loadIconAndShare(String iconUrl) { From c8bae7d89b733859c80ec422c86c83e365b5e241 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Fri, 13 Aug 2021 16:20:20 +0800 Subject: [PATCH 064/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E9=AA=8C=E6=94=B6=E9=97=AE=E9=A2=98(2)=20https://git.?= =?UTF-8?q?ghzs.com/pm/halo-app-issues/-/issues/1442?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/gamecenter/entity/ForumVideoEntity.kt | 87 ++++++++++--------- .../detail/ArticleDetailContentViewHolder.kt | 10 +-- .../article/detail/ArticleDetailFragment.kt | 63 +++++++------- .../qa/dialog/MoreFunctionPanelDialog.kt | 50 ++++++++--- .../qa/entity/ArticleDetailEntity.kt | 69 ++++++++------- .../qa/entity/QuestionsDetailEntity.kt | 1 - .../video/detail/ForumVideoDetailFragment.kt | 47 +++++----- .../detail/desc/VideoDescTopViewHolder.kt | 2 +- 8 files changed, 182 insertions(+), 147 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/entity/ForumVideoEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/ForumVideoEntity.kt index 758eec0148..a7a53024a4 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/ForumVideoEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/ForumVideoEntity.kt @@ -8,45 +8,54 @@ import kotlinx.android.parcel.Parcelize @Parcelize open class ForumVideoEntity( - @SerializedName("_id") - var id: String = "", - var title: String = "", - var des: String = "", - var poster: String = "", - var url: String = "", - val user: PersonalEntity = PersonalEntity(), - val me: MeEntity = MeEntity(), - val size: Long = 0, - var length: Long = 0, - // 有三种状态 pass通过,fail未通过,pending审核中 - var status: String = "", - val format: String = "Mp4", - var game: GameEntity? = null, - @SerializedName("tag_activity_id") - var tagActivityId: String = "",//活动标签的id - @SerializedName("tag_activity_name") - var tagActivityName: String = "", - @SerializedName("bbs_id") - var bbsId: String = "", - @SerializedName("game_id") - var gameId: String = "", - var type: String = "", - var share: Int = 0, - var time: Time = Time(), - @SerializedName("video_info") - var videoInfo: VideoInfo = VideoInfo(), - @SerializedName("is_jx") - var isHighlighted: Boolean = true, - var bbs: CommunityEntity? = null, - var count: Count = Count(), - val original: String = "",//是否原创 //是否原创 yes/no 默认为空字符串 - val source: String = "",//转载来源, 当 original=yes - @SerializedName("choiceness_status") - var choicenessStatus: String = "",// 精选状态 null, apply(申请), cancel(不予精选或未精选), pass(已精选) - @IgnoredOnParcel - var videoIsMuted: Boolean = false, //是否静音标记 - var duration: String = "" -) : Parcelable + @SerializedName("_id") + var id: String = "", + var title: String = "", + var des: String = "", + var poster: String = "", + var url: String = "", + val user: PersonalEntity = PersonalEntity(), + val me: MeEntity = MeEntity(), + val size: Long = 0, + var length: Long = 0, + // 有三种状态 pass通过,fail未通过,pending审核中 + var status: String = "", + val format: String = "Mp4", + var game: GameEntity? = null, + @SerializedName("tag_activity_id") + var tagActivityId: String = "",//活动标签的id + @SerializedName("tag_activity_name") + var tagActivityName: String = "", + @SerializedName("bbs_id") + var bbsId: String = "", + @SerializedName("game_id") + var gameId: String = "", + var type: String = "", + var share: Int = 0, + var time: Time = Time(), + @SerializedName("video_info") + var videoInfo: VideoInfo = VideoInfo(), + @SerializedName("is_jx") + var isHighlighted: Boolean = true, + var bbs: CommunityEntity? = null, + var count: Count = Count(), + val original: String = "",//是否原创 //是否原创 yes/no 默认为空字符串 + val source: String = "",//转载来源, 当 original=yes + @SerializedName("choiceness_status") + var choicenessStatus: String = "",// apply(申请), pass already(已精选) cancel not_yet(未精选) + @IgnoredOnParcel + var videoIsMuted: Boolean = false, //是否静音标记 + var duration: String = "" +) : Parcelable { + + fun getSimplifyChoicenessStatus(): String { + return when (choicenessStatus) { + "already" -> "pass" + "not_yet" -> "cancel" + else -> choicenessStatus + } + } +} @Parcelize data class Time(val upload: Long = 0, val audit: Long = 0, val update: Long = 0) : Parcelable 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 41be61404c..4c5f7e50df 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 @@ -2,14 +2,10 @@ package com.gh.gamecenter.qa.article.detail import android.annotation.SuppressLint import android.app.Activity -import android.text.TextUtils -import android.view.LayoutInflater import android.view.View -import android.view.animation.LinearInterpolator import android.webkit.JavascriptInterface import android.webkit.WebView import android.widget.LinearLayout -import android.widget.TextView import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.gh.common.DefaultUrlHandler @@ -18,14 +14,10 @@ import com.gh.common.util.* import com.gh.common.view.RichEditor import com.gh.gamecenter.ImageViewerActivity import com.gh.gamecenter.R -import com.gh.gamecenter.databinding.ArticleDetailFourmTagItemBinding import com.gh.gamecenter.databinding.ItemArticleDetailContentBinding -import com.gh.gamecenter.entity.CommunityEntity import com.gh.gamecenter.manager.UserManager -import com.gh.gamecenter.qa.column.detail.AskColumnDetailActivity import com.gh.gamecenter.qa.editor.OnLinkClickListener import com.gh.gamecenter.qa.entity.ArticleDetailEntity -import com.google.android.flexbox.FlexboxLayout import java.util.* class ArticleDetailContentViewHolder( @@ -142,7 +134,7 @@ class ArticleDetailContentViewHolder( "帖子详情" ) } - titleTv.text = if (article.choicenessStatus == "pass") { + titleTv.text = if (article.getSimplifyChoicenessStatus() == "pass") { SpanBuilder(" ${article.title}").image(0, 1, R.drawable.ic_essence).build() } else { article.title diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt index 9753c79f21..d119cee9d7 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt @@ -8,8 +8,6 @@ import android.view.LayoutInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup -import android.widget.ImageView -import android.widget.LinearLayout import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat @@ -392,12 +390,11 @@ class ArticleDetailFragment : BaseCommentFragment() - if (mViewModel.detailEntity?.user?.id == UserManager.getInstance().userId && !mViewModel.detailEntity?.me!!.isModerator && mViewModel.detailEntity?.status == "pass" && mViewModel.detailEntity?.choicenessStatus != "pass") { - val isEnable = mViewModel.detailEntity?.choicenessStatus == "apply" + if (mViewModel.detailEntity?.user?.id == UserManager.getInstance().userId && !mViewModel.detailEntity?.me!!.isModerator && mViewModel.detailEntity?.status == "pass") { + val isEnable = + mViewModel.detailEntity?.getSimplifyChoicenessStatus() != "pass" entities.add( MenuItemEntity( "申请加精", if (isEnable) - R.drawable.icon_more_panel_essence_unenable else R.drawable.icon_more_panel_essence, - isEnable = !isEnable + R.drawable.icon_more_panel_essence else R.drawable.icon_more_panel_essence_unenable, + isEnable = isEnable ) ) } @@ -501,13 +499,14 @@ class ArticleDetailFragment : BaseCommentFragment { - if (mViewModel.detailEntity?.choicenessStatus == "apply") { + if (mViewModel.detailEntity?.getSimplifyChoicenessStatus() == "apply") { ToastUtils.showToast("申请加精审核中") return@showMoreDialog } @@ -594,6 +593,10 @@ class ArticleDetailFragment : BaseCommentFragment { + if (mViewModel.detailEntity?.getSimplifyChoicenessStatus() == "apply") { + ToastUtils.showToast("加精审核中") + return@showMoreDialog + } addEssenceForum(mViewModel.detailEntity!!) NewLogUtils.logSharePanelClick( "click_essence", mViewModel.detailEntity?.user?.id @@ -658,24 +661,20 @@ class ArticleDetailFragment : BaseCommentFragment toast("帖子已经加精") - - else -> DialogUtils.showAlertDialog( - requireContext(), - "加精帖子", - highlightDialogHintContent, - "确定", - "取消", - { - mViewModel.doHighlightThisArticle( - mViewModel.detailEntity!!.community.id, - mViewModel.articleId - ) - }, - null - ) - } + DialogUtils.showAlertDialog( + requireContext(), + "加精帖子", + highlightDialogHintContent, + "确定", + "取消", + { + mViewModel.doHighlightThisArticle( + mViewModel.detailEntity!!.community.id, + mViewModel.articleId + ) + }, + null + ) } private fun updateView() { diff --git a/app/src/main/java/com/gh/gamecenter/qa/dialog/MoreFunctionPanelDialog.kt b/app/src/main/java/com/gh/gamecenter/qa/dialog/MoreFunctionPanelDialog.kt index e6cb002437..8297b968b5 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/dialog/MoreFunctionPanelDialog.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/dialog/MoreFunctionPanelDialog.kt @@ -27,9 +27,9 @@ class MoreFunctionPanelDialog : BaseDraggableDialogFragment() { var onItemClickCallback: ((menuItem: MenuItemEntity) -> Unit)? = null override fun onCreateView( - inflater: LayoutInflater, - container: ViewGroup?, - savedInstanceState: Bundle? + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? ): View { binding = DialogGameDetailMoreBinding.inflate(inflater, container, false) return binding.root @@ -82,25 +82,40 @@ class MoreFunctionPanelDialog : BaseDraggableDialogFragment() { menuItems.forEachIndexed { _, menuItemEntity -> val itemView = createItemView(menuItemEntity) itemView.setOnClickListener { - onItemClickCallback?.invoke(menuItemEntity) - dismissAllowingStateLoss() + if (menuItemEntity.isEnable) { + onItemClickCallback?.invoke(menuItemEntity) + dismissAllowingStateLoss() + } } binding.actionContainer.addView(itemView) } } private fun createItemView(itemEntity: MenuItemEntity): View { - val params = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT) + val params = LinearLayout.LayoutParams( + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ) params.leftMargin = 16F.dip2px() return TextView(requireContext()).apply { textSize = 11F text = itemEntity.text - setTextColor(ContextCompat.getColor(requireContext(), if (itemEntity.isEnable) R.color.text_666666 else R.color.text_999999)) + setTextColor( + ContextCompat.getColor( + requireContext(), + if (itemEntity.isEnable) R.color.text_666666 else R.color.text_999999 + ) + ) includeFontPadding = false gravity = Gravity.CENTER layoutParams = params compoundDrawablePadding = 8F.dip2px() - setCompoundDrawablesWithIntrinsicBounds(null, ContextCompat.getDrawable(requireContext(), itemEntity.normalIcon), null, null) + setCompoundDrawablesWithIntrinsicBounds( + null, + ContextCompat.getDrawable(requireContext(), itemEntity.normalIcon), + null, + null + ) } } @@ -109,22 +124,33 @@ class MoreFunctionPanelDialog : BaseDraggableDialogFragment() { companion object { @JvmStatic - fun showMoreDialog(activity: AppCompatActivity, menuItems: ArrayList, title: String, shareUtils: ShareUtils, onItemClickCallback: (menuItem: MenuItemEntity) -> Unit) { + fun showMoreDialog( + activity: AppCompatActivity, + menuItems: ArrayList, + title: String, + shareUtils: ShareUtils, + onItemClickCallback: (menuItem: MenuItemEntity) -> Unit + ) { if (menuItems.isNullOrEmpty()) return - var fragment = activity.supportFragmentManager.findFragmentByTag(MoreFunctionPanelDialog::class.java.name) as? MoreFunctionPanelDialog + var fragment = + activity.supportFragmentManager.findFragmentByTag(MoreFunctionPanelDialog::class.java.name) as? MoreFunctionPanelDialog if (fragment == null) { fragment = MoreFunctionPanelDialog() fragment.menuItems = menuItems fragment.title = title fragment.shareUtils = shareUtils fragment.onItemClickCallback = onItemClickCallback - fragment.show(activity.supportFragmentManager, MoreFunctionPanelDialog::class.java.name) + fragment.show( + activity.supportFragmentManager, + MoreFunctionPanelDialog::class.java.name + ) } else { fragment.menuItems = menuItems fragment.title = title fragment.shareUtils = shareUtils fragment.onItemClickCallback = onItemClickCallback - val transaction: FragmentTransaction = activity.supportFragmentManager.beginTransaction() + val transaction: FragmentTransaction = + activity.supportFragmentManager.beginTransaction() transaction.show(fragment) transaction.commit() } diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDetailEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDetailEntity.kt index 4d32f81337..a600fa9f86 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDetailEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDetailEntity.kt @@ -10,35 +10,44 @@ import kotlinx.android.parcel.Parcelize @Parcelize data class ArticleDetailEntity( - @SerializedName("_id") - val id: String = "", - var title: String = "", - var content: String = "", - var tags: List = ArrayList(), - val count: Count = Count(), - var user: UserEntity = UserEntity(), - var me: MeEntity = MeEntity(), - val time: TimeEntity = TimeEntity(), - var community: CommunityEntity = CommunityEntity(), - var commentable: Boolean? = true, - @SerializedName("is_jx") - var isHighlighted: Boolean = true, - @SerializedName("community_id") - var communityId: String = "", - var images: List = ArrayList(), - @SerializedName("images_info") - var imagesInfo: List = ArrayList(), - var videos: List = ArrayList(), - @SerializedName("tag_activity_id") - var tagActivityId: String = "", - @SerializedName("tag_activity_name") - var tagActivityName: String = "", - var type: String = "", - var gameEntity: GameEntity? = null, - @SerializedName("choiceness_status") - var choicenessStatus: String = "",// 精选状态 null, apply(申请), cancel(不予精选或未精选), pass(已精选) - var status: String = "pass",//pass通过,fail未通过,pending审核中 - var original: String = "" -) : Parcelable + @SerializedName("_id") + val id: String = "", + var title: String = "", + var content: String = "", + var tags: List = ArrayList(), + val count: Count = Count(), + var user: UserEntity = UserEntity(), + var me: MeEntity = MeEntity(), + val time: TimeEntity = TimeEntity(), + var community: CommunityEntity = CommunityEntity(), + var commentable: Boolean? = true, + @SerializedName("is_jx") + var isHighlighted: Boolean = true, + @SerializedName("community_id") + var communityId: String = "", + var images: List = ArrayList(), + @SerializedName("images_info") + var imagesInfo: List = ArrayList(), + var videos: List = ArrayList(), + @SerializedName("tag_activity_id") + var tagActivityId: String = "", + @SerializedName("tag_activity_name") + var tagActivityName: String = "", + var type: String = "", + var gameEntity: GameEntity? = null, + @SerializedName("choiceness_status") + var choicenessStatus: String = "",// 精选状态 apply(申请), pass already(已精选) cancel not_yet(未精选) + var status: String = "pass",//pass通过,fail未通过,pending审核中 + var original: String = "" +) : Parcelable { + + fun getSimplifyChoicenessStatus(): String { + return when (choicenessStatus) { + "already" -> "pass" + "not_yet" -> "cancel" + else -> choicenessStatus + } + } +} diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/QuestionsDetailEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/QuestionsDetailEntity.kt index 3033dceb1d..8ca075eb7a 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/QuestionsDetailEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/QuestionsDetailEntity.kt @@ -46,7 +46,6 @@ data class QuestionsDetailEntity( var gameEntity: GameEntity? = null, var time: TimeEntity = TimeEntity(), var count: Count = Count(), - val choicenessStatus: String = "",// 精选状态 null, apply(申请), cancel(不予精选或未精选), pass(已精选) var status: String = "pass",//pass通过,fail未通过,pending审核中 var finish: Boolean = false, //提交问题用 diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt index f9e195317e..0b96bcfd25 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt @@ -236,12 +236,11 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { if (isHighlighted) { if (mForumVideoEntity!!.me.moderatorPermissions.highlightVideo == Permissions.REPORTER) { toast("提交成功") + mForumVideoEntity?.choicenessStatus = "apply" } else { toast("操作成功") - mForumVideoEntity?.let { - it.choicenessStatus = "pass" - mViewModel.updateDetailLiveData.postValue(it) - } + mForumVideoEntity?.choicenessStatus = "pass" + mViewModel.updateDetailLiveData.postValue(mForumVideoEntity) } } else { toast("权限错误,请刷新后重试") @@ -547,13 +546,14 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { private fun showMoreItemDialog() { if (lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED) || mForumVideoEntity != null) { val entities = ArrayList() - if (mForumVideoEntity?.user?.id == UserManager.getInstance().userId && !mForumVideoEntity?.me!!.isModerator && mForumVideoEntity?.status == "pass" && mForumVideoEntity?.choicenessStatus != "pass") { - val isEnable = mForumVideoEntity?.choicenessStatus == "apply" + if (mForumVideoEntity?.user?.id == UserManager.getInstance().userId && !mForumVideoEntity?.me!!.isModerator && mForumVideoEntity?.status == "pass") { + val isEnable = + mForumVideoEntity?.getSimplifyChoicenessStatus() != "pass" entities.add( MenuItemEntity( "申请加精", if (isEnable) - R.drawable.icon_more_panel_essence_unenable else R.drawable.icon_more_panel_essence, - isEnable = !isEnable + R.drawable.icon_more_panel_essence else R.drawable.icon_more_panel_essence_unenable, + isEnable = isEnable ) ) } @@ -564,13 +564,14 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { entities.add(MenuItemEntity("投诉", R.drawable.icon_gamedetail_copyright)) } if (mForumVideoEntity?.me!!.isModerator && mForumVideoEntity?.status == "pass") { - val isEnable = mForumVideoEntity?.isHighlighted == true + val isEnable = + mForumVideoEntity?.getSimplifyChoicenessStatus() != "pass" entities.add( MenuItemEntity( "加精选", if (isEnable) - R.drawable.icon_more_panel_essence_unenable else R.drawable.icon_more_panel_essence, - isEnable = !isEnable + R.drawable.icon_more_panel_essence else R.drawable.icon_more_panel_essence_unenable, + isEnable = isEnable ) ) entities.add(MenuItemEntity("修改活动标签", R.drawable.icon_more_panel_modify_label)) @@ -633,7 +634,7 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { ) } "申请加精" -> { - if (mForumVideoEntity?.choicenessStatus == "apply") { + if (mForumVideoEntity?.getSimplifyChoicenessStatus() == "apply") { ToastUtils.showToast("申请加精审核中") return@showMoreDialog } @@ -645,6 +646,10 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { ) } "加精选" -> { + if (mForumVideoEntity?.getSimplifyChoicenessStatus() == "apply") { + ToastUtils.showToast("加精审核中") + return@showMoreDialog + } addEssenceForum() NewLogUtils.logSharePanelClick( "click_essence", mForumVideoEntity?.user?.id @@ -699,17 +704,13 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { "你的操作将立即生效,确定提交吗?" } } - if (mForumVideoEntity?.isHighlighted == true) { - toast("帖子已经加精") - } else { - DialogUtils.showAlertDialog( - requireContext(), "加精视频", highlightDialogHintContent, - "确定", "取消", - { - mViewModel.doHighlightThisVideo(mForumVideoEntity?.bbsId ?: "", mVideoId) - }, null - ) - } + DialogUtils.showAlertDialog( + requireContext(), "加精视频", highlightDialogHintContent, + "确定", "取消", + { + mViewModel.doHighlightThisVideo(mForumVideoEntity?.bbsId ?: "", mVideoId) + }, null + ) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt index d6e1656793..171ec60fc7 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt @@ -38,7 +38,7 @@ class VideoDescTopViewHolder( leftMargin = 8f.dip2px() } } - if (entity.choicenessStatus == "pass") { + if (entity.getSimplifyChoicenessStatus() == "pass") { binding.titleTv.text = SpanBuilder(" ${entity.title}").image(0, 1, R.drawable.ic_essence).build() } From 2e5d445d659901e080905ba2f3d54f2aae2c3c67 Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 16 Aug 2021 10:19:28 +0800 Subject: [PATCH 065/151] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=9A=91=E6=9C=9F?= =?UTF-8?q?=E5=A5=BD=E6=B8=B8=E5=AE=89=E5=88=A9=E5=A4=A7=E8=B5=8F(0813?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=B1=87=E6=80=BB=E5=8F=8D=E9=A6=88=201)=20h?= =?UTF-8?q?ttps://git.ghzs.com/pm/halo-app-issues/-/issues/1284?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/DefaultUrlHandler.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/common/DefaultUrlHandler.kt b/app/src/main/java/com/gh/common/DefaultUrlHandler.kt index afca900773..90975b6b3d 100644 --- a/app/src/main/java/com/gh/common/DefaultUrlHandler.kt +++ b/app/src/main/java/com/gh/common/DefaultUrlHandler.kt @@ -303,7 +303,7 @@ object DefaultUrlHandler { context, communityEntity, activityLabelEntity, - BbsType.GAME_BBS.value, + BbsType.OFFICIAL_BBS.value, false, entrance, "" From 5c02d378521bb36d019b4de1eefd62cba6f86c55 Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 16 Aug 2021 11:19:04 +0800 Subject: [PATCH 066/151] =?UTF-8?q?=E5=90=AF=E5=8A=A8=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BA=94=E7=94=A8=E5=AE=89=E8=A3=85=E6=9D=A5?= =?UTF-8?q?=E6=BA=90=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/tracker/TrackerLogger.kt | 8 ++++ .../java/com/gh/common/util/PackageUtils.java | 38 +++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/app/src/main/java/com/gh/common/tracker/TrackerLogger.kt b/app/src/main/java/com/gh/common/tracker/TrackerLogger.kt index 2930f8dfb2..dcd82cb877 100644 --- a/app/src/main/java/com/gh/common/tracker/TrackerLogger.kt +++ b/app/src/main/java/com/gh/common/tracker/TrackerLogger.kt @@ -120,6 +120,7 @@ object TrackerLogger { val jsonObject = JSONObject() val payloadObject = JSONObject() val signatureHash = PackageUtils.getApkSignatureByPackageName(context, context.packageName) + val sideLoadInfo = PackageUtils.getSideLoadedInfo() tryCatchInRelease { payloadObject.put("launch_id", Tracker.launchId) @@ -128,6 +129,13 @@ object TrackerLogger { payloadObject.put("package_name", context.packageName) payloadObject.put("app_name", context.getString(R.string.app_name)) + sideLoadInfo?.let { + payloadObject.put("is_side_loaded", sideLoadInfo["is_side_loaded"]) + sideLoadInfo["installer_store"]?.let { + payloadObject.put("installer_store", it) + } + } + jsonObject.put("event", "app_launch") jsonObject.put("payload", payloadObject) jsonObject.put("meta", getMeta()) diff --git a/app/src/main/java/com/gh/common/util/PackageUtils.java b/app/src/main/java/com/gh/common/util/PackageUtils.java index b9153f6fac..d5b688132b 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -45,7 +45,9 @@ import java.security.cert.CertificateFactory; import java.security.cert.X509Certificate; import java.util.ArrayList; import java.util.Enumeration; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; @@ -158,6 +160,42 @@ public class PackageUtils { return getMetaData(HaloApp.getInstance().getApplication(), packageName, "gh_id"); } + @Nullable + public static Map getSideLoadedInfo() { + Context context = HaloApp.getInstance().getApplicationContext(); + + String packageName = null; + try { + final PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); + final PackageManager packageManager = context.getPackageManager(); + + if (packageInfo != null && packageManager != null) { + packageName = packageInfo.packageName; + + // getInstallSourceInfo requires INSTALL_PACKAGES permission which is only given to system + // apps. + final String installerPackageName = packageManager.getInstallerPackageName(packageName); + + final Map sideLoadedInfo = new HashMap<>(); + + if (installerPackageName != null) { + sideLoadedInfo.put("is_side_loaded", "false"); + // could be amazon, google play etc + sideLoadedInfo.put("installer_store", installerPackageName); + } else { + // if it's installed via adb, system apps or untrusted sources + sideLoadedInfo.put("is_side_loaded", "true"); + } + + return sideLoadedInfo; + } + } catch (Exception e) { + Utils.log(e.getLocalizedMessage()); + } + + return null; + } + /* * 判断是否是插件包 From 5cc40c09dc88b54b0987b2a41032c387eeac4e82 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Mon, 16 Aug 2021 11:25:46 +0800 Subject: [PATCH 067/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E9=AA=8C=E6=94=B6=E9=97=AE=E9=A2=98(17)=20https://git?= =?UTF-8?q?.ghzs.com/pm/halo-app-issues/-/issues/1442?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qa/questions/edit/QuestionEditActivity.kt | 249 ++++++++++++------ 1 file changed, 175 insertions(+), 74 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt index 56a7fa8183..705178f262 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt @@ -48,7 +48,8 @@ import org.json.JSONObject /** * Created by khy on 28/04/18. */ -class QuestionEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { +class QuestionEditActivity : BaseRichEditorActivity(), + KeyboardHeightObserver { private lateinit var mBinding: ActivityQuestionsEditBinding @@ -74,14 +75,16 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke super.onActivityResult(requestCode, resultCode, data) if (data == null || resultCode != Activity.RESULT_OK) return if (requestCode == QUESTION_DRAFT_REQUEST_CODE) { - val draftEntity = data.getParcelableExtra(QuestionDraftEntity::class.java.simpleName) + val draftEntity = + data.getParcelableExtra(QuestionDraftEntity::class.java.simpleName) if (draftEntity != null) { mViewModel.questionDraftEntity = draftEntity setQuestionDraft(draftEntity) mViewModel.getQuestionDraftContent(draftEntity.id) } } else if (requestCode == ChooseForumActivity.CHOOSE_FORUM_REQUEST) { - val community = data.getParcelableExtra(EntranceUtils.KEY_COMMUNITY_DATA) + val community = + data.getParcelableExtra(EntranceUtils.KEY_COMMUNITY_DATA) mViewModel.communityEntity = community mViewModel.type = community?.type ?: "" if (mViewModel.questionEntity != null) { @@ -106,7 +109,8 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke super.handleMessage(msg) if (msg.what == 1) { if (!mViewModel.title.isNullOrEmpty() - && !mViewModel.content.isNullOrEmpty()) { + && !mViewModel.content.isNullOrEmpty() + ) { mViewModel.title = mBinding.questionseditTitle.text.toString() mViewModel.content = getReplaceRealContent() mViewModel.saveQuestionDraft(SaveDraftType.AUTO) @@ -148,7 +152,11 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke // TitleTip if (mViewModel.questionEntity == null) { - val titleTipAdapter = QuestionTitleTipAdapter(this, mBinding.questionseditTitle, mViewModel.communityEntity?.id) + val titleTipAdapter = QuestionTitleTipAdapter( + this, + mBinding.questionseditTitle, + mViewModel.communityEntity?.id + ) mBinding.questionseditTitle.setAdapter(titleTipAdapter) } @@ -179,11 +187,14 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke mBinding.questionseditTitle.requestFocus() mBinding.backBtn.setOnClickListener { - val bbsType = if (mViewModel.type.isNotEmpty()) if (mViewModel.type == "game_bbs") "游戏论坛" else "综合论坛" else "" - NewLogUtils.logQuestionEditClick("click_question_cancel", mViewModel.communityEntity?.id + val bbsType = + if (mViewModel.type.isNotEmpty()) if (mViewModel.type == "game_bbs") "游戏论坛" else "综合论坛" else "" + NewLogUtils.logQuestionEditClick( + "click_question_cancel", mViewModel.communityEntity?.id ?: "", - bbsType, mViewModel.selectActivityLabelEntity?.name - ?: "", mViewModel.quoteCountEntity) + bbsType, mViewModel.selectActivityLabelEntity?.name + ?: "", mViewModel.quoteCountEntity + ) onBackPressed() } mBinding.chooseForumTv.setOnClickListener { @@ -195,8 +206,10 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke 200L } else 0L AppExecutor.uiExecutor.executeWithDelay(Runnable { - ChooseActivityDialogFragment.show(this, ChooseActivityDialogFragment.ActivityLabelLocation.BBS_QUESTION, - mViewModel.selectActivityLabelEntity?.id) { + ChooseActivityDialogFragment.show( + this, ChooseActivityDialogFragment.ActivityLabelLocation.BBS_QUESTION, + mViewModel.selectActivityLabelEntity?.id + ) { mViewModel.selectActivityLabelEntity = it mBinding.activityTitle.text = it?.name mBinding.activityTitle.setTextColor(if (it != null) R.color.text_FA8500.toColor() else R.color.text_333333.toColor()) @@ -210,9 +223,12 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke }, 50) if (intent != null) { - val communityEntity = intent.getParcelableExtra(CommunityEntity::class.java.simpleName) - val detailEntity = intent.getParcelableExtra(QuestionsDetailEntity::class.java.simpleName) - val draftEntity = intent.getParcelableExtra(QuestionDraftEntity::class.java.simpleName) + val communityEntity = + intent.getParcelableExtra(CommunityEntity::class.java.simpleName) + val detailEntity = + intent.getParcelableExtra(QuestionsDetailEntity::class.java.simpleName) + val draftEntity = + intent.getParcelableExtra(QuestionDraftEntity::class.java.simpleName) when { detailEntity != null -> { // 问题编辑 setPatchContent(detailEntity) @@ -226,9 +242,11 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke else -> { // 新增问题 var searchKey = intent.getStringExtra(EntranceUtils.KEY_QUESTIONS_SEARCH_KEY) if (!searchKey.isNullOrEmpty() && searchKey.length > QuestionEditViewModel.QUESTION_TITLE_MAX_LENGTH) - searchKey = searchKey.substring(0, QuestionEditViewModel.QUESTION_TITLE_MAX_LENGTH) + searchKey = + searchKey.substring(0, QuestionEditViewModel.QUESTION_TITLE_MAX_LENGTH) if (mViewModel.title.isNullOrEmpty()) mViewModel.title = searchKey - mViewModel.isFromSearch = intent.getBooleanExtra(QuestionEditViewModel.QUESTION_FORM_SEARCH, false) + mViewModel.isFromSearch = + intent.getBooleanExtra(QuestionEditViewModel.QUESTION_FORM_SEARCH, false) mViewModel.type = intent?.getStringExtra(BbsType::class.java.simpleName) ?: "" mBaseHandler.sendEmptyMessageDelayed(1, SAVE_DRAFTS_INTERVAL_TIME.toLong()) if (communityEntity != null) { @@ -236,7 +254,12 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke setForumName() if (mViewModel.type == BbsType.GAME_BBS.value) { mBinding.chooseForumTv.isEnabled = false - mBinding.chooseForumTv.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null) + mBinding.chooseForumTv.setCompoundDrawablesWithIntrinsicBounds( + null, + null, + null, + null + ) } } showUploadVideoGuide() @@ -261,13 +284,15 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke mViewModel.communityEntity?.iconSubscript = detailEntity.community.game?.iconSubscript mViewModel.gameEntity = detailEntity.gameEntity if (detailEntity.tagActivityId.isNotEmpty() && detailEntity.tagActivityName.isNotEmpty()) { - mViewModel.selectActivityLabelEntity = ActivityLabelEntity(detailEntity.tagActivityId, detailEntity.tagActivityName) + mViewModel.selectActivityLabelEntity = + ActivityLabelEntity(detailEntity.tagActivityId, detailEntity.tagActivityName) mBinding.activityTitle.text = detailEntity.tagActivityName mBinding.activityTitle.setTextColor(R.color.text_FA8500.toColor()) } mBinding.chooseActivityContainer.isEnabled = false - mViewModel.isModeratorPatch = intent.getBooleanExtra(EntranceUtils.KEY_QUESTION_MODERATOR_PATCH, false) + mViewModel.isModeratorPatch = + intent.getBooleanExtra(EntranceUtils.KEY_QUESTION_MODERATOR_PATCH, false) // 编辑问题时可能存在草稿 if (mViewModel.questionDraftEntity != null) { @@ -289,7 +314,8 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke mViewModel.communityEntity?.iconSubscript = draftEntity.bbs?.game?.iconSubscript mViewModel.type = draftEntity.type if (draftEntity.tagActivityId.isNotEmpty() && draftEntity.tagActivityName.isNotEmpty()) { - mViewModel.selectActivityLabelEntity = ActivityLabelEntity(draftEntity.tagActivityId, draftEntity.tagActivityName) + mViewModel.selectActivityLabelEntity = + ActivityLabelEntity(draftEntity.tagActivityId, draftEntity.tagActivityName) mBinding.activityTitle.text = draftEntity.tagActivityName mBinding.activityTitle.setTextColor(R.color.text_FA8500.toColor()) } @@ -309,7 +335,10 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke } else { toast("操作成功") val data = Intent() - data.putExtra(QuestionsDetailEntity::class.java.simpleName, mViewModel.questionEntity) + data.putExtra( + QuestionsDetailEntity::class.java.simpleName, + mViewModel.questionEntity + ) setResult(Activity.RESULT_OK, data) } finish() @@ -323,11 +352,13 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke val errorJson = JSONObject(string) val errorCode = errorJson.getInt("code") if (errorCode == 403059) { - DialogUtils.showAlertDialog(this, "提交失败", "权限错误,请刷新后重试", - "确定", null, DialogUtils.ConfirmListener { - setResult(Activity.RESULT_CANCELED) - finish() - }, null) + DialogUtils.showAlertDialog( + this, "提交失败", "权限错误,请刷新后重试", + "确定", null, DialogUtils.ConfirmListener { + setResult(Activity.RESULT_CANCELED) + finish() + }, null + ) return@Observer } } @@ -341,7 +372,10 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke if (pair.second) { if (mViewModel.questionDraftEntity != null) { val intent = Intent() - intent.putExtra(QuestionDraftEntity::class.java.simpleName, mViewModel.questionDraftEntity) + intent.putExtra( + QuestionDraftEntity::class.java.simpleName, + mViewModel.questionDraftEntity + ) setResult(Activity.RESULT_OK, intent) if (mViewModel.checkIsAllUploadedAndToast()) { Utils.toast(this, "已保存!") @@ -351,7 +385,8 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke Utils.toast(this, "问题已保存到草稿箱") } } - EventBus.getDefault().post(EBReuse(ArticleEditActivity.ARTICLE_DRAFT_CHANGE_TAG)) + EventBus.getDefault() + .post(EBReuse(ArticleEditActivity.ARTICLE_DRAFT_CHANGE_TAG)) finish() } } @@ -368,7 +403,10 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke SaveDraftType.SKIP -> { if (pair.second) { Utils.toast(this, "问题已保存到草稿箱") - startActivityForResult(ArticleDraftActivity.getIntent(this), ArticleEditActivity.ARTICLE_DRAFT_REQUEST_CODE) + startActivityForResult( + ArticleDraftActivity.getIntent(this), + ArticleEditActivity.ARTICLE_DRAFT_REQUEST_CODE + ) } else { Utils.toast(this, "问题草稿保存失败") } @@ -392,13 +430,19 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke mProcessingDialog = WaitingDialogFragment.newInstance(it.msg, false) mProcessingDialog?.show(supportFragmentManager, null) { if (mViewModel.uploadImageSubscription != null && !mViewModel.uploadImageSubscription!!.isDisposed) { - mUploadImageCancelDialog = DialogUtils.showAlertDialog(this, "提示" - , "图片正在上传中,确定取消吗?" - , "确定", "取消", { - mViewModel.uploadImageSubscription!!.dispose() - mUploadImageCancelDialog?.dismiss() - mProcessingDialog?.dismiss() - }, null) + mUploadImageCancelDialog = DialogUtils.showAlertDialog( + this, + "提示", + "图片正在上传中,确定取消吗?", + "确定", + "取消", + { + mViewModel.uploadImageSubscription!!.dispose() + mUploadImageCancelDialog?.dismiss() + mProcessingDialog?.dismiss() + }, + null + ) } } } @@ -427,28 +471,41 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke if (checkSameFromQuestionData()) { toast("内容没有变化") } else { + //版主不是作者时,仅能修改用户的标题内容,正文不能修改 + if (mViewModel.questionEntity?.user?.id != UserManager.getInstance().userId && mViewModel.questionEntity?.description != mViewModel.content) { + toast("不能修改正文") + return true + } mViewModel.selectedTags.addAll(mViewModel.questionEntity?.tags!!) - DialogUtils.showAlertDialog(this, "修改问题", - if (mViewModel.questionEntity!!.me.moderatorPermissions.updateQuestion == Permissions.REPORTER) - "你的操作将提交给小编审核,确定提交吗?" else "你的操作将立即生效,确定提交吗?", - "确定", "取消", DialogUtils.ConfirmListener { - mViewModel.uploadPicAndPatchQuestion(false) - }, null) + DialogUtils.showAlertDialog( + this, "修改问题", + if (mViewModel.questionEntity!!.me.moderatorPermissions.updateQuestion == Permissions.REPORTER) + "你的操作将提交给小编审核,确定提交吗?" else "你的操作将立即生效,确定提交吗?", + "确定", "取消", DialogUtils.ConfirmListener { + mViewModel.uploadPicAndPatchQuestion(false) + }, null + ) } } else { if (mViewModel.checkTitleAndLoadTitleTag(mIsKeyBoardShow)) { mTagsSelectFragment?.postQuestion() } } - val bbsType = if (mViewModel.type.isNotEmpty()) if (mViewModel.type == "game_bbs") "游戏论坛" else "综合论坛" else "" - NewLogUtils.logQuestionEditClick("click_question_post_button", mViewModel.communityEntity?.id + val bbsType = + if (mViewModel.type.isNotEmpty()) if (mViewModel.type == "game_bbs") "游戏论坛" else "综合论坛" else "" + NewLogUtils.logQuestionEditClick( + "click_question_post_button", mViewModel.communityEntity?.id ?: "", - bbsType, mViewModel.selectActivityLabelEntity?.name - ?: "", mViewModel.quoteCountEntity) + bbsType, mViewModel.selectActivityLabelEntity?.name + ?: "", mViewModel.quoteCountEntity + ) } else if (menuItem?.itemId == R.id.menu_draft) { if (checkDraft(SaveDraftType.SKIP)) { NewLogUtils.logQuestionDraftClick() - startActivityForResult(QuestionDraftActivity.getIntent(this), QUESTION_DRAFT_REQUEST_CODE) + startActivityForResult( + QuestionDraftActivity.getIntent(this), + QUESTION_DRAFT_REQUEST_CODE + ) } } @@ -476,7 +533,10 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke private fun showSelectGameDialog() { if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { - startActivityForResult(GameActivity.getIntent(this, GameActivity.SELECT_GAME_TITLE), VideoPublishFragment.REQUEST_GAME_CODE) + startActivityForResult( + GameActivity.getIntent(this, GameActivity.SELECT_GAME_TITLE), + VideoPublishFragment.REQUEST_GAME_CODE + ) } else { val delayTime = if (mIsKeyBoardShow) { Util_System_Keyboard.hideSoftKeyboard(this) @@ -534,22 +594,31 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke if (checkSameFromQuestionData()) { return false } - DialogUtils.showCancelAlertDialog(this, "提示" - , "确定退出修改?已编辑的内容将丢失" - , "继续编辑", " 退出", null) { finish() } + DialogUtils.showCancelAlertDialog( + this, "提示", "确定退出修改?已编辑的内容将丢失", "继续编辑", " 退出", null + ) { finish() } return true } //问题发布 if (mViewModel.questionEntity == null && mViewModel.questionDraftEntity == null) { if (!mBinding.questionseditTitle.text.isNullOrEmpty() || !mBinding.richEditor.html.isNullOrEmpty()) { - DialogUtils.showNewAlertDialog(this, "提示", "是否保存内容再退出?", "不保存", "保存并退出", Gravity.CENTER, true, { - finish() - }, { - mViewModel.title = mBinding.questionseditTitle.text.toString() - mViewModel.content = getReplaceRealContent() - mViewModel.saveQuestionDraft(SaveDraftType.EXIT) - }) + DialogUtils.showNewAlertDialog( + this, + "提示", + "是否保存内容再退出?", + "不保存", + "保存并退出", + Gravity.CENTER, + true, + { + finish() + }, + { + mViewModel.title = mBinding.questionseditTitle.text.toString() + mViewModel.content = getReplaceRealContent() + mViewModel.saveQuestionDraft(SaveDraftType.EXIT) + }) return true } } @@ -557,7 +626,8 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke //问题编辑,需要判断是否修改过 if (mViewModel.questionEntity != null && mViewModel.questionDraftEntity == null) { return if (mViewModel.questionEntity?.title != mBinding.questionseditTitle.text.toString() - || mViewModel.questionEntity?.description != mBinding.richEditor.html) { + || mViewModel.questionEntity?.description != mBinding.richEditor.html + ) { showBackDialog() true } else false @@ -572,7 +642,8 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke if (saveType == SaveDraftType.SKIP) { //判断是否修改了草稿,修改了需自动保存无需提示 if (draftEntity.title != mBinding.questionseditTitle.text.toString() - || draftEntity.description != mBinding.richEditor.html) { + || draftEntity.description != mBinding.richEditor.html + ) { mViewModel.title = mBinding.questionseditTitle.text.toString() mViewModel.content = getReplaceRealContent() mViewModel.saveQuestionDraft(SaveDraftType.AUTO) @@ -581,7 +652,8 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke } else if (saveType == SaveDraftType.EXIT) { //退出页面需判断是否修改了草稿,修改了需弹窗提示 if (draftEntity.title != mBinding.questionseditTitle.text.toString() - || draftEntity.description != mBinding.richEditor.html) { + || draftEntity.description != mBinding.richEditor.html + ) { showBackDialog() return false } @@ -590,13 +662,22 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke } private fun showBackDialog() { - DialogUtils.showNewAlertDialog(this, "提示", "是否保存修改内容用于下次编辑?", "不保存", "保存并退出", Gravity.CENTER, true, { - finish() - }, { - mViewModel.title = mBinding.questionseditTitle.text.toString() - mViewModel.content = getReplaceRealContent() - mViewModel.saveQuestionDraft(SaveDraftType.EXIT) - }) + DialogUtils.showNewAlertDialog( + this, + "提示", + "是否保存修改内容用于下次编辑?", + "不保存", + "保存并退出", + Gravity.CENTER, + true, + { + finish() + }, + { + mViewModel.title = mBinding.questionseditTitle.text.toString() + mViewModel.content = getReplaceRealContent() + mViewModel.saveQuestionDraft(SaveDraftType.EXIT) + }) } private fun checkSameFromQuestionData(): Boolean { @@ -616,14 +697,20 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke if (mViewModel.communityEntity != null) { if (mViewModel.type == BbsType.GAME_BBS.value) { mBinding.chooseForumTv.text = mViewModel.communityEntity?.name - mBinding.forumIconView.displayGameIcon(mViewModel.communityEntity?.icon, mViewModel.communityEntity?.iconSubscript) + mBinding.forumIconView.displayGameIcon( + mViewModel.communityEntity?.icon, + mViewModel.communityEntity?.iconSubscript + ) setForumUI() } else if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { if (mViewModel.gameEntity == null) { mBinding.chooseForumTv.text = "选择游戏" } else { mBinding.chooseForumTv.text = mViewModel.gameEntity?.name - mBinding.forumIconView.displayGameIcon(mViewModel.gameEntity?.icon, mViewModel.gameEntity?.iconSubscript) + mBinding.forumIconView.displayGameIcon( + mViewModel.gameEntity?.icon, + mViewModel.gameEntity?.iconSubscript + ) setForumUI() } } @@ -637,7 +724,11 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke val beginTransaction = supportFragmentManager.beginTransaction() mTagsSelectFragment = TagsSelectFragment.getInstance() - beginTransaction.replace(R.id.tagsContainer, mTagsSelectFragment!!, TagsSelectFragment::javaClass.name) + beginTransaction.replace( + R.id.tagsContainer, + mTagsSelectFragment!!, + TagsSelectFragment::javaClass.name + ) beginTransaction.commitAllowingStateLoss() mViewModel.selectedTags.clear() mViewModel.selectedTagsChange.postValue(true) @@ -646,8 +737,14 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke private fun setForumUI() { mBinding.forumIconView.visibility = View.VISIBLE - mBinding.forumContainer.background = ContextCompat.getDrawable(this, R.drawable.bg_shape_f5_radius_999) - mBinding.chooseForumTv.setCompoundDrawablesWithIntrinsicBounds(null, null, ContextCompat.getDrawable(this, R.drawable.ic_article_edit_choose_forum_arrow_gray), null) + mBinding.forumContainer.background = + ContextCompat.getDrawable(this, R.drawable.bg_shape_f5_radius_999) + mBinding.chooseForumTv.setCompoundDrawablesWithIntrinsicBounds( + null, + null, + ContextCompat.getDrawable(this, R.drawable.ic_article_edit_choose_forum_arrow_gray), + null + ) mBinding.chooseForumTv.setTextColor(ContextCompat.getColor(this, R.color.text_333333)) } @@ -691,7 +788,11 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke return intent } - fun getIntent(context: Context, communityEntity: CommunityEntity, type: String = ""): Intent { + fun getIntent( + context: Context, + communityEntity: CommunityEntity, + type: String = "" + ): Intent { val intent = Intent(context, QuestionEditActivity::class.java) intent.putExtra(CommunityEntity::class.java.simpleName, communityEntity) intent.putExtra(BbsType::class.java.simpleName, type) From 7903751d85e57af5f6cd7b484c48b4b964b4d0cf Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Mon, 16 Aug 2021 14:28:35 +0800 Subject: [PATCH 068/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E9=AA=8C=E6=94=B6=E9=97=AE=E9=A2=98(23)=20https://git?= =?UTF-8?q?.ghzs.com/pm/halo-app-issues/-/issues/1442?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/util/ErrorHelper.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/gh/common/util/ErrorHelper.kt b/app/src/main/java/com/gh/common/util/ErrorHelper.kt index aa8cce174b..5aff9508c8 100644 --- a/app/src/main/java/com/gh/common/util/ErrorHelper.kt +++ b/app/src/main/java/com/gh/common/util/ErrorHelper.kt @@ -132,6 +132,7 @@ object ErrorHelper { 403082 -> Utils.toast(context, "作者已关闭评论") 403022 -> Utils.toast(context, "不能回复自己") 403056 -> Utils.toast(context, "发布失败,字数已达上限") + 403111 -> Utils.toast(context, "提交失败,评论违规") 403020 -> if (showHighPriorityHint) { DialogUtils.showAlertDialog( From 86edc8b9198b76703516fc760a4be83524522949 Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 16 Aug 2021 15:30:15 +0800 Subject: [PATCH 069/151] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E7=AE=80=E5=8D=95?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=85=89=E9=81=87=E6=B8=B8=E6=88=8F=E5=8C=85?= =?UTF-8?q?=E7=82=B9=E5=87=BB=E6=9B=B4=E6=96=B0=E6=97=B6=E4=BC=9A=E5=8D=A1?= =?UTF-8?q?=E4=BD=8F=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/util/DownloadObserver.kt | 26 ++++--- .../com/gh/common/util/PackageInstaller.kt | 30 +++++--- .../java/com/gh/common/util/PackageUtils.java | 17 ++++- .../gamecenter/receiver/InstallReceiver.java | 74 ++++++++++--------- 4 files changed, 89 insertions(+), 58 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/DownloadObserver.kt b/app/src/main/java/com/gh/common/util/DownloadObserver.kt index 11fa9a29ba..8816acf9e8 100644 --- a/app/src/main/java/com/gh/common/util/DownloadObserver.kt +++ b/app/src/main/java/com/gh/common/util/DownloadObserver.kt @@ -6,6 +6,8 @@ import com.gh.base.BaseActivity import com.gh.common.constant.Constants import com.gh.common.exposure.ExposureUtils import com.gh.common.exposure.meta.MetaUtil +import com.gh.common.runOnIoThread +import com.gh.common.runOnUiThread import com.gh.common.simulator.SimulatorDownloadManager import com.gh.common.simulator.SimulatorGameManager import com.gh.common.util.EnergyTaskHelper.postEnergyTask @@ -166,17 +168,21 @@ object DownloadObserver { Utils.toast(mApplication, R.string.install_failure_hint) downloadManager.cancel(downloadEntity.url) } else { - if (PackageUtils.isCanLaunchSetup(mApplication, downloadEntity.path)) { - downloadEntity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION] = "YES" - tryWithDefaultCatch { - PackageInstaller.install(mApplication, downloadEntity, false) - } - } else { - // 弹出卸载提示框 - if (downloadEntity.isPlugin) { - EventBus.getDefault().post(EBShowDialog(BaseActivity.PLUGGABLE, downloadEntity.path)) + runOnIoThread { + if (PackageUtils.isInstallable(mApplication, downloadEntity.path)) { + downloadEntity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION] = "YES" + tryWithDefaultCatch { + runOnUiThread { + PackageInstaller.install(mApplication, downloadEntity, false) + } + } } else { - EventBus.getDefault().post(EBShowDialog(BaseActivity.SIGNATURE_CONFLICT, downloadEntity.path)) + // 弹出卸载提示框 + if (downloadEntity.isPlugin) { + EventBus.getDefault().post(EBShowDialog(BaseActivity.PLUGGABLE, downloadEntity.path)) + } else { + EventBus.getDefault().post(EBShowDialog(BaseActivity.SIGNATURE_CONFLICT, downloadEntity.path)) + } } } } diff --git a/app/src/main/java/com/gh/common/util/PackageInstaller.kt b/app/src/main/java/com/gh/common/util/PackageInstaller.kt index a59453478e..cc79b536cf 100644 --- a/app/src/main/java/com/gh/common/util/PackageInstaller.kt +++ b/app/src/main/java/com/gh/common/util/PackageInstaller.kt @@ -10,6 +10,8 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.content.FileProvider import com.gh.common.constant.Constants import com.gh.common.dialog.InstallPermissionDialogFragment +import com.gh.common.runOnIoThread +import com.gh.common.runOnUiThread import com.gh.common.xapk.XapkInstaller import com.gh.download.server.BrowserInstallHelper import com.gh.gamecenter.BuildConfig @@ -77,20 +79,26 @@ object PackageInstaller { return } - if (PackageUtils.isCanLaunchSetup(context, pkgPath)) { - HaloApp.put(Constants.LAST_INSTALL_GAME, pkgPath) + runOnIoThread { + if (PackageUtils.isInstallable(context, pkgPath)) { + runOnUiThread { + HaloApp.put(Constants.LAST_INSTALL_GAME, pkgPath) - val installIntent = getInstallIntent(context, pkgPath) - context.startActivity(installIntent) - } else { - if (isPluggin) { - DialogHelper.showPluginDialog(context) { - uninstall(context, pkgPath) + val installIntent = getInstallIntent(context, pkgPath) + context.startActivity(installIntent) } } else { - // 非插件化的同包名不同签名冲突 - DialogHelper.showSignatureConflictDialog(context) { - uninstall(context, pkgPath) + runOnUiThread { + if (isPluggin) { + DialogHelper.showPluginDialog(context) { + uninstall(context, pkgPath) + } + } else { + // 非插件化的同包名不同签名冲突 + DialogHelper.showSignatureConflictDialog(context) { + uninstall(context, pkgPath) + } + } } } } diff --git a/app/src/main/java/com/gh/common/util/PackageUtils.java b/app/src/main/java/com/gh/common/util/PackageUtils.java index d5b688132b..a0c627bda1 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -16,8 +16,10 @@ import android.os.PowerManager; import android.text.TextUtils; import androidx.annotation.Nullable; +import androidx.annotation.WorkerThread; import com.g00fy2.versioncompare.Version; +import com.gh.common.AppExecutor; import com.gh.common.xapk.XapkInstaller; import com.gh.gamecenter.BuildConfig; import com.gh.gamecenter.entity.ApkEntity; @@ -226,9 +228,13 @@ public class PackageUtils { return null; } - // TODO 找一个更好的办法来比较签名并且不触发 ANR + // TODO 找一个更高效的方式来比较 V2 签名 public static boolean compareSignatureBetweenInstalledAppWithApk(Context context, String packageName, String apkFilePath) { try { + AppExecutor.getUiExecutor().execute(() -> { + ToastUtils.toast("安装包校验中,约需要3~5秒,请稍候"); + }); + // 据 Sentry 统计,刚上架一个周末的包里对这个方法有 700+ 次调用,然后其中一部分会造成 ANR Signature sig = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures[0]; @@ -281,11 +287,14 @@ public class PackageUtils { } /** - * 根据 path 获取 apk 信息确定处理方式 + * 根据 path 获取 apk 是否可安装 (全新安装或覆盖安装) + * + * 由于部分不存在 V1 签名的大安装包在调用系统 API 获取签名信息时会非常慢,所以请在工作线程里调用此方法 * - * @return true 为直接唤起系统 PackageInstaller, false 为需要插件化 + * @return true 为可直接唤起系统 PackageInstaller, false 为需要插件化 */ - public static boolean isCanLaunchSetup(Context context, String path) { + @WorkerThread + public static boolean isInstallable(Context context, String path) { String packageName = getPackageNameByPath(context, path); if (TextUtils.isEmpty(packageName)) { diff --git a/app/src/main/java/com/gh/gamecenter/receiver/InstallReceiver.java b/app/src/main/java/com/gh/gamecenter/receiver/InstallReceiver.java index 69e48dc8bf..d18dfa1c1b 100644 --- a/app/src/main/java/com/gh/gamecenter/receiver/InstallReceiver.java +++ b/app/src/main/java/com/gh/gamecenter/receiver/InstallReceiver.java @@ -7,6 +7,7 @@ import android.content.Intent; import android.os.Bundle; import com.gh.base.fragment.BaseFragment_ViewPager; +import com.gh.common.AppExecutor; import com.gh.common.constant.Constants; import com.gh.common.util.DownloadNotificationHelper; import com.gh.common.util.EntranceUtils; @@ -44,42 +45,49 @@ public class InstallReceiver extends BroadcastReceiver { } updateNotification(downloadEntity); - if (PackageUtils.isCanLaunchSetup(context, path)) { - if (downloadEntity != null) { - PackageInstaller.install(context, downloadEntity); + DownloadEntity finalDownloadEntity = downloadEntity; + AppExecutor.getIoExecutor().execute(() -> { + if (PackageUtils.isInstallable(context, path)) { + AppExecutor.getUiExecutor().execute(() -> { + if (finalDownloadEntity != null) { + PackageInstaller.install(context, finalDownloadEntity); + } else { + PackageInstaller.install(context, false, path); + } + }); } else { - PackageInstaller.install(context, false, path); - } - } else { - if (RunningUtils.isRunning(context)) { - if (RunningUtils.isEqualsTop(context, DownloadManagerActivity.class.getName())) { - // 这里是指从后台返回到前台 前两个的是关键 - Intent intent2 = new Intent(); - intent2.setAction(Intent.ACTION_MAIN); - intent2.addCategory(Intent.CATEGORY_LAUNCHER); - intent2.setComponent(new ComponentName(context, DownloadManagerActivity.class)); - intent2.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); - context.startActivity(intent2); + AppExecutor.getUiExecutor().execute(() -> { + if (RunningUtils.isRunning(context)) { + if (RunningUtils.isEqualsTop(context, DownloadManagerActivity.class.getName())) { + // 这里是指从后台返回到前台 前两个的是关键 + Intent intent2 = new Intent(); + intent2.setAction(Intent.ACTION_MAIN); + intent2.addCategory(Intent.CATEGORY_LAUNCHER); + intent2.setComponent(new ComponentName(context, DownloadManagerActivity.class)); + intent2.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); + context.startActivity(intent2); - EventBus.getDefault().post(new EBMiPush("plugin_install", path)); - } else { - Intent intent2 = new Intent(context, DownloadManagerActivity.class); - intent2.putExtra(BaseFragment_ViewPager.ARGS_INDEX, 0); - intent2.putExtra(EntranceUtils.KEY_PATH, path); - intent2.putExtra(EntranceUtils.KEY_ENTRANCE, "(安装跳转)"); - intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent2); - } - } else { - // 应用未在运行 - Bundle bundle = new Bundle(); - bundle.putString(KEY_TO, DownloadManagerActivity.TAG); - bundle.putInt(BaseFragment_ViewPager.ARGS_INDEX, 0); - bundle.putString(EntranceUtils.KEY_PATH, path); - bundle.putString(EntranceUtils.KEY_ENTRANCE, "(安装跳转)"); - context.startActivity(SplashScreenActivity.getSplashScreenIntent(context, bundle)); + EventBus.getDefault().post(new EBMiPush("plugin_install", path)); + } else { + Intent intent2 = new Intent(context, DownloadManagerActivity.class); + intent2.putExtra(BaseFragment_ViewPager.ARGS_INDEX, 0); + intent2.putExtra(EntranceUtils.KEY_PATH, path); + intent2.putExtra(EntranceUtils.KEY_ENTRANCE, "(安装跳转)"); + intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent2); + } + } else { + // 应用未在运行 + Bundle bundle = new Bundle(); + bundle.putString(KEY_TO, DownloadManagerActivity.TAG); + bundle.putInt(BaseFragment_ViewPager.ARGS_INDEX, 0); + bundle.putString(EntranceUtils.KEY_PATH, path); + bundle.putString(EntranceUtils.KEY_ENTRANCE, "(安装跳转)"); + context.startActivity(SplashScreenActivity.getSplashScreenIntent(context, bundle)); + } + }); } - } + }); }); } From e2fa4990bda58346d46de8f0f786fb714aea33d9 Mon Sep 17 00:00:00 2001 From: leafwai Date: Mon, 16 Aug 2021 18:34:38 +0800 Subject: [PATCH 070/151] =?UTF-8?q?=E9=87=8D=E6=9E=84=E6=88=91=E7=9A=84?= =?UTF-8?q?=E5=85=89=E7=8E=AF=E9=A1=B5=E9=9D=A2https://git.ghzs.com/halo/a?= =?UTF-8?q?ndroid/assistant-android/-/issues/31?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gamedetail/rating/RatingFragment.kt | 4 +- .../personal/NewPersonalFragment.java | 788 ---------------- .../personal/NewPersonalFragment.kt | 731 +++++++++++++++ .../gamecenter/personal/PersonalFragment.java | 847 ------------------ .../gamecenter/personal/PersonalFragment.kt | 779 ++++++++++++++++ .../gamecenter/personal/PersonalViewModel.kt | 231 ++++- .../qa/answer/detail/AnswerDetailFragment.kt | 4 +- .../detail/QuestionsDetailFragment.kt | 4 +- .../res/layout/fragment_new_personal_stub.xml | 23 +- .../res/layout/fragment_personal_stub.xml | 23 +- 10 files changed, 1740 insertions(+), 1694 deletions(-) delete mode 100644 app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.java create mode 100644 app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.kt delete mode 100644 app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java create mode 100644 app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.kt diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingFragment.kt index eb17ef368f..7b2d730556 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingFragment.kt @@ -29,7 +29,7 @@ import com.gh.gamecenter.entity.Star import com.gh.gamecenter.eventbus.EBReuse import com.gh.gamecenter.eventbus.EBTypeChange import com.gh.gamecenter.gamedetail.GameDetailFragment -import com.gh.gamecenter.personal.PersonalFragment.LOGIN_TAG +import com.gh.gamecenter.personal.PersonalFragment import com.halo.assistant.HaloApp import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe @@ -170,7 +170,7 @@ class RatingFragment : ListFragment(), IScrollab @Subscribe(threadMode = ThreadMode.MAIN) fun onEventMainThread(changed: EBReuse) { - if (LOGIN_TAG == changed.type) { // 登入 + if (PersonalFragment.LOGIN_TAG == changed.type) { // 登入 onLoadRefresh() } } diff --git a/app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.java b/app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.java deleted file mode 100644 index a44388b9d8..0000000000 --- a/app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.java +++ /dev/null @@ -1,788 +0,0 @@ -package com.gh.gamecenter.personal; - -import android.annotation.SuppressLint; -import android.content.Intent; -import android.os.Build; -import android.os.Bundle; -import android.text.TextUtils; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewStub; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import androidx.annotation.Nullable; -import androidx.appcompat.widget.Toolbar; -import androidx.core.content.ContextCompat; -import androidx.lifecycle.ViewModelProviders; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; - -import com.facebook.drawee.view.SimpleDraweeView; -import com.gh.base.fragment.BaseLazyFragment; -import com.gh.common.databind.BindingAdapters; -import com.gh.common.notifier.Notifier; -import com.gh.common.util.CheckLoginUtils; -import com.gh.common.util.DataUtils; -import com.gh.common.util.DialogUtils; -import com.gh.common.util.DirectUtils; -import com.gh.common.util.DisplayUtils; -import com.gh.common.util.EntranceUtils; -import com.gh.common.util.ImageUtils; -import com.gh.common.util.IntegralLogHelper; -import com.gh.common.util.LogUtils; -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.AvatarBorderView; -import com.gh.common.view.SpacingItemDecoration; -import com.gh.gamecenter.GameDetailActivity; -import com.gh.gamecenter.MainActivity; -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; -import com.gh.gamecenter.entity.LinkEntity; -import com.gh.gamecenter.entity.LoginTokenEntity; -import com.gh.gamecenter.entity.MessageUnreadEntity; -import com.gh.gamecenter.entity.SignEntity; -import com.gh.gamecenter.entity.UserInfoEntity; -import com.gh.gamecenter.eventbus.EBConcernChanged; -import com.gh.gamecenter.eventbus.EBNetworkState; -import com.gh.gamecenter.eventbus.EBReuse; -import com.gh.gamecenter.eventbus.EBSkip; -import com.gh.gamecenter.fragment.MainWrapperFragment; -import com.gh.gamecenter.energy.EnergyCenterActivity; -import com.gh.gamecenter.energy.EnergyHouseActivity; -import com.gh.gamecenter.manager.UserManager; -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.SimpleAnswerDetailActivity; -import com.gh.gamecenter.retrofit.BiResponse; -import com.gh.gamecenter.retrofit.Response; -import com.gh.gamecenter.retrofit.RetrofitManager; -import com.gh.gamecenter.room.AppDatabase; -import com.gh.gamecenter.subject.SubjectActivity; -import com.gh.gamecenter.user.UserViewModel; -import com.google.android.material.appbar.AppBarLayout; -import com.halo.assistant.HaloApp; -import com.lightgame.utils.Utils; -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; -import java.util.ArrayList; -import java.util.Locale; - -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnClick; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.schedulers.Schedulers; -import okhttp3.MediaType; -import okhttp3.RequestBody; -import okhttp3.ResponseBody; - -public class NewPersonalFragment extends BaseLazyFragment { - - @BindView(R.id.list_refresh) - SwipeRefreshLayout mListRefresh; - @BindView(R.id.appbar) - AppBarLayout appbar; - @BindView(R.id.toolbar) - Toolbar toolbar; - @BindView(R.id.personal_msg) - ImageView mPersonalMsg; - @BindView(R.id.login_message_hint) - TextView mLoginMessageHint; - @BindView(R.id.personal_user_icon) - AvatarBorderView mUserIcon; - @BindView(R.id.personal_user_small_icon) - SimpleDraweeView mUserIconSmall; - // @BindView(R.id.personal_user_badge) -// SimpleDraweeView mUserBadge; - @BindView(R.id.personal_login) - View mPersonalLogin; - @BindView(R.id.personal_home) - TextView mPersonalHome; - @BindView(R.id.personal_user_name) - TextView mPersonalUserName; - @BindView(R.id.personal_user_name_small) - TextView mPersonalUserNameSmall; - @BindView(R.id.personal_badge) - RelativeLayout mPersonalBadge; - @BindView(R.id.personal_badge_icon) - SimpleDraweeView mPersonalBadgeIcon; - @BindView(R.id.personalMyBadgeIcon) - ImageView mPersonalMyBadgeIcon; - @BindView(R.id.personal_badge_count_tv) - TextView mPersonalBadgeCountTv; - @BindView(R.id.personal_badge_tv) - ImageView mPersonalBadgeTv; - @BindView(R.id.personal_badge_tips) - View mPersonalBadgeTips; - @BindView(R.id.personal_func) - RecyclerView mFuncRecyclerView; - @BindView(R.id.personal_new_fans_tips) - View personalNewFansTips; - @BindView(R.id.personal_energy_tv) - TextView mPersonalEnergyTv; - @BindView(R.id.personal_energy) - View mPersonalEnergy; - @BindView(R.id.personal_receive_energy) - View mPersonalReceiveEnergy; - - 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; - - private AppDatabase mDatabase; - - private UserViewModel mUserViewModel; - private MessageUnreadViewModel mUnreadViewModel; - private UserHomeViewModel mUserHomeViewModel; - private PersonalViewModel mPersonalViewModel; - - private NewPersonalFunctionGroupAdapter mPersonalFuncGroupAdapter; - - private boolean mIsLogging = false; - private long mEnergy = 0; - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == Constants.REQUEST_LOGIN) { // QQ Login callback - LoginHelper.onQQLoginCallback(requestCode, resultCode, data); - } else if (requestCode == 32973) {// 32973 WeiBo requestCode - LoginHelper.onWeiboLoginCallback(requestCode, resultCode, data); - } else if (requestCode == REQUEST_MESSAGE) { - if (mUnreadViewModel != null) mUnreadViewModel.retry(); - } - } - - @Override - protected int getLayoutId() { - return R.layout.fragment_new_personal_stub; - } - - @Override - protected boolean useButterKnife() { - return false; - } - - @SuppressLint("CheckResult") - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - mDatabase = AppDatabase.getInstance(getContext()); - final UserViewModel.Factory factory = new UserViewModel.Factory(getActivity().getApplication()); - mUserViewModel = ViewModelProviders.of(this, factory).get(UserViewModel.class); - mUserHomeViewModel = ViewModelProviders.of(this, new UserHomeViewModel.Factory(HaloApp.getInstance().getApplication(), - UserManager.getInstance().getUserId())).get(UserHomeViewModel.class); - mUnreadViewModel = ViewModelProviders.of(this, - new MessageUnreadViewModel.Factory(HaloApp.getInstance().getApplication())).get(MessageUnreadViewModel.class); - mPersonalViewModel = ViewModelProviders.of(this).get(PersonalViewModel.class); - - observeNoneUIRelatedChanges(); - } - - @Override - public void onFragmentFirstVisible() { - super.onFragmentFirstVisible(); - - inflateRealView(); - observeUIRelatedChanges(); - } - - private void inflateRealView() { - try { - mCachedView = ((ViewStub) (mCachedView.findViewById(R.id.stub))).inflate(); - } catch (Exception e) { - e.printStackTrace(); - } - - ButterKnife.bind(this, mCachedView); - - mPersonalFuncGroupAdapter = new NewPersonalFunctionGroupAdapter(requireContext()); - mFuncRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); - mFuncRecyclerView.setAdapter(mPersonalFuncGroupAdapter); - mFuncRecyclerView.addItemDecoration(new SpacingItemDecoration(true, false, false, false, 0, DisplayUtils.dip2px(32F), 0, 0)); - - int statusBarHeight = Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT ? 0 : DisplayUtils.getStatusBarHeight(getResources()); - ViewGroup.LayoutParams params = toolbar.getLayoutParams(); - params.height = DisplayUtils.dip2px(50) + statusBarHeight; - toolbar.setLayoutParams(params); - - appbar.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> { - int absOffset = Math.abs(verticalOffset); - int invisibleOffset = DisplayUtils.dip2px(56F + 48F - 50F) - DisplayUtils.getStatusBarHeight(getResources()); - if (absOffset <= invisibleOffset) { - mUserIconSmall.setVisibility(View.GONE); - mPersonalUserNameSmall.setVisibility(View.GONE); - toolbar.setBackground(null); - } else { - mUserIconSmall.setVisibility(View.VISIBLE); - mPersonalUserNameSmall.setVisibility(View.VISIBLE); - toolbar.setBackgroundResource(R.drawable.bg_personal_top); - } - mListRefresh.setEnabled(absOffset <= 2); - }); - mListRefresh.setColorSchemeColors(ContextCompat.getColor(requireContext(), R.color.theme)); - mListRefresh.setProgressViewOffset(false, 0, DisplayUtils.dip2px(80) + DisplayUtils.getStatusBarHeight(requireContext().getResources())); - mListRefresh.setOnRefreshListener(() -> { - mPersonalViewModel.getHaloAddons(); - if (CheckLoginUtils.isLogin()) { - mUnreadViewModel.retry(); - MessageUnreadRepository.INSTANCE.loadMessageUnreadTotal(false); - mUserHomeViewModel.getBadgeList(); - mUserHomeViewModel.availableBadges(); - } - mBaseHandler.postDelayed(() -> { - mListRefresh.setRefreshing(false); - }, 2000); - MtaHelper.onEvent("我的光环_新", "下拉刷新", "下拉刷新"); - }); - MessageUnreadRepository.INSTANCE.loadMessageUnreadTotal(true); - } - - private void observeNoneUIRelatedChanges() { - mPersonalViewModel.getHaloAddons(); - mUserViewModel.getLoginObsUserinfo().observe(this, userInfoEntity -> { - UserInfoEntity notifyUserInfo; - if (userInfoEntity != null) { - notifyUserInfo = userInfoEntity.getData(); - } else { - notifyUserInfo = null; - } - - if (notifyUserInfo != null && mUserInfoEntity == null) { // 单个用户,首次触发 - EventBus.getDefault().post(new EBConcernChanged()); - - LoginTokenEntity loginTokenEntity = UserManager.getInstance().getLoginTokenEntity(); - if (mIsLogging && loginTokenEntity != null) { - String loginType = loginTokenEntity.getLoginType(); - LogUtils.login("success", loginType, getLoginEntranceByType(loginType)); - mIsLogging = false; - } - } - - mUserInfoEntity = notifyUserInfo; - if (notifyUserInfo == null) { - mUnreadViewModel.clean(); - EventBus.getDefault().post(new EBConcernChanged()); - } - }); - - mPersonalViewModel.getHaloAddData().observe(this, datas -> { - if (!datas.isEmpty()) { - MessageUnreadRepository.INSTANCE.loadMessageUnreadTotal(false); - } - }); - - mUnreadViewModel.getLiveData().observe(this - , messageUnread -> { - if (messageUnread != null && messageUnread.getTotal() > 0) { - // 第一次开启应用时检查消息中心看有没有未读消息确定需不需要弹 Notifier 通知 - showNotifier(messageUnread); - } - }); - } - - @SuppressLint("CheckResult") - private void observeUIRelatedChanges() { - mUserViewModel.getLoginObsUserinfo().observe(this, userInfoEntity -> { - if (userInfoEntity != null && userInfoEntity.getData() != null) { - changeLoginState(true); - } else { - changeLoginState(false); - } - }); - - mUserHomeViewModel.getBadges().observe(this, badgeEntities -> { - mPersonalBadgeIcon.setImageURI(""); - - if (badgeEntities.isEmpty()) { - mPersonalBadgeTv.setVisibility(View.GONE); - mPersonalBadgeCountTv.setVisibility(View.GONE); - mPersonalMyBadgeIcon.setVisibility(View.VISIBLE); - } else { - mPersonalBadgeTv.setVisibility(View.VISIBLE); - mPersonalBadgeCountTv.setVisibility(View.VISIBLE); - mPersonalMyBadgeIcon.setVisibility(View.GONE); - mPersonalBadgeCountTv.setText(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("申请失败"); - } - } - })); - } - }); - - mUserHomeViewModel.getEnergy().observe(this, energy -> { - mEnergy = energy; - if (energy > 9999) { - mPersonalEnergyTv.setText("9999+"); - } else { - mPersonalEnergyTv.setText(energy + ""); - } - }); - - mUserHomeViewModel.getSignStatus().observe(this, entity -> { - if (entity.getTodaySignIn()) { - mPersonalEnergy.setVisibility(View.VISIBLE); - mPersonalReceiveEnergy.setVisibility(View.GONE); - } else { - mPersonalEnergy.setVisibility(View.GONE); - mPersonalReceiveEnergy.setVisibility(View.VISIBLE); - } - }); - - mPersonalViewModel.getHaloAddData().observe(this, datas -> { - if (!datas.isEmpty()) { - mPersonalFuncGroupAdapter.setListData(datas); - checkUpdate(); - } - }); - - mUnreadViewModel.getLiveData().observe(this - , messageUnread -> { - if (messageUnread != null && messageUnread.getTotal() > 0) { - personalNewFansTips.setVisibility(messageUnread.getFans() > 0 ? View.VISIBLE : View.GONE); - mPersonalHome.setText(messageUnread.getFans() > 0 ? ((messageUnread.getFans() < 100 ? messageUnread.getFans() : "99+") + "位新粉丝") : "个人主页"); - int count = messageUnread.getTotal() - messageUnread.getFans(); - mLoginMessageHint.setVisibility(count > 0 ? View.VISIBLE : View.GONE); - BindingAdapters.setMessageUnread(mLoginMessageHint, count); - } else { - mLoginMessageHint.setVisibility(View.GONE); - mPersonalHome.setText("个人主页"); - personalNewFansTips.setVisibility(View.GONE); - EventBus.getDefault().post(new EBReuse(MESSAGE_READ_OVER)); - } - }); - mUnreadViewModel.getZixunConcernLiveData().observe(this, hasConcern -> { - notifyItemChange("游戏动态", hasConcern ? FunctionalMessageType.NEW_MESSAGE : null); - }); - mUnreadViewModel.getAddonsUnreadLiveData().observe(this, entity -> { - notifyItemChange("我的收藏", entity.getFavorite() > 0 ? FunctionalMessageType.NEW_MESSAGE : null); - }); - } - - @Override - public void onFragmentResume() { - super.onFragmentResume(); - - if (NetworkUtils.isNetworkConnected(requireContext())) { - mUnreadViewModel.retry(); - mUserHomeViewModel.getBadgeList(); - mUserHomeViewModel.availableBadges(); - if (CheckLoginUtils.isLogin()) { - mUserHomeViewModel.getUserEnergy(); - mUserHomeViewModel.getSignInfo(); - } - } -// int currentItem = ((MainWrapperFragment) getParentFragment()).getCurrentItem(); -// if (currentItem == INDEX_PERSONAL) { - DisplayUtils.setLightStatusBar(requireActivity(), false); -// } - } - - private void showNotifier(MessageUnreadEntity messageUnread) { - if (mUnreadViewModel.isFirstTimeInit()) { - mUnreadViewModel.flagFirstTimeInit(false); - - if (messageUnread.getMeta() != null && messageUnread.getMeta().getUser() != null) { - if (messageUnread.getMeta() != null) { - String displayText = StringUtils.shrinkStringWithDot(messageUnread.getMeta().getUser().getName(), 8); - String suffixText; - if ("follow_question".equals(messageUnread.getMeta().getType())) { - suffixText = "回答了你关注的问题"; - } else { - suffixText = "回答了你的问题"; - } - displayText += suffixText; - - String content = messageUnread.getMeta().getAnswerId() + displayText; - - if (Notifier.shouldShowNotifier(content)) { - Notifier.create(getActivity()) - .setText(displayText) - .setDuration(5000) - .setIcon(messageUnread.getMeta().getUser().getIcon()) - .setOnClickListener(view -> { - Bundle bundle = new Bundle(); - bundle.putString(EntranceUtils.KEY_ANSWER_ID, messageUnread.getMeta().getAnswerId()); - bundle.putString(EntranceUtils.KEY_ENTRANCE, EntranceUtils.ENTRANCE_UMENG); - bundle.putString(EntranceUtils.KEY_TO, SimpleAnswerDetailActivity.class.getName()); - EntranceUtils.jumpActivity(getActivity(), bundle); - - MtaHelper.onEvent("消息弹窗", suffixText, "Does not contains any parameter."); - - // 标记已读 - JSONObject jsonObject = new JSONObject(); - try { - jsonObject.put("type", messageUnread.getMeta().getType()); - RequestBody body = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString()); - RetrofitManager.getInstance(requireContext()).getApi() - .postMessageRead(UserManager.getInstance().getUserId(), messageUnread.getMeta().getMessageId(), body) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Response() { - @Override - public void onResponse(@Nullable ResponseBody response) { - super.onResponse(response); - MessageUnreadRepository.INSTANCE.loadMessageUnreadData(); - } - }); - } catch (Exception e) { - e.printStackTrace(); - } - - Notifier.hide(); - }) - .show(true, 500L); - Notifier.tagNotifierAsShowed(content); - } - } - } - } - } - - @OnClick({R.id.toolbar, R.id.collapsingToolbar, R.id.iv_arrow, R.id.personal_info, R.id.personal_login, R.id.personal_user_small_icon, R.id.personal_user_icon, R.id.personal_msg, - R.id.personal_user_name_small, R.id.personal_user_name, R.id.personal_badge, R.id.personal_home, - R.id.personal_receive_energy, R.id.personal_energy, R.id.personal_energy_center, R.id.personal_energy_house, R.id.personal_energy_record}) - public void onViewClicked(View view) { - switch (view.getId()) { - case R.id.collapsingToolbar: - case R.id.toolbar: - case R.id.personal_info: - if (mUserInfoEntity == null) { - CheckLoginUtils.checkLogin(getContext(), "我的光环-手机登录", null); - } - break; - case R.id.personal_login: - MtaHelper.onEvent("我的光环_新", "立即登录", "点击登录"); - CheckLoginUtils.checkLogin(getContext(), "我的光环-立即登录", null); - break; - case R.id.personal_msg: - if (CheckLoginUtils.isLogin()) { - MtaHelper.onEvent("我的光环", "消息"); - MtaHelper.onEvent("我的光环_新", "消息中心", "点击消息中心"); - startActivityForResult(MessageActivity.getIntent(getContext(), "(我的光环)+(消息中心)"), REQUEST_MESSAGE); - } else { - MtaHelper.onEvent("我的光环_新", "功能入口-跳转登录", "消息中心"); - CheckLoginUtils.checkLogin(getContext(), "我的光环-消息", () -> { - }); - } - break; - case R.id.personal_user_small_icon: - case R.id.personal_user_icon: - if (mUserInfoEntity != null) { - MtaHelper.onEvent("我的光环", "个人中心"); - MtaHelper.onEvent("我的光环_新", "头像", "点击头像"); - DirectUtils.directToHomeActivity(requireContext(), UserManager.getInstance().getUserId(), "", "我的光环"); - } else { - MtaHelper.onEvent("我的光环", "手机登录"); - CheckLoginUtils.checkLogin(getContext(), "我的光环-手机登录", null); - } - break; - case R.id.personal_user_name_small: - case R.id.personal_user_name: - if (mUserInfoEntity != null) { - MtaHelper.onEvent("我的光环", "个人中心"); - MtaHelper.onEvent("我的光环_新", "昵称", "点击昵称"); - DirectUtils.directToHomeActivity(requireContext(), UserManager.getInstance().getUserId(), "", "我的光环"); - } else { - MtaHelper.onEvent("我的光环", "手机登录"); - CheckLoginUtils.checkLogin(getContext(), "我的光环-手机登录", null); - } - break; - case R.id.iv_arrow: - case R.id.personal_home: - if (mUserInfoEntity != null) { - MtaHelper.onEvent("我的光环", "个人主页"); - MtaHelper.onEvent("我的光环_新", "个人主页", "进入个人主页"); - DirectUtils.directToHomeActivity(requireContext(), UserManager.getInstance().getUserId(), "", "我的光环"); - } else { - CheckLoginUtils.checkLogin(getContext(), "我的光环-个人主页", null); - } - break; - case R.id.personal_badge: - MtaHelper.onEvent("我的光环_新", "徽章中心", "进入徽章中心"); - DirectUtils.directToBadgeWall(requireContext(), mUserInfoEntity.getUserId(), mUserInfoEntity.getName(), mUserInfoEntity.getIcon()); - break; - case R.id.personal_receive_energy: - IntegralLogHelper.INSTANCE.log("click_energy", "我的光环"); - if (mUserInfoEntity != null) { - MtaHelper.onEvent("我的光环_新", "领光能", "点击领光能"); - startActivity(EnergyCenterActivity.Companion.getIntent(requireContext())); - } else { - CheckLoginUtils.checkLogin(getContext(), "我的光环-领光能", null); - } - break; - case R.id.personal_energy: - IntegralLogHelper.INSTANCE.log("click_sign", "我的光环"); - if (mUserInfoEntity != null) { - MtaHelper.onEvent("我的光环_新", "光能值", "点击光能值"); - DialogUtils.showEnergyDialog(requireContext(), mUserInfoEntity.getName(), mEnergy); - } else { - CheckLoginUtils.checkLogin(getContext(), "我的光环-光能值", null); - } - break; - case R.id.personal_energy_center: - MtaHelper.onEvent("我的光环_新", "光能中心", "进入光能中心"); - IntegralLogHelper.INSTANCE.log("click_energy_center", "我的光环", "我的光环-光能中心"); - IntegralLogHelper.INSTANCE.log("view_energy_center", "光能中心"); - requireContext().startActivity(EnergyCenterActivity.Companion.getIntent(requireContext())); - break; - case R.id.personal_energy_house: - MtaHelper.onEvent("我的光环_新", "光能屋", "进入光能屋"); - IntegralLogHelper.INSTANCE.log("click_energy_store", "我的光环", "我的光环-光能屋"); - IntegralLogHelper.INSTANCE.log("view_energy_store", "光能屋"); - requireContext().startActivity(EnergyHouseActivity.Companion.getIntent(requireContext())); - break; - case R.id.personal_energy_record: - IntegralLogHelper.INSTANCE.log("click_energy_record", "我的光环", "我的光环-光能明细"); - IntegralLogHelper.INSTANCE.log("view_energy_record", "光能明细"); - if (mUserInfoEntity != null) { - MtaHelper.onEvent("我的光环_新", "光能记录", "进入光能记录"); - DirectUtils.directToEnergyRecord(requireContext()); - } else { - CheckLoginUtils.checkLogin(getContext(), "我的光环-光能记录", null); - } - break; - default: - break; - } - } - - // 连接上网络事件 - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(EBNetworkState busNetworkState) { - if (busNetworkState.isNetworkConnected() - && UserManager.getInstance().isLoggedIn() - && (mUserInfoEntity == null || TextUtils.isEmpty(UserManager.getInstance().getToken()))) { - mUserViewModel.retryCheckLogin(); - } - if (busNetworkState.isNetworkConnected()) { - mPersonalViewModel.getHaloAddons(); - } - } - -// @Subscribe(threadMode = ThreadMode.MAIN) -// public void onEventMainThread(EBUISwitch busNine) { -// if (MainWrapperFragment.EB_MAIN_SCROLL_TOP.equals(busNine.getFrom()) -// && INDEX_PERSONAL == busNine.getPosition()) { -// //mScrollView.fullScroll(ScrollView.FOCUS_UP); -// } -// } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(EBReuse reuse) { - if (MESSAGE_READ_OVER.equals(reuse.getType())) { // 消息阅读完成 - if (mLoginMessageHint != null) { - mLoginMessageHint.setVisibility(View.GONE); - } - } - } - - private boolean isCanSign(long time) { - SimpleDateFormat formatDay = new SimpleDateFormat("dd", Locale.CHINA); - - long lastSignTime = time * 1000; - long curTime = Utils.getTime(getContext()) * 1000; - int lastSignDay = Integer.parseInt(formatDay.format(lastSignTime)); - int curDay = Integer.parseInt(formatDay.format(curTime)); - return lastSignDay != curDay || curTime - lastSignTime > 24 * 60 * 60 * 1000; - } - - private String getSignSkipText(String text) { - return TextUtils.isEmpty(text) ? "去首页看看" : text; - } - - private void signSkip(SignEntity signEntity) { - SignEntity.Data data = signEntity.getData(); - String entrance = "(我的光环)+(签到)"; - if (data == null || TextUtils.isEmpty(data.getType())) { - EventBus.getDefault().post(new EBSkip(MainActivity.EB_SKIP_MAIN, MainWrapperFragment.INDEX_HOME)); - return; - } - switch (data.getType()) { - case "game": - DataUtils.onMtaEvent(getActivity(), "我的光环_签到跳转", "游戏", signEntity.getTitle()); - GameDetailActivity.startGameDetailActivity(getContext(), data.getLink(), entrance); - break; - case "news": - DataUtils.onMtaEvent(getActivity(), "我的光环_签到跳转", "文章", signEntity.getTitle()); - startActivity(NewsDetailActivity.getIntentById(getContext(), data.getLink(), entrance)); - break; - case "column": - DataUtils.onMtaEvent(getActivity(), "我的光环_签到跳转", "专题", signEntity.getTitle()); - SubjectActivity.startSubjectActivity(getContext(), data.getLink(), null, false, entrance); - break; - - default: - LinkEntity linkEntity = new LinkEntity(); - linkEntity.setType(data.getType()); - linkEntity.setLink(data.getLink()); - linkEntity.setText(data.getText()); - linkEntity.setCommunity(data.getCommunity()); - linkEntity.setDisplay(data.getDisplay()); - DirectUtils.directToLinkPage(requireContext(), linkEntity, entrance, ""); - break; - } - } - - private static String getLoginEntranceByType(String loginTag) { - String entrance = ""; - switch (loginTag) { - case "qq": - entrance = "我的光环-QQ"; - break; - case "wechat": - entrance = "我的光环-微信"; - break; - case "weibo": - entrance = "我的光环-新浪微博"; - break; - } - return entrance; - } - - private void changeLoginState(boolean isLogin) { - if (isLogin) { - if (mUserInfoEntity != null) { - mUserIcon.display(mUserInfoEntity.getIconBorder() == null ? "" : mUserInfoEntity.getIconBorder().getUrl(), - mUserInfoEntity.getIcon(), mUserInfoEntity.getAuth() == null ? "" : mUserInfoEntity.getAuth().getIcon()); - ImageUtils.displayIcon(mUserIconSmall, mUserInfoEntity.getIcon()); - mPersonalUserName.setVisibility(View.VISIBLE); - mPersonalBadge.setVisibility(View.VISIBLE); - mPersonalHome.setVisibility(View.VISIBLE); - mPersonalLogin.setVisibility(View.GONE); - mPersonalUserName.setText(mUserInfoEntity.getName()); - mPersonalUserNameSmall.setText(mUserInfoEntity.getName()); - } - mUserHomeViewModel.setUserId(UserManager.getInstance().getUserId()); - mUserHomeViewModel.getBadgeList(); - mUserHomeViewModel.availableBadges(); - mUserHomeViewModel.getUserEnergy(); - mUserHomeViewModel.getSignInfo(); - MessageUnreadRepository.INSTANCE.loadMessageUnreadTotal(true); - } else { - mPersonalReceiveEnergy.setVisibility(View.VISIBLE); - mPersonalEnergy.setVisibility(View.GONE); - mUserIcon.display("", "", ""); - mUserIconSmall.setImageURI(""); -// mPersonalBadgeTv.setText("我的徽章"); - mPersonalUserNameSmall.setText("立即登录"); - mPersonalUserName.setVisibility(View.GONE); - mPersonalHome.setVisibility(View.GONE); - mPersonalBadge.setVisibility(View.GONE); - mPersonalLogin.setVisibility(View.VISIBLE); - - if (mLoginMessageHint.getVisibility() == View.VISIBLE) { - mLoginMessageHint.setVisibility(View.GONE); - EventBus.getDefault().post(new EBReuse(MESSAGE_READ_OVER)); - } - } - } - - private void checkUpdate() { - String channel = HaloApp.getInstance().getChannel(); - RetrofitManager.getInstance(getContext()) - .getApi() - .getUpdate(PackageUtils.getVersionName(), PackageUtils.getVersionCode(), channel) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Response() { - @Override - public void onResponse(AppEntity response) { - super.onResponse(response); - if (response.getVersionCode() > PackageUtils.getVersionCode()) { - notifyItemChange("设置", FunctionalMessageType.NEW_VERSION); - } else { - notifyItemChange("设置", null); - } - } - }); - } - - private void notifyItemChange(String funcName, FunctionalMessageType msg) { - ArrayList mEntityList = mPersonalFuncGroupAdapter.getMEntityList(); - for (FunctionalGroupEntity mEntity : mEntityList) { - for (FunctionalLinkEntity linkEntity : mEntity.getAddons()) { - if (TextUtils.equals(linkEntity.getType(), funcName)) { - linkEntity.setMessage(msg); - break; - } - } - } - mPersonalFuncGroupAdapter.notifyDataSetChanged(); - } -} diff --git a/app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.kt b/app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.kt new file mode 100644 index 0000000000..f2ee5dd861 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.kt @@ -0,0 +1,731 @@ +package com.gh.gamecenter.personal + +import android.annotation.SuppressLint +import android.content.Intent +import android.os.Build +import android.os.Bundle +import android.text.TextUtils +import android.view.View +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.gh.base.fragment.BaseLazyFragment +import com.gh.common.databind.BindingAdapters +import com.gh.common.notifier.Notifier.Companion.create +import com.gh.common.notifier.Notifier.Companion.hide +import com.gh.common.notifier.Notifier.Companion.shouldShowNotifier +import com.gh.common.notifier.Notifier.Companion.tagNotifierAsShowed +import com.gh.common.util.* +import com.gh.common.util.DirectUtils.directToBadgeDetail +import com.gh.common.util.DirectUtils.directToBadgeWall +import com.gh.common.util.DirectUtils.directToEnergyRecord +import com.gh.common.util.DirectUtils.directToHomeActivity +import com.gh.common.util.ImageUtils.display +import com.gh.common.util.ImageUtils.displayIcon +import com.gh.common.util.IntegralLogHelper.log +import com.gh.common.util.LoginHelper.onQQLoginCallback +import com.gh.common.util.LoginHelper.onWeiboLoginCallback +import com.gh.common.util.MtaHelper.onEvent +import com.gh.common.util.SPUtils.getLong +import com.gh.common.util.SPUtils.setLong +import com.gh.common.util.TimeUtils.getStartTimeOfDay +import com.gh.common.util.ToastUtils.showToast +import com.gh.common.view.SpacingItemDecoration +import com.gh.gamecenter.MessageActivity +import com.gh.gamecenter.R +import com.gh.gamecenter.databinding.FragmentNewPersonalBinding +import com.gh.gamecenter.databinding.FragmentNewPersonalStubBinding +import com.gh.gamecenter.energy.EnergyCenterActivity +import com.gh.gamecenter.energy.EnergyHouseActivity +import com.gh.gamecenter.entity.* +import com.gh.gamecenter.eventbus.EBConcernChanged +import com.gh.gamecenter.eventbus.EBNetworkState +import com.gh.gamecenter.eventbus.EBReuse +import com.gh.gamecenter.manager.UserManager +import com.gh.gamecenter.message.MessageUnreadRepository.loadMessageUnreadData +import com.gh.gamecenter.message.MessageUnreadRepository.loadMessageUnreadTotal +import com.gh.gamecenter.message.MessageUnreadViewModel +import com.gh.gamecenter.personalhome.UserHomeViewModel +import com.gh.gamecenter.qa.answer.detail.SimpleAnswerDetailActivity +import com.gh.gamecenter.room.AppDatabase +import com.gh.gamecenter.user.ApiResponse +import com.gh.gamecenter.user.UserViewModel +import com.google.android.material.appbar.AppBarLayout +import com.halo.assistant.HaloApp +import com.tencent.connect.common.Constants +import okhttp3.MediaType +import okhttp3.RequestBody +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import org.json.JSONObject +import java.util.* +import kotlin.math.abs + +class NewPersonalFragment : BaseLazyFragment() { + private var mUserInfoEntity: UserInfoEntity? = null + + private lateinit var mDatabase: AppDatabase + + private lateinit var mBinding: FragmentNewPersonalStubBinding + private lateinit var mStubBinding: FragmentNewPersonalBinding + private lateinit var mUserViewModel: UserViewModel + private lateinit var mUnreadViewModel: MessageUnreadViewModel + private lateinit var mUserHomeViewModel: UserHomeViewModel + private lateinit var mPersonalViewModel: PersonalViewModel + + private lateinit var mPersonalFuncGroupAdapter: NewPersonalFunctionGroupAdapter + + private var mIsLogging = false + private var mEnergy: Long = 0 + + override fun getInflatedLayout(): View { + mBinding = DataBindingUtil.inflate( + layoutInflater, + R.layout.fragment_new_personal_stub, + null, + false + ) + mBinding.stub.setOnInflateListener { _, inflateId -> + mStubBinding = FragmentNewPersonalBinding.bind(inflateId) + } + return mBinding.root + } + + override fun getLayoutId() = R.layout.fragment_new_personal_stub + + override fun useButterKnife() = false + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + when (requestCode) { + Constants.REQUEST_LOGIN -> { + onQQLoginCallback(requestCode, resultCode, data) + } + 32973 -> { + onWeiboLoginCallback(requestCode, resultCode, data) + } + REQUEST_MESSAGE -> { + mUnreadViewModel.retry() + } + } + } + + override fun onClick(v: View?) { + super.onClick(v) + mStubBinding.run { + when (v) { + collapsingToolbar, + toolbar, + personalInfo -> { + if (mUserInfoEntity == null) { + CheckLoginUtils.checkLogin(context, "我的光环-手机登录", null) + } + } + personalLogin -> { + onEvent("我的光环_新", "立即登录", "点击登录") + CheckLoginUtils.checkLogin(context, "我的光环-立即登录", null) + } + personalMsg -> { + if (CheckLoginUtils.isLogin()) { + onEvent("我的光环", "消息") + onEvent("我的光环_新", "消息中心", "点击消息中心") + startActivityForResult( + MessageActivity.getIntent(context, "(我的光环)+(消息中心)"), + REQUEST_MESSAGE + ) + } else { + onEvent("我的光环_新", "功能入口-跳转登录", "消息中心") + CheckLoginUtils.checkLogin(context, "我的光环-消息") {} + } + } + personalUserSmallIcon, personalUserIcon -> { + if (mUserInfoEntity != null) { + onEvent("我的光环", "个人中心") + onEvent("我的光环_新", "头像", "点击头像") + directToHomeActivity( + requireContext(), + UserManager.getInstance().userId, + "", + "我的光环" + ) + } else { + onEvent("我的光环", "手机登录") + CheckLoginUtils.checkLogin(context, "我的光环-手机登录", null) + } + } + personalUserNameSmall, personalUserName -> { + if (mUserInfoEntity != null) { + onEvent("我的光环", "个人中心") + onEvent("我的光环_新", "昵称", "点击昵称") + directToHomeActivity( + requireContext(), + UserManager.getInstance().userId, + "", + "我的光环" + ) + } else { + onEvent("我的光环", "手机登录") + CheckLoginUtils.checkLogin(context, "我的光环-手机登录", null) + } + } + ivArrow, personalHome -> { + if (mUserInfoEntity != null) { + onEvent("我的光环", "个人主页") + onEvent("我的光环_新", "个人主页", "进入个人主页") + directToHomeActivity( + requireContext(), + UserManager.getInstance().userId, + "", + "我的光环" + ) + } else { + CheckLoginUtils.checkLogin(context, "我的光环-个人主页", null) + } + } + personalBadge -> { + onEvent("我的光环_新", "徽章中心", "进入徽章中心") + directToBadgeWall( + requireContext(), + mUserInfoEntity?.userId, + mUserInfoEntity?.name, + mUserInfoEntity?.icon + ) + } + personalReceiveEnergy -> { + log("click_energy", "我的光环") + if (mUserInfoEntity != null) { + onEvent("我的光环_新", "领光能", "点击领光能") + startActivity(EnergyCenterActivity.getIntent(requireContext())) + } else { + CheckLoginUtils.checkLogin(context, "我的光环-领光能", null) + } + } + personalEnergy -> { + log("click_sign", "我的光环") + if (mUserInfoEntity != null) { + onEvent("我的光环_新", "光能值", "点击光能值") + DialogUtils.showEnergyDialog( + requireContext(), + mUserInfoEntity?.name, + mEnergy + ) + } else { + CheckLoginUtils.checkLogin(context, "我的光环-光能值", null) + } + } + personalEnergyCenter -> { + onEvent("我的光环_新", "光能中心", "进入光能中心") + log("click_energy_center", "我的光环", "我的光环-光能中心") + log("view_energy_center", "光能中心") + requireContext().startActivity(EnergyCenterActivity.getIntent(requireContext())) + } + personalEnergyHouse -> { + onEvent("我的光环_新", "光能屋", "进入光能屋") + log("click_energy_store", "我的光环", "我的光环-光能屋") + log("view_energy_store", "光能屋") + requireContext().startActivity(EnergyHouseActivity.getIntent(requireContext())) + } + personalEnergyRecord -> { + log("click_energy_record", "我的光环", "我的光环-光能明细") + log("view_energy_record", "光能明细") + if (mUserInfoEntity != null) { + onEvent("我的光环_新", "光能记录", "进入光能记录") + directToEnergyRecord(requireContext()) + } else { + CheckLoginUtils.checkLogin(context, "我的光环-光能记录", null) + } + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + mDatabase = AppDatabase.getInstance(context) + val factory = UserViewModel.Factory(requireActivity().application) + mUserViewModel = ViewModelProvider(this, factory).get(UserViewModel::class.java) + mUserHomeViewModel = ViewModelProvider( + this, UserHomeViewModel.Factory( + HaloApp.getInstance().application, + UserManager.getInstance().userId + ) + ).get(UserHomeViewModel::class.java) + mUnreadViewModel = ViewModelProvider( + this, + MessageUnreadViewModel.Factory(HaloApp.getInstance().application) + ).get(MessageUnreadViewModel::class.java) + mPersonalViewModel = ViewModelProvider(this).get(PersonalViewModel::class.java) + + observeNoneUIRelatedChanges() + } + + override fun onFragmentFirstVisible() { + super.onFragmentFirstVisible() + inflateRealView() + observeUIRelatedChanges() + } + + override fun onFragmentResume() { + super.onFragmentResume() + + if (NetworkUtils.isNetworkConnected(requireContext())) { + mUnreadViewModel.retry() + mUserHomeViewModel.getBadgeList() + mUserHomeViewModel.availableBadges() + if (CheckLoginUtils.isLogin()) { + mUserHomeViewModel.getUserEnergy() + mUserHomeViewModel.getSignInfo() + } + } +// val currentItem = (parentFragment as MainWrapperFragment).currentItem +// if (currentItem == MainWrapperFragment.INDEX_PERSONAL) { + DisplayUtils.setLightStatusBar(requireActivity(), false) +// } + } + + @SuppressLint("CheckResult", "SetTextI18n") + private fun observeUIRelatedChanges() { + mPersonalViewModel.appEntity.observe(this, { + if (it.versionCode > PackageUtils.getVersionCode()) { + notifyItemChange("设置", FunctionalMessageType.NEW_VERSION) + } else { + notifyItemChange("设置", null) + } + }) + + mUserViewModel.loginObsUserinfo.observe( + this, + { userInfoEntity: ApiResponse? -> + if (userInfoEntity != null && userInfoEntity.data != null) { + changeLoginState(true) + } else { + changeLoginState(false) + } + }) + + mUserHomeViewModel.badges.observe(this, + { badgeEntities: List -> + mStubBinding.personalBadgeIcon.setImageURI("") + if (badgeEntities.isEmpty()) { + mStubBinding.personalBadgeTv.visibility = View.GONE + mStubBinding.personalBadgeCountTv.visibility = View.GONE + mStubBinding.personalMyBadgeIcon.visibility = View.VISIBLE + } else { + mStubBinding.personalBadgeTv.visibility = View.VISIBLE + mStubBinding.personalBadgeCountTv.visibility = View.VISIBLE + mStubBinding.personalMyBadgeIcon.visibility = View.GONE + mStubBinding.personalBadgeCountTv.text = badgeEntities.size.toString() + "" + for ((_, _, icon, name, _, wear, _, actions) in badgeEntities) { + if (wear) { + display( + mStubBinding.personalBadgeIcon, + icon + ) + mStubBinding.personalBadgeIcon.setOnClickListener { + DialogUtils.showViewBadgeDialog( + requireContext(), + Badge(name, icon, actions) + ) { + directToBadgeWall( + requireContext(), + mUserInfoEntity?.userId, + mUserInfoEntity?.name, + mUserInfoEntity?.icon + ) + } + } + break + } + } + } + }) + mUserHomeViewModel.availableBadgeCount.observe(this, + { count: Int -> + mStubBinding.personalBadgeTips.visibility = + if (count > 0) View.VISIBLE else View.GONE + }) + + mUserHomeViewModel.availableBadge.observe(this, + { badge: BadgeEntity? -> + // 徽章领取弹窗每隔7天弹出一次,所以要判断现在是否是上一次弹出的第7天或者之后 + if (badge != null && System.currentTimeMillis() >= getLong(SP_BADGE_RECORD_SEVEN_DAY)) { + // 徽章领取弹窗每隔7天弹出一次,所以本次弹出后就记录7天后的时间戳 + setLong( + SP_BADGE_RECORD_SEVEN_DAY, + getStartTimeOfDay(System.currentTimeMillis() + 86400000 * 6) + ) + DialogUtils.showReceiveBadgeDialog( + requireContext(), badge + ) { + mPersonalViewModel.applyOrReceiveBadge(badge.id, { + if ("self" == badge.receive?.type) { + showToast("领取成功") + } else { + showToast("申请成功") + } + // 跳转到徽章详情 + directToBadgeDetail( + requireContext(), + mUserInfoEntity?.userId, + badge.id + ) + }, { + if ("self" == badge.receive?.type) { + showToast("领取失败") + } else { + showToast("申请失败") + } + }) + } + } + }) + + mUserHomeViewModel.energy.observe(this, { energy: Long -> + mEnergy = energy + if (energy > 9999) { + mStubBinding.personalEnergyTv.text = "9999+" + } else { + mStubBinding.personalEnergyTv.text = energy.toString() + "" + } + }) + + mUserHomeViewModel.signStatus.observe(this, + { (todaySignIn) -> + if (todaySignIn) { + mStubBinding.personalEnergy.visibility = View.VISIBLE + mStubBinding.personalReceiveEnergy.visibility = View.GONE + } else { + mStubBinding.personalEnergy.visibility = View.GONE + mStubBinding.personalReceiveEnergy.visibility = View.VISIBLE + } + }) + + mPersonalViewModel.haloAddData.observe( + this, + { datas: ArrayList -> + if (datas.isNotEmpty()) { + mPersonalFuncGroupAdapter.setListData(datas) + mPersonalViewModel.checkUpdate() + } + }) + + mUnreadViewModel.liveData.observe(this, { messageUnread: MessageUnreadEntity? -> + if (messageUnread != null && messageUnread.total > 0) { + mStubBinding.personalNewFansTips.visibility = + if (messageUnread.fans > 0) View.VISIBLE else View.GONE + mStubBinding.personalHome.text = + if (messageUnread.fans > 0) (if (messageUnread.fans < 100) messageUnread.fans else "99+").toString() + "位新粉丝" else "个人主页" + val count = messageUnread.total - messageUnread.fans + mStubBinding.loginMessageHint.visibility = + if (count > 0) View.VISIBLE else View.GONE + BindingAdapters.setMessageUnread(mStubBinding.loginMessageHint, count) + } else { + mStubBinding.loginMessageHint.visibility = View.GONE + mStubBinding.personalHome.text = "个人主页" + mStubBinding.personalNewFansTips.visibility = View.GONE + EventBus.getDefault() + .post(EBReuse(MESSAGE_READ_OVER)) + } + }) + mUnreadViewModel.zixunConcernLiveData.observe(this, + { hasConcern: Boolean -> + notifyItemChange( + "游戏动态", + if (hasConcern) FunctionalMessageType.NEW_MESSAGE else null + ) + }) + mUnreadViewModel.addonsUnreadLiveData.observe(this, + { (favorite) -> + notifyItemChange( + "我的收藏", + if (favorite > 0) FunctionalMessageType.NEW_MESSAGE else null + ) + }) + } + + private fun notifyItemChange(funcName: String, msg: FunctionalMessageType?) { + val mEntityList = mPersonalFuncGroupAdapter.mEntityList + for ((_, _, _, addons) in mEntityList) { + for (linkEntity in addons) { + if (TextUtils.equals(linkEntity.type, funcName)) { + linkEntity.message = msg + break + } + } + } + mPersonalFuncGroupAdapter.notifyDataSetChanged() + } + + private fun changeLoginState(isLogin: Boolean) { + if (isLogin) { + if (mUserInfoEntity != null) { + mStubBinding.personalUserIcon.display( + if (mUserInfoEntity?.iconBorder == null) "" else mUserInfoEntity?.iconBorder?.url, + mUserInfoEntity?.icon, + if (mUserInfoEntity?.auth == null) "" else mUserInfoEntity?.auth?.icon + ) + displayIcon(mStubBinding.personalUserSmallIcon, mUserInfoEntity?.icon) + mStubBinding.personalUserName.visibility = View.VISIBLE + mStubBinding.personalBadge.visibility = View.VISIBLE + mStubBinding.personalHome.visibility = View.VISIBLE + mStubBinding.personalLogin.visibility = View.GONE + mStubBinding.personalUserName.text = mUserInfoEntity?.name + mStubBinding.personalUserNameSmall.text = mUserInfoEntity?.name + } + mUserHomeViewModel.userId = UserManager.getInstance().userId + mUserHomeViewModel.getBadgeList() + mUserHomeViewModel.availableBadges() + mUserHomeViewModel.getUserEnergy() + mUserHomeViewModel.getSignInfo() + loadMessageUnreadTotal(true) + } else { + mStubBinding.personalReceiveEnergy.visibility = View.VISIBLE + mStubBinding.personalEnergy.visibility = View.GONE + mStubBinding.personalUserIcon.display("", "", "") + mStubBinding.personalUserSmallIcon.setImageURI("") + // mPersonalBadgeTv.setText("我的徽章"); + mStubBinding.personalUserNameSmall.text = "立即登录" + mStubBinding.personalUserName.visibility = View.GONE + mStubBinding.personalHome.visibility = View.GONE + mStubBinding.personalBadge.visibility = View.GONE + mStubBinding.personalLogin.visibility = View.VISIBLE + if (mStubBinding.loginMessageHint.visibility == View.VISIBLE) { + mStubBinding.loginMessageHint.visibility = View.GONE + EventBus.getDefault().post(EBReuse(MESSAGE_READ_OVER)) + } + } + } + + private fun inflateRealView() { + mBinding.stub.viewStub?.inflate() + + mStubBinding.collapsingToolbar.setOnClickListener(this) + mStubBinding.toolbar.setOnClickListener(this) + mStubBinding.personalInfo.setOnClickListener(this) + mStubBinding.personalLogin.setOnClickListener(this) + mStubBinding.personalMsg.setOnClickListener(this) + mStubBinding.personalHome.setOnClickListener(this) + mStubBinding.ivArrow.setOnClickListener(this) + mStubBinding.personalLogin.setOnClickListener(this) + mStubBinding.personalUserName.setOnClickListener(this) + mStubBinding.personalUserNameSmall.setOnClickListener(this) + mStubBinding.personalUserIcon.setOnClickListener(this) + mStubBinding.personalUserSmallIcon.setOnClickListener(this) + mStubBinding.personalBadge.setOnClickListener(this) + mStubBinding.personalReceiveEnergy.setOnClickListener(this) + mStubBinding.personalEnergy.setOnClickListener(this) + mStubBinding.personalEnergyCenter.setOnClickListener(this) + mStubBinding.personalEnergyRecord.setOnClickListener(this) + mStubBinding.personalEnergyHouse.setOnClickListener(this) + + mPersonalFuncGroupAdapter = NewPersonalFunctionGroupAdapter(requireContext()) + mStubBinding.personalFunc.layoutManager = LinearLayoutManager(requireContext()) + mStubBinding.personalFunc.adapter = mPersonalFuncGroupAdapter + mStubBinding.personalFunc.addItemDecoration( + SpacingItemDecoration( + onlyDecorateTheFirstItem = true, + notDecorateTheFirstItem = false, + notDecorateTheLastItem = false, + notDecorateTheFirstTwoItems = false, + left = 0, + top = 32F.dip2px(), + right = 0, + bottom = 0 + ) + ) + + val statusBarHeight = + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) 0 else DisplayUtils.getStatusBarHeight( + resources + ) + val params: ViewGroup.LayoutParams = mStubBinding.toolbar.layoutParams + params.height = DisplayUtils.dip2px(50F) + statusBarHeight + mStubBinding.toolbar.layoutParams = params + + mStubBinding.appbar.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { _: AppBarLayout?, verticalOffset: Int -> + val absOffset = abs(verticalOffset) + val invisibleOffset = + DisplayUtils.dip2px(56F + 48F - 50F) - DisplayUtils.getStatusBarHeight(resources) + if (absOffset <= invisibleOffset) { + mStubBinding.personalUserSmallIcon.visibility = View.GONE + mStubBinding.personalUserNameSmall.visibility = View.GONE + mStubBinding.toolbar.background = null + } else { + mStubBinding.personalUserSmallIcon.visibility = View.VISIBLE + mStubBinding.personalUserNameSmall.visibility = View.VISIBLE + mStubBinding.toolbar.setBackgroundResource(R.drawable.bg_personal_top) + } + mStubBinding.listRefresh.isEnabled = absOffset <= 2 + }) + mStubBinding.listRefresh.setColorSchemeColors( + ContextCompat.getColor( + requireContext(), + R.color.theme + ) + ) + mStubBinding.listRefresh.setProgressViewOffset( + false, + 0, + DisplayUtils.dip2px(80F) + DisplayUtils.getStatusBarHeight(requireContext().resources) + ) + mStubBinding.listRefresh.setOnRefreshListener { + mPersonalViewModel.getHaloAddons() + if (CheckLoginUtils.isLogin()) { + mUnreadViewModel.retry() + loadMessageUnreadTotal(false) + mUserHomeViewModel.getBadgeList() + mUserHomeViewModel.availableBadges() + } + mBaseHandler.postDelayed({ mStubBinding.listRefresh.isRefreshing = false }, 2000) + onEvent("我的光环_新", "下拉刷新", "下拉刷新") + } + loadMessageUnreadTotal(true) + } + + private fun observeNoneUIRelatedChanges() { + mPersonalViewModel.getHaloAddons() + mUserViewModel.loginObsUserinfo.observe(this, + { userInfoEntity: ApiResponse? -> + val notifyUserInfo: UserInfoEntity? = userInfoEntity?.data + if (notifyUserInfo != null && mUserInfoEntity == null) { // 单个用户,首次触发 + EventBus.getDefault().post(EBConcernChanged()) + val loginTokenEntity = + UserManager.getInstance().loginTokenEntity + if (mIsLogging && loginTokenEntity != null) { + val loginType = loginTokenEntity.loginType + LogUtils.login( + "success", + loginType, + mPersonalViewModel.getLoginEntranceByType(loginType) + ) + mIsLogging = false + } + } + mUserInfoEntity = notifyUserInfo + if (notifyUserInfo == null) { + mUnreadViewModel.clean() + EventBus.getDefault().post(EBConcernChanged()) + } + }) + mPersonalViewModel.haloAddData.observe( + this, + { datas: ArrayList -> + if (datas.isNotEmpty()) { + loadMessageUnreadTotal(false) + } + }) + mUnreadViewModel.liveData.observe(this, { messageUnread: MessageUnreadEntity? -> + if (messageUnread != null && messageUnread.total > 0) { + // 第一次开启应用时检查消息中心看有没有未读消息确定需不需要弹 Notifier 通知 + showNotifier(messageUnread) + } + }) + } + + private fun showNotifier(messageUnread: MessageUnreadEntity) { + if (mUnreadViewModel.isFirstTimeInit) { + mUnreadViewModel.flagFirstTimeInit(false) + if (messageUnread.meta != null && messageUnread.meta?.user != null) { + if (messageUnread.meta != null) { + var displayText = StringUtils.shrinkStringWithDot( + messageUnread.meta?.user?.name, 8 + ) + val suffixText: String = if ("follow_question" == messageUnread.meta?.type) { + "回答了你关注的问题" + } else { + "回答了你的问题" + } + displayText += suffixText + val content = messageUnread.meta?.answerId + displayText + if (shouldShowNotifier(content)) { + create(activity) + .setText(displayText) + .setDuration(5000) + .setIcon(messageUnread.meta?.user?.icon) + .setOnClickListener { + val bundle = Bundle() + bundle.putString( + EntranceUtils.KEY_ANSWER_ID, + messageUnread.meta?.answerId + ) + bundle.putString( + EntranceUtils.KEY_ENTRANCE, + EntranceUtils.ENTRANCE_UMENG + ) + bundle.putString( + EntranceUtils.KEY_TO, + SimpleAnswerDetailActivity::class.java.name + ) + EntranceUtils.jumpActivity(activity, bundle) + onEvent("消息弹窗", suffixText, "Does not contains any parameter.") + + // 标记已读 + val jsonObject = JSONObject() + try { + jsonObject.put("type", messageUnread.meta?.type) + val body = RequestBody.create( + MediaType.parse("application/json"), + jsonObject.toString() + ) + messageUnread.meta?.messageId?.let { + mPersonalViewModel.postMessageRead( + it, + body + ) { + loadMessageUnreadData() + } + } + } catch (e: Exception) { + e.printStackTrace() + } + hide() + } + .show(true, 500L) + tagNotifierAsShowed(content) + } + } + } + } + } + + // 连接上网络事件 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEventMainThread(busNetworkState: EBNetworkState) { + if (busNetworkState.isNetworkConnected + && UserManager.getInstance().isLoggedIn + && (mUserInfoEntity == null || TextUtils.isEmpty(UserManager.getInstance().token)) + ) { + mUserViewModel.retryCheckLogin() + } + if (busNetworkState.isNetworkConnected) { + mPersonalViewModel.getHaloAddons() + } + } + +// @Subscribe(threadMode = ThreadMode.MAIN) +// fun onEventMainThread(busNine: EBUISwitch) { +// if (MainWrapperFragment.EB_MAIN_SCROLL_TOP == busNine.getFrom() && MainWrapperFragment.INDEX_PERSONAL == busNine.getPosition()) { +// //mScrollView.fullScroll(ScrollView.FOCUS_UP) +// } +// } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEventMainThread(reuse: EBReuse) { + if (MESSAGE_READ_OVER == reuse.type) { // 消息阅读完成 + mStubBinding.loginMessageHint.visibility = View.GONE + } + } + + + companion object { + const val LOGIN_TAG = "login_tag" //登入标识 + const val LOGOUT_TAG = "logout_tag" // 登出标识 + + private const val MESSAGE_READ_OVER = "MESSAGE_READ_OVER" + private const val SP_BADGE_RECORD_SEVEN_DAY = "badgeRecordSevenDay" + private const val REQUEST_MESSAGE = 199 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java deleted file mode 100644 index 6f892037ae..0000000000 --- a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java +++ /dev/null @@ -1,847 +0,0 @@ -package com.gh.gamecenter.personal; - -import android.annotation.SuppressLint; -import android.content.Intent; -import android.database.sqlite.SQLiteException; -import android.os.Build; -import android.os.Bundle; -import android.text.TextUtils; -import android.view.View; -import android.view.ViewGroup; -import android.view.ViewStub; -import android.widget.ImageView; -import android.widget.RelativeLayout; -import android.widget.TextView; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.widget.Toolbar; -import androidx.core.content.ContextCompat; -import androidx.lifecycle.ViewModelProviders; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; - -import com.facebook.drawee.view.SimpleDraweeView; -import com.gh.base.BaseActivity; -import com.gh.base.fragment.BaseLazyFragment; -import com.gh.common.databind.BindingAdapters; -import com.gh.common.notifier.Notifier; -import com.gh.common.util.CheckLoginUtils; -import com.gh.common.util.DataUtils; -import com.gh.common.util.DialogUtils; -import com.gh.common.util.DirectUtils; -import com.gh.common.util.DisplayUtils; -import com.gh.common.util.EntranceUtils; -import com.gh.common.util.ImageUtils; -import com.gh.common.util.LogUtils; -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.AvatarBorderView; -import com.gh.common.view.VerticalItemDecoration; -import com.gh.gamecenter.BuildConfig; -import com.gh.gamecenter.GameDetailActivity; -import com.gh.gamecenter.MainActivity; -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; -import com.gh.gamecenter.entity.LinkEntity; -import com.gh.gamecenter.entity.LoginTokenEntity; -import com.gh.gamecenter.entity.MessageUnreadEntity; -import com.gh.gamecenter.entity.SignEntity; -import com.gh.gamecenter.entity.UserInfoEntity; -import com.gh.gamecenter.eventbus.EBConcernChanged; -import com.gh.gamecenter.eventbus.EBNetworkState; -import com.gh.gamecenter.eventbus.EBReuse; -import com.gh.gamecenter.eventbus.EBSkip; -import com.gh.gamecenter.fragment.MainWrapperFragment; -import com.gh.gamecenter.manager.UserManager; -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.SimpleAnswerDetailActivity; -import com.gh.gamecenter.retrofit.BiResponse; -import com.gh.gamecenter.retrofit.Response; -import com.gh.gamecenter.retrofit.RetrofitManager; -import com.gh.gamecenter.room.AppDatabase; -import com.gh.gamecenter.subject.SubjectActivity; -import com.gh.gamecenter.user.UserViewModel; -import com.google.android.material.appbar.AppBarLayout; -import com.halo.assistant.HaloApp; -import com.jakewharton.rxbinding2.view.RxView; -import com.lightgame.utils.Utils; -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; -import java.util.ArrayList; -import java.util.Locale; -import java.util.concurrent.TimeUnit; - -import butterknife.BindView; -import butterknife.ButterKnife; -import butterknife.OnClick; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.schedulers.Schedulers; -import okhttp3.MediaType; -import okhttp3.RequestBody; -import okhttp3.ResponseBody; -import retrofit2.HttpException; - -import static com.gh.gamecenter.fragment.MainWrapperFragment.INDEX_PERSONAL; - -public class PersonalFragment extends BaseLazyFragment { - - @BindView(R.id.list_refresh) - SwipeRefreshLayout mListRefresh; - @BindView(R.id.appbar) - AppBarLayout appbar; - @BindView(R.id.toolbar) - Toolbar toolbar; - @BindView(R.id.personal_sign) - ImageView mPersonalSign; - @BindView(R.id.personal_msg) - ImageView mPersonalMsg; - @BindView(R.id.login_message_hint) - TextView mLoginMessageHint; - @BindView(R.id.personal_user_icon) - AvatarBorderView mUserIcon; - @BindView(R.id.personal_user_small_icon) - SimpleDraweeView mUserIconSmall; - // @BindView(R.id.personal_user_badge) -// SimpleDraweeView mUserBadge; - @BindView(R.id.personal_login) - View mPersonalLogin; - @BindView(R.id.personal_home) - TextView mPersonalHome; - @BindView(R.id.personal_user_name) - TextView mPersonalUserName; - @BindView(R.id.personal_user_name_small) - TextView mPersonalUserNameSmall; -// @BindView(R.id.personal_badge) -// 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_badge) - RelativeLayout mPersonalBadge; - @BindView(R.id.personal_badge_icon) - SimpleDraweeView mPersonalBadgeIcon; - @BindView(R.id.personalMyBadgeIcon) - ImageView mPersonalMyBadgeIcon; - @BindView(R.id.personal_badge_count_tv) - TextView mPersonalBadgeCountTv; - @BindView(R.id.personal_badge_tv) - ImageView mPersonalBadgeTv; - @BindView(R.id.personal_badge_tips) - View mPersonalBadgeTips; - @BindView(R.id.personal_func) - RecyclerView mFuncRecyclerView; - @BindView(R.id.personal_new_fans_tips) - View personalNewFansTips; - @BindView(R.id.personal_background) - SimpleDraweeView mPersonalBackground; - @BindView(R.id.personal_background_shadow) - View mPersonalBackgroundShadow; - - 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; - - private AppDatabase mDatabase; - - private UserViewModel mUserViewModel; - private MessageUnreadViewModel mUnreadViewModel; - private UserHomeViewModel mUserHomeViewModel; - private PersonalViewModel mPersonalViewModel; - - private PersonalFunctionGroupAdapter mPersonalFuncGroupAdapter; - - private boolean mIsLogging = false; - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - if (requestCode == Constants.REQUEST_LOGIN) { // QQ Login callback - LoginHelper.onQQLoginCallback(requestCode, resultCode, data); - } else if (requestCode == 32973) {// 32973 WeiBo requestCode - LoginHelper.onWeiboLoginCallback(requestCode, resultCode, data); - } else if (requestCode == REQUEST_MESSAGE) { - if (mUnreadViewModel != null) mUnreadViewModel.retry(); - } - } - - @Override - protected int getLayoutId() { - return R.layout.fragment_personal_stub; - } - - @Override - protected boolean useButterKnife() { - return false; - } - - @SuppressLint("CheckResult") - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - mDatabase = AppDatabase.getInstance(getContext()); - final UserViewModel.Factory factory = new UserViewModel.Factory(getActivity().getApplication()); - mUserViewModel = ViewModelProviders.of(this, factory).get(UserViewModel.class); - mUserHomeViewModel = ViewModelProviders.of(this, new UserHomeViewModel.Factory(HaloApp.getInstance().getApplication(), - UserManager.getInstance().getUserId())).get(UserHomeViewModel.class); - mUnreadViewModel = ViewModelProviders.of(this, - new MessageUnreadViewModel.Factory(HaloApp.getInstance().getApplication())).get(MessageUnreadViewModel.class); - mPersonalViewModel = ViewModelProviders.of(this).get(PersonalViewModel.class); - - observeNoneUIRelatedChanges(); - } - - @Override - public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { - super.onViewCreated(view, savedInstanceState); - if (BuildConfig.DEBUG || BuildConfig.BUILD_TIME != 0) { - View indicator = requireActivity() - .getWindow() - .getDecorView() - .findViewById(android.R.id.content) - .findViewById(BaseActivity.ID_ROOT_INDICATOR); - indicator.setOnClickListener(v -> - requireContext().startActivity(NewPersonalActivity.Companion.getIntent(requireContext())) - ); - } - } - - @Override - public void onFragmentFirstVisible() { - super.onFragmentFirstVisible(); - - inflateRealView(); - observeUIRelatedChanges(); - } - - private void inflateRealView() { - try { - mCachedView = ((ViewStub) (mCachedView.findViewById(R.id.stub))).inflate(); - } catch (Exception e) { - e.printStackTrace(); - } - - ButterKnife.bind(this, mCachedView); - - mPersonalFuncGroupAdapter = new PersonalFunctionGroupAdapter(requireContext()); - mFuncRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); - mFuncRecyclerView.setAdapter(mPersonalFuncGroupAdapter); - mFuncRecyclerView.addItemDecoration(new VerticalItemDecoration(requireContext(), 8f, false)); - - int statusBarHeight = Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT ? 0 : DisplayUtils.getStatusBarHeight(getResources()); - ViewGroup.LayoutParams params = toolbar.getLayoutParams(); - params.height = DisplayUtils.dip2px(50) + statusBarHeight; - toolbar.setLayoutParams(params); - - appbar.addOnOffsetChangedListener((appBarLayout, verticalOffset) -> { - int absOffset = Math.abs(verticalOffset); - int invisibleOffset = DisplayUtils.dip2px(56F + 48F - 50F) - DisplayUtils.getStatusBarHeight(getResources()); - if (absOffset <= invisibleOffset) { - mUserIconSmall.setVisibility(View.GONE); - mPersonalUserNameSmall.setVisibility(View.GONE); - toolbar.setBackground(null); - } else { - mUserIconSmall.setVisibility(View.VISIBLE); - mPersonalUserNameSmall.setVisibility(View.VISIBLE); - toolbar.setBackgroundResource(R.drawable.personal_top_bg); - } - mListRefresh.setEnabled(absOffset <= 2); - }); - mListRefresh.setColorSchemeColors(ContextCompat.getColor(requireContext(), R.color.theme)); - mListRefresh.setProgressViewOffset(false, 0, DisplayUtils.dip2px(80) + DisplayUtils.getStatusBarHeight(requireContext().getResources())); - mListRefresh.setOnRefreshListener(() -> { - mPersonalViewModel.getHaloAddons(); - if (CheckLoginUtils.isLogin()) { - mUnreadViewModel.retry(); - MessageUnreadRepository.INSTANCE.loadMessageUnreadTotal(false); - mUserHomeViewModel.getBadgeList(); - mUserHomeViewModel.availableBadges(); - } - mBaseHandler.postDelayed(() -> { - mListRefresh.setRefreshing(false); - }, 2000); - MtaHelper.onEvent("我的光环_新", "下拉刷新", "下拉刷新"); - }); - MessageUnreadRepository.INSTANCE.loadMessageUnreadTotal(true); - } - - private void observeNoneUIRelatedChanges() { - mPersonalViewModel.getHaloAddons(); - mUserViewModel.getLoginObsUserinfo().observe(this, userInfoEntity -> { - UserInfoEntity notifyUserInfo; - if (userInfoEntity != null) { - notifyUserInfo = userInfoEntity.getData(); - } else { - notifyUserInfo = null; - } - - if (notifyUserInfo != null && mUserInfoEntity == null) { // 单个用户,首次触发 - EventBus.getDefault().post(new EBConcernChanged()); - - LoginTokenEntity loginTokenEntity = UserManager.getInstance().getLoginTokenEntity(); - if (mIsLogging && loginTokenEntity != null) { - String loginType = loginTokenEntity.getLoginType(); - LogUtils.login("success", loginType, getLoginEntranceByType(loginType)); - mIsLogging = false; - } - } - - mUserInfoEntity = notifyUserInfo; - if (notifyUserInfo == null) { - mUnreadViewModel.clean(); - EventBus.getDefault().post(new EBConcernChanged()); - } - }); - - mPersonalViewModel.getHaloAddData().observe(this, datas -> { - if (!datas.isEmpty()) { - MessageUnreadRepository.INSTANCE.loadMessageUnreadTotal(false); - } - }); - - mUnreadViewModel.getLiveData().observe(this - , messageUnread -> { - if (messageUnread != null && messageUnread.getTotal() > 0) { - // 第一次开启应用时检查消息中心看有没有未读消息确定需不需要弹 Notifier 通知 - showNotifier(messageUnread); - } - }); - } - - @SuppressLint("CheckResult") - private void observeUIRelatedChanges() { - mUserViewModel.getLoginObsUserinfo().observe(this, userInfoEntity -> { - if (userInfoEntity != null && userInfoEntity.getData() != null) { - changeLoginState(true); - } else { - changeLoginState(false); - } - }); - - mUserHomeViewModel.getBadges().observe(this, badgeEntities -> { - mPersonalBadgeIcon.setImageURI(""); - - if (badgeEntities.isEmpty()) { - mPersonalBadgeTv.setVisibility(View.GONE); - mPersonalBadgeCountTv.setVisibility(View.GONE); - mPersonalMyBadgeIcon.setVisibility(View.VISIBLE); - } else { - mPersonalBadgeTv.setVisibility(View.VISIBLE); - mPersonalBadgeCountTv.setVisibility(View.VISIBLE); - mPersonalMyBadgeIcon.setVisibility(View.GONE); - mPersonalBadgeCountTv.setText(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; - } - } - } -// mPersonalBadgeIcon.setImageURI(""); -// -// if (badgeEntities.isEmpty()) { -// mPersonalBadgeTv.setText("我的徽章"); -// } 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); - checkUpdate(); - } - }); - - mUnreadViewModel.getLiveData().observe(this - , messageUnread -> { - if (messageUnread != null && messageUnread.getTotal() > 0) { - personalNewFansTips.setVisibility(messageUnread.getFans() > 0 ? View.VISIBLE : View.GONE); - mPersonalHome.setText(messageUnread.getFans() > 0 ? ((messageUnread.getFans() < 100 ? messageUnread.getFans() : "99+") + "位新粉丝") : "个人主页"); - int count = messageUnread.getTotal() - messageUnread.getFans(); - mLoginMessageHint.setVisibility(count > 0 ? View.VISIBLE : View.GONE); - BindingAdapters.setMessageUnread(mLoginMessageHint, count); - } else { - mLoginMessageHint.setVisibility(View.GONE); - mPersonalHome.setText("个人主页"); - personalNewFansTips.setVisibility(View.GONE); - EventBus.getDefault().post(new EBReuse(MESSAGE_READ_OVER)); - } - }); - mUnreadViewModel.getZixunConcernLiveData().observe(this, hasConcern -> { - notifyItemChange("游戏动态", hasConcern ? FunctionalMessageType.NEW_MESSAGE : null); - }); - mUnreadViewModel.getAddonsUnreadLiveData().observe(this, entity -> { - notifyItemChange("我的收藏", entity.getFavorite() > 0 ? FunctionalMessageType.NEW_MESSAGE : null); - }); - - // 微信/签到 - RxView.clicks(mPersonalSign) - .throttleFirst(1, TimeUnit.SECONDS) - .subscribe(aVoid -> { - if (CheckLoginUtils.isLogin()) { - MtaHelper.onEvent("我的光环", "签到"); - MtaHelper.onEvent("我的光环_新", "签到", "点击签到"); - sign(); - } else { - MtaHelper.onEvent("我的光环_新", "功能入口-跳转登录", "签到"); - CheckLoginUtils.checkLogin(getContext(), "我的光环-签到", () -> { - }); - } - }); - } - - @Override - public void onFragmentResume() { - super.onFragmentResume(); - - if (NetworkUtils.isNetworkConnected(requireContext())) { - mUnreadViewModel.retry(); - mUserHomeViewModel.getBadgeList(); - mUserHomeViewModel.availableBadges(); - } - int currentItem = ((MainWrapperFragment) getParentFragment()).getCurrentItem(); - if (currentItem == INDEX_PERSONAL) { - DisplayUtils.setLightStatusBar(requireActivity(), false); - } - } - - private void showNotifier(MessageUnreadEntity messageUnread) { - if (mUnreadViewModel.isFirstTimeInit()) { - mUnreadViewModel.flagFirstTimeInit(false); - - if (messageUnread.getMeta() != null && messageUnread.getMeta().getUser() != null) { - if (messageUnread.getMeta() != null) { - String displayText = StringUtils.shrinkStringWithDot(messageUnread.getMeta().getUser().getName(), 8); - String suffixText; - if ("follow_question".equals(messageUnread.getMeta().getType())) { - suffixText = "回答了你关注的问题"; - } else { - suffixText = "回答了你的问题"; - } - displayText += suffixText; - - String content = messageUnread.getMeta().getAnswerId() + displayText; - - if (Notifier.shouldShowNotifier(content)) { - Notifier.create(getActivity()) - .setText(displayText) - .setDuration(5000) - .setIcon(messageUnread.getMeta().getUser().getIcon()) - .setOnClickListener(view -> { - Bundle bundle = new Bundle(); - bundle.putString(EntranceUtils.KEY_ANSWER_ID, messageUnread.getMeta().getAnswerId()); - bundle.putString(EntranceUtils.KEY_ENTRANCE, EntranceUtils.ENTRANCE_UMENG); - bundle.putString(EntranceUtils.KEY_TO, SimpleAnswerDetailActivity.class.getName()); - EntranceUtils.jumpActivity(getActivity(), bundle); - - MtaHelper.onEvent("消息弹窗", suffixText, "Does not contains any parameter."); - - // 标记已读 - JSONObject jsonObject = new JSONObject(); - try { - jsonObject.put("type", messageUnread.getMeta().getType()); - RequestBody body = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString()); - RetrofitManager.getInstance(requireContext()).getApi() - .postMessageRead(UserManager.getInstance().getUserId(), messageUnread.getMeta().getMessageId(), body) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Response() { - @Override - public void onResponse(@Nullable ResponseBody response) { - super.onResponse(response); - MessageUnreadRepository.INSTANCE.loadMessageUnreadData(); - } - }); - } catch (Exception e) { - e.printStackTrace(); - } - - Notifier.hide(); - }) - .show(true, 500L); - Notifier.tagNotifierAsShowed(content); - } - } - } - } - } - - @OnClick({R.id.toolbar, R.id.collapsingToolbar, R.id.iv_arrow, R.id.personal_info, R.id.personal_login, R.id.personal_user_small_icon, R.id.personal_user_icon, R.id.personal_msg, - R.id.personal_user_name_small, R.id.personal_user_name, R.id.personal_badge, R.id.personal_home}) - public void onViewClicked(View view) { - switch (view.getId()) { - case R.id.collapsingToolbar: - case R.id.toolbar: - case R.id.personal_info: - if (mUserInfoEntity == null) { - CheckLoginUtils.checkLogin(getContext(), "我的光环-手机登录", null); - } - break; - case R.id.personal_login: - MtaHelper.onEvent("我的光环_新", "立即登录", "点击登录"); - CheckLoginUtils.checkLogin(getContext(), "我的光环-立即登录", null); - break; - case R.id.personal_msg: - if (CheckLoginUtils.isLogin()) { - MtaHelper.onEvent("我的光环", "消息"); - MtaHelper.onEvent("我的光环_新", "消息中心", "点击消息中心"); - startActivityForResult(MessageActivity.getIntent(getContext(), "(我的光环)+(消息中心)"), REQUEST_MESSAGE); - } else { - MtaHelper.onEvent("我的光环_新", "功能入口-跳转登录", "消息中心"); - CheckLoginUtils.checkLogin(getContext(), "我的光环-消息", () -> { - }); - } - break; - case R.id.personal_user_small_icon: - case R.id.personal_user_icon: - if (mUserInfoEntity != null) { - MtaHelper.onEvent("我的光环", "个人中心"); - MtaHelper.onEvent("我的光环_新", "头像", "点击头像"); - DirectUtils.directToHomeActivity(requireContext(), UserManager.getInstance().getUserId(), "", "我的光环"); - } else { - MtaHelper.onEvent("我的光环", "手机登录"); - CheckLoginUtils.checkLogin(getContext(), "我的光环-手机登录", null); - } - break; - case R.id.personal_user_name_small: - case R.id.personal_user_name: - if (mUserInfoEntity != null) { - MtaHelper.onEvent("我的光环", "个人中心"); - MtaHelper.onEvent("我的光环_新", "昵称", "点击昵称"); - DirectUtils.directToHomeActivity(requireContext(), UserManager.getInstance().getUserId(), "", "我的光环"); - } else { - MtaHelper.onEvent("我的光环", "手机登录"); - CheckLoginUtils.checkLogin(getContext(), "我的光环-手机登录", null); - } - break; - case R.id.iv_arrow: - case R.id.personal_home: - if (mUserInfoEntity != null) { - MtaHelper.onEvent("我的光环", "个人主页"); - MtaHelper.onEvent("我的光环_新", "个人主页", "进入个人主页"); - DirectUtils.directToHomeActivity(requireContext(), UserManager.getInstance().getUserId(), "", "我的光环"); - } else { - CheckLoginUtils.checkLogin(getContext(), "我的光环-个人主页", null); - } - break; - case R.id.personal_badge: - MtaHelper.onEvent("我的光环_新", "徽章中心", "进入徽章中心"); - DirectUtils.directToBadgeWall(requireContext(), mUserInfoEntity.getUserId(), mUserInfoEntity.getName(), mUserInfoEntity.getIcon()); - break; - default: - break; - } - } - - // 连接上网络事件 - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(EBNetworkState busNetworkState) { - if (busNetworkState.isNetworkConnected() - && UserManager.getInstance().isLoggedIn() - && (mUserInfoEntity == null || TextUtils.isEmpty(UserManager.getInstance().getToken()))) { - mUserViewModel.retryCheckLogin(); - } - if (busNetworkState.isNetworkConnected()) { - mPersonalViewModel.getHaloAddons(); - } - } - -// @Subscribe(threadMode = ThreadMode.MAIN) -// public void onEventMainThread(EBUISwitch busNine) { -// if (MainWrapperFragment.EB_MAIN_SCROLL_TOP.equals(busNine.getFrom()) -// && INDEX_PERSONAL == busNine.getPosition()) { -// //mScrollView.fullScroll(ScrollView.FOCUS_UP); -// } -// } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(EBReuse reuse) { - if (MESSAGE_READ_OVER.equals(reuse.getType())) { // 消息阅读完成 - if (mLoginMessageHint != null) { - mLoginMessageHint.setVisibility(View.GONE); - } - } - } - - private void sign() { - RetrofitManager.getInstance(getContext()).getApi() - .postSign(UserManager.getInstance().getUserId()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Response() { - @Override - public void onResponse(SignEntity signEntity) { - mPersonalSign.setImageDrawable(ContextCompat.getDrawable(requireContext(), R.drawable.personal_sign_icon_yellow)); - if (isCanSign(signEntity.getLastTime())) { - DialogUtils.showSignDialog(getContext(), "签到成功,获得经验:1" - , getString(R.string.sign_dialog_content, signEntity.getSerialSign()) - , getString(R.string.sign_dialog_content2, signEntity.getExperience()) - , getSignSkipText(signEntity.getTitle()), () -> { - signSkip(signEntity); - } - ); - signEntity.setLastTime(System.currentTimeMillis() / 1000); - } else { - DialogUtils.showSignDialog(getContext(), "今天已签到,明天再来吧~" - , getString(R.string.sign_dialog_content, signEntity.getSerialSign()) - , getString(R.string.sign_dialog_content2, signEntity.getExperience()) - , getSignSkipText(signEntity.getTitle()), () -> { - signSkip(signEntity); - } - ); - } - - signEntity.setId(UserManager.getInstance().getUserId()); - if (mDatabase.signDao().updateSignEntity(signEntity) <= 0) { - try { - mDatabase.signDao().addSignEntity(signEntity); - } catch (SQLiteException e) { - e.printStackTrace(); - } - } - } - - @Override - public void onFailure(HttpException e) { - if (e == null || e.code() != 401) { - toast(R.string.loading_network_error); - } - } - }); - - } - - private boolean isCanSign(long time) { - SimpleDateFormat formatDay = new SimpleDateFormat("dd", Locale.CHINA); - - long lastSignTime = time * 1000; - long curTime = Utils.getTime(getContext()) * 1000; - int lastSignDay = Integer.parseInt(formatDay.format(lastSignTime)); - int curDay = Integer.parseInt(formatDay.format(curTime)); - return lastSignDay != curDay || curTime - lastSignTime > 24 * 60 * 60 * 1000; - } - - private String getSignSkipText(String text) { - return TextUtils.isEmpty(text) ? "去首页看看" : text; - } - - private void signSkip(SignEntity signEntity) { - SignEntity.Data data = signEntity.getData(); - String entrance = "(我的光环)+(签到)"; - if (data == null || TextUtils.isEmpty(data.getType())) { - EventBus.getDefault().post(new EBSkip(MainActivity.EB_SKIP_MAIN, MainWrapperFragment.INDEX_HOME)); - return; - } - switch (data.getType()) { - case "game": - DataUtils.onMtaEvent(getActivity(), "我的光环_签到跳转", "游戏", signEntity.getTitle()); - GameDetailActivity.startGameDetailActivity(getContext(), data.getLink(), entrance); - break; - case "news": - DataUtils.onMtaEvent(getActivity(), "我的光环_签到跳转", "文章", signEntity.getTitle()); - startActivity(NewsDetailActivity.getIntentById(getContext(), data.getLink(), entrance)); - break; - case "column": - DataUtils.onMtaEvent(getActivity(), "我的光环_签到跳转", "专题", signEntity.getTitle()); - SubjectActivity.startSubjectActivity(getContext(), data.getLink(), null, false, entrance); - break; - - default: - LinkEntity linkEntity = new LinkEntity(); - linkEntity.setType(data.getType()); - linkEntity.setLink(data.getLink()); - linkEntity.setText(data.getText()); - linkEntity.setCommunity(data.getCommunity()); - linkEntity.setDisplay(data.getDisplay()); - DirectUtils.directToLinkPage(requireContext(), linkEntity, entrance, ""); - break; - } - } - - private static String getLoginEntranceByType(String loginTag) { - String entrance = ""; - switch (loginTag) { - case "qq": - entrance = "我的光环-QQ"; - break; - case "wechat": - entrance = "我的光环-微信"; - break; - case "weibo": - entrance = "我的光环-新浪微博"; - break; - } - return entrance; - } - - private void changeLoginState(boolean isLogin) { - if (isLogin) { - // 设置背景 - if (mUserInfoEntity.getBackground() != null) { - ImageUtils.display(mPersonalBackground, mUserInfoEntity.getBackground().getUrl()); - // 自定义背景才需要加阴影 - if (TextUtils.isEmpty(mUserInfoEntity.getBackground().getId())) { - mPersonalBackgroundShadow.setVisibility(View.VISIBLE); - } - } else { - ImageUtils.display(mPersonalBackground, R.drawable.bg_home_user_info); - } - - SignEntity signEntity = mDatabase.signDao().getSignEntityById(UserManager.getInstance().getUserId()); - if (signEntity != null && !isCanSign(signEntity.getLastTime())) { - mPersonalSign.setImageDrawable(ContextCompat.getDrawable(requireContext(), R.drawable.personal_sign_icon_yellow)); - } else { - mPersonalSign.setImageDrawable(ContextCompat.getDrawable(requireContext(), R.drawable.personal_sign_icon_white)); - } - if (mUserInfoEntity != null) { - mUserIcon.display(mUserInfoEntity.getIconBorder() == null ? "" : mUserInfoEntity.getIconBorder().getUrl(), - mUserInfoEntity.getIcon(), mUserInfoEntity.getAuth() == null ? "" : mUserInfoEntity.getAuth().getIcon()); - ImageUtils.displayIcon(mUserIconSmall, mUserInfoEntity.getIcon()); - mPersonalUserName.setVisibility(View.VISIBLE); - mPersonalBadge.setVisibility(View.VISIBLE); - mPersonalHome.setVisibility(View.VISIBLE); - mPersonalLogin.setVisibility(View.GONE); - mPersonalUserName.setText(mUserInfoEntity.getName()); - mPersonalUserNameSmall.setText(mUserInfoEntity.getName()); - } - mUserHomeViewModel.setUserId(UserManager.getInstance().getUserId()); - mUserHomeViewModel.getBadgeList(); - mUserHomeViewModel.availableBadges(); - MessageUnreadRepository.INSTANCE.loadMessageUnreadTotal(true); - } else { - ImageUtils.display(mPersonalBackground, R.drawable.personal_top_bg); - mPersonalBackgroundShadow.setVisibility(View.GONE); - mUserIcon.display("", "", ""); - mUserIconSmall.setImageURI(""); -// mPersonalBadgeTv.setText("我的徽章"); - mPersonalUserNameSmall.setText("立即登录"); - mPersonalUserName.setVisibility(View.GONE); - mPersonalHome.setVisibility(View.GONE); - mPersonalBadge.setVisibility(View.GONE); - mPersonalLogin.setVisibility(View.VISIBLE); - - if (mLoginMessageHint.getVisibility() == View.VISIBLE) { - mLoginMessageHint.setVisibility(View.GONE); - EventBus.getDefault().post(new EBReuse(MESSAGE_READ_OVER)); - } - } - } - - private void checkUpdate() { - String channel = HaloApp.getInstance().getChannel(); - RetrofitManager.getInstance(getContext()) - .getApi() - .getUpdate(PackageUtils.getVersionName(), PackageUtils.getVersionCode(), channel) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Response() { - @Override - public void onResponse(AppEntity response) { - super.onResponse(response); - if (response.getVersionCode() > PackageUtils.getVersionCode()) { - notifyItemChange("设置", FunctionalMessageType.NEW_VERSION); - } else { - notifyItemChange("设置", null); - } - } - }); - } - - private void notifyItemChange(String funcName, FunctionalMessageType msg) { - ArrayList mEntityList = mPersonalFuncGroupAdapter.getMEntityList(); - for (FunctionalGroupEntity mEntity : mEntityList) { - for (FunctionalLinkEntity linkEntity : mEntity.getAddons()) { - if (TextUtils.equals(linkEntity.getType(), funcName)) { - linkEntity.setMessage(msg); - break; - } - } - } - mPersonalFuncGroupAdapter.notifyDataSetChanged(); - } -} diff --git a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.kt b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.kt new file mode 100644 index 0000000000..f05a557edd --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.kt @@ -0,0 +1,779 @@ +package com.gh.gamecenter.personal + +import android.annotation.SuppressLint +import android.content.Intent +import android.database.sqlite.SQLiteException +import android.os.Build +import android.os.Bundle +import android.text.TextUtils +import android.view.View +import android.view.ViewGroup +import androidx.core.content.ContextCompat +import androidx.databinding.DataBindingUtil +import androidx.lifecycle.ViewModelProvider +import androidx.recyclerview.widget.LinearLayoutManager +import com.gh.base.BaseActivity +import com.gh.base.fragment.BaseLazyFragment +import com.gh.common.databind.BindingAdapters +import com.gh.common.notifier.Notifier.Companion.create +import com.gh.common.notifier.Notifier.Companion.hide +import com.gh.common.notifier.Notifier.Companion.shouldShowNotifier +import com.gh.common.notifier.Notifier.Companion.tagNotifierAsShowed +import com.gh.common.util.* +import com.gh.common.util.DirectUtils.directToBadgeDetail +import com.gh.common.util.DirectUtils.directToBadgeWall +import com.gh.common.util.DirectUtils.directToHomeActivity +import com.gh.common.util.ImageUtils.display +import com.gh.common.util.ImageUtils.displayIcon +import com.gh.common.util.LoginHelper.onQQLoginCallback +import com.gh.common.util.LoginHelper.onWeiboLoginCallback +import com.gh.common.util.MtaHelper.onEvent +import com.gh.common.util.SPUtils.getLong +import com.gh.common.util.SPUtils.setLong +import com.gh.common.util.TimeUtils.getStartTimeOfDay +import com.gh.common.util.ToastUtils.showToast +import com.gh.common.view.VerticalItemDecoration +import com.gh.gamecenter.BuildConfig +import com.gh.gamecenter.MessageActivity +import com.gh.gamecenter.R +import com.gh.gamecenter.databinding.FragmentPersonalBinding +import com.gh.gamecenter.databinding.FragmentPersonalStubBinding +import com.gh.gamecenter.entity.* +import com.gh.gamecenter.eventbus.EBConcernChanged +import com.gh.gamecenter.eventbus.EBNetworkState +import com.gh.gamecenter.eventbus.EBReuse +import com.gh.gamecenter.fragment.MainWrapperFragment +import com.gh.gamecenter.manager.UserManager +import com.gh.gamecenter.message.MessageUnreadRepository.loadMessageUnreadData +import com.gh.gamecenter.message.MessageUnreadRepository.loadMessageUnreadTotal +import com.gh.gamecenter.message.MessageUnreadViewModel +import com.gh.gamecenter.personal.NewPersonalActivity.Companion.getIntent +import com.gh.gamecenter.personalhome.UserHomeViewModel +import com.gh.gamecenter.qa.answer.detail.SimpleAnswerDetailActivity +import com.gh.gamecenter.room.AppDatabase +import com.gh.gamecenter.user.ApiResponse +import com.gh.gamecenter.user.UserViewModel +import com.google.android.material.appbar.AppBarLayout +import com.halo.assistant.HaloApp +import com.jakewharton.rxbinding2.view.RxView +import com.tencent.connect.common.Constants +import okhttp3.MediaType +import okhttp3.RequestBody +import org.greenrobot.eventbus.EventBus +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode +import org.json.JSONObject +import java.util.* +import java.util.concurrent.TimeUnit +import kotlin.math.abs + +class PersonalFragment : BaseLazyFragment() { + private var mUserInfoEntity: UserInfoEntity? = null + + private lateinit var mDatabase: AppDatabase + + private lateinit var mBinding: FragmentPersonalStubBinding + private lateinit var mStubBinding: FragmentPersonalBinding + private lateinit var mUserViewModel: UserViewModel + private lateinit var mUnreadViewModel: MessageUnreadViewModel + private lateinit var mUserHomeViewModel: UserHomeViewModel + private lateinit var mPersonalViewModel: PersonalViewModel + + private lateinit var mPersonalFuncGroupAdapter: PersonalFunctionGroupAdapter + + private var mIsLogging = false + + override fun getInflatedLayout(): View { + mBinding = DataBindingUtil.inflate(layoutInflater, R.layout.fragment_personal_stub, null, false) + mBinding.stub.setOnInflateListener { _, inflateId -> + mStubBinding = FragmentPersonalBinding.bind(inflateId) + } + return mBinding.root + } + + override fun getLayoutId() = R.layout.fragment_personal_stub + + override fun useButterKnife() = false + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + when (requestCode) { + Constants.REQUEST_LOGIN -> { + onQQLoginCallback(requestCode, resultCode, data) + } + 32973 -> { + onWeiboLoginCallback(requestCode, resultCode, data) + } + REQUEST_MESSAGE -> { + mUnreadViewModel.retry() + } + } + } + + override fun onClick(v: View?) { + super.onClick(v) + mStubBinding.run { + when (v) { + collapsingToolbar, + toolbar, + personalInfo -> { + if (mUserInfoEntity == null) { + CheckLoginUtils.checkLogin(context, "我的光环-手机登录", null) + } + } + personalLogin -> { + onEvent("我的光环_新", "立即登录", "点击登录") + CheckLoginUtils.checkLogin(context, "我的光环-立即登录", null) + } + personalMsg -> { + if (CheckLoginUtils.isLogin()) { + onEvent("我的光环", "消息") + onEvent("我的光环_新", "消息中心", "点击消息中心") + startActivityForResult( + MessageActivity.getIntent(context, "(我的光环)+(消息中心)"), + REQUEST_MESSAGE + ) + } else { + onEvent("我的光环_新", "功能入口-跳转登录", "消息中心") + CheckLoginUtils.checkLogin(context, "我的光环-消息") {} + } + } + personalUserSmallIcon, personalUserIcon -> { + if (mUserInfoEntity != null) { + onEvent("我的光环", "个人中心") + onEvent("我的光环_新", "头像", "点击头像") + directToHomeActivity( + requireContext(), + UserManager.getInstance().userId, + "", + "我的光环" + ) + } else { + onEvent("我的光环", "手机登录") + CheckLoginUtils.checkLogin(context, "我的光环-手机登录", null) + } + } + personalUserNameSmall, personalUserName -> { + if (mUserInfoEntity != null) { + onEvent("我的光环", "个人中心") + onEvent("我的光环_新", "昵称", "点击昵称") + directToHomeActivity( + requireContext(), + UserManager.getInstance().userId, + "", + "我的光环" + ) + } else { + onEvent("我的光环", "手机登录") + CheckLoginUtils.checkLogin(context, "我的光环-手机登录", null) + } + } + ivArrow, personalHome -> { + if (mUserInfoEntity != null) { + onEvent("我的光环", "个人主页") + onEvent("我的光环_新", "个人主页", "进入个人主页") + directToHomeActivity( + requireContext(), + UserManager.getInstance().userId, + "", + "我的光环" + ) + } else { + CheckLoginUtils.checkLogin(context, "我的光环-个人主页", null) + } + } + personalBadge -> { + onEvent("我的光环_新", "徽章中心", "进入徽章中心") + directToBadgeWall( + requireContext(), + mUserInfoEntity?.userId, + mUserInfoEntity?.name, + mUserInfoEntity?.icon + ) + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + mDatabase = AppDatabase.getInstance(context) + val factory = UserViewModel.Factory(requireActivity().application) + mUserViewModel = ViewModelProvider(this, factory).get(UserViewModel::class.java) + mUserHomeViewModel = ViewModelProvider( + this, UserHomeViewModel.Factory( + HaloApp.getInstance().application, + UserManager.getInstance().userId + ) + ).get(UserHomeViewModel::class.java) + mUnreadViewModel = ViewModelProvider( + this, + MessageUnreadViewModel.Factory(HaloApp.getInstance().application) + ).get(MessageUnreadViewModel::class.java) + mPersonalViewModel = ViewModelProvider(this).get(PersonalViewModel::class.java) + + observeNoneUIRelatedChanges() + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + if (BuildConfig.DEBUG || BuildConfig.BUILD_TIME != 0L) { + val indicator = requireActivity() + .window + .decorView + .findViewById(android.R.id.content) + .findViewById(BaseActivity.ID_ROOT_INDICATOR) + indicator.setOnClickListener { + requireContext().startActivity( + getIntent(requireContext()) + ) + } + } + } + + override fun onFragmentFirstVisible() { + super.onFragmentFirstVisible() + inflateRealView() + observeUIRelatedChanges() + } + + override fun onFragmentResume() { + super.onFragmentResume() + + if (NetworkUtils.isNetworkConnected(requireContext())) { + mUnreadViewModel.retry() + mUserHomeViewModel.getBadgeList() + mUserHomeViewModel.availableBadges() + } + val currentItem = (parentFragment as MainWrapperFragment).currentItem + if (currentItem == MainWrapperFragment.INDEX_PERSONAL) { + DisplayUtils.setLightStatusBar(requireActivity(), false) + } + } + + @SuppressLint("CheckResult") + private fun observeUIRelatedChanges() { + mPersonalViewModel.appEntity.observe(this, { + if (it.versionCode > PackageUtils.getVersionCode()) { + notifyItemChange("设置", FunctionalMessageType.NEW_VERSION) + } else { + notifyItemChange("设置", null) + } + }) + + mUserViewModel.loginObsUserinfo.observe( + this, + { userInfoEntity: ApiResponse? -> + if (userInfoEntity != null && userInfoEntity.data != null) { + changeLoginState(true) + } else { + changeLoginState(false) + } + }) + + mUserHomeViewModel.badges.observe(this, + { badgeEntities: List -> + mStubBinding.personalBadgeIcon.setImageURI("") + if (badgeEntities.isEmpty()) { + mStubBinding.personalBadgeTv.visibility = View.GONE + mStubBinding.personalBadgeCountTv.visibility = View.GONE + mStubBinding.personalMyBadgeIcon.visibility = View.VISIBLE + } else { + mStubBinding.personalBadgeTv.visibility = View.VISIBLE + mStubBinding.personalBadgeCountTv.visibility = View.VISIBLE + mStubBinding.personalMyBadgeIcon.visibility = View.GONE + mStubBinding.personalBadgeCountTv.text = badgeEntities.size.toString() + "" + for ((_, _, icon, name, _, wear, _, actions) in badgeEntities) { + if (wear) { + display( + mStubBinding.personalBadgeIcon, + icon + ) + mStubBinding.personalBadgeIcon.setOnClickListener { + DialogUtils.showViewBadgeDialog( + requireContext(), + Badge(name, icon, actions) + ) { + directToBadgeWall( + requireContext(), + mUserInfoEntity?.userId, + mUserInfoEntity?.name, + mUserInfoEntity?.icon + ) + } + } + break + } + } + } +// mStubBinding.personalBadgeIcon.setImageURI("") +// +// if (badgeEntities.isEmpty()) { +// mStubBinding.personalBadgeTv.setText("我的徽章") +// } else { +// mStubBinding.personalBadgeTv.setText( +// String.format( +// Locale.CHINA, +// "%d枚徽章", +// badgeEntities.size +// ) +// ) +// for ((_, _, icon, name, _, wear, _, actions) in badgeEntities) { +// if (wear) { +// display(mStubBinding.personalBadgeIcon, icon) +// mStubBinding.personalBadgeIcon.setOnClickListener(View.OnClickListener { v: View? -> +// DialogUtils.showViewBadgeDialog( +// requireContext(), +// Badge(name, icon, actions) +// ) { +// directToBadgeWall( +// requireContext(), +// mUserInfoEntity?.userId, +// mUserInfoEntity?.name, +// mUserInfoEntity?.icon +// ) +// } +// }) +// break +// } +// } +// } + }) + mUserHomeViewModel.availableBadgeCount.observe(this, + { count: Int -> + mStubBinding.personalBadgeTips.visibility = + if (count > 0) View.VISIBLE else View.GONE + }) + + mUserHomeViewModel.availableBadge.observe(this, + { badge: BadgeEntity? -> + // 徽章领取弹窗每隔7天弹出一次,所以要判断现在是否是上一次弹出的第7天或者之后 + if (badge != null && System.currentTimeMillis() >= getLong(SP_BADGE_RECORD_SEVEN_DAY)) { + // 徽章领取弹窗每隔7天弹出一次,所以本次弹出后就记录7天后的时间戳 + setLong( + SP_BADGE_RECORD_SEVEN_DAY, + getStartTimeOfDay(System.currentTimeMillis() + 86400000 * 6) + ) + DialogUtils.showReceiveBadgeDialog( + requireContext(), badge + ) { + mPersonalViewModel.applyOrReceiveBadge(badge.id, { + if ("self" == badge.receive?.type) { + showToast("领取成功") + } else { + showToast("申请成功") + } + // 跳转到徽章详情 + directToBadgeDetail( + requireContext(), + mUserInfoEntity?.userId, + badge.id + ) + }, { + if ("self" == badge.receive?.type) { + showToast("领取失败") + } else { + showToast("申请失败") + } + }) + } + } + }) + + mPersonalViewModel.haloAddData.observe( + this, + { datas: ArrayList -> + if (datas.isNotEmpty()) { + mPersonalFuncGroupAdapter.setListData(datas) + mPersonalViewModel.checkUpdate() + } + }) + + mUnreadViewModel.liveData.observe(this, { messageUnread: MessageUnreadEntity? -> + if (messageUnread != null && messageUnread.total > 0) { + mStubBinding.personalNewFansTips.visibility = + if (messageUnread.fans > 0) View.VISIBLE else View.GONE + mStubBinding.personalHome.text = + if (messageUnread.fans > 0) (if (messageUnread.fans < 100) messageUnread.fans else "99+").toString() + "位新粉丝" else "个人主页" + val count = messageUnread.total - messageUnread.fans + mStubBinding.loginMessageHint.visibility = + if (count > 0) View.VISIBLE else View.GONE + BindingAdapters.setMessageUnread(mStubBinding.loginMessageHint, count) + } else { + mStubBinding.loginMessageHint.visibility = View.GONE + mStubBinding.personalHome.text = "个人主页" + mStubBinding.personalNewFansTips.visibility = View.GONE + EventBus.getDefault() + .post(EBReuse(MESSAGE_READ_OVER)) + } + }) + mUnreadViewModel.zixunConcernLiveData.observe(this, + { hasConcern: Boolean -> + notifyItemChange( + "游戏动态", + if (hasConcern) FunctionalMessageType.NEW_MESSAGE else null + ) + }) + mUnreadViewModel.addonsUnreadLiveData.observe(this, + { (favorite) -> + notifyItemChange( + "我的收藏", + if (favorite > 0) FunctionalMessageType.NEW_MESSAGE else null + ) + }) + + // 微信/签到 + + // 微信/签到 + RxView.clicks(mStubBinding.personalSign) + .throttleFirst(1, TimeUnit.SECONDS) + .subscribe { + if (CheckLoginUtils.isLogin()) { + onEvent("我的光环", "签到") + onEvent("我的光环_新", "签到", "点击签到") + sign() + } else { + onEvent("我的光环_新", "功能入口-跳转登录", "签到") + CheckLoginUtils.checkLogin(context, "我的光环-签到") {} + } + } + } + + private fun sign() { + mPersonalViewModel.sign { signEntity -> + mStubBinding.personalSign.setImageDrawable( + ContextCompat.getDrawable( + requireContext(), + R.drawable.personal_sign_icon_yellow + ) + ) + if (mPersonalViewModel.isCanSign(signEntity.lastTime)) { + DialogUtils.showSignDialog( + context, + "签到成功,获得经验:1", + getString(R.string.sign_dialog_content, signEntity.serialSign), + getString(R.string.sign_dialog_content2, signEntity.experience), + getSignSkipText(signEntity.title) + ) { mPersonalViewModel.signSkip(signEntity) } + signEntity.lastTime = System.currentTimeMillis() / 1000 + } else { + DialogUtils.showSignDialog( + context, + "今天已签到,明天再来吧~", + getString(R.string.sign_dialog_content, signEntity.serialSign), + getString(R.string.sign_dialog_content2, signEntity.experience), + getSignSkipText(signEntity.title) + ) { mPersonalViewModel.signSkip(signEntity) } + } + signEntity.id = UserManager.getInstance().userId + if (mDatabase.signDao().updateSignEntity(signEntity) <= 0) { + try { + mDatabase.signDao().addSignEntity(signEntity) + } catch (e: SQLiteException) { + e.printStackTrace() + } + } + } + } + + private fun getSignSkipText(text: String): String = + if (TextUtils.isEmpty(text)) "去首页看看" else text + + private fun notifyItemChange(funcName: String, msg: FunctionalMessageType?) { + val mEntityList = mPersonalFuncGroupAdapter.mEntityList + for ((_, _, _, addons) in mEntityList) { + for (linkEntity in addons) { + if (TextUtils.equals(linkEntity.type, funcName)) { + linkEntity.message = msg + break + } + } + } + mPersonalFuncGroupAdapter.notifyDataSetChanged() + } + + private fun changeLoginState(isLogin: Boolean) { + if (isLogin) { + // 设置背景 + if (mUserInfoEntity?.background != null) { + display(mStubBinding.personalBackground, mUserInfoEntity?.background?.url) + // 自定义背景才需要加阴影 + if (TextUtils.isEmpty(mUserInfoEntity?.background?.id)) { + mStubBinding.personalBackgroundShadow.visibility = View.VISIBLE + } + } else { + display(mStubBinding.personalBackground, R.drawable.bg_home_user_info) + } + val signEntity = + mDatabase.signDao().getSignEntityById(UserManager.getInstance().userId) + if (signEntity != null && !mPersonalViewModel.isCanSign(signEntity.lastTime)) { + mStubBinding.personalSign.setImageDrawable( + ContextCompat.getDrawable( + requireContext(), + R.drawable.personal_sign_icon_yellow + ) + ) + } else { + mStubBinding.personalSign.setImageDrawable( + ContextCompat.getDrawable( + requireContext(), + R.drawable.personal_sign_icon_white + ) + ) + } + if (mUserInfoEntity != null) { + mStubBinding.personalUserIcon.display( + if (mUserInfoEntity?.iconBorder == null) "" else mUserInfoEntity?.iconBorder?.url, + mUserInfoEntity?.icon, + if (mUserInfoEntity?.auth == null) "" else mUserInfoEntity?.auth?.icon + ) + displayIcon(mStubBinding.personalUserSmallIcon, mUserInfoEntity?.icon) + mStubBinding.personalUserName.visibility = View.VISIBLE + mStubBinding.personalBadge.visibility = View.VISIBLE + mStubBinding.personalHome.visibility = View.VISIBLE + mStubBinding.personalLogin.visibility = View.GONE + mStubBinding.personalUserName.text = mUserInfoEntity?.name + mStubBinding.personalUserNameSmall.text = mUserInfoEntity?.name + } + mUserHomeViewModel.userId = UserManager.getInstance().userId + mUserHomeViewModel.getBadgeList() + mUserHomeViewModel.availableBadges() + loadMessageUnreadTotal(true) + } else { + display(mStubBinding.personalBackground, R.drawable.personal_top_bg) + mStubBinding.personalBackgroundShadow.visibility = View.GONE + mStubBinding.personalUserIcon.display("", "", "") + mStubBinding.personalUserSmallIcon.setImageURI("") + // mPersonalBadgeTv.setText("我的徽章"); + mStubBinding.personalUserNameSmall.text = "立即登录" + mStubBinding.personalUserName.visibility = View.GONE + mStubBinding.personalHome.visibility = View.GONE + mStubBinding.personalBadge.visibility = View.GONE + mStubBinding.personalLogin.visibility = View.VISIBLE + if (mStubBinding.loginMessageHint.visibility == View.VISIBLE) { + mStubBinding.loginMessageHint.visibility = View.GONE + EventBus.getDefault().post(EBReuse(MESSAGE_READ_OVER)) + } + } + } + + private fun inflateRealView() { + mBinding.stub.viewStub?.inflate() + + mStubBinding.collapsingToolbar.setOnClickListener(this) + mStubBinding.toolbar.setOnClickListener(this) + mStubBinding.personalInfo.setOnClickListener(this) + mStubBinding.personalLogin.setOnClickListener(this) + mStubBinding.personalMsg.setOnClickListener(this) + mStubBinding.personalHome.setOnClickListener(this) + mStubBinding.ivArrow.setOnClickListener(this) + mStubBinding.personalLogin.setOnClickListener(this) + mStubBinding.personalUserName.setOnClickListener(this) + mStubBinding.personalUserNameSmall.setOnClickListener(this) + mStubBinding.personalUserIcon.setOnClickListener(this) + mStubBinding.personalUserSmallIcon.setOnClickListener(this) + mStubBinding.personalBadge.setOnClickListener(this) + + mPersonalFuncGroupAdapter = PersonalFunctionGroupAdapter(requireContext()) + mStubBinding.personalFunc.layoutManager = LinearLayoutManager(requireContext()) + mStubBinding.personalFunc.adapter = mPersonalFuncGroupAdapter + mStubBinding.personalFunc.addItemDecoration( + VerticalItemDecoration( + requireContext(), + 8F, + false + ) + ) + + val statusBarHeight = + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) 0 else DisplayUtils.getStatusBarHeight( + resources + ) + val params: ViewGroup.LayoutParams = mStubBinding.toolbar.layoutParams + params.height = DisplayUtils.dip2px(50F) + statusBarHeight + mStubBinding.toolbar.layoutParams = params + + mStubBinding.appbar.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { _: AppBarLayout?, verticalOffset: Int -> + val absOffset = abs(verticalOffset) + val invisibleOffset = + DisplayUtils.dip2px(56F + 48F - 50F) - DisplayUtils.getStatusBarHeight(resources) + if (absOffset <= invisibleOffset) { + mStubBinding.personalUserSmallIcon.visibility = View.GONE + mStubBinding.personalUserNameSmall.visibility = View.GONE + mStubBinding.toolbar.background = null + } else { + mStubBinding.personalUserSmallIcon.visibility = View.VISIBLE + mStubBinding.personalUserNameSmall.visibility = View.VISIBLE + mStubBinding.toolbar.setBackgroundResource(R.drawable.personal_top_bg) + } + mStubBinding.listRefresh.isEnabled = absOffset <= 2 + }) + mStubBinding.listRefresh.setColorSchemeColors( + ContextCompat.getColor( + requireContext(), + R.color.theme + ) + ) + mStubBinding.listRefresh.setProgressViewOffset( + false, + 0, + DisplayUtils.dip2px(80F) + DisplayUtils.getStatusBarHeight(requireContext().resources) + ) + mStubBinding.listRefresh.setOnRefreshListener { + mPersonalViewModel.getHaloAddons() + if (CheckLoginUtils.isLogin()) { + mUnreadViewModel.retry() + loadMessageUnreadTotal(false) + mUserHomeViewModel.getBadgeList() + mUserHomeViewModel.availableBadges() + } + mBaseHandler.postDelayed({ mStubBinding.listRefresh.isRefreshing = false }, 2000) + onEvent("我的光环_新", "下拉刷新", "下拉刷新") + } + loadMessageUnreadTotal(true) + } + + private fun observeNoneUIRelatedChanges() { + mPersonalViewModel.getHaloAddons() + mUserViewModel.loginObsUserinfo.observe(this, + { userInfoEntity: ApiResponse? -> + val notifyUserInfo: UserInfoEntity? = userInfoEntity?.data + if (notifyUserInfo != null && mUserInfoEntity == null) { // 单个用户,首次触发 + EventBus.getDefault().post(EBConcernChanged()) + val loginTokenEntity = + UserManager.getInstance().loginTokenEntity + if (mIsLogging && loginTokenEntity != null) { + val loginType = loginTokenEntity.loginType + LogUtils.login( + "success", + loginType, + mPersonalViewModel.getLoginEntranceByType(loginType) + ) + mIsLogging = false + } + } + mUserInfoEntity = notifyUserInfo + if (notifyUserInfo == null) { + mUnreadViewModel.clean() + EventBus.getDefault().post(EBConcernChanged()) + } + }) + mPersonalViewModel.haloAddData.observe( + this, + { datas: ArrayList -> + if (datas.isNotEmpty()) { + loadMessageUnreadTotal(false) + } + }) + mUnreadViewModel.liveData.observe(this, { messageUnread: MessageUnreadEntity? -> + if (messageUnread != null && messageUnread.total > 0) { + // 第一次开启应用时检查消息中心看有没有未读消息确定需不需要弹 Notifier 通知 + showNotifier(messageUnread) + } + }) + } + + private fun showNotifier(messageUnread: MessageUnreadEntity) { + if (mUnreadViewModel.isFirstTimeInit) { + mUnreadViewModel.flagFirstTimeInit(false) + if (messageUnread.meta != null && messageUnread.meta?.user != null) { + if (messageUnread.meta != null) { + var displayText = StringUtils.shrinkStringWithDot( + messageUnread.meta?.user?.name, 8 + ) + val suffixText: String = if ("follow_question" == messageUnread.meta?.type) { + "回答了你关注的问题" + } else { + "回答了你的问题" + } + displayText += suffixText + val content = messageUnread.meta?.answerId + displayText + if (shouldShowNotifier(content)) { + create(activity) + .setText(displayText) + .setDuration(5000) + .setIcon(messageUnread.meta?.user?.icon) + .setOnClickListener { + val bundle = Bundle() + bundle.putString( + EntranceUtils.KEY_ANSWER_ID, + messageUnread.meta?.answerId + ) + bundle.putString( + EntranceUtils.KEY_ENTRANCE, + EntranceUtils.ENTRANCE_UMENG + ) + bundle.putString( + EntranceUtils.KEY_TO, + SimpleAnswerDetailActivity::class.java.name + ) + EntranceUtils.jumpActivity(activity, bundle) + onEvent("消息弹窗", suffixText, "Does not contains any parameter.") + + // 标记已读 + val jsonObject = JSONObject() + try { + jsonObject.put("type", messageUnread.meta?.type) + val body = RequestBody.create( + MediaType.parse("application/json"), + jsonObject.toString() + ) + messageUnread.meta?.messageId?.let { + mPersonalViewModel.postMessageRead( + it, + body + ) { + loadMessageUnreadData() + } + } + } catch (e: Exception) { + e.printStackTrace() + } + hide() + } + .show(true, 500L) + tagNotifierAsShowed(content) + } + } + } + } + } + + // 连接上网络事件 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEventMainThread(busNetworkState: EBNetworkState) { + if (busNetworkState.isNetworkConnected + && UserManager.getInstance().isLoggedIn + && (mUserInfoEntity == null || TextUtils.isEmpty(UserManager.getInstance().token)) + ) { + mUserViewModel.retryCheckLogin() + } + if (busNetworkState.isNetworkConnected) { + mPersonalViewModel.getHaloAddons() + } + } + +// @Subscribe(threadMode = ThreadMode.MAIN) +// fun onEventMainThread(busNine: EBUISwitch) { +// if (MainWrapperFragment.EB_MAIN_SCROLL_TOP == busNine.getFrom() && MainWrapperFragment.INDEX_PERSONAL == busNine.getPosition()) { +// //mScrollView.fullScroll(ScrollView.FOCUS_UP) +// } +// } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEventMainThread(reuse: EBReuse) { + if (MESSAGE_READ_OVER == reuse.type) { // 消息阅读完成 + mStubBinding.loginMessageHint.visibility = View.GONE + } + } + + + companion object { + const val LOGIN_TAG = "login_tag" //登入标识 + const val LOGOUT_TAG = "logout_tag" // 登出标识 + + private const val MESSAGE_READ_OVER = "MESSAGE_READ_OVER" + private const val SP_BADGE_RECORD_SEVEN_DAY = "badgeRecordSevenDay" + private const val REQUEST_MESSAGE = 199 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/personal/PersonalViewModel.kt b/app/src/main/java/com/gh/gamecenter/personal/PersonalViewModel.kt index d2548f1bf8..98c0adcb74 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/PersonalViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/personal/PersonalViewModel.kt @@ -2,46 +2,63 @@ package com.gh.gamecenter.personal import android.annotation.SuppressLint import android.app.Application +import android.text.TextUtils import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.MutableLiveData import com.gh.common.constant.Constants -import com.gh.common.util.SPUtils +import com.gh.common.util.* +import com.gh.gamecenter.GameDetailActivity +import com.gh.gamecenter.MainActivity +import com.gh.gamecenter.NewsDetailActivity import com.gh.gamecenter.R -import com.gh.gamecenter.entity.FunctionalGroupEntity -import com.gh.gamecenter.entity.FunctionalLinkEntity +import com.gh.gamecenter.entity.* +import com.gh.gamecenter.eventbus.EBSkip +import com.gh.gamecenter.fragment.MainWrapperFragment +import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.retrofit.BiResponse +import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager +import com.gh.gamecenter.subject.SubjectActivity import com.halo.assistant.HaloApp +import com.lightgame.utils.Utils import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers +import okhttp3.RequestBody +import okhttp3.ResponseBody +import org.greenrobot.eventbus.EventBus +import retrofit2.HttpException +import java.text.SimpleDateFormat +import java.util.* +import kotlin.collections.ArrayList class PersonalViewModel(application: Application) : AndroidViewModel(application) { - var haloAddData = MutableLiveData>() + val haloAddData = MutableLiveData>() + val appEntity = MutableLiveData() private val commonFuncs = arrayListOf( - Triple("我的游戏", R.drawable.personal_my_game, "我的游戏"), - Triple("游戏评论", R.drawable.personal_game_comment, "游戏评论"), - Triple("我的问答", R.drawable.personal_my_questions, "我的问答"), - Triple("视频投稿", R.drawable.personal_video_submission, "视频投稿"), - Triple("我的收藏", R.drawable.personal_my_collect, "我的收藏"), - Triple("浏览记录", R.drawable.personal_browsing_history, "浏览记录"), - Triple("账号安全", R.drawable.personal_account_security, "账号安全"), - Triple("模拟器游戏", R.drawable.personal_simulator_game, "模拟器游戏"), - Triple("收货信息", R.drawable.personal_delivery_info, "收货信息") + Triple("我的游戏", R.drawable.personal_my_game, "我的游戏"), + Triple("游戏评论", R.drawable.personal_game_comment, "游戏评论"), + Triple("我的问答", R.drawable.personal_my_questions, "我的问答"), + Triple("视频投稿", R.drawable.personal_video_submission, "视频投稿"), + Triple("我的收藏", R.drawable.personal_my_collect, "我的收藏"), + Triple("浏览记录", R.drawable.personal_browsing_history, "浏览记录"), + Triple("账号安全", R.drawable.personal_account_security, "账号安全"), + Triple("模拟器游戏", R.drawable.personal_simulator_game, "模拟器游戏"), + Triple("收货信息", R.drawable.personal_delivery_info, "收货信息") ) private val contentCenterFuncs = arrayListOf( - Triple("游戏动态", R.drawable.personal_game_dynamic, "游戏动态"), - Triple("资讯中心", R.drawable.personal_news_center, "资讯中心"), - Triple("礼包中心", R.drawable.personal_gif_center, "礼包中心"), - Triple("工具箱", R.drawable.personal_tools, "工具箱") + Triple("游戏动态", R.drawable.personal_game_dynamic, "游戏动态"), + Triple("资讯中心", R.drawable.personal_news_center, "资讯中心"), + Triple("礼包中心", R.drawable.personal_gif_center, "礼包中心"), + Triple("工具箱", R.drawable.personal_tools, "工具箱") ) private val otherFuncs = arrayListOf( - Triple("帮助与反馈", R.drawable.personal_feedback, "帮助与反馈"), - Triple("实名认证", R.drawable.personal_verified, "实名认证"), - Triple("微信提醒", R.drawable.personal_wechat_remind, "微信提醒"), - Triple("安装包清理", R.drawable.personal_package_chean, "安装包清理"), - Triple("分享光环", R.drawable.personal_share, "分享光环"), - Triple("设置", R.drawable.personal_setting, "设置") + Triple("帮助与反馈", R.drawable.personal_feedback, "帮助与反馈"), + Triple("实名认证", R.drawable.personal_verified, "实名认证"), + Triple("微信提醒", R.drawable.personal_wechat_remind, "微信提醒"), + Triple("安装包清理", R.drawable.personal_package_chean, "安装包清理"), + Triple("分享光环", R.drawable.personal_share, "分享光环"), + Triple("设置", R.drawable.personal_setting, "设置") ) init { @@ -51,23 +68,23 @@ class PersonalViewModel(application: Application) : AndroidViewModel(application @SuppressLint("CheckResult") fun getHaloAddons() { RetrofitManager.getInstance(getApplication()) - .api.getHaloAddons(HaloApp.getInstance().channel) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : BiResponse>() { - override fun onSuccess(data: ArrayList) { - haloAddData.postValue(data) - data.forEach loop@{ - it.addons.forEach { link -> - if (link.type == "设置") { - SPUtils.setString(Constants.SP_PRIVACY_CURRENT_MD5, link.checkSum?.privacyPolicy - ?: "") - return@loop - } + .api.getHaloAddons(HaloApp.getInstance().channel) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BiResponse>() { + override fun onSuccess(data: ArrayList) { + haloAddData.postValue(data) + data.forEach loop@{ + it.addons.forEach { link -> + if (link.type == "设置") { + SPUtils.setString(Constants.SP_PRIVACY_CURRENT_MD5, link.checkSum?.privacyPolicy + ?: "") + return@loop } } } - }) + } + }) } private fun initDefaultData() { @@ -101,4 +118,144 @@ class PersonalViewModel(application: Application) : AndroidViewModel(application datas.add(groupEntity3) haloAddData.postValue(datas) } + + fun checkUpdate() { + RetrofitManager.getInstance(getApplication()) + .api + .getUpdate( + PackageUtils.getVersionName(), + PackageUtils.getVersionCode(), + HaloApp.getInstance().channel + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: AppEntity?) { + super.onResponse(response) + if (response != null) { + appEntity.postValue(response) + } + } + }) + } + + fun postMessageRead(messageId: String, body: RequestBody, callback: () -> Unit) { + RetrofitManager.getInstance(getApplication()).api + .postMessageRead( + UserManager.getInstance().userId, + messageId, + body + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : + Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + callback.invoke() + } + }) + } + + fun sign(successCallback: (signEntity: SignEntity) -> Unit) { + val context = getApplication().applicationContext + RetrofitManager.getInstance(getApplication()).api + .postSign(UserManager.getInstance().userId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(signEntity: SignEntity?) { + if (signEntity != null) { + successCallback.invoke(signEntity) + } + } + + override fun onFailure(e: HttpException?) { + if (e == null || e.code() != 401) { + ToastUtils.toast(context.getString(R.string.loading_network_error)) + } + } + }) + } + + @SuppressLint("CheckResult") + fun applyOrReceiveBadge( + id: String, + successCallback: (data: ResponseBody) -> Unit, + failureCallback: () -> Unit + ) { + RetrofitManager.getInstance(getApplication()).api + .applyOrReceiveBadge(id) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: ResponseBody) { + successCallback.invoke(data) + } + + override fun onFailure(exception: java.lang.Exception) { + super.onFailure(exception) + failureCallback.invoke() + } + }) + } + + fun signSkip(signEntity: SignEntity) { + val context = getApplication().applicationContext + val data = signEntity.data + val entrance = "(我的光环)+(签到)" + if (data == null || TextUtils.isEmpty(data.type)) { + EventBus.getDefault().post(EBSkip(MainActivity.EB_SKIP_MAIN, MainWrapperFragment.INDEX_HOME)) + return + } + when (data.type) { + "game" -> { + DataUtils.onMtaEvent(context, "我的光环_签到跳转", "游戏", signEntity.title) + GameDetailActivity.startGameDetailActivity(context, data.link, entrance) + } + "news" -> { + DataUtils.onMtaEvent(context, "我的光环_签到跳转", "文章", signEntity.title) + context.startActivity(NewsDetailActivity.getIntentById(context, data.link, entrance)) + } + "column" -> { + DataUtils.onMtaEvent(context, "我的光环_签到跳转", "专题", signEntity.title) + SubjectActivity.startSubjectActivity( + context, + data.link, + null, + false, + entrance + ) + } + else -> { + val linkEntity = LinkEntity() + linkEntity.type = data.type + linkEntity.link = data.link + linkEntity.text = data.text + linkEntity.community = data.community + linkEntity.display = data.display + DirectUtils.directToLinkPage(context, linkEntity, entrance, "") + } + } + } + + fun isCanSign(time: Long): Boolean { + val context = getApplication().applicationContext + val formatDay = SimpleDateFormat("dd", Locale.CHINA) + val lastSignTime = time * 1000 + val curTime = Utils.getTime(context) * 1000 + val lastSignDay = formatDay.format(lastSignTime).toInt() + val curDay = formatDay.format(curTime).toInt() + return lastSignDay != curDay || curTime - lastSignTime > 24 * 60 * 60 * 1000 + } + + fun getLoginEntranceByType(loginTag: String): String { + var entrance = "" + when (loginTag) { + "qq" -> entrance = "我的光环-QQ" + "wechat" -> entrance = "我的光环-微信" + "weibo" -> entrance = "我的光环-新浪微博" + } + return entrance + } } \ No newline at end of file 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 b90e22ba8b..20d8527c56 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 @@ -43,7 +43,7 @@ import com.gh.gamecenter.entity.* import com.gh.gamecenter.eventbus.EBReuse import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.normal.NormalFragment -import com.gh.gamecenter.personal.PersonalFragment.LOGIN_TAG +import com.gh.gamecenter.personal.PersonalFragment import com.gh.gamecenter.qa.answer.edit.AnswerEditActivity import com.gh.gamecenter.qa.comment.CommentActivity import com.gh.gamecenter.qa.dialog.MoreFunctionPanelDialog @@ -1205,7 +1205,7 @@ open class AnswerDetailFragment : NormalFragment() { @Subscribe(threadMode = ThreadMode.MAIN) fun onEventMainThread(reuse: EBReuse) { - if (reuse.type == LOGIN_TAG && !TextUtils.isEmpty(mAnswerId)) { // 登入 + if (reuse.type == PersonalFragment.LOGIN_TAG && !TextUtils.isEmpty(mAnswerId)) { // 登入 mViewModel.getAnswerDetail(mAnswerId, mEntrance) } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/detail/QuestionsDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/detail/QuestionsDetailFragment.kt index 3831831ec0..9ca00dd2ea 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/detail/QuestionsDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/detail/QuestionsDetailFragment.kt @@ -40,7 +40,7 @@ import com.gh.gamecenter.eventbus.EBDeleteDetail import com.gh.gamecenter.eventbus.EBReuse import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.mvvm.Status -import com.gh.gamecenter.personal.PersonalFragment.LOGIN_TAG +import com.gh.gamecenter.personal.PersonalFragment import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity import com.gh.gamecenter.qa.answer.edit.AnswerEditActivity import com.gh.gamecenter.qa.answer.fold.AnswerFoldActivity @@ -651,7 +651,7 @@ class QuestionsDetailFragment : // 登录事件 @Subscribe(threadMode = ThreadMode.MAIN) fun onEventMainThread(reuse: EBReuse) { - if (reuse.type == LOGIN_TAG) { // 登入 + if (reuse.type == PersonalFragment.LOGIN_TAG) { // 登入 onRefresh() } } diff --git a/app/src/main/res/layout/fragment_new_personal_stub.xml b/app/src/main/res/layout/fragment_new_personal_stub.xml index 391830aec6..085c41a222 100644 --- a/app/src/main/res/layout/fragment_new_personal_stub.xml +++ b/app/src/main/res/layout/fragment_new_personal_stub.xml @@ -1,11 +1,18 @@ - + - + + + + - + android:layout_height="match_parent"> + + + + diff --git a/app/src/main/res/layout/fragment_personal_stub.xml b/app/src/main/res/layout/fragment_personal_stub.xml index 0be2c48211..07fe4e8511 100644 --- a/app/src/main/res/layout/fragment_personal_stub.xml +++ b/app/src/main/res/layout/fragment_personal_stub.xml @@ -1,11 +1,18 @@ - + - + + + + - + android:layout_height="match_parent"> + + + + From 0187608918b61e25571099f0485194ea25022782 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Tue, 17 Aug 2021 10:57:55 +0800 Subject: [PATCH 071/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E9=AA=8C=E6=94=B6=E9=97=AE=E9=A2=98(27)=20https://git?= =?UTF-8?q?.ghzs.com/pm/halo-app-issues/-/issues/1442?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gamecenter/qa/video/publish/VideoPublishFragment.kt | 8 ++++---- .../gamecenter/qa/video/publish/VideoPublishViewModel.kt | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt index 0354af5f3c..83626fcec7 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt @@ -589,7 +589,7 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { val title = mBinding.title.text.toString() val des = mBinding.videoDes.text.toString() if (mVideoFileEntity?.url.isNullOrEmpty()) return false - if (mViewModel.communityEntity == null) return false + if (mViewModel.videoPatch == null && mViewModel.communityEntity == null) return false if (title.isEmpty()) return false if (mViewModel.videoPatch != null && mViewModel.videoPatch?.title == title && mViewModel.videoPatch?.des == des) return false return true @@ -770,17 +770,17 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { toast("请填写标题") return } - if (!isDraft && !mBinding.originalTv.isChecked && !mBinding.reprintTv.isChecked) { + if (!isDraft && mViewModel.videoPatch == null && !mBinding.originalTv.isChecked && !mBinding.reprintTv.isChecked) { toast("请选择内容来源") return } - if (!isDraft && mViewModel.selectActivityLabelEntity != null && !mBinding.originalTv.isChecked) { + if (!isDraft && mViewModel.videoPatch == null && mViewModel.selectActivityLabelEntity != null && !mBinding.originalTv.isChecked) { toast("本次活动内容要求原创") return } - if (!isDraft && mBinding.reprintTv.isChecked && mBinding.reprintUrlTv.text.isEmpty()) { + if (!isDraft && mViewModel.videoPatch == null && mBinding.reprintTv.isChecked && mBinding.reprintUrlTv.text.isEmpty()) { toast("请填写转载来源") return } diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishViewModel.kt index a3006c0d3e..04ca2fb5b5 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishViewModel.kt @@ -62,14 +62,14 @@ class VideoPublishViewModel(application: Application) : AndroidViewModel(applica fun postContent(isDraft: Boolean, videoEntity: ForumVideoEntity, videoPath: String?) { when { - videoPatch != null -> { - patchVideo(JSONObject(GsonUtils.toJson(videoEntity)), videoEntity.id) - } isDraft -> { val draftData = JSONObject(videoEntity.toJson()).put("local_path", videoPath).toString() val body = RequestBody.create(MediaType.parse("application/json"), draftData) postDraft(body) } + videoPatch != null -> { + patchVideo(JSONObject(GsonUtils.toJson(videoEntity)), videoEntity.id) + } else -> { val requestJson = JSONObject(GsonUtils.toJson(videoEntity)) var videoHeight = 0 From 5969fa2ca54c9ff9f9c5a1f0ae662ade2410eb43 Mon Sep 17 00:00:00 2001 From: juntao Date: Tue, 17 Aug 2021 15:47:45 +0800 Subject: [PATCH 072/151] =?UTF-8?q?=E7=BD=91=E9=A1=B5=E8=B7=B3=E8=BD=AC?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E8=A7=86=E9=A2=91=E7=9A=84=E8=AE=BA=E5=9D=9B?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E6=94=B9=E4=B8=BA=E5=8F=AF=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/DefaultUrlHandler.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/common/DefaultUrlHandler.kt b/app/src/main/java/com/gh/common/DefaultUrlHandler.kt index 90975b6b3d..0f0bb186c0 100644 --- a/app/src/main/java/com/gh/common/DefaultUrlHandler.kt +++ b/app/src/main/java/com/gh/common/DefaultUrlHandler.kt @@ -295,6 +295,7 @@ object DefaultUrlHandler { val forumName = uri.getQueryParameter("forum_name") ?: "" val forumId = uri.getQueryParameter("forum_id") ?: "" val forumIcon = uri.getQueryParameter("forum_icon") ?: "" + val forumType = uri.getQueryParameter("forum_type") ?: BbsType.OFFICIAL_BBS.value val activityLabelEntity = ActivityLabelEntity(id = activityId, name = activityName) val communityEntity = CommunityEntity(id = forumId, name = forumName, icon = forumIcon) @@ -303,7 +304,7 @@ object DefaultUrlHandler { context, communityEntity, activityLabelEntity, - BbsType.OFFICIAL_BBS.value, + forumType, false, entrance, "" From 80c95b0f11e04ee5f9a90c5346b53041450ba4af Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Tue, 17 Aug 2021 17:23:46 +0800 Subject: [PATCH 073/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E9=A6=96=E9=A1=B5=E8=BD=AE=E6=92=AD?= =?UTF-8?q?=E5=9B=BE=E6=98=BE=E7=A4=BA=E8=83=8C=E6=99=AF=E8=89=B2=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=20https://git.ghzs.com/pm/halo-app-issues/-/issues/13?= =?UTF-8?q?21?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/Extensions.kt | 12 +- .../java/com/gh/common/view/DrawableView.kt | 7 + .../common/view/OffsetLinearLayoutManager.kt | 39 +++ .../fragment/HomeSearchToolWrapperFragment.kt | 238 ++++++++++++------ .../com/gh/gamecenter/home/HomeFragment.kt | 70 ++++-- .../gh/gamecenter/home/HomeFragmentAdapter.kt | 173 +++++++++---- .../home/slide/HomeSlideListViewHolder.kt | 51 +++- app/src/main/res/layout/fragment_game.xml | 3 +- app/src/main/res/layout/home_slide_list.xml | 10 +- 9 files changed, 454 insertions(+), 149 deletions(-) create mode 100644 app/src/main/java/com/gh/common/view/OffsetLinearLayoutManager.kt diff --git a/app/src/main/java/com/gh/common/util/Extensions.kt b/app/src/main/java/com/gh/common/util/Extensions.kt index adff801404..5e60700ce9 100644 --- a/app/src/main/java/com/gh/common/util/Extensions.kt +++ b/app/src/main/java/com/gh/common/util/Extensions.kt @@ -6,6 +6,7 @@ import android.content.ClipboardManager import android.content.Context import android.graphics.Bitmap import android.graphics.Canvas +import android.graphics.Color import android.graphics.Rect import android.graphics.drawable.Drawable import android.graphics.drawable.GradientDrawable @@ -65,8 +66,6 @@ import java.util.regex.Pattern import kotlin.math.abs - - /** * 创建以 activity 为观察者上下文的 viewModel */ @@ -1103,4 +1102,13 @@ fun View.getBitmapFromView(): Bitmap? { val canvas = Canvas(bitmap) this.draw(canvas) return bitmap +} + +fun String.hexStringToIntColor(): Int { + val colorStr = if (this.length == 9) { + "#${this.substring(3)}" + } else this + return if (colorStr.length >= 7) { + Color.parseColor(colorStr) + } else Color.WHITE } \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/view/DrawableView.kt b/app/src/main/java/com/gh/common/view/DrawableView.kt index 4811b1f93c..e1a7f49674 100644 --- a/app/src/main/java/com/gh/common/view/DrawableView.kt +++ b/app/src/main/java/com/gh/common/view/DrawableView.kt @@ -112,6 +112,13 @@ object DrawableView { return drawable } + @JvmStatic + fun getGradientDrawable(startColor: Int, endColor: Int, orientation: GradientDrawable.Orientation = GradientDrawable.Orientation.LEFT_RIGHT, radius: Float = 999F): Drawable { + val drawable = GradientDrawable(orientation, intArrayOf(startColor, endColor)) + drawable.cornerRadius = DisplayUtils.dip2px(radius).toFloat() + return drawable + } + fun convertAlphaKey(percent: Int): String { val hexString = Integer.toHexString(Math.round((255 * percent / 100).toFloat())) return (if (hexString.length < 2) "0" else "") + hexString diff --git a/app/src/main/java/com/gh/common/view/OffsetLinearLayoutManager.kt b/app/src/main/java/com/gh/common/view/OffsetLinearLayoutManager.kt new file mode 100644 index 0000000000..cfc9a71f99 --- /dev/null +++ b/app/src/main/java/com/gh/common/view/OffsetLinearLayoutManager.kt @@ -0,0 +1,39 @@ +package com.gh.common.view + +import android.content.Context +import androidx.core.view.marginTop +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.gh.common.util.dip2px +import java.util.* + +/** + * 重写computeVerticalScrollOffset,精确计算RecyclerView滑动距离 + */ +class OffsetLinearLayoutManager(context: Context?) : FixLinearLayoutManager(context) { + val heightMap = linkedMapOf() + override fun onLayoutCompleted(state: RecyclerView.State) { + super.onLayoutCompleted(state) + val count = childCount + for (i in 0 until count) { + val view = getChildAt(i) + heightMap[i] = view?.height ?: 0 + } + } + + override fun computeVerticalScrollOffset(state: RecyclerView.State): Int { + return if (childCount != 0) { + try { + val firstVisiablePosition = findFirstVisibleItemPosition() + val firstVisiableView = findViewByPosition(firstVisiablePosition) + var offsetY = -(firstVisiableView?.y ?: 0).toInt() + for (i in 0 until firstVisiablePosition) { + offsetY += (if (heightMap[i] == null) 0 else heightMap[i] ?: 0) + } + offsetY + } catch (e: Exception) { + 0 + } + } else 0 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt index b5241878a1..c3f22e5621 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt @@ -50,6 +50,7 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { private var mTabDefaultColor: Int = 0 private var mCurrentAppBarColor: Int = 0 + private var mCurrentHomeAppBarColor: Int = 0 private var mIsDisplayingLightContent = false @@ -60,6 +61,8 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { private var mFragmentList = ArrayList() + private var mIsBannerShow = true + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -69,19 +72,26 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { override fun onFragmentFirstVisible() { mViewModel = viewModelProviderFromParent() - mSearchToolbarFragment = childFragmentManager.findFragmentById(R.id.wrapper_toolbar) as SearchToolbarFragment? + mSearchToolbarFragment = + childFragmentManager.findFragmentById(R.id.wrapper_toolbar) as SearchToolbarFragment? ?: SearchToolbarFragment() setSearchHints() - mBinding?.wrapperLl?.setPadding(0, 0, 0, requireContext().resources.getDimension(R.dimen.main_bottom_tab_height).toInt()) + mBinding?.wrapperLl?.setPadding( + 0, + 0, + 0, + requireContext().resources.getDimension(R.dimen.main_bottom_tab_height).toInt() + ) mBinding?.appbar?.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { appBarLayout, verticalOffset -> mViewModel?.appBarOffset = abs(verticalOffset) }) - mSearchToolbarFragment?.arguments = Bundle().apply { putString(EntranceUtils.KEY_LOCATION, "首页") } + mSearchToolbarFragment?.arguments = + Bundle().apply { putString(EntranceUtils.KEY_LOCATION, "首页") } childFragmentManager.beginTransaction() - .replace(R.id.wrapper_toolbar, mSearchToolbarFragment!!) - .commitAllowingStateLoss() + .replace(R.id.wrapper_toolbar, mSearchToolbarFragment!!) + .commitAllowingStateLoss() updateAppBarStyle(Color.WHITE, false) @@ -124,7 +134,8 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { super.onSaveInstanceState(outState) } - override fun getInflatedLayout() = FragmentMainHomeWrapperBinding.inflate(layoutInflater).apply { mBinding = this }.root + override fun getInflatedLayout() = + FragmentMainHomeWrapperBinding.inflate(layoutInflater).apply { mBinding = this }.root private fun initViewPager(tabList: ArrayList) { val fragmentList = generateFragments(tabList).apply { mFragmentList = this } @@ -138,11 +149,13 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { if (mCurrentAppBarColor == Color.WHITE) return - var offsetRatio: Float = abs(recyclerView.computeVerticalScrollOffset()).toFloat() / COLOR_CHANGE_DISTANCE + var offsetRatio: Float = + abs(recyclerView.computeVerticalScrollOffset()).toFloat() / COLOR_CHANGE_DISTANCE if (offsetRatio > 1) offsetRatio = 1F - val colorInBetween = ColorUtils.blendARGB(mCurrentAppBarColor, Color.WHITE, offsetRatio) + val colorInBetween = + ColorUtils.blendARGB(mCurrentAppBarColor, Color.WHITE, offsetRatio) Utils.log("offset", offsetRatio) @@ -153,79 +166,117 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { mBinding?.run { viewPager.offscreenPageLimit = fragmentList.size viewPager.doOnScroll( - onPageSelected = { position -> - notifyChildFragmentLifecycle(position) - updateTabTextStyle(position, 0F) - mViewModel?.forumTabPair?.let { - if (it.first == position) { - DirectUtils.directForumDetail(requireContext(), it.second, "首页") - viewPager.post { viewPager.currentItem = position - 1 } - } + onPageSelected = { position -> + notifyChildFragmentLifecycle(position) + updateTabTextStyle(position, 0F) + mViewModel?.forumTabPair?.let { + if (it.first == position) { + DirectUtils.directForumDetail(requireContext(), it.second, "首页") + viewPager.post { viewPager.currentItem = position - 1 } } - mViewModel?.tabs?.value?.run { - this.safelyGetInRelease(position).let { - LogUtils.logHomeTopTabClick(it?.name, it?.type, it?.text, position) - } + } + mViewModel?.tabs?.value?.run { + this.safelyGetInRelease(position).let { + LogUtils.logHomeTopTabClick(it?.name, it?.type, it?.text, position) } + } // viewPager.getChildAt(position)?.findViewById(R.id.list_rv)?.let { // it.removeOnScrollListener(onScrollChangeListener) // it.addOnScrollListener(onScrollChangeListener) // } - }, - onPageScrolled = { position, positionOffset, _ -> - if (position + 1 != mTabTitleList.size) { - val currentAppBarColor = tabList.safelyGetInRelease(position)?.primaryColor ?: Color.WHITE - val incomingAppBarColor = tabList.safelyGetInRelease(position + 1)?.primaryColor ?: Color.WHITE + }, + onPageScrolled = { position, positionOffset, _ -> + if (position + 1 != mTabTitleList.size) { + val currentAppBarColor = + tabList.safelyGetInRelease(position)?.primaryColor ?: Color.WHITE + val incomingAppBarColor = + tabList.safelyGetInRelease(position + 1)?.primaryColor ?: Color.WHITE - val proximatelySelectedPosition = if (positionOffset < 0.5) position else position + 1 + val proximatelySelectedPosition = + if (positionOffset < 0.5) position else position + 1 - val appBarColorInBetween = if (currentAppBarColor == incomingAppBarColor) { - currentAppBarColor - } else { - ColorUtils.blendARGB(currentAppBarColor, incomingAppBarColor, positionOffset) - } - - // 颜色显示是否变更 - val isContentStyleChanged = tabList.safelyGetInRelease(proximatelySelectedPosition)?.useLightStyle != mIsDisplayingLightContent - mIsDisplayingLightContent = tabList.safelyGetInRelease(proximatelySelectedPosition)?.useLightStyle ?: false - - mTabSelectedColor = if (mIsDisplayingLightContent) TAB_DEFAULT_COLOR_LIGHT else TAB_SELECTED_COLOR - mTabDefaultColor = if (mIsDisplayingLightContent) TAB_DEFAULT_COLOR_LIGHT else TAB_DEFAULT_COLOR - - if (isContentStyleChanged) { - if (mIsDisplayingLightContent) { - indicatorView.updateIndicatorDrawable(ContextCompat.getDrawable(requireContext(), R.drawable.ic_home_tab_indicator_white)) - } else { - indicatorView.updateIndicatorDrawable(ContextCompat.getDrawable(requireContext(), R.drawable.ic_home_tab_indicator_colorful)) - } - DisplayUtils.setLightStatusBar(requireActivity(), !mIsDisplayingLightContent) - } - - mTabTitleList[position].run { - textSize = (DEFAULT_TAB_TEXT_SIZE + ((1 - positionOffset) * 4)).roundTo(1) - setTextColor(ColorUtils.blendARGB(mTabDefaultColor, mTabSelectedColor, 1 - positionOffset)) - } - mTabTitleList[position + 1].run { - textSize = (DEFAULT_TAB_TEXT_SIZE + ((positionOffset) * 4)).roundTo(1) - setTextColor(ColorUtils.blendARGB(mTabDefaultColor, mTabSelectedColor, positionOffset)) - } - - // 多 tab 切换的时候可能会出现某些 tab 的文字没有回归到原始大小的问题的问题 (positionOffset 不保证连续) - for ((index, tabTv) in mTabTitleList.withIndex()) { - if (abs(index - position) >= 2) { - if (tabTv.textSize != DEFAULT_TAB_TEXT_SIZE) { - tabTv.textSize = DEFAULT_TAB_TEXT_SIZE - tabTv.setTextColor(mTabDefaultColor) - } - } - } - - mCurrentAppBarColor = appBarColorInBetween - updateAppBarStyle(appBarColorInBetween, mIsDisplayingLightContent) + val appBarColorInBetween = if (currentAppBarColor == incomingAppBarColor) { + currentAppBarColor + } else { + ColorUtils.blendARGB( + currentAppBarColor, + incomingAppBarColor, + positionOffset + ) } - updateTabTextStyle(position, positionOffset) + // 颜色显示是否变更 + val isContentStyleChanged = + tabList.safelyGetInRelease(proximatelySelectedPosition)?.useLightStyle != mIsDisplayingLightContent + mIsDisplayingLightContent = + tabList.safelyGetInRelease(proximatelySelectedPosition)?.useLightStyle + ?: false + + mTabSelectedColor = + if (mIsDisplayingLightContent) TAB_DEFAULT_COLOR_LIGHT else TAB_SELECTED_COLOR + mTabDefaultColor = + if (mIsDisplayingLightContent) TAB_DEFAULT_COLOR_LIGHT else TAB_DEFAULT_COLOR + + if (isContentStyleChanged) { + if (mIsDisplayingLightContent) { + indicatorView.updateIndicatorDrawable( + ContextCompat.getDrawable( + requireContext(), + R.drawable.ic_home_tab_indicator_white + ) + ) + } else { + indicatorView.updateIndicatorDrawable( + ContextCompat.getDrawable( + requireContext(), + R.drawable.ic_home_tab_indicator_colorful + ) + ) + } + DisplayUtils.setLightStatusBar( + requireActivity(), + !mIsDisplayingLightContent + ) + } + + mTabTitleList[position].run { + textSize = + (DEFAULT_TAB_TEXT_SIZE + ((1 - positionOffset) * 4)).roundTo(1) + setTextColor( + ColorUtils.blendARGB( + mTabDefaultColor, + mTabSelectedColor, + 1 - positionOffset + ) + ) + } + mTabTitleList[position + 1].run { + textSize = (DEFAULT_TAB_TEXT_SIZE + ((positionOffset) * 4)).roundTo(1) + setTextColor( + ColorUtils.blendARGB( + mTabDefaultColor, + mTabSelectedColor, + positionOffset + ) + ) + } + + // 多 tab 切换的时候可能会出现某些 tab 的文字没有回归到原始大小的问题的问题 (positionOffset 不保证连续) + for ((index, tabTv) in mTabTitleList.withIndex()) { + if (abs(index - position) >= 2) { + if (tabTv.textSize != DEFAULT_TAB_TEXT_SIZE) { + tabTv.textSize = DEFAULT_TAB_TEXT_SIZE + tabTv.setTextColor(mTabDefaultColor) + } + } + } + + mCurrentAppBarColor = appBarColorInBetween + updateAppBarStyle(appBarColorInBetween, mIsDisplayingLightContent) } + + updateTabTextStyle(position, positionOffset) + } ) // 设置默认 position 避免 position 为 0 的 fragment 被先加载显示再跳转至具体页面 @@ -250,6 +301,43 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { } } + fun onScrollChanged(totalHeight: Int, offset: Int) { + if (mIsBannerShow && offset >= totalHeight) { + mIsBannerShow = false + changeAppBarColor(Color.WHITE) + } else if(!mIsBannerShow && offset < totalHeight) { + mIsBannerShow = true + changeAppBarColor(mCurrentHomeAppBarColor) + } + mTabSelectedColor = + if (offset < totalHeight) TAB_DEFAULT_COLOR_LIGHT else TAB_SELECTED_COLOR + mTabDefaultColor = + if (offset < totalHeight) TAB_DEFAULT_COLOR_LIGHT else TAB_DEFAULT_COLOR + if (offset < totalHeight) { + mBinding?.indicatorView?.updateIndicatorDrawable(R.drawable.ic_home_tab_indicator_white.toDrawable()) + } else { + mBinding?.indicatorView?.updateIndicatorDrawable(R.drawable.ic_home_tab_indicator_colorful.toDrawable()) + } + val homeTab = mViewModel?.tabs?.value?.find { it.type == "home" } + homeTab?.primaryColor = if (offset < totalHeight) mCurrentHomeAppBarColor else Color.WHITE + homeTab?.useLightStyle = offset < totalHeight + mIsDisplayingLightContent = offset < totalHeight + DisplayUtils.setLightStatusBar(requireActivity(), !mIsDisplayingLightContent) + updateTabTextStyle(mLastSelectedPosition, 0f) + } + + fun changeAppBarColor(color: Int) { + if (color != Color.WHITE) { + mCurrentHomeAppBarColor = color + val homeTab = mViewModel?.tabs?.value?.find { it.type == "home" } + homeTab?.primaryColor = color + homeTab?.useLightStyle = true + mIsDisplayingLightContent = true + DisplayUtils.setLightStatusBar(requireActivity(), !mIsDisplayingLightContent) + } + updateAppBarStyle(color, color != Color.WHITE) + } + private fun notifyChildFragmentLifecycle(currentSelectedPosition: Int) { tryCatchInRelease { // 补充 Viewpager Fragment 的生命周期, 先调用旧选中 fragment 的 onPause 再当前的 onResume @@ -310,7 +398,10 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { }) "column" -> SubjectFragment().with(Bundle().apply { putString(EntranceUtils.KEY_ENTRANCE, "首页") - putParcelable(EntranceUtils.KEY_SUBJECT_DATA, SubjectData(tab.link, tab.text, false)) + putParcelable( + EntranceUtils.KEY_SUBJECT_DATA, + SubjectData(tab.link, tab.text, false) + ) }) "web" -> WebFragment().with(Bundle().apply { putString(EntranceUtils.KEY_URL, tab.link) @@ -322,7 +413,10 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { } fragment.arguments?.putInt(EntranceUtils.KEY_TAB_COUNT, tabList.size) fragment.arguments?.putBoolean(EntranceUtils.KEY_IS_HOME, true) - fragment.arguments?.putParcelable(EntranceUtils.KEY_EXPOSURE_SOURCE, ExposureSource("首页顶部Tab栏", tab.name ?: "")) + fragment.arguments?.putParcelable( + EntranceUtils.KEY_EXPOSURE_SOURCE, + ExposureSource("首页顶部Tab栏", tab.name ?: "") + ) fragmentList.add(fragment) } return fragmentList diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt b/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt index c1f7987273..a7cdc6c322 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt @@ -1,5 +1,6 @@ package com.gh.gamecenter.home +import android.graphics.Color import android.os.Bundle import android.view.View import androidx.core.content.ContextCompat @@ -13,7 +14,7 @@ import com.gh.common.TimeElapsedHelper import com.gh.common.constant.Constants import com.gh.common.exposure.ExposureListener import com.gh.common.util.* -import com.gh.common.view.FixLinearLayoutManager +import com.gh.common.view.OffsetLinearLayoutManager import com.gh.common.xapk.XapkInstaller import com.gh.common.xapk.XapkUnzipStatus import com.gh.download.DownloadManager @@ -24,6 +25,7 @@ import com.gh.gamecenter.eventbus.EBDownloadStatus import com.gh.gamecenter.eventbus.EBPackage import com.gh.gamecenter.eventbus.EBReuse import com.gh.gamecenter.eventbus.EBUISwitch +import com.gh.gamecenter.fragment.HomeSearchToolWrapperFragment import com.gh.gamecenter.fragment.MainWrapperFragment import com.gh.gamecenter.game.gallery.GameGallerySlideViewHolder import com.gh.gamecenter.home.slide.HomeSlideListAdapter @@ -47,7 +49,7 @@ class HomeFragment : BaseFragment() { private lateinit var mElapsedHelper: TimeElapsedHelper private lateinit var mExposureListener: ExposureListener private lateinit var mScrollCalculatorHelper: ScrollCalculatorHelper - private lateinit var mAutomaticLayoutManager: LinearLayoutManager + private lateinit var mAutomaticLayoutManager: OffsetLinearLayoutManager private val dataWatcher = object : DataWatcher() { override fun onDataChanged(downloadEntity: DownloadEntity) { @@ -76,7 +78,10 @@ class HomeFragment : BaseFragment() { if (it == LoadStatus.INIT_LOADED) { AppExecutor.uiExecutor.executeWithDelay(Runnable { scroll() - mScrollCalculatorHelper.onScrollStateChanged(mBinding.gameList, RecyclerView.SCROLL_STATE_IDLE) + mScrollCalculatorHelper.onScrollStateChanged( + mBinding.gameList, + RecyclerView.SCROLL_STATE_IDLE + ) }, 100) } }) @@ -88,11 +93,20 @@ class HomeFragment : BaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) mBinding = FragmentGameBinding.bind(view) - mBinding.gameRefresh.setColorSchemeColors(ContextCompat.getColor(requireContext(), R.color.theme)) + mBinding.gameRefresh.setColorSchemeColors( + ContextCompat.getColor( + requireContext(), + R.color.theme + ) + ) mBinding.loadStatus = LoadStatus.LIST_LOADED - mAutomaticLayoutManager = FixLinearLayoutManager(requireContext()) + mAutomaticLayoutManager = OffsetLinearLayoutManager(requireContext()) mLayoutManager = mAutomaticLayoutManager - mListAdapter = HomeFragmentAdapter(requireContext(), mViewModel, mLayoutManager) + mListAdapter = HomeFragmentAdapter(requireContext(), mViewModel, mLayoutManager) { + if (parentFragment is HomeSearchToolWrapperFragment) { + (parentFragment as HomeSearchToolWrapperFragment).changeAppBarColor(it.hexStringToIntColor()) + } + } mExposureListener = ExposureListener(this, mListAdapter) (mBinding.gameList.itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false mBinding.gameList.layoutManager = mLayoutManager @@ -103,11 +117,19 @@ class HomeFragment : BaseFragment() { super.onScrollStateChanged(recyclerView, newState) mScrollCalculatorHelper.onScrollStateChanged(mBinding.gameList, newState) if (mLayoutManager.findLastVisibleItemPosition() == mListAdapter.itemCount - 1 - && RecyclerView.SCROLL_STATE_IDLE == newState) mViewModel.getHomeContent(false) + && RecyclerView.SCROLL_STATE_IDLE == newState + ) mViewModel.getHomeContent(false) } override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) + if (parentFragment is HomeSearchToolWrapperFragment) { + val bannerViewHeight = mAutomaticLayoutManager.heightMap[0] ?: 0 + (parentFragment as HomeSearchToolWrapperFragment).onScrollChanged( + bannerViewHeight, + mBinding.gameList.computeVerticalScrollOffset() + ) + } scroll() } }) @@ -128,7 +150,11 @@ class HomeFragment : BaseFragment() { private fun scroll() { val firstVisibleItem = mAutomaticLayoutManager.findFirstVisibleItemPosition() val lastVisibleItem = mAutomaticLayoutManager.findLastVisibleItemPosition() - mScrollCalculatorHelper.onScroll(mViewModel.itemDataList.value, firstVisibleItem, lastVisibleItem) + mScrollCalculatorHelper.onScroll( + mViewModel.itemDataList.value, + firstVisibleItem, + lastVisibleItem + ) } override fun onPause() { @@ -158,24 +184,31 @@ class HomeFragment : BaseFragment() { mScrollCalculatorHelper.currentPlayer?.resetDetailMask() mScrollCalculatorHelper.currentPlayer?.onVideoPause() val currentPosition = mScrollCalculatorHelper.currentPlayer?.getCurrentPosition() ?: 0L - val topVideo = mViewModel.itemDataList.value?.safelyGetInRelease(mScrollCalculatorHelper.currentPosition)?.attachGame?.linkGame?.topVideo + val topVideo = + mViewModel.itemDataList.value?.safelyGetInRelease(mScrollCalculatorHelper.currentPosition)?.attachGame?.linkGame?.topVideo if (topVideo != null) { - ScrollCalculatorHelper.savePlaySchedule(MD5Utils.getContentMD5(topVideo.url), currentPosition) + ScrollCalculatorHelper.savePlaySchedule( + MD5Utils.getContentMD5(topVideo.url), + currentPosition + ) } } } private fun resumeVideo() { if (mScrollCalculatorHelper.currentPlayer != null) { - val topVideo = mViewModel.itemDataList.value?.safelyGetInRelease(mScrollCalculatorHelper.currentPosition)?.attachGame?.linkGame?.topVideo + val topVideo = + mViewModel.itemDataList.value?.safelyGetInRelease(mScrollCalculatorHelper.currentPosition)?.attachGame?.linkGame?.topVideo if (topVideo != null) { - val position = ScrollCalculatorHelper.getPlaySchedule(MD5Utils.getContentMD5(topVideo.url)) + val position = + ScrollCalculatorHelper.getPlaySchedule(MD5Utils.getContentMD5(topVideo.url)) //这里必须要延迟操作,否则会白屏 mBaseHandler.postDelayed({ if (position != 0L) { mScrollCalculatorHelper.currentPlayer?.seekTo(position) mScrollCalculatorHelper.currentPlayer?.onVideoResume(false) - val topVideoVoiceStatus = SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true) + val topVideoVoiceStatus = + SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true) if (topVideoVoiceStatus) { mScrollCalculatorHelper.currentPlayer?.mute() } else { @@ -203,9 +236,11 @@ class HomeFragment : BaseFragment() { if (resumeScroll) adapter.startScroll() else adapter.stopScroll() } - val firstPosition = (mBinding.gameList.layoutManager as? LinearLayoutManager)?.findFirstVisibleItemPosition() + val firstPosition = + (mBinding.gameList.layoutManager as? LinearLayoutManager)?.findFirstVisibleItemPosition() ?: 0 - val lastPosition = (mBinding.gameList.layoutManager as? LinearLayoutManager)?.findLastVisibleItemPosition() + val lastPosition = + (mBinding.gameList.layoutManager as? LinearLayoutManager)?.findLastVisibleItemPosition() ?: 0 for (i in firstPosition..lastPosition) { @@ -243,8 +278,9 @@ class HomeFragment : BaseFragment() { @Subscribe(threadMode = ThreadMode.MAIN) fun onEventMainThread(busNine: EBUISwitch) { if (::mLayoutManager.isInitialized - && MainWrapperFragment.EB_MAIN_SCROLL_TOP == busNine.from - && MainWrapperFragment.INDEX_HOME == busNine.position) { + && MainWrapperFragment.EB_MAIN_SCROLL_TOP == busNine.from + && MainWrapperFragment.INDEX_HOME == busNine.position + ) { mBinding.gameList.stopScroll() mLayoutManager.scrollToPosition(0) mScrollCalculatorHelper.currentPlayer?.release() diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt b/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt index 0a802e66cb..ff42ddbc2e 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt @@ -34,12 +34,22 @@ import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder import com.shuyu.gsyvideoplayer.video.base.GSYVideoView import java.util.* -class HomeFragmentAdapter(context: Context, - val viewModel: HomeViewModel, - val layoutManager: LinearLayoutManager) : DiffUtilAdapter(context), IExposable { +class HomeFragmentAdapter( + context: Context, + val viewModel: HomeViewModel, + val layoutManager: LinearLayoutManager, + val callback: (colorStr: String) -> Unit +) : DiffUtilAdapter(context), IExposable { private var mLoadStatus: LoadStatus? = null - private val mLegacyHomeFragmentAdapterAssistant by lazy { LegacyHomeFragmentAdapterAssistant(mContext, this, mLayoutInflater, mBasicExposureSource) } + private val mLegacyHomeFragmentAdapterAssistant by lazy { + LegacyHomeFragmentAdapterAssistant( + mContext, + this, + mLayoutInflater, + mBasicExposureSource + ) + } private val mBasicExposureSource by lazy { listOf(ExposureSource("新首页", "")) } @@ -95,7 +105,7 @@ class HomeFragmentAdapter(context: Context, return when (viewType) { SLIDE_ITEM -> { view = mLayoutInflater.inflate(R.layout.home_slide_list, parent, false) - HomeSlideListViewHolder(HomeSlideListBinding.bind(view)) + HomeSlideListViewHolder(HomeSlideListBinding.bind(view), callback) } RECOMMENDS_ITEM -> { view = mLayoutInflater.inflate(R.layout.home_recommend_item, parent, false) @@ -122,7 +132,10 @@ class HomeFragmentAdapter(context: Context, ReuseViewHolder(view) } // 原游戏板块样式 - else -> return mLegacyHomeFragmentAdapterAssistant.createLegacyViewHolder(parent, viewType) + else -> return mLegacyHomeFragmentAdapterAssistant.createLegacyViewHolder( + parent, + viewType + ) } } @@ -146,7 +159,11 @@ class HomeFragmentAdapter(context: Context, is ReuseViewHolder -> bindUnknown(holder) is HomeDividerViewHolder -> holder.bindView(mDataList[position].lineDivider ?: 1F) - else -> mLegacyHomeFragmentAdapterAssistant.bindLegacyViewHolder(holder, mDataList[position], position) + else -> mLegacyHomeFragmentAdapterAssistant.bindLegacyViewHolder( + holder, + mDataList[position], + position + ) } } @@ -163,21 +180,38 @@ class HomeFragmentAdapter(context: Context, val exposureList = arrayListOf() for (amway in amwayList) { val event = ExposureEvent.createEventWithSourceConcat( - gameEntity = amway.game.toGameEntity(), - basicSource = mBasicExposureSource, - source = listOf(ExposureSource("安利墙", ""))) + gameEntity = amway.game.toGameEntity(), + basicSource = mBasicExposureSource, + source = listOf(ExposureSource("安利墙", "")) + ) exposureList.add(event) } homeItemData.exposureEventList = exposureList val clickClosure: (View, Int, AmwayCommentEntity) -> Unit = { v, itemPosition, amway -> - MtaHelper.onEvent("首页_新", "点击", "内容" + homeItemData.blockPosition + "_安利墙" + (itemPosition + 1) + "_" + amway.game.name) + MtaHelper.onEvent( + "首页_新", + "点击", + "内容" + homeItemData.blockPosition + "_安利墙" + (itemPosition + 1) + "_" + amway.game.name + ) val path = "(首页安利墙)" if (v.id == R.id.rating_block) { - val intent = RatingReplyActivity.getIntent(mContext, amway.game.id, amway.comment.id, false, path, "") + val intent = RatingReplyActivity.getIntent( + mContext, + amway.game.id, + amway.comment.id, + false, + path, + "" + ) mContext.startActivity(intent) } else { - GameDetailActivity.startGameDetailActivity(mContext, amway.game.id, path, homeItemData.exposureEventList?.safelyGetInRelease(itemPosition)) + GameDetailActivity.startGameDetailActivity( + mContext, + amway.game.id, + path, + homeItemData.exposureEventList?.safelyGetInRelease(itemPosition) + ) } } @@ -192,30 +226,35 @@ class HomeFragmentAdapter(context: Context, holder.bindGame(game) homeItemData.exposureEvent = ExposureEvent.createEventWithSourceConcat( - gameEntity = game, - basicSource = mBasicExposureSource, - source = listOf(ExposureSource("游戏", ""))) + gameEntity = game, + basicSource = mBasicExposureSource, + source = listOf(ExposureSource("游戏", "")) + ) holder.binding.gameBrief.text = homeItemData.attachGame?.recommendText holder.binding.gameImage.visibleIf(!(homeItemData.attachGame?.displayContent == "video" && homeItemData.attachGame?.linkGame?.topVideo != null)) holder.binding.autoVideoView.goneIf(homeItemData.attachGame?.displayContent != "video" || homeItemData.attachGame?.linkGame?.topVideo == null) if (!holder.binding.autoVideoView.isInPlayingState - && homeItemData.attachGame?.displayContent == "video" - && homeItemData.attachGame?.linkGame?.topVideo != null) { + && homeItemData.attachGame?.displayContent == "video" + && homeItemData.attachGame?.linkGame?.topVideo != null + ) { val topVideo = homeItemData.attachGame?.linkGame?.topVideo val homeSetting = homeItemData.attachGame?.linkGame?.homeSetting GSYVideoOptionBuilder() - .setIsTouchWiget(false) - .setUrl(topVideo?.url ?: "") - .setRotateViewAuto(false) - .setCacheWithPlay(true) - .setRotateWithSystem(false) - .setReleaseWhenLossAudio(true) - .setLooping(false) - .setShowFullAnimation(false) - .build(holder.binding.autoVideoView) + .setIsTouchWiget(false) + .setUrl(topVideo?.url ?: "") + .setRotateViewAuto(false) + .setCacheWithPlay(true) + .setRotateWithSystem(false) + .setReleaseWhenLossAudio(true) + .setLooping(false) + .setShowFullAnimation(false) + .build(holder.binding.autoVideoView) holder.binding.autoVideoView.updateThumb(topVideo?.poster ?: "") - holder.binding.autoVideoView.setData(homeItemData.attachGame?.linkGame, homeSetting?.placeholderColor) + holder.binding.autoVideoView.setData( + homeItemData.attachGame?.linkGame, + homeSetting?.placeholderColor + ) holder.binding.autoVideoView.detailBtn?.setOnClickListener { holder.itemView.performClick() holder.binding.autoVideoView.uploadVideoStreamingPlaying("点击遮罩", true) @@ -225,35 +264,63 @@ class HomeFragmentAdapter(context: Context, holder.binding.gameImage.setOnClickListener { if (homeItemData.attachGame?.linkType == "video") { - MtaHelper.onEvent("首页_新", "点击", "内容" + homeItemData.blockPosition + "_" + game.name + "_视频详情") - DirectUtils.directToVideoDetail(mContext, - homeItemData.attachGame?.linkId!!, - VideoDetailContainerViewModel.Location.VIDEO_CHOICENESS.value, - entrance = "(首页-游戏[" + game.name + "])", - path = "新首页-内容管理") + MtaHelper.onEvent( + "首页_新", + "点击", + "内容" + homeItemData.blockPosition + "_" + game.name + "_视频详情" + ) + DirectUtils.directToVideoDetail( + mContext, + homeItemData.attachGame?.linkId!!, + VideoDetailContainerViewModel.Location.VIDEO_CHOICENESS.value, + entrance = "(首页-游戏[" + game.name + "])", + path = "新首页-内容管理" + ) } else { - MtaHelper.onEvent("首页_新", "点击", "内容" + homeItemData.blockPosition + "_" + game.name + "_游戏详情") - GameDetailActivity.startGameDetailActivity(mContext, game.id, "(首页-游戏[" + game.name + "])", homeItemData.exposureEvent) + MtaHelper.onEvent( + "首页_新", + "点击", + "内容" + homeItemData.blockPosition + "_" + game.name + "_游戏详情" + ) + GameDetailActivity.startGameDetailActivity( + mContext, + game.id, + "(首页-游戏[" + game.name + "])", + homeItemData.exposureEvent + ) } } holder.itemView.setOnClickListener { MtaHelper.onEvent("首页_新", "点击", "内容" + homeItemData.blockPosition + "_" + game.name) - GameDetailActivity.startGameDetailActivity(mContext, game.id, "(首页-游戏[" + game.name + "])", homeItemData.exposureEvent) + GameDetailActivity.startGameDetailActivity( + mContext, + game.id, + "(首页-游戏[" + game.name + "])", + homeItemData.exposureEvent + ) if (holder.binding.autoVideoView.isInPlayingState) { - holder.binding.autoVideoView.uploadVideoStreamingPlaying("游戏详情-播放点击", holder.binding.autoVideoView.detailBtn?.visibility == View.VISIBLE) + holder.binding.autoVideoView.uploadVideoStreamingPlaying( + "游戏详情-播放点击", + holder.binding.autoVideoView.detailBtn?.visibility == View.VISIBLE + ) } else { if (holder.binding.autoVideoView.currentState == GSYVideoView.CURRENT_STATE_AUTO_COMPLETE) { - holder.binding.autoVideoView.uploadVideoStreamingPlaying("游戏详情-完播点击", holder.binding.autoVideoView.detailBtn?.visibility == View.VISIBLE) + holder.binding.autoVideoView.uploadVideoStreamingPlaying( + "游戏详情-完播点击", + holder.binding.autoVideoView.detailBtn?.visibility == View.VISIBLE + ) } } } } private fun bindFooterView(holder: FooterViewHolder) { - holder.initFooterViewHolder(mLoadStatus == LoadStatus.LIST_LOADING, - mLoadStatus == LoadStatus.LIST_FAILED, - mLoadStatus == LoadStatus.LIST_OVER, - R.string.load_over_with_click_hint) { + holder.initFooterViewHolder( + mLoadStatus == LoadStatus.LIST_LOADING, + mLoadStatus == LoadStatus.LIST_FAILED, + mLoadStatus == LoadStatus.LIST_OVER, + R.string.load_over_with_click_hint + ) { if (mLoadStatus == LoadStatus.LIST_OVER) { layoutManager.scrollToPosition(0) } else if (mLoadStatus == LoadStatus.LIST_FAILED) { @@ -271,8 +338,9 @@ class HomeFragmentAdapter(context: Context, entryMap[download.platform] = download } if (getItemViewType(gameAndPosition.position) == ItemViewType.VERTICAL_SLIDE_ITEM || - getItemViewType(gameAndPosition.position) == ItemViewType.GAME_PLUGIN || - getItemViewType(gameAndPosition.position) == SLIDE_ITEM) { + getItemViewType(gameAndPosition.position) == ItemViewType.GAME_PLUGIN || + getItemViewType(gameAndPosition.position) == SLIDE_ITEM + ) { val view = layoutManager.findViewByPosition(gameAndPosition.position) val recyclerView = view?.findViewById(R.id.recycler_view) when (val adapter = recyclerView?.adapter) { @@ -298,8 +366,9 @@ class HomeFragmentAdapter(context: Context, fun notifyChildItem(position: Int) { if (getItemViewType(position) == ItemViewType.VERTICAL_SLIDE_ITEM || - getItemViewType(position) == ItemViewType.GAME_PLUGIN || - getItemViewType(position) == SLIDE_ITEM) { + getItemViewType(position) == ItemViewType.GAME_PLUGIN || + getItemViewType(position) == SLIDE_ITEM + ) { val view = layoutManager.findViewByPosition(position) val recyclerView = view?.findViewById(R.id.recycler_view) recyclerView?.adapter?.notifyDataSetChanged() @@ -341,7 +410,12 @@ class HomeFragmentAdapter(context: Context, } // 原游戏板块样式 - mLegacyHomeFragmentAdapterAssistant.getLegacyGameEntityByPackage(positionList, itemData, packageName, position) + mLegacyHomeFragmentAdapterAssistant.getLegacyGameEntityByPackage( + positionList, + itemData, + packageName, + position + ) } } return positionList @@ -355,7 +429,8 @@ class HomeFragmentAdapter(context: Context, return mDataList[pos].exposureEventList } - class HomeDividerViewHolder(var binding: HomeDividerItemBinding) : RecyclerView.ViewHolder(binding.root) { + class HomeDividerViewHolder(var binding: HomeDividerItemBinding) : + RecyclerView.ViewHolder(binding.root) { fun bindView(height: Float) { val lp = binding.container.layoutParams lp.height = height.dip2px() diff --git a/app/src/main/java/com/gh/gamecenter/home/slide/HomeSlideListViewHolder.kt b/app/src/main/java/com/gh/gamecenter/home/slide/HomeSlideListViewHolder.kt index f15576ad32..f17ba5ef52 100644 --- a/app/src/main/java/com/gh/gamecenter/home/slide/HomeSlideListViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/home/slide/HomeSlideListViewHolder.kt @@ -1,6 +1,8 @@ package com.gh.gamecenter.home.slide import android.annotation.SuppressLint +import android.graphics.Color +import android.graphics.drawable.GradientDrawable import android.view.MotionEvent import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.PagerSnapHelper @@ -8,14 +10,22 @@ import androidx.recyclerview.widget.RecyclerView import com.gh.base.BaseRecyclerViewHolder import com.gh.common.exposure.ExposureSource import com.gh.common.util.MtaHelper +import com.gh.common.util.hexStringToIntColor import com.gh.common.util.throwExceptionInDebug +import com.gh.common.view.DrawableView import com.gh.common.view.FixLinearLayoutManager import com.gh.common.view.TouchSlopRecyclerView import com.gh.gamecenter.databinding.HomeSlideListBinding +import com.gh.gamecenter.entity.HomeSlide import com.gh.gamecenter.home.HomeItemData +import com.lightgame.utils.Utils import kotlin.math.abs -class HomeSlideListViewHolder(val binding: HomeSlideListBinding) : BaseRecyclerViewHolder(binding.root) { +class HomeSlideListViewHolder( + val binding: HomeSlideListBinding, + val callback: (colorStr: String) -> Unit +) : + BaseRecyclerViewHolder(binding.root) { private var mLastX: Int = 0 private var mLastY: Int = 0 @@ -39,7 +49,14 @@ class HomeSlideListViewHolder(val binding: HomeSlideListBinding) : BaseRecyclerV val snapHelper = PagerSnapHelper() val layoutManager = FixLinearLayoutManager(context, RecyclerView.HORIZONTAL, false) - adapter = HomeSlideListAdapter(context, itemData, layoutManager, snapHelper, binding.recyclerView, basicExposureSource) + adapter = HomeSlideListAdapter( + context, + itemData, + layoutManager, + snapHelper, + binding.recyclerView, + basicExposureSource + ) (binding.recyclerView.itemAnimator as DefaultItemAnimator).supportsChangeAnimations = false binding.recyclerView.layoutManager = layoutManager binding.recyclerView.adapter = adapter @@ -47,7 +64,8 @@ class HomeSlideListViewHolder(val binding: HomeSlideListBinding) : BaseRecyclerV binding.recyclerView.isNestedScrollingEnabled = false binding.recyclerView.scrollToPosition(adapter.getActualFirstPositionInCenter()) snapHelper.attachToRecyclerView(binding.recyclerView) - binding.recyclerView.addOnItemTouchListener(object : RecyclerView.SimpleOnItemTouchListener() { + binding.recyclerView.addOnItemTouchListener(object : + RecyclerView.SimpleOnItemTouchListener() { override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean { val x = e.x.toInt() val y = e.y.toInt() @@ -58,7 +76,9 @@ class HomeSlideListViewHolder(val binding: HomeSlideListBinding) : BaseRecyclerV mLastY = e.y.toInt() rv.parent.parent.requestDisallowInterceptTouchEvent(true) } - MotionEvent.ACTION_UP -> rv.parent.parent.requestDisallowInterceptTouchEvent(false) + MotionEvent.ACTION_UP -> rv.parent.parent.requestDisallowInterceptTouchEvent( + false + ) MotionEvent.ACTION_MOVE -> { val deltaX: Int = x - mLastX val deltaY: Int = y - mLastY @@ -67,7 +87,8 @@ class HomeSlideListViewHolder(val binding: HomeSlideListBinding) : BaseRecyclerV } } - val isStop = e.action == MotionEvent.ACTION_DOWN || e.action == MotionEvent.ACTION_MOVE + val isStop = + e.action == MotionEvent.ACTION_DOWN || e.action == MotionEvent.ACTION_MOVE if (isStop) adapter.stopScroll() else adapter.startScroll() val touchSlopRecyclerView = binding.recyclerView.parent.parent @@ -77,6 +98,7 @@ class HomeSlideListViewHolder(val binding: HomeSlideListBinding) : BaseRecyclerV return false } }) + setPlaceholderColor(slideList, 0) binding.recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { var lastStatePosition = -1 @@ -91,10 +113,15 @@ class HomeSlideListViewHolder(val binding: HomeSlideListBinding) : BaseRecyclerV curPosition = adapter.getActualPosition(layoutManager.getPosition(view)) } if (lastScrollState == RecyclerView.SCROLL_STATE_DRAGGING && curPosition != lastStatePosition) { - MtaHelper.onEvent("首页_新", "轮播_滑动", if (curPosition > lastStatePosition) "左滑" else "右滑") + MtaHelper.onEvent( + "首页_新", + "轮播_滑动", + if (curPosition > lastStatePosition) "左滑" else "右滑" + ) } lastStatePosition = curPosition lastScrollState = scrollState + setPlaceholderColor(slideList, curPosition) } else if (scrollState == RecyclerView.SCROLL_STATE_DRAGGING) { lastScrollState = scrollState } @@ -106,6 +133,18 @@ class HomeSlideListViewHolder(val binding: HomeSlideListBinding) : BaseRecyclerV }) } + private fun setPlaceholderColor( + slideList: List, + position: Int + ) { + callback.invoke(slideList[position].placeholderColor) + val gradientDrawable = DrawableView.getGradientDrawable( + slideList[position].placeholderColor.hexStringToIntColor(), + Color.WHITE, GradientDrawable.Orientation.TOP_BOTTOM, 0f + ) + binding.placeholderView.background = gradientDrawable + } + // 缩放控制 fun updateZoomAnimation() { val childCount = binding.recyclerView.childCount diff --git a/app/src/main/res/layout/fragment_game.xml b/app/src/main/res/layout/fragment_game.xml index 31794cd782..09ba71fd53 100644 --- a/app/src/main/res/layout/fragment_game.xml +++ b/app/src/main/res/layout/fragment_game.xml @@ -30,8 +30,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/white" - android:clipToPadding="false" - android:paddingTop="@dimen/home_recyclerview_padding_top" /> + android:clipToPadding="false" /> diff --git a/app/src/main/res/layout/home_slide_list.xml b/app/src/main/res/layout/home_slide_list.xml index 3b2260dfbf..fa7492c913 100644 --- a/app/src/main/res/layout/home_slide_list.xml +++ b/app/src/main/res/layout/home_slide_list.xml @@ -7,11 +7,19 @@ android:background="@color/white" android:descendantFocusability="blocksDescendants"> + + Date: Wed, 18 Aug 2021 10:09:23 +0800 Subject: [PATCH 074/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E6=B5=8F=E8=A7=88=E5=99=A8=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96(1-3)https://git.g?= =?UTF-8?q?hzs.com/pm/halo-app-issues/-/issues/1323?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/common/util/DetailDownloadUtils.java | 27 ++++++++--- .../gamedetail/GameDetailFragment.kt | 43 ++++++++++++------ .../fragment/SwitchInstallMethodFragment.kt | 32 ++++++++----- .../ic_gamedetail_reserve.webp | Bin 2050 -> 778 bytes .../ic_gamedetail_reserved.webp | Bin 1260 -> 554 bytes .../ic_gamedetail_switch_install.webp | Bin 0 -> 636 bytes .../res/drawable/bg_browser_install_hint.xml | 13 ++++++ .../main/res/layout/detail_download_item.xml | 25 ++++++++-- app/src/main/res/values/strings.xml | 2 + 9 files changed, 105 insertions(+), 37 deletions(-) create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_gamedetail_switch_install.webp create mode 100644 app/src/main/res/drawable/bg_browser_install_hint.xml diff --git a/app/src/main/java/com/gh/common/util/DetailDownloadUtils.java b/app/src/main/java/com/gh/common/util/DetailDownloadUtils.java index 054c461e58..9b60dae37e 100644 --- a/app/src/main/java/com/gh/common/util/DetailDownloadUtils.java +++ b/app/src/main/java/com/gh/common/util/DetailDownloadUtils.java @@ -4,6 +4,7 @@ import android.text.TextUtils; import android.view.View; import com.gh.common.constant.Config; +import com.gh.common.constant.Constants; import com.gh.common.repository.ReservationRepository; import com.gh.common.simulator.SimulatorGameManager; import com.gh.common.view.DownloadProgressBar; @@ -133,7 +134,11 @@ public class DetailDownloadUtils { case downloading: case pause: case overflow: - viewHolder.mDownloadPb.setText(R.string.downloading); + if (SPUtils.getBoolean(Constants.SP_USE_BROWSER_TO_INSTALL)) { + viewHolder.mDownloadPb.setText(R.string.browser_install_downloading); + } else { + viewHolder.mDownloadPb.setText(R.string.downloading); + } if (downloadEntity.isPluggable() && PackagesManager.INSTANCE.isInstalled(downloadEntity.getPackageName())) { viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.DOWNLOADING_PLUGIN); } else { @@ -152,17 +157,25 @@ public class DetailDownloadUtils { } break; case done: - if (SimulatorGameManager.isSimulatorGame(viewHolder.gameEntity)){ + if (SimulatorGameManager.isSimulatorGame(viewHolder.gameEntity)) { boolean isInstalled = PackageUtils.isInstalledFromAllPackage(viewHolder.context, viewHolder.gameEntity.getSimulator().getApk().getPackageName()); - if (isInstalled){ + if (isInstalled) { viewHolder.mDownloadPb.setText(R.string.launch); viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.LAUNCH_OR_OPEN); - }else{ - viewHolder.mDownloadPb.setText(R.string.install); + } else { + if (SPUtils.getBoolean(Constants.SP_USE_BROWSER_TO_INSTALL)) { + viewHolder.mDownloadPb.setText(R.string.browser_install_install); + } else { + viewHolder.mDownloadPb.setText(R.string.install); + } viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.INSTALL_NORMAL); } - }else{ - viewHolder.mDownloadPb.setText(R.string.install); + } else { + if (SPUtils.getBoolean(Constants.SP_USE_BROWSER_TO_INSTALL)) { + viewHolder.mDownloadPb.setText(R.string.browser_install_install); + } else { + viewHolder.mDownloadPb.setText(R.string.install); + } if (downloadEntity.isPluggable() && PackagesManager.isInstalled(downloadEntity.getPackageName())) { viewHolder.mDownloadPb.setDownloadType(DownloadProgressBar.DownloadType.INSTALL_PLUGIN); diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index 010955bf3f..db3d49a4b9 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -183,6 +183,9 @@ class GameDetailFragment : NormalFragment() { @BindView(R.id.closeIv) lateinit var mReserveGuideClose: View + @BindView(R.id.switch_btn) + lateinit var mSwitchBtn: TextView + @BindView(R.id.browser_install_hint_container) lateinit var mBrowserInstallContainer: View @@ -972,7 +975,7 @@ class GameDetailFragment : NormalFragment() { } } - @OnClick(R.id.reuse_no_connection, R.id.gamedetail_kaifu_hint, R.id.concern_btn, R.id.reserve_btn, R.id.closeIv, R.id.recommendCloseIv) + @OnClick(R.id.reuse_no_connection, R.id.gamedetail_kaifu_hint, R.id.concern_btn, R.id.reserve_btn, R.id.switch_btn, R.id.closeIv, R.id.recommendCloseIv) override fun onClick(v: View) { when (v.id) { R.id.reuse_no_connection -> { @@ -1037,6 +1040,14 @@ class GameDetailFragment : NormalFragment() { } } } + R.id.switch_btn -> { + val intent = ShellActivity.getIntent( + requireContext(), + ShellActivity.Type.SWITCH_INSTALL_METHOD, + null + ) + requireActivity().startActivity(intent) + } R.id.closeIv -> { showReserveGuide(false) } @@ -1186,30 +1197,32 @@ class GameDetailFragment : NormalFragment() { var closeHintText = "" if (manufacturer == "OPPO" || manufacturer == "VIVO") { - hintText = "${manufacturer}手机如何解决安装需要密码" - closeHintText = "关闭后将不再显示免密安装引导,您可以前往“ 我的光环-设置-切换安装方式”进行设置,或在“ 我的光环-帮助与反馈”查看相关问题" + hintText = if (SPUtils.getBoolean(Constants.SP_USE_BROWSER_TO_INSTALL)) "当前安装方式为[浏览器安装],点击切换安装方式" else "${manufacturer}手机如何解决安装需要密码" + closeHintText = "关闭后“切换安装方式”入口将显示在左下角,您也可以前往“我的光环-设置-切换安装方式”进行设置,或在“ 我的光环-帮助与反馈”查看相关问题" } else { - hintText = "手机如何解决无法安装问题" - closeHintText = "关闭后将不再显示切换安装方式引导,您可以前往“ 我的光环-设置-切换安装方式”进行设置" + hintText = if (SPUtils.getBoolean(Constants.SP_USE_BROWSER_TO_INSTALL)) "当前安装方式为[浏览器安装],点击切换安装方式" else "手机如何解决无法安装问题" + closeHintText = "关闭后“切换安装方式”入口将显示在左下角,您也可以前往“我的光环-设置-切换安装方式”进行设置" } mBrowserInstallHintTv.text = hintText mBrowserInstallCloseIv.setOnClickListener { DialogHelper.showDialog( - requireContext(), - "温馨提示", - closeHintText, - "确定", - "取消", - { - mBrowserInstallContainer.visibility = View.GONE - BrowserInstallHelper.hideGameDetailUseBrowserToInstallHint() - BrowserInstallHelper.logOrdinaryBrowserEvent(BrowserInstallHelper.Type.SWITCH_INSTALL_GUIDE_QUIT) - } + requireContext(), + "温馨提示", + closeHintText, + "确定", + "取消", + { + mBrowserInstallContainer.visibility = View.GONE + mSwitchBtn.visibility = View.VISIBLE + BrowserInstallHelper.hideGameDetailUseBrowserToInstallHint() + BrowserInstallHelper.logOrdinaryBrowserEvent(BrowserInstallHelper.Type.SWITCH_INSTALL_GUIDE_QUIT) + } ) } } else { mBrowserInstallContainer.visibility = View.GONE + mSwitchBtn.visibility = View.VISIBLE } } diff --git a/app/src/main/java/com/halo/assistant/fragment/SwitchInstallMethodFragment.kt b/app/src/main/java/com/halo/assistant/fragment/SwitchInstallMethodFragment.kt index a48639d98e..7e7b191c7a 100644 --- a/app/src/main/java/com/halo/assistant/fragment/SwitchInstallMethodFragment.kt +++ b/app/src/main/java/com/halo/assistant/fragment/SwitchInstallMethodFragment.kt @@ -1,7 +1,9 @@ package com.halo.assistant.fragment +import android.content.Intent import android.os.Build import android.os.Bundle +import android.provider.Settings import android.view.View import com.gh.common.constant.Constants import com.gh.common.util.SPUtils @@ -37,24 +39,31 @@ class SwitchInstallMethodFragment : NormalFragment() { val manufacturer = Build.MANUFACTURER.toUpperCase(Locale.CHINA) - val defaultHintText: String + var defaultHintText: CharSequence var browserHintText: CharSequence = "1.光环助手下载应用后,通过跳转默认浏览器安装已下载的应用(不会重复消耗流量),即可完成免密码安装\n2.内存较大的游戏在浏览器解压时间较长,需要等待片刻,您也可以通过浏览器的“下载记录”查看解压进度" if (manufacturer == "OPPO" || manufacturer == "VIVO") { - defaultHintText = "直接使用光环助手下载应用,但${manufacturer}手机自身安全性检测,下载后需要进行验证账户密码、指纹等解锁后安装" + val clickText : CharSequence = "前往手机设置-指纹、面部与密码>" + val endText = if (manufacturer == "OPPO") " 设置锁屏密码,再点击[添加指纹]录入指纹,将指纹用于[安装验证];或者点击[添加面部]录入面部,将面部用于[安装验证],即可实现快速安装" else "开启锁屏密码,再点击[添加指纹]录入指纹,将指纹用于[解锁],即可实现快速安装" + defaultHintText = "1.直接使用光环助手下载应用,但${manufacturer}手机自身安全性检测,下载后需要进行验证账户密码、指纹等解锁后安装\n2.您可以 $clickText$endText" + defaultHintText = SpanBuilder(defaultHintText) + .click(defaultHintText.length - clickText.length - endText.length, defaultHintText.length - endText.length, R.color.theme_font, true) { + requireContext().startActivity(Intent(Settings.ACTION_SETTINGS)) + } + .build() val clickableText: CharSequence = "可查看使用教程>" - browserHintText = "$browserHintText\n以上未能解决安装需要密码的,$clickableText" + browserHintText = "$browserHintText\n\n以上未能解决安装需要密码的,$clickableText" browserHintText = SpanBuilder(browserHintText) - .click(browserHintText.length - clickableText.length, browserHintText.length, R.color.theme_font, true) { - val url = if (manufacturer == "OPPO") { - "https://static-web.ghzs.com/ghzs_help/help.html?content=5fa90fe143d91a022e0d33ff" - } else { - "https://static-web.ghzs.com/ghzs_help/help.html?content=5fc05a0033b5f008e04cdc4b" - } - requireContext().startActivity(WebActivity.getIntent(requireContext(), url, "安装问题", false, 1)) + .click(browserHintText.length - clickableText.length, browserHintText.length, R.color.theme_font, true) { + val url = if (manufacturer == "OPPO") { + "https://static-web.ghzs.com/ghzs_help/help.html?content=5fa90fe143d91a022e0d33ff" + } else { + "https://static-web.ghzs.com/ghzs_help/help.html?content=5fc05a0033b5f008e04cdc4b" } - .build() + requireContext().startActivity(WebActivity.getIntent(requireContext(), url, "安装问题", false, 1)) + } + .build() } else { defaultHintText = "直接使用光环助手下载应用,但部分手机可能存在无法安装的问题" } @@ -62,6 +71,7 @@ class SwitchInstallMethodFragment : NormalFragment() { mBinding?.defaultHintTv?.text = defaultHintText mBinding?.browserHintTv?.text = browserHintText mBinding?.browserHintTv?.movementMethod = CustomLinkMovementMethod.getInstance() + mBinding?.defaultHintTv?.movementMethod = CustomLinkMovementMethod.getInstance() } private fun changeSwitch(useBrowserToInstall: Boolean) { diff --git a/app/src/main/res/drawable-xxhdpi/ic_gamedetail_reserve.webp b/app/src/main/res/drawable-xxhdpi/ic_gamedetail_reserve.webp index 66467b64eb3fb61b1492867211711fff2a05f58a..2ed31eefde5e3c5f162384f0a23581272fcbaa30 100644 GIT binary patch literal 778 zcmV+l1NHn;Nk&Ej0{{S5MM6+kP&iEW0ssInN5ByfKf)lAq()8juMQDN2>%2X^UtPj zBtf2QkKgm}AH#nbN0P1N$^RdBmrOX37BO>ke+k$_9%^v+{=?sVe$HE*@=zshm z$G*-9iy!%WDD7K(-#NW+GH53*_N7TR zN~hi)ie6(36Scm3$Dx%))7qPe;2;2M{t_7F=@zxfy* zQK<>S=cE*=LwE$o_?#piAUp$5CO7^&M@*^7EQs5$)uGA~I*jMwZc38&0UT5HkV6xi zQ-t&;NkA-fOp*{Mjgs_6MCpU1ON0kDMoACQX`dvmB0RW7N$Nv*7A0Y>h?{ZpMTF;F z(hU@exP==@5#ia9bdKOSjOUU9f^#Bi8^Uzhc3p}H&b_1!2-DaM1QaCQBREY-%Mhlq z$CVENDAc7U!r8Hx1W`}Nq^tSjQV>9MoN(1Hx|k^9K~EfykkiMRgU#Vw8uQ30LWzHf zWY<#5SWz-VKjiR#qmlL7j@{+OG4B74c+6<@u;_0);xUsSJeu8G`^=-j^8=i(9CG9< zG=Dne$e(CFcgT^?!TREmtG;0M&LLO5E4Tj6)Fns#wXS&G&l2SA2l#dRlP}aSeVzV| z*?!W~GnLg(GSlC-tM6~w{bl-XewqHC{5tapf%zy@H6M{*W?mz|&iqJznR(X8%-1Km I^Yy<{0G}3xL;wH) literal 2050 zcmV+d2>tg`Nk&Hc2LJ$9MM6+kP&il$0000G0000-002h-06|PpNX`NP00D2~ux%Sj zTH2YJy|4d*_lk&!y!t{5)SqME@PQjigAOWvt!3rh9_q2>LvXRp5zv$Or>p<>MsWiuxqeW!gq$;vcw8t#0sB4XB{ ziBj|6n-%jdi<%q@Z*s_ecYbhpD~o#mE{Bvi3nn4Tj=06uW=}3TJ)2kDA|`W>#!FY^ z`_*Q@q~`2B4wsE4oWU24!f$)R*B|$AWW5+Pp-g^t^c^=FG0o8t_I1L9(eC`peyy1x z;xB*??IwikrvRU(OdwNO;Au2+icc-@y4wUpw7_YAf9_e}`>06(zFT0=Na_Cxu%w9) z0kVFTQFvj2dzuhf;388IGZuJKViKa{2|#8f6kG#Lo5Yv~$O?>rNei5-gwDgPQzb+I zkry~oVMGO#zp`Xe1&mnWNFb-`i+DZ+kf{J?_NB_N#yNV$NEic9BVh%Q9Q+8NO(g_a zn+2j@%@g3U5fNbe*uoR9mXcq#yFm2*&g%f?jD#SYvp}6sO9z0=PlGH1WIio@ z0QD*%$TEQF(=rTDp&}eRZZZ-oEHLcT;&?@oiWsoJ`MfU4aYcaF^MWR&FPwqrvtB{Y z#P4Ato3;H`BIT^tCrGq8=rq;B`IqkS(^m<|P7CwHL~BW<43zDfR+;r zyv-dig?=RPYXRdo_Q#?}$zz#RL7Wj#(B=F7PMmqDJ_6!i0MfV@5QhU0$6;|^2tb|} zbb^Fu@;sHIyqTUno}#)UJ#~(zr|wEo9hjcFRMS%@YkKN-O-~=8>FH}Ucb~P9yU!x& zK1($k33#=p11Ivfli}y$OAKC+`1ONXKANI`=pI0)RVI`0wfs((74&o0of5dn<{Cm)U z(9`vQ`Jdr@(|$?)|NkHOFMu!PpV568y;1(&dkp@lx1)5CPcEex|GqAOs@v>3UW+Qi z>AY4!4-HUzjU)g%W*nhgFN_IxL|*rRC;+m*OoxKbZm;9rEF ztOLa%N#>Tjp#jr`0092|ZdibqQ`~4)6MCM&0`4fH{r6~+m7~%1;0+E-TmQV)Cg9Nn z+P&SNN^6-wEYU08zuKj`aa64>-*2bpH87oAg;+?%?zTY=AAgt`>vI9K2w(u?7SlZC zS>E1sg8fznc|1^p9>z(FY)2=`{lsA}N<3piehwB*wGI~PaXKfRW0GY=d8`8AOa=M) zp#Q+3?BU)bM~t|;?$_;)%Jj6Jh82Uev+rm-=!y} zf97(lQn`2qDw`+f-w!v9bj7y+4PyuSM^~* zqJv6SttbE|tzT<7>&>>gD2Yhkler~xhRd*X!JBOlv?(;)KQ7@N?XXPDmD_7?%9PWS z7^SXEl=}T1Jea*#?6rL?kxiB84WpKT@NkOLue$Cd-S*SrQ$j{J!HKI9oaU~UTrs_ZK5V`9g|SzW0r87sDl$?#ehonxTzT<2|NP9m)xRQrx_}R zc=z-$t^QqDSdV_gd6y1DBh2lQ4=>n5^X8=C#|Ak!LOl4R&qhL!%Kmw%5AJxZyjoz8 z1HltQzPj0f;KdlOTe~BUix5Vt-XP|I`JM%qMaDT5?)J9m^#m@%=7Nv8& z5pxZyud#p1&Cn2XmnF=(Sp)q#o(HRAFvMZF8c~~;N~@V+oLRNRXkjOTD8q5361o=; zXGExVH`tf_l6v}#!;=3I4k??M@8D{@=KVa+w&FFbBsO$Y?!TLX<7<1ZE}g7!0Pd%< zj=fOQAsPWq-xYAiYHdwBy_I51$m4xB|J@qZ7wtzenlfJ>_`lWEScA2l-8tHEIu|bA g?WrXca5gzRZIGQAGBqiZWpMT5M`ykE2lM~{0Nse|ng9R* diff --git a/app/src/main/res/drawable-xxhdpi/ic_gamedetail_reserved.webp b/app/src/main/res/drawable-xxhdpi/ic_gamedetail_reserved.webp index 70571006747eb944f4b29ecf5f1702cba616ef49..03fe4ab86a2f541c651d0dd2090eac7976188e4a 100644 GIT binary patch literal 554 zcmV+_0@eLeNk&E@0ssJ4MM6+kP&iB#0ssInN5Byfx51!o8$s^#XZ*T_2E(>(!!Y~* z9srpS6LR@h+eW5F)@+sT8+Uxkb4}+)gEk_r8|*PNh;* zZl@(EHxK=hjxPH-+xXMVrm{K*3Y;JREOzppdaCf>343dK=PcL>{_o%WFEc=LBuSCf zxV$^eP&EuaO#lBIbrdY!A|v|m$ZaD>lBUC?UEika3&HQ~Y4gxS;Lc3txCmT%RJl6a zNDhy3KX%s2qM9bm zlvQakc4Aq=Bb?ZVA<7!g*%CO=8ePX|%0j{dnrIwiY|)Udge1J(V$9KujVlc_(;OP% zzy*U4VXs^udxVu6RtT9JGK8rcrU*kf3=y;$RXCJJ=$nxiyI`okP1;w;=ZZBnjFfH< zzSfaU8exbdwU@ii2k_DeVQPR#`RVp}&kqFsP-cX5zS5gN%g>V`tjrK;zG2e}VQ-2^ z^|R2)&$34d2g-pA5ja;4oD*`Z97v3CtgJgG2G`aH{Jrz&`|D3VK!55JkLo3V>NomR sPtu?Ima#YWHod9;Nq_ng`qLkg-t=pvKm8+#_p@%i>92K;K$-tI= zu94Z%gIxx}l`r(-QbtgX7d?5^5lrDuZ|(&IkvP$#Qv&WHYkIW~@cA6kvk_dCzUbLk z32wq$dbbV3Ns9_va1q*5!9L_Lpg|Q*pMoV-EFFgUlPaEZIV~z_$(d8hT+We7j^Yse zrjqZNlp@s>r8KFgDWyv_T`7I4=}Q?>%}|Qss3*nDYCDJ7dEXlP9O-?o58|NrJu?#r zJKuYTzK8AnE}%{ob%(*w@1~vKaYJ>5ojM10>Mlcdpq;uDcIsr%A7?)if1Q3ye}MNT^Kbfpa3A77#Q(VeJpI!D1ONa3|1ihsl1Z{W zPLa$F?c7-%&+!TN_}`bjJDQXnWpGb4mG|qR^(8?dX5XJol6g8RR@s{jm^v4HxLpee z^9KZiP|NivP|Kc3=@8NOzMZX>l&04#=SCzWlbbeWIAO!MK^l3lo&z*r=`C=oV|DXN~dxy!)|KGjH{VHO)F>-JAWCJJ>LDn7Q zfoa%k_8Sk0cUmJjOLUT3L;GggQlh_XZ2p;Zpzcl`*+e0jdXNpx= z1xSXrTh6?y8~XKz$Uu6V6E>YxeIENARRS}+*=>2Op=9ByeCU8|xRyrrgC`&SXV!%t z%43GoUBYy=A01Ero}OJ*E2Clr-j!y+;1Pz1~Zv`p=_*WcQYR=xdb3j@Pev3ljuLV)E2D;y0+}yM#r% z=dd$^4z7bK)|B-3hWGuMmutMt_0RwMQ8Dg_6GU(x3Uy5Pc;|OH=CSjT&;R5|Sk=>?>rU;qFPQ+#Rw diff --git a/app/src/main/res/drawable-xxxhdpi/ic_gamedetail_switch_install.webp b/app/src/main/res/drawable-xxxhdpi/ic_gamedetail_switch_install.webp new file mode 100644 index 0000000000000000000000000000000000000000..5bf37120b37de4558454930c73a00566f1657af6 GIT binary patch literal 636 zcmV-?0)zchNk&F=0ssJ4MM6+kP&iCy0ssInU%(d-m%^xxBuD1YZIRqB=PMeF+DLL_ z{@fPH{c^ry)JBpc^XIlm?w9iw+sJmDpf9}lAsO}1e+!peK)OIy@fZWkvZQI6ux%Ue z`^I%$^1d(Tc`okzZmPc;Dt+IV&{VckRMl8j|Nkdc82|szVX7Ob2n%ZT6{A1}f`LF0 z;Gh-bLIHp=phAHYga!m)1WgiGna;z^5wMPl zTj|X;FuzWbR|RrdVf6`eSumQs%*V|no6-TGwGSg@!!Q-GhG@IQgNAK9M0Aw==WX%VK0%(1D`#4u0Dep!UaFiVK8mYH~(wJ?JZi0;pgv#`EOkhw6rf{|9e zeJ-TUo=MIG>N}uQ^%U!XXU>Guu~PV*arZENigaF literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/bg_browser_install_hint.xml b/app/src/main/res/drawable/bg_browser_install_hint.xml new file mode 100644 index 0000000000..991a3e85f0 --- /dev/null +++ b/app/src/main/res/drawable/bg_browser_install_hint.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/detail_download_item.xml b/app/src/main/res/layout/detail_download_item.xml index 7e3da5b63e..1d8c7af8df 100644 --- a/app/src/main/res/layout/detail_download_item.xml +++ b/app/src/main/res/layout/detail_download_item.xml @@ -24,14 +24,14 @@ android:id="@+id/browser_install_hint_container" android:layout_width="match_parent" android:layout_height="40dp" - android:background="@color/bg_FFF6E6" + android:background="@drawable/bg_browser_install_hint" android:visibility="gone" tools:visibility="visible"> @@ -44,6 +44,8 @@ android:layout_marginLeft="8dp" android:layout_toRightOf="@id/browser_install_hint_iv" android:textColor="@color/text_F9A755" + android:textSize="12sp" + app:lineHeight="12dp" tools:text="VIVO手机如何解决安装需要密码" /> + + 试玩 展开 > 解压中 + 下载后前往浏览器解压安装 + 浏览器解压安装 已淘号:%1$s]]> 已领取:%1$s]]> From 783cb95f2436fd6cdaf21a6ece56c7f1f761de5f Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Wed, 18 Aug 2021 11:04:14 +0800 Subject: [PATCH 075/151] =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E7=89=88=E4=B8=BB?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E8=A7=86=E9=A2=91=E8=AF=84=E8=AE=BA=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/util/CommentHelper.kt | 4 ++-- .../gamecenter/forum/detail/ForumArticleAskListAdapter.kt | 2 +- .../forum/home/ForumArticleAskItemViewHolder.kt | 3 ++- .../gh/gamecenter/forum/home/ForumArticleListAdapter.kt | 2 +- .../forum/search/ForumContentSearchListAdapter.kt | 6 +++--- .../gamecenter/personalhome/home/UserHistoryFragment.kt | 2 +- .../qa/answer/BaseAnswerOrArticleItemViewHolder.kt | 6 ++++-- .../gh/gamecenter/qa/comment/base/BaseCommentViewModel.kt | 6 +++++- .../qa/video/detail/ForumVideoDetailActivity.kt | 7 ++++--- .../qa/video/detail/ForumVideoDetailFragment.kt | 5 ++++- .../qa/video/detail/comment/VideoCommentFragment.kt | 4 +++- .../qa/video/detail/comment/VideoCommentViewModel.kt | 8 +++++--- .../gamecenter/qa/video/detail/desc/VideoDescAdapter.kt | 2 +- .../com/gh/gamecenter/retrofit/service/ApiService.java | 6 ++++++ 14 files changed, 42 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/CommentHelper.kt b/app/src/main/java/com/gh/common/util/CommentHelper.kt index 07e2324be2..72a89a2d7c 100644 --- a/app/src/main/java/com/gh/common/util/CommentHelper.kt +++ b/app/src/main/java/com/gh/common/util/CommentHelper.kt @@ -144,7 +144,7 @@ object CommentHelper { dialogOptions.add("删除评论") } - commentEntity.me?.let { + /*commentEntity.me?.let { if (ignoreModerator) return@let if (it.isModerator || (it.moderatorPermissions.hideAnswerComment > Permissions.GUEST @@ -154,7 +154,7 @@ object CommentHelper { ) { dialogOptions.add("管理") } - } + }*/ if (commentEntity.parentUser != null && showConversation) { dialogOptions.add("查看对话") diff --git a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListAdapter.kt index e4f3f61b7c..50e7e47111 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListAdapter.kt @@ -100,7 +100,7 @@ class ForumArticleAskListAdapter(context: Context, val bbsId: String, val mEntra "video" -> { NewLogUtils.logForumDetailFeedContentClick("click_forum_detail_content", userId, contentId, "视频帖", sequence, bbsId, bbsType, tabInfo) MtaHelper.onEvent(holder.getEventId(entrance), holder.getKey(entrance), "${answer.articleTitle}(${answer.id})") - mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, answer.id ?:"")) + mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, answer.id ?:"", bbsId)) } "question" -> { NewLogUtils.logForumDetailFeedContentClick("click_forum_detail_content", userId, contentId, "提问帖", sequence, bbsId, bbsType, tabInfo) 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 5dd3bfe4c1..257b29932f 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 @@ -287,8 +287,9 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B MtaHelper.onEvent(getEventId(entrance), getKey(entrance), "评论图标") } "video" -> { + val communityId = if (entity.bbs.id.isNotEmpty()) entity.bbs.id else UserManager.getInstance().community.id itemView.context.startActivity(ForumVideoDetailActivity.getIntent(itemView.context, entity.id - ?: "",true)) + ?: "",communityId, true)) } "question" -> { if (entity.questions.answerCount == 0) { diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListAdapter.kt index 9db55aa20f..84e1bd38bf 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListAdapter.kt @@ -124,7 +124,7 @@ class ForumArticleListAdapter(context: Context, } "video" -> { MtaHelper.onEvent("论坛首页", viewHolder.getKey(BaseActivity.mergeEntranceAndPath(mEntrance, path)), "${articleEntity.title}(${articleEntity.id})") - mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, articleEntity.id ?:"")) + mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, articleEntity.id ?:"", articleEntity.community.id)) } "question" -> { MtaHelper.onEvent("论坛首页", viewHolder.getKey(BaseActivity.mergeEntranceAndPath(mEntrance, path)), "${articleEntity.title}(${articleEntity.id})") diff --git a/app/src/main/java/com/gh/gamecenter/forum/search/ForumContentSearchListAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/search/ForumContentSearchListAdapter.kt index 15f2a99d2e..0c28930e73 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/search/ForumContentSearchListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/search/ForumContentSearchListAdapter.kt @@ -111,7 +111,7 @@ class ForumContentSearchListAdapter(context: Context, val mListViewModel: ForumC "video" -> { NewLogUtils.logForumSearchResultClick("内容tab", answer.bbs.id, bbsType, answer.id ?: "", "视频帖", answer.user.id ?: "", position + 1) MtaHelper.onEvent(holder.getEventId(entrance), holder.getKey(entrance), "${answer.articleTitle}(${answer.id})") - mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, answer.id ?:"")) + mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, answer.id ?:"", answer.bbs.id)) } else -> { NewLogUtils.logForumSearchResultClick("内容tab", answer.bbs.id, bbsType, answer.id ?: "", "提问帖", answer.user.id ?: "", position + 1) @@ -150,7 +150,7 @@ class ForumContentSearchListAdapter(context: Context, val mListViewModel: ForumC val answerViewHolder = ForumArticleAskItemViewHolder(includedAnswerItem) answerViewHolder.bindForumAnswerItem(answer, mEntrance, "") answerViewHolder.itemView.setOnClickListener { - mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, answer.id ?:"")) + mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, answer.id ?:"", answer.bbs.id)) } } } else { @@ -194,7 +194,7 @@ class ForumContentSearchListAdapter(context: Context, val mListViewModel: ForumC } "video" -> { NewLogUtils.logForumSearchResultClick("", answer.bbs.id, bbsType, answer.id ?: "", "视频帖", answer.user.id ?: "", position + 1) - mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, answer.id ?:"")) + mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, answer.id ?:"", answer.bbs.id)) } else -> { NewLogUtils.logForumSearchResultClick("", answer.bbs.id, bbsType, answer.id ?: "", "提问帖", answer.user.id ?: "", position + 1) diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryFragment.kt b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryFragment.kt index 72852e013e..0eb76b96e9 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryFragment.kt @@ -208,7 +208,7 @@ class UserHistoryFragment : ListFragment { + val communityId = if (!entity.communityId.isNullOrEmpty()) entity.communityId + ?: "" else entity.bbs.id itemView.context.startActivity(ForumVideoDetailActivity.getIntent(itemView.context, entity.id - ?: "", true)) + ?: "", communityId, true)) } "answer" -> { val intent = CommentActivity.getAnswerCommentIntent(itemView.context, @@ -167,7 +169,7 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH itemView.context.startActivity(intent) } "video" -> { - itemView.context.startActivity(ForumVideoDetailActivity.getIntent(itemView.context, entity.id, true)) + itemView.context.startActivity(ForumVideoDetailActivity.getIntent(itemView.context, entity.id, entity.community.id, true)) } else -> { val communityId = if (entity.community.id.isNotEmpty()) entity.community.id diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentViewModel.kt index 7283ce0748..a50560f7eb 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/base/BaseCommentViewModel.kt @@ -202,7 +202,11 @@ abstract class BaseCommentViewModel( fun deleteComment(entity: CommentEntity, callback: () -> Unit) { val observable = when { videoId.isNotEmpty() -> { - mApi.deleteVideoComment(videoId, entity.id).toObservable() + if (entity.me?.isModerator == true) { + mApi.moderatorsHideVideoComment(communityId, videoId, entity.id).toObservable() + } else { + mApi.deleteVideoComment(videoId, entity.id).toObservable() + } } questionId.isNotEmpty() -> { mApi.deleteQuestionComment(questionId, entity.id).toObservable() diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailActivity.kt index f82c1b6f03..3bb98439f0 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailActivity.kt @@ -39,13 +39,14 @@ class ForumVideoDetailActivity : BaseActivity() { companion object { const val VIDEO_PATCH_REQUEST = 100 - fun getIntent(context: Context, videoId: String): Intent { - return getIntent(context, videoId, false) + fun getIntent(context: Context, videoId: String, bbsId: String): Intent { + return getIntent(context, videoId, bbsId, false) } - fun getIntent(context: Context, videoId: String, scrollToComment: Boolean = false): Intent { + fun getIntent(context: Context, videoId: String, bbsId: String, scrollToComment: Boolean = false): Intent { val intent = Intent(context, ForumVideoDetailActivity::class.java) intent.putExtra(EntranceUtils.KEY_VIDEO_ID, videoId) + intent.putExtra(EntranceUtils.KEY_BBS_ID, bbsId) if (scrollToComment) { intent.putExtra(PAGE_INDEX, 1) } diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt index 0b96bcfd25..cc8e787270 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt @@ -68,6 +68,7 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { private var mMoreMenuItem: MenuItem? = null private var mForumVideoEntity: ForumVideoEntity? = null private var mVideoId = "" + private var mBbsId = "" private var mVideoDescFragment: VideoDescFragment? = null private var mVideoCommentFragment: VideoCommentFragment? = null private var mIsPortrait = false @@ -97,7 +98,8 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { mVideoDescFragment = this }) fragments.add(VideoCommentFragment().apply { - arguments = bundleOf(EntranceUtils.KEY_VIDEO_ID to mVideoId) + arguments = + bundleOf(EntranceUtils.KEY_VIDEO_ID to mVideoId, EntranceUtils.KEY_BBS_ID to mBbsId) mVideoCommentFragment = this }) } @@ -109,6 +111,7 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { override fun onCreate(savedInstanceState: Bundle?) { mVideoId = arguments?.getString(EntranceUtils.KEY_VIDEO_ID) ?: "" + mBbsId = arguments?.getString(EntranceUtils.KEY_BBS_ID) ?: "" super.onCreate(savedInstanceState) NewLogUtils.logVideoDetailClick("view_video_detail") } diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentFragment.kt index c99fe9b1ef..e2d58a6bc0 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentFragment.kt @@ -30,6 +30,7 @@ class VideoCommentFragment : LazyListFragment { return mAdapter ?: VideoCommentAdapter(requireContext(), mListViewModel, mEntrance).apply { @@ -49,7 +50,7 @@ class VideoCommentFragment : LazyListFragment() @@ -42,9 +43,10 @@ class VideoCommentViewModel(application: Application, videoId: String) : BaseCom deleteCommentLiveData.postValue(true) } - class Factory(private val videoId: String) : ViewModelProvider.NewInstanceFactory() { + class Factory(private val videoId: String, private val bbsId: String) : + ViewModelProvider.NewInstanceFactory() { override fun create(modelClass: Class): T { - return VideoCommentViewModel(HaloApp.getInstance().application, videoId) as T + return VideoCommentViewModel(HaloApp.getInstance().application, videoId, bbsId) as T } } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescAdapter.kt index 0e2a9db2b1..9c15e1a682 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescAdapter.kt @@ -83,7 +83,7 @@ class VideoDescAdapter(context: Context, val mVideoDetailViewModel: ForumVideoDe holder.binding.video = recommendVideo holder.binding.root.setOnClickListener { recommendVideo?.let { - mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, it.id)) + mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, it.id,it.bbs?.id ?: "")) } val bbsType = if (mViewModel.topVideoDetail?.bbs?.type == "game_bbs") "游戏论坛" else "综合论坛" NewLogUtils.logVideoDetailClick("click_video_detail_for_you_video", 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 b8061e8ce6..231fe58f03 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 @@ -2605,6 +2605,12 @@ public interface ApiService { @POST("videos/{video_id}/comments/{comment_id}:inactivate") Single deleteVideoComment(@Path("video_id") String videoId, @Path("comment_id") String commentId); + /** + * 版主删除视频评论 + */ + @POST("communities/{community_id}/videos/{video_id}/comments/{comment_id}:hide") + Single moderatorsHideVideoComment(@Path("community_id") String communityId, @Path("video_id") String videoId, @Path("comment_id") String commentId); + /** * 获取已经预约成功的手机号码 */ From 812eb842e234286b9de4e310819684159c81453f Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Wed, 18 Aug 2021 14:43:51 +0800 Subject: [PATCH 076/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E9=AA=8C=E6=94=B6=E9=97=AE=E9=A2=98(12)=20https://git?= =?UTF-8?q?.ghzs.com/pm/halo-app-issues/-/issues/1442?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt | 4 +++- .../gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt index d119cee9d7..0408251612 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt @@ -498,7 +498,7 @@ class ArticleDetailFragment : BaseCommentFragment Date: Wed, 18 Aug 2021 17:36:20 +0800 Subject: [PATCH 077/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA3=E6=9C=9F-?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E5=B1=95=E7=A4=BA-=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E4=B8=BE=E6=8A=A5=E5=BC=B9=E7=AA=97=20https://git.ghzs.com/pm/?= =?UTF-8?q?halo-app-issues/-/issues/1421?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/constant/Constants.java | 2 +- .../com/gh/common/util/BbsReportHelper.kt | 157 +++++------ .../java/com/gh/common/util/DialogUtils.java | 47 ++-- .../java/com/gh/common/util/ErrorHelper.kt | 2 + .../com/gh/common/util/SimpleRequestHelper.kt | 9 +- .../gamecenter/adapter/ReportReasonAdapter.kt | 44 +++ .../gamedetail/desc/DescCommentsAdapter.kt | 8 +- .../rating/RatingCommentItemViewHolder.kt | 9 +- .../gamedetail/rating/RatingReplyAdapter.kt | 8 +- .../personalhome/UserHomeFragment.kt | 263 +++++++++++++----- .../personalhome/UserHomeViewModel.kt | 18 +- .../main/res/layout/dialog_report_reason.xml | 14 +- .../main/res/layout/item_report_reason.xml | 23 ++ 13 files changed, 397 insertions(+), 207 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/adapter/ReportReasonAdapter.kt create mode 100644 app/src/main/res/layout/item_report_reason.xml 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 51e028c783..fe82cf3855 100644 --- a/app/src/main/java/com/gh/common/constant/Constants.java +++ b/app/src/main/java/com/gh/common/constant/Constants.java @@ -347,7 +347,7 @@ public class Constants { //已收录包名更新 cd间隔 public static final int PACKAGES_CD = 60 * 1000; - public static final String[] REPORT_LIST = new String[]{"垃圾广告营销", "恶意攻击谩骂", "淫秽色情信息", "违法有害信息", "其它"}; + public static final String[] REPORT_LIST = new String[]{"垃圾广告营销", "恶意攻击谩骂", "淫秽色情信息", "违法有害信息", "其他原因"}; public static final String ENTRANCE_UNKNOWN = "(unknown)"; diff --git a/app/src/main/java/com/gh/common/util/BbsReportHelper.kt b/app/src/main/java/com/gh/common/util/BbsReportHelper.kt index 7e03c524a4..633d258e7e 100644 --- a/app/src/main/java/com/gh/common/util/BbsReportHelper.kt +++ b/app/src/main/java/com/gh/common/util/BbsReportHelper.kt @@ -2,133 +2,124 @@ package com.gh.common.util import android.annotation.SuppressLint import android.app.Dialog -import android.content.Context -import android.graphics.Color -import android.graphics.drawable.ColorDrawable import android.preference.PreferenceManager +import android.text.TextUtils import android.view.LayoutInflater import android.view.View import android.view.Window -import android.widget.EditText -import android.widget.LinearLayout -import android.widget.TextView -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.core.content.ContextCompat +import androidx.core.widget.doOnTextChanged +import androidx.recyclerview.widget.LinearLayoutManager import com.gh.base.CurrentActivityHolder import com.gh.common.json.json -import com.gh.common.util.ToastUtils.showToast +import com.gh.common.view.VerticalItemDecoration import com.gh.gamecenter.R import com.gh.gamecenter.SuggestionActivity +import com.gh.gamecenter.adapter.ReportReasonAdapter +import com.gh.gamecenter.databinding.DialogReportReasonBinding import com.gh.gamecenter.entity.SettingsEntity import com.gh.gamecenter.retrofit.BiResponse import com.gh.gamecenter.retrofit.RetrofitManager import com.halo.assistant.HaloApp -import com.lightgame.utils.Util_System_Keyboard -import com.lightgame.utils.Utils import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import okhttp3.ResponseBody import org.json.JSONObject +import retrofit2.HttpException object BbsReportHelper { fun showReportDialog(contentId: String) { val sp = PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance()) - val suggestion: SettingsEntity.Suggestion? = sp.getString(SuggestionActivity.SUGGESTION_HINT_TYPE, null)?.toObject() + val suggestion: SettingsEntity.Suggestion? = + sp.getString(SuggestionActivity.SUGGESTION_HINT_TYPE, null)?.toObject() val reportList = suggestion?.report ?: return CurrentActivityHolder.getCurrentActivity()?.apply { if (this.isFinishing) return@apply - val dialog = Dialog(this) + val dialog = Dialog(this, R.style.DialogWindowTransparent) + val binding: DialogReportReasonBinding = + DialogReportReasonBinding.inflate(LayoutInflater.from(this)) + val reportReasonAdapter = ReportReasonAdapter( + this, reportList as ArrayList + ) { reason -> + if (reason == "其他原因") { + binding.reasonTitle.setText(R.string.report_reason_other_title) + binding.normalReasonContainer.visibility = View.GONE + binding.otherReasonContainer.visibility = View.VISIBLE + } else { + postReport(contentId, json { + "reason" to reason + }) + dialog.cancel() + } + } + binding.reasonRv.layoutManager = LinearLayoutManager(this) + binding.reasonRv.addItemDecoration( + VerticalItemDecoration( + this, + 1f, + false, + R.color.text_f5f5f5 + ) + ) + binding.reasonRv.adapter = reportReasonAdapter - val view = LayoutInflater.from(this).inflate(R.layout.dialog_video_complaint, null, false) - val complaintContainer = view.findViewById(R.id.complaintContainer) - val otherComplaintContainer: ConstraintLayout = view.findViewById(R.id.otherComplaintContainer) - val complaintCommentEt = view.findViewById(R.id.complaintCommentEt) - val backTv = view.findViewById(R.id.backTv) - val commitTv = view.findViewById(R.id.commitTv) - val finalContext: Context = this - //添加透明阴影,实现类似 clipPadding=false 效果 - complaintCommentEt.setShadowLayer(complaintCommentEt.extendedPaddingBottom.toFloat(), 0f, 0f, Color.TRANSPARENT) - - complaintCommentEt.setTextChangedListener { s: CharSequence, _: Int?, _: Int?, _: Int? -> - commitTv.setTextColor(ContextCompat.getColor(finalContext, if (s.toString().trim { it <= ' ' }.isEmpty()) R.color.text_999999 else R.color.theme_font)) + binding.negativeBtn.setOnClickListener { v -> + binding.reasonTitle.setText(R.string.report_reason_title) + binding.normalReasonContainer.visibility = View.VISIBLE + binding.otherReasonContainer.visibility = View.GONE } - for (option in reportList) { - val reportTv = TextView(this) - reportTv.text = option - reportTv.textSize = 16F - reportTv.setTextColor(R.color.title.toColor()) - reportTv.setBackgroundResource(R.drawable.textview_white_style) - reportTv.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, - LinearLayout.LayoutParams.WRAP_CONTENT) - reportTv.setPadding(20F.dip2px(), 17F.dip2px(), 20F.dip2px(), 17F.dip2px()) - if (option.contains("其它")) { - val drawable = R.drawable.ic_complaint_arrow_right.toDrawable() - drawable!!.setBounds(0, 0, 6F.dip2px(), 10F.dip2px()) - reportTv.setCompoundDrawables(null, null, drawable, null) - } - complaintContainer.addView(reportTv) - reportTv.setOnClickListener { - if (option.contains("其它")) { - complaintContainer.visibility = View.GONE - otherComplaintContainer.visibility = View.VISIBLE - complaintCommentEt.requestFocus() - Util_System_Keyboard.showSoftKeyboard(finalContext, complaintCommentEt) - } else { - postReport(contentId, json { - "reason" to reportTv.text.toString() - }) - dialog.cancel() - } + binding.positiveBtn.setOnClickListener { v -> + if (TextUtils.isEmpty( + binding.otherReasonEt.text.toString().trim() + ) + ) { + ToastUtils.showToast("请填写举报原因") + } else { + postReport(contentId, json { + "reason" to "其它" + "description" to binding.otherReasonEt.text.toString() + }) + + dialog.cancel() } } - backTv.setOnClickListener { - Util_System_Keyboard.hideSoftKeyboard(finalContext, complaintCommentEt) - complaintContainer.visibility = View.VISIBLE - otherComplaintContainer.visibility = View.GONE - } - commitTv.setOnClickListener { - if (complaintCommentEt.text.toString().isEmpty()) { - showToast("请先输入说明~") - return@setOnClickListener + binding.otherReasonEt.doOnTextChanged { text, start, before, count -> + val tvCount: Int = text.toString().length + if (tvCount >= 500) { + binding.tvCount.setTextColor(R.color.text_FF4147.toColor()) } - postReport(contentId, json { - "reason" to "其它" - "description" to complaintCommentEt.text.toString() - }) - - dialog.cancel() + binding.tvCount.text = "$tvCount/500" } dialog.requestWindowFeature(Window.FEATURE_NO_TITLE) - dialog.setContentView(view) + dialog.setContentView(binding.root) dialog.show() - val window = dialog.window - if (window != null) { - window.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) - val params = window.attributes - params.width = resources.displayMetrics.widthPixels - 40F.dip2px() - window.attributes = params - } } } @SuppressLint("CheckResult") private fun postReport(contentId: String, reportContent: JSONObject) { RetrofitManager.getInstance(HaloApp.getInstance()) - .api - .postBbsReport(contentId, reportContent.toRequestBody()) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : BiResponse() { - override fun onSuccess(data: ResponseBody) { - Utils.toast(HaloApp.getInstance(), "举报成功") + .api + .postBbsReport(contentId, reportContent.toRequestBody()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: ResponseBody) { + ToastUtils.toast("举报成功") + } + + override fun onFailure(exception: Exception) { + super.onFailure(exception) + if (exception is HttpException) { + ErrorHelper.handleError(HaloApp.getInstance().application, exception.response().errorBody()?.string()) } - }) + } + }) } } \ No newline at end of file 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 610b28ae3b..6c53440eed 100644 --- a/app/src/main/java/com/gh/common/util/DialogUtils.java +++ b/app/src/main/java/com/gh/common/util/DialogUtils.java @@ -45,10 +45,12 @@ import androidx.appcompat.app.AlertDialog; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.content.ContextCompat; import androidx.databinding.DataBindingUtil; +import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import kotlin.Unit; import kotlin.jvm.functions.Function0; +import kotlin.jvm.functions.Function1; import com.facebook.drawee.generic.GenericDraweeHierarchy; import com.facebook.drawee.view.SimpleDraweeView; @@ -60,9 +62,11 @@ import com.gh.common.view.DrawableView; import com.gh.common.view.FixLinearLayoutManager; import com.gh.common.view.LimitHeightLinearLayout; import com.gh.common.view.MaxHeightNestedScrollView; +import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.AboutActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.SuggestionActivity; +import com.gh.gamecenter.adapter.ReportReasonAdapter; import com.gh.gamecenter.adapter.viewholder.PrivacyPolicyItemViewHolder; import com.gh.gamecenter.databinding.DialogBindPhoneBinding; import com.gh.gamecenter.databinding.DialogEnergySignBinding; @@ -2013,37 +2017,26 @@ public class DialogUtils { } @SuppressLint("SetTextI18n") - public static void showReportReasonDialog(Context context, ReportReasonCallBack callBack) { + public static void showReportReasonDialog(Context context, ArrayList items,ReportReasonCallBack callBack) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context, R.style.DialogWindowTransparent); DialogReportReasonBinding binding = DialogReportReasonBinding.inflate(LayoutInflater.from(context)); - binding.reasonOne.setOnClickListener(v -> { - dialog.dismiss(); - callBack.onResponse(binding.reasonOne.getText().toString(), ""); - }); - - binding.reasonTwo.setOnClickListener(v -> { - dialog.dismiss(); - callBack.onResponse(binding.reasonTwo.getText().toString(), ""); - }); - - binding.reasonThree.setOnClickListener(v -> { - dialog.dismiss(); - callBack.onResponse(binding.reasonThree.getText().toString(), ""); - }); - - binding.reasonFour.setOnClickListener(v -> { - dialog.dismiss(); - callBack.onResponse(binding.reasonFour.getText().toString(), ""); - }); - - binding.reasonOther.setOnClickListener(v -> { - binding.reasonTitle.setText(R.string.report_reason_other_title); - binding.normalReasonContainer.setVisibility(View.GONE); - binding.otherReasonContainer.setVisibility(View.VISIBLE); + ReportReasonAdapter reportReasonAdapter = new ReportReasonAdapter(context, items, reason -> { + if (reason.equals("其他原因")) { + binding.reasonTitle.setText(R.string.report_reason_other_title); + binding.normalReasonContainer.setVisibility(View.GONE); + binding.otherReasonContainer.setVisibility(View.VISIBLE); + } else { + dialog.dismiss(); + callBack.onResponse(reason, ""); + } + return null; }); + binding.reasonRv.setLayoutManager(new LinearLayoutManager(context)); + binding.reasonRv.addItemDecoration(new VerticalItemDecoration(context, 1F, false, R.color.text_f5f5f5)); + binding.reasonRv.setAdapter(reportReasonAdapter); binding.negativeBtn.setOnClickListener(v -> { binding.reasonTitle.setText(R.string.report_reason_title); @@ -2053,10 +2046,10 @@ public class DialogUtils { binding.positiveBtn.setOnClickListener(v -> { if (TextUtils.isEmpty(binding.otherReasonEt.getText().toString().trim())) { - ToastUtils.INSTANCE.showToast("请填写举报原因"); + ToastUtils.showToast("请填写举报原因"); } else { dialog.dismiss(); - callBack.onResponse("其它", binding.otherReasonEt.getText().toString()); + callBack.onResponse("其他原因", binding.otherReasonEt.getText().toString()); } }); diff --git a/app/src/main/java/com/gh/common/util/ErrorHelper.kt b/app/src/main/java/com/gh/common/util/ErrorHelper.kt index 5aff9508c8..901b42cf57 100644 --- a/app/src/main/java/com/gh/common/util/ErrorHelper.kt +++ b/app/src/main/java/com/gh/common/util/ErrorHelper.kt @@ -133,6 +133,8 @@ object ErrorHelper { 403022 -> Utils.toast(context, "不能回复自己") 403056 -> Utils.toast(context, "发布失败,字数已达上限") 403111 -> Utils.toast(context, "提交失败,评论违规") + 400001 -> Utils.toast(context, "字数超过500或者未填写原因") + 403102 -> Utils.toast(context, "你已经举报过该内容了哦") 403020 -> if (showHighPriorityHint) { DialogUtils.showAlertDialog( diff --git a/app/src/main/java/com/gh/common/util/SimpleRequestHelper.kt b/app/src/main/java/com/gh/common/util/SimpleRequestHelper.kt index af6ab3a6cf..bf9f29fc20 100644 --- a/app/src/main/java/com/gh/common/util/SimpleRequestHelper.kt +++ b/app/src/main/java/com/gh/common/util/SimpleRequestHelper.kt @@ -7,6 +7,7 @@ import com.lightgame.utils.Utils import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import okhttp3.ResponseBody +import org.json.JSONObject import retrofit2.HttpException /** @@ -23,11 +24,11 @@ object SimpleRequestHelper { .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : Response() { override fun onResponse(response: ResponseBody?) { - Utils.toast(HaloApp.getInstance().application, "感谢您的投诉") + Utils.toast(HaloApp.getInstance().application, "举报成功") } override fun onFailure(e: HttpException?) { - ErrorHelper.handleError(HaloApp.getInstance().application, e?.response()?.errorBody()?.string()) + ErrorHelper.handleError(HaloApp.getInstance().application,e?.response()?.errorBody()?.string()) } }) @@ -41,11 +42,11 @@ object SimpleRequestHelper { .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : Response() { override fun onResponse(response: ResponseBody?) { - Utils.toast(HaloApp.getInstance().application, "感谢您的投诉") + Utils.toast(HaloApp.getInstance().application, "举报成功") } override fun onFailure(e: HttpException?) { - ErrorHelper.handleError(HaloApp.getInstance().application, e?.response()?.errorBody()?.string()) + ErrorHelper.handleError(HaloApp.getInstance().application,e?.response()?.errorBody()?.string()) } }) diff --git a/app/src/main/java/com/gh/gamecenter/adapter/ReportReasonAdapter.kt b/app/src/main/java/com/gh/gamecenter/adapter/ReportReasonAdapter.kt new file mode 100644 index 0000000000..cab6368e17 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/adapter/ReportReasonAdapter.kt @@ -0,0 +1,44 @@ +package com.gh.gamecenter.adapter + +import android.content.Context +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.gh.common.util.goneIf +import com.gh.gamecenter.databinding.ItemReportReasonBinding +import com.lightgame.adapter.BaseRecyclerAdapter + +class ReportReasonAdapter( + context: Context, + val items: ArrayList, + val onItemClick: (String) -> Unit +) : + BaseRecyclerAdapter(context) { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return ReportReasonViewHolder( + ItemReportReasonBinding.inflate( + LayoutInflater.from(mContext), + parent, + false + ) + ) + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is ReportReasonViewHolder) { + val item = items[position] + holder.binding.reasonTv.text = item + holder.binding.reasonArrowIv.goneIf(item != "其他原因") + holder.binding.root.setOnClickListener { + onItemClick.invoke(item) + } + } + } + + override fun getItemCount(): Int = items.size + + inner class ReportReasonViewHolder(val binding: ItemReportReasonBinding) : + RecyclerView.ViewHolder(binding.root) +} + 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 f7591f8d96..eb60629c24 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 @@ -161,9 +161,11 @@ class DescCommentsAdapter(context: Context, "投诉" -> { MtaHelper.onEvent("游戏详情_新", "玩家评论_投诉", mViewModel.game?.name) mContext.ifLogin(BaseActivity.mergeEntranceAndPath(mEntrance, path)) { - OptionDialogHelper.showOptionDialog(mContext, Constants.REPORT_LIST.toList(), callback = { reportType -> - SimpleRequestHelper.reportGameComment(mViewModel.game!!.id, commentData.id, reportType) - }) + DialogUtils.showReportReasonDialog(mContext, + Constants.REPORT_LIST.toList() as java.util.ArrayList + ) { reason, desc -> + SimpleRequestHelper.reportGameComment(mViewModel.game?.id ?: "", commentData.id, if (reason != "其他原因") reason else desc) + } } } } 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 2ae652db37..1418bfc826 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 @@ -37,6 +37,7 @@ import com.squareup.picasso.Picasso import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers +import java.util.ArrayList import java.util.regex.Pattern class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseRecyclerViewHolder(binding.root) { @@ -209,9 +210,11 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR if (path == "游戏详情:评分") MtaHelper.onEvent("游戏详情_新", "评论Tab_投诉", game?.name) if (path == "折叠评论") MtaHelper.onEvent("折叠评论", "更多-投诉", game?.name) context.ifLogin(BaseActivity.mergeEntranceAndPath(entrance, path)) { - OptionDialogHelper.showOptionDialog(context, Constants.REPORT_LIST.toList(), callback = { reportType -> - SimpleRequestHelper.reportGameComment(game!!.id, commentData.id, reportType) - }) + DialogUtils.showReportReasonDialog(context, + Constants.REPORT_LIST.toList() as ArrayList + ) { reason, desc -> + SimpleRequestHelper.reportGameComment(game?.id ?: "", commentData.id, if (reason != "其他原因") reason else desc) + } } } } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt index d42fe4cd59..8bb9a65983 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt @@ -362,10 +362,14 @@ class RatingReplyAdapter(context: Context, "投诉" -> { mContext.ifLogin("游戏详情-评分-评论详情- 投诉评论") { OptionDialogHelper.showOptionDialog(mContext, Constants.REPORT_LIST.toList(), callback = { reportType -> - SimpleRequestHelper.reportGameCommentReply( + DialogUtils.showReportReasonDialog(mContext, + Constants.REPORT_LIST.toList() as java.util.ArrayList + ) { reason, desc -> + SimpleRequestHelper.reportGameCommentReply( mEntityList[0].game!!.id, mEntityList[1].comment!!.id, - replyEntity.id, reportType) + replyEntity.id, if (reason != "其他原因") reason else desc) + } }) } } diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeFragment.kt b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeFragment.kt index d93e75ae50..96a1b1f518 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeFragment.kt @@ -41,6 +41,7 @@ import com.halo.assistant.HaloApp import com.lightgame.utils.Utils import kotlinx.android.synthetic.main.fragment_home.* import kotlinx.android.synthetic.main.reuse_no_connection.* +import java.util.* import kotlin.math.abs class UserHomeFragment : NormalFragment() { @@ -61,7 +62,12 @@ class UserHomeFragment : NormalFragment() { override fun getLayoutId() = 0 override fun getInflatedLayout(): View { - mHomeBinding = DataBindingUtil.inflate(requireActivity().layoutInflater, R.layout.fragment_home, null, false) + mHomeBinding = DataBindingUtil.inflate( + requireActivity().layoutInflater, + R.layout.fragment_home, + null, + false + ) return mHomeBinding!!.root } @@ -71,7 +77,8 @@ class UserHomeFragment : NormalFragment() { mPath = arguments?.getString(EntranceUtils.KEY_PATH) ?: "" val userId = arguments?.getString(EntranceUtils.KEY_USER_ID) ?: "" - mUserHomeViewModel = viewModelProvider(UserHomeViewModel.Factory(HaloApp.getInstance().application, userId)) + mUserHomeViewModel = + viewModelProvider(UserHomeViewModel.Factory(HaloApp.getInstance().application, userId)) mUserViewModel = viewModelProvider(UserViewModel.Factory(HaloApp.getInstance().application)) mMessageUnreadViewModel = viewModelProvider() @@ -128,9 +135,17 @@ class UserHomeFragment : NormalFragment() { if (badge.wear) { ImageUtils.display(mHomeBinding?.badgeIcon, badge.icon) mHomeBinding?.badgeIcon?.setOnClickListener { - DialogUtils.showViewBadgeDialog(requireContext(), Badge(badge.name, badge.icon, badge.actions)) { + DialogUtils.showViewBadgeDialog( + requireContext(), + Badge(badge.name, badge.icon, badge.actions) + ) { if (::mPersonalEntity.isInitialized) { - directToBadgeWall(requireContext(), mPersonalEntity.id, mPersonalEntity.name, mPersonalEntity.icon) + directToBadgeWall( + requireContext(), + mPersonalEntity.id, + mPersonalEntity.name, + mPersonalEntity.icon + ) } } } @@ -234,7 +249,13 @@ class UserHomeFragment : NormalFragment() { set.run { clone(contentContainer) clear(R.id.user_icon, ConstraintSet.BOTTOM) - connect(R.id.user_icon, ConstraintSet.TOP, R.id.statusBarView, ConstraintSet.BOTTOM, 50F.dip2px()) + connect( + R.id.user_icon, + ConstraintSet.TOP, + R.id.statusBarView, + ConstraintSet.BOTTOM, + 50F.dip2px() + ) applyTo(contentContainer) } @@ -248,8 +269,15 @@ class UserHomeFragment : NormalFragment() { newSet.run { clone(contentContainer) clear(R.id.user_icon, ConstraintSet.TOP) - val marginBottom = newHeight - DisplayUtils.getStatusBarHeight(resources) - 50F.dip2px() - 96F.dip2px() - connect(R.id.user_icon, ConstraintSet.BOTTOM, R.id.user_background_container, ConstraintSet.BOTTOM, marginBottom) + val marginBottom = + newHeight - DisplayUtils.getStatusBarHeight(resources) - 50F.dip2px() - 96F.dip2px() + connect( + R.id.user_icon, + ConstraintSet.BOTTOM, + R.id.user_background_container, + ConstraintSet.BOTTOM, + marginBottom + ) applyTo(contentContainer) } } @@ -262,11 +290,20 @@ class UserHomeFragment : NormalFragment() { mHomeBinding?.run { appbar.addOnOffsetChangedListener(OnOffsetChangedListener { _: AppBarLayout?, verticalOffset: Int -> if (isAdded) { - val statusBarHeight = if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) 0 else DisplayUtils.getStatusBarHeight(resources) + val statusBarHeight = + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) 0 else DisplayUtils.getStatusBarHeight( + resources + ) val absOffset = abs(verticalOffset) - val invisibleOffset = 264f.dip2px() - 50f.dip2px() - 2f.dip2px() - statusBarHeight + val invisibleOffset = + 264f.dip2px() - 50f.dip2px() - 2f.dip2px() - statusBarHeight if (absOffset < invisibleOffset) { - toolbar.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.transparent)) + toolbar.setBackgroundColor( + ContextCompat.getColor( + requireContext(), + R.color.transparent + ) + ) toolbarContainer.background = null userSmallContainer.visibility = View.GONE } else { @@ -274,7 +311,12 @@ class UserHomeFragment : NormalFragment() { toolbar.setBackgroundColor(R.color.white.toColor()) toolbarContainer.background = BitmapDrawable(resources, mBitmap) } else { - toolbar.setBackgroundColor(ContextCompat.getColor(requireContext(), R.color.theme)) + toolbar.setBackgroundColor( + ContextCompat.getColor( + requireContext(), + R.color.theme + ) + ) } userSmallContainer.visibility = View.VISIBLE } @@ -301,9 +343,14 @@ class UserHomeFragment : NormalFragment() { val tag = "android:switcher:${mHomeBinding?.viewpager?.id}:" val gameFragment = childFragmentManager.findFragmentByTag("${tag}0") - ?: UserGameFragment.getInstance(mUserHomeViewModel.userId, count.gameComment) + ?: UserGameFragment.getInstance(mUserHomeViewModel.userId, count.gameComment) val qaFragment = childFragmentManager.findFragmentByTag("${tag}1") - ?: UserHistoryFragment.getInstance(mUserHomeViewModel.userId, UserHistoryViewModel.SCENE.QUESTION_ANSWER, count, type) + ?: UserHistoryFragment.getInstance( + mUserHomeViewModel.userId, + UserHistoryViewModel.SCENE.QUESTION_ANSWER, + count, + type + ) // val videoFragment = childFragmentManager.findFragmentByTag("${tag}2") // ?: UserVideoHistoryFragment.getInstance(mUserHomeViewModel.userId, count) @@ -330,7 +377,8 @@ class UserHomeFragment : NormalFragment() { } private fun getTabView(title: String): View { - val view = LayoutInflater.from(HaloApp.getInstance().application.baseContext).inflate(R.layout.tab_item_user_home, null) + val view = LayoutInflater.from(HaloApp.getInstance().application.baseContext) + .inflate(R.layout.tab_item_user_home, null) val tabTitle = view.findViewById(R.id.tab_title) if (tabTitle is CheckedTextView) { tabTitle.text = title @@ -339,8 +387,16 @@ class UserHomeFragment : NormalFragment() { } private fun trackMtaEvent(name: String? = "") { - MtaHelper.onEvent("个人主页", mPath, StringUtils.combineTwoString(name, mUserHomeViewModel.userId)) - MtaHelper.onEvent("个人主页", "不区分位置", StringUtils.combineTwoString(name, mUserHomeViewModel.userId)) + MtaHelper.onEvent( + "个人主页", + mPath, + StringUtils.combineTwoString(name, mUserHomeViewModel.userId) + ) + MtaHelper.onEvent( + "个人主页", + "不区分位置", + StringUtils.combineTwoString(name, mUserHomeViewModel.userId) + ) } private fun updateUnreadInfo(messageEntity: MessageUnreadEntity) { @@ -369,23 +425,34 @@ class UserHomeFragment : NormalFragment() { // 截取背景图片,供toolbar使用 if (!personalData.background?.url.isNullOrEmpty()) { - ImageUtils.getBitmap(personalData.background?.url ?: "", object : BiCallback { - override fun onFirst(first: Bitmap) { - userBackground.postDelayed({ - if (activity?.isFinishing == false && !isStateSaved) { - val statusBarHeight = if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) 0 else DisplayUtils.getStatusBarHeight(resources) - val bitmap = getBitmapFromView(userBackground) - bitmap?.let { - mBitmap = Bitmap.createBitmap(it, 0, it.height - statusBarHeight - 50f.dip2px(), it.width, statusBarHeight + 50f.dip2px()) + ImageUtils.getBitmap( + personalData.background?.url ?: "", + object : BiCallback { + override fun onFirst(first: Bitmap) { + userBackground.postDelayed({ + if (activity?.isFinishing == false && !isStateSaved) { + val statusBarHeight = + if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) 0 else DisplayUtils.getStatusBarHeight( + resources + ) + val bitmap = getBitmapFromView(userBackground) + bitmap?.let { + mBitmap = Bitmap.createBitmap( + it, + 0, + it.height - statusBarHeight - 50f.dip2px(), + it.width, + statusBarHeight + 50f.dip2px() + ) + } } - } - }, 1000) - } + }, 1000) + } - override fun onSecond(second: Boolean) { - Utils.log("获取背景图片失败") - } - }) + override fun onSecond(second: Boolean) { + Utils.log("获取背景图片失败") + } + }) } // 设置有边框挂件的头像 @@ -411,7 +478,11 @@ class UserHomeFragment : NormalFragment() { userChangeBgBtn.visibility = View.VISIBLE recentVisitContainer.visibility = View.VISIBLE recentVisitIcon.setOnClickListener { - DirectUtils.directToHomeActivity(requireContext(), personalData.lastVisitor?.id, "个人主页-最近来访") + DirectUtils.directToHomeActivity( + requireContext(), + personalData.lastVisitor?.id, + "个人主页-最近来访" + ) } // 默认显示悬浮窗,点击图标进入更换背景页,悬浮窗消失 @@ -439,7 +510,12 @@ class UserHomeFragment : NormalFragment() { // 个性签名 userIntroduce.setOnClickListener { IntegralLogHelper.log("click_what's_up", LOCATION) - startActivity(UserInfoEditActivity.getIntent(context, UserViewModel.TYPE_INTRODUCE)) + startActivity( + UserInfoEditActivity.getIntent( + context, + UserViewModel.TYPE_INTRODUCE + ) + ) } } @@ -447,14 +523,24 @@ class UserHomeFragment : NormalFragment() { personalData.background?.url?.let { userBackground.setOnClickListener { - startActivity(ImageViewerActivity.getIntent(requireContext(), arrayListOf(personalData.background!!.url), 0, userIcon, "$mEntrance+($mPath)", true)) + startActivity( + ImageViewerActivity.getIntent( + requireContext(), + arrayListOf(personalData.background!!.url), + 0, + userIcon, + "$mEntrance+($mPath)", + true + ) + ) } } // 礼仪测试标签 regulationTestContainer.setOnClickListener { if (::mPersonalEntity.isInitialized - && mUserHomeViewModel.userId == UserManager.getInstance().userId) { + && mUserHomeViewModel.userId == UserManager.getInstance().userId + ) { IntegralLogHelper.log("click_test_label", LOCATION) DialogUtils.showPassRegulationDialog(requireContext(), mPersonalEntity.icon) } @@ -464,7 +550,12 @@ class UserHomeFragment : NormalFragment() { badgeContainer.setOnClickListener { if (::mPersonalEntity.isInitialized) { IntegralLogHelper.log("click_badge_label", LOCATION) - directToBadgeWall(requireContext(), mPersonalEntity.id, mPersonalEntity.name, mPersonalEntity.icon) + directToBadgeWall( + requireContext(), + mPersonalEntity.id, + mPersonalEntity.name, + mPersonalEntity.icon + ) } } @@ -477,24 +568,50 @@ class UserHomeFragment : NormalFragment() { MtaHelper.onEvent("个人主页详情", "个人主页详情", "头像") startActivity(AvatarBorderActivity.getIntent(requireContext())) } else { - startActivity(ImageViewerActivity.getIntent(requireContext(), arrayListOf(personalData.icon), 0, userIcon, "$mEntrance+($mPath)", true)) + startActivity( + ImageViewerActivity.getIntent( + requireContext(), + arrayListOf(personalData.icon), + 0, + userIcon, + "$mEntrance+($mPath)", + true + ) + ) } } userFollowerContainer.setOnClickListener { IntegralLogHelper.log("click_follow", LOCATION) MtaHelper.onEvent("个人主页详情", "个人主页详情", "关注数") - startActivity(FollowersActivity.getIntent(requireContext(), mUserHomeViewModel.userId, mEntrance, mPath)) + startActivity( + FollowersActivity.getIntent( + requireContext(), + mUserHomeViewModel.userId, + mEntrance, + mPath + ) + ) } userFansContainer.setOnClickListener { IntegralLogHelper.log("click_follower", LOCATION) MtaHelper.onEvent("个人主页详情", "个人主页详情", "粉丝数") - requireContext().startActivity(FansActivity.getIntent(requireContext(), mUserHomeViewModel.userId, mEntrance, mPath)) + requireContext().startActivity( + FansActivity.getIntent( + requireContext(), + mUserHomeViewModel.userId, + mEntrance, + mPath + ) + ) } userVoteContainer.setOnClickListener { IntegralLogHelper.log("click_like", LOCATION) MtaHelper.onEvent("个人主页详情", "个人主页详情", "赞同数") - Utils.toast(requireContext(), "共获得 " + NumberUtils.transSimpleCount(entity?.count?.vote!!) + " 赞同") + Utils.toast( + requireContext(), + "共获得 " + NumberUtils.transSimpleCount(entity?.count?.vote!!) + " 赞同" + ) } userEditBtn.setOnClickListener { IntegralLogHelper.log("click_edit", LOCATION) @@ -511,10 +628,17 @@ class UserHomeFragment : NormalFragment() { userConcernedBtn.setOnClickListener { ifLogin("个人主页-关注-[关注]") { MtaHelper.onEvent("个人主页详情", "个人主页详情", "关注按钮") - DialogUtils.showAlertDialog(requireContext(), "取消关注", "确定要取消关注 ${personalData.name} 吗?", - "确定取消", "暂不取消", DialogUtils.ConfirmListener { - mUserHomeViewModel.unFollow() - }, null) + DialogUtils.showAlertDialog( + requireContext(), + "取消关注", + "确定要取消关注 ${personalData.name} 吗?", + "确定取消", + "暂不取消", + DialogUtils.ConfirmListener { + mUserHomeViewModel.unFollow() + }, + null + ) } } @@ -566,23 +690,30 @@ class UserHomeFragment : NormalFragment() { if (!::mPopupWindow.isInitialized) { val contentView = View.inflate(activity, R.layout.popup_user_home_more, null) mPopupWindow = PopupWindow( - contentView, - LinearLayout.LayoutParams.WRAP_CONTENT, - LinearLayout.LayoutParams.WRAP_CONTENT + contentView, + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT ) contentView.run { findViewById(R.id.shareBtn) - .setOnClickListener { - IntegralLogHelper.log("click_share", "更多面板") - mPopupWindow.dismiss() - shareUserHome() - } + .setOnClickListener { + IntegralLogHelper.log("click_share", "更多面板") + mPopupWindow.dismiss() + shareUserHome() + } findViewById(R.id.reportBtn).setOnClickListener { IntegralLogHelper.log("click_report", "更多面板") mPopupWindow.dismiss() - DialogUtils.showReportReasonDialog(requireContext()) { reason, desc -> + val items = arrayListOf( + context.getString(R.string.report_reason_one), + context.getString(R.string.report_reason_two), + context.getString(R.string.report_reason_three), + context.getString(R.string.report_reason_four), + context.getString(R.string.report_reason_other) + ) + DialogUtils.showReportReasonDialog(requireContext(), items) { reason, desc -> mUserHomeViewModel.postReport(reason, desc) } } @@ -603,18 +734,20 @@ class UserHomeFragment : NormalFragment() { (if (mBadgeCount == 0) "" else "给力~ 已领取 $mBadgeCount 枚徽章\n") + "要好玩,上光环" if (::mPersonalEntity.isInitialized) { - ShareUtils.getInstance(requireContext()).showShareUserHomeWindows(requireActivity(), - mHomeBinding?.root, - if ("internal" == BuildConfig.FLAVOR) { - Constants.SHARE_USER_HOME_ADDRESS_DEV - } else { - Constants.SHARE_USER_HOME_ADDRESS - } + "?user=${mPersonalEntity.id}", - mPersonalEntity.icon, - "【推荐】来自光环助手的${mPersonalEntity.name}", - content, - ShareUtils.ShareEntrance.userHome, - mPersonalEntity.id, null) + ShareUtils.getInstance(requireContext()).showShareUserHomeWindows( + requireActivity(), + mHomeBinding?.root, + if ("internal" == BuildConfig.FLAVOR) { + Constants.SHARE_USER_HOME_ADDRESS_DEV + } else { + Constants.SHARE_USER_HOME_ADDRESS + } + "?user=${mPersonalEntity.id}", + mPersonalEntity.icon, + "【推荐】来自光环助手的${mPersonalEntity.name}", + content, + ShareUtils.ShareEntrance.userHome, + mPersonalEntity.id, null + ) } } 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 9c092580be..74bb332798 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/UserHomeViewModel.kt @@ -8,6 +8,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.gh.common.util.EnergyTaskHelper +import com.gh.common.util.ErrorHelper import com.gh.common.util.ToastUtils import com.gh.common.util.createRequestBody import com.gh.gamecenter.R @@ -167,7 +168,7 @@ class UserHomeViewModel(application: Application, var userId: String) : AndroidV fun postReport(reason: String, desc: String) { val requestMap = hashMapOf() requestMap["reason"] = reason - if (reason == "其它") { + if (reason == "其他原因") { requestMap["description"] = desc } RetrofitManager.getInstance(getApplication()) @@ -182,20 +183,7 @@ class UserHomeViewModel(application: Application, var userId: String) : AndroidV override fun onFailure(exception: Exception) { super.onFailure(exception) if (exception is HttpException) { - try { - val responseBody = exception.response().errorBody() - val string = responseBody!!.string() - val content = JSONObject(string) - when (val code = content.getInt("code")) { - 403102 -> ToastUtils.showToast("你已经举报过该用户了哦") - - 400001 -> ToastUtils.showToast("字数超过500或者未填写原因") - - else -> ToastUtils.showToast(code.toString()) - } - } catch (e1: Exception) { - e1.printStackTrace() - } + ErrorHelper.handleError(HaloApp.getInstance().application, exception.response().errorBody()?.string()) } } }) diff --git a/app/src/main/res/layout/dialog_report_reason.xml b/app/src/main/res/layout/dialog_report_reason.xml index 5bade728cb..0ea4587fb8 100644 --- a/app/src/main/res/layout/dialog_report_reason.xml +++ b/app/src/main/res/layout/dialog_report_reason.xml @@ -5,7 +5,7 @@ @@ -24,12 +24,18 @@ - + + + + + + + + \ No newline at end of file From c4fc31c9633f97d2192dac5c7fecd6dc49d18f0f Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Wed, 18 Aug 2021 18:49:15 +0800 Subject: [PATCH 078/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E9=AA=8C=E6=94=B6=E9=97=AE=E9=A2=98(17)=20https://git?= =?UTF-8?q?.ghzs.com/pm/halo-app-issues/-/issues/1442?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/gamecenter/qa/article/edit/ArticleEditActivity.kt | 1 + .../gh/gamecenter/qa/dialog/ChooseForumContainerAdapter.kt | 2 +- .../java/com/gh/gamecenter/qa/entity/ArticleDetailEntity.kt | 1 + .../com/gh/gamecenter/qa/entity/QuestionsDetailEntity.kt | 1 + .../gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt | 6 ++++-- .../gh/gamecenter/qa/video/publish/VideoPublishFragment.kt | 1 + 6 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditActivity.kt index 652b8f92ec..eba4b7853a 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditActivity.kt @@ -482,6 +482,7 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb } else if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { if (mViewModel.gameEntity == null) { mGameName.text = "选择游戏" + mForumIcon.visibility = View.GONE } else { mGameName.text = mViewModel.gameEntity?.name mForumIcon.displayGameIcon(mViewModel.gameEntity?.icon, mViewModel.gameEntity?.iconSubscript) diff --git a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerAdapter.kt index 80036718fb..4d084ebd1a 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerAdapter.kt @@ -65,7 +65,7 @@ class ChooseForumContainerAdapter(content: Context, val type: String, val onSele val tabType = if (type == ChooseForumContainerFragment.ChooseForumType.SEARCH.value) "论坛tab" else "" val bbsType = if (forumEntity.type == "official_bbs") "综合论坛" else "游戏论坛" NewLogUtils.logForumSearchResultClick(tabType, forumEntity.id, bbsType, "", "", "", position + 1) - onSelectCallback?.invoke(CommunityEntity(forumEntity.id, HtmlUtils.stripHtml(forumEntity.name), + onSelectCallback?.invoke(CommunityEntity(forumEntity.id, HtmlUtils.stripHtml(forumEntity.name), type = forumEntity.type, game = forumEntity.game, icon = icon, iconSubscript = forumEntity.game.iconSubscript)) } } else if (holder is FooterViewHolder) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDetailEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDetailEntity.kt index a600fa9f86..374732bdd0 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDetailEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDetailEntity.kt @@ -34,6 +34,7 @@ data class ArticleDetailEntity( @SerializedName("tag_activity_name") var tagActivityName: String = "", var type: String = "", + @SerializedName("game") var gameEntity: GameEntity? = null, @SerializedName("choiceness_status") var choicenessStatus: String = "",// 精选状态 apply(申请), pass already(已精选) cancel not_yet(未精选) diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/QuestionsDetailEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/QuestionsDetailEntity.kt index 8ca075eb7a..ecdd361cf7 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/QuestionsDetailEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/QuestionsDetailEntity.kt @@ -43,6 +43,7 @@ data class QuestionsDetailEntity( @SerializedName("tag_activity_name") var tagActivityName: String = "", var type: String = "", + @SerializedName("game") var gameEntity: GameEntity? = null, var time: TimeEntity = TimeEntity(), var count: Count = Count(), diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt index 705178f262..ce0278aec5 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/QuestionEditActivity.kt @@ -289,7 +289,10 @@ class QuestionEditActivity : BaseRichEditorActivity(), mBinding.activityTitle.text = detailEntity.tagActivityName mBinding.activityTitle.setTextColor(R.color.text_FA8500.toColor()) } + setForumName() mBinding.chooseActivityContainer.isEnabled = false + mBinding.chooseForumTv.isEnabled = false + mBinding.chooseForumTv.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null) mViewModel.isModeratorPatch = intent.getBooleanExtra(EntranceUtils.KEY_QUESTION_MODERATOR_PATCH, false) @@ -304,8 +307,6 @@ class QuestionEditActivity : BaseRichEditorActivity(), mBinding.questionseditTitle.setText(detailEntity.title) setEditHtml(detailEntity.description) } - - setForumName() } private fun setQuestionDraft(draftEntity: QuestionDraftEntity) { @@ -705,6 +706,7 @@ class QuestionEditActivity : BaseRichEditorActivity(), } else if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { if (mViewModel.gameEntity == null) { mBinding.chooseForumTv.text = "选择游戏" + mBinding.forumIconView.visibility = View.GONE } else { mBinding.chooseForumTv.text = mViewModel.gameEntity?.name mBinding.forumIconView.displayGameIcon( diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt index 83626fcec7..ac6d8052d3 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt @@ -547,6 +547,7 @@ class VideoPublishFragment : NormalFragment(), KeyboardHeightObserver { } else if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { if (mViewModel.gameEntity == null) { mBinding.chooseForumTv.text = "选择游戏" + mBinding.forumIconView.visibility = View.GONE } else { mBinding.chooseForumTv.text = mViewModel.gameEntity?.name mBinding.forumIconView.displayGameIcon( From b1fef73c54cbb5b8d7828e61baa699e06cc946a5 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Wed, 18 Aug 2021 18:54:56 +0800 Subject: [PATCH 079/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA=E8=BF=90?= =?UTF-8?q?=E8=90=A5=E9=AA=8C=E6=94=B6=E9=97=AE=E9=A2=98(11)=20https://git?= =?UTF-8?q?.ghzs.com/pm/halo-app-issues/-/issues/1442?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/util/CommentHelper.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/common/util/CommentHelper.kt b/app/src/main/java/com/gh/common/util/CommentHelper.kt index 72a89a2d7c..dcf28ed20c 100644 --- a/app/src/main/java/com/gh/common/util/CommentHelper.kt +++ b/app/src/main/java/com/gh/common/util/CommentHelper.kt @@ -122,7 +122,7 @@ object CommentHelper { val context = view.context val dialogOptions = ArrayList() - if (isShowTop && (articleId != null || questionId != null) && (commentEntity.me?.isModerator == true || commentEntity.me?.isContentAuthor == true)) { + if (isShowTop && (articleId != null || questionId != null) && commentEntity.me?.isContentAuthor == true) { dialogOptions.add(if (commentEntity.isTop) "取消置顶" else "置顶") } if (questionId != null && commentEntity.me?.isContentAuthor == true) { From d588315759b34724a3c438e5e5823c3a84660f37 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Thu, 19 Aug 2021 11:04:19 +0800 Subject: [PATCH 080/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA3=E6=9C=9F-?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E5=B1=95=E7=A4=BA-=E5=A4=B4=E5=83=8F?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=20https://git.ghzs.com/pm/halo-app-issues/-/?= =?UTF-8?q?issues/1406?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rating/RatingCommentItemViewHolder.kt | 2 +- .../detail/ArticleDetailContentViewHolder.kt | 2 +- .../newdetail/QuestionDetailContentViewHolder.kt | 2 +- app/src/main/res/layout/community_answer_item.xml | 5 ++--- app/src/main/res/layout/fragment_new_personal.xml | 2 +- app/src/main/res/layout/fragment_personal.xml | 2 +- .../res/layout/item_article_detail_comment.xml | 4 +--- app/src/main/res/layout/item_video_desc_top.xml | 14 ++++++++++++++ app/src/main/res/layout/user_history_item.xml | 5 ++--- app/src/main/res/layout/view_avatar_border.xml | 15 +++++++-------- 10 files changed, 31 insertions(+), 22 deletions(-) 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 1418bfc826..3008ab7428 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 @@ -87,7 +87,7 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR if (commentData.user.badge != null) { sdvUserBadge.visibility = View.VISIBLE - tvBadgeName.visibility = View.VISIBLE +// tvBadgeName.visibility = View.VISIBLE ImageUtils.display(sdvUserBadge, commentData.user.badge.icon) tvBadgeName.text = commentData.user.badge.name } else { 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 4c5f7e50df..a6cce1befe 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 @@ -191,7 +191,7 @@ class ArticleDetailContentViewHolder( } badgeIv.goneIf(article.user.badge == null) - badgeTv.goneIf(article.user.badge == null) +// badgeTv.goneIf(article.user.badge == null) badgeTv.text = article.user.badge?.name ImageUtils.display(badgeIv, article.user.badge?.icon) badgeIv.setOnClickListener { diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt index e19b36a443..deb2d257d4 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/QuestionDetailContentViewHolder.kt @@ -186,7 +186,7 @@ class QuestionDetailContentViewHolder( } badgeIv.goneIf(question.user.badge == null) - badgeTv.goneIf(question.user.badge == null) +// badgeTv.goneIf(question.user.badge == null) badgeTv.text = question.user.badge?.name ImageUtils.display(badgeIv, question.user.badge?.icon) badgeIv.setOnClickListener { diff --git a/app/src/main/res/layout/community_answer_item.xml b/app/src/main/res/layout/community_answer_item.xml index 22eab8ffd2..e663f3fa62 100644 --- a/app/src/main/res/layout/community_answer_item.xml +++ b/app/src/main/res/layout/community_answer_item.xml @@ -120,7 +120,6 @@ + tools:text="答题先锋答题先锋答题先锋答题先锋答题先锋答题先锋" /> + app:badge_width="18dp" /> + app:badge_width="18dp" /> + tools:text="答题先锋"/> + + + tools:text="答题先锋答题先锋答题先锋答题先锋答题先锋答题先锋"/> - - + \ No newline at end of file From c6f544136ff74f8bf68d6ec31b4502ddfb7aa67c Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Thu, 19 Aug 2021 11:13:42 +0800 Subject: [PATCH 081/151] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=8E=AF=E5=A2=83api?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=94=B9=E4=B8=BAv5d2d0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 9ba14a15ed..a814add55e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -48,7 +48,7 @@ QUICK_LOGIN_APPID=300012035775 QUICK_LOGIN_APPKEY=002BAABA2C078342DA33BEAB0A4C6A25 # hosts -DEV_API_HOST=https\://dev-and-api.ghzs.com/v5d0d0/ +DEV_API_HOST=https\://dev-and-api.ghzs.com/v5d2d0/ API_HOST=https\://and-api.ghzs.com/v5d0d0/ SENSITIVE_API_HOST=https\://and-api.ghzs.com/v5d0d0/ From 62e60f4309ba893e1a8c02415616317c60973752 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Thu, 19 Aug 2021 15:50:17 +0800 Subject: [PATCH 082/151] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E7=A4=BE=E5=8C=BA=E5=B8=96=E5=AD=90toast=E6=96=87=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../article/detail/ArticleDetailFragment.kt | 7 +- .../newdetail/NewQuestionDetailViewModel.kt | 215 ++++++++++-------- .../video/detail/ForumVideoDetailFragment.kt | 8 +- 3 files changed, 126 insertions(+), 104 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt index 0408251612..7fae628db8 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailFragment.kt @@ -410,11 +410,10 @@ class ArticleDetailFragment : BaseCommentFragment if (isHidden) { - if (mViewModel.detailEntity!!.me.moderatorPermissions.hideCommunityArticle == Permissions.REPORTER) { - toast("提交成功") + if (mViewModel.detailEntity?.me?.isModerator == true) { + toast("已隐藏") } else { - toast("操作成功") - //mViewModel.getArticleDetail() + toast("已删除") } EventBus.getDefault().post(EBDeleteDetail(mViewModel.detailEntity?.id ?: "")) requireActivity().finish() diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailViewModel.kt index 447548a41a..cfbd26b340 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailViewModel.kt @@ -31,8 +31,19 @@ import org.greenrobot.eventbus.EventBus import org.json.JSONObject import retrofit2.HttpException -class NewQuestionDetailViewModel(application: Application, questionId: String = "", communityId: String = "", val answerId: String = "") : - BaseCommentViewModel(application, articleId = "", communityId = communityId, videoId = "", questionId = questionId) { +class NewQuestionDetailViewModel( + application: Application, + questionId: String = "", + communityId: String = "", + val answerId: String = "" +) : + BaseCommentViewModel( + application, + articleId = "", + communityId = communityId, + videoId = "", + questionId = questionId + ) { var questionRenderedLiveData = MutableLiveData() var questionPageFinishedLiveData = MutableLiveData() val moderatorsHideLiveData = MutableLiveData() @@ -44,28 +55,28 @@ class NewQuestionDetailViewModel(application: Application, questionId: String = fun getQuestionDetail() { mApi.getQuestionsById(questionId) - .compose(observableToMain()) - .subscribe(object : Response() { - override fun onResponse(response: QuestionsDetailEntity?) { - super.onResponse(response) - questionDetail = response - topItemData = CommentItemData(questionDetail = response) - commentCount = response?.count?.answer ?: 0 - loadResultLiveData.postValue(LoadResult.SUCCESS) - mergeListData(mListLiveData.value, displayFloor = true) + .compose(observableToMain()) + .subscribe(object : Response() { + override fun onResponse(response: QuestionsDetailEntity?) { + super.onResponse(response) + questionDetail = response + topItemData = CommentItemData(questionDetail = response) + commentCount = response?.count?.answer ?: 0 + loadResultLiveData.postValue(LoadResult.SUCCESS) + mergeListData(mListLiveData.value, displayFloor = true) - NewLogUtils.logForumContentBrowser(questionId, "bbs_question") - } + NewLogUtils.logForumContentBrowser(questionId, "bbs_question") + } - override fun onFailure(e: HttpException?) { - super.onFailure(e) - if (e?.code().toString().startsWith("404")) { - loadResultLiveData.postValue(LoadResult.DELETED) - } else { - loadResultLiveData.postValue(LoadResult.NETWORK_ERROR) - } + override fun onFailure(e: HttpException?) { + super.onFailure(e) + if (e?.code().toString().startsWith("404")) { + loadResultLiveData.postValue(LoadResult.DELETED) + } else { + loadResultLiveData.postValue(LoadResult.NETWORK_ERROR) } - }) + } + }) } override fun provideDataObservable(page: Int): Observable>? { @@ -100,63 +111,67 @@ class NewQuestionDetailViewModel(application: Application, questionId: String = mApi.deleteFollowing(targetUserId) } observable - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - super.onResponse(response) - if (isFollow) { - // 关注成功 - mFollowLiveData.postValue(true) - } else { - // 取消关注成功 - mFollowLiveData.postValue(false) - } - - SyncPageRepository.postSyncData(SyncDataEntity(questionDetail?.id ?: "", - SyncFieldConstants.IS_FOLLOWER, - isFollow, - checkFieldEntity = true)) - EventBus.getDefault().post(EBUserFollow(targetUserId, isFollow)) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + if (isFollow) { + // 关注成功 + mFollowLiveData.postValue(true) + } else { + // 取消关注成功 + mFollowLiveData.postValue(false) } - override fun onFailure(e: HttpException?) { - super.onFailure(e) - Utils.toast(getApplication(), R.string.loading_failed_hint) - } - }) + SyncPageRepository.postSyncData( + SyncDataEntity( + questionDetail?.id ?: "", + SyncFieldConstants.IS_FOLLOWER, + isFollow, + checkFieldEntity = true + ) + ) + EventBus.getDefault().post(EBUserFollow(targetUserId, isFollow)) + } + + override fun onFailure(e: HttpException?) { + super.onFailure(e) + Utils.toast(getApplication(), R.string.loading_failed_hint) + } + }) } fun moderatorsHideQuestion() { val me = questionDetail?.me ?: return mApi.moderatorsHideQuestion(UserManager.getInstance().userId, questionId) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - if (me.moderatorPermissions.hideQuestion == Permissions.REPORTER) { - Utils.toast(getApplication(), "提交成功") - } else { - Utils.toast(getApplication(), "操作成功") - moderatorsHideLiveData.postValue(true) - mLoadStatusLiveData.setValue(LoadStatus.INIT_EMPTY) - } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + if (me.isModerator) { + Utils.toast(getApplication(), "已隐藏") + } else { + Utils.toast(getApplication(), "已删除") } + moderatorsHideLiveData.postValue(true) + mLoadStatusLiveData.value = LoadStatus.INIT_EMPTY + } - override fun onFailure(e: HttpException?) { - if (e != null && e.code() == 403) { - val string = e.response().errorBody()?.string() - val errorJson = JSONObject(string) - val errorCode = errorJson.getInt("code") - if (errorCode == 403059) { - Utils.toast(getApplication(), "权限错误,请刷新后重试") - load(LoadType.REFRESH) - return - } + override fun onFailure(e: HttpException?) { + if (e != null && e.code() == 403) { + val string = e.response().errorBody()?.string() + val errorJson = JSONObject(string) + val errorCode = errorJson.getInt("code") + if (errorCode == 403059) { + Utils.toast(getApplication(), "权限错误,请刷新后重试") + load(LoadType.REFRESH) + return } - Utils.toast(getApplication(), R.string.post_failure_hint) } - }) + Utils.toast(getApplication(), R.string.post_failure_hint) + } + }) } @SuppressLint("CheckResult") @@ -168,51 +183,55 @@ class NewQuestionDetailViewModel(application: Application, questionId: String = mApi.favoriteQuestion(UserManager.getInstance().userId, questionId) } single.compose(singleToMain()) - .subscribe(object : BiResponse() { - override fun onSuccess(data: ResponseBody) { - if (questionDetail?.me?.isQuestionFavorite == true) { - ToastUtils.showToast("取消收藏") - } else { - ToastUtils.showToast("收藏成功") - } - questionDetail?.me?.isQuestionFavorite = questionDetail?.me?.isQuestionFavorite != true - favoriteLiveData.postValue(true) + .subscribe(object : BiResponse() { + override fun onSuccess(data: ResponseBody) { + if (questionDetail?.me?.isQuestionFavorite == true) { + ToastUtils.showToast("取消收藏") + } else { + ToastUtils.showToast("收藏成功") } - }) + questionDetail?.me?.isQuestionFavorite = + questionDetail?.me?.isQuestionFavorite != true + favoriteLiveData.postValue(true) + } + }) } fun postSolveQuestion(isSolve: Boolean) { if (questionDetail == null) return val body = json { "finish" to isSolve }.toRequestBody() mApi.solveQuestion(questionDetail?.id ?: "", body) - .compose(observableToMain()) - .subscribe(object : Response() { - override fun onResponse(response: ResponseBody?) { - super.onResponse(response) - questionDetail?.apply { - finish = isSolve - updateDetailLiveData.postValue(this) - } + .compose(observableToMain()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + questionDetail?.apply { + finish = isSolve + updateDetailLiveData.postValue(this) } + } - override fun onFailure(e: HttpException?) { - super.onFailure(e) - ToastUtils.showToast("操作失败") - } - }) + override fun onFailure(e: HttpException?) { + super.onFailure(e) + ToastUtils.showToast("操作失败") + } + }) } - class Factory(private val application: Application, - private val questionId: String = "", - private val communityId: String = "", - private val answerId: String = "") : ViewModelProvider.NewInstanceFactory() { + class Factory( + private val application: Application, + private val questionId: String = "", + private val communityId: String = "", + private val answerId: String = "" + ) : ViewModelProvider.NewInstanceFactory() { override fun create(modelClass: Class): T { return NewQuestionDetailViewModel( - application = application, - questionId = questionId, - communityId = communityId, - answerId = answerId) as T + application = application, + questionId = questionId, + communityId = communityId, + answerId = answerId + ) as T } } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt index d30cb69972..08291f9a38 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/ForumVideoDetailFragment.kt @@ -225,8 +225,12 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { mBinding.reuseLoading.root.visibility = View.GONE mSkeleton?.hide() } - mViewModel.deleteLiveData.observe(viewLifecycleOwner, Observer { - ToastUtils.showToast("删除成功") + mViewModel.deleteLiveData.observe(viewLifecycleOwner, { + if (mForumVideoEntity?.me?.isModerator == true) { + ToastUtils.showToast("已隐藏") + } else { + ToastUtils.showToast("已删除") + } EventBus.getDefault().post(EBDeleteDetail(mViewModel.videoId)) requireActivity().finish() }) From b61ce1e42a5f75f8a59079398bacf5a9b01878c8 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Thu, 19 Aug 2021 18:20:10 +0800 Subject: [PATCH 083/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E5=BC=80=E6=9C=8D=E8=A1=A8=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BC=98=E5=8C=96=EF=BC=88=E5=89=8D=E7=AB=AF=E9=83=A8?= =?UTF-8?q?=E5=88=86=EF=BC=89https://git.ghzs.com/pm/halo-app-issues/-/iss?= =?UTF-8?q?ues/1220?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/common/databind/BindingAdapters.java | 29 +- .../com/gh/common/util/DownloadItemUtils.java | 4 +- .../gamecenter/entity/ServerPublishEntity.kt | 11 + .../com/gh/gamecenter/entity/TestEntity.kt | 1 + .../horizontal/GameHorizontalSlideAdapter.kt | 5 + .../retrofit/service/ApiService.java | 3 +- .../servers/GameServerTimeViewHolder.java | 2 + .../servers/GameServersContentAdapter.java | 553 ------------------ .../servers/GameServersContentAdapter.kt | 382 ++++++++++++ .../servers/GameServersContentFragment.kt | 289 +++++---- .../servers/GameServersContentViewModel.kt | 319 ++++++++++ .../servers/GameServersPublishFragment.kt | 103 ++-- .../servers/GameServersTestAdapter.kt | 2 +- .../drawable-xxxhdpi/ic_pull_down_tip.webp | Bin 0 -> 332 bytes .../layout/fragment_game_servers_publish.xml | 81 +++ .../res/layout/fragment_kaifu_content.xml | 24 +- app/src/main/res/layout/kaifu_item_time.xml | 52 +- app/src/main/res/layout/popup_server_time.xml | 9 - 18 files changed, 1105 insertions(+), 764 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/entity/ServerPublishEntity.kt delete mode 100644 app/src/main/java/com/gh/gamecenter/servers/GameServersContentAdapter.java create mode 100644 app/src/main/java/com/gh/gamecenter/servers/GameServersContentAdapter.kt create mode 100644 app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_pull_down_tip.webp create mode 100644 app/src/main/res/layout/fragment_game_servers_publish.xml diff --git a/app/src/main/java/com/gh/common/databind/BindingAdapters.java b/app/src/main/java/com/gh/common/databind/BindingAdapters.java index 72d4fc7b10..a768183665 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -760,17 +760,24 @@ public class BindingAdapters { if (test != null // 这个判断用于开测表列表 && !"type_tag".equals(test.getGameTag())) { - TagStyleEntity typeTag = new TagStyleEntity(); - typeTag.setName(test.getType() != null ? test.getType() : ""); - typeTag.setBackground("FFF3E0"); - typeTag.setColor("FA8500"); - tagStyle.add(typeTag); - - TagStyleEntity timeTag = new TagStyleEntity(); - timeTag.setName(GameViewUtils.getGameTestDate(test.getStart())); - timeTag.setBackground("E0FFF9"); - timeTag.setColor("00A887"); - tagStyle.add(timeTag); + if ("custom".equals(test.getGameTag())) { + TagStyleEntity typeTag = new TagStyleEntity(); + typeTag.setName(test.getText() != null ? test.getText() : ""); + typeTag.setBackground("E8F3FF"); + typeTag.setColor("1383EB"); + tagStyle.add(typeTag); + } else { + TagStyleEntity typeTag = new TagStyleEntity(); + typeTag.setName(test.getType() != null ? test.getType() : ""); + typeTag.setBackground("FFF3E0"); + typeTag.setColor("FA8500"); + tagStyle.add(typeTag); + } +// TagStyleEntity timeTag = new TagStyleEntity(); +// timeTag.setName(GameViewUtils.getGameTestDate(test.getStart())); +// timeTag.setBackground("E0FFF9"); +// timeTag.setColor("00A887"); +// tagStyle.add(timeTag); } else { tagStyle = gameEntity.getTagStyle(); } diff --git a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java index 18252c6689..b6a2609593 100644 --- a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java +++ b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java @@ -386,7 +386,9 @@ public class DownloadItemUtils { holder.gameDes.setVisibility(View.GONE); holder.gameProgressbar.setVisibility(View.VISIBLE); holder.gameInfo.setVisibility(View.VISIBLE); - holder.recommendContainer.setVisibility(View.GONE); + if (holder.recommendContainer != null) { + holder.recommendContainer.setVisibility(View.GONE); + } } else { holder.gameProgressbar.setVisibility(View.GONE); holder.gameInfo.setVisibility(View.GONE); diff --git a/app/src/main/java/com/gh/gamecenter/entity/ServerPublishEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/ServerPublishEntity.kt new file mode 100644 index 0000000000..a5c59dcc32 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/entity/ServerPublishEntity.kt @@ -0,0 +1,11 @@ +package com.gh.gamecenter.entity + +import com.google.gson.annotations.SerializedName + +data class ServerPublishEntity( + @SerializedName("prev_server_id") + var prevId: String = "", + @SerializedName("next_server_id") + var nextId: String = "", + var data: List = listOf() +) \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/entity/TestEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/TestEntity.kt index e2b65baadf..ba2c6d674a 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/TestEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/TestEntity.kt @@ -7,6 +7,7 @@ import com.google.gson.annotations.SerializedName class TestEntity : Parcelable { var type: String? = null + var text: String? = null var start: Long = 0 var end: Long = 0 diff --git a/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideAdapter.kt b/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideAdapter.kt index 7d9a5b2401..334f883f09 100644 --- a/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/game/horizontal/GameHorizontalSlideAdapter.kt @@ -56,6 +56,11 @@ class GameHorizontalSlideAdapter(context: Context, holder.binding.game = gameEntity holder.binding.simpleGameContainer.game = gameEntity holder.binding.subject = mSubjectEntity + holder.binding.secondRemark.text = when { + gameEntity.assignRemark.secondLine.isNotEmpty() -> gameEntity.assignRemark.secondLine + "custom" == gameEntity.test?.gameTag && gameEntity.test?.text?.isNotEmpty() == true -> gameEntity.test?.text + else -> gameEntity.test?.type ?: "" + } holder.setRemarkView(mSubjectEntity, gameEntity) holder.itemView.setOnClickListener { val exposureEvent = exposureEventList?.get(position) 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 b8061e8ce6..2084ee2f37 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 @@ -34,6 +34,7 @@ import com.gh.gamecenter.entity.GameColumnCollection; import com.gh.gamecenter.entity.GameDetailEntity; import com.gh.gamecenter.entity.GameDigestEntity; import com.gh.gamecenter.entity.GameEntity; +import com.gh.gamecenter.entity.ServerPublishEntity; import com.gh.gamecenter.entity.GameVideoInfo; import com.gh.gamecenter.entity.HelpCategoryEntity; import com.gh.gamecenter.entity.HelpEntity; @@ -393,7 +394,7 @@ public interface ApiService { * 获取开服表数据 */ @GET("games/servers") - Observable> getGameServers(@Query("filter") String type, @Query("page") int page); + Single getGameServers(@Query("filter") String type); /** * 获取开测表信息 diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServerTimeViewHolder.java b/app/src/main/java/com/gh/gamecenter/servers/GameServerTimeViewHolder.java index c919125fb7..a533cdcadc 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServerTimeViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServerTimeViewHolder.java @@ -21,6 +21,8 @@ public class GameServerTimeViewHolder extends BaseRecyclerViewHolder { public ImageView header; @BindView(R.id.kaifu_item_time_tv) public TextView time; + @BindView(R.id.emptyView) + public View emptyView; public GameServerTimeViewHolder(View itemView) { super(itemView); diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentAdapter.java b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentAdapter.java deleted file mode 100644 index 8d9dd8fa6b..0000000000 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentAdapter.java +++ /dev/null @@ -1,553 +0,0 @@ -package com.gh.gamecenter.servers; - -import android.content.Context; -import android.text.TextUtils; -import android.util.SparseArray; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.Nullable; -import androidx.collection.ArrayMap; -import androidx.recyclerview.widget.RecyclerView; - -import com.gh.base.OnRequestCallBackListener; -import com.gh.common.databind.BindingAdapters; -import com.gh.common.exposure.ExposureEvent; -import com.gh.common.exposure.ExposureSource; -import com.gh.common.exposure.ExposureType; -import com.gh.common.exposure.IExposable; -import com.gh.common.filter.RegionSettingHelper; -import com.gh.common.util.ApkActiveUtils; -import com.gh.common.util.DisplayUtils; -import com.gh.common.util.DownloadItemUtils; -import com.gh.common.util.EntranceUtils; -import com.gh.common.util.ExtensionsKt; -import com.gh.common.util.StringUtils; -import com.gh.common.util.UrlFilterUtils; -import com.gh.common.view.DrawableView; -import com.gh.download.DownloadManager; -import com.gh.gamecenter.GameDetailActivity; -import com.gh.gamecenter.R; -import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; -import com.gh.gamecenter.adapter.viewholder.GameTestViewHolder; -import com.gh.gamecenter.entity.ApkEntity; -import com.gh.gamecenter.entity.GameEntity; -import com.gh.gamecenter.entity.ServerCalendarEntity; -import com.gh.gamecenter.retrofit.Response; -import com.gh.gamecenter.retrofit.RetrofitManager; -import com.lightgame.adapter.BaseRecyclerAdapter; -import com.lightgame.download.DownloadEntity; - - -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 18/08/17. - */ -public class GameServersContentAdapter extends BaseRecyclerAdapter implements IExposable { - - private OnRequestCallBackListener mOnCallBackListener; - - private List mEntityList; - private ArrayMap> mLocationMap; - - private FooterCallback mFooterCallback; - - private String mDay; - private String mHour; - private String mTag; - private String mType; - - private String mEntrance; - - private List mExposureSourceList; - - private int mPage; - - private boolean mIsRemove; - private boolean mIsNetworkError; - private boolean mIsLoaded; - - public static final int VIEW_TYPE_TOP = 0; - public static final int VIEW_TYPE_ITEM = 1; - public static final int VIEW_TYPE_FOOTER = 2; - - private int mRealIndex = 0; - - private SparseArray mExposureEventArray = new SparseArray<>(); - - public GameServersContentAdapter(Context context, - OnRequestCallBackListener onCallBackListener, - FooterCallback footerCallback, - List exposureSources, - String entrance, - String type, - String day, - String hour, - String tag) { - super(context); - - mDay = day; - mHour = hour; - mType = type; - mTag = tag; - mPage = 1; - mEntrance = entrance; - - mOnCallBackListener = onCallBackListener; - mLocationMap = new ArrayMap<>(); - mEntityList = new ArrayList<>(); - - mFooterCallback = footerCallback; - - mExposureSourceList = exposureSources; - addList(); - } - - public void addList() { - mIsLoaded = false; - notifyItemChanged(getItemCount() - 1); - String filterQuery = UrlFilterUtils.getFilterQuery("day", mDay, "hour", mHour, "type", mType, "tag", mTag); - RetrofitManager.getInstance(mContext).getSensitiveApi() - .getGameServers(filterQuery, mPage) - .map(RegionSettingHelper.filterGame) - .map(ApkActiveUtils.filterMapperList) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Response>() { - @Override - public void onResponse(List response) { - for (int i = 0; i < response.size(); i++) { - // 初始化游戏状态 - GameEntity entity = response.get(i); - if (entity.getServerRemaining() != null) { - for (GameEntity remainingGame : entity.getServerRemaining()) { - remainingGame.setSequence(mRealIndex++); - } - } - entity.setSequence(mRealIndex++); - entity.setEntryMap(DownloadManager.getInstance(mContext).getEntryMap(entity.getName())); - ApkActiveUtils.filterHideApk(entity); // 过滤隐藏apk - - GameEntity fixedTopItem = null; - - // 当页面是由启动弹窗过来的第一或第二个页面的时候添加启动弹窗信息 - if (mEntrance.contains(EntranceUtils.ENTRANCE_WELCOME) - && ExtensionsKt.countOccurrences(mEntrance, "+") <= 1) { - entity.setWelcomeDialogInfoIfAvailable(); - } - - // 设置置顶部分 - if (i == 0) { - // 列表顶部,若有设置置顶应用就增加置顶头部 - if (mEntityList.size() == 0 && entity.getFixedTop()) { - fixedTopItem = new GameEntity(); - fixedTopItem.setFixedTopHint(true); - fixedTopItem.setFixedTop(true); - response.add(i, fixedTopItem); - i++; - } - } - - // 归零置顶游戏的开服时间避免找当前开服游戏时找到 - if (entity.getFixedTop()) { - if (entity.getServerEntity() == null) { - ServerCalendarEntity emptyCalendarEntity = new ServerCalendarEntity(); - emptyCalendarEntity.setTime(0); - entity.setServerEntity(emptyCalendarEntity); - } - entity.getServerEntity().setTime(0); - } - - // 设置时间断点 - if (i == 0) { - if (mEntityList.size() == 0) { // 列表page == 0 && position=0 默认添加时间断点 - GameEntity kaiFuTimeEntity = new GameEntity(); - kaiFuTimeEntity.setKaifuTimeHint(entity.getServerEntity().getTime()); - response.add(i, kaiFuTimeEntity); - i++; - } else { // 列表 page > 0 && position=0 与上一页最后一条对比 - GameEntity gameEntity = mEntityList.get(mEntityList.size() - 1); - ServerCalendarEntity serverEntity = gameEntity.getServerEntity(); - ServerCalendarEntity nextServerEntity = entity.getServerEntity(); - if (serverEntity == null || nextServerEntity == null) continue; - - long time = serverEntity.getTime(); - long nextTime = nextServerEntity.getTime(); - if (time != nextTime) { - GameEntity kaiFuTimeEntity = new GameEntity(); - kaiFuTimeEntity.setKaifuTimeHint(nextTime); - response.add(i, kaiFuTimeEntity); - i++; - } - } - } - - if (i < response.size() - 1) { - // 为置顶的项目添加第一个存在时间的游戏的开服时间 - if (fixedTopItem != null && fixedTopItem.getKaifuTimeHint() == null) { - fixedTopItem.setKaifuTimeHint(entity.getServerEntity().getTime()); - } - - ServerCalendarEntity serverEntity = entity.getServerEntity(); - ServerCalendarEntity nextServerEntity = response.get(i + 1).getServerEntity(); - if (serverEntity == null || nextServerEntity == null) continue; - - long time = serverEntity.getTime(); - long nextTime = nextServerEntity.getTime(); - - if (time != nextTime) { - GameEntity kaiFuTimeEntity = new GameEntity(); - kaiFuTimeEntity.setKaifuTimeHint(nextTime); - response.add(i + 1, kaiFuTimeEntity); - i++; - } - } - } - - mEntityList.addAll(response); - notifyItemRangeInserted(mEntityList.size() - response.size(), response.size()); - - if (response.size() < 20) { - mOnCallBackListener.loadDone(null); - mIsRemove = true; - notifyItemChanged(getItemCount() - 1); - } - - initLocationMap(); - - if (mEntityList.size() == 0) { - mOnCallBackListener.loadEmpty(); - } else { - mOnCallBackListener.loadDone(); - } - - mPage++; - mIsLoaded = true; - } - - - @Override - public void onFailure(HttpException e) { - super.onFailure(e); - mIsLoaded = true; - mRealIndex = 0; - if (mEntityList.size() == 0) { - mOnCallBackListener.loadError(); - } else { - mIsNetworkError = true; - notifyItemChanged(getItemCount() - 1); - } - } - }); - } - - private void initLocationMap() { - ArrayList list; - GameEntity gameEntity; - for (int i = 0, size = mEntityList.size(); i < size; i++) { - gameEntity = mEntityList.get(i); - if (gameEntity.getApk().size() != 0) { - for (ApkEntity apkEntity : gameEntity.getApk()) { - list = mLocationMap.get(apkEntity.getPackageName()); - if (list == null) { - list = new ArrayList<>(); - mLocationMap.put(apkEntity.getPackageName(), list); - } - list.add(i); - } - } - } - } - - @Override - public int getItemViewType(int position) { - if (mEntityList.size() == position) { - return VIEW_TYPE_FOOTER; - } - - GameEntity gameEntity = mEntityList.get(position); - if ((gameEntity.getKaifuTimeHint() != null && gameEntity.getKaifuTimeHint() != 0) || gameEntity.getFixedTopHint()) { - return VIEW_TYPE_TOP; - } - return VIEW_TYPE_ITEM; - } - - @Override - public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - if (viewType == VIEW_TYPE_FOOTER) { - return new FooterViewHolder(mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false)); - } else if (viewType == VIEW_TYPE_TOP) { - return new GameServerTimeViewHolder(mLayoutInflater.inflate(R.layout.kaifu_item_time, parent, false)); - } else { - return new GameTestViewHolder(mLayoutInflater.inflate(R.layout.game_test_item, parent, false)); - } - } - - @Override - public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { - if (holder instanceof GameTestViewHolder) { - GameEntity gameEntity = mEntityList.get(position); - GameTestViewHolder viewHolder = (GameTestViewHolder) holder; - - String fixedTop = ""; - if (gameEntity.getServerEntity() != null && - gameEntity.getServerEntity().getTime() == 0) { - fixedTop = "热门开服"; - } - - ArrayList exposureSources = new ArrayList<>(); - mExposureSourceList.addAll(exposureSources); - - // 热门开服与其它的曝光路径区分开 - if (!TextUtils.isEmpty(fixedTop)) { - exposureSources.add(new ExposureSource(mType, fixedTop)); - } else { - String exposureSourceValue = getExposureSourceValue(); - - String displayType; - if ("开服".equals(mType)) { - displayType = "开服"; - } else { - displayType = "开测"; - } - exposureSources.add(new ExposureSource(displayType, exposureSourceValue)); - } - ExposureEvent exposureEvent = ExposureEvent.Companion.createEvent(gameEntity, - mExposureSourceList, - null, - ExposureType.EXPOSURE); - mExposureEventArray.put(position, exposureEvent); - - List serverRemaining = gameEntity.getServerRemaining(); - if (serverRemaining != null) { - viewHolder.extendContainer.setVisibility(View.VISIBLE); - viewHolder.extendContent.setText(("展开剩余" + serverRemaining.size() + "条开服信息")); - viewHolder.extendContent.setOnClickListener(v -> { - mergerRemainingData(gameEntity, position); - notifyItemChanged(position); - }); - } else { - viewHolder.extendContainer.setVisibility(View.GONE); - } - - if (position != 0 && getItemViewType(position - 1) == VIEW_TYPE_TOP) { - viewHolder.contentContainer.setPadding( - DisplayUtils.dip2px(16), DisplayUtils.dip2px(4), - DisplayUtils.dip2px(18), DisplayUtils.dip2px(8)); - } else if (getItemViewType(position + 1) == VIEW_TYPE_TOP) { - viewHolder.contentContainer.setPadding( - DisplayUtils.dip2px(16), DisplayUtils.dip2px(8), - DisplayUtils.dip2px(18), DisplayUtils.dip2px(16)); - } else { - viewHolder.contentContainer.setPadding( - DisplayUtils.dip2px(16), DisplayUtils.dip2px(8), - DisplayUtils.dip2px(18), DisplayUtils.dip2px(8)); - } - initGameTestViewHolder(gameEntity, viewHolder); - } else if (holder instanceof GameServerTimeViewHolder) { - GameEntity gameEntity = mEntityList.get(position); - if (gameEntity.getFixedTopHint()) { - ((GameServerTimeViewHolder) holder).header.setImageResource(R.drawable.ic_kaifu_hot); - ((GameServerTimeViewHolder) holder).time.setText("热门开服"); - } else { - SimpleDateFormat dateFm = new SimpleDateFormat("yyyy-MM-dd (EEEE) HH:mm", Locale.CHINA); - ((GameServerTimeViewHolder) holder).header.setImageResource(R.drawable.kaifu_time_icon); - ((GameServerTimeViewHolder) holder).time.setText(dateFm.format(gameEntity.getKaifuTimeHint() * 1000)); - } - } else if (holder instanceof FooterViewHolder) { - FooterViewHolder viewHolder = (FooterViewHolder) holder; - initFooterViewHolder(viewHolder); - } - } - - @Override - public int getItemCount() { - if (mEntityList.size() == 0) { - return 0; - } - return mEntityList.size() + 1; - } - - private String getExposureSourceValue() { - StringBuilder sb = new StringBuilder(); - if ("开服".equals(mType)) { - if ("today".equals(mDay)) { - sb.append("今日"); - sb.append(mType); - } else if ("after".equals(mDay)) { - sb.append("后续"); - sb.append(mType); - } else if ("tomorrow".equals(mDay)) { - sb.append("明日"); - sb.append(mType); - } else { - sb.append("全部"); - sb.append(mType); - } - if (mHour != null) { - sb.append(mHour); - sb.append("时"); - } - if (mTag != null) { - sb.append("+"); - sb.append(mTag.replace("-", "+")); - } - } else { - if ("today".equals(mDay)) { - sb.append("今日开测"); - } else if ("after".equals(mDay)) { - sb.append("后续开测"); - } else if ("tomorrow".equals(mDay)) { - sb.append("明日开测"); - } else { - sb.append("全部开测"); - } - sb.append("+"); - if ("开测".equals(mType)) { - sb.append("全部"); - } else { - sb.append(mType); - } - } - return sb.toString(); - } - - void initGameTestViewHolder(final GameEntity gameEntity, final GameTestViewHolder viewHolder) { - viewHolder.gameName.setText(gameEntity.getName()); - BindingAdapters.setGame(viewHolder.gameThumb, gameEntity); - - if (gameEntity.getServerEntity() == null || TextUtils.isEmpty(gameEntity.getServerEntity().getRemark())) { - viewHolder.gameTestTime.setVisibility(View.GONE); - } else { - viewHolder.gameTestTime.setVisibility(View.VISIBLE); - viewHolder.gameTestTime.setText(gameEntity.getServerEntity().getRemark()); - viewHolder.gameTestType.setBackground(DrawableView.getServerDrawableBySource(R.color.tag_orange)); - } - - if (gameEntity.getFixedTop()) { - String tag = "今日开服"; - viewHolder.gameTestType.setVisibility(View.VISIBLE); - viewHolder.gameTestType.setText(tag); - viewHolder.gameTestType.setBackground(DrawableView.getServerDrawableBySource(R.color.tag_yellow)); - } else { - String type = gameEntity.getServerEntity().getType(); - if (TextUtils.isEmpty(type)) { - viewHolder.gameTestType.setVisibility(View.GONE); - } else if (("不删档内测".equals(type) || "删档内测".equals(type) || "公测".equals(type)) - && TextUtils.isEmpty(gameEntity.getServerEntity().getNote())) { - if (!TextUtils.isEmpty(gameEntity.getServerEntity().getNote())) { - String testType; - if ("公测".equals(type)) { - testType = gameEntity.getServerEntity().getType() + ":" + gameEntity.getServerEntity().getNote(); - } else { - testType = gameEntity.getServerEntity().getNote(); - } - viewHolder.gameTestType.setText(testType); - viewHolder.gameTestType.setBackground(DrawableView.getServerDrawableBySource(R.color.tag_yellow)); - viewHolder.gameTestType.setVisibility(View.VISIBLE); - } else { - viewHolder.gameTestType.setVisibility(View.GONE); - } - } else { - viewHolder.gameTestType.setText(gameEntity.getServerEntity().getNote()); - viewHolder.gameTestType.setBackground(DrawableView.getServerDrawableBySource(R.color.tag_yellow)); - viewHolder.gameTestType.setVisibility(View.VISIBLE); - } - } - - gameEntity.getApk(); - if (gameEntity.getApk().isEmpty()) { - viewHolder.gameDes.setText(gameEntity.getBrief()); - } else { - viewHolder.gameDes.setText(String.format("%s %s", gameEntity.getApk().get(0).getSize(), gameEntity.getBrief())); - } - - DownloadItemUtils.setOnClickListener(mContext, - viewHolder.gameDownloadBtn, gameEntity, viewHolder.getAdapterPosition(), GameServersContentAdapter.this, - StringUtils.buildString(mEntrance, "+(开服表[", String.valueOf(viewHolder.getAdapterPosition()), "])"), - StringUtils.buildString("开服表:", gameEntity.getName()), - mExposureEventArray.get(viewHolder.getAdapterPosition())); - - DownloadItemUtils.updateItem(mContext, gameEntity, viewHolder, true); - - if (gameEntity.getFixedTop()) { - viewHolder.itemView.setOnClickListener(v -> - GameDetailActivity.startGameDetailActivity(mContext, - gameEntity, - StringUtils.buildString(mEntrance, "+(开服表[", String.valueOf(viewHolder.getAdapterPosition()), "])"), - mExposureEventArray.get(viewHolder.getAdapterPosition()))); - } else { - viewHolder.itemView.setOnClickListener(v -> { - GameDetailActivity.startGameDetailActivity(mContext, gameEntity, - StringUtils.buildString(mEntrance, "+(开服表[", String.valueOf(viewHolder.getAdapterPosition()), "])"), - mExposureEventArray.get(viewHolder.getAdapterPosition())); - - }); - } - } - - private void mergerRemainingData(GameEntity entity, int position) { - List serverRemaining = entity.getServerRemaining(); - if (serverRemaining == null) return; - ArrayMap entryMap = entity.getEntryMap(); - if (entryMap.size() > 0) { - for (GameEntity gameEntity : serverRemaining) gameEntity.setEntryMap(entryMap); - } - mEntityList.addAll(position + 1, serverRemaining); - entity.setServerRemaining(null); - initLocationMap(); - notifyItemRangeInserted(position + 1, serverRemaining.size()); - } - - private void initFooterViewHolder(FooterViewHolder viewHolder) { - viewHolder.initFooterViewHolder(!mIsLoaded, mIsNetworkError, mIsRemove, R.string.load_over_with_click_hint, v -> { - if (mIsNetworkError) { - mIsNetworkError = false; - notifyItemChanged(getItemCount() - 1); - addList(); - } else { - mFooterCallback.onClick(); - } - }); - } - - public boolean isLoaded() { - return mIsLoaded; - } - - public boolean isRemove() { - return mIsRemove; - } - - public List getDataList() { - return mEntityList; - } - - public ArrayMap> getLocationMap() { - return mLocationMap; - } - - @Nullable - @Override - public ExposureEvent getEventByPosition(int pos) { - return mExposureEventArray.get(pos); - } - - @Nullable - @Override - public List getEventListByPosition(int pos) { - return null; - } - - interface FooterCallback { - void onClick(); - } -} diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentAdapter.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentAdapter.kt new file mode 100644 index 0000000000..45ad2b3981 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentAdapter.kt @@ -0,0 +1,382 @@ +package com.gh.gamecenter.servers + +import android.content.Context +import android.text.TextUtils +import android.util.SparseArray +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.gh.common.databind.BindingAdapters +import com.gh.common.exposure.ExposureEvent +import com.gh.common.exposure.ExposureEvent.Companion.createEvent +import com.gh.common.exposure.ExposureSource +import com.gh.common.exposure.ExposureType +import com.gh.common.exposure.IExposable +import com.gh.common.util.DisplayUtils +import com.gh.common.util.DownloadItemUtils +import com.gh.common.util.StringUtils +import com.gh.common.util.toColor +import com.gh.common.view.DrawableView.getServerDrawableBySource +import com.gh.gamecenter.GameDetailActivity +import com.gh.gamecenter.R +import com.gh.gamecenter.adapter.viewholder.FooterViewHolder +import com.gh.gamecenter.adapter.viewholder.GameTestViewHolder +import com.gh.gamecenter.baselist.LoadStatus +import com.gh.gamecenter.entity.GameEntity +import com.lightgame.adapter.BaseRecyclerAdapter +import java.text.SimpleDateFormat +import java.util.* + +class GameServersContentAdapter(context: Context, + private val mViewModel: GameServersContentViewModel, + private val mEntrance: String) + : BaseRecyclerAdapter(context), IExposable { + + var mDataList = arrayListOf() + private val mExposureEventArray: SparseArray = SparseArray() + private val mExposureSourceList = arrayListOf() + private var mPrevIsOver = false + private var mPrevIsNetworkError = false + private var mPrevIsLoading = false + private var mNextIsOver = false + private var mNextIsNetworkError = false + private var mNextIsLoading = false + private var mIsShowPullDownTip = false + + fun submitList(updateData: ArrayList, isShowPullDownTip: Boolean, isDown: Boolean = false, downSize: Int = 0) { + mDataList = updateData + mIsShowPullDownTip = isShowPullDownTip + if (isDown) { + notifyItemRangeInserted(0, downSize) + } else { + notifyDataSetChanged() + } + } + + fun resetStatus() { + mPrevIsOver = false + mPrevIsNetworkError = false + mPrevIsLoading = false + mNextIsOver = false + mNextIsNetworkError = false + mNextIsLoading = false + } + + fun loadChange(pair: Pair) { + if (pair.first == "down") { + when (pair.second) { + LoadStatus.INIT -> { + mPrevIsLoading = true + mPrevIsOver = false + mPrevIsNetworkError = false + } + LoadStatus.INIT_OVER -> { + mPrevIsLoading = false + mPrevIsOver = true + mPrevIsNetworkError = false + } + LoadStatus.INIT_LOADED, LoadStatus.INIT_EMPTY -> { + mPrevIsLoading = false + mPrevIsOver = false + mPrevIsNetworkError = false + } + LoadStatus.INIT_FAILED -> { + mPrevIsLoading = false + mPrevIsOver = false + mPrevIsNetworkError = true + } + else -> {} + } + notifyItemChanged(0) + } else { + when (pair.second) { + LoadStatus.INIT -> { + mNextIsLoading = true + mNextIsOver = false + mNextIsNetworkError = false + } + LoadStatus.INIT_OVER -> { + mNextIsLoading = false + mNextIsOver = true + mNextIsNetworkError = false + } + LoadStatus.INIT_LOADED, LoadStatus.INIT_EMPTY -> { + mNextIsLoading = false + mNextIsOver = false + mNextIsNetworkError = false + } + LoadStatus.INIT_FAILED -> { + mNextIsLoading = false + mNextIsOver = false + mNextIsNetworkError = true + } + else -> {} + } + notifyItemChanged(itemCount - 1) + } + } + + override fun getItemCount() = if (mDataList.size == 0) 0 else mDataList.size + 2 + + override fun getItemViewType(position: Int): Int { + if (position == mDataList.size + 1 || position == 0) { + return VIEW_TYPE_FOOTER + } + + val gameEntity = mDataList[position - 1] + return if (gameEntity.kaifuTimeHint != null && gameEntity.kaifuTimeHint != 0L || gameEntity.fixedTopHint!!) { + VIEW_TYPE_TOP + } else VIEW_TYPE_ITEM + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return when (viewType) { + VIEW_TYPE_FOOTER -> FooterViewHolder(mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false)) + VIEW_TYPE_TOP -> GameServerTimeViewHolder(mLayoutInflater.inflate(R.layout.kaifu_item_time, parent, false)) + else -> GameTestViewHolder(mLayoutInflater.inflate(R.layout.game_test_item, parent, false)) + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is GameTestViewHolder -> { + val gameEntity = mDataList[position - 1] + + var fixedTop = "" + if (gameEntity.serverEntity != null && gameEntity.serverEntity!!.getTime() == 0L) { + fixedTop = "热门开服" + } + + val exposureSources = ArrayList() + mExposureSourceList.addAll(exposureSources) + + // 热门开服与其它的曝光路径区分开 + if (!TextUtils.isEmpty(fixedTop)) { + exposureSources.add(ExposureSource("开服", fixedTop)) + } else { + val exposureSourceValue: String = getExposureSourceValue() + exposureSources.add(ExposureSource("开服", exposureSourceValue)) + } + val exposureEvent = createEvent(gameEntity, + mExposureSourceList, + null, + ExposureType.EXPOSURE) + mExposureEventArray.put(position, exposureEvent) + + val serverRemaining = gameEntity.serverRemaining + if (serverRemaining != null) { + holder.extendContainer.visibility = View.VISIBLE + holder.extendContent.text = "展开剩余" + serverRemaining.size + "条开服信息" + holder.extendContent.setOnClickListener { + mViewModel.mergerRemainingData(gameEntity, position) + notifyItemChanged(position) + } + } else { + holder.extendContainer.visibility = View.GONE + } + + if (position != 0 && getItemViewType(position - 1) == VIEW_TYPE_TOP) { + holder.contentContainer.setPadding( + DisplayUtils.dip2px(16f), DisplayUtils.dip2px(4f), + DisplayUtils.dip2px(18f), DisplayUtils.dip2px(8f)) + } else if (getItemViewType(position + 1) == VIEW_TYPE_TOP) { + holder.contentContainer.setPadding( + DisplayUtils.dip2px(16f), DisplayUtils.dip2px(8f), + DisplayUtils.dip2px(18f), DisplayUtils.dip2px(16f)) + } else { + holder.contentContainer.setPadding( + DisplayUtils.dip2px(16f), DisplayUtils.dip2px(8f), + DisplayUtils.dip2px(18f), DisplayUtils.dip2px(8f)) + } + initGameTestViewHolder(gameEntity, holder) + } + + is GameServerTimeViewHolder -> { + if (mIsShowPullDownTip && position == 1) { + holder.emptyView.visibility = View.VISIBLE + } else { + holder.emptyView.visibility = View.GONE + } + val gameEntity = mDataList[position - 1] + if (gameEntity.fixedTopHint!!) { + holder.header.setImageResource(R.drawable.ic_kaifu_hot) + holder.time.text = "热门开服" + } else { + val dateFm = SimpleDateFormat("yyyy-MM-dd (EEEE) HH:mm", Locale.CHINA) + holder.header.setImageResource(R.drawable.kaifu_time_icon) + holder.time.text = dateFm.format(gameEntity.kaifuTimeHint!! * 1000) + } + } + + is FooterViewHolder -> { + holder.run { + itemView.setBackgroundColor(R.color.text_F5F5F5.toColor()) + if (position == 0) { + when { + mPrevIsNetworkError -> { + loading.visibility = View.GONE + hint.setText(R.string.loading_failed_retry) + itemView.isClickable = true +// itemView.setOnClickListener(onClickListener) + } + mPrevIsOver -> { + loading.visibility = View.GONE + hint.setText(R.string.load_over_hint) + itemView.isClickable = true +// itemView.setOnClickListener(onClickListener) + } + else -> { + loading.visibility = View.VISIBLE + hint.setText(R.string.loading) + itemView.isClickable = false + } + } + } else { + when { + mNextIsNetworkError -> { + loading.visibility = View.GONE + hint.setText(R.string.loading_failed_retry) + itemView.isClickable = true +// itemView.setOnClickListener(onClickListener) + } + mNextIsOver -> { + loading.visibility = View.GONE + hint.setText(R.string.load_over_hint) + itemView.isClickable = true +// itemView.setOnClickListener(onClickListener) + } + else -> { + loading.visibility = View.VISIBLE + hint.setText(R.string.loading) + itemView.isClickable = false + } + } + } + } + } + } + } + + private fun initGameTestViewHolder(gameEntity: GameEntity, viewHolder: GameTestViewHolder) { + viewHolder.gameName.text = gameEntity.name + BindingAdapters.setGame(viewHolder.gameThumb, gameEntity) + + if (gameEntity.serverEntity == null || TextUtils.isEmpty(gameEntity.serverEntity!!.remark)) { + viewHolder.gameTestTime.visibility = View.GONE + } else { + viewHolder.gameTestTime.visibility = View.VISIBLE + viewHolder.gameTestTime.text = gameEntity.serverEntity!!.remark + viewHolder.gameTestType.background = getServerDrawableBySource(R.color.tag_orange) + } + + if (gameEntity.fixedTop!!) { + val tag = "今日开服" + viewHolder.gameTestType.visibility = View.VISIBLE + viewHolder.gameTestType.text = tag + viewHolder.gameTestType.background = getServerDrawableBySource(R.color.tag_yellow) + } else { + val type = gameEntity.serverEntity!!.type + if (TextUtils.isEmpty(type)) { + viewHolder.gameTestType.visibility = View.GONE + } else if (("不删档内测" == type || "删档内测" == type || "公测" == type) + && TextUtils.isEmpty(gameEntity.serverEntity!!.getNote())) { + if (!TextUtils.isEmpty(gameEntity.serverEntity!!.getNote())) { + val testType: String? = if ("公测" == type) { + gameEntity.serverEntity!!.type + ":" + gameEntity.serverEntity!!.getNote() + } else { + gameEntity.serverEntity!!.getNote() + } + viewHolder.gameTestType.text = testType + viewHolder.gameTestType.background = getServerDrawableBySource(R.color.tag_yellow) + viewHolder.gameTestType.visibility = View.VISIBLE + } else { + viewHolder.gameTestType.visibility = View.GONE + } + } else { + viewHolder.gameTestType.text = gameEntity.serverEntity!!.getNote() + viewHolder.gameTestType.background = getServerDrawableBySource(R.color.tag_yellow) + viewHolder.gameTestType.visibility = View.VISIBLE + } + } + + gameEntity.getApk() + if (gameEntity.getApk().isEmpty()) { + viewHolder.gameDes.text = gameEntity.brief + } else { + viewHolder.gameDes.text = String.format("%s %s", gameEntity.getApk()[0].size, gameEntity.brief) + } + + DownloadItemUtils.setOnClickListener(mContext, + viewHolder.gameDownloadBtn, gameEntity, viewHolder.adapterPosition, this@GameServersContentAdapter, + StringUtils.buildString(mEntrance, "+(开服表[", viewHolder.adapterPosition.toString(), "])"), + StringUtils.buildString("开服表:", gameEntity.name), + mExposureEventArray.get(viewHolder.adapterPosition)) + + DownloadItemUtils.updateItem(mContext, gameEntity, viewHolder, true) + + if (gameEntity.fixedTop!!) { + viewHolder.itemView.setOnClickListener { + GameDetailActivity.startGameDetailActivity(mContext, + gameEntity, + StringUtils.buildString(mEntrance, "+(开服表[", viewHolder.adapterPosition.toString(), "])"), + mExposureEventArray.get(viewHolder.adapterPosition)) + } + } else { + viewHolder.itemView.setOnClickListener { + GameDetailActivity.startGameDetailActivity(mContext, gameEntity, + StringUtils.buildString(mEntrance, "+(开服表[", viewHolder.adapterPosition.toString(), "])"), + mExposureEventArray.get(viewHolder.adapterPosition)) + } + } + } + + private fun getExposureSourceValue(): String { + val sb = StringBuilder() + when (mViewModel.day) { + "today" -> { + sb.append("今日") + } + "after" -> { + sb.append("后续") + } + "tomorrow" -> { + sb.append("明日") + } + else -> { + sb.append("全部") + } + } + sb.append("开服") + if (mViewModel.hour != null) { + sb.append(mViewModel.hour) + sb.append("时") + } + if (mViewModel.tags != null) { + sb.append("+") + sb.append(mViewModel.tags!!.replace("-", "+")) + } + return sb.toString() + } + + fun isPrevLoading() = mPrevIsLoading + + fun isPrevOver() = mPrevIsOver + + fun isNextLoading() = mNextIsLoading + + fun isNextOver() = mNextIsOver + + override fun getEventByPosition(pos: Int): ExposureEvent? { + return mExposureEventArray[pos] + } + + override fun getEventListByPosition(pos: Int): List? { + return null + } + + companion object { + const val VIEW_TYPE_TOP = 0 + const val VIEW_TYPE_ITEM = 1 + const val VIEW_TYPE_FOOTER = 2 + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt index 0e0ba38cf5..1e118f5361 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt @@ -3,6 +3,7 @@ package com.gh.gamecenter.servers import android.os.Bundle import android.view.View import android.view.ViewGroup +import android.view.ViewTreeObserver import android.widget.RelativeLayout import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.LinearLayoutManager @@ -10,24 +11,19 @@ import androidx.recyclerview.widget.RecyclerView import androidx.viewpager.widget.ViewPager import com.gh.base.fragment.BaseFragment import com.gh.common.exposure.ExposureListener -import com.gh.common.exposure.ExposureSource -import com.gh.common.util.DialogUtils -import com.gh.common.util.DownloadItemUtils -import com.gh.common.util.EntranceUtils +import com.gh.common.util.* import com.gh.common.util.MtaHelper.onEvent import com.gh.common.xapk.XapkInstaller import com.gh.common.xapk.XapkUnzipStatus import com.gh.download.DownloadManager import com.gh.gamecenter.R +import com.gh.gamecenter.baselist.LoadStatus import com.gh.gamecenter.databinding.FragmentKaifuContentBinding import com.gh.gamecenter.eventbus.EBDownloadStatus -import com.gh.gamecenter.servers.GameServersContentAdapter.FooterCallback import com.lightgame.download.DataWatcher import com.lightgame.download.DownloadEntity import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode -import java.text.SimpleDateFormat -import java.util.* /** * 开服表内容 fragment @@ -38,11 +34,10 @@ class GameServersContentFragment : BaseFragment() { private var mLayoutManager: LinearLayoutManager? = null private var mExposureListener: ExposureListener? = null private var mLlParams: RelativeLayout.LayoutParams? = null - - private var mDay: String? = null - private var mHour: String? = null - private var mTags: String? = null - private var mType: String? = null + private var mViewModel: GameServersContentViewModel? = null + private var mShowPullDownTipFlag = true + private var mHidePullDownTipFlag = true + private var mIsRefresh = false private var mIsRefreshDownload = true @@ -50,10 +45,10 @@ class GameServersContentFragment : BaseFragment() { private val dataWatcher: DataWatcher = object : DataWatcher() { override fun onDataChanged(downloadEntity: DownloadEntity) { - val locationList = mAdapter?.locationMap?.get(downloadEntity.packageName) + val locationList = mViewModel?.locationMap?.get(downloadEntity.packageName) if (locationList != null && mIsRefreshDownload) { for (location in locationList) { - mAdapter?.dataList?.get(location)?.let { gameEntity -> + mViewModel?.listLiveData?.value?.second?.safelyGetInRelease(location)?.let { gameEntity -> DownloadItemUtils.processDate(context, gameEntity, downloadEntity, mAdapter, location) } } @@ -78,86 +73,112 @@ class GameServersContentFragment : BaseFragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mType = arguments?.getString(EntranceUtils.KEY_TYPE, "开服") mLlParams = RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT) (mBinding?.recyclerView?.itemAnimator as DefaultItemAnimator?)?.supportsChangeAnimations = false mBinding?.recyclerView?.layoutManager = LinearLayoutManager(requireContext()).apply { mLayoutManager = this } - mAdapter = GameServersContentAdapter( - requireContext(), - this, - FooterCallback { scrollToTop() }, - arrayListOf().apply { - arguments?.getParcelable(EntranceUtils.KEY_EXPOSURE_SOURCE)?.let { - add(it) - } - add(ExposureSource("开服表", "")) - }, - mEntrance, - mType, - mDay, - mHour, - mTags) + mViewModel = viewModelProvider() +// mViewModel?.type = arguments?.getString(EntranceUtils.KEY_TYPE, "开服") + mViewModel?.listLiveData?.observe(this, androidx.lifecycle.Observer { + if (it.first == "down") { + mAdapter?.submitList(it.second, isShowPullDownTip = false, isDown = true, downSize = it.third) + } else { + mAdapter?.submitList(it.second, mShowPullDownTipFlag || mBinding?.pullDownTip?.visibility == View.VISIBLE) + } + showPullDownTip() + if (mIsRefresh) { + mIsRefresh = false + handleHeaderView(it.second[0].kaifuTimeHint ?: 0L) + } + }) + mViewModel?.loadStatusLiveData?.observe(this, androidx.lifecycle.Observer { + when (it.second) { + LoadStatus.INIT_LOADED, LoadStatus.INIT_OVER -> loadDone() + LoadStatus.INIT_EMPTY -> loadEmpty() + LoadStatus.INIT_FAILED -> loadError() + else -> {} + } + mAdapter?.loadChange(it) + }) + mAdapter = GameServersContentAdapter(requireContext(), mViewModel!!, mEntrance) mExposureListener = ExposureListener(this, mAdapter!!) mBinding?.recyclerView?.addOnScrollListener(mExposureListener!!) mBinding?.recyclerView?.adapter = mAdapter mBinding?.recyclerView?.addOnScrollListener(object : RecyclerView.OnScrollListener() { override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { super.onScrollStateChanged(recyclerView, newState) + mBinding?.recyclerView?.run { + if (translationY != 0F) { + animate().translationY(0F).setDuration(200).start() + } + } + + if (mLayoutManager?.findFirstVisibleItemPosition() == 0 + && newState == RecyclerView.SCROLL_STATE_IDLE + && !mAdapter!!.isPrevOver() + && !mAdapter!!.isPrevLoading()) { + mViewModel?.run { + mAdapter?.loadChange(Pair("down", LoadStatus.INIT)) + loadData(action = "down") + } + } if (mLayoutManager?.findLastVisibleItemPosition() == mAdapter!!.itemCount - 1 && newState == RecyclerView.SCROLL_STATE_IDLE - && !mAdapter!!.isRemove - && mAdapter!!.isLoaded) { - mAdapter?.addList() + && !mAdapter!!.isNextOver() + && !mAdapter!!.isNextLoading()) { + mViewModel?.run { + loadData(action = "up") + } } mIsRefreshDownload = newState == RecyclerView.SCROLL_STATE_IDLE } override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) + if (dy != 0) hidePullDownTip() val position = mLayoutManager?.findFirstVisibleItemPosition() ?: 0 if (RecyclerView.NO_POSITION == position) return - val dataList = mAdapter?.dataList + val dataList = mViewModel?.listLiveData?.value?.second val gameEntity = dataList?.get(position + 1) val kaifuTimeHint = gameEntity?.kaifuTimeHint // 悬挂的文案 - val timeGameEntity = dataList?.get(position) - val fixedTopHint = timeGameEntity?.fixedTop ?: false - if (fixedTopHint) { - mBinding?.kaifuTimeContainer?.kaifuItemTimeTv - mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.text = "热门开服" - mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.tag = timeGameEntity?.kaifuTimeHint - mBinding?.kaifuTimeContainer?.kaifuItemHeader?.setImageResource(R.drawable.ic_kaifu_hot) - } else { - val timeHint = timeGameEntity?.kaifuTimeHint - val dateFm = SimpleDateFormat("yyyy-MM-dd (EEEE) HH:mm", Locale.CHINA) - if (timeHint == null || timeHint == 0L) { - val serverEntity = timeGameEntity?.serverEntity - if (serverEntity != null) { - mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.text = dateFm.format(serverEntity.getTime() * 1000) - mBinding?.kaifuTimeContainer?.kaifuItemHeader?.setImageResource(R.drawable.kaifu_time_icon) - mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.tag = serverEntity.getTime() - } - } else { - mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.text = dateFm.format(timeHint * 1000) - mBinding?.kaifuTimeContainer?.kaifuItemHeader?.setImageResource(R.drawable.kaifu_time_icon) - mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.tag = timeHint - } - } - - // 悬挂界面移动 - if (kaifuTimeHint != null && kaifuTimeHint != 0L) { - val buttom = mLayoutManager?.findViewByPosition(position)?.bottom ?: 0 - if (buttom <= mBinding?.kaifuTimeContainer?.kaifuItemTime?.height ?: 0) { - mLlParams?.topMargin = buttom - (mBinding?.kaifuTimeContainer?.kaifuItemTime?.height - ?: 0) - } else { - mLlParams?.topMargin = 0 - } - } else { - mLlParams?.topMargin = 0 - } - mBinding?.kaifuTimeContainer?.kaifuItemTime?.layoutParams = mLlParams +// val timeGameEntity = dataList?.get(position) +// val fixedTopHint = timeGameEntity?.fixedTop ?: false +// if (fixedTopHint) { +// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv +// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.text = "热门开服" +// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.tag = timeGameEntity?.kaifuTimeHint +// mBinding?.kaifuTimeContainer?.kaifuItemHeader?.setImageResource(R.drawable.ic_kaifu_hot) +// } else { +// val timeHint = timeGameEntity?.kaifuTimeHint +// val dateFm = SimpleDateFormat("yyyy-MM-dd (EEEE) HH:mm", Locale.CHINA) +// if (timeHint == null || timeHint == 0L) { +// val serverEntity = timeGameEntity?.serverEntity +// if (serverEntity != null) { +// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.text = dateFm.format(serverEntity.getTime() * 1000) +// mBinding?.kaifuTimeContainer?.kaifuItemHeader?.setImageResource(R.drawable.kaifu_time_icon) +// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.tag = serverEntity.getTime() +// } +// } else { +// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.text = dateFm.format(timeHint * 1000) +// mBinding?.kaifuTimeContainer?.kaifuItemHeader?.setImageResource(R.drawable.kaifu_time_icon) +// mBinding?.kaifuTimeContainer?.kaifuItemTimeTv?.tag = timeHint +// } +// } +// +// // 悬挂界面移动 +// if (kaifuTimeHint != null && kaifuTimeHint != 0L) { +// val buttom = mLayoutManager?.findViewByPosition(position)?.bottom ?: 0 +// if (buttom <= mBinding?.kaifuTimeContainer?.kaifuItemTime?.height ?: 0) { +// mLlParams?.topMargin = buttom - (mBinding?.kaifuTimeContainer?.kaifuItemTime?.height +// ?: 0) +// } else { +// mLlParams?.topMargin = 0 +// } +// } else { +// mLlParams?.topMargin = 0 +// } +// mBinding?.kaifuTimeContainer?.kaifuItemTime?.layoutParams = mLlParams } }) mBinding?.removeFilter?.setOnClickListener { @@ -170,14 +191,89 @@ class GameServersContentFragment : BaseFragment() { mBinding?.noConnectionContainer?.root?.setOnClickListener { onRefreshPage() } + + mBinding?.recyclerView?.viewTreeObserver?.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + mLayoutManager?.scrollToPosition(1) + if (mLayoutManager?.findFirstVisibleItemPosition() == 1) { + mBinding?.recyclerView?.viewTreeObserver?.removeOnGlobalLayoutListener(this) + } + } + }) + } + + + private fun handleHeaderView(responseTime: Long) { + mBinding?.run { + recyclerView.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + val canScrollVertically = recyclerView.canScrollVertically(-1) + if (mViewModel?.hour != null) { + val responseHour = TimeUtils.getFormatTime(responseTime, "HH") + val tempHour = mViewModel!!.hour!!.toInt() + val requestHour = if (tempHour >= 10) tempHour.toString() else "0${tempHour}" + if (responseHour != requestHour) { + noMatchView.translationY = 0F + noMatchView.visibility = View.VISIBLE + recyclerView.translationY = if (canScrollVertically) 40F.dip2px().toFloat() else -(8F.dip2px().toFloat()) + postDelayedRunnable({ + tryCatchInRelease { + noMatchView.animate().translationY(-(40F.dip2px().toFloat())).setDuration(200).start() + recyclerView.animate().translationY(recyclerView.translationY - 40F.dip2px().toFloat()).setDuration(200).start() + } + }, 2000) + } else { + if (!canScrollVertically) { + recyclerView.translationY = -(48F.dip2px().toFloat()) + } + } + } else { + if (!canScrollVertically) { + recyclerView.translationY = -(48F.dip2px().toFloat()) + } + } + recyclerView.viewTreeObserver.removeOnGlobalLayoutListener(this) + } + }) + } + } + + private fun showPullDownTip() { + if (mShowPullDownTipFlag) { + postDelayedRunnable({ + tryCatchInRelease { + mBinding?.run { + mShowPullDownTipFlag = false + pullDownTip.translationY = -(8F.dip2px().toFloat()) + pullDownTip.visibility = View.VISIBLE + pullDownTip.animate().translationY(0F).setDuration(500).start() + } + } + }, 500) + } + } + + private fun hidePullDownTip() { + mBinding?.run { + if (pullDownTip.visibility == View.VISIBLE && mHidePullDownTipFlag) { + mHidePullDownTipFlag = false + pullDownTip.animate() + .translationY(-(8F.dip2px().toFloat())) + .setDuration(500) + .withEndAction { pullDownTip.visibility = View.GONE } + .start() + } + } } fun filterData(day: String?, hour: String?, type: String?, tags: String?) { - mDay = day - mHour = hour - mType = type - mTags = tags - onRefreshPage() + mViewModel?.run { + this.day = day + this.hour = hour +// this.type = type + this.tags = tags + onRefreshPage() + } } fun vpScrollState(status: Int) { @@ -202,43 +298,26 @@ class GameServersContentFragment : BaseFragment() { } private fun onRefreshPage() { + mIsRefresh = true + mAdapter?.resetStatus() mBinding?.loadingContainer?.reuseLlLoading?.visibility = View.VISIBLE mBinding?.noConnectionContainer?.reuseNoConnection?.visibility = View.GONE mBinding?.reuseNoneData?.visibility = View.GONE mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.GONE - mAdapter = GameServersContentAdapter( - context, - this, - FooterCallback { scrollToTop() }, - arrayListOf().apply { - arguments?.getParcelable(EntranceUtils.KEY_EXPOSURE_SOURCE)?.let { - add(it) - } - add(ExposureSource("开服表", "")) - }, - mEntrance, - mType, - mDay, - mHour, - mTags) - mBinding?.recyclerView?.adapter = mAdapter - mBinding?.recyclerView?.removeOnScrollListener(mExposureListener!!) - mExposureListener = ExposureListener(this, mAdapter!!) - mBinding?.recyclerView?.addOnScrollListener(mExposureListener!!) + mBinding?.recyclerView?.visibility = View.GONE + mLayoutManager?.scrollToPositionWithOffset(1, 0) + mViewModel?.loadData(true) } // 下载被删除事件 @Subscribe(threadMode = ThreadMode.MAIN) fun onEventMainThread(status: EBDownloadStatus) { + DownloadManager.getInstance(context).removePlatform(status.name, status.platform) if ("delete" == status.status) { - DownloadManager.getInstance(context).removePlatform(status.name, status.platform) - val locationList = mAdapter?.locationMap?.get(status.packageName) - if (locationList != null) { - for (location in locationList) { - mAdapter?.dataList?.get(location)?.let {gameEntity -> - gameEntity.getEntryMap().remove(status.platform) - mAdapter?.notifyItemChanged(location) - } + mViewModel?.locationMap?.get(status.packageName)?.let { + for (location in it) { + mViewModel?.listLiveData?.value?.second?.safelyGetInRelease(location)?.getEntryMap()?.remove(status.platform) + mAdapter?.notifyItemChanged(location) } } } @@ -246,10 +325,12 @@ class GameServersContentFragment : BaseFragment() { override fun loadDone() { super.loadDone() - mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.VISIBLE + mBinding?.recyclerView?.visibility = View.VISIBLE + mBinding?.kaifuTimeContainer?.kaifuItemTime?.visibility = View.GONE mBinding?.noConnectionContainer?.reuseNoConnection?.visibility = View.GONE mBinding?.reuseNoneData?.visibility = View.GONE mBinding?.loadingContainer?.reuseLlLoading?.visibility = View.GONE +// mBinding?.refreshLayout?.finishRefresh() } override fun loadError() { diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt new file mode 100644 index 0000000000..e3067a409e --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt @@ -0,0 +1,319 @@ +package com.gh.gamecenter.servers + +import android.annotation.SuppressLint +import android.app.Application +import androidx.collection.ArrayMap +import androidx.collection.arrayMapOf +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.MutableLiveData +import com.gh.common.util.ApkActiveUtils +import com.gh.common.util.EntranceUtils +import com.gh.common.util.UrlFilterUtils +import com.gh.common.util.countOccurrences +import com.gh.download.DownloadManager +import com.gh.gamecenter.baselist.LoadStatus +import com.gh.gamecenter.entity.GameEntity +import com.gh.gamecenter.entity.ServerCalendarEntity +import com.gh.gamecenter.entity.ServerPublishEntity +import com.gh.gamecenter.retrofit.BiResponse +import com.gh.gamecenter.retrofit.RetrofitManager +import com.halo.assistant.HaloApp +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers + +class GameServersContentViewModel(application: Application) + : AndroidViewModel(application) { + + val locationMap: ArrayMap> = arrayMapOf() + val listLiveData: MutableLiveData, Int>> = MutableLiveData() + val loadStatusLiveData: MutableLiveData> = MutableLiveData() + var day: String? = null + var hour: String? = null + var tags: String? = null +// var type: String? = null + var mRealIndex = 0 + var mEntrance = "" + var prevId: String? = null + var nextId: String? = null + var isInit = true + + init { + loadData() + } + + + @SuppressLint("CheckResult") + fun loadData(isRefresh: Boolean = false, action: String? = null) { + if (isRefresh) { + isInit = true + prevId = null + nextId = null + } + + loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT)) + + if ((action == "down" && prevId?.isEmpty() == true) || action == "up" && nextId?.isEmpty() == true) { + loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_OVER)) + return + } + + val filterQuery = UrlFilterUtils.getFilterQuery("day", day, "hour", hour, "tag", tags, + "action", action, "prev_server_id", prevId, "next_server_id", nextId) + RetrofitManager.getInstance(HaloApp.getInstance()).sensitiveApi + .getGameServers(filterQuery) +// .map(RegionSettingHelper.filterGame) +// .map(ApkActiveUtils.filterMapperList) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: ServerPublishEntity) { + when (action) { + null -> { + prevId = data.prevId + nextId = data.nextId + } + "down" -> prevId = data.prevId + "up" -> nextId = data.nextId + } + + if (action == "down") { + handlePrevData(data.data, action) + } else { + handleData(data.data, isRefresh, action) + } + } + + override fun onFailure(exception: Exception) { + super.onFailure(exception) + loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_FAILED)) + } + }) + } + + fun handleData(data: List, isRefresh: Boolean, action: String?) { + var i = 0 + val list = ArrayList(data) + while (i < list.size) { + + // 初始化游戏状态 + val entity = list[i] + if (entity.serverRemaining != null) { + for (remainingGame in entity.serverRemaining!!) { + remainingGame.sequence = mRealIndex++ + } + } + entity.sequence = mRealIndex++ + entity.setEntryMap(DownloadManager.getInstance(HaloApp.getInstance().application).getEntryMap(entity.name)) + ApkActiveUtils.filterHideApk(entity) // 过滤隐藏apk + var fixedTopItem: GameEntity? = null + + // 当页面是由启动弹窗过来的第一或第二个页面的时候添加启动弹窗信息 + if (mEntrance.contains(EntranceUtils.ENTRANCE_WELCOME) + && mEntrance.countOccurrences("+") <= 1) { + entity.setWelcomeDialogInfoIfAvailable() + } + + // 设置置顶部分 + if (i == 0) { + // 列表顶部,若有设置置顶应用就增加置顶头部 + if (isInit && entity.fixedTop!!) { + fixedTopItem = GameEntity() + fixedTopItem.fixedTopHint = true + fixedTopItem.fixedTop = true + list.add(i, fixedTopItem) + i++ + } + } + + // 归零置顶游戏的开服时间避免找当前开服游戏时找到 + if (entity.fixedTop!!) { + if (entity.serverEntity == null) { + val emptyCalendarEntity = ServerCalendarEntity() + emptyCalendarEntity.setTime(0) + entity.serverEntity = emptyCalendarEntity + } + entity.serverEntity!!.setTime(0) + } + + // + if (i == 0) { + if (isInit) { // 列表page == 0 && position=0 默认添加时间断点 + val kaiFuTimeEntity = GameEntity() + kaiFuTimeEntity.kaifuTimeHint = entity.serverEntity!!.getTime() + list.add(i, kaiFuTimeEntity) + i++ + } else { // 列表 page > 0 && position=0 与上一页最后一条对比 + val gameEntity = listLiveData.value?.second?.last() + val serverEntity = gameEntity?.serverEntity + val nextServerEntity = entity.serverEntity + if (serverEntity == null || nextServerEntity == null) { + i++ + continue + } + val time = serverEntity.getTime() + val nextTime = nextServerEntity.getTime() + if (time != nextTime) { + val kaiFuTimeEntity = GameEntity() + kaiFuTimeEntity.kaifuTimeHint = nextTime + list.add(i, kaiFuTimeEntity) + i++ + } + } + } + if (i < list.size - 1) { + // 为置顶的项目添加第一个存在时间的游戏的开服时间 + if (fixedTopItem != null && fixedTopItem.kaifuTimeHint == null) { + fixedTopItem.kaifuTimeHint = entity.serverEntity!!.getTime() + } + val serverEntity = entity.serverEntity + val nextServerEntity = list[i + 1].serverEntity + if (serverEntity == null || nextServerEntity == null) { + i++ + continue + } + val time = serverEntity.getTime() + val nextTime = nextServerEntity.getTime() + if (time != nextTime) { + val kaiFuTimeEntity = GameEntity() + kaiFuTimeEntity.kaifuTimeHint = nextTime + list.add(i + 1, kaiFuTimeEntity) + i++ + } + } + i++ + } + + val previousData = if (isRefresh) arrayListOf() else listLiveData.value?.second ?: arrayListOf() + previousData.addAll(list) + listLiveData.postValue(Triple(action, previousData, -1)) + initLocationMap(previousData) + isInit = false + + when { + data.size < 20 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_OVER)) + list.size == 0 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_EMPTY)) + list.size > 0 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_LOADED)) + } + } + + fun handlePrevData(data: List, action: String?) { + loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT)) + var i = 0 + val list = ArrayList(data.reversed()) + while (i < list.size) { + + // 初始化游戏状态 + val entity = list[i] + if (entity.serverRemaining != null) { + for (remainingGame in entity.serverRemaining!!) { + remainingGame.sequence = mRealIndex++ + } + } + entity.sequence = mRealIndex++ + entity.setEntryMap(DownloadManager.getInstance(HaloApp.getInstance().application).getEntryMap(entity.name)) + ApkActiveUtils.filterHideApk(entity) // 过滤隐藏apk + var fixedTopItem: GameEntity? = null + + // 归零置顶游戏的开服时间避免找当前开服游戏时找到 + if (entity.fixedTop!!) { + if (entity.serverEntity == null) { + val emptyCalendarEntity = ServerCalendarEntity() + emptyCalendarEntity.setTime(0) + entity.serverEntity = emptyCalendarEntity + } + entity.serverEntity!!.setTime(0) + } + + // 设置时间断点 + if (i == 0) { + // 列表 page > 0 && position=0 与下面页最开始一条对比 + val gameEntity = listLiveData.value?.second?.find { it.kaifuTimeHint != null } + val serverEntity = gameEntity?.serverEntity + val nextServerEntity = entity.serverEntity + if (serverEntity == null || nextServerEntity == null) { + i++ + continue + } + val time = serverEntity.getTime() + val nextTime = nextServerEntity.getTime() + if (time != nextTime) { + val kaiFuTimeEntity = GameEntity() + kaiFuTimeEntity.kaifuTimeHint = time + list.add(i, kaiFuTimeEntity) + i++ + } + } + + if (i < list.size - 1) { + // 为置顶的项目添加第一个存在时间的游戏的开服时间 + if (fixedTopItem != null && fixedTopItem.kaifuTimeHint == null) { + fixedTopItem.kaifuTimeHint = entity.serverEntity!!.getTime() + } + val serverEntity = entity.serverEntity + val nextServerEntity = list[i + 1].serverEntity + if (serverEntity == null || nextServerEntity == null) { + i++ + continue + } + val time = serverEntity.getTime() + val nextTime = nextServerEntity.getTime() + if (time != nextTime) { + val kaiFuTimeEntity = GameEntity() + kaiFuTimeEntity.kaifuTimeHint = time + list.add(i + 1, kaiFuTimeEntity) + i++ + } + } + i++ + } + + val previousData = listLiveData.value?.second ?: arrayListOf() + previousData.addAll(0, list.reversed()) + listLiveData.postValue(Triple(action, previousData, list.size)) + initLocationMap(previousData) + + when { + data.size < 20 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_OVER)) + list.size == 0 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_EMPTY)) + list.size > 0 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_LOADED)) + } + } + + fun mergerRemainingData(entity: GameEntity, position: Int) { + val serverRemaining = entity.serverRemaining ?: return + val entryMap = entity.getEntryMap() + if (entryMap.isNotEmpty()) { + serverRemaining.forEach { + it.setEntryMap(entryMap) + } + } + val previousData = listLiveData.value?.second ?: return + previousData.addAll(position, serverRemaining) + entity.serverRemaining = null + initLocationMap(previousData) + listLiveData.postValue(Triple(null, previousData, -1)) + } + + private fun initLocationMap(itemList: List) { + locationMap.clear() + + var list: ArrayList? + var gameEntity: GameEntity + var i = 0 + val size: Int = itemList.size + while (i < size) { + gameEntity = itemList[i] + if (gameEntity.getApk().size != 0) { + for ((packageName) in gameEntity.getApk()) { + list = locationMap[packageName] + if (list == null) { + list = java.util.ArrayList() + locationMap[packageName] = list + } + list.add(i) + } + } + i++ + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersPublishFragment.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersPublishFragment.kt index 6cd3403598..d69cb80080 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersPublishFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersPublishFragment.kt @@ -17,21 +17,19 @@ import com.gh.common.util.dip2px import com.gh.common.util.toColor import com.gh.common.view.DrawableView import com.gh.gamecenter.R +import com.gh.gamecenter.databinding.FragmentGameServersPublishBinding import com.gh.gamecenter.entity.ServersGameCategory import com.gh.gamecenter.eventbus.EBNetworkState import com.gh.gamecenter.retrofit.BiResponse import com.gh.gamecenter.retrofit.RetrofitManager import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers -import kotterknife.bindView import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode class GameServersPublishFragment : LazyFragment() { - private val mServersTime by bindView(R.id.server_time) - private val mGameCategory by bindView(R.id.server_status) - + private var mBinding: FragmentGameServersPublishBinding? = null private lateinit var mContentFragment: GameServersContentFragment private val mCategoryList = ArrayList() @@ -42,28 +40,35 @@ class GameServersPublishFragment : LazyFragment() { private val mType = "开服" override fun getRealLayoutId(): Int { - return R.layout.fragment_game_servers + return R.layout.fragment_game_servers_publish + } + + override fun onRealLayoutInflated(inflatedView: View) { + mBinding = FragmentGameServersPublishBinding.bind(inflatedView) } override fun initRealView() { super.initRealView() - mGameCategory.text = "游戏分类" - mServersTime.text = "开服时间" - mGameCategory.setOnClickListener { - showCategoryPopupWindow(it as CheckedTextView, callback = { tags -> - mTags = tags - mContentFragment.filterData(mDay, mHour, mType, mTags) - }) - } - mServersTime.setOnClickListener { - showServersTimePopupWindow(it as CheckedTextView, callback = { day, hour -> - mDay = day - mHour = hour - mContentFragment.filterData(mDay, mHour, mType, mTags) - }) + mBinding?.run { + serverStatus.text = "游戏分类" + serverTime.text = "开服时间" + serverStatus.setOnClickListener { + showCategoryPopupWindow(it as CheckedTextView, callback = { tags -> + mTags = tags + mContentFragment.filterData(mDay, mHour, mType, mTags) + }) + } + serverTime.setOnClickListener { + showServersTimePopupWindow(it as CheckedTextView, callback = { day, hour -> + mDay = day + mHour = hour + mContentFragment.filterData(mDay, mHour, mType, mTags) + }) + } } + val bundle = arguments bundle?.putString(EntranceUtils.KEY_TYPE, "开服") mContentFragment = childFragmentManager.findFragmentByTag(GameServersContentFragment::class.java.simpleName) as? GameServersContentFragment @@ -124,7 +129,7 @@ class GameServersPublishFragment : LazyFragment() { label.text = name label.background = DrawableView.getOvalSelectorStyle(R.color.background, R.color.text_e6f3ff) label.setTextColor(DrawableView.getSelectorColorStyle(R.color.text_333333, R.color.theme_font)) - label.setSingleLine(true) + label.isSingleLine = true labelsContainer.addView(label) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { label.textAlignment = View.TEXT_ALIGNMENT_CENTER @@ -190,7 +195,7 @@ class GameServersPublishFragment : LazyFragment() { v.isChecked = false if (mTags.isNullOrEmpty()) v.setTextColor(R.color.text_333333.toColor()) } - popupWindow.showAsDropDown(v) + popupWindow.showAsDropDown(mBinding?.divider) } // day, hour @@ -208,7 +213,6 @@ class GameServersPublishFragment : LazyFragment() { LinearLayout.LayoutParams.WRAP_CONTENT ) - val all = layout.findViewById(R.id.all) val today = layout.findViewById(R.id.today) val tomorrow = layout.findViewById(R.id.tomorrow) val after = layout.findViewById(R.id.after) @@ -219,11 +223,7 @@ class GameServersPublishFragment : LazyFragment() { tomorrow.text = "明日开服" after.text = "后续开服" - when (v.text) { - "开服时间" -> all.isChecked = true - "后续开服" -> after.isChecked = true - } - if (v.text.contains("今日")) { + if (v.text == "开服时间" || v.text.contains("今日")) { today.isChecked = true hourScrollView.visibility = View.VISIBLE @@ -232,11 +232,13 @@ class GameServersPublishFragment : LazyFragment() { tomorrow.isChecked = true hourScrollView.visibility = View.VISIBLE } + if (v.text == "后续开服") { + after.isChecked = true + } // add hour content for (i in 0 until 24 + 1) { // position = 0: all - val index = i - 1 val hour = TextView(v.context) hour.textSize = 14F hour.setTextColor(R.color.text_333333.toColor()) @@ -244,20 +246,14 @@ class GameServersPublishFragment : LazyFragment() { hour.setPadding(24F.dip2px(), 0, 0, 0) hourContainer.addView(hour, ViewGroup.LayoutParams.MATCH_PARENT, 43F.dip2px()) - if (index >= 0) { - hour.text = if (index >= 10) "$index:00" else "0$index:00" - } else { - hour.text = if (v.text.contains("今日")) { - "今日全部" - } else { - "明日全部" - } + if (i >= 0) { + hour.text = if (i >= 10) "$i:00" else "0$i:00" } hour.setOnClickListener { if (today.isChecked) { - if (index >= 0) { - callback.invoke("today", index.toString()) + if (i >= 0) { + callback.invoke("today", i.toString()) v.text = (today.text.toString() + " " + hour.text.toString()) } else { callback.invoke("today", null) @@ -265,8 +261,8 @@ class GameServersPublishFragment : LazyFragment() { } MtaHelper.onEvent("开服表", "开服Tab-今日开服", hour.text.toString()) } else { - if (index >= 0) { - callback.invoke("tomorrow", index.toString()) + if (i >= 0) { + callback.invoke("tomorrow", i.toString()) v.text = (tomorrow.text.toString() + " " + hour.text.toString()) } else { callback.invoke("tomorrow", null) @@ -278,7 +274,6 @@ class GameServersPublishFragment : LazyFragment() { } } - all.setTextColor(DrawableView.getSelectorColorStyle(R.color.text_333333, R.color.theme_font)) today.setTextColor(DrawableView.getSelectorColorStyle(R.color.text_333333, R.color.theme_font)) tomorrow.setTextColor(DrawableView.getSelectorColorStyle(R.color.text_333333, R.color.theme_font)) after.setTextColor(DrawableView.getSelectorColorStyle(R.color.text_333333, R.color.theme_font)) @@ -286,12 +281,6 @@ class GameServersPublishFragment : LazyFragment() { layout.setOnClickListener { popupWindow.dismiss() } - all.setOnClickListener { - v.text = "开服时间" - callback.invoke(null, null) - popupWindow.dismiss() - MtaHelper.onEvent("开服表", "开服Tab", "开服时间-全部") - } after.setOnClickListener { v.text = after.text callback.invoke("after", null) @@ -300,26 +289,16 @@ class GameServersPublishFragment : LazyFragment() { } today.setOnClickListener { MtaHelper.onEvent("开服表", "开服Tab", "今日开服") - if (hourContainer.childCount > 0) { - val hour = hourContainer.getChildAt(0) as TextView - hour.text = "今日全部" - } hourScrollView.visibility = View.VISIBLE today.isChecked = true tomorrow.isChecked = !today.isChecked - all.isChecked = !today.isChecked after.isChecked = !today.isChecked } tomorrow.setOnClickListener { MtaHelper.onEvent("开服表", "开服Tab", "明日开服") - if (hourContainer.childCount > 0) { - val hour = hourContainer.getChildAt(0) as TextView - hour.text = "明日全部" - } hourScrollView.visibility = View.VISIBLE tomorrow.isChecked = true today.isChecked = !tomorrow.isChecked - all.isChecked = !tomorrow.isChecked after.isChecked = !tomorrow.isChecked } @@ -330,16 +309,18 @@ class GameServersPublishFragment : LazyFragment() { v.isChecked = false if (mDay.isNullOrEmpty()) v.setTextColor(R.color.text_333333.toColor()) } - popupWindow.showAsDropDown(v) + popupWindow.showAsDropDown(mBinding?.divider) } fun resetFilter() { mDay = null mHour = null mTags = null - mServersTime.text = "开服时间" - mServersTime.setTextColor(R.color.text_333333.toColor()) - mGameCategory.setTextColor(R.color.text_333333.toColor()) + mBinding?.run { + serverTime.text = "开服时间" + serverTime.setTextColor(R.color.text_333333.toColor()) + serverStatus.setTextColor(R.color.text_333333.toColor()) + } mContentFragment.filterData(mDay, mHour, mType, mTags) } diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersTestAdapter.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersTestAdapter.kt index 4c993fe153..b2d57512eb 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersTestAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersTestAdapter.kt @@ -98,7 +98,7 @@ class GameServersTestAdapter(context: Context, initViewHolder(gameEntity, holder) } is GameServerTimeViewHolder -> { - holder.container.setPadding(0, 8F.dip2px(), 0, 4F.dip2px()) +// holder.container.setPadding(0, 8F.dip2px(), 0, 4F.dip2px()) holder.header.setImageResource(R.drawable.kaifu_time_icon) holder.time.text = mDataList[position].time } diff --git a/app/src/main/res/drawable-xxxhdpi/ic_pull_down_tip.webp b/app/src/main/res/drawable-xxxhdpi/ic_pull_down_tip.webp new file mode 100644 index 0000000000000000000000000000000000000000..2bf4c17fd93e29610d98117a19aa860d4f363846 GIT binary patch literal 332 zcmV-S0ki&6Nk&FQ0RRA3MM6+kP&il$0000G0001Q0018V06|PpNK^m-00B>+CXysI zdQ1u~y6nlHC<%BAl(3z{Jt!{CuH)0092}3Aw+Y z<5@>b%w;XA_t~_St-V(#d)HrQ+xAjpv?&t_zm^${KvhO&<$a@*&O|<#!ZEir4W$1* z|M&lZ|AepkjE=YH;@~#Aukh)ghwz#M)TqXod2VFoU_3S)Iuac5Wz6uAv*7BTMvM=j eqW|@~|F+Zq+fVpz-}#Hky@#5O|KcrQ!LR`Pr + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_kaifu_content.xml b/app/src/main/res/layout/fragment_kaifu_content.xml index 3c0a7a661a..0cb189475b 100644 --- a/app/src/main/res/layout/fragment_kaifu_content.xml +++ b/app/src/main/res/layout/fragment_kaifu_content.xml @@ -1,12 +1,34 @@ + android:layout_height="match_parent" + android:overScrollMode="never" /> + + + + + android:background="@color/white" + android:orientation="vertical"> - - - + android:layout_height="8dp" /> + + + + + + + + - \ No newline at end of file diff --git a/app/src/main/res/layout/popup_server_time.xml b/app/src/main/res/layout/popup_server_time.xml index 93afd76b14..6efdc7f451 100644 --- a/app/src/main/res/layout/popup_server_time.xml +++ b/app/src/main/res/layout/popup_server_time.xml @@ -23,15 +23,6 @@ app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintTop_toTopOf="parent"> - - Date: Fri, 20 Aug 2021 10:09:41 +0800 Subject: [PATCH 084/151] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=BC=80=E6=9C=8D?= =?UTF-8?q?=E8=A1=A8=E9=A1=B5=E9=9D=A2=E5=A4=84=E7=90=86=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../servers/GameServersContentViewModel.kt | 41 +++++++++++++------ 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt index e3067a409e..2d71eac84b 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt @@ -31,7 +31,7 @@ class GameServersContentViewModel(application: Application) var hour: String? = null var tags: String? = null // var type: String? = null - var mRealIndex = 0 +// var mRealIndex = 0 var mEntrance = "" var prevId: String? = null var nextId: String? = null @@ -97,12 +97,12 @@ class GameServersContentViewModel(application: Application) // 初始化游戏状态 val entity = list[i] - if (entity.serverRemaining != null) { - for (remainingGame in entity.serverRemaining!!) { - remainingGame.sequence = mRealIndex++ - } - } - entity.sequence = mRealIndex++ +// if (entity.serverRemaining != null) { +// for (remainingGame in entity.serverRemaining!!) { +// remainingGame.sequence = mRealIndex++ +// } +// } +// entity.sequence = mRealIndex++ entity.setEntryMap(DownloadManager.getInstance(HaloApp.getInstance().application).getEntryMap(entity.name)) ApkActiveUtils.filterHideApk(entity) // 过滤隐藏apk var fixedTopItem: GameEntity? = null @@ -185,6 +185,7 @@ class GameServersContentViewModel(application: Application) val previousData = if (isRefresh) arrayListOf() else listLiveData.value?.second ?: arrayListOf() previousData.addAll(list) + recordIndex(previousData) listLiveData.postValue(Triple(action, previousData, -1)) initLocationMap(previousData) isInit = false @@ -204,12 +205,12 @@ class GameServersContentViewModel(application: Application) // 初始化游戏状态 val entity = list[i] - if (entity.serverRemaining != null) { - for (remainingGame in entity.serverRemaining!!) { - remainingGame.sequence = mRealIndex++ - } - } - entity.sequence = mRealIndex++ +// if (entity.serverRemaining != null) { +// for (remainingGame in entity.serverRemaining!!) { +// remainingGame.sequence = mRealIndex++ +// } +// } +// entity.sequence = mRealIndex++ entity.setEntryMap(DownloadManager.getInstance(HaloApp.getInstance().application).getEntryMap(entity.name)) ApkActiveUtils.filterHideApk(entity) // 过滤隐藏apk var fixedTopItem: GameEntity? = null @@ -269,6 +270,7 @@ class GameServersContentViewModel(application: Application) val previousData = listLiveData.value?.second ?: arrayListOf() previousData.addAll(0, list.reversed()) + recordIndex(previousData) listLiveData.postValue(Triple(action, previousData, list.size)) initLocationMap(previousData) @@ -316,4 +318,17 @@ class GameServersContentViewModel(application: Application) i++ } } + + private fun recordIndex(list: ArrayList) { + var index = 0 + list.forEach { + if (it.kaifuTimeHint != null) return@forEach + it.sequence = index++ + if (it.serverRemaining != null) { + for (remainingGame in it.serverRemaining!!) { + remainingGame.sequence = index++ + } + } + } + } } \ No newline at end of file From eda1eea2dead62cdc3cf510b1ed6ead4347ba529 Mon Sep 17 00:00:00 2001 From: juntao Date: Fri, 20 Aug 2021 10:54:52 +0800 Subject: [PATCH 085/151] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=A4=BE=E5=8C=BA?= =?UTF-8?q?=E6=8E=A2=E7=B4=A2=E4=B9=8B=E6=97=85(=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E6=B1=87=E6=80=BB8)=20https://git.ghzs.com/pm/halo-app-issues/?= =?UTF-8?q?-/issues/1285?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/GlobalActivityLifecycleObserver.kt | 27 +++++++++---- .../com/gh/common/util/BbsStayTimeHelper.kt | 40 +++---------------- .../gh/common/util/FloatingBackViewManager.kt | 9 +++++ .../forum/home/CommunityHomeFragment.kt | 5 +++ .../fragment/MainWrapperFragment.java | 6 +++ .../halo/assistant/fragment/WebFragment.java | 5 ++- 6 files changed, 50 insertions(+), 42 deletions(-) diff --git a/app/src/main/java/com/gh/base/GlobalActivityLifecycleObserver.kt b/app/src/main/java/com/gh/base/GlobalActivityLifecycleObserver.kt index 35821516ea..e8b64d845f 100644 --- a/app/src/main/java/com/gh/base/GlobalActivityLifecycleObserver.kt +++ b/app/src/main/java/com/gh/base/GlobalActivityLifecycleObserver.kt @@ -7,9 +7,14 @@ import com.gh.common.notifier.Notifier import com.gh.common.util.DataUtils import com.gh.common.util.FloatingBackViewManager import com.gh.download.DownloadManager -import com.gh.gamecenter.SingletonWebActivity +import com.gh.gamecenter.MainActivity import com.gh.gamecenter.SplashScreenActivity import com.gh.gamecenter.energy.EnergyCenterActivity +import com.gh.gamecenter.forum.detail.ForumDetailActivity +import com.gh.gamecenter.forum.list.ForumListActivity +import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity +import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity +import com.gh.gamecenter.qa.video.detail.ForumVideoDetailActivity import com.halo.assistant.HaloApp import com.lightgame.utils.AppManager @@ -29,12 +34,12 @@ class GlobalActivityLifecycleObserver : Application.ActivityLifecycleCallbacks { // 判断是否需要显示或隐藏返回小浮窗 if (FloatingBackViewManager.getType().isNotEmpty()) { if (activity is EnergyCenterActivity - && FloatingBackViewManager.getType() == FloatingBackViewManager.TYPE_TASK) { + && FloatingBackViewManager.getType() == FloatingBackViewManager.TYPE_TASK + ) { FloatingBackViewManager.disableBackView() - } else if (activity is SingletonWebActivity - && FloatingBackViewManager.getType() == FloatingBackViewManager.TYPE_ACTIVITY - // TODO 再加上一个内容匹配? - ) { + } else if (!shouldShowActivityBackView(activity) + && FloatingBackViewManager.getType() == FloatingBackViewManager.TYPE_ACTIVITY + ) { FloatingBackViewManager.disableBackView() } else { FloatingBackViewManager.showBackView(activity) @@ -55,6 +60,15 @@ class GlobalActivityLifecycleObserver : Application.ActivityLifecycleCallbacks { } } + private fun shouldShowActivityBackView(activity: Activity): Boolean { + return (activity is MainActivity + || activity is ArticleDetailActivity + || activity is ForumVideoDetailActivity + || activity is ForumDetailActivity + || activity is ForumListActivity + || activity is NewQuestionDetailActivity) + } + override fun onActivityPaused(activity: Activity) { CurrentActivityHolder.activitySet.remove(activity) FloatingBackViewManager.dismissBackView(activity) @@ -78,5 +92,4 @@ class GlobalActivityLifecycleObserver : Application.ActivityLifecycleCallbacks { } } - } \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/util/BbsStayTimeHelper.kt b/app/src/main/java/com/gh/common/util/BbsStayTimeHelper.kt index 859d263f49..22ce7deafb 100644 --- a/app/src/main/java/com/gh/common/util/BbsStayTimeHelper.kt +++ b/app/src/main/java/com/gh/common/util/BbsStayTimeHelper.kt @@ -6,7 +6,6 @@ import android.app.Application import android.os.Bundle import com.gh.base.CurrentActivityHolder import com.gh.base.GHThreadFactory -import com.gh.common.runOnUiThread import com.gh.gamecenter.MainActivity import com.gh.gamecenter.forum.detail.ForumDetailActivity import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity @@ -37,13 +36,11 @@ object BbsStayTimeHelper { private val mActivityLifecycleCallbacks by lazy { object : Application.ActivityLifecycleCallbacks { - override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { - // do nothing - } - - override fun onActivityStarted(activity: Activity) { - // do nothing - } + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {} + override fun onActivityStopped(activity: Activity) {} + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} + override fun onActivityDestroyed(activity: Activity) {} + override fun onActivityStarted(activity: Activity) {} override fun onActivityResumed(activity: Activity) { if (isTopActivityBbsRelated(activity) && mIsStayTimeCountEnabled) { @@ -56,18 +53,6 @@ object BbsStayTimeHelper { pauseTimeCount() } } - - override fun onActivityStopped(activity: Activity) { - // do nothing - } - - override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { - // do nothing - } - - override fun onActivityDestroyed(activity: Activity) { - // do nothing - } } } @@ -101,19 +86,6 @@ object BbsStayTimeHelper { if (mStayTimeCount >= mStayTimeTimeout) { postExploreFinish() } - if (!isPublishEnv()) { - if (!isPublishEnv()) { - runOnUiThread { - ToastUtils.toast("论坛页面累计停留了 $mStayTimeCount 秒") - } - } - } - } - } else { - if (!isPublishEnv()) { - runOnUiThread { - ToastUtils.toast("当前页面不满足论坛任务条件(仅测试包有这个 toast 不要慌)") - } } } Thread.sleep(1000) @@ -146,7 +118,7 @@ object BbsStayTimeHelper { .subscribe(object : BiResponse() { override fun onSuccess(data: ResponseBody) { if (!isPublishEnv()) { - ToastUtils.toast("完成了论坛停留任务(仅测试包有这个 toast 不要慌)") + ToastUtils.toast("完成了论坛停留任务(仅测试环境有这个 toast 不要慌)") } disableStayTimeCount() } diff --git a/app/src/main/java/com/gh/common/util/FloatingBackViewManager.kt b/app/src/main/java/com/gh/common/util/FloatingBackViewManager.kt index 63267352ed..d3cd027587 100644 --- a/app/src/main/java/com/gh/common/util/FloatingBackViewManager.kt +++ b/app/src/main/java/com/gh/common/util/FloatingBackViewManager.kt @@ -90,6 +90,7 @@ object FloatingBackViewManager { /** * 隐藏返回小浮窗 */ + @JvmStatic fun dismissBackView(activity: Activity) { EasyFloat.dismiss(activity, FLOATING_BACK_VIEW) } @@ -113,9 +114,17 @@ object FloatingBackViewManager { * @param type 类型 * @param activityUrl 类型为活动的时候用的地址 */ + @JvmStatic fun disableBackView() { mType = "" mActivityUrl = "" } + /** + * 返回小浮窗类型是否为活动 + */ + fun isTypeActivity() : Boolean { + return mType == TYPE_ACTIVITY + } + } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt index a0f088b40d..fd59cc97d4 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/CommunityHomeFragment.kt @@ -146,6 +146,11 @@ class CommunityHomeFragment : LazyFragment() { 1 -> NewLogUtils.logCommunityHomeEvent("click_forum_tab") 2 -> NewLogUtils.logCommunityHomeEvent("click_activity_tab") } + + if (position == 2) { + FloatingBackViewManager.disableBackView() + FloatingBackViewManager.dismissBackView(requireActivity()) + } }, onPageScrolled = { position, positionOffset, _ -> if (position + 1 != mTabList.size) { diff --git a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java index a88fc67718..f3a5231989 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/MainWrapperFragment.java @@ -35,6 +35,7 @@ import com.gh.common.util.DataUtils; import com.gh.common.util.DisplayUtils; import com.gh.common.util.EntranceUtils; import com.gh.common.util.ExtensionsKt; +import com.gh.common.util.FloatingBackViewManager; import com.gh.common.util.HomeBottomBarHelper; import com.gh.common.util.ImageUtils; import com.gh.common.util.IntegralLogHelper; @@ -491,6 +492,11 @@ public class MainWrapperFragment extends BaseFragment_ViewPager_Checkable implem DataUtils.onMtaEvent(getContext(), "顶级页面", "BottomBar", tabText); TrackerLogger.logHomeTabSelected(index, tabText); + if (index != INDEX_BBS) { + FloatingBackViewManager.disableBackView(); + FloatingBackViewManager.dismissBackView(requireActivity()); + } + SubjectRecommendEntity navBarEntity = mViewModel.getNavBar().getValue(); if (navBarEntity != null) { if (index == INDEX_GAME) { diff --git a/app/src/main/java/com/halo/assistant/fragment/WebFragment.java b/app/src/main/java/com/halo/assistant/fragment/WebFragment.java index 620dfc567a..29cdbedfca 100644 --- a/app/src/main/java/com/halo/assistant/fragment/WebFragment.java +++ b/app/src/main/java/com/halo/assistant/fragment/WebFragment.java @@ -467,7 +467,10 @@ public class WebFragment extends LazyFragment implements IScrollable { public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); // title 有可能超出边界 - if (TextUtils.isEmpty(newsId) && TextUtils.isEmpty(mNavigationTitle) && !mIsTools && mAutoCompletionTitle) { + if (TextUtils.isEmpty(newsId) + && (TextUtils.isEmpty(mNavigationTitle) || mNavigationTitle.contains("http")) + && !mIsTools + && mAutoCompletionTitle) { mNavigationTitle = title; setNavigationTitle(mNavigationTitle); } From 04e410615d4ed4a51dad06be453daae77be0b3ed Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Fri, 20 Aug 2021 11:25:42 +0800 Subject: [PATCH 086/151] =?UTF-8?q?=E5=BC=80=E6=9C=8D=E8=A1=A8=E5=90=91?= =?UTF-8?q?=E4=B8=8A=E5=8A=A0=E8=BD=BD=E6=9C=AB=E5=B0=BE=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=BC=80=E6=9C=8D=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../servers/GameServersContentViewModel.kt | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt index 2d71eac84b..ebf57508c9 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt @@ -191,7 +191,7 @@ class GameServersContentViewModel(application: Application) isInit = false when { - data.size < 20 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_OVER)) +// data.size < 20 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_OVER)) list.size == 0 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_EMPTY)) list.size > 0 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_LOADED)) } @@ -265,6 +265,19 @@ class GameServersContentViewModel(application: Application) i++ } } + + if (i == list.size - 1 && prevId?.isEmpty() == true) { + val serverEntity = entity.serverEntity + if (serverEntity == null) { + i++ + continue + } + val kaiFuTimeEntity = GameEntity().apply { + kaifuTimeHint = serverEntity.getTime() + } + list.add(i + 1, kaiFuTimeEntity) + i++ + } i++ } @@ -275,7 +288,7 @@ class GameServersContentViewModel(application: Application) initLocationMap(previousData) when { - data.size < 20 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_OVER)) +// data.size < 20 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_OVER)) list.size == 0 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_EMPTY)) list.size > 0 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_LOADED)) } From 9807883d650aaf13fad5f0cddf89af189d7bfd1e Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Fri, 20 Aug 2021 15:25:26 +0800 Subject: [PATCH 087/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E6=B8=B8=E6=88=8F=E7=A4=BC=E5=8C=85?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=88=E7=AC=AC=E4=BA=8C=E6=9C=9F=EF=BC=89?= =?UTF-8?q?(1-3)=20https://git.ghzs.com/pm/halo-app-issues/-/issues/1325?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/LibaoUtils.java | 108 +++++++++--------- .../gh/gamecenter/LibaoDetailActivity.java | 4 +- .../adapter/LibaoDetailAdapter.java | 4 +- .../gamedetail/desc/DescFragment.kt | 4 +- .../gamedetail/desc/GameLibaoAdapter.kt | 18 ++- .../gh/gamecenter/libao/Libao2Fragment.java | 2 +- .../libao/Libao2FragmentAdapter.java | 9 +- .../gh/gamecenter/libao/LibaoNewAdapter.kt | 8 +- .../gh/gamecenter/libao/LibaoNewFragment.java | 2 +- .../gh/gamecenter/libao/LibaoSearchAdapter.kt | 4 +- .../drawable-xxxhdpi/ic_libao_code_copy.png | Bin 0 -> 738 bytes app/src/main/res/layout/item_game_libao.xml | 11 ++ 12 files changed, 101 insertions(+), 73 deletions(-) create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_libao_code_copy.png 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 d59efd571e..49d808a5ec 100644 --- a/app/src/main/java/com/gh/common/util/LibaoUtils.java +++ b/app/src/main/java/com/gh/common/util/LibaoUtils.java @@ -257,17 +257,19 @@ public class LibaoUtils { ("ling".equals(beforeStatus) || "tao".equals(beforeStatus))) { //检查是否到了重复领取时间 if (isCanLing(libaoEntity)) { if ("ling".equals(beforeStatus)) { - return "repeatLinged"; // 可以重复领取 + status = "repeatLinged"; // 可以重复领取 } else { - return "repeatTaoed"; // 可以重复领取 + status = "repeatTaoed"; // 可以重复领取 } } else { if ("ling".equals(beforeStatus)) { - return "repeatLing"; // 预备重复领取 + status = "repeatLing"; // 预备重复领取 } else { - return "repeatTao"; // 预备重复领取 + status = "repeatTao"; // 预备重复领取 } } + libaoEntity.setStatus(status); + return status; } } return status; @@ -289,9 +291,10 @@ public class LibaoUtils { } 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(); + final boolean isInstallRequired, final LibaoDetailAdapter adapter, boolean shouldUpdateStatus, + final String entrance, final OnLibaoStatusChangeListener listener) { setLiBaoBtnStatusRound(libaoBtn, libaoEntity, shouldUpdateStatus, context); + String status = libaoEntity.getStatus(); if (adapter != null) { if (libaoBtn.getText().toString().equals("再领")) { @@ -307,7 +310,7 @@ public class LibaoUtils { // 领取限制 CheckLoginUtils.checkLogin(context, "礼包详情-[" + btnStatus + "]", () -> { if ("领取".equals(btnStatus) || "淘号".equals(btnStatus)) { - if (isInstallRequired && !isAppInstalled(context, libaoEntity.getPackageName())) { + if (isInstallRequired && !isAppInstalled(context, libaoEntity.getPackageName()) && adapter != null) { String platform; if (TextUtils.isEmpty(libaoEntity.getPlatform())) { platform = ""; @@ -353,24 +356,23 @@ public class LibaoUtils { case "再领一个": case "领取": if ("repeatLing".equals(status)) { - DialogUtils.showWarningDialog(context, "礼包刷新提醒" - , "礼包每天0点刷新,换新区或者换新角色需要继续领取礼包的童鞋,请于明天0点之后回来即可[再领一个]" - , null, "知道了", null, null); + ToastUtils.showToast("礼包每天0点刷新,明日0点后可再领一个"); } else { - libaoLing(context, libaoBtn, libaoEntity, adapter, isInstallRequired, null, entrance); + libaoLing(context, libaoBtn, libaoEntity, adapter, isInstallRequired, null, entrance, listener); } break; case "再淘": case "再淘一个": case "淘号": - libaoTao(context, libaoBtn, libaoEntity, isInstallRequired, adapter, status, entrance); + libaoTao(context, libaoBtn, libaoEntity, isInstallRequired, adapter, status, entrance, listener); break; } }); }); } - private static void libaoTao(Context context, TextView libaoBtn, LibaoEntity libaoEntity, boolean isInstallRequired, LibaoDetailAdapter adapter, String status, String entrance) { + private static void libaoTao(Context context, TextView libaoBtn, LibaoEntity libaoEntity, boolean isInstallRequired, LibaoDetailAdapter adapter, + String status, String entrance, final OnLibaoStatusChangeListener listener) { if ("repeatTao".equals(status)) { Utils.toast(context, "没到重复淘号时间, 礼包每天0点刷新"); return; @@ -411,30 +413,21 @@ public class LibaoUtils { } return; } - Utils.toast(context, "淘号成功"); libaoEntity.setStatus("taoed"); + initLibaoCode(libaoEntity, new UserDataLibaoEntity(libaoCode, "tao", Utils.getTime(context))); + if (adapter != null) { + adapter.initLibaoCode(new UserDataLibaoEntity(libaoCode, "tao", Utils.getTime(context))); + } EventBus.getDefault().post(new EBReuse("libaoChanged")); - adapter.initLibaoCode(new UserDataLibaoEntity(libaoCode, "tao", Utils.getTime(context))); + if (listener != null) listener.onLibaoStatusChange(); uploadEvent(libaoEntity, true, entrance); - final String finalLibaoCode = libaoCode; String des; if (!hasSame) { - des = "淘到的礼包码不保证可以兑换,请尽快前往游戏兑换"; + des = "淘号成功,请进入礼包详情查看兑换方法"; } else { - des = "您已领取过相同的礼包,可能无法成功兑换,请自行尝试"; + 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); - } - }); + ToastUtils.showToast(des); } @Override @@ -495,7 +488,7 @@ public class LibaoUtils { } private static void libaoLing(final Context context, final TextView libaoBtn, final LibaoEntity libaoEntity, final LibaoDetailAdapter adapter, - final boolean isInstallRequired, String captchaCode, final String entrance) { + final boolean isInstallRequired, String captchaCode, final String entrance, final OnLibaoStatusChangeListener listener) { if (BuildConfig.DEBUG) { Log.e("LIBAO", "context? " + context + libaoBtn.getContext()); @@ -525,37 +518,26 @@ public class LibaoUtils { } libaoEntity.setAvailable(libaoEntity.getAvailable() - 1); libaoEntity.setStatus("linged"); + initLibaoCode(libaoEntity, new UserDataLibaoEntity(libaoCode, "ling", Utils.getTime(context))); + if (listener != null) listener.onLibaoStatusChange(); EventBus.getDefault().post(new EBReuse("libaoChanged")); uploadEvent(libaoEntity, false, entrance); - adapter.initLibaoCode(new UserDataLibaoEntity(libaoCode, "ling", Utils.getTime(context))); - adapter.notifyDataSetChanged(); - final String finalLibaoCode = libaoCode; + if (adapter != null) { + adapter.initLibaoCode(new UserDataLibaoEntity(libaoCode, "ling", Utils.getTime(context))); + adapter.notifyDataSetChanged(); + } boolean finalHasSame = hasSame; - int finalGameApkSize = gameApkSize; NotificationHelper.showNotificationHintDialog(NotificationUgc.GIFT, isShow -> { if (!isShow) { String des; if (!finalHasSame) { - if (finalGameApkSize > 1) { - des = "礼包码将于60分钟后进入淘号池,部分礼包兑换有平台限制,请根据使用说明兑换"; - } else { - des = "礼包码将于60分钟后进入淘号池,请尽快前往游戏兑换"; - } + des = "领取成功,请进入礼包详情查看兑换方法"; } else { - des = "您已领取过相同的礼包,可能无法成功兑换,请自行尝试"; + 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); - } - }); + ToastUtils.showToast(des); } return null; }); @@ -601,7 +583,7 @@ public class LibaoUtils { DialogUtils.showHintDialog(context, "礼包已领光" , "手速不够快,礼包已经被抢光了,十分抱歉", "知道了"); libaoEntity.setStatus("used_up"); - initLibaoBtn(context, libaoBtn, libaoEntity, isInstallRequired, adapter, false, entrance); + initLibaoBtn(context, libaoBtn, libaoEntity, isInstallRequired, adapter, false, entrance, listener); break; case "maintaining": Utils.toast(context, "网络状态异常,请稍后再试"); @@ -618,7 +600,7 @@ public class LibaoUtils { } else if (exception.code() == 412) { // 需要验证 GeetestUtils.getInstance().showDialog(context, captcha -> - libaoLing(context, libaoBtn, libaoEntity, adapter, isInstallRequired, captcha, entrance)); + libaoLing(context, libaoBtn, libaoEntity, adapter, isInstallRequired, captcha, entrance, listener)); return; } else if (exception.code() == 401) { return; @@ -629,6 +611,22 @@ public class LibaoUtils { }, captchaCode); } + public static void initLibaoCode(LibaoEntity libaoEntity, UserDataLibaoEntity userDataLibaoEntity) { + MeEntity userData = libaoEntity.getMe(); + if (userData == null) { + userData = new MeEntity(); + libaoEntity.setMe(userData); + } + + List userDataLibaoList = userData.getUserDataLibaoList(); + if (userDataLibaoList == null) { + userDataLibaoList = new ArrayList<>(); + userData.setUserDataLibaoList(userDataLibaoList); + } + userDataLibaoList.add(userDataLibaoEntity); + + } + private static void uploadEvent(LibaoEntity libaoEntity, boolean isTao, String entrance) { String location = ""; if (!libaoEntity.getClickReceiveBtnIn()) { @@ -738,4 +736,8 @@ public class LibaoUtils { void postFailed(Throwable error); } + + public interface OnLibaoStatusChangeListener { + void onLibaoStatusChange(); + } } diff --git a/app/src/main/java/com/gh/gamecenter/LibaoDetailActivity.java b/app/src/main/java/com/gh/gamecenter/LibaoDetailActivity.java index d3d123dfcb..2c2624e924 100644 --- a/app/src/main/java/com/gh/gamecenter/LibaoDetailActivity.java +++ b/app/src/main/java/com/gh/gamecenter/LibaoDetailActivity.java @@ -436,7 +436,7 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA mIsScroll = isScroll; } - @Override + /*@Override public boolean handleBackPressed() { // 重置领取状态 if (mLibaoEntity == null) { @@ -447,7 +447,7 @@ public class LibaoDetailActivity extends ToolBarActivity implements LibaoDetailA mLibaoEntity.setStatus(mListStatus); } return false; - } + }*/ @Override public void loadDone() { 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 df04310970..ce974a877e 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java @@ -235,7 +235,7 @@ public class LibaoDetailAdapter extends BaseRecyclerAdapter { List userDataLibaoList = mLibaoEntity.getMe().getUserDataLibaoList(); LibaoUtils.initLibaoBtn(mContext, holder.libaoCopyBtn, mLibaoEntity, mLibaoDetailEntity.getInstallRequired(), this, false, - StringUtils.buildString(mEntrance, "+(礼包详情[", mLibaoEntity.getName(), "])")); + StringUtils.buildString(mEntrance, "+(礼包详情[", mLibaoEntity.getName(), "])"), null); if (mLibaoEntity.getUniversal()) { holder.libaoDes.setVisibility(View.GONE); } else { @@ -275,7 +275,7 @@ public class LibaoDetailAdapter extends BaseRecyclerAdapter { if (mLibaoEntity.getStatus() != null && mLibaoDetailEntity != null) { LibaoUtils.initLibaoBtn(mContext, holder.libaoCopyBtn, mLibaoEntity, mLibaoDetailEntity.getInstallRequired(), this, false, - StringUtils.buildString(mEntrance, "+(礼包详情[", mLibaoEntity.getName(), "])")); + StringUtils.buildString(mEntrance, "+(礼包详情[", mLibaoEntity.getName(), "])") ,null); } // 判断按钮状态是否为空(礼包详情进入),重新获取 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 6ae11f61a4..f2b13d79dc 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 @@ -198,14 +198,14 @@ class DescFragment : BaseFragment(), IScrollable { MtaHelper.onEvent("游戏详情_新", "游戏礼包", "${mViewModel.game?.name}+${liBao.name}") startActivityForResult(intent, 100) } - R.id.receiveTv -> { + /*R.id.receiveTv -> { val liBao = data as LibaoEntity if (liBao.status == "ling") { MtaHelper.onEvent("游戏详情_新", "游戏礼包[领取]", "${mViewModel.game?.name}+${liBao.name}") } val intent = LibaoDetailActivity.getIntent(context, liBao, true, "游戏详情") 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 cf9606a3d9..eba5ffc191 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 @@ -56,6 +56,7 @@ class GameLibaoAdapter(val context: Context, val libaos: ArrayList, holder.binding.libaoSchedulePb.visibility = View.GONE holder.binding.remainingTv.visibility = View.GONE holder.binding.libaoCodeTv.visibility = View.VISIBLE + holder.binding.copyLibaoCodeIv.visibility = View.GONE if (!UserManager.getInstance().isLoggedIn) { holder.binding.libaoCodeTv.text = "礼包码:-" @@ -69,7 +70,8 @@ class GameLibaoAdapter(val context: Context, val libaos: ArrayList, val code = libaoEntity.me?.userDataLibaoList?.get(size - 1)?.code ?: "" val text = "礼包码:$code" holder.binding.libaoCodeTv.text = SpanBuilder(text).color(4, text.length, R.color.theme_font).build() - holder.binding.libaoCodeTv.setOnClickListener { + holder.binding.copyLibaoCodeIv.visibility = View.VISIBLE + holder.binding.copyLibaoCodeIv.setOnClickListener { code.copyTextAndToast("$code 复制成功") } } @@ -103,7 +105,8 @@ class GameLibaoAdapter(val context: Context, val libaos: ArrayList, val code = libaoEntity.me?.userDataLibaoList?.get(size - 1)?.code ?: "" val text = "礼包码:$code" holder.binding.libaoCodeTv.text = SpanBuilder(text).color(4, text.length, R.color.theme_font).build() - holder.binding.libaoCodeTv.setOnClickListener { + holder.binding.copyLibaoCodeIv.visibility = View.VISIBLE + holder.binding.copyLibaoCodeIv.setOnClickListener { code.copyTextAndToast("$code 复制成功") } } @@ -118,13 +121,16 @@ class GameLibaoAdapter(val context: Context, val libaos: ArrayList, } - LibaoUtils.setLiBaoBtnStatusRound(holder.binding.receiveTv, libaoEntity,true, context) +// LibaoUtils.setLiBaoBtnStatusRound(holder.binding.receiveTv, libaoEntity,true, context) + LibaoUtils.initLibaoBtn(context, holder.binding.receiveTv, libaoEntity, false, null, true, "游戏详情"){ + notifyItemChanged(position) + } holder.itemView.setOnClickListener { listListener?.onListClick(it, position, libaoEntity) } - holder.binding.receiveTv.setOnClickListener { - listListener?.onListClick(it, position, libaoEntity) - } +// holder.binding.receiveTv.setOnClickListener { +// listListener?.onListClick(it, position, libaoEntity) +// } } is MoreViewHolder -> { holder.binding.arrowIv.rotation = if (mIsExpand) 180f else 0f 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 35245e40ab..e18179d75b 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/Libao2Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/libao/Libao2Fragment.java @@ -220,7 +220,7 @@ public class Libao2Fragment extends BaseFragment implements SwipeRefreshLayout.O default: LibaoEntity libaoEntity = (LibaoEntity) data; adapter.setSkipPosition(position); - intent = LibaoDetailActivity.getIntent(getContext(), libaoEntity, view.getId() == R.id.libao_btn_status, mEntrance + "+(礼包中心:关注)"); + intent = LibaoDetailActivity.getIntent(getContext(), libaoEntity, false, 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 ee7bdb0d40..db0ac554a4 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/Libao2FragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/libao/Libao2FragmentAdapter.java @@ -226,8 +226,13 @@ class Libao2FragmentAdapter extends BaseRecyclerAdapter { holder.libaoDes.setText(content); if (libaoEntity.getStatus() != null) { -// LibaoUtils.initLibaoBtn(mContext, holder.libaoBtnStatus, libaoEntity, false, null, true,mEntrance + "+(礼包中心:关注)"); - LibaoUtils.setLiBaoBtnStatusRound(holder.libaoBtnStatus, libaoEntity, true, mContext); + LibaoUtils.initLibaoBtn(mContext, holder.libaoBtnStatus, libaoEntity, false, null, true, mEntrance + "+(礼包中心:关注)", new LibaoUtils.OnLibaoStatusChangeListener() { + @Override + public void onLibaoStatusChange() { + notifyItemChanged(position); + } + }); +// LibaoUtils.setLiBaoBtnStatusRound(holder.libaoBtnStatus, libaoEntity, true, mContext); } } 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 cd8836dba8..18b8de5730 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/LibaoNewAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/libao/LibaoNewAdapter.kt @@ -201,9 +201,11 @@ class LibaoNewAdapter(context: Context, callBackListener: OnRequestCallBackListe holder.libaoDes.text = content if (libaoEntity.status != null) { -// LibaoUtils.initLibaoBtn(mContext, holder.libaoBtnStatus, libaoEntity, false, null, true, -// mEntrance + "+(礼包中心:最新)") - LibaoUtils.setLiBaoBtnStatusRound(holder.libaoBtnStatus, libaoEntity, true, mContext) + LibaoUtils.initLibaoBtn(mContext, holder.libaoBtnStatus, libaoEntity, false, null, true, + mEntrance + "+(礼包中心:最新)"){ + notifyItemChanged(position) + } +// LibaoUtils.setLiBaoBtnStatusRound(holder.libaoBtnStatus, libaoEntity, true, mContext) } } 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 9001473575..07738f8474 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/LibaoNewFragment.java +++ b/app/src/main/java/com/gh/gamecenter/libao/LibaoNewFragment.java @@ -283,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, view.getId() == R.id.libao_btn_status, mEntrance + "+(礼包中心:最新)"); + Intent intent = LibaoDetailActivity.getIntent(getContext(), libaoEntity, false, 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 4791a4489b..22b3a013fe 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/LibaoSearchAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/libao/LibaoSearchAdapter.kt @@ -216,7 +216,9 @@ class LibaoSearchAdapter(fragment: LibaoSearchFragment, if (libaoEntity.status != null) { LibaoUtils.initLibaoBtn(mContext, holder.libaoBtnStatus, libaoEntity, false, null,false, - mEntrance + "+(礼包中心:最新)") + mEntrance + "+(礼包中心:最新)"){ + notifyItemChanged(position) + } } holder.libaoBtnStatus.isClickable = false } diff --git a/app/src/main/res/drawable-xxxhdpi/ic_libao_code_copy.png b/app/src/main/res/drawable-xxxhdpi/ic_libao_code_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..4bf992c669236044db53207dfd32481c15425e4d GIT binary patch literal 738 zcmV<80v-K{P)WGF1fQpVJ4?sh4v4rHL;1xpX((wQ^D0T7x@B#@6 zl5HA-0zvX1A2|X=;(wx@_}1QQuDIVjGvCha?W~t+;2$1%{1gC$3>Y|pPyz!_fUpRL z5(p)rBp@Q3u6|tq!%Y!c zaOng(7Bg=VUwu}NuI;1GwCP{~ zS}wErjSE{afH*I=iR8h_Owjw8OVRS@m+_tpM@}2#_Ur1-&tLVr2t7X0@J^K_4_(-W z0VH|x?cW9O%H`;;b?}n_8wfv+>fOKai4Mvvy>X!c;=K58^{uiLhUdajEBkN|Rt}(W ztn7OOAjyk;A-dH7W1=r*md>N_&eC}UAYHAV)FK;AFcI@&u@b)<6o4k!S0d5)o4Ixo z{Bbs6Ls``zX5CI@UINqJJD39Sp?5F?;7jjd2Edoz!3=;ey@MG5UwQ{K0A2rWqV@v- zbc=x!os6f|qkf<|)PBeS*F-}G91}oO5S;+64z(Xj040kO4J8mt;12<9#-N#q>QMV( z4RB4gw`+j5xj|D9odB&4wXY}v-K#Ow0c~KY9<>hxXglCwrb3usRHJ0Gmx~~B#Kla9 zbN7;)pPup&Is@p8YIUf6I0G67+73B;51@f?+A(+UOTa1xwd10ClM+CU_i_=`1RntO zu@?v#pd^4ULds!bIci_E4}h&Vdj?M~Rha?k-K#Op?2mVio?NUn%K)Tz&_X?rzU^wQ z833erI8Q*DXOPR)rU1_B9W;SxwA$ + + Date: Fri, 20 Aug 2021 16:13:21 +0800 Subject: [PATCH 088/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.1.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA2=E6=9C=9F-?= =?UTF-8?q?=E5=9F=8B=E7=82=B9=E6=96=87=E6=A1=A3(0820=20=E4=BA=A7=E5=93=81?= =?UTF-8?q?=E9=AA=8C=E6=94=B6=E9=97=AE=E9=A2=98)=20https://git.ghzs.com/pm?= =?UTF-8?q?/halo-app-issues/-/issues/1303?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/NewLogUtils.kt | 17 ++++++++++++- .../java/com/gh/common/util/ShareUtils.java | 25 +++++++++++++++---- .../com/gh/gamecenter/WeiBoShareActivity.java | 16 ++++++++++++ .../gh/gamecenter/wxapi/WXEntryActivity.java | 16 ++++++++++++ 4 files changed, 68 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/NewLogUtils.kt b/app/src/main/java/com/gh/common/util/NewLogUtils.kt index ed034e2167..933f376ece 100644 --- a/app/src/main/java/com/gh/common/util/NewLogUtils.kt +++ b/app/src/main/java/com/gh/common/util/NewLogUtils.kt @@ -465,7 +465,7 @@ object NewLogUtils { fun logShareTypeClick(shareType: String) { val json = json { "location" to "分享面板" - "event" to "view_detail_share_panel" + "event" to "share_type" "meta" to LogUtils.getMetaObject() "share_type" to shareType "launch_id" to Tracker.launchId @@ -475,6 +475,21 @@ object NewLogUtils { log(json, "bbs_community", false) } + //分享结果 + @JvmStatic + fun logShareResult(shareResult: Boolean){ + val json = json { + "location" to "分享面板" + "event" to "share_result" + "meta" to LogUtils.getMetaObject() + "share_success" to shareResult + "launch_id" to Tracker.launchId + "session_id" to Tracker.sessionId + "timestamp" to System.currentTimeMillis() / 1000 + } + log(json, "bbs_community", false) + } + //分享面板点击 fun logSharePanelClick(event: String, userId: String, contentType: String, contentId: String, bbsId: String, bbsType: String) { val json = json { diff --git a/app/src/main/java/com/gh/common/util/ShareUtils.java b/app/src/main/java/com/gh/common/util/ShareUtils.java index 667eb403e4..b5e62cf516 100644 --- a/app/src/main/java/com/gh/common/util/ShareUtils.java +++ b/app/src/main/java/com/gh/common/util/ShareUtils.java @@ -148,6 +148,11 @@ public class ShareUtils { if (ShareUtils.shareEntrance == ShareEntrance.inviteFriends) { IntegralLogHelper.INSTANCE.logInviteResult("成功", mShareType.getName()); } + if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.askNormal || + ShareUtils.shareEntrance == ShareEntrance.communityArticle || + ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video) { + NewLogUtils.logShareResult(true); + } } @Override @@ -158,6 +163,11 @@ public class ShareUtils { if (ShareUtils.shareEntrance == ShareEntrance.inviteFriends) { IntegralLogHelper.INSTANCE.logInviteResult("失败", mShareType.getName()); } + if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.askNormal || + ShareUtils.shareEntrance == ShareEntrance.communityArticle || + ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video) { + NewLogUtils.logShareResult(false); + } } @Override @@ -168,6 +178,11 @@ public class ShareUtils { if (ShareUtils.shareEntrance == ShareEntrance.inviteFriends) { IntegralLogHelper.INSTANCE.logInviteResult("取消", mShareType.getName()); } + if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.askNormal || + ShareUtils.shareEntrance == ShareEntrance.communityArticle || + ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video) { + NewLogUtils.logShareResult(false); + } } }; @@ -215,23 +230,23 @@ public class ShareUtils { // 分享 switch (way) { - case "qq" : + case "qq": mShareType = ShareType.qq; qqShare(); break; - case "qq_zone" : + case "qq_zone": mShareType = ShareType.qqZone; qZoneShare(); break; - case "wechat" : + case "wechat": mShareType = ShareType.wechat; wechatShare(); break; - case "wechat_moments" : + case "wechat_moments": mShareType = ShareType.wechatMoments; wechatMomentsShare(); break; - case "weibo" : + case "weibo": mShareType = ShareType.weibo; sinaWeiboShare(); break; diff --git a/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java b/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java index 30e3af9026..343823a8d4 100644 --- a/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java +++ b/app/src/main/java/com/gh/gamecenter/WeiBoShareActivity.java @@ -18,6 +18,7 @@ import com.gh.common.util.EnergyTaskHelper; import com.gh.common.util.ImageUtils; import com.gh.common.util.IntegralLogHelper; import com.gh.common.util.LogUtils; +import com.gh.common.util.NewLogUtils; import com.gh.common.util.ShareUtils; import com.gh.gamecenter.eventbus.EBShare; import com.lightgame.utils.Utils; @@ -233,6 +234,11 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.inviteFriends) { IntegralLogHelper.INSTANCE.logInviteResult("成功", "微博"); } + if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.askNormal || + ShareUtils.shareEntrance == ShareUtils.ShareEntrance.communityArticle || + ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video) { + NewLogUtils.logShareResult(true); + } } else { IntegralLogHelper.INSTANCE.logInviteResult("成功", "微博"); } @@ -248,6 +254,11 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.inviteFriends) { IntegralLogHelper.INSTANCE.logInviteResult("取消", "微博"); } + if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.askNormal || + ShareUtils.shareEntrance == ShareUtils.ShareEntrance.communityArticle || + ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video) { + NewLogUtils.logShareResult(false); + } } else { IntegralLogHelper.INSTANCE.logInviteResult("取消", "微博"); } @@ -263,6 +274,11 @@ public class WeiBoShareActivity extends Activity implements WbShareCallback { if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.inviteFriends) { IntegralLogHelper.INSTANCE.logInviteResult("失败", "微博"); } + if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.askNormal || + ShareUtils.shareEntrance == ShareUtils.ShareEntrance.communityArticle || + ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video) { + NewLogUtils.logShareResult(false); + } } else { IntegralLogHelper.INSTANCE.logInviteResult("失败", "微博"); } diff --git a/app/src/main/java/com/gh/gamecenter/wxapi/WXEntryActivity.java b/app/src/main/java/com/gh/gamecenter/wxapi/WXEntryActivity.java index cbf327d454..d2bad101ae 100644 --- a/app/src/main/java/com/gh/gamecenter/wxapi/WXEntryActivity.java +++ b/app/src/main/java/com/gh/gamecenter/wxapi/WXEntryActivity.java @@ -11,6 +11,7 @@ import com.gh.common.constant.Config; import com.gh.common.util.EnergyTaskHelper; import com.gh.common.util.LogUtils; import com.gh.common.util.LoginHelper; +import com.gh.common.util.NewLogUtils; import com.gh.common.util.ShareUtils; import com.gh.gamecenter.R; import com.gh.gamecenter.eventbus.EBShare; @@ -77,6 +78,11 @@ public class WXEntryActivity extends Activity implements IWXAPIEventHandler, WeC LogUtils.uploadShareResult(ShareUtils.shareType, ShareUtils.shareEntrance.getName(), "success", ShareUtils.shareEntity.getShareUrl(), ShareUtils.shareEntity.getShareTitle(), ShareUtils.shareEntity.getSummary(), ShareUtils.resourceId); EnergyTaskHelper.postEnergyTaskForShare(ShareUtils.shareEntrance.getName(), ShareUtils.resourceId, ShareUtils.shareEntity.getShareUrl()); + if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.askNormal || + ShareUtils.shareEntrance == ShareUtils.ShareEntrance.communityArticle || + ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video) { + NewLogUtils.logShareResult(true); + } } else { if (baseResp instanceof SendAuth.Resp) { SendAuth.Resp resp = (SendAuth.Resp) baseResp; @@ -94,6 +100,11 @@ public class WXEntryActivity extends Activity implements IWXAPIEventHandler, WeC resultString = getString(R.string.share_cancel_hint); LogUtils.uploadShareResult(ShareUtils.shareType, ShareUtils.shareEntrance.getName(), "cancel", ShareUtils.shareEntity.getShareUrl(), ShareUtils.shareEntity.getShareTitle(), ShareUtils.shareEntity.getSummary(), ShareUtils.resourceId); + if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.askNormal || + ShareUtils.shareEntrance == ShareUtils.ShareEntrance.communityArticle || + ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video) { + NewLogUtils.logShareResult(false); + } } else { resultString = "登录已取消"; } @@ -112,6 +123,11 @@ public class WXEntryActivity extends Activity implements IWXAPIEventHandler, WeC resultString = "分享错误"; LogUtils.uploadShareResult(ShareUtils.shareType, ShareUtils.shareEntrance.getName(), "fail", ShareUtils.shareEntity.getShareUrl(), ShareUtils.shareEntity.getShareTitle(), ShareUtils.shareEntity.getSummary(), ShareUtils.resourceId); + if (ShareUtils.shareEntrance == ShareUtils.ShareEntrance.askNormal || + ShareUtils.shareEntrance == ShareUtils.ShareEntrance.communityArticle || + ShareUtils.shareEntrance == ShareUtils.ShareEntrance.video) { + NewLogUtils.logShareResult(false); + } } else { resultString = "登录错误"; } From 1d9e1bc9d88ea4b398ced74d0939342ec0bca799 Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Sat, 21 Aug 2021 10:57:45 +0800 Subject: [PATCH 089/151] =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gh/base/BaseSimpleDao.kt | 93 +++ .../main/java/com/gh/common/DefaultJsApi.kt | 2 +- .../java/com/gh/common/constant/Config.java | 2 +- .../com/gh/common/constant/Constants.java | 6 +- .../com/gh/common/exposure/ExposureUtils.kt | 2 +- .../simulator/SimulatorDownloadManager.kt | 2 +- .../common/simulator/SimulatorGameManager.kt | 2 +- .../java/com/gh/common/util/DataLogUtils.java | 2 +- .../java/com/gh/common/util/DialogHelper.kt | 1 + .../gh/common/util/DownloadDialogHelper.kt | 2 +- .../java/com/gh/common/util/Extensions.kt | 8 + .../java/com/gh/common/util/GameUtils.java | 1 + .../com/gh/common/util/HomePluggableHelper.kt | 5 +- .../java/com/gh/common/util/InstallUtils.java | 2 +- .../java/com/gh/common/util/LogUtils.java | 4 +- .../com/gh/common/util/NotificationHelper.kt | 2 +- .../java/com/gh/common/util/PackageUtils.java | 35 +- .../main/java/com/gh/common/util/SpUtils.kt | 21 +- .../java/com/gh/common/view/RichEditor.java | 3 +- .../java/com/gh/download/DownloadManager.java | 5 + .../java/com/gh/gamecenter/MainActivity.java | 5 +- .../gh/gamecenter/SplashScreenActivity.java | 4 +- .../com/gh/gamecenter/SuggestionActivity.java | 4 +- .../gamecenter/download/DownloadFragment.kt | 70 +- .../DownloadedGameIdAndPackageNameDao.kt | 14 + .../download/GameDownloadFragment.java | 26 + .../download/GameUpdateFragmentAdapter.java | 2 +- .../InstalledGameFragmentAdapter.java | 4 +- .../download/UpdatableGameAdapter.kt | 428 ++++++++++++ .../download/UpdatableGameFragment.kt | 81 +++ .../download/UpdatableGameViewModel.kt | 638 ++++++++++++++++++ .../com/gh/gamecenter/entity/ApkEntity.kt | 4 + .../com/gh/gamecenter/entity/GameInstall.kt | 6 +- .../gh/gamecenter/entity/GameUpdateEntity.kt | 8 +- .../game/upload/GameUploadFragment.kt | 3 +- .../gamedetail/GameDetailFragment.kt | 2 +- .../gamedetail/desc/DescViewModel.kt | 2 +- .../history/HistoryApkListAdapter.kt | 2 +- .../rating/edit/RatingEditActivity.kt | 4 +- .../gh/gamecenter/help/QaFeedbackViewModel.kt | 2 +- .../manager/DataCollectionManager.java | 4 +- .../gh/gamecenter/manager/UpdateManager.java | 8 +- .../packagehelper/PackageRepository.kt | 38 +- .../packagehelper/PackageViewModel.kt | 24 +- .../personal/NewPersonalFragment.kt | 2 +- .../gamecenter/personal/PersonalFragment.kt | 2 +- .../gamecenter/personal/PersonalViewModel.kt | 4 +- .../gamecenter/qa/select/VotingViewModel.java | 2 +- .../receiver/InstallAndUninstallReceiver.java | 4 +- .../retrofit/OkHttpCacheInterceptor.java | 2 +- .../setting/GameDownloadSettingFragment.kt | 2 +- .../simulatorgame/SimulatorGameListAdapter.kt | 2 +- .../SimulatorManagementAdapter.kt | 2 +- .../video/upload/view/UploadVideoActivity.kt | 2 +- .../main/java/com/halo/assistant/HaloApp.java | 2 +- .../assistant/fragment/AboutFragment.java | 2 +- .../assistant/fragment/SettingsFragment.java | 4 +- .../res/drawable-xxxhdpi/ic_arrow_blue.png | Bin 633 -> 0 bytes .../res/drawable-xxxhdpi/ic_arrow_blue.webp | Bin 0 -> 600 bytes .../drawable-xxxhdpi/ic_arrow_down_blue.png | Bin 0 -> 204 bytes .../drawable-xxxhdpi/ic_arrow_down_grey.webp | Bin 0 -> 198 bytes .../res/drawable-xxxhdpi/ic_arrow_up_blue.png | Bin 0 -> 198 bytes .../drawable-xxxhdpi/ic_arrow_up_grey.webp | Bin 0 -> 194 bytes .../ic_arrow_up_light_blue.png | Bin 0 -> 208 bytes .../main/res/drawable-xxxhdpi/ic_dot_more.png | Bin 0 -> 217 bytes .../drawable-xxxhdpi/ic_downloading_hint.webp | Bin 0 -> 776 bytes app/src/main/res/layout/downloadmanager.xml | 37 + .../res/layout/fragment_game_updatable.xml | 42 ++ .../main/res/layout/item_updatable_game.xml | 109 +++ .../res/layout/item_updatable_game_header.xml | 36 + .../layout/item_updatable_other_game_hint.xml | 35 + .../res/layout/tab_item_download_number.xml | 4 +- app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/strings.xml | 1 + 74 files changed, 1763 insertions(+), 118 deletions(-) create mode 100644 app/src/main/java/com/gh/base/BaseSimpleDao.kt create mode 100644 app/src/main/java/com/gh/gamecenter/download/DownloadedGameIdAndPackageNameDao.kt create mode 100644 app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt create mode 100644 app/src/main/java/com/gh/gamecenter/download/UpdatableGameFragment.kt create mode 100644 app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_arrow_blue.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_arrow_blue.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_arrow_down_blue.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_arrow_down_grey.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_arrow_up_blue.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_arrow_up_grey.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_arrow_up_light_blue.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_dot_more.png create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_downloading_hint.webp create mode 100644 app/src/main/res/layout/fragment_game_updatable.xml create mode 100644 app/src/main/res/layout/item_updatable_game.xml create mode 100644 app/src/main/res/layout/item_updatable_game_header.xml create mode 100644 app/src/main/res/layout/item_updatable_other_game_hint.xml diff --git a/app/src/main/java/com/gh/base/BaseSimpleDao.kt b/app/src/main/java/com/gh/base/BaseSimpleDao.kt new file mode 100644 index 0000000000..147c777753 --- /dev/null +++ b/app/src/main/java/com/gh/base/BaseSimpleDao.kt @@ -0,0 +1,93 @@ +package com.gh.base + +import android.content.Context +import android.content.SharedPreferences +import com.gh.common.util.SPUtils +import com.halo.assistant.HaloApp + +/** + * 用 SP 实现的简单列表持久化结构 + */ +abstract class BaseSimpleDao { + + // 使用独有的 SP 文件 + private val mSp: SharedPreferences by lazy { + HaloApp.getInstance().application.getSharedPreferences("SimpleDao", Context.MODE_PRIVATE) + } + + fun add(key: String) { + val originString = SPUtils.getString(mSp, getSPKey()) + + if (originString.isEmpty()) { + // Insert keyword only for the very first time. + SPUtils.setString(mSp, getSPKey(), key) + } else { + getAll()?.let { + if (getMaxSize() != -1 && it.size > getMaxSize()) { + it.removeAt(it.size - 1) + } + + // Move keyword to the very front if it exists. + if (it.contains(key)) { + it.remove(key) + } + it.add(0, key) + val builder = StringBuilder() + for ((index, k) in it.withIndex()) { + builder.append(k) + if (index != it.size - 1) { + builder.append(DIVIDER_KEY) + } + } + SPUtils.setString(mSp, getSPKey(), builder.toString()) + } + } + } + + fun delete(key: String) { + val originString = SPUtils.getString(mSp, getSPKey()) + + if (originString.isEmpty()) { + // do nothing + } else { + getAll()?.let { + if (it.contains(key)) { + it.remove(key) + } + val builder = StringBuilder() + for ((index, k) in it.withIndex()) { + builder.append(k) + if (index != it.size - 1) { + builder.append(DIVIDER_KEY) + } + } + SPUtils.setString(mSp, getSPKey(), builder.toString()) + } + } + } + + fun getAll(): ArrayList? { + val list = SPUtils.getString(mSp, getSPKey()).split(DIVIDER_KEY) + + return if (list.size == 1 && list[0].isEmpty()) null else ArrayList(list) + } + + fun getRawString(): String = SPUtils.getString(mSp, getSPKey()) + + fun contains(key: String): Boolean { + return getAll()?.contains(key) == true + } + + fun deleteAll() { + SPUtils.setString(mSp, getSPKey(), "") + } + + open fun getMaxSize(): Int = -1 + + abstract fun getSPKey(): String + + companion object { + private const val DIVIDER_KEY = "<-||->" + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/DefaultJsApi.kt b/app/src/main/java/com/gh/common/DefaultJsApi.kt index 4d3c2fcef3..3587e0a99c 100644 --- a/app/src/main/java/com/gh/common/DefaultJsApi.kt +++ b/app/src/main/java/com/gh/common/DefaultJsApi.kt @@ -108,7 +108,7 @@ class DefaultJsApi(var context: Context) { @JavascriptInterface fun getAppVersionCode(msg: Any): Int { - return PackageUtils.getVersionCode() + return PackageUtils.getGhVersionCode() } @JavascriptInterface diff --git a/app/src/main/java/com/gh/common/constant/Config.java b/app/src/main/java/com/gh/common/constant/Config.java index 39b990b3f5..174b4b684f 100644 --- a/app/src/main/java/com/gh/common/constant/Config.java +++ b/app/src/main/java/com/gh/common/constant/Config.java @@ -280,7 +280,7 @@ public class Config { public static void getGhzsSettings() { String channel = HaloApp.getInstance().getChannel(); RetrofitManager.getInstance(HaloApp.getInstance().getApplication()) - .getSensitiveApi().getSettings(PackageUtils.getVersionName(), channel) + .getSensitiveApi().getSettings(PackageUtils.getGhVersionName(), channel) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Response() { 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 fe82cf3855..7665fde049 100644 --- a/app/src/main/java/com/gh/common/constant/Constants.java +++ b/app/src/main/java/com/gh/common/constant/Constants.java @@ -93,11 +93,11 @@ public class Constants { // 今天是否已经触发了 “通知管理” 引导弹窗 public static final String SP_IS_SHOWED_NOTIFICATION_TODAY = "show_is_notification_today"; // v4.0.0已废弃,标记安装的游戏为已玩过弹窗,最多取消2次 (https://gitlab.ghzs.com/pm/halo-app-issues/issues/722 调整为版本相关) (不是常量了也放这里好像有点奇怪) - public static final String SP_MARK_INSTALLED_GAME = "mark_installed_game" + PackageUtils.getVersionName(); + public static final String SP_MARK_INSTALLED_GAME = "mark_installed_game" + PackageUtils.getGhVersionName(); // 标记安装的游戏为已玩过弹窗(个人主页最多弹一次) - public static final String SP_MARK_INSTALLED_GAME_USER_HOME = "mark_installed_game_user_home" + PackageUtils.getVersionName(); + public static final String SP_MARK_INSTALLED_GAME_USER_HOME = "mark_installed_game_user_home" + PackageUtils.getGhVersionName(); // 标记安装的游戏为已玩过弹窗(我的游戏最多弹一次) - public static final String SP_MARK_INSTALLED_GAME_MY_GAME = "mark_installed_game_my_game" + PackageUtils.getVersionName(); + public static final String SP_MARK_INSTALLED_GAME_MY_GAME = "mark_installed_game_my_game" + PackageUtils.getGhVersionName(); //视频详情滑动引导 public static final String SP_SHOW_SLIDE_GUIDE = "show_slide_guide"; //视频详情点击引导 diff --git a/app/src/main/java/com/gh/common/exposure/ExposureUtils.kt b/app/src/main/java/com/gh/common/exposure/ExposureUtils.kt index 37042e04f6..c147810094 100644 --- a/app/src/main/java/com/gh/common/exposure/ExposureUtils.kt +++ b/app/src/main/java/com/gh/common/exposure/ExposureUtils.kt @@ -76,7 +76,7 @@ object ExposureUtils { if (PackageUtils.isCanUpdate(apkEntity, gameId)) { DownloadType.PLUGIN_UPDATE } else { - if (Version(apkEntity.version).isHigherThan(PackageUtils.getVersionByPackage(apkEntity.packageName))) { + if (Version(apkEntity.version).isHigherThan(PackageUtils.getVersionNameByPackageName(apkEntity.packageName))) { DownloadType.UPDATE } else { DownloadType.DOWNLOAD diff --git a/app/src/main/java/com/gh/common/simulator/SimulatorDownloadManager.kt b/app/src/main/java/com/gh/common/simulator/SimulatorDownloadManager.kt index fd02bf3931..778826c6e9 100644 --- a/app/src/main/java/com/gh/common/simulator/SimulatorDownloadManager.kt +++ b/app/src/main/java/com/gh/common/simulator/SimulatorDownloadManager.kt @@ -112,7 +112,7 @@ class SimulatorDownloadManager private constructor() { return } val isInstalled = PackageUtils.isInstalledFromAllPackage(context, simulator?.apk?.packageName) - val versionFromInstalledApp = PackageUtils.getVersionByPackage(simulator?.apk?.packageName) + val versionFromInstalledApp = PackageUtils.getVersionNameByPackageName(simulator?.apk?.packageName) val shouldShowUpdate = Version(simulator?.apk?.version).isHigherThan(versionFromInstalledApp) val title = if (shouldShowUpdate && isInstalled) "更新模拟器" else "安装模拟器" val message = if (shouldShowUpdate && isInstalled) "检测到模拟器存在更高版本,是否前往更新" else "模拟器游戏需要先下载安装对应的模拟器,才可以运行" diff --git a/app/src/main/java/com/gh/common/simulator/SimulatorGameManager.kt b/app/src/main/java/com/gh/common/simulator/SimulatorGameManager.kt index ff93f116bb..0bd81702a8 100644 --- a/app/src/main/java/com/gh/common/simulator/SimulatorGameManager.kt +++ b/app/src/main/java/com/gh/common/simulator/SimulatorGameManager.kt @@ -85,7 +85,7 @@ object SimulatorGameManager { @JvmStatic fun launchSimulatorGame(downloadEntity: DownloadEntity, gameEntity: GameEntity) { - val versionFromInstalledApp = PackageUtils.getVersionByPackage(gameEntity.simulator?.apk?.packageName) + val versionFromInstalledApp = PackageUtils.getVersionNameByPackageName(gameEntity.simulator?.apk?.packageName) val shouldShowUpdate = Version(gameEntity.simulator?.apk?.version).isHigherThan(versionFromInstalledApp) updateSimulatorConfigFile(gameId = gameEntity.id) diff --git a/app/src/main/java/com/gh/common/util/DataLogUtils.java b/app/src/main/java/com/gh/common/util/DataLogUtils.java index df7f2de0fc..21440726c0 100644 --- a/app/src/main/java/com/gh/common/util/DataLogUtils.java +++ b/app/src/main/java/com/gh/common/util/DataLogUtils.java @@ -48,7 +48,7 @@ public class DataLogUtils { // 上传日志 public static void uploadLog(Context context, String topic, Map map) { - String version = PackageUtils.getVersionName(); + String version = PackageUtils.getGhVersionName(); String user = Installation.getUUID(context); String channel = HaloApp.getInstance().getChannel(); map.put("version", version); diff --git a/app/src/main/java/com/gh/common/util/DialogHelper.kt b/app/src/main/java/com/gh/common/util/DialogHelper.kt index 68d5158cb6..fba1d088e3 100644 --- a/app/src/main/java/com/gh/common/util/DialogHelper.kt +++ b/app/src/main/java/com/gh/common/util/DialogHelper.kt @@ -65,6 +65,7 @@ object DialogHelper { if (it.showCloseIcon) { binding.closeContainer.visibility = View.VISIBLE + binding.closeContainer.enlargeTouchArea() binding.closeContainer.setOnClickListener { dialog.dismiss() } } } diff --git a/app/src/main/java/com/gh/common/util/DownloadDialogHelper.kt b/app/src/main/java/com/gh/common/util/DownloadDialogHelper.kt index 7e5814a9e3..314ebe9f38 100644 --- a/app/src/main/java/com/gh/common/util/DownloadDialogHelper.kt +++ b/app/src/main/java/com/gh/common/util/DownloadDialogHelper.kt @@ -29,7 +29,7 @@ object DownloadDialogHelper { if (downloadDialog.isNullOrEmpty()) return null for (dialog in downloadDialog) { - val versionName = PackageUtils.getVersionName() + val versionName = PackageUtils.getGhVersionName() val noticeVersions = dialog.rule.noticeVersions if (noticeVersions.isEmpty() || noticeVersions.contains(versionName)) { // 共有 8 种可能 diff --git a/app/src/main/java/com/gh/common/util/Extensions.kt b/app/src/main/java/com/gh/common/util/Extensions.kt index 5e60700ce9..c67a9c3d2a 100644 --- a/app/src/main/java/com/gh/common/util/Extensions.kt +++ b/app/src/main/java/com/gh/common/util/Extensions.kt @@ -12,6 +12,7 @@ import android.graphics.drawable.Drawable import android.graphics.drawable.GradientDrawable import android.os.Build import android.text.* +import android.text.format.Formatter import android.text.style.ClickableSpan import android.text.style.ImageSpan import android.text.style.URLSpan @@ -852,6 +853,13 @@ fun Int.toSimpleCount(): String { return NumberUtils.transSimpleCount(this) } +/** + * Long related + */ +fun Long.toProperReadableSize(): String { + return Formatter.formatFileSize(HaloApp.getInstance().application, this) +} + /** * Image related */ diff --git a/app/src/main/java/com/gh/common/util/GameUtils.java b/app/src/main/java/com/gh/common/util/GameUtils.java index 90e368995e..0b55a93c57 100644 --- a/app/src/main/java/com/gh/common/util/GameUtils.java +++ b/app/src/main/java/com/gh/common/util/GameUtils.java @@ -225,6 +225,7 @@ public class GameUtils { gameUpdateEntity.setIndexPlugin(gameEntity.getIndexPlugin()); gameUpdateEntity.setPluginDesc(gameEntity.getPluginDesc()); gameUpdateEntity.setFormat(apkEntity.getFormat()); + gameUpdateEntity.setCurrentVersion(PackageUtils.getVersionNameByPackageName(apkEntity.getPackageName())); GameCollectionEntity pluggableCollection = getPluggableCollectionFromGameEntity(gameEntity, apkEntity.getPackageName()); if (pluggableCollection != null) { diff --git a/app/src/main/java/com/gh/common/util/HomePluggableHelper.kt b/app/src/main/java/com/gh/common/util/HomePluggableHelper.kt index 1e87908ee1..6d3ccef881 100644 --- a/app/src/main/java/com/gh/common/util/HomePluggableHelper.kt +++ b/app/src/main/java/com/gh/common/util/HomePluggableHelper.kt @@ -5,6 +5,9 @@ import com.gh.gamecenter.entity.HomePluggableFilterEntity import com.gh.gamecenter.room.AppDatabase import com.halo.assistant.HaloApp +/** + * 首页插件化区域辅助类 + */ object HomePluggableHelper { private val mHomePluggableFilterDao = AppDatabase.getInstance(HaloApp.getInstance().application).homePluggableFilterDao() @@ -56,7 +59,7 @@ object HomePluggableHelper { } } catch (e: Exception) { e.printStackTrace() - toastInInternalRelease("数据库/磁盘已满,插件筛选失败") + toastInInternalRelease("插件化筛选出现异常") } } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/util/InstallUtils.java b/app/src/main/java/com/gh/common/util/InstallUtils.java index 4e8fb3fd42..0a438acd58 100644 --- a/app/src/main/java/com/gh/common/util/InstallUtils.java +++ b/app/src/main/java/com/gh/common/util/InstallUtils.java @@ -64,7 +64,7 @@ public class InstallUtils { keys.add(packageName); DownloadEntity downloadEntity = DownloadManager.getInstance(context).getDownloadEntityByPackageName(packageName); - String installVersion = PackageUtils.getVersionByPackage(packageName); + String installVersion = PackageUtils.getVersionNameByPackageName(packageName); if (!TextUtils.isEmpty(installVersion) && downloadEntity != null && installVersion.equals(downloadEntity.getVersionName())) { if (!downloadEntity.isPluggable() || PackageUtils.isSignedByGh(context, packageName)) { diff --git a/app/src/main/java/com/gh/common/util/LogUtils.java b/app/src/main/java/com/gh/common/util/LogUtils.java index 7710b9e81f..259493edfd 100644 --- a/app/src/main/java/com/gh/common/util/LogUtils.java +++ b/app/src/main/java/com/gh/common/util/LogUtils.java @@ -262,7 +262,7 @@ public class LogUtils { Context context = HaloApp.getInstance().getApplication(); try { - object.put("version", PackageUtils.getVersionName()); + object.put("version", PackageUtils.getGhVersionName()); object.put("channel", HaloApp.getInstance().getChannel()); object.put("dia", MetaUtil.getBase64EncodedAndroidId()); object.put("time", Utils.getTime(context)); @@ -287,7 +287,7 @@ public class LogUtils { private static void uploadToReservation(JSONObject object) { Context context = HaloApp.getInstance().getApplication(); try { - object.put("version", PackageUtils.getVersionName()); + object.put("version", PackageUtils.getGhVersionName()); object.put("channel", HaloApp.getInstance().getChannel()); object.put("dia", MetaUtil.getBase64EncodedAndroidId()); object.put("time", Utils.getTime(context)); diff --git a/app/src/main/java/com/gh/common/util/NotificationHelper.kt b/app/src/main/java/com/gh/common/util/NotificationHelper.kt index 22a34e3717..9d89443464 100644 --- a/app/src/main/java/com/gh/common/util/NotificationHelper.kt +++ b/app/src/main/java/com/gh/common/util/NotificationHelper.kt @@ -15,7 +15,7 @@ object NotificationHelper { @JvmStatic fun showNotificationHintDialog(ugc: NotificationUgc, callBack: ((isShow: Boolean) -> Unit)? = null) { val showedNewVersion = SPUtils.getInt(Constants.SP_SHOWED_NOTIFICATION_NEW_VERSION, 0) - val currentVersion = PackageUtils.getVersionCode() + val currentVersion = PackageUtils.getGhVersionCode() // 版本升级后重置数据 if (currentVersion > showedNewVersion) { SPUtils.setBoolean(Constants.SP_SHOWED_NOTIFICATION_LOGIN, false) diff --git a/app/src/main/java/com/gh/common/util/PackageUtils.java b/app/src/main/java/com/gh/common/util/PackageUtils.java index a0c627bda1..c7eac0709d 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -87,6 +87,9 @@ public class PackageUtils { updateEntity.setIndexPlugin(gameEntity.getIndexPlugin()); updateEntity.setPluginDesc(gameEntity.getPluginDesc()); updateEntity.setFormat(apkEntity.getFormat()); + updateEntity.setSignature(apkEntity.getSignature()); + updateEntity.setCategory(gameEntity.getCategory()); + updateEntity.setCurrentVersion(PackageUtils.getVersionNameByPackageName(apkEntity.getPackageName())); updateList.add(updateEntity); } } @@ -97,7 +100,7 @@ public class PackageUtils { // ghVersion 不存在即是非插件游戏 if (TextUtils.isEmpty(apkEntity.getGhVersion())) { String versionFromRequest = apkEntity.getVersion(); - String versionFromInstalledApp = getVersionByPackage(apkEntity.getPackageName()); + String versionFromInstalledApp = getVersionNameByPackageName(apkEntity.getPackageName()); // 是否需要显示更新 boolean shouldShowUpdate = apkEntity.getForce(); @@ -125,6 +128,9 @@ public class PackageUtils { updateEntity.setIndexPlugin(gameEntity.getIndexPlugin()); updateEntity.setPluginDesc(gameEntity.getPluginDesc()); updateEntity.setFormat(apkEntity.getFormat()); + updateEntity.setSignature(apkEntity.getSignature()); + updateEntity.setCategory(gameEntity.getCategory()); + updateEntity.setCurrentVersion(PackageUtils.getVersionNameByPackageName(apkEntity.getPackageName())); updateList.add(updateEntity); } } @@ -438,21 +444,21 @@ public class PackageUtils { /* * 返回光环助手的版本信息 */ - public static String getVersionName() { + public static String getGhVersionName() { return BuildConfig.VERSION_NAME; } /* * 返回光环助手的版本code */ - public static int getVersionCode() { + public static int getGhVersionCode() { return BuildConfig.VERSION_CODE; } /* - * 获取apk的版本 + * 获取apk的 versionName */ - public static String getVersionByPackage(String packageName) { + public static String getVersionNameByPackageName(String packageName) { try { return HaloApp.getInstance().getApplication().getPackageManager().getPackageInfo(packageName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT).versionName; @@ -462,11 +468,24 @@ public class PackageUtils { return null; } + /* + * 获取apk的版本 versionCode + */ + public static int getVersionCodeByPackageName(String packageName) { + try { + return HaloApp.getInstance().getApplication().getPackageManager().getPackageInfo(packageName, + PackageManager.COMPONENT_ENABLED_STATE_DEFAULT).versionCode; + } catch (NameNotFoundException e) { + e.printStackTrace(); + } + return 0; + } + /* - * 获取apk的版本 + * 获取应用的 icon */ - public static Drawable getIconByPackage(Context context, String packageName) { + public static Drawable getIconByPackageName(Context context, String packageName) { try { PackageManager packageManager = context.getApplicationContext().getPackageManager(); return packageManager.getApplicationIcon(packageName); @@ -630,7 +649,7 @@ public class PackageUtils { // ghVersion 不存在即是非插件游戏 if (TextUtils.isEmpty(apkEntity.getGhVersion())) { String versionFromRequest = apkEntity.getVersion(); - String versionFromInstalledApp = getVersionByPackage(apkEntity.getPackageName()); + String versionFromInstalledApp = getVersionNameByPackageName(apkEntity.getPackageName()); // 是否需要显示更新 boolean shouldShowUpdate = apkEntity.getForce(); 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 0b7551873b..db004f46f2 100644 --- a/app/src/main/java/com/gh/common/util/SpUtils.kt +++ b/app/src/main/java/com/gh/common/util/SpUtils.kt @@ -23,7 +23,7 @@ object SPUtils { @JvmStatic fun getString(key: String): String { - return sp.getString(key, "")?:"" + return sp.getString(key, "") ?: "" } @JvmStatic @@ -81,19 +81,30 @@ object SPUtils { return context.getSharedPreferences("Halo", Context.MODE_PRIVATE).getBoolean(key, defaultValue) } + /** + * 使用传入的 SP 来存储 KV + */ @JvmStatic - fun setString(sp: SharedPreferences, key: String, value: String? = null) { + fun setString(sharedPreferences: SharedPreferences, key: String, value: String? = null) { try { - val commitStatus = sp.edit().putString(key, value).commit() + val commitStatus = sharedPreferences.edit().putString(key, value).commit() if (!commitStatus) { - sp.edit().putString(key, value).apply() + sharedPreferences.edit().putString(key, value).apply() } } catch (e: Exception) { e.printStackTrace() - sp.edit().putString(key, value).apply() + sharedPreferences.edit().putString(key, value).apply() } } + /** + * 使用传入的 SP 来读取 KV + */ + @JvmStatic + fun getString(sharedPreferences: SharedPreferences, key: String, value: String? = null): String { + return sharedPreferences.getString(key, "") ?: "" + } + @JvmStatic fun setStringSet(key: String, values: Set) { sp.edit().putStringSet(key, values).apply() diff --git a/app/src/main/java/com/gh/common/view/RichEditor.java b/app/src/main/java/com/gh/common/view/RichEditor.java index 0a80e4b6c7..fda2f83a94 100644 --- a/app/src/main/java/com/gh/common/view/RichEditor.java +++ b/app/src/main/java/com/gh/common/view/RichEditor.java @@ -11,7 +11,6 @@ import android.util.AttributeSet; import android.view.Gravity; import android.webkit.JavascriptInterface; import android.webkit.WebChromeClient; -import android.webkit.WebResourceRequest; import android.webkit.WebView; import android.webkit.WebViewClient; @@ -728,7 +727,7 @@ public class RichEditor extends WebView { @JavascriptInterface public int getAppVersionCode() { - return PackageUtils.getVersionCode(); + return PackageUtils.getGhVersionCode(); } /** diff --git a/app/src/main/java/com/gh/download/DownloadManager.java b/app/src/main/java/com/gh/download/DownloadManager.java index 3fd672a9e7..a6ad40c445 100644 --- a/app/src/main/java/com/gh/download/DownloadManager.java +++ b/app/src/main/java/com/gh/download/DownloadManager.java @@ -32,6 +32,7 @@ import com.gh.common.util.PackageUtils; import com.gh.common.util.PageSwitchDataHelper; import com.gh.common.util.SPUtils; import com.gh.gamecenter.BuildConfig; +import com.gh.gamecenter.download.DownloadedGameIdAndPackageNameDao; import com.gh.gamecenter.entity.ApkEntity; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.entity.GameUpdateEntity; @@ -88,6 +89,7 @@ public class DownloadManager implements DownloadStatusListener { private ArrayMap downloadingMap; private DownloadDao mDownloadDao; + private DownloadedGameIdAndPackageNameDao mDownloadedGameIdAndPackageNameDao; private Set mUpdateMarks; @@ -132,6 +134,8 @@ public class DownloadManager implements DownloadStatusListener { public void onTaskDone(DownloadEntity entity) { downloadingMap.remove(entity.getUrl()); + mDownloadedGameIdAndPackageNameDao.add(entity.getGameId() + entity.getPackageName()); + if (downloadingMap.isEmpty()) { DownloadWorkManager.cancelWorker(); } @@ -145,6 +149,7 @@ public class DownloadManager implements DownloadStatusListener { private DownloadManager(Context context) { mContext = context.getApplicationContext(); mDownloadDao = DownloadDao.getInstance(mContext); + mDownloadedGameIdAndPackageNameDao = new DownloadedGameIdAndPackageNameDao(); mUpdateMarks = SPUtils.getStringSet(UPDATE_IS_READ_MARK); diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index 80c1052ca5..3a4b18aa7c 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -203,7 +203,7 @@ public class MainActivity extends BaseActivity { mSp = PreferenceManager.getDefaultSharedPreferences(this); - isNewFirstLaunch = mSp.getBoolean("isNewFirstLaunchV" + PackageUtils.getVersionName(), true); + isNewFirstLaunch = mSp.getBoolean("isNewFirstLaunchV" + PackageUtils.getGhVersionName(), true); if (isNewFirstLaunch) { final LunchType lunchType = DeviceTokenUtils.getLaunchType(); // 延时两秒提交,避免提交时还没获取到 GID/OAID @@ -214,12 +214,11 @@ public class MainActivity extends BaseActivity { // 第一次打开App删除模拟器游戏记录(不包括更新版本) if (HaloApp.getInstance().isBrandNewInstall) { SimulatorGameManager.deleteAllSimulatorGame(); - } } }, 2000L); getPluginUpdate(); - mSp.edit().putBoolean("isNewFirstLaunchV" + PackageUtils.getVersionName(), false).apply(); + mSp.edit().putBoolean("isNewFirstLaunchV" + PackageUtils.getGhVersionName(), false).apply(); checkDevice(); // 根据设备信息判断用户是否是新用户 } diff --git a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java index 713450767c..3ba7d515d5 100644 --- a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.java @@ -98,7 +98,7 @@ public class SplashScreenActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); - mIsNewForThisVersion = mSharedPreferences.getBoolean("isNewFirstLaunchV" + PackageUtils.getVersionName(), true); + mIsNewForThisVersion = mSharedPreferences.getBoolean("isNewFirstLaunchV" + PackageUtils.getGhVersionName(), true); HaloApp.getInstance().isNewForThisVersion = mIsNewForThisVersion; super.onCreate(savedInstanceState); @@ -441,7 +441,7 @@ public class SplashScreenActivity extends BaseActivity { int index = name.indexOf("_"); if (index != -1) { String versionString = name.substring(name.indexOf("V") + 1, index); - Version currentVersion = new Version(PackageUtils.getVersionName()); + Version currentVersion = new Version(PackageUtils.getGhVersionName()); if (currentVersion.isHigherThan(versionString) || currentVersion.isEqual(versionString)) { file.delete(); } diff --git a/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java b/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java index e8589fb2e0..604f2fce15 100644 --- a/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SuggestionActivity.java @@ -1121,7 +1121,7 @@ public class SuggestionActivity extends ToolBarActivity implements OnRequestCall Map params = new HashMap<>(); params.put("from", mContactMethodEt.getText().toString()); - params.put("ghversion", PackageUtils.getVersionName()); + params.put("ghversion", PackageUtils.getGhVersionName()); params.put("channel", HaloApp.getInstance().getChannel()); params.put("type", android.os.Build.MODEL); params.put("sdk", String.valueOf(android.os.Build.VERSION.SDK_INT)); @@ -1151,7 +1151,7 @@ public class SuggestionActivity extends ToolBarActivity implements OnRequestCall Map params = new HashMap<>(); params.put("from", email); - params.put("ghversion", PackageUtils.getVersionName()); + params.put("ghversion", PackageUtils.getGhVersionName()); params.put("channel", HaloApp.getInstance().getChannel()); params.put("type", android.os.Build.MODEL); params.put("sdk", String.valueOf(android.os.Build.VERSION.SDK_INT)); diff --git a/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt b/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt index e11ec51fd1..c91c12f4e8 100644 --- a/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/download/DownloadFragment.kt @@ -15,6 +15,7 @@ import com.gh.common.util.visibleIf import com.gh.download.DownloadManager import com.gh.gamecenter.DownloadManagerActivity import com.gh.gamecenter.R +import com.gh.gamecenter.databinding.TabItemDownloadNumberBinding import com.gh.gamecenter.entity.HomePluggableFilterEntity import com.gh.gamecenter.entity.PluginLocation import com.gh.gamecenter.eventbus.EBDownloadChanged @@ -30,46 +31,44 @@ import org.greenrobot.eventbus.ThreadMode class DownloadFragment : BaseFragment_TabLayout() { - companion object { - const val INDEX_DOWNLOAD = 0 - const val INDEX_UPDATE = 1 - } - // 下载 tab 是否被手动选中过 private var mIsDownloadTabHasBeenSelected: Boolean = false private var mIsUpdateTabHasBeenSelected: Boolean = false - private lateinit var mDownloadNumber: TextView - private lateinit var mUpdateNumber: TextView - private lateinit var mDownloadManager: DownloadManager + private lateinit var mDownloadNumberTv: TextView + private lateinit var mUpdateNumberTv: TextView + private val mDownloadManager: DownloadManager by lazy { DownloadManager.getInstance(HaloApp.getInstance().application) } private var mPermanentInactivePluggableApkList: List? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mDownloadManager = DownloadManager.getInstance(HaloApp.getInstance().application) mPermanentInactivePluggableApkList = HomePluggableHelper.getPermanentInactivePluggablePackage() } override fun initFragmentList(fragments: MutableList) { fragments.add(GameDownloadFragment()) fragments.add(GameUpdateFragment()) + fragments.add(UpdatableGameFragment()) fragments.add(InstalledGameFragment()) } override fun initTabTitleList(tabTitleList: MutableList) { tabTitleList.add(getString(R.string.download_game)) tabTitleList.add(getString(R.string.download_tab_update)) - tabTitleList.add("已安装") + tabTitleList.add(getString(R.string.download_tab_update)) + tabTitleList.add(getString(R.string.download_tab_installed)) } override fun provideTabView(position: Int, tabTitle: String): View? { - var view = LayoutInflater.from(context).inflate(R.layout.tab_item_download_number, null) - (view.findViewById(R.id.tab_title) as TextView).text = tabTitle - when { - INDEX_DOWNLOAD == position -> mDownloadNumber = view.findViewById(R.id.tab_download_number) - INDEX_UPDATE == position -> mUpdateNumber = view.findViewById(R.id.tab_download_number) + val viewBinding = TabItemDownloadNumberBinding.inflate(LayoutInflater.from(context)) + var view: View? = viewBinding.root + viewBinding.tabTitle.text = tabTitle + + when (position) { + INDEX_DOWNLOAD -> mDownloadNumberTv = viewBinding.tabDownloadNumber + INDEX_UPDATE -> mUpdateNumberTv = viewBinding.tabDownloadNumber else -> view = null } return view @@ -86,7 +85,7 @@ class DownloadFragment : BaseFragment_TabLayout() { updateUpdateHint() updateDownloadHint() - if (mDownloadNumber.visibility != View.VISIBLE && mUpdateNumber.visibility == View.VISIBLE) { + if (mDownloadNumberTv.visibility != View.VISIBLE && mUpdateNumberTv.visibility == View.VISIBLE) { mViewPager.currentItem = INDEX_UPDATE } else { // 进入并选中下载管理时立马标记已下载待安装为已读 @@ -116,12 +115,6 @@ class DownloadFragment : BaseFragment_TabLayout() { override fun onPageSelected(index: Int) { EventBus.getDefault().post(EBUISwitch(DownloadManagerActivity.TAG, index)) - val tabName = when (index) { - INDEX_DOWNLOAD -> "游戏下载" - INDEX_UPDATE -> "游戏更新" - else -> "已安装" - } - if (index == INDEX_UPDATE) { mIsUpdateTabHasBeenSelected = true updateUpdateHint() @@ -131,8 +124,6 @@ class DownloadFragment : BaseFragment_TabLayout() { updateDownloadHint() mDownloadManager.markDownloadingTaskAsRead() } - -// MtaHelper.onEvent("下载管理", "Tab", tabName) } @Subscribe(threadMode = ThreadMode.MAIN) @@ -153,13 +144,13 @@ class DownloadFragment : BaseFragment_TabLayout() { } private fun updateDownloadHint() { - if (!::mDownloadNumber.isInitialized || !isAdded) return + if (!::mDownloadNumberTv.isInitialized || !isAdded) return val downloadData = DownloadManager.getInstance(context).allDownloadEntityExcludeSilentUpdate if (downloadData.size > 0) { - mDownloadNumber.visibility = View.VISIBLE + mDownloadNumberTv.visibility = View.VISIBLE } else { - mDownloadNumber.visibility = View.INVISIBLE + mDownloadNumberTv.visibility = View.INVISIBLE return } @@ -170,32 +161,32 @@ class DownloadFragment : BaseFragment_TabLayout() { } } - val layoutParams = mDownloadNumber.layoutParams as LinearLayout.LayoutParams + val layoutParams = mDownloadNumberTv.layoutParams as LinearLayout.LayoutParams when { downloadingCount > 0 -> { layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT layoutParams.setMargins(4F.dip2px(), 0, 0, 0F.dip2px()) - mDownloadNumber.setBackgroundColor(Color.TRANSPARENT) - mDownloadNumber.text = downloadingCount.toString() + mDownloadNumberTv.setBackgroundColor(Color.TRANSPARENT) + mDownloadNumberTv.text = downloadingCount.toString() } mDownloadManager.isContainsUnreadDownloadedTask -> { layoutParams.width = 6F.dip2px() layoutParams.height = 6F.dip2px() layoutParams.setMargins(2F.dip2px(), 0, 0, 3F.dip2px()) - mDownloadNumber.setBackgroundResource(R.drawable.oval_hint_red_bg) - mDownloadNumber.text = "" + mDownloadNumberTv.setBackgroundResource(R.drawable.oval_hint_red_bg) + mDownloadNumberTv.text = "" } - else -> mDownloadNumber.visibility = View.GONE + else -> mDownloadNumberTv.visibility = View.GONE } - mDownloadNumber.layoutParams = layoutParams + mDownloadNumberTv.layoutParams = layoutParams } private fun updateUpdateHint() { - if (!::mUpdateNumber.isInitialized) return + if (!::mUpdateNumberTv.isInitialized) return if (mIsUpdateTabHasBeenSelected) { - mUpdateNumber.visibility = View.INVISIBLE + mUpdateNumberTv.visibility = View.INVISIBLE return } @@ -205,7 +196,7 @@ class DownloadFragment : BaseFragment_TabLayout() { && mPermanentInactivePluggableApkList?.filter { it.pkgName == gameUpdateEntity.packageName }?.size == 0 }) - mUpdateNumber.visibleIf(updateCount != 0) + mUpdateNumberTv.visibleIf(updateCount != 0) } @Subscribe(threadMode = ThreadMode.MAIN) @@ -230,4 +221,9 @@ class DownloadFragment : BaseFragment_TabLayout() { } } + companion object { + const val INDEX_DOWNLOAD = 0 + const val INDEX_UPDATE = 1 + } + } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/download/DownloadedGameIdAndPackageNameDao.kt b/app/src/main/java/com/gh/gamecenter/download/DownloadedGameIdAndPackageNameDao.kt new file mode 100644 index 0000000000..1d5ccce3c8 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/download/DownloadedGameIdAndPackageNameDao.kt @@ -0,0 +1,14 @@ +package com.gh.gamecenter.download + +import com.gh.base.BaseSimpleDao + +/** + * 用来记录光环下载过什么包名和游戏ID件的一个简单类 + */ +class DownloadedGameIdAndPackageNameDao : BaseSimpleDao() { + + override fun getSPKey() = "downloaded_game_id_and_packagename" + + override fun getMaxSize(): Int = 1000 + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java index a894121c6a..8b72fc1079 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java @@ -40,6 +40,7 @@ import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; + import butterknife.BindView; import butterknife.OnClick; @@ -65,6 +66,8 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi TextView mNoDataSkipBtn; @BindView(R.id.downloadmanager_tv_allstart) TextView mDownloadmanagerAllstartTv; + @BindView(R.id.downloadingHintContainer) + View mDownloadingHintContainer; GameDownloadFragmentAdapter adapter; RelativeLayout.LayoutParams rparams; @@ -235,6 +238,13 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi mNoDataSkipHintTv.setText("暂无下载"); mNoDataSkipBtn.setText("去首页看看"); mNoDataSkipBtn.setOnClickListener(v -> MainActivity.skipToMainActivity(getActivity(), MainWrapperFragment.INDEX_HOME)); + mDownloadingHintContainer.setOnClickListener(v -> { + int downloadingPosition = adapter.getDoneList().size() + 2; + + if (adapter.getItemCount() > downloadingPosition) { + mDownloadmanagerRv.scrollToPosition(downloadingPosition); + } + }); mDownloadmanagerRv.setHasFixedSize(true); adapter = new GameDownloadFragmentAdapter(getActivity(), mNoDataSkip, url); @@ -282,6 +292,7 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi rparams.topMargin = 0; mDownloadmanagerHeadRl.setLayoutParams(rparams); } + showScrollToDownloadContainerIfNeeded(); } }); mDownloadmanagerRv.setOnDispatchTouchListener((v, event) -> { @@ -302,6 +313,7 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi adapter.initMap(); DownloadManager.getInstance(getActivity()).addObserver(dataWatcher); adapter.notifyDataSetChanged(); + showScrollToDownloadContainerIfNeeded(); if (adapter.getDownloadingList().isEmpty() && adapter.getDoneList().isEmpty()) { mNoDataSkip.setVisibility(View.VISIBLE); @@ -441,4 +453,18 @@ public class GameDownloadFragment extends BaseFragment implements View.OnClickLi mDownloadmanagerAllstartTv.setTextColor(ContextCompat.getColor(getContext(), R.color.btn_gray)); } + private void showScrollToDownloadContainerIfNeeded() { + LinearLayoutManager layoutManager = (LinearLayoutManager) mDownloadmanagerRv.getLayoutManager(); + if (layoutManager != null) { + int lastCompletelyVisibleItemPosition = layoutManager.findLastCompletelyVisibleItemPosition(); + + if (adapter.getDownloadingList().size() != 0 + && adapter.getDoneList().size() >= lastCompletelyVisibleItemPosition) { + mDownloadingHintContainer.setVisibility(View.VISIBLE); + } else { + mDownloadingHintContainer.setVisibility(View.GONE); + } + } + } + } diff --git a/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragmentAdapter.java index d3a26310c3..69362595d4 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragmentAdapter.java @@ -341,7 +341,7 @@ class GameUpdateFragmentAdapter extends BaseRecyclerAdapter implemen viewHolder.guName.postDelayed(() -> viewHolder.guName.setSelected(true), 2000); } - String currentVersion = PackageUtils.getVersionByPackage(updateEntity.getPackageName()); + String currentVersion = PackageUtils.getVersionNameByPackageName(updateEntity.getPackageName()); if (TextUtils.isEmpty(currentVersion)) { viewHolder.guCurrent.setText("当前:无"); } else { diff --git a/app/src/main/java/com/gh/gamecenter/download/InstalledGameFragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/download/InstalledGameFragmentAdapter.java index e82bacf7ac..99bd30459f 100644 --- a/app/src/main/java/com/gh/gamecenter/download/InstalledGameFragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/download/InstalledGameFragmentAdapter.java @@ -308,12 +308,12 @@ public class InstalledGameFragmentAdapter extends BaseRecyclerAdapter 0) { name = String.format("%s - %s", gameEntity.getName(), PlatformUtils.getInstance(mContext).getPlatformName(gameEntity.getApk().get(0).getPlatform())); - binding.gameIconIv.setImageDrawable(PackageUtils.getIconByPackage(mContext, gameEntity.getApk().get(0).getPackageName())); + binding.gameIconIv.setImageDrawable(PackageUtils.getIconByPackageName(mContext, gameEntity.getApk().get(0).getPackageName())); binding.gameIconDecoratorIv.setVisibility(View.GONE); if (SimulatorGameManager.isSimulatorGame(gameEntity)) { binding.gameDes.setText(String.format("V%s", gameEntity.getApk().get(0).getVersion())); } else { - binding.gameDes.setText(String.format("V%s", PackageUtils.getVersionByPackage(gameEntity.getApk().get(0).getPackageName()))); + binding.gameDes.setText(String.format("V%s", PackageUtils.getVersionNameByPackageName(gameEntity.getApk().get(0).getPackageName()))); } } else { name = gameEntity.getName(); diff --git a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt new file mode 100644 index 0000000000..8d29158c12 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt @@ -0,0 +1,428 @@ +package com.gh.gamecenter.download + +import android.annotation.SuppressLint +import android.graphics.Color +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.LinearLayout +import android.widget.TextView +import androidx.core.content.ContextCompat +import androidx.core.view.setPadding +import androidx.fragment.app.FragmentActivity +import androidx.recyclerview.widget.RecyclerView +import com.gh.common.exposure.ExposureEvent +import com.gh.common.exposure.ExposureEvent.Companion.createEvent +import com.gh.common.exposure.ExposureSource +import com.gh.common.exposure.IExposable +import com.gh.common.util.* +import com.gh.common.view.BugFixedPopupWindow +import com.gh.download.DownloadManager +import com.gh.download.dialog.DownloadDialog +import com.gh.gamecenter.DownloadManagerActivity +import com.gh.gamecenter.R +import com.gh.gamecenter.databinding.* +import com.gh.gamecenter.entity.GameUpdateEntity +import com.gh.gamecenter.eventbus.EBSkip +import com.gh.gamecenter.home.BlankDividerViewHolder +import com.gh.gamecenter.manager.PackagesManager +import com.lightgame.download.DownloadEntity +import com.lightgame.download.DownloadStatus +import org.greenrobot.eventbus.EventBus + +class UpdatableGameAdapter(private var mViewModel: UpdatableGameViewModel) : + RecyclerView.Adapter(), IExposable { + + private var mItemList: ArrayList? = null + private val mExposureSource by lazy { + ArrayList().apply { + add(ExposureSource("下载管理")) + add(ExposureSource("游戏更新")) + } + } + + fun submitList(dataList: ArrayList) { + mItemList = dataList + notifyDataSetChanged() + } + + override fun getItemViewType(position: Int): Int { + val item = mItemList!![position] + return when { + item.header != null || item.ignoredUpdateHeader != null -> TYPE_HEADER + item.normalUpdate != null || item.ignoredUpdate != null -> TYPE_NORMAL_GAME + item.normalUpdateWithArrow != null -> TYPE_NORMAL_GAME_WITH_ARROW + item.otherVersionUpdateHint != null -> TYPE_OTHER_VERSION_GAME_HINT + item.otherVersionUpdate != null -> TYPE_OTHER_VERSION_GAME + item.divider != null -> TYPE_DIVIDER + else -> TYPE_OTHER_VERSION_GAME + } + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return when (viewType) { + TYPE_HEADER -> UpdatableHeaderViewHolder(parent.toBinding()) + TYPE_NORMAL_GAME -> UpdatableGameViewHolder(parent.toBinding()) + TYPE_NORMAL_GAME_WITH_ARROW -> UpdatableGameViewHolder(parent.toBinding()) + TYPE_OTHER_VERSION_GAME -> UpdatableGameViewHolder(parent.toBinding()) + TYPE_OTHER_VERSION_GAME_HINT -> UpdatableOtherVersionGameHintViewHolder(parent.toBinding()) + TYPE_DIVIDER -> BlankDividerViewHolder(parent.toBinding()).also { + it.binding.container.layoutParams = + it.binding.container.layoutParams.apply { + height = 8F.dip2px() + } + } + else -> BlankDividerViewHolder(parent.toBinding()) + } + } + + @SuppressLint("SetTextI18n") + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + val itemData = mItemList?.get(position)!! + when (holder) { + is UpdatableHeaderViewHolder -> { + itemData.let { + holder.binding.updateAllBtn.enlargeTouchArea() + holder.binding.updateAllBtn.goneIf(!itemData.miscShowUpdateAll) + holder.binding.updateAllBtn.text = itemData.miscUpdateText + holder.binding.updateAllBtn.setOnClickListener { + if (itemData.miscUpdateText == "全部更新") { + mViewModel.updateAllMatchedVersionValidUpdate() + } + } + holder.binding.infoTv.text = itemData.header ?: itemData.ignoredUpdateHeader + if (itemData.header != null) { + holder.binding.infoTv.setTextColor(R.color.text_333333.toColor()) + holder.binding.root.setOnClickListener(null) + holder.binding.infoTv.setCompoundDrawablesWithIntrinsicBounds( + null, + null, + null, + null + ) + } else { + holder.binding.infoTv.setTextColor(R.color.text_999999.toColor()) + holder.binding.root.setOnClickListener { + mViewModel.toggleIgnoredUpdateVisibility() + } + holder.binding.infoTv.setCompoundDrawablesWithIntrinsicBounds( + null, + null, + if (mViewModel.isIgnoredUpdateExpanded()) { + R.drawable.ic_arrow_up_grey.toDrawable() + } else { + R.drawable.ic_arrow_down_grey.toDrawable() + }, + null + ) + } + } + } + is BlankDividerViewHolder -> { + if (itemData.divider == UpdatableGameViewModel.GREY) { + holder.binding.container.setBackgroundColor(R.color.text_F5F5F5.toColor()) + } else { + holder.binding.container.setBackgroundColor(Color.WHITE) + } + } + is UpdatableGameViewHolder -> { + val update: GameUpdateEntity = (itemData.normalUpdate + ?: itemData.normalUpdateWithArrow + ?: itemData.otherVersionUpdate + ?: itemData.ignoredUpdate)!! + + val context = holder.binding.root.context + val pluginDesc: String = update.pluginDesc.take(3) + val downloadManager = DownloadManager.getInstance(context) + + holder.binding.run { + otherVersionHintIv.goneIf(itemData.normalUpdateWithArrow == null) + + container.setOnClickListener { + DirectUtils.directToGameDetail( + context = context, + id = update.id, + entrance = mViewModel.entrance, + traceEvent = update.exposureEvent + ) + } + + if (itemData.otherVersionUpdate != null) { + container.setBackgroundColor(R.color.bg_F2F7FC.toColor()) + } else { + container.setBackgroundColor(Color.WHITE) + } + + iconIv.displayGameIcon(update.rawIcon ?: update.icon, update.iconSubscript) + val nameText = if (!update.readablePlatform.isNullOrEmpty()) { + update.name + " - " + update.readablePlatform + } else { + update.name + } + nameTv.text = nameText + currentVersionTv.text = "当前:V${update.currentVersion}" + newVersionTv.text = "新版:V${update.version} | ${update.size}" + optionIv.setOnClickListener { + showIgnoreOption(it, update, itemData.ignoredUpdate != null) + } + + val downloadEntity = downloadManager.getDownloadEntityByUrl(update.url) + updateUpdateBtn(updateBtn, downloadEntity, update, pluginDesc, downloadManager) + } + + generateExposureEvent(update) + } + is UpdatableOtherVersionGameHintViewHolder -> { + holder.binding.root.setOnClickListener { + mViewModel.toggleOtherVersionVisibility(itemData.miscPackageName) + } + if (itemData.otherVersionUpdateHint == true) { + holder.binding.selectorTv.setCompoundDrawablesWithIntrinsicBounds( + null, + null, + R.drawable.ic_arrow_up_blue.toDrawable(), + null + ) + } else { + holder.binding.selectorTv.setCompoundDrawablesWithIntrinsicBounds( + null, + null, + R.drawable.ic_arrow_down_blue.toDrawable(), + null + ) + } + holder.binding.closeHintTv.enlargeTouchArea() + holder.binding.closeHintTv.setOnClickListener { + DialogHelper.showDialog( + it.context, + title = "关闭提示", + content = "关闭提示后,将不再提示游戏其他版本的更新", + cancelText = "永不更新", + confirmText = "仅此次", + cancelClickCallback = { + mViewModel.suppressUpdate( + packageName = itemData.miscPackageName, + currentUpdatableVersion = itemData.miscVersion, + true + ) + }, + confirmClickCallback = { + mViewModel.suppressUpdate( + packageName = itemData.miscPackageName, + currentUpdatableVersion = itemData.miscVersion, + false + ) + }, + extraConfig = DialogHelper.Config(showCloseIcon = true) + ) + } + } + } + } + + override fun getItemCount() = mItemList?.size ?: 0 + + override fun getEventByPosition(pos: Int): ExposureEvent? { + return mItemList?.get(pos)?.normalUpdate?.exposureEvent + ?: mItemList?.get(pos)?.normalUpdateWithArrow?.exposureEvent + ?: mItemList?.get(pos)?.otherVersionUpdate?.exposureEvent + ?: mItemList?.get(pos)?.ignoredUpdate?.exposureEvent + } + + override fun getEventListByPosition(pos: Int): List? = null + + private fun showIgnoreOption(view: View, update: GameUpdateEntity, isUpdateIgnored: Boolean) { + val inflater = LayoutInflater.from(view.context) + val mainBinding = LayoutPopupContainerBinding.inflate(inflater) + val popupWindow = BugFixedPopupWindow( + mainBinding.root, + LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT + ) + + LayoutPopupOptionItemBinding.inflate(inflater, mainBinding.container, false).apply { + root.layoutParams = root.layoutParams.apply { + width = 92F.dip2px() + height = 44F.dip2px() + } + hintText.setPadding(0) + if (isUpdateIgnored) { + hintText.text = "取消忽略" + } else { + hintText.text = "忽略更新" + } + + root.setOnClickListener { + if (isUpdateIgnored) { + mViewModel.undoIgnoredUpdate(update.packageName) + } else { + mViewModel.ignoreUpdate(update.packageName) + } + popupWindow.dismiss() + } + mainBinding.container.addView(root) + } + + popupWindow.isTouchable = true + popupWindow.isFocusable = true + + popupWindow.showAutoOrientation(view) + } + + private fun updateUpdateBtn( + updateBtn: TextView, + downloadEntity: DownloadEntity?, + update: GameUpdateEntity, + pluginDesc: String, + downloadManager: DownloadManager + ) { + if (downloadEntity == null) { + if (PackagesManager.isCanUpdate(update.id, update.packageName)) { + updateBtn.setText(R.string.update) + updateBtn.setTextColor(Color.WHITE) + updateBtn.setBackgroundResource(R.drawable.download_button_normal_style) + } else if (update.isPluggable) { + updateBtn.text = "${pluginDesc}化" + updateBtn.setTextColor(Color.WHITE) + val samePackageNameDownloadEntity = + downloadManager.getDownloadEntityByPackageName(update.packageName) + if (samePackageNameDownloadEntity == null || samePackageNameDownloadEntity.url == update.url) { + updateBtn.isClickable = true + updateBtn.setBackgroundResource(R.drawable.download_button_pluggable_style) + } else { + updateBtn.isClickable = false + updateBtn.setBackgroundResource(R.drawable.game_item_btn_pause_up) + } + } else { + updateBtn.setText(R.string.launch) + updateBtn.setTextColor(R.color.theme_font.toColor()) + updateBtn.setBackgroundResource(R.drawable.detail_downloading_normal_style) + } + } else { + if (update.isPluggable) { + if (downloadEntity.status == DownloadStatus.done) { + updateBtn.setText(R.string.install) + updateBtn.setTextColor(Color.WHITE) + updateBtn.setBackgroundResource(R.drawable.download_button_pluggable_style) + } else { + updateBtn.setText(R.string.downloading) + updateBtn.setTextColor( + ContextCompat.getColorStateList( + updateBtn.context, + R.color.text_downloading_style + ) + ) + updateBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style) + } + } else { + if (downloadEntity.status == DownloadStatus.done) { + updateBtn.setText(R.string.install) + updateBtn.setTextColor(Color.WHITE) + updateBtn.setBackgroundResource(R.drawable.download_button_normal_style) + } else { + updateBtn.setText(R.string.downloading) + updateBtn.setTextColor( + ContextCompat.getColorStateList( + updateBtn.context, + R.color.text_downloading_style + ) + ) + updateBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style) + } + } + } + + updateBtn.setOnClickListener { + val str: String = updateBtn.text.toString() + if ("更新" == str || str.contains("化")) { + (updateBtn.context as FragmentActivity).checkStoragePermissionBeforeAction { + DialogUtils.checkDownload( + updateBtn.context, + update.size + ) { isSubscribe: Boolean -> + if (str.contains("化")) { + if (update.pluggableCollection != null) { + DownloadDialog.showDownloadDialog( + updateBtn.context, + update.transformGameEntity(), + update.exposureEvent, + mViewModel.entrance, + pluginDesc + "化:" + update.name + ) + return@checkDownload + } else { + updateBtn.setText(R.string.downloading) + updateBtn.setTextColor( + ContextCompat.getColorStateList( + updateBtn.context, + R.color.text_plugining_style + ) + ) + updateBtn.setBackgroundResource(R.drawable.game_item_btn_plugining_style) + } + } else { + updateBtn.setText(R.string.downloading) + updateBtn.setTextColor( + ContextCompat.getColorStateList( + updateBtn.context, + R.color.text_downloading_style + ) + ) + updateBtn.setBackgroundResource(R.drawable.game_item_btn_downloading_style) + } + + mViewModel.update(update, isSubscribe) + mViewModel.refreshList() + EventBus.getDefault() + .post( + EBSkip( + DownloadManagerActivity.TAG, + DownloadManagerActivity.INDEX_DOWNLOAD + ) + ) + } + } + } else if (updateBtn.context.getString(R.string.launch) == str) { + PackageUtils.launchApplicationByPackageName(updateBtn.context, update.packageName) + } else if (updateBtn.context.getString(R.string.downloading) == str) { + mViewModel.refreshList() + EventBus.getDefault().post( + EBSkip( + DownloadManagerActivity.TAG, + DownloadManagerActivity.INDEX_DOWNLOAD + ) + ) + } else if (updateBtn.context.getString(R.string.install) == str) { + PackageInstaller.install( + updateBtn.context, + DownloadManager.getInstance(updateBtn.context) + .getDownloadEntityByUrl(update.url) + ) + } + } + } + + private fun generateExposureEvent(updateEntity: GameUpdateEntity) { + updateEntity.exposureEvent = + createEvent(updateEntity.transformGameEntity(), mExposureSource) + } + + companion object { + const val TYPE_DIVIDER = 233 + const val TYPE_HEADER = 234 + const val TYPE_NORMAL_GAME = 235 + const val TYPE_NORMAL_GAME_WITH_ARROW = 236 + const val TYPE_OTHER_VERSION_GAME = 237 + const val TYPE_OTHER_VERSION_GAME_HINT = 238 + } + + class UpdatableHeaderViewHolder(val binding: ItemUpdatableGameHeaderBinding) : + RecyclerView.ViewHolder(binding.root) + + class UpdatableGameViewHolder(val binding: ItemUpdatableGameBinding) : + RecyclerView.ViewHolder(binding.root) + + class UpdatableOtherVersionGameHintViewHolder(val binding: ItemUpdatableOtherGameHintBinding) : + RecyclerView.ViewHolder(binding.root) + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameFragment.kt b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameFragment.kt new file mode 100644 index 0000000000..86d3a5ce01 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameFragment.kt @@ -0,0 +1,81 @@ +package com.gh.gamecenter.download + +import android.view.View +import androidx.recyclerview.widget.LinearLayoutManager +import com.gh.base.fragment.LazyFragment +import com.gh.common.exposure.ExposureListener +import com.gh.common.util.EntranceUtils +import com.gh.common.util.observeNonNull +import com.gh.common.util.viewModelProvider +import com.gh.gamecenter.MainActivity +import com.gh.gamecenter.R +import com.gh.gamecenter.databinding.FragmentGameUpdatableBinding +import com.gh.gamecenter.eventbus.EBDownloadStatus +import com.gh.gamecenter.eventbus.EBReuse +import com.gh.gamecenter.fragment.MainWrapperFragment +import com.gh.gamecenter.packagehelper.PackageViewModel +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode + +class UpdatableGameFragment : LazyFragment() { + + private var mViewModel: UpdatableGameViewModel? = null + private var mPackageViewModel: PackageViewModel? = null + private var mBinding: FragmentGameUpdatableBinding? = null + private val mAdapter: UpdatableGameAdapter by lazy { UpdatableGameAdapter(mViewModel!!) } + + override fun getRealLayoutId() = R.layout.fragment_game_updatable + override fun onRealLayoutInflated(inflatedView: View) { + mBinding = FragmentGameUpdatableBinding.bind(inflatedView) + } + + override fun onFragmentFirstVisible() { + val packageName = activity?.intent?.getStringExtra(EntranceUtils.KEY_PACKAGENAME) ?: "" + val entrance = activity?.intent?.getStringExtra(EntranceUtils.KEY_ENTRANCE) ?: "" + + mViewModel = viewModelProvider(UpdatableGameViewModel.Factory(packageName, entrance)) + + super.onFragmentFirstVisible() + + mPackageViewModel = viewModelProvider(PackageViewModel.Factory()) + mPackageViewModel?.getGameUpdateIncludeCurrentVersion() + ?.observeNonNull(viewLifecycleOwner) { updatableList -> + mViewModel?.setUpdatableList(updatableList) + } + mViewModel?.updatableData?.observe(viewLifecycleOwner) { + mAdapter.submitList(it) + } + } + + override fun initRealView() { + super.initRealView() + + mBinding?.run { + noDataContainer.reuseNodataSkipTvHint.text = "暂无更新" + noDataContainer.reuseNodataSkipTvBtn.text = "去首页看看" + noDataContainer.reuseNodataSkipTvBtn.setOnClickListener { + MainActivity.skipToMainActivity(activity, MainWrapperFragment.INDEX_HOME) + } + recyclerView.layoutManager = LinearLayoutManager(requireContext()) + recyclerView.adapter = mAdapter.also { + recyclerView.addOnScrollListener(ExposureListener(this@UpdatableGameFragment, it)) + } + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEventMainThread(status: EBDownloadStatus) { + if ("delete" == status.status || "download" == status.status || "done" == status.status) { + mViewModel?.refreshList() + } + } + + // 更新平台信息 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEventMainThread(reuse: EBReuse) { + if ("PlatformChanged" == reuse.type && isAdded) { + mViewModel?.refreshList() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt new file mode 100644 index 0000000000..639170c88d --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt @@ -0,0 +1,638 @@ +package com.gh.gamecenter.download + +import android.app.Application +import android.view.View +import androidx.lifecycle.* +import com.gh.base.BaseSimpleDao +import com.gh.common.constant.Constants +import com.gh.common.exposure.ExposureUtils +import com.gh.common.exposure.ExposureUtils.logADownloadExposureEvent +import com.gh.common.history.HistoryHelper.insertGameEntity +import com.gh.common.util.* +import com.gh.common.util.GsonUtils.toJson +import com.gh.common.util.PackageInstaller.createDownloadId +import com.gh.common.util.PackageInstaller.getDownloadPathWithId +import com.gh.download.DownloadManager +import com.gh.gamecenter.entity.GameEntity +import com.gh.gamecenter.entity.GameUpdateEntity +import com.gh.gamecenter.entity.PluginLocation +import com.gh.gamecenter.eventbus.EBDownloadChanged +import com.gh.gamecenter.retrofit.Response +import com.gh.gamecenter.retrofit.RetrofitManager +import com.halo.assistant.HaloApp +import com.lightgame.download.DownloadEntity +import com.lightgame.download.DownloadStatus +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.schedulers.Schedulers +import org.greenrobot.eventbus.EventBus +import java.util.* +import kotlin.collections.ArrayList + +class UpdatableGameViewModel( + application: Application, + private var mSpecialPackageName: String, + var entrance: String +) : AndroidViewModel(application) { + + private var mRawUpdatableList = ArrayList() + private var mUpdatableItemDataList = ArrayList() // 最终暴露给 View 层装饰好的数据 + + private var mPackageUpdateList = ArrayList() // 包名更新列表,包括了我的版本和其它版本 (如果存在的话) + + private var mUpdatableListLiveData = MutableLiveData>() + + private val mSuppressUpdateDao by lazy { SuppressUpdateDao() } + private val mIgnoredUpdateDao by lazy { IgnoredUpdateDao() } + private val mDownloadedGameIdAndPackageNameDao by lazy { DownloadedGameIdAndPackageNameDao() } + + // 缓存的匹配的游戏列表,列表刷新是会同时更新 + private val mCachedMatchedVersionValidUpdateList by lazy { arrayListOf() } + + private val mOtherVersionExpandedMap by lazy { hashMapOf() } + private var mShouldShowIgnoredUpdate = false + + var updatableData: LiveData> = mUpdatableListLiveData + + /** + * 更新可更新数据列表 + */ + fun setUpdatableList(updatableList: List) { + if (mRawUpdatableList != updatableList) { + mRawUpdatableList.clear() + + for (update in updatableList) { + // 筛选仅下载管理出现的插件化更新 + if (update.isShowPlugin(PluginLocation.only_index)) { + val platform = + PlatformUtils.getInstance(getApplication()).getPlatformName(update.platform) + if (!platform.isNullOrEmpty() && "官方版" != platform) { + update.readablePlatform = platform + } + + mRawUpdatableList.add(update) + } + } + } + + mUpdatableItemDataList.clear() + + sortUpdatableListByType(mRawUpdatableList) + + mPackageUpdateList = constructPackageUpdateList(mRawUpdatableList) + + mUpdatableItemDataList = transformUpdatableListIntoUpdatableItemDataList(mPackageUpdateList) + + if (mRawUpdatableList.isNotEmpty()) { + // TODO 父子 Fragment 共享同一个 ViewModel 来实现数据交流 + EventBus.getDefault().post( + EBDownloadChanged( + "update", + View.VISIBLE, + mCachedMatchedVersionValidUpdateList.size + ) + ) + } + + if (mSpecialPackageName.isNotEmpty()) { + var isAlreadyExisted = false + for (update in mRawUpdatableList) { + if (update.packageName == mSpecialPackageName) { + isAlreadyExisted = true + break + } + } + if (!isAlreadyExisted) { + getUpdateInfoByPackageName(mSpecialPackageName) + } + } + + mUpdatableListLiveData.postValue(mUpdatableItemDataList) + } + + /** + * 构建我的版本和其它版本列表(供后续修改处理) + */ + private fun constructPackageUpdateList(updatableList: ArrayList) + : ArrayList { + val packageNameAndUpdateListMap = hashMapOf>() + val packageUpdateList: ArrayList = arrayListOf() + + // 按包名分 + for (update in updatableList) { + var list = packageNameAndUpdateListMap[update.packageName] + if (list == null) { + list = arrayListOf() + packageNameAndUpdateListMap[update.packageName] = list + } + list.add(update) + } + + // 找到我的版本 + for ((packageName, list) in packageNameAndUpdateListMap) { + val sign = PackageUtils.getApkSignatureByPackageName(getApplication(), packageName) + val isSignByGh = PackageUtils.isSignedByGh(getApplication(), packageName) + val ghId = if (isSignByGh) PackageUtils.getGhId(packageName) else null + val versionName = PackageUtils.getVersionNameByPackageName(packageName) ?: "" + + var matchedVersionUpdate: GameUpdateEntity? = null + val mismatchedVersionUpdateList: ArrayList = arrayListOf() + + // 已安装的游戏为插件游戏,找插件包里的 GH_ID 跟我的版本一样的作为我的版本 + if (isSignByGh && ghId != null) { + for (update in list) { + if (update.id == ghId) { + matchedVersionUpdate = update + } else { + mismatchedVersionUpdateList.add(update) + } + } + } else if (mDownloadedGameIdAndPackageNameDao.contains(packageName)) { + // 光环曾经下载过对应包名的游戏,找到对应游戏ID的更新作为我的版本 + val idAndPackageNameString = mDownloadedGameIdAndPackageNameDao.getRawString() + for (update in list) { + if (idAndPackageNameString.contains(update.id)) { + matchedVersionUpdate = update + } else { + mismatchedVersionUpdateList.add(update) + } + } + } else if (list.find { it.signature == sign } != null) { + // 存在同包名同签名的游戏,以同包名同签名的游戏作为我的版本 + for (update in list) { + if (sign == update.signature) { + matchedVersionUpdate = update + } else { + mismatchedVersionUpdateList.add(update) + } + } + } else { + // 以同包名中七天下载量最高的游戏作为我的版本 + for (update in list) { + if (update.download >= matchedVersionUpdate?.download ?: 0) { + matchedVersionUpdate = update + } + + mismatchedVersionUpdateList.add(update) + } + + mismatchedVersionUpdateList.remove(matchedVersionUpdate) + mismatchedVersionUpdateList.sortBy { it.download } + } + + // 清理 mismatchedVersionUpdateList 的同版本数据,同版本只在找不到 matchedVersion 的时候作替补用 + val iterator = mismatchedVersionUpdateList.iterator() + while (iterator.hasNext()) { + val update = iterator.next() + if (update.version == versionName) { + iterator.remove() + continue + } + } + + // TODO 我的版本应该不会为空吧? + packageUpdateList.add( + PackageUpdate( + matchedVersionUpdate!!, + mismatchedVersionUpdateList + ) + ) + } + return packageUpdateList + } + + /** + * 将我的版本和其它版本列表变形成列表可显示的数据 + */ + private fun transformUpdatableListIntoUpdatableItemDataList(packageUpdateList: ArrayList) + : ArrayList { + val updatableDataItemList = arrayListOf() + + val validPackageUpdateList: ArrayList = arrayListOf() // 按钮为更新的我的游戏列表 + val invalidPackageUpdateList: ArrayList = arrayListOf() // 按钮为启动的我的游戏列表 + val ignoredPackageUpdateList: ArrayList = arrayListOf() // 被隐藏的我的游戏列表 + + val permanentSuppressedUpdatePackageNameList = mSuppressUpdateDao.getAll() + val ignoredUpdatePackageNameList = mIgnoredUpdateDao.getAll() + + mCachedMatchedVersionValidUpdateList.clear() + + for (packageUpdate in packageUpdateList) { + val packageName = packageUpdate.matchedVersionUpdate.packageName + val currentlyUpdatableVersion = packageUpdate.matchedVersionUpdate.currentVersion + + // 类型不为单机游戏/gj单机的游戏或选择了临时隐藏或永久隐藏的不需要显示其它版本 + if ((packageUpdate.matchedVersionUpdate.category != "local" && packageUpdate.matchedVersionUpdate.category != "gjlocal") + || permanentSuppressedUpdatePackageNameList?.contains(packageName) == true + || SPUtils.getBoolean(SP_TEMPORARY_SUPPRESS_UPDATE_PREFIX + packageName + currentlyUpdatableVersion) + ) { + packageUpdate.mismatchedVersionUpdateList.clear() + } + + // 被忽略的更新不需要显示其它版本 + if (ignoredUpdatePackageNameList?.contains(packageName) == true) { + // 若我的版本与当前应用版本一致那么取其它版本的第一个来替换成我的版本 (避免出现忽略更新列表显示按钮为启动的问题) +// if (packageUpdate.matchedVersionUpdate.version == PackageUtils.getVersionNameByPackageName(packageName) +// && packageUpdate.mismatchedVersionUpdateList.isNotEmpty()) { +// packageUpdate.matchedVersionUpdate = packageUpdate.mismatchedVersionUpdateList.first() +// } + packageUpdate.mismatchedVersionUpdateList.clear() + } + + // 根据状态分子列表 + // 1. 按钮为更新的我的游戏 + // 2. 按钮为启动的我的游戏 + // 3. 忽略更新的游戏 + when { + ignoredUpdatePackageNameList?.contains(packageName) == true -> { + ignoredPackageUpdateList.add(packageUpdate) + } + packageUpdate.matchedVersionUpdate.version == currentlyUpdatableVersion -> { + invalidPackageUpdateList.add(packageUpdate) + } + else -> { + validPackageUpdateList.add(packageUpdate) + } + } + } + + // 构建装饰好的页面列表 + if (validPackageUpdateList.isNotEmpty()) { + var totalMatchedVersionValidUpdateSize = 0L + val matchedVersionValidUpdateUrlList = arrayListOf() + val updateCount = validPackageUpdateList.size + for (packageUpdate in validPackageUpdateList) { + // 上一个样式为其它版本,添加白色分割线 + if (updatableDataItemList.lastOrNull()?.otherVersionUpdateHint != null + || updatableDataItemList.lastOrNull()?.otherVersionUpdate != null + ) { + updatableDataItemList.add(UpdatableDataItem(divider = WHITE)) + } + + if (packageUpdate.mismatchedVersionUpdateList.isNotEmpty()) { + updatableDataItemList.add(UpdatableDataItem(normalUpdateWithArrow = packageUpdate.matchedVersionUpdate)) + updatableDataItemList.add( + UpdatableDataItem( + otherVersionUpdateHint = mOtherVersionExpandedMap[packageUpdate.matchedVersionUpdate.packageName] == true, + miscPackageName = packageUpdate.matchedVersionUpdate.packageName, + miscVersion = packageUpdate.matchedVersionUpdate.currentVersion ?: "" + ) + ) + if (mOtherVersionExpandedMap[packageUpdate.matchedVersionUpdate.packageName] == true) { + for (update in packageUpdate.mismatchedVersionUpdateList) { + updatableDataItemList.add(UpdatableDataItem(otherVersionUpdate = update)) + } + } + } else { + updatableDataItemList.add(UpdatableDataItem(normalUpdate = packageUpdate.matchedVersionUpdate)) + } + + mCachedMatchedVersionValidUpdateList.add(packageUpdate.matchedVersionUpdate) + + totalMatchedVersionValidUpdateSize += sizeStringToLong( + packageUpdate.matchedVersionUpdate.size ?: "0M" + ) + + matchedVersionValidUpdateUrlList.add(packageUpdate.matchedVersionUpdate.url ?: "") + } + + val text = getUpdateTextFromUrlList(matchedVersionValidUpdateUrlList) + + updatableDataItemList.add( + 0, + UpdatableDataItem( + header = "${updateCount}个游戏可更新,共${ + totalMatchedVersionValidUpdateSize.toProperReadableSize().replace(" ", "") + }", + miscShowUpdateAll = true, + miscUpdateText = text + ) + ) + updatableDataItemList.add(0, UpdatableDataItem(divider = GREY)) + } + + if (invalidPackageUpdateList.isNotEmpty()) { + if (updatableDataItemList.size != 0) { + updatableDataItemList.add(UpdatableDataItem(divider = WHITE)) + } + updatableDataItemList.add(UpdatableDataItem(divider = GREY)) + updatableDataItemList.add(UpdatableDataItem(header = "以下游戏有其他版本可以更新")) + for (packageUpdate in validPackageUpdateList) { + if (packageUpdate.mismatchedVersionUpdateList.isNotEmpty()) { + updatableDataItemList.add(UpdatableDataItem(normalUpdateWithArrow = packageUpdate.matchedVersionUpdate)) + updatableDataItemList.add( + UpdatableDataItem( + otherVersionUpdateHint = mOtherVersionExpandedMap[packageUpdate.matchedVersionUpdate.packageName] == true + ) + ) + if (mOtherVersionExpandedMap[packageUpdate.matchedVersionUpdate.packageName] == true) { + for (update in packageUpdate.mismatchedVersionUpdateList) { + updatableDataItemList.add(UpdatableDataItem(otherVersionUpdate = update)) + } + } + } else { + updatableDataItemList.add(UpdatableDataItem(normalUpdate = packageUpdate.matchedVersionUpdate)) + } + } + } + + if (ignoredPackageUpdateList.isNotEmpty()) { + updatableDataItemList.add(UpdatableDataItem(divider = WHITE)) + updatableDataItemList.add(UpdatableDataItem(divider = GREY)) + updatableDataItemList.add(UpdatableDataItem(ignoredUpdateHeader = "${ignoredPackageUpdateList.size}个游戏已忽略更新")) + if (mShouldShowIgnoredUpdate) { + for (packageUpdate in ignoredPackageUpdateList) { + updatableDataItemList.add(UpdatableDataItem(ignoredUpdate = packageUpdate.matchedVersionUpdate)) + } + } + } + + return updatableDataItemList + } + + /** + * 根据所给的 url 列表返回头部右上角的文本内容 + */ + private fun getUpdateTextFromUrlList(matchedVersionValidUpdateUrlList: ArrayList) + : String { + var updateTaskCount = 0 + var updateCompleteTaskCount = 0 + for (url in matchedVersionValidUpdateUrlList) { + val downloadEntity = DownloadManager.getInstance(getApplication()) + .getDownloadEntityByUrl(url) + if (downloadEntity != null) { + updateTaskCount++ + if (downloadEntity.status == DownloadStatus.done) { + updateCompleteTaskCount++ + } + } + } + + return if (updateCompleteTaskCount == matchedVersionValidUpdateUrlList.size) { + "更新完成" + } else { + if (updateTaskCount == matchedVersionValidUpdateUrlList.size) { + "更新中" + } else { + "全部更新" + } + } + } + + /** + * 根据类型排序 + */ + private fun sortUpdatableListByType(list: List) { + tryCatchInRelease { + Collections.sort(list) { lhs, rhs -> + if ("光环助手" == rhs?.name) { + 1 + } else if (lhs?.name?.contains("光环助手") == true) { + -1 + } else if (lhs?.isPluggable != true && rhs?.isPluggable == true) { + -1 + } else if (lhs?.isPluggable == true && rhs?.isPluggable != true) { + 1 + } else { + 0 + } + } + } + } + + private fun getUpdateInfoByPackageName(packageName: String) { + val ghId: Any? = PackageUtils.getMetaData(getApplication(), packageName, "gh_id") + val retrofit = RetrofitManager.getInstance(getApplication()).api + + if (ghId == null) { + retrofit.loadGameDataByPackageName( + UrlFilterUtils.getFilterQuery("package", packageName) + ) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response?>() { + override fun onResponse(response: List?) { + response?.let { + for (game in response) { + val simpleUpdatableList: List = + PackageUtils.getUpdateData(game) + + if (simpleUpdatableList.isNotEmpty()) { + mRawUpdatableList.addAll(simpleUpdatableList) + } + } + } + refreshList() + } + }) + } else { + retrofit.getGameUpdateById(ghId as String) + .map(ApkActiveUtils.filterMapper) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: GameEntity?) { + val simpleUpdatableList: List = + PackageUtils.getUpdateData(response) + + mRawUpdatableList.addAll(simpleUpdatableList) + + refreshList() + } + }) + } + + mSpecialPackageName = "" + } + + fun toggleIgnoredUpdateVisibility() { + mShouldShowIgnoredUpdate = !mShouldShowIgnoredUpdate + setUpdatableList(mRawUpdatableList) + } + + fun toggleOtherVersionVisibility(packageName: String) { + mOtherVersionExpandedMap[packageName] = !(mOtherVersionExpandedMap[packageName] ?: false) + setUpdatableList(mRawUpdatableList) + } + + fun suppressUpdate( + packageName: String, + currentUpdatableVersion: String, + suppressPermanently: Boolean + ) { + if (suppressPermanently) { + mSuppressUpdateDao.add(packageName) + } else { + SPUtils.setBoolean( + SP_TEMPORARY_SUPPRESS_UPDATE_PREFIX + packageName + currentUpdatableVersion, + true + ) + } + setUpdatableList(mRawUpdatableList) + } + + fun ignoreUpdate(packageName: String) { + mIgnoredUpdateDao.add(packageName) + setUpdatableList(mRawUpdatableList) + } + + fun undoIgnoredUpdate(packageName: String) { + mIgnoredUpdateDao.delete(packageName) + setUpdatableList(mRawUpdatableList) + } + + fun isIgnoredUpdateExpanded(): Boolean { + return mShouldShowIgnoredUpdate + } + + /** + * 全部更新 (版本匹配的我的版本) + */ + fun updateAllMatchedVersionValidUpdate() { + for (update in mCachedMatchedVersionValidUpdateList) { + update(update, false) + } + } + + /** + * 更新列表状态 + */ + fun refreshList() { + setUpdatableList(mRawUpdatableList) + } + + /** + * 执行单个更新 + * @param update 更新内容 + * @param isSubscribe 是否延迟到连上 WIFI 才下载 + */ + fun update(update: GameUpdateEntity, isSubscribe: Boolean) { + val downloadType: ExposureUtils.DownloadType + val downloadId = createDownloadId(update.name) + + val downloadEntity = DownloadEntity() + downloadEntity.gameId = update.id + downloadEntity.url = update.url + downloadEntity.name = update.name + downloadEntity.path = getDownloadPathWithId(downloadId, update.format) + downloadEntity.eTag = update.etag + downloadEntity.icon = update.icon + downloadEntity.platform = update.platform + downloadEntity.packageName = update.packageName + downloadEntity.versionName = update.version + downloadEntity.addMetaExtra(Constants.RAW_GAME_ICON, update.rawIcon) + downloadEntity.addMetaExtra(Constants.GAME_ICON_SUBSCRIPT, update.iconSubscript) + downloadEntity.addMetaExtra(Constants.DOWNLOAD_ID, downloadId) + + val platform = PlatformUtils.getInstance(getApplication()).getPlatformName(update.platform) + if ("官方版" != platform) { + downloadEntity.isPlugin = true + } + if (update.isPluggable) { + downloadEntity.isPluggable = true + } else { + downloadEntity.isUpdate = true + } + + // 确定下载类型 + downloadType = when { + downloadEntity.isPluggable -> ExposureUtils.DownloadType.PLUGIN_DOWNLOAD + downloadEntity.isPlugin -> ExposureUtils.DownloadType.PLUGIN_UPDATE + else -> ExposureUtils.DownloadType.UPDATE + } + + val gameEntity = GameEntity(update.id, update.name) + gameEntity.gameVersion = update.version ?: "" + + val event = logADownloadExposureEvent( + gameEntity, + update.platform, + update.exposureEvent, + downloadType + ) + + downloadEntity.exposureTrace = toJson(event) + downloadEntity.entrance = "$entrance+(下载管理:游戏更新)" + downloadEntity.location = "游戏更新:列表" + if (update.name?.contains("光环助手") == true) { + DownloadManager.getInstance(getApplication()).pauseAll() + } + if (isSubscribe) { + DownloadManager.getInstance(getApplication()).subscribe(downloadEntity) + } else { + insertGameEntity(update) + DownloadManager.getInstance(getApplication()).add(downloadEntity) + } + + // 收集下载数据 + DataCollectionUtils.uploadDownload(getApplication(), downloadEntity, "开始") + } + + private fun sizeStringToLong(sizeString: String): Long { + val lastM = sizeString.lastIndexOf("M") + if (lastM != -1) { + return (sizeString.substring(0, lastM).toFloat() * 1024 * 1024).toLong() + } + return 0L + } + + companion object { + const val SP_TEMPORARY_SUPPRESS_UPDATE_PREFIX = "temporary_suppressed_update_prefix_" + + const val WHITE = "white" + const val GREY = "grey" + const val BLUE = "blue" + } + + /** + * - 分割线(包括灰色,白色和浅蓝色) + * - 信息头(包括更新信息和普通文本) + * - 忽略更新信息头 + * - 普通游戏 + * - 含小箭头的普通游戏 + * - 其它版本游戏 + * - 其它版本游戏提示(包括展开和收起状态) + * + * - 其它信息(包名) + */ + data class UpdatableDataItem( + var divider: String? = null, + var header: String? = null, + var ignoredUpdateHeader: String? = null, + var normalUpdate: GameUpdateEntity? = null, + var normalUpdateWithArrow: GameUpdateEntity? = null, + var ignoredUpdate: GameUpdateEntity? = null, + var otherVersionUpdate: GameUpdateEntity? = null, + var otherVersionUpdateHint: Boolean? = null, + + // 其它信息,是上面单独 item 信息的补充 + var miscPackageName: String = "", // 包名 + var miscVersion: String = "", // 版本 + var miscShowUpdateAll: Boolean = false, // 显示更新全部按钮 + var miscUpdateText: String = "" // 更新按钮的文案 (有`全部更新`,`更新中`,`已更新`三种) + ) + + private data class PackageUpdate( + var matchedVersionUpdate: GameUpdateEntity, // AKA 我的版本 + var mismatchedVersionUpdateList: ArrayList + ) + + private class SuppressUpdateDao : BaseSimpleDao() { + override fun getSPKey(): String = "suppressed_update" + } + + private class IgnoredUpdateDao : BaseSimpleDao() { + override fun getSPKey(): String = "ignored_update" + } + + class Factory(private var mSpecialPackageName: String, private var mEntrance: String) : + ViewModelProvider.NewInstanceFactory() { + override fun create(modelClass: Class): T { + return UpdatableGameViewModel( + HaloApp.getInstance().application, + mSpecialPackageName, + mEntrance + ) as T + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/entity/ApkEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/ApkEntity.kt index 734ae474de..fa96d3bf88 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/ApkEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/ApkEntity.kt @@ -33,6 +33,10 @@ data class ApkEntity(@SerializedName("package") @SerializedName("download_instruction") val downloadInstruction: String = "", var recommend: Recommend? = null, + @SerializedName("sign") + var signature: String? = "", + @SerializedName("version_code") + var versionCode: Int? = 0, // 以下是历史版本用的字段,其它地方可能会没有 @SerializedName("update_time") diff --git a/app/src/main/java/com/gh/gamecenter/entity/GameInstall.kt b/app/src/main/java/com/gh/gamecenter/entity/GameInstall.kt index eee109902c..ac98d2f447 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/GameInstall.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/GameInstall.kt @@ -11,7 +11,7 @@ data class GameInstall( var name: String? = "", var icon: String? = "", var iconSubScript: String? = "", - var isSignature: Boolean = false, + var isSignByGh: Boolean = false, var installTime: Long = 0, var version: String = "", var tag: Any? = null) { @@ -20,13 +20,13 @@ data class GameInstall( fun transformGameInstall(game: GameEntity, installedPkgName: String): GameInstall { val gameInstall = GameInstall() val application = HaloApp.getInstance().application - gameInstall.isSignature = PackageUtils.isSignedByGh(application, installedPkgName) + gameInstall.isSignByGh = PackageUtils.isSignedByGh(application, installedPkgName) gameInstall.installTime = PackageUtils.getInstalledTime(application, installedPkgName) gameInstall.id = game.id gameInstall.name = game.name gameInstall.icon = game.rawIcon ?: game.icon gameInstall.iconSubScript = game.iconSubscript - gameInstall.version = PackageUtils.getVersionByPackage(installedPkgName) + gameInstall.version = PackageUtils.getVersionNameByPackageName(installedPkgName) gameInstall.packageName = installedPkgName return gameInstall } diff --git a/app/src/main/java/com/gh/gamecenter/entity/GameUpdateEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/GameUpdateEntity.kt index f18ca384a8..cd5d2bdfb0 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/GameUpdateEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/GameUpdateEntity.kt @@ -17,10 +17,12 @@ data class GameUpdateEntity( var packageName: String = "", var size: String? = null, var version: String? = null, + var currentVersion: String? = null, @SerializedName("gh_version") var ghVersion: String? = null, var url: String? = null, var platform: String? = null, + var readablePlatform: String? = "", var isPluggable: Boolean = false, var etag: String? = null, var brief: String? = null, @@ -36,7 +38,9 @@ data class GameUpdateEntity( @SerializedName("p_button_add_word") var pluginDesc: String = "", //插件功能描述 var pluggableCollection: GameCollectionEntity? = null, // 插件化包所在的合集 - var format: String = "" + var format: String = "", + var signature: String? = "", + var category: String? = "" ) { fun isShowPlugin(location: PluginLocation): Boolean { @@ -61,6 +65,7 @@ data class GameUpdateEntity( gameEntity.indexPlugin = indexPlugin gameEntity.pluginDesc = pluginDesc gameEntity.pluggableCollection = pluggableCollection + gameEntity.category = category val apkEntity = ApkEntity() apkEntity.url = url @@ -72,6 +77,7 @@ data class GameUpdateEntity( apkEntity.etag = etag apkEntity.plugin = plugin apkEntity.format = format + apkEntity.signature = signature val apk = ArrayList() apk.add(apkEntity) diff --git a/app/src/main/java/com/gh/gamecenter/game/upload/GameUploadFragment.kt b/app/src/main/java/com/gh/gamecenter/game/upload/GameUploadFragment.kt index 134e36cfb7..82d60ece1e 100644 --- a/app/src/main/java/com/gh/gamecenter/game/upload/GameUploadFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/game/upload/GameUploadFragment.kt @@ -30,7 +30,6 @@ import com.gh.gamecenter.suggest.SuggestSelectGameAdapter import com.halo.assistant.HaloApp import com.lightgame.utils.Util_System_Keyboard import com.lightgame.utils.Utils -import com.zhihu.matisse.internal.utils.PathUtils import io.reactivex.disposables.Disposable import kotlinx.android.synthetic.main.fragment_game_upload.* import okhttp3.MediaType @@ -456,7 +455,7 @@ class GameUploadFragment : NormalFragment() { } else if (requestCode == CHOOSE_LOCAL_APK) { val packageName = data.getStringExtra(EntranceUtils.KEY_PACKAGENAME) ?: "" val gamePath = data.getStringExtra(EntranceUtils.KEY_PATH) ?: "" - val version = PackageUtils.getVersionByPackage(packageName) + val version = PackageUtils.getVersionNameByPackageName(packageName) val length = File(gamePath).length() if (length > 5 * 1024 * 1024 * 1024) { ToastUtils.showToast(getString(R.string.apk_max_size_hint, 5)) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index db3d49a4b9..719bd221ba 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -699,7 +699,7 @@ class GameDetailFragment : NormalFragment() { private fun retrieveAvailableDialog(detailDialogs: ArrayList): GameEntity.Dialog? { for (dialog in detailDialogs) { - val versionName = PackageUtils.getVersionName() + val versionName = PackageUtils.getGhVersionName() val noticeVersions = dialog.rule.noticeVersions if (noticeVersions.isEmpty() || noticeVersions.contains(versionName)) { if (dialog.rule.models.isEmpty() || dialog.rule.models.contains(Build.MODEL)) { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescViewModel.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescViewModel.kt index 04d7acda44..4e96ef1f34 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/desc/DescViewModel.kt @@ -182,7 +182,7 @@ class DescViewModel(application: Application, fun sendSuggestion() { val params = hashMapOf() params["from"] = "" - params["ghversion"] = PackageUtils.getVersionName() + params["ghversion"] = PackageUtils.getGhVersionName() params["channel"] = HaloApp.getInstance().channel params["type"] = Build.MODEL params["sdk"] = android.os.Build.VERSION.SDK_INT.toString() diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt index 465a50f7f4..593b731292 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/history/HistoryApkListAdapter.kt @@ -176,7 +176,7 @@ class HistoryApkListAdapter(context: Context, } if (btnText == "安装" || btnText == "下载") { if (PackageUtils.isInstalled(mContext, apkEntity.packageName)) { - val installedVersion = PackageUtils.getVersionByPackage(apkEntity.packageName) + val installedVersion = PackageUtils.getVersionNameByPackageName(apkEntity.packageName) if (Version(installedVersion).isHigherThan(Version(apkEntity.version))) { return true } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/edit/RatingEditActivity.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/edit/RatingEditActivity.kt index ae9df24998..81b73d9ae2 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/edit/RatingEditActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/edit/RatingEditActivity.kt @@ -362,14 +362,14 @@ class RatingEditActivity : ToolBarActivity(), KeyboardHeightObserver { val apk = mGame?.getApk() if (!apk.isNullOrEmpty()) apk[0].version else "" } else { - PackageUtils.getVersionByPackage(mInstallPackageName) + PackageUtils.getVersionNameByPackageName(mInstallPackageName) } val jsonObject = JSONObject() jsonObject.put("star", rating) jsonObject.put("content", content) jsonObject.put("show_device", mBinding.deviceBox.isChecked) jsonObject.put("device", DeviceUtils.getLoginDevice(this)) - jsonObject.put("gh_version", PackageUtils.getVersionName()) + jsonObject.put("gh_version", PackageUtils.getGhVersionName()) jsonObject.put("game_version", gameVersion) jsonObject.put("source", if (mFromAmway) "anliwall" else "game_detail") jsonObject.put("plugin_version", PackageUtils.getMetaData(this, mInstallPackageName, "gh_version")) diff --git a/app/src/main/java/com/gh/gamecenter/help/QaFeedbackViewModel.kt b/app/src/main/java/com/gh/gamecenter/help/QaFeedbackViewModel.kt index c148968b89..57106bb3e2 100644 --- a/app/src/main/java/com/gh/gamecenter/help/QaFeedbackViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/help/QaFeedbackViewModel.kt @@ -26,7 +26,7 @@ class QaFeedbackViewModel(application: Application, private val contentId: Strin fun qaSuggestions(message: String) { val map = hashMapOf() map["message"] = message - map["ghversion"] = PackageUtils.getVersionName() + map["ghversion"] = PackageUtils.getGhVersionName() map["channel"] = HaloApp.getInstance().channel map["type"] = Build.MODEL map["sdk"] = Build.VERSION.SDK_INT.toString() diff --git a/app/src/main/java/com/gh/gamecenter/manager/DataCollectionManager.java b/app/src/main/java/com/gh/gamecenter/manager/DataCollectionManager.java index 7d6bba7624..924aac3127 100644 --- a/app/src/main/java/com/gh/gamecenter/manager/DataCollectionManager.java +++ b/app/src/main/java/com/gh/gamecenter/manager/DataCollectionManager.java @@ -52,7 +52,7 @@ public class DataCollectionManager { * 实时上传 */ private void realTimeUpload(final String type, Map map) { - String version = PackageUtils.getVersionName(); + String version = PackageUtils.getGhVersionName(); String user = Installation.getUUID(mContext); String channel = HaloApp.getInstance().getChannel(); map.put("version", version); @@ -123,7 +123,7 @@ public class DataCollectionManager { return; } isUploading = true; - String version = PackageUtils.getVersionName(); + String version = PackageUtils.getGhVersionName(); String user = Installation.getUUID(mContext); String channel = HaloApp.getInstance().getChannel(); for (DataCollectionInfo dataCollectionInfo : list) { diff --git a/app/src/main/java/com/gh/gamecenter/manager/UpdateManager.java b/app/src/main/java/com/gh/gamecenter/manager/UpdateManager.java index 08fb7bd43a..f914863adc 100644 --- a/app/src/main/java/com/gh/gamecenter/manager/UpdateManager.java +++ b/app/src/main/java/com/gh/gamecenter/manager/UpdateManager.java @@ -209,11 +209,11 @@ public class UpdateManager { loadingDialog = DialogUtils.showWaitDialog(mContext, "检查更新中..."); } String channel = HaloApp.getInstance().getChannel(); - RetrofitManager.getInstance(mContext).getApi().getUpdate(PackageUtils.getVersionName(), PackageUtils.getVersionCode(), channel) + RetrofitManager.getInstance(mContext).getApi().getUpdate(PackageUtils.getGhVersionName(), PackageUtils.getGhVersionCode(), channel) .map(appEntity -> { boolean isShowUpdateDialog = false; - if (appEntity.getVersionCode() > PackageUtils.getVersionCode()) { + if (appEntity.getVersionCode() > PackageUtils.getGhVersionCode()) { // 助手有更新 UpdateManager.this.appEntity = appEntity; @@ -554,11 +554,11 @@ public class UpdateManager { } private String getUpdateOnceOnlySpKey() { - return "UPDATE_ONCE_ONLY_KEY" + PackageUtils.getVersionCode(); + return "UPDATE_ONCE_ONLY_KEY" + PackageUtils.getGhVersionCode(); } private String getUpdateOnceOnlySecondSpKey() { - return "UPDATE_ONCE_ONLY_SECOND_KEY" + PackageUtils.getVersionCode(); + return "UPDATE_ONCE_ONLY_SECOND_KEY" + PackageUtils.getGhVersionCode(); } } diff --git a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt index 85d7f81493..f29357cbdc 100644 --- a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt +++ b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt @@ -1,7 +1,6 @@ package com.gh.gamecenter.packagehelper import android.annotation.SuppressLint -import android.preference.PreferenceManager import android.text.TextUtils import androidx.lifecycle.MutableLiveData import com.gh.common.exposure.meta.MetaUtil @@ -48,7 +47,6 @@ object PackageRepository { private val mApplication = HaloApp.getInstance().application private val mApi = RetrofitManager.getInstance(mApplication).api private val mSensitiveApi = RetrofitManager.getInstance(mApplication).sensitiveApi - private val mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(mApplication) private const val LAST_UPLOAD_APPLIST_TIME = "last_upload_applist_time" @@ -59,6 +57,7 @@ object PackageRepository { val gameInstalled = Collections.synchronizedList(ArrayList()) val gameUpdate = ArrayList() + val currentVersionList = ArrayList() // 当前版本游戏的列表 init { initData() @@ -92,12 +91,12 @@ object PackageRepository { * 把助手更新数据添加到下载管理(为了不改变原有的更新逻辑只能在这里多请求一次接口) */ private fun loadGhzsUpdate() { - mApi.getUpdate(PackageUtils.getVersionName(), PackageUtils.getVersionCode(), HaloApp.getInstance().channel) + mApi.getUpdate(PackageUtils.getGhVersionName(), PackageUtils.getGhVersionCode(), HaloApp.getInstance().channel) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : Response() { override fun onResponse(appEntity: AppEntity?) { - if (appEntity != null && appEntity.versionCode > PackageUtils.getVersionCode()) { + if (appEntity != null && appEntity.versionCode > PackageUtils.getGhVersionCode()) { val gameUpdateEntity = GameUpdateEntity() gameUpdateEntity.name = "光环助手V" + appEntity.version!! gameUpdateEntity.packageName = HaloApp.getInstance().application.packageName @@ -207,6 +206,7 @@ object PackageRepository { gameInstalled.add(GameInstall.transformGameInstall(game, pkgName)) val isCanPluggable = checkGamePlugin(game, pkgName) val isCanUpdate = checkGameUpdate(game) + addCurrentlyInstalledVersionIfValid(game) if (!isNotifyUpdate && isCanUpdate || isCanPluggable) { isNotifyUpdate = true } @@ -239,6 +239,36 @@ object PackageRepository { return false } + /** + * 添加当前版本的信息如果满足条件的话 + */ + private fun addCurrentlyInstalledVersionIfValid(game: GameEntity) { + for (apk in game.getApk()) { + if (apk.version == PackageUtils.getVersionNameByPackageName(apk.packageName) + && apk.signature == PackageUtils.getApkSignatureByPackageName(mApplication, apk.packageName)) { + currentVersionList.add(GameUpdateEntity().apply { + id = game.id + name = game.name + icon = game.icon + packageName = apk.packageName + size = apk.size + version = apk.version + ghVersion = apk.ghVersion + url = apk.url + platform = apk.getPlatform() + etag = apk.etag + brief = game.brief + tag = game.getTag() + tagStyle = game.tagStyle + indexPlugin = game.indexPlugin + pluginDesc = game.pluginDesc + format = apk.format + signature = apk.signature ?: "" + }) + } + } + } + /** * 检查游戏插件化 * @param game diff --git a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageViewModel.kt b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageViewModel.kt index 83ed7fcc30..8458ff3cfe 100644 --- a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageViewModel.kt @@ -6,7 +6,9 @@ import androidx.lifecycle.* import com.gh.gamecenter.entity.GameInstall import com.gh.gamecenter.entity.GameUpdateEntity import com.halo.assistant.HaloApp -import java.util.HashMap +import java.util.* +import kotlin.collections.ArrayList +import kotlin.collections.set class PackageViewModel(application: Application, @@ -30,10 +32,30 @@ class PackageViewModel(application: Application, } } + /** + * 获取可更新列表的 LiveData(不过滤同包名) + */ fun getGameUpdateLiveData(): MutableLiveData> { return mRepository.gameUpdateLiveData } + /** + * 获取可更新列表的 LiveData(数据包括当前版本,供下载管理-更新显示我的版本用) + */ + fun getGameUpdateIncludeCurrentVersion(): MutableLiveData> { + val mediatorLiveData = MediatorLiveData>() + mediatorLiveData.addSource(mRepository.gameUpdateLiveData) { + val decoratedList = ArrayList(it) + for (currentVersion in mRepository.currentVersionList) { + decoratedList.add(currentVersion) + } + + mediatorLiveData.postValue(decoratedList) + } + + return mediatorLiveData + } + fun getGameInstalledLiveData(): MutableLiveData> { return mRepository.gameInstalledLiveData } diff --git a/app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.kt b/app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.kt index f2ee5dd861..1e43a6894b 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.kt @@ -289,7 +289,7 @@ class NewPersonalFragment : BaseLazyFragment() { @SuppressLint("CheckResult", "SetTextI18n") private fun observeUIRelatedChanges() { mPersonalViewModel.appEntity.observe(this, { - if (it.versionCode > PackageUtils.getVersionCode()) { + if (it.versionCode > PackageUtils.getGhVersionCode()) { notifyItemChange("设置", FunctionalMessageType.NEW_VERSION) } else { notifyItemChange("设置", null) diff --git a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.kt b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.kt index f05a557edd..999dfd69f3 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.kt @@ -254,7 +254,7 @@ class PersonalFragment : BaseLazyFragment() { @SuppressLint("CheckResult") private fun observeUIRelatedChanges() { mPersonalViewModel.appEntity.observe(this, { - if (it.versionCode > PackageUtils.getVersionCode()) { + if (it.versionCode > PackageUtils.getGhVersionCode()) { notifyItemChange("设置", FunctionalMessageType.NEW_VERSION) } else { notifyItemChange("设置", null) diff --git a/app/src/main/java/com/gh/gamecenter/personal/PersonalViewModel.kt b/app/src/main/java/com/gh/gamecenter/personal/PersonalViewModel.kt index 98c0adcb74..5ea40bc4ce 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/PersonalViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/personal/PersonalViewModel.kt @@ -123,8 +123,8 @@ class PersonalViewModel(application: Application) : AndroidViewModel(application RetrofitManager.getInstance(getApplication()) .api .getUpdate( - PackageUtils.getVersionName(), - PackageUtils.getVersionCode(), + PackageUtils.getGhVersionName(), + PackageUtils.getGhVersionCode(), HaloApp.getInstance().channel ) .subscribeOn(Schedulers.io()) diff --git a/app/src/main/java/com/gh/gamecenter/qa/select/VotingViewModel.java b/app/src/main/java/com/gh/gamecenter/qa/select/VotingViewModel.java index 48f43f3251..03b61e18d2 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/select/VotingViewModel.java +++ b/app/src/main/java/com/gh/gamecenter/qa/select/VotingViewModel.java @@ -67,7 +67,7 @@ public class VotingViewModel extends ListViewModel params = new HashMap<>(); params.put("message", "问答社区推荐收录:" + entity.getGameName() + "(" + entity.getPackageName() + ", " + entity.getGameVersion() + ")"); params.put("from", ""); - params.put("ghversion", PackageUtils.getVersionName()); + params.put("ghversion", PackageUtils.getGhVersionName()); params.put("channel", HaloApp.getInstance().getChannel()); params.put("type", android.os.Build.MODEL); params.put("sdk", String.valueOf(android.os.Build.VERSION.SDK_INT)); diff --git a/app/src/main/java/com/gh/gamecenter/receiver/InstallAndUninstallReceiver.java b/app/src/main/java/com/gh/gamecenter/receiver/InstallAndUninstallReceiver.java index e021a88405..e1bee7eed5 100644 --- a/app/src/main/java/com/gh/gamecenter/receiver/InstallAndUninstallReceiver.java +++ b/app/src/main/java/com/gh/gamecenter/receiver/InstallAndUninstallReceiver.java @@ -36,7 +36,7 @@ public class InstallAndUninstallReceiver extends BroadcastReceiver { InstallUtils.getInstance(context).removeInstall(packageName); PackageHelper.refreshLocalPackageList(); - String versionName = PackageUtils.getVersionByPackage(packageName); + String versionName = PackageUtils.getVersionNameByPackageName(packageName); EBPackage installEb = new EBPackage("安装", packageName, versionName); if (PackageUtils.isAppOnForeground(context)) { PackageObserver.onPackageChanged(installEb); @@ -71,7 +71,7 @@ public class InstallAndUninstallReceiver extends BroadcastReceiver { if (packageName.equals(context.getPackageName())) { DataUtils.onEvent(context, "软件更新", "更新完成"); } - String versionName = PackageUtils.getVersionByPackage(packageName); + String versionName = PackageUtils.getVersionNameByPackageName(packageName); EBPackage updateEb = new EBPackage("替换", packageName, versionName); EventBus.getDefault().post(new EBPackage("替换", packageName, versionName)); diff --git a/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpCacheInterceptor.java b/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpCacheInterceptor.java index b74c2b3854..10c25999b6 100644 --- a/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpCacheInterceptor.java +++ b/app/src/main/java/com/gh/gamecenter/retrofit/OkHttpCacheInterceptor.java @@ -115,7 +115,7 @@ class OkHttpCacheInterceptor implements Interceptor { request = request.newBuilder() .addHeader("JNFJ", MetaUtil.getBase64EncodedIMEI()) .addHeader("CHANNEL", HaloApp.getInstance().getChannel()) - .addHeader("VERSION", PackageUtils.getVersionName()) + .addHeader("VERSION", PackageUtils.getGhVersionName()) .addHeader("OAID", HaloApp.getInstance().getOAID()) .removeHeader("User-Agent") .addHeader("User-Agent", HaloApp.getInstance().getUserAgent()) diff --git a/app/src/main/java/com/gh/gamecenter/setting/GameDownloadSettingFragment.kt b/app/src/main/java/com/gh/gamecenter/setting/GameDownloadSettingFragment.kt index dbcb9d2cc1..0ed3165238 100644 --- a/app/src/main/java/com/gh/gamecenter/setting/GameDownloadSettingFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/setting/GameDownloadSettingFragment.kt @@ -119,7 +119,7 @@ class GameDownloadSettingFragment: NormalFragment() { @JvmStatic fun getTrafficDownloadHintKey(): String { - return PackageUtils.getVersionName() + "traffic_download_hint" + return PackageUtils.getGhVersionName() + "traffic_download_hint" } } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameListAdapter.kt b/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameListAdapter.kt index ce8956577c..b37a10809f 100644 --- a/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorGameListAdapter.kt @@ -113,7 +113,7 @@ class SimulatorGameListAdapter(context: Context, holder.simulatorBtn.run { if (PackageUtils.isInstalledFromAllPackage(context, simulator.apk?.packageName)) { - val versionFromInstalledApp = PackageUtils.getVersionByPackage(simulator.apk?.packageName) + val versionFromInstalledApp = PackageUtils.getVersionNameByPackageName(simulator.apk?.packageName) val shouldShowUpdate = Version(simulator.apk?.version).isHigherThan(versionFromInstalledApp) text = if (shouldShowUpdate) "更新模拟器" else "卸载模拟器" setTextColor(if (shouldShowUpdate) R.color.theme.toColor() else R.color.text_999999.toColor()) diff --git a/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorManagementAdapter.kt b/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorManagementAdapter.kt index c93a53ece6..445a911867 100644 --- a/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorManagementAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/simulatorgame/SimulatorManagementAdapter.kt @@ -49,7 +49,7 @@ class SimulatorManagementAdapter(context: Context, var shouldShowUpdate = false if (isInstalled) { - val versionFromInstalledApp = PackageUtils.getVersionByPackage(simulator.apk?.packageName) + val versionFromInstalledApp = PackageUtils.getVersionNameByPackageName(simulator.apk?.packageName) shouldShowUpdate = Version(simulator.apk?.version).isHigherThan(versionFromInstalledApp) text = if (shouldShowUpdate) "更新" else "已安装" setTextColor(if (shouldShowUpdate) R.color.theme.toColor() else R.color.text_999999.toColor()) diff --git a/app/src/main/java/com/gh/gamecenter/video/upload/view/UploadVideoActivity.kt b/app/src/main/java/com/gh/gamecenter/video/upload/view/UploadVideoActivity.kt index 246998ead6..e4533b65ed 100644 --- a/app/src/main/java/com/gh/gamecenter/video/upload/view/UploadVideoActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/video/upload/view/UploadVideoActivity.kt @@ -886,7 +886,7 @@ class UploadVideoActivity : ToolBarActivity() { private fun getConfirmUpdateProtocolKey(): String { - return "ConfirmUpdateProtocolKey" + PackageUtils.getVersionName() + return "ConfirmUpdateProtocolKey" + PackageUtils.getGhVersionName() } companion object { diff --git a/app/src/main/java/com/halo/assistant/HaloApp.java b/app/src/main/java/com/halo/assistant/HaloApp.java index f1921491d1..147b15fb01 100644 --- a/app/src/main/java/com/halo/assistant/HaloApp.java +++ b/app/src/main/java/com/halo/assistant/HaloApp.java @@ -340,7 +340,7 @@ public class HaloApp extends MultiDexApplication { * 覆盖安装进入过首页的也当作是同意了 */ public static boolean isUserAcceptPrivacyPolicy(Context context) { - return !PreferenceManager.getDefaultSharedPreferences(context).getBoolean("isNewFirstLaunchV" + PackageUtils.getVersionName(), true) + return !PreferenceManager.getDefaultSharedPreferences(context).getBoolean("isNewFirstLaunchV" + PackageUtils.getGhVersionName(), true) || !SPUtils.getBooleanWithContext(context, Constants.SP_BRAND_NEW_USER, true) || SPUtils.getBooleanWithContext(context, Constants.SP_IS_USER_ACCEPTED_PRIVACY_STATEMENT, false); } diff --git a/app/src/main/java/com/halo/assistant/fragment/AboutFragment.java b/app/src/main/java/com/halo/assistant/fragment/AboutFragment.java index 4935a7b686..1fe55e43dc 100644 --- a/app/src/main/java/com/halo/assistant/fragment/AboutFragment.java +++ b/app/src/main/java/com/halo/assistant/fragment/AboutFragment.java @@ -74,7 +74,7 @@ public class AboutFragment extends NormalFragment { super.onCreate(savedInstanceState); setNavigationTitle(getString(R.string.title_about)); - mVersionName.setText("V" + PackageUtils.getVersionName()); + mVersionName.setText("V" + PackageUtils.getGhVersionName()); long serverTime = PreferenceManager.getDefaultSharedPreferences(requireContext()).getLong("server_time", 1587693163L); String year = TimeUtils.INSTANCE.getFormatTime(serverTime, "yyyy"); diff --git a/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java b/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java index 14cef9877c..4dd876d6c7 100644 --- a/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java +++ b/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java @@ -151,9 +151,9 @@ public class SettingsFragment extends NormalFragment { } else { // Jenkins 打的包附带个打包时间在版本后面 if (BuildConfig.BUILD_TIME == 0) { - mVersionName.setText(("V" + PackageUtils.getVersionName())); + mVersionName.setText(("V" + PackageUtils.getGhVersionName())); } else { - mVersionName.setText(("V" + PackageUtils.getVersionName()) + " " + BuildConfig.BUILD_TIME); + mVersionName.setText(("V" + PackageUtils.getGhVersionName()) + " " + BuildConfig.BUILD_TIME); } } } diff --git a/app/src/main/res/drawable-xxxhdpi/ic_arrow_blue.png b/app/src/main/res/drawable-xxxhdpi/ic_arrow_blue.png deleted file mode 100644 index b51543329d241c87bc909383b723a090955ce7ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 633 zcmV-<0*3vGP)Mr6aetK!?Kb5+d=Ul<;er(11RzZ6rOzoB_(zrJlGQQ z6+8;%1CUo<5f6BgkZlJkwD!+j_dKZaXEf{Fd(ODEyLa#GJ@@=}X14BWg@tTAo3bi% z@i+ouTDu#!Psc}3V($1W_yV5JI!y|L%?su#{HDO|6=L$@Kmc_^3QlWV0 zk0FG07_X@sx}K_k@Q+jVQD?{##jItCqCZ(Ft-joAevj)+p+N48b1Q_L^@E_#i9&%O zc{k;(*tSSP-`}`UsC&o{aMEtl^W=hm4Eogflr|6~9|e?FP!v$wLEI=KAWoDq5EsfQ zhy!IDM2#W=QKHB|R47sq1&SPG8pQ%KiDCnpLa~BOpx8mWQRodGB!q3*WFj57Nqoug zKxHZH8j%1&vVkbe>Q|Me(SHYmgr$^kKP4_L5&DY{{lT9W(m9q`$WE&|#PZje>Lx#` zYj58AIv(`CGUx#1co0SvBu*;r>fy@?kqes-`>)(@n3!EXcsEz4YJcGyD@Zp6*lZvZ z7&ee83=7C4h8$!XLkgn6kb$T$Bp^zRaS%1eD2M}N48(;o0^-DI2XSMxf}()Y28s#> zKo#(WX-@inQf-}Azr|3Sv%lmYFj4)Gcs!#=aB)Zey2xD6K(h zGbMI5DV3DhR5RRdf|oyOnK49f0!bM}I{}ZeiP&vB{IdyGP&gpW0RR9{4*;D3Dl`Bv z06sAiheDzu3~HP|zz67`{eBP+;2mHF00~wW#Nw2Pzr%e<-zI|IROWYF8Qxjo+vH^TxbI~8-M3zo>k0d^K@^I z2>w0Z(`Ec5+9Plq%@6;?I{wm{tWgU`Oq*`5A8J+LpCea#zz{LB{uYJj(2xBFK9)#H z8+Un@Y##+kTe4;rQ~Y9%6h}`yX+2Tlww~@Pz7L}{tz+%*S&XCj3C9aZB~+I+_T_NB zAM_;7qA+=24vZ2B(iKsu#?o68rvvD&xuUUE$ zKPNfeZ7r5#;}?B`{j(4kw%eCh0efw^b8p}qf(Bri&+G@7M#y=n4mK|*Eb;maiDIa+ mHqrn4?dxCuU4@f+PjqJ39z{RhYuO_4#zzqL9TX$r0002_zy^N+ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_arrow_down_blue.png b/app/src/main/res/drawable-xxxhdpi/ic_arrow_down_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..84f088a92e36a8cfcec02befa489c2dd05e82dc3 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!VDx^^%Amxlyrbkh%1oRp7UR0;eVAG|5c{{ zSDXG{Wg3V9By;ThPXeVmN`m}?8H9whDjMGX(b6-v1d2s?x;TbNT+ThUo43J0#QCDO zLiL4|YWTvqA-2%?Opw)LR>!^hb<#ONI~Y7&{an^LB{Ts5wm3$f literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_arrow_down_grey.webp b/app/src/main/res/drawable-xxxhdpi/ic_arrow_down_grey.webp new file mode 100644 index 0000000000000000000000000000000000000000..b723810cd7bbae9838cee348f72105c4828cc4c4 GIT binary patch literal 198 zcmWIYbaUIsz`zjh>J$(bU=hIuWD5YXJOcwi1B0VafJZEl$LPL5je)}~qxfu5R7Xd{ z(bGRtHmuE!KK8RsYKd1slaE$N(~V1qu5AB)F5JoGzv!~u!#kY!8{A!g=H8)?uXyTb z?d99ChBskr)sFz?EEk`SnM)>^GHq)h;h_Q42>^U4Ob`G7 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_arrow_up_blue.png b/app/src/main/res/drawable-xxxhdpi/ic_arrow_up_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..61894f2129ab05671d89ea294f210a3a056bfcd1 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^3P3Et!VDx^^%Amxlyrbkh%1oRp7UR0;eVAG|5c{{ zSDXG{Wg3V9By;ThPXeVmN`m}?8H9whDjMGX(b6-v1d0WDx;TbNTux4CU{GUa3waRN zbSnMr3l0atju$U7T!R}{sW7Qr=vu}Q>B-`J$(bU=hIuWD5YXJOcwi1B0VafJYRN$LPL5je)}~qxfu5R7Xd{ z(bGRtHgx9PKKYlCcZ-JuldP_)&ONDwbZP0j|NoyK0cvCb03#_wG5`Po literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_arrow_up_light_blue.png b/app/src/main/res/drawable-xxxhdpi/ic_arrow_up_light_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..38460cf3d91a199e92a4eac3768af2b553136b3b GIT binary patch literal 208 zcmeAS@N?(olHy`uVBq!ia0vp^20$#q!VDz+E+@YSQlbGqA+A9B|NsA=fB*mb{m+%043N;g8YIRcA_Z?7B_bTD9Gz1SnB;lS;8&d;iY ztA}YqZoKgSgd5=p=1)8_P091p{x7BTg{<##U6+uMVwiT|0#5;3n^}XkK?%babKawN zx@9*uzV5d@aYJ9}X3p%~&AHohww>K})9iMd_oZ~(XTN=YIkjsy11)9nboFyt=akR{ E0L6Y%sQ>@~ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_downloading_hint.webp b/app/src/main/res/drawable-xxxhdpi/ic_downloading_hint.webp new file mode 100644 index 0000000000000000000000000000000000000000..219a67df1a0c172c377fbb02a27825ef096fa0cd GIT binary patch literal 776 zcmV+j1NZz=Nk&Eh0{{S5MM6+kP&il$0000G0000#002J#06|PpNYelS00Dp-Ns?k~ zr8^HEnt=xJv*T&ck@e^-_+ZLOpHb^i1JNB{dP+n%a@$6dR8sHVlhZt+T%gwUe4gaz zp|E-c9uFA~zw@jZ+ycPoG3NLQ0JjWY@Yh^;VQ>XwDqJy`zgsiC&nOSB9TTlfA)ASA zoWLlFej43GdI^k@=qJ)krcLJ^aHp)4!Ra(8|7|t3?`xBvhd~8^u8nCs0H_Rl{52PP z4#qGZ71l7?Nz*wd>L`zt)-yE-+eCcB6b4E3)96MwPGFQoKapNC|EB*ByJ)Qf09H^q zAO->e0MHQtodGI906+jfF&2qKA|W9Y4OYY;0|d4JXkY$31Mw&FXQaDcyN&pvt^xJ| z;sy8*&<{`_z&XG_w|;m-Pq#FUTM52kj5Q2kP(t z{;&_=AOFhKpMZJ*et;nl?~TXpQJr$<7`9R5-2Znctm)y~@xy%3LISbNm&)FrUq2oI z0RH~&t5N^n2%rCUc}tjXf*ag$*ws|3u7> z7KFwA&bLMzg#v^+k;>%K5n-n$SQHiMQ<7L8WOeJL2lyGVM7qix(jq%%v1b(PzL{9o@tFRWvHgeAzm|pxM=BQS&$E!07>_^-yv% @@ -9,6 +11,41 @@ android:layout_height="match_parent" android:background="@color/white" /> + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_updatable_game.xml b/app/src/main/res/layout/item_updatable_game.xml new file mode 100644 index 0000000000..ff27ce1813 --- /dev/null +++ b/app/src/main/res/layout/item_updatable_game.xml @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_updatable_game_header.xml b/app/src/main/res/layout/item_updatable_game_header.xml new file mode 100644 index 0000000000..3252d3edb0 --- /dev/null +++ b/app/src/main/res/layout/item_updatable_game_header.xml @@ -0,0 +1,36 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_updatable_other_game_hint.xml b/app/src/main/res/layout/item_updatable_other_game_hint.xml new file mode 100644 index 0000000000..0cea46207b --- /dev/null +++ b/app/src/main/res/layout/item_updatable_other_game_hint.xml @@ -0,0 +1,35 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/tab_item_download_number.xml b/app/src/main/res/layout/tab_item_download_number.xml index 957959048e..0001d83a83 100644 --- a/app/src/main/res/layout/tab_item_download_number.xml +++ b/app/src/main/res/layout/tab_item_download_number.xml @@ -8,7 +8,7 @@ android:id="@+id/tab_title" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginLeft="8dp" + android:layout_marginStart="8dp" android:text="@string/download_game" android:textColor="@color/text_tabbar_style" android:textSize="14sp" /> @@ -17,7 +17,7 @@ android:id="@+id/tab_download_number" android:layout_width="6dp" android:layout_height="6dp" - android:layout_marginLeft="2dp" + android:layout_marginStart="2dp" android:layout_marginBottom="3dp" android:background="@drawable/oval_hint_red_bg" android:gravity="center" diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index b2abcc72d7..4b54d5711a 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -158,6 +158,7 @@ #74FFFF #60D5FF #EDF5FC + #F2F7FC #b2b2b2 #9a9a9a #3a3a3a @@ -240,6 +241,7 @@ #140B6D #16161A #28282E + #8798A8 #3796FF #213964 #06CEA8 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 724764f924..5b58cc8556 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -99,6 +99,7 @@ 免流量传送 游戏下载 游戏更新 + 已安装 已连接 无需操作,请让对方继续发送即可 完成 From 7537963a8e818b51e0531d23e6423b434fc86416 Mon Sep 17 00:00:00 2001 From: juntao Date: Sat, 21 Aug 2021 14:50:33 +0800 Subject: [PATCH 090/151] =?UTF-8?q?=E6=94=AF=E6=8C=81url=E8=B7=B3=E8=BD=AC?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/DefaultUrlHandler.kt | 6 ++++-- app/src/main/java/com/gh/common/util/EntranceUtils.java | 1 + app/src/main/java/com/gh/gamecenter/SkipActivity.java | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/gh/common/DefaultUrlHandler.kt b/app/src/main/java/com/gh/common/DefaultUrlHandler.kt index 0f0bb186c0..d98754273e 100644 --- a/app/src/main/java/com/gh/common/DefaultUrlHandler.kt +++ b/app/src/main/java/com/gh/common/DefaultUrlHandler.kt @@ -13,7 +13,6 @@ import com.gh.common.util.DirectUtils.directToGameVideo import com.gh.common.util.DirectUtils.directToLegacyVideoDetail import com.gh.common.util.DirectUtils.directToLinkPage import com.gh.common.util.DirectUtils.directToQa -import com.gh.common.util.DirectUtils.directToVideoDetail import com.gh.common.util.GsonUtils.gson import com.gh.gamecenter.LibaoDetailActivity import com.gh.gamecenter.MainActivity @@ -162,9 +161,12 @@ object DefaultUrlHandler { } directToLegacyVideoDetail(context, id, location, false, gameId, entrance, "", referer, type, act, paginationType, fieldId, sectionName) } + EntranceUtils.HOST_VIDEO_DETAIL -> { + DirectUtils.directToVideoDetail(context, id, entrance, path) + } EntranceUtils.HOST_VIDEO_SINGLE -> { val referer = uri.getQueryParameter("referer") ?: "" - directToVideoDetail(context, id, VideoDetailContainerViewModel.Location.SINGLE_VIDEO.value, + DirectUtils.directToVideoDetail(context, id, VideoDetailContainerViewModel.Location.SINGLE_VIDEO.value, false, "", entrance, "", if (TextUtils.isEmpty(referer)) "" else referer) } EntranceUtils.HOST_VIDEO_STREAMING_HOME -> { 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 e9da6addde..15d894fdb3 100644 --- a/app/src/main/java/com/gh/common/util/EntranceUtils.java +++ b/app/src/main/java/com/gh/common/util/EntranceUtils.java @@ -53,6 +53,7 @@ public class EntranceUtils { public static final String HOST_VIDEO_STREAMING_HOME = "video_streaming_home";//视频流-首页 public static final String HOST_VIDEO_STREAMING_DESC = "video_streaming_desc";//视频流-游戏介绍进入 public static final String HOST_VIDEO_COLLECTION = "video_collection";//视频合集 + public static final String HOST_VIDEO_DETAIL = "video_detail"; public static final String HOST_USERHOME = "userhome";//个人主页 public static final String HOST_VIDEO = "video"; public static final String HOST_FORUM = "forum"; diff --git a/app/src/main/java/com/gh/gamecenter/SkipActivity.java b/app/src/main/java/com/gh/gamecenter/SkipActivity.java index bcc9f5415a..9ecd2e6dda 100644 --- a/app/src/main/java/com/gh/gamecenter/SkipActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SkipActivity.java @@ -273,6 +273,9 @@ public class SkipActivity extends BaseActivity { bundle.putString(KEY_TYPE, type); EntranceUtils.jumpActivity(this, bundle); break; + case EntranceUtils.HOST_VIDEO_DETAIL: + DirectUtils.directToVideoDetail(this, path, ENTRANCE_BROWSER, ""); + break; case HOST_LIBAO: DirectUtils.directToGiftDetail(this, path, ENTRANCE_BROWSER); break; From 0811c8dc15b1c60323907316f31ab12bb8d66c12 Mon Sep 17 00:00:00 2001 From: juntao Date: Sat, 21 Aug 2021 15:12:04 +0800 Subject: [PATCH 091/151] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=B8=93=E9=A2=98?= =?UTF-8?q?=E6=8E=A8=E8=8D=90=E5=9B=BE=E6=A0=87=E5=8A=9F=E8=83=BD=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20https://git.ghzs.com/pm/halo-app-issues/-/issues/13?= =?UTF-8?q?90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/util/DownloadItemUtils.java | 7 +------ .../adapter/viewholder/GameViewHolder.java | 3 ++- .../drawable-xxxhdpi/ic_recommend_activity.webp | Bin 672 -> 0 bytes .../drawable-xxxhdpi/ic_recommend_discount.webp | Bin 686 -> 0 bytes .../drawable-xxxhdpi/ic_recommend_function.webp | Bin 766 -> 0 bytes .../res/drawable-xxxhdpi/ic_recommend_gift.webp | Bin 538 -> 0 bytes .../res/drawable-xxxhdpi/ic_recommend_role.webp | Bin 764 -> 0 bytes app/src/main/res/layout/game_item.xml | 3 +-- 8 files changed, 4 insertions(+), 9 deletions(-) delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_recommend_activity.webp delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_recommend_discount.webp delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_recommend_function.webp delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_recommend_gift.webp delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_recommend_role.webp diff --git a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java index b6a2609593..b83dfb8087 100644 --- a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java +++ b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java @@ -405,13 +405,8 @@ public class DownloadItemUtils { if ("none".equals(recommendStyle.getType())) { holder.recommendIv.setVisibility(View.GONE); } else { - Context context = holder.recommendContainer.getContext(); - int drawableId = context.getResources().getIdentifier( - "ic_recommend_" + recommendStyle.getType(), - "drawable", - context.getPackageName()); holder.recommendIv.setVisibility(View.VISIBLE); - holder.recommendIv.setImageResource(drawableId); + ImageUtils.display(holder.recommendIv, recommendStyle.getIcon()); } return; } else { diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameViewHolder.java b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameViewHolder.java index b07df42731..dfe4b65b5a 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameViewHolder.java @@ -8,6 +8,7 @@ import android.widget.TextView; import androidx.annotation.Nullable; +import com.facebook.drawee.view.SimpleDraweeView; import com.gh.base.BaseRecyclerViewHolder; import com.gh.common.view.DrawableView; import com.gh.common.view.GameIconView; @@ -28,7 +29,7 @@ public class GameViewHolder extends BaseRecyclerViewHolder { @Nullable public View recommendContainer; public TextView recommendTv; - public ImageView recommendIv; + public SimpleDraweeView recommendIv; public TextView gameDownloadSpeed; public TextView gameDownloadPercentage; public TextView gameServerType; diff --git a/app/src/main/res/drawable-xxxhdpi/ic_recommend_activity.webp b/app/src/main/res/drawable-xxxhdpi/ic_recommend_activity.webp deleted file mode 100644 index 4dd50dfeee69c19a4834298c4c19a4744f806cdc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 672 zcmV;R0$=@7Nk&GP0ssJ4MM6+kP&iDC0ssInFTe{B2jeETZCBan{XovNu}eZwh8hH* z1R->pZG&wjNlyB;G;#5jOa7_hs#6H_0~g-3Ta)i-ZpD}0m6-S~`Bf5jilpRCxCA`Wc-RE7M*BB_`_*hBFZ z!d`_+2v0~5SW6WsgaVJ^gcVp(P=df32!w={xPz}WVGD#56()!vjaOjDkb_l zK$dLVs-29u;t*Gy7#_jniaR@U``?S`Ip<=(5&c)-wvDo5rmnj;000000000000000 z000000000000000003})czSkWeRFYsX5?ZGHCaLBJwg5jai}jene#Z$IUtUqfp`>Wn@PqPWb%B^lXU{yL$H{B?N!y!j~~A7ow=2@p#+*z@Yt`a&pSKsew^7Q1+Vc) z%cq^4o$sgju{xOSeTda`;oJMSUrrZhI@6kP^k^Afex2&F*pq>g;p11%o@lBy2ZGZD z@OX7K58<=fx$TLTOpRE`4bLxU>)U!>ZtK>eGSnV#YF!-WWMznKaG|IbiNWTE@;Ijm#&#eT1*1o|a}_U&~;n;>?4tOr9xu z(e@;d6-$5JJbABf9)8kTGtWP4uHBB*Yo}IvYPN%SIt%UWcml&Ou6NgG$KTA)j9mH; G{Zatur9d74 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_recommend_discount.webp b/app/src/main/res/drawable-xxxhdpi/ic_recommend_discount.webp deleted file mode 100644 index a115ee3c722cc11396c91e3d3e30c466bf8a735c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 686 zcmWIYbaPwA#J~{l>J$(bVBs?p$kx|Cz%8KuL~UDc_|4z7LGJymK1o8{UrK)FHg*0i z7xkQ!6ng$6GvoQU!9RTr{>V-}ye*g6^4pZ+`&JF{rA4JB#bxCm%0J$@cl2ucjKjCi z-8`F@{dq%l^tT1QCl7Bjwar{Ay)Ev`GS+3k+HwuH_#P_T;QE^PhV-XR{AP^4&1&W! z9t9i>7E^Cfn(ENOtrEiM!*QVAL4j3^(PoC%9D|txD_j&LJOnukPdO~`V39KlU=W^k zl3(-9`3_emA%-K&n%&HbjY}LHn#3C>v^a1%Ff6&dE%(jYp5Ca9ldZ~fZ*R-p{=A=k zeco5oMgMtJJiUwyb(SBHX21nr@!$I^C5QkY-`;!JHYfc0?T(I)Kiqa-p6!sj?xbK7c*A|}{hL~UcfIxH)t{s)PG0Dh|2gH)9?M-O z{oDG#ZPEGV_;%Up_~ME`r=Iks@&->^3+YokQ?ZMMq>rw(lIun0@~y8h3}c@xim zsr_y0{CF}`SMie?;l0w4|7;>Be}65O68Y08aeH}o^`fDTjm>Wj zR!g66S)rLRJM Sl^XoCnq4FNKmScQ0|NjPem>Ly diff --git a/app/src/main/res/drawable-xxxhdpi/ic_recommend_function.webp b/app/src/main/res/drawable-xxxhdpi/ic_recommend_function.webp deleted file mode 100644 index b663dc122fef6690856e2bbd1cabcfde07ac2571..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmV zr0#gvE0BIIbA^=FXZQHb+{%pV4wr$%^UToVo z_g^P(ud{C{)rkH(aN9PLjJZ$FY}(m3000000000000000000000000000000007PF z?!DUAkt@3Pzq+%gv8HkHlax}rK54jO%FTa@hYQM=de5Yk{?UHyn$p}nb@$JVak8g0 z=Tb^3rIb=iDW#NBHk>M*r&K<)mZkeo`S`1)aQ3o14@x&bEYFS7+$+zO!f{j$n}7C| zWpgO|`taemkg>XGocJkM{W&(Pp8DA*f(Ly&reGZTG)KLjnOo+*%PsduR4onc`JR(L zjEy)GJ_RpkXK%#mJ0D(cQS4tDd43Od<(lK+E4@_pz}G_3!5s58#H_5!x{&lZ$NUH} zdmUFb&x)8VX{4Mvm$ zMP2IUK=t{^vKcd%AN?9YE;JN1yg9Y>V})I7-N*9reQDo)yF6D*`=w{)xm!5af2l}O z0aiAF%0uGDQkJ%_m1Fd~Hf6KwHXQV1PlwLFh_b5qL$&bvaM#6g!%8zNoTu|^_zt#i w|C-Y8O?e?~`;*d_tu3{EX!|$rm>Maj@7xe}cK`qY000000001h|I9xX0HeunzW@LL diff --git a/app/src/main/res/drawable-xxxhdpi/ic_recommend_gift.webp b/app/src/main/res/drawable-xxxhdpi/ic_recommend_gift.webp deleted file mode 100644 index 7de7d2cf7645a3d184f48e55b33efda307505586..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 538 zcmWIYbaNA8Vqge&bqWXzu<&68vi0>3a0@Jdq_!=0`K{Rjmy;PM&v0S;bKz-j@;^z} zNh(XL%6%V*O`Y+e^nL)}?QIjE+_~uYZ9l{Qtn0UV_!eJ%lzQsr))zK+i&)B^n6CW& zv1}Q?Z`A%T-~U}S64>!z@_voa>FiHiPwqd#xL8Txk*q@dKj+94CJ99cwS7)|rZO>b z=rDD3^K|3{DGDg1JW*opUCiN-GWn3R;0a!lg_{@|A~)r(E;B0Vd~{A&MsJ;>^mkeQ z-T&uS{)@Y?zT=;9fr@5e;W~>wj10JdMaA2@zjnW7|E*m3zyFaJ z3Ita-lx9ylt$+M;fl&9|yzRH&mRZmBTYeeD3VZ$PPuvQ*^!S?dXHdbPZ(puV_kt{6&V}t;)zouKd`m hEWQ0V<;pkjtSWpHSd#|@?+lK&xjZ@`pSp~R0RT4b2U-9C diff --git a/app/src/main/res/drawable-xxxhdpi/ic_recommend_role.webp b/app/src/main/res/drawable-xxxhdpi/ic_recommend_role.webp deleted file mode 100644 index a377af987dcbf176d983d294d9939c68bebdc430..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 764 zcmVXdNP#3tk`$P^ z)ADvp67%mkk|al|o;#ixfVWtQ6FjxrE{1K}MoyJV?yUnj*2dY|#n#oz&Cbix*WTaM z$;H>u&&}V!^04&PQ}rCZRM+yMI_iVkO1z);Y3QxB;F}uyqBvBnfmOn`Xt0)@tm+hy zie06E1cOz;77SL*z~Ev+7lb6h4Il|xVhHFTAvEx16upEPLP%c4kO_gx0+^(tRda)2 z0Rbr(7!nX10f2)fHXsF%gn$qZvO+jWV5I;O0Fo0KF(Dy<1cC`5q<|0t{aa9Qgx~-I z09n^I8ItskZQHhOduDChw#N3v51y`!$jG|d%ZUCnaN9^qG!-{=VP@Dj00000DWx?9 z!2kdN0000000000Kw4{kcS=O7moj`>i@8rkL`1aN;)_CG5%D-}_Je66DK^sGmAXT6 zED46vb0T!~k%i?T(@w(UQ(Ea(ah+_DWw?p{XuQTo4Nt99cxHmwr+T8{u9YIs%p5cE zNyCgy2XO!fxr>_`N^Lv`&~?U4>=md^d~Kl)Xg%U4x^%ZH*b;RE=n*ul&6N7hfY^74 zYJO diff --git a/app/src/main/res/layout/game_item.xml b/app/src/main/res/layout/game_item.xml index 6d686ca132..468763bcda 100644 --- a/app/src/main/res/layout/game_item.xml +++ b/app/src/main/res/layout/game_item.xml @@ -233,11 +233,10 @@ android:paddingEnd="8dp" android:visibility="gone"> - From fac255a27c1913b424e0756c49ea350e0d835f55 Mon Sep 17 00:00:00 2001 From: juntao Date: Sat, 21 Aug 2021 15:27:42 +0800 Subject: [PATCH 092/151] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=B8=B8=E6=88=8F?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=9B=B8=E5=85=B3=20https://git.ghzs.com/pm/?= =?UTF-8?q?halo-app-issues/-/issues/1392?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/util/PackageUtils.java | 7 +++++++ app/src/main/java/com/gh/gamecenter/entity/ApkEntity.kt | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/common/util/PackageUtils.java b/app/src/main/java/com/gh/common/util/PackageUtils.java index c7eac0709d..0b9b9c4f58 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -99,6 +99,8 @@ public class PackageUtils { // ghVersion 不存在即是非插件游戏 if (TextUtils.isEmpty(apkEntity.getGhVersion())) { + int versionCodeFromRequest = apkEntity.getVersionCode(); + int versionCodeFromInstalledApp = getVersionCodeByPackageName(apkEntity.getPackageName()); String versionFromRequest = apkEntity.getVersion(); String versionFromInstalledApp = getVersionNameByPackageName(apkEntity.getPackageName()); @@ -110,6 +112,11 @@ public class PackageUtils { // 根据版本判断是否需要更新 shouldShowUpdate = new Version(versionFromRequest).isHigherThan(versionFromInstalledApp); + // versionName 没法判定的时候尝试使用 versionCode 去判断 + if (!shouldShowUpdate && versionCodeFromRequest != 0) { + shouldShowUpdate = versionCodeFromRequest > versionCodeFromInstalledApp; + } + if (shouldShowUpdate) { GameUpdateEntity updateEntity = new GameUpdateEntity(); updateEntity.setId(gameEntity.getId()); diff --git a/app/src/main/java/com/gh/gamecenter/entity/ApkEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/ApkEntity.kt index fa96d3bf88..d702a22b8a 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/ApkEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/ApkEntity.kt @@ -36,7 +36,7 @@ data class ApkEntity(@SerializedName("package") @SerializedName("sign") var signature: String? = "", @SerializedName("version_code") - var versionCode: Int? = 0, + var versionCode: Int = 0, // 以下是历史版本用的字段,其它地方可能会没有 @SerializedName("update_time") From a67d41296e4c4e9768f9c75e6d35a44f538d6385 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Mon, 23 Aug 2021 10:57:50 +0800 Subject: [PATCH 093/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E9=80=82=E9=BE=84=E7=AD=89=E7=BA=A7?= =?UTF-8?q?=E6=8F=90=E7=A4=BA=20https://git.ghzs.com/pm/halo-app-issues/-/?= =?UTF-8?q?issues/1397?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gamedetail/GameDetailFragment.kt | 537 +++++++++++++----- .../gamedetail/entity/NewGameDetailEntity.kt | 2 + .../drawable-xxxhdpi/ic_recommend_age12.webp | Bin 0 -> 2498 bytes .../drawable-xxxhdpi/ic_recommend_age16.webp | Bin 0 -> 1738 bytes .../drawable-xxxhdpi/ic_recommend_age8.webp | Bin 0 -> 2072 bytes app/src/main/res/layout/gamedetail_body.xml | 37 +- 6 files changed, 418 insertions(+), 158 deletions(-) create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_recommend_age12.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_recommend_age16.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_recommend_age8.webp diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index db3d49a4b9..65b61690d4 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -171,6 +171,9 @@ class GameDetailFragment : NormalFragment() { @BindView(R.id.gameBigEvent) lateinit var gameBigEvent: TextView + @BindView(R.id.recommendAgeIv) + lateinit var recommendAgeIv: ImageView + @BindView(R.id.concern_btn) lateinit var mConcernBtn: TextView @@ -251,7 +254,9 @@ class GameDetailFragment : NormalFragment() { if (mGameEntity != null && mGameEntity!!.getApk().size == 1) { val url = mGameEntity!!.getApk()[0].url if (downloadEntity.url == url) { - if ("pause" != DownloadManager.getInstance(context).getStatus(downloadEntity.url)?.status) { + if ("pause" != DownloadManager.getInstance(context) + .getStatus(downloadEntity.url)?.status + ) { mDownloadEntity = downloadEntity DetailDownloadUtils.detailInvalidate(detailViewHolder) } @@ -260,26 +265,43 @@ class GameDetailFragment : NormalFragment() { DialogUtils.showUnzipFailureDialog(requireContext(), downloadEntity) } } - val meta = downloadEntity.getMetaExtra(PageSwitchDataHelper.PAGE_GAME_DETAIL_RECOMMEND) + val meta = + downloadEntity.getMetaExtra(PageSwitchDataHelper.PAGE_GAME_DETAIL_RECOMMEND) if (downloadEntity.status == DownloadStatus.add) { if (downloadEntity.gameId == mViewModel.game?.id) { mRecommendView.postDelayed({ showRecommendView() }, 500) } if (meta.isNotEmpty() && mRecommendPopupEntity != null) { - LogUtils.uploadRecommendPopup("recommend_pop_download", mRecommendPopupEntity?.id, mViewModel.game?.id - ?: "", mViewModel.game?.name - ?: "", mRecommendPopupEntity?.popupDetail?.link?.type, - mRecommendPopupEntity?.popupDetail?.link?.text, downloadEntity.gameId, downloadEntity.name) + LogUtils.uploadRecommendPopup( + "recommend_pop_download", + mRecommendPopupEntity?.id, + mViewModel.game?.id + ?: "", + mViewModel.game?.name + ?: "", + mRecommendPopupEntity?.popupDetail?.link?.type, + mRecommendPopupEntity?.popupDetail?.link?.text, + downloadEntity.gameId, + downloadEntity.name + ) } } else if (downloadEntity.status == DownloadStatus.done) { if (downloadEntity.gameId == mViewModel.game?.id) { hideRecommendView() } if (meta.isNotEmpty() && mRecommendPopupEntity != null) { - LogUtils.uploadRecommendPopup("recommend_pop_download_complete", mRecommendPopupEntity?.id, mViewModel.game?.id - ?: "", mViewModel.game?.name - ?: "", mRecommendPopupEntity?.popupDetail?.link?.type, - mRecommendPopupEntity?.popupDetail?.link?.text, downloadEntity.gameId, downloadEntity.name) + LogUtils.uploadRecommendPopup( + "recommend_pop_download_complete", + mRecommendPopupEntity?.id, + mViewModel.game?.id + ?: "", + mViewModel.game?.name + ?: "", + mRecommendPopupEntity?.popupDetail?.link?.type, + mRecommendPopupEntity?.popupDetail?.link?.text, + downloadEntity.gameId, + downloadEntity.name + ) } } } @@ -291,14 +313,15 @@ class GameDetailFragment : NormalFragment() { private val detailViewHolder: DetailViewHolder get() = DetailViewHolder( - mCachedView, - mGameEntity, - mDownloadEntity, - false, - mEntrance, - "游戏详情", - mGameEntity!!.name, - mTraceEvent) + mCachedView, + mGameEntity, + mDownloadEntity, + false, + mEntrance, + "游戏详情", + mGameEntity!!.name, + mTraceEvent + ) override fun getLayoutId(): Int { return R.layout.fragment_gamedetail @@ -318,8 +341,12 @@ class GameDetailFragment : NormalFragment() { when (it.itemId) { R.id.menu_more -> { if (mGameEntity != null && mNewGameDetailEntity != null) { - GameDetailMoreDialog.showMoreDialog(requireActivity() as AppCompatActivity, mGameEntity, mNewGameDetailEntity?.shareCode - ?: "") + GameDetailMoreDialog.showMoreDialog( + requireActivity() as AppCompatActivity, + mGameEntity, + mNewGameDetailEntity?.shareCode + ?: "" + ) MtaHelper.onEvent("游戏详情_新", "更多按钮", mViewModel.game?.name ?: "") } } @@ -338,7 +365,8 @@ class GameDetailFragment : NormalFragment() { mDownloadMenuItem?.actionView?.setOnClickListener { MtaHelper.onEvent("游戏详情_新", "下载管理图标", mViewModel.game?.name ?: "") // MtaHelper.onEvent("下载管理", "下载管理入口", (requireActivity() as BaseActivity).activityNameInChinese) - val intent = DownloadManagerActivity.getDownloadMangerIntent(requireContext(), mEntrance) + val intent = + DownloadManagerActivity.getDownloadMangerIntent(requireContext(), mEntrance) startActivity(intent) } @@ -368,11 +396,15 @@ class GameDetailFragment : NormalFragment() { mDestinationTab = args.getInt(EntranceUtils.KEY_TARGET, -1) mIsOpenPlatformWindow = args.getBoolean(EntranceUtils.KEY_OPEN_PLATFORM_WINDOW) - mSkeleton = Skeleton.bind(mListSkeleton).shimmer(false).load(R.layout.fragment_gamedetail_skeleton).show() + mSkeleton = + Skeleton.bind(mListSkeleton).shimmer(false).load(R.layout.fragment_gamedetail_skeleton) + .show() - val factory = GameDetailViewModel.Factory(HaloApp.getInstance().application, - args.getString(EntranceUtils.KEY_GAMEID), - args.getParcelable(GameEntity.TAG)) + val factory = GameDetailViewModel.Factory( + HaloApp.getInstance().application, + args.getString(EntranceUtils.KEY_GAMEID), + args.getParcelable(GameEntity.TAG) + ) mViewModel = viewModelProviderFromParent(factory) mPackageViewModel = viewModelProvider(PackageViewModel.Factory()) mUserViewModel = viewModelProvider(UserViewModel.Factory(HaloApp.getInstance().application)) @@ -398,7 +430,12 @@ class GameDetailFragment : NormalFragment() { } if (mNewGameDetailEntity?.bbsTab != null && position == tabTitleList.size - 1) { - DirectUtils.directToLinkPage(requireContext(), mNewGameDetailEntity?.bbsTab!!, "游戏详情", "") + DirectUtils.directToLinkPage( + requireContext(), + mNewGameDetailEntity?.bbsTab!!, + "游戏详情", + "" + ) LogUtils.uploadAccessToBbs(mNewGameDetailEntity?.bbsTab?.link, "游戏详情") } else { mCurVpPosition = position @@ -471,7 +508,8 @@ class GameDetailFragment : NormalFragment() { // toolbar 消费 fitsSystemWindows 避免在 collapsingToolbar 下面出现多出来的 padding // [https://stackoverflow.com/questions/48137666/viewgroup-inside-collapsingtoolbarlayout-show-extra-bottom-padding-when-set-fits] ViewCompat.setOnApplyWindowInsetsListener(mAppBarLayout) { _, insets -> - (mToolbar.layoutParams as ViewGroup.MarginLayoutParams).topMargin = insets.systemWindowInsetTop + (mToolbar.layoutParams as ViewGroup.MarginLayoutParams).topMargin = + insets.systemWindowInsetTop insets.consumeSystemWindowInsets() } @@ -494,7 +532,8 @@ class GameDetailFragment : NormalFragment() { mGameEntity = gameResource.data // 添加启动弹窗的相关信息 if (mEntrance.contains(EntranceUtils.ENTRANCE_WELCOME) - && mEntrance.countOccurrences("+") <= 1) { + && mEntrance.countOccurrences("+") <= 1 + ) { mGameEntity?.setWelcomeDialogInfoIfAvailable() } } else if (gameResource.status == Status.ERROR) { @@ -562,7 +601,12 @@ class GameDetailFragment : NormalFragment() { kv["状态"] = R.string.concern DataUtils.onEvent(context, "游戏关注", mGameEntity!!.name, kv) MtaHelper.onEvent("游戏详情_新", "关注", mGameEntity!!.name) - DataCollectionUtils.uploadConcern(context, mGameEntity!!.name, mGameEntity!!.id, "关注") + DataCollectionUtils.uploadConcern( + context, + mGameEntity!!.name, + mGameEntity!!.id, + "关注" + ) // GdtHelper.logAction(ActionType.ADD_TO_WISHLIST, GdtHelper.CONTENT_TYPE, "GAME", GdtHelper.CONTENT_ID, mGameEntity!!.id) updateConcernMenuIcon(isConcerned = true) @@ -576,7 +620,12 @@ class GameDetailFragment : NormalFragment() { kv["状态"] = "取消关注" DataUtils.onEvent(context, "游戏关注", mGameEntity!!.name, kv) - DataCollectionUtils.uploadConcern(context, mGameEntity!!.name, mGameEntity!!.id, "取消关注") + DataCollectionUtils.uploadConcern( + context, + mGameEntity!!.name, + mGameEntity!!.id, + "取消关注" + ) MtaHelper.onEvent("游戏详情_新", "取消关注", mGameEntity!!.name) updateConcernMenuIcon(isConcerned = false) @@ -591,8 +640,10 @@ class GameDetailFragment : NormalFragment() { }) mViewModel.bigEventLiveData.observeNonNull(this) { - GameBigEventDialog.showGameBigEventDialog(requireContext(), mGameEntity?.name - ?: "", it, mEntrance) + GameBigEventDialog.showGameBigEventDialog( + requireContext(), mGameEntity?.name + ?: "", it, mEntrance + ) } mViewModel.recommendPopupLiveData.observe(this, Observer { initRecommendUI() @@ -613,16 +664,22 @@ class GameDetailFragment : NormalFragment() { val bundle = Bundle() bundle.putParcelable(GameEntity.TAG, mGameEntity) bundle.putString(EntranceUtils.KEY_ENTRANCE, mEntrance) - bundle.putBoolean(EntranceUtils.KEY_SCROLL_TO_LIBAO, arguments?.getBoolean(EntranceUtils.KEY_SCROLL_TO_LIBAO) - ?: false) - bundle.putBoolean(EntranceUtils.KEY_OPEN_VIDEO_STREAMING, arguments?.getBoolean(EntranceUtils.KEY_OPEN_VIDEO_STREAMING) - ?: false) + bundle.putBoolean( + EntranceUtils.KEY_SCROLL_TO_LIBAO, + arguments?.getBoolean(EntranceUtils.KEY_SCROLL_TO_LIBAO) + ?: false + ) + bundle.putBoolean( + EntranceUtils.KEY_OPEN_VIDEO_STREAMING, + arguments?.getBoolean(EntranceUtils.KEY_OPEN_VIDEO_STREAMING) + ?: false + ) fragmentsList.clear() tabTitleList.clear() val tag = "android:switcher:${mViewPager.id}:" val descFragment = childFragmentManager.findFragmentByTag("${tag}$INDEX_DESC") - ?: DescFragment() + ?: DescFragment() descFragment.arguments = bundle fragmentsList.add(descFragment) tabTitleList.add(getString(R.string.game_detail_desc)) @@ -630,7 +687,7 @@ class GameDetailFragment : NormalFragment() { data.zone?.let { if (it.style == "link") {//显示web页面 val webFragment = childFragmentManager.findFragmentByTag("${tag}${INDEX_TRENDES}") - ?: WebFragment() + ?: WebFragment() val webBundle = Bundle() webBundle.putString(EntranceUtils.KEY_URL, it.link) webBundle.putBoolean(WebFragment.KEY_OPEN_NATIVE_PAGE, true) @@ -638,7 +695,7 @@ class GameDetailFragment : NormalFragment() { fragmentsList.add(webFragment) } else { val fuliFragment = childFragmentManager.findFragmentByTag("${tag}${INDEX_TRENDES}") - ?: FuLiFragment() + ?: FuLiFragment() fuliFragment.arguments = bundle fragmentsList.add(fuliFragment) } @@ -647,7 +704,7 @@ class GameDetailFragment : NormalFragment() { if (data.showComment) { val ratingFragment = childFragmentManager.findFragmentByTag("${tag}${INDEX_RATING}") - ?: RatingFragment() + ?: RatingFragment() bundle.putBoolean(EntranceUtils.KEY_SKIP_GAME_COMMENT, mSkipGameComment) bundle.putBoolean(EntranceUtils.KEY_DIRECT_COMMENT, data.directComment) ratingFragment.arguments = bundle @@ -690,7 +747,11 @@ class GameDetailFragment : NormalFragment() { val dialog = retrieveAvailableDialog(detailEntity.detailDialogs) if (dialog != null) { val dayOfMonth = Calendar.getInstance().get(Calendar.DAY_OF_MONTH) - if ("EVERY_TIME_OPEN" == dialog.alert || SPUtils.getLong(SP_OPENED_DIALOG_TIME_PREFIX + mGameEntity?.id, 0) != dayOfMonth.toLong()) { + if ("EVERY_TIME_OPEN" == dialog.alert || SPUtils.getLong( + SP_OPENED_DIALOG_TIME_PREFIX + mGameEntity?.id, + 0 + ) != dayOfMonth.toLong() + ) { SPUtils.setLong(SP_OPENED_DIALOG_TIME_PREFIX + mGameEntity?.id, dayOfMonth.toLong()) doShowAlertDialog(dialog) } @@ -711,19 +772,22 @@ class GameDetailFragment : NormalFragment() { } private fun doShowAlertDialog(dialog: GameEntity.Dialog) { - DialogUtils.showDialogWithHtmlContent(requireContext(), - dialog.title, - dialog.content, - dialog.confirmButton.text, - dialog.closeButtonText, - { - dialog.confirmButton.text = dialog.confirmButton.linkText - DirectUtils.directToLinkPage( - requireContext(), - dialog.confirmButton, - mEntrance, - "") - }, null) + DialogUtils.showDialogWithHtmlContent( + requireContext(), + dialog.title, + dialog.content, + dialog.confirmButton.text, + dialog.closeButtonText, + { + dialog.confirmButton.text = dialog.confirmButton.linkText + DirectUtils.directToLinkPage( + requireContext(), + dialog.confirmButton, + mEntrance, + "" + ) + }, null + ) } private fun loadErrorControl(exception: HttpException?) { @@ -770,22 +834,44 @@ class GameDetailFragment : NormalFragment() { override fun onMoreClickListener() { if (!isVisible) return MtaHelper.onEvent("游戏详情_新", "标签展开", mViewModel.game?.name ?: "") - GameTagsDialog.showGameTagsDialog(requireActivity(), mNewGameDetailEntity?.tagStyle!!, mGameEntity?.id - ?: "", mGameEntity?.name ?: "") + GameTagsDialog.showGameTagsDialog( + requireActivity(), mNewGameDetailEntity?.tagStyle!!, mGameEntity?.id + ?: "", mGameEntity?.name ?: "" + ) } override fun onItemClickListener(tag: TagStyleEntity) { - NewLogUtils.logGameDetailTagClick(mGameEntity?.id ?: "", mGameEntity?.name - ?: "", tag.id, tag.name) + NewLogUtils.logGameDetailTagClick( + mGameEntity?.id ?: "", mGameEntity?.name + ?: "", tag.id, tag.name + ) MtaHelper.onEvent("游戏详情_新", "点击标签", mViewModel.game?.name ?: "") - requireContext().startActivity(TagsActivity.getIntent(requireContext(), - tag.name, tag.name, mEntrance, "游戏介绍")) + requireContext().startActivity( + TagsActivity.getIntent( + requireContext(), + tag.name, tag.name, mEntrance, "游戏介绍" + ) + ) + } + } + val recommendAge = mNewGameDetailEntity?.recommendAge + recommendAgeIv.goneIf(recommendAge.isNullOrEmpty()) + if (!recommendAge.isNullOrEmpty()) { + val recommendAgeRes = when (recommendAge) { + "8+" -> R.drawable.ic_recommend_age8 + "12+" -> R.drawable.ic_recommend_age12 + "16+" -> R.drawable.ic_recommend_age16 + else -> -1 + } + if (recommendAgeRes > 0) { + recommendAgeIv.setImageDrawable(recommendAgeRes.toDrawable()) } } ratingScoreContainer.goneIf(!mNewGameDetailEntity!!.showComment) if (mGameEntity?.commentCount ?: 0 > 3) { ratingScoreAverage.textSize = 18f - ratingScoreAverage.text = if (mGameEntity?.star == 10F) "10" else mGameEntity?.star.toString() + ratingScoreAverage.text = + if (mGameEntity?.star == 10F) "10" else mGameEntity?.star.toString() } else { ratingScoreAverage.textSize = 8f ratingScoreAverage.text = "评分过少" @@ -799,8 +885,17 @@ class GameDetailFragment : NormalFragment() { gameDetailRankTv.text = "${ranking.columnName}第${ranking.no}名" gameDetailRankTv.isSelected = true gameDetailRankLl.setOnClickListener { - MtaHelper.onEvent("游戏详情_新", "点击榜单", "${mViewModel.game?.name}+${ranking.columnName}") - DirectUtils.directToColumnCollection(requireContext(), ranking.collectionId, entrance = mEntrance, columnName = ranking.columnName) + MtaHelper.onEvent( + "游戏详情_新", + "点击榜单", + "${mViewModel.game?.name}+${ranking.columnName}" + ) + DirectUtils.directToColumnCollection( + requireContext(), + ranking.collectionId, + entrance = mEntrance, + columnName = ranking.columnName + ) } } @@ -810,20 +905,60 @@ class GameDetailFragment : NormalFragment() { mNewGameDetailEntity?.event?.let { gameBigEvent.visibility = View.VISIBLE if (it.highLight) { - gameBigEvent.setTextColor(ContextCompat.getColor(requireContext(), R.color.text_2A85FB)) - gameBigEvent.background = ContextCompat.getDrawable(requireContext(), R.drawable.bg_game_big_event_light) - gameBigEvent.setCompoundDrawablesWithIntrinsicBounds(ContextCompat.getDrawable(requireContext(), R.drawable.ic_game_detail_big_event), null, - ContextCompat.getDrawable(requireContext(), R.drawable.ic_game_detail_big_event_arrow), null) - var eventStr = "${TimeUtils.getFormatTime(it.time, "MM-dd")}${TimeUtils.getDayString(it.time)}:${it.content}" - if (eventStr.contains("\n")) eventStr = eventStr.substring(0, eventStr.indexOf("\n")) + gameBigEvent.setTextColor( + ContextCompat.getColor( + requireContext(), + R.color.text_2A85FB + ) + ) + gameBigEvent.background = + ContextCompat.getDrawable(requireContext(), R.drawable.bg_game_big_event_light) + gameBigEvent.setCompoundDrawablesWithIntrinsicBounds( + ContextCompat.getDrawable( + requireContext(), + R.drawable.ic_game_detail_big_event + ), null, + ContextCompat.getDrawable( + requireContext(), + R.drawable.ic_game_detail_big_event_arrow + ), null + ) + var eventStr = "${ + TimeUtils.getFormatTime( + it.time, + "MM-dd" + ) + }${TimeUtils.getDayString(it.time)}:${it.content}" + if (eventStr.contains("\n")) eventStr = + eventStr.substring(0, eventStr.indexOf("\n")) gameBigEvent.text = eventStr } else { - gameBigEvent.setTextColor(ContextCompat.getColor(requireContext(), R.color.text_999999)) - gameBigEvent.background = ContextCompat.getDrawable(requireContext(), R.drawable.bg_game_big_event) - gameBigEvent.setCompoundDrawablesWithIntrinsicBounds(ContextCompat.getDrawable(requireContext(), R.drawable.ic_game_detail_big_event_gray), null, - ContextCompat.getDrawable(requireContext(), R.drawable.ic_game_detail_big_event_arrow_gray), null) - var eventStr = if (TimeUtils.getBeforeDays(it.time) <= 15) "${TimeUtils.getFormatTime(it.time, "MM-dd")}${TimeUtils.getDayString(it.time)}:${it.content}" else it.content - if (eventStr.contains("\n")) eventStr = eventStr.substring(0, eventStr.indexOf("\n")) + gameBigEvent.setTextColor( + ContextCompat.getColor( + requireContext(), + R.color.text_999999 + ) + ) + gameBigEvent.background = + ContextCompat.getDrawable(requireContext(), R.drawable.bg_game_big_event) + gameBigEvent.setCompoundDrawablesWithIntrinsicBounds( + ContextCompat.getDrawable( + requireContext(), + R.drawable.ic_game_detail_big_event_gray + ), null, + ContextCompat.getDrawable( + requireContext(), + R.drawable.ic_game_detail_big_event_arrow_gray + ), null + ) + var eventStr = if (TimeUtils.getBeforeDays(it.time) <= 15) "${ + TimeUtils.getFormatTime( + it.time, + "MM-dd" + ) + }${TimeUtils.getDayString(it.time)}:${it.content}" else it.content + if (eventStr.contains("\n")) eventStr = + eventStr.substring(0, eventStr.indexOf("\n")) gameBigEvent.text = eventStr } gameBigEvent.setOnClickListener { @@ -835,20 +970,20 @@ class GameDetailFragment : NormalFragment() { private fun setUpTopVideo(topVideo: GameDetailEntity.Video) { GSYVideoOptionBuilder() - .setIsTouchWigetFull(false) - .setIsTouchWiget(false) - .setRotateViewAuto(false) - .setShowFullAnimation(false) - .setSeekRatio(1f) - .setUrl(topVideo.url) - .setCacheWithPlay(true) - .setVideoAllCallBack(object : GSYSampleCallBack() { - override fun onQuitFullscreen(url: String?, vararg objects: Any) { - mOrientationUtils?.backToProtVideo() - mTopVideoView.uploadVideoStreamingPlaying("退出全屏") - } - }) - .build(mTopVideoView) + .setIsTouchWigetFull(false) + .setIsTouchWiget(false) + .setRotateViewAuto(false) + .setShowFullAnimation(false) + .setSeekRatio(1f) + .setUrl(topVideo.url) + .setCacheWithPlay(true) + .setVideoAllCallBack(object : GSYSampleCallBack() { + override fun onQuitFullscreen(url: String?, vararg objects: Any) { + mOrientationUtils?.backToProtVideo() + mTopVideoView.uploadVideoStreamingPlaying("退出全屏") + } + }) + .build(mTopVideoView) mTopVideoView.gameName = mGameEntity?.name ?: "" mTopVideoView.viewModel = mViewModel @@ -856,8 +991,11 @@ class GameDetailFragment : NormalFragment() { mTopVideoView.updateThumb(topVideo.poster) //val trafficVideo = PreferenceManager.getDefaultSharedPreferences(context).getBoolean(SettingsFragment.TRAFFIC_VIDEO_SP_KEY, false) - val videoOption = SPUtils.getString(Constants.SP_HOME_OR_DETAIL_VIDEO_OPTION, VideoSettingFragment.VIDEO_OPTION_WIFI) - ?: VideoSettingFragment.VIDEO_OPTION_WIFI + val videoOption = SPUtils.getString( + Constants.SP_HOME_OR_DETAIL_VIDEO_OPTION, + VideoSettingFragment.VIDEO_OPTION_WIFI + ) + ?: VideoSettingFragment.VIDEO_OPTION_WIFI when (videoOption) { VideoSettingFragment.VIDEO_OPTION_ALL -> { mTopVideoView.startPlayLogic(isAutoPlay = true) @@ -883,7 +1021,8 @@ class GameDetailFragment : NormalFragment() { } mTopVideoView.fullscreenButton.setOnClickListener { - val horizontalVideoView = mTopVideoView.startWindowFullscreen(requireContext(), true, true) as? TopVideoView + val horizontalVideoView = + mTopVideoView.startWindowFullscreen(requireContext(), true, true) as? TopVideoView if (horizontalVideoView == null) { toastInInternalRelease("全屏失败,请向技术人员提供具体的操作步骤") return@setOnClickListener @@ -903,10 +1042,24 @@ class GameDetailFragment : NormalFragment() { } private fun updateToolbarStyle(isToolbarWhite: Boolean) { - mTitleTv.setTextColor(ContextCompat.getColor(requireContext(), if (isToolbarWhite) R.color.black else R.color.white)) + mTitleTv.setTextColor( + ContextCompat.getColor( + requireContext(), + if (isToolbarWhite) R.color.black else R.color.white + ) + ) mToolbar.setNavigationIcon(if (isToolbarWhite) R.drawable.ic_bar_back else R.drawable.ic_bar_back_light) - mToolbar.setBackgroundColor(ContextCompat.getColor(requireContext(), if (isToolbarWhite) R.color.white else R.color.transparent)) - DisplayUtils.setStatusBarColor(requireActivity(), if (isToolbarWhite) R.color.white else R.color.transparent, true) + mToolbar.setBackgroundColor( + ContextCompat.getColor( + requireContext(), + if (isToolbarWhite) R.color.white else R.color.transparent + ) + ) + DisplayUtils.setStatusBarColor( + requireActivity(), + if (isToolbarWhite) R.color.white else R.color.transparent, + true + ) updateConcernMenuIcon(mNewGameDetailEntity?.me?.isGameConcerned ?: false) mMoreMenuItem?.setIcon(if (isToolbarWhite) R.drawable.ic_menu_gamedetail_more else R.drawable.ic_menu_gamedetail_more_light) mSearchMenuItem?.setIcon(if (isToolbarWhite) R.drawable.ic_menu_gamedetail_search else R.drawable.ic_menu_gamedetail_search_light) @@ -930,7 +1083,8 @@ class GameDetailFragment : NormalFragment() { } else if (SKIP_FULI == reuse.type) { mViewPager.currentItem = INDEX_TRENDES } else if (SKIP_RATING == reuse.type) { - mViewPager.currentItem = if (mNewGameDetailEntity?.zone == null) INDEX_RATING_FOR_NO_TRENDES else INDEX_RATING + mViewPager.currentItem = + if (mNewGameDetailEntity?.zone == null) INDEX_RATING_FOR_NO_TRENDES else INDEX_RATING } else if ("hideKaifuHint" == reuse.type) { mIsShowKaifuHint = false mKaifuHint.visibility = View.GONE @@ -975,7 +1129,15 @@ class GameDetailFragment : NormalFragment() { } } - @OnClick(R.id.reuse_no_connection, R.id.gamedetail_kaifu_hint, R.id.concern_btn, R.id.reserve_btn, R.id.switch_btn, R.id.closeIv, R.id.recommendCloseIv) + @OnClick( + R.id.reuse_no_connection, + R.id.gamedetail_kaifu_hint, + R.id.concern_btn, + R.id.reserve_btn, + R.id.switch_btn, + R.id.closeIv, + R.id.recommendCloseIv + ) override fun onClick(v: View) { when (v.id) { R.id.reuse_no_connection -> { @@ -992,7 +1154,11 @@ class GameDetailFragment : NormalFragment() { R.id.concern_btn -> { ifLogin("游戏详情-[关注]") { if (mNewGameDetailEntity != null && mNewGameDetailEntity!!.me.isGameConcerned) { - DialogUtils.showCancelDialog(requireContext(), { mViewModel.concernCommand(false) }, null) + DialogUtils.showCancelDialog( + requireContext(), + { mViewModel.concernCommand(false) }, + null + ) } else { mViewModel.concernCommand(true) } @@ -1005,37 +1171,53 @@ class GameDetailFragment : NormalFragment() { } CheckLoginUtils.checkLogin(requireContext(), "游戏详情") { if (!ReservationRepository.thisGameHasBeenReserved(mGameEntity?.id ?: "")) { - val dialogFragment = ReserveDialogFragment.getInstance(mGameEntity!!, object : ReserveDialogFragment.SuccessCallback { - override fun onSuccess() { - LogUtils.logReservation(mGameEntity, mTraceEvent) - DetailDownloadUtils.detailInitDownload(detailViewHolder, false) - showReserveBtn(isShowReserveBtn()) - } - }) + val dialogFragment = ReserveDialogFragment.getInstance( + mGameEntity!!, + object : ReserveDialogFragment.SuccessCallback { + override fun onSuccess() { + LogUtils.logReservation(mGameEntity, mTraceEvent) + DetailDownloadUtils.detailInitDownload(detailViewHolder, false) + showReserveBtn(isShowReserveBtn()) + } + }) dialogFragment.show(childFragmentManager, "reserve") } else { if ("download" == mGameEntity?.reserveStatus) { - ReservationHelper.showDeleteReservationDialog(requireContext(), object : EmptyCallback { - override fun onCallback() { - ReservationHelper.deleteReservation(mGameEntity!!, object : EmptyCallback { - override fun onCallback() { - DetailDownloadUtils.detailInitDownload(detailViewHolder, false) - showReserveBtn(isShowReserveBtn()) - } - }) - } - }) + ReservationHelper.showDeleteReservationDialog( + requireContext(), + object : EmptyCallback { + override fun onCallback() { + ReservationHelper.deleteReservation( + mGameEntity!!, + object : EmptyCallback { + override fun onCallback() { + DetailDownloadUtils.detailInitDownload( + detailViewHolder, + false + ) + showReserveBtn(isShowReserveBtn()) + } + }) + } + }) } else { - ReservationHelper.showCancelReservationDialog(requireContext(), object : EmptyCallback { - override fun onCallback() { - ReservationHelper.cancelReservation(mGameEntity!!, object : EmptyCallback { - override fun onCallback() { - DetailDownloadUtils.detailInitDownload(detailViewHolder, false) - showReserveBtn(isShowReserveBtn()) - } - }) - } - }) + ReservationHelper.showCancelReservationDialog( + requireContext(), + object : EmptyCallback { + override fun onCallback() { + ReservationHelper.cancelReservation( + mGameEntity!!, + object : EmptyCallback { + override fun onCallback() { + DetailDownloadUtils.detailInitDownload( + detailViewHolder, + false + ) + showReserveBtn(isShowReserveBtn()) + } + }) + } + }) } } } @@ -1060,10 +1242,20 @@ class GameDetailFragment : NormalFragment() { private fun updateConcernMenuIcon(isConcerned: Boolean) { if (isConcerned) { mConcernBtn.text = "已关注" - mConcernBtn.setCompoundDrawablesWithIntrinsicBounds(null, ContextCompat.getDrawable(requireContext(), R.drawable.ic_gamedetail_concerned), null, null) + mConcernBtn.setCompoundDrawablesWithIntrinsicBounds( + null, + ContextCompat.getDrawable(requireContext(), R.drawable.ic_gamedetail_concerned), + null, + null + ) } else { mConcernBtn.text = "关注" - mConcernBtn.setCompoundDrawablesWithIntrinsicBounds(null, ContextCompat.getDrawable(requireContext(), R.drawable.ic_gamedetail_concern), null, null) + mConcernBtn.setCompoundDrawablesWithIntrinsicBounds( + null, + ContextCompat.getDrawable(requireContext(), R.drawable.ic_gamedetail_concern), + null, + null + ) } } @@ -1075,7 +1267,8 @@ class GameDetailFragment : NormalFragment() { } private fun updateDownloadCountHint(updateList: List?) { - val count = DownloadManager.getInstance(requireContext()).getDownloadOrUpdateCount(updateList) + val count = + DownloadManager.getInstance(requireContext()).getDownloadOrUpdateCount(updateList) val params = mDownloadCountHint?.layoutParams if (TextUtils.isEmpty(count)) { params?.width = DisplayUtils.dip2px(6f) @@ -1107,7 +1300,15 @@ class GameDetailFragment : NormalFragment() { if (mGameEntity != null && SimulatorGameManager.isSimulatorGame(mGameEntity!!)) { mReserveBtn.visibility = View.VISIBLE mReserveBtn.text = "管理" - mReserveBtn.setCompoundDrawablesWithIntrinsicBounds(null, ContextCompat.getDrawable(requireContext(), R.drawable.ic_gamedetail_simulator_manage), null, null) + mReserveBtn.setCompoundDrawablesWithIntrinsicBounds( + null, + ContextCompat.getDrawable( + requireContext(), + R.drawable.ic_gamedetail_simulator_manage + ), + null, + null + ) return } @@ -1115,10 +1316,20 @@ class GameDetailFragment : NormalFragment() { mReserveBtn.visibility = View.VISIBLE if (ReservationRepository.thisGameHasBeenReserved(mGameEntity?.id ?: "")) { mReserveBtn.text = "已预约" - mReserveBtn.setCompoundDrawablesWithIntrinsicBounds(null, ContextCompat.getDrawable(requireContext(), R.drawable.ic_gamedetail_reserved), null, null) + mReserveBtn.setCompoundDrawablesWithIntrinsicBounds( + null, + ContextCompat.getDrawable(requireContext(), R.drawable.ic_gamedetail_reserved), + null, + null + ) } else { mReserveBtn.text = "预约" - mReserveBtn.setCompoundDrawablesWithIntrinsicBounds(null, ContextCompat.getDrawable(requireContext(), R.drawable.ic_gamedetail_reserve), null, null) + mReserveBtn.setCompoundDrawablesWithIntrinsicBounds( + null, + ContextCompat.getDrawable(requireContext(), R.drawable.ic_gamedetail_reserve), + null, + null + ) } } else { mReserveBtn.visibility = View.GONE @@ -1132,7 +1343,9 @@ class GameDetailFragment : NormalFragment() { private fun isShowReserveBtn(): Boolean { if (mGameEntity == null) return false if (mNewGameDetailEntity == null) return false - if (mGameEntity!!.getApk().isEmpty() || mGameEntity!!.downloadOffStatus != null || !mNewGameDetailEntity!!.appointmentSwitchStatus) return false + if (mGameEntity!!.getApk() + .isEmpty() || mGameEntity!!.downloadOffStatus != null || !mNewGameDetailEntity!!.appointmentSwitchStatus + ) return false return true } @@ -1169,7 +1382,8 @@ class GameDetailFragment : NormalFragment() { private fun handleTabTouchEvent(title: String) { if (title == mTabClickEvent.second - && System.currentTimeMillis() - mTabClickEvent.first < 300) { + && System.currentTimeMillis() - mTabClickEvent.first < 300 + ) { val fragment = fragmentsList[mViewPager.currentItem] if (fragment is IScrollable) { fragment.scrollToTop() @@ -1188,7 +1402,11 @@ class GameDetailFragment : NormalFragment() { if (BrowserInstallHelper.shouldShowGameDetailUseBrowserToInstallHint()) { mBrowserInstallContainer.visibility = View.VISIBLE mBrowserInstallContainer.setOnClickListener { - val intent = ShellActivity.getIntent(requireContext(), ShellActivity.Type.SWITCH_INSTALL_METHOD, null) + val intent = ShellActivity.getIntent( + requireContext(), + ShellActivity.Type.SWITCH_INSTALL_METHOD, + null + ) requireActivity().startActivity(intent) BrowserInstallHelper.logOrdinaryBrowserEvent(BrowserInstallHelper.Type.SWITCH_INSTALL_GUIDE_ACCESS) } @@ -1197,10 +1415,13 @@ class GameDetailFragment : NormalFragment() { var closeHintText = "" if (manufacturer == "OPPO" || manufacturer == "VIVO") { - hintText = if (SPUtils.getBoolean(Constants.SP_USE_BROWSER_TO_INSTALL)) "当前安装方式为[浏览器安装],点击切换安装方式" else "${manufacturer}手机如何解决安装需要密码" - closeHintText = "关闭后“切换安装方式”入口将显示在左下角,您也可以前往“我的光环-设置-切换安装方式”进行设置,或在“ 我的光环-帮助与反馈”查看相关问题" + hintText = + if (SPUtils.getBoolean(Constants.SP_USE_BROWSER_TO_INSTALL)) "当前安装方式为[浏览器安装],点击切换安装方式" else "${manufacturer}手机如何解决安装需要密码" + closeHintText = + "关闭后“切换安装方式”入口将显示在左下角,您也可以前往“我的光环-设置-切换安装方式”进行设置,或在“ 我的光环-帮助与反馈”查看相关问题" } else { - hintText = if (SPUtils.getBoolean(Constants.SP_USE_BROWSER_TO_INSTALL)) "当前安装方式为[浏览器安装],点击切换安装方式" else "手机如何解决无法安装问题" + hintText = + if (SPUtils.getBoolean(Constants.SP_USE_BROWSER_TO_INSTALL)) "当前安装方式为[浏览器安装],点击切换安装方式" else "手机如何解决无法安装问题" closeHintText = "关闭后“切换安装方式”入口将显示在左下角,您也可以前往“我的光环-设置-切换安装方式”进行设置" } @@ -1228,7 +1449,8 @@ class GameDetailFragment : NormalFragment() { private fun initRecommendUI() { val recommendPopupList = mViewModel.recommendPopupLiveData.value - mRecommendPopupEntity = RecommendPopupHelper.getRecommendPopup(mViewModel.game, recommendPopupList) + mRecommendPopupEntity = + RecommendPopupHelper.getRecommendPopup(mViewModel.game, recommendPopupList) ?: return val popupDetail = mRecommendPopupEntity!!.popupDetail mRecommendText.text = popupDetail.text @@ -1256,10 +1478,19 @@ class GameDetailFragment : NormalFragment() { mRecommendLinkTv.text = popupDetail.link?.title mRecommendLinkTv.setOnClickListener { popupDetail.link?.let { - PageSwitchDataHelper.pushCurrentPageData(hashMapOf(Pair(PageSwitchDataHelper.PAGE_GAME_DETAIL_RECOMMEND, ""))) + PageSwitchDataHelper.pushCurrentPageData( + hashMapOf( + Pair( + PageSwitchDataHelper.PAGE_GAME_DETAIL_RECOMMEND, + "" + ) + ) + ) DirectUtils.directToLinkPage(requireContext(), it, mEntrance, "游戏详情") - LogUtils.uploadRecommendPopup("recommend_pop_link_click", mRecommendPopupEntity?.id, mViewModel.game?.id - ?: "", mViewModel.game?.name ?: "", it.type, it.text, "", "") + LogUtils.uploadRecommendPopup( + "recommend_pop_link_click", mRecommendPopupEntity?.id, mViewModel.game?.id + ?: "", mViewModel.game?.name ?: "", it.type, it.text, "", "" + ) } } } @@ -1276,12 +1507,15 @@ class GameDetailFragment : NormalFragment() { mIsRecommendViewShow = true RecommendPopupHelper.saveRecord(mRecommendPopupEntity!!) if (mRecommendPopupEntity!!.popupDetail.duration > 0) { - mRecommendDisposable = countDownTimer(mRecommendPopupEntity!!.popupDetail.duration) { finish, _ -> - if (finish) hideRecommendView() - } + mRecommendDisposable = + countDownTimer(mRecommendPopupEntity!!.popupDetail.duration) { finish, _ -> + if (finish) hideRecommendView() + } } - LogUtils.uploadRecommendPopup("recommend_pop_show", mRecommendPopupEntity?.id, mViewModel.game?.id - ?: "", mViewModel.game?.name ?: "", "", "", "", "") + LogUtils.uploadRecommendPopup( + "recommend_pop_show", mRecommendPopupEntity?.id, mViewModel.game?.id + ?: "", mViewModel.game?.name ?: "", "", "", "", "" + ) } } } @@ -1295,8 +1529,10 @@ class GameDetailFragment : NormalFragment() { mRecommendDisposable?.dispose() mRecommendDisposable = null if (isManuallyClose) { - LogUtils.uploadRecommendPopup("recommend_pop_close", mRecommendPopupEntity?.id, mViewModel.game?.id - ?: "", mViewModel.game?.name ?: "", "", "", "", "") + LogUtils.uploadRecommendPopup( + "recommend_pop_close", mRecommendPopupEntity?.id, mViewModel.game?.id + ?: "", mViewModel.game?.name ?: "", "", "", "", "" + ) } } } @@ -1347,7 +1583,10 @@ class GameDetailFragment : NormalFragment() { val currentPosition = mTopVideoView.getCurrentPosition() val topVideo = mNewGameDetailEntity?.topVideo if (topVideo != null) { - ScrollCalculatorHelper.savePlaySchedule(MD5Utils.getContentMD5(topVideo.url), currentPosition) + ScrollCalculatorHelper.savePlaySchedule( + MD5Utils.getContentMD5(topVideo.url), + currentPosition + ) } } hideRecommendView() diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/entity/NewGameDetailEntity.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/entity/NewGameDetailEntity.kt index d67f9e86c6..4aad5a795f 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/entity/NewGameDetailEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/entity/NewGameDetailEntity.kt @@ -33,6 +33,8 @@ data class NewGameDetailEntity( var zone: ZoneEntity? = null, @SerializedName("appointment_switch_status") var appointmentSwitchStatus: Boolean = false, + @SerializedName("recommend_age") + var recommendAge: String = "",//适龄等级 @SerializedName("mirror_status") var mirrorStatus: String? = "", diff --git a/app/src/main/res/drawable-xxxhdpi/ic_recommend_age12.webp b/app/src/main/res/drawable-xxxhdpi/ic_recommend_age12.webp new file mode 100644 index 0000000000000000000000000000000000000000..6b61a7e5c63c379808e4880fae10b508b144a695 GIT binary patch literal 2498 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 Mp6^8nqnF^|0E8~)r~m)} literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_recommend_age16.webp b/app/src/main/res/drawable-xxxhdpi/ic_recommend_age16.webp new file mode 100644 index 0000000000000000000000000000000000000000..bc2b91dd077ffbe17fdeccde55cf88dce2651c4a GIT binary patch literal 1738 zcmV;*1~vIoNk&G(1^@t8MM6+kP&gpA1^@ssCIFoQDlh>!06vjIok}I6qM@jEX}GWw z31$G*J`4V<+c6-!Pv&3tKXj`<_C1!G!^{txyzzgZ^-KBl*b|)R^gs80pg(B+RDarj z*n5%vnEYn>0RDmgtE|7!bM|-Bi`hf_$NlW6dV7e~M^4vqs?B^vUVr>NJtP6qX6k6A zl3L`oAGp%N<5Tdlh0R+s6vX`eI*-(d({({J7k($S*{jBoyulUW9H1uL*ZBTs+$v1L z1NJ02X_o{&Kd`;<*L;=Z4DB@~eF-WaA@JFRDVMZJvWj3tX2 zh8(M$os0QXz2JZ%)w!B)V7~iE<@1Io^w%#V>SnMjk#@+rQI6fL0KcSEi`EEcY8_RA zYE=Z`0HN3_nuC9JXdt$2dltK~3pLaP&_ANW0092}wJ@`atI!q~^KU>I0qIYYOY%u| zwEI~coq?2?r?>zB(rOpLr5(HNFOWkQJ;KVhH^Xnun8f5HQPz~HJ}*;WRpt-sM_X%P zN}48~Mz+ef`=TzcGp|TVBoM!AG|cG#axb*wmBET#cJBnoliRLvO%RGyAt`2TRs-mE z!TCL4&DAMDm)u~cEM1PFgtc~~1xa=&<|ZX7q|>Jja4*R7C8x1N&&<%aguJQyI&7aQ z`4YwcAb7y)Wn2AR{r+s!*Ihyxz#@KcyR{`y@gol}-X){}w=tc(GwIK-=M;fGY>GQt zO_LxHrAQUj?NItvHG`$We6wI}o-B8jm})7e3oQm(!0DyWrMQMx#tp$!6i|{H$_8Qj z)i$18sZ7qM^I;9VbzC^13xF>F%E2pqBeZ9nr(eP`<(2bBv{JMd0#j9k%wa5gK{uXv z8BwBEl9H(4%janx^B&&8-5>X6Ffb?-b6(+i=C0O!GYzj`QbGhXN8j$$;=ra*QXxH;2;5m%`0R)6FCCoD|d2 ze)k|N?2tz<2yVCrBGm91?I;g=V-1)0+c(Ht?H)cCkbR+s$=JuDQ+gl zjWuI}j|ideE*pWmfQ-6qwM72wv0X-Y$qbLpBl!Jd5e}gMAf>VS;Pj{2HTwk0x-zoi zmQe&6Cz62S~G86Q1-7J!; zIg=CRBOIeM+5=%=-0Doc!OB+n$JN3ir*Owq3l9K@u><>(=;fI>Kk|trIgl_%f%ALr zIM&!cqv?wju4*}~P6TL(Ikodn?VvIX;FyI|Qhe*=*z)L9oblwZ_#e=d zX$DMXM_ur=%_}M_drck=l{+d=b)+!~mbeq%ToiEU{&GP@ic!k6l?nzzLa1juS8jHC z3cUV1OL>3?wzMXdKqNRk)*cy~J7slna{B!bd**#Ke18v-%c+&*xW0*46cV0@WY48~ z=I31a{Gl9K%nRx#>H+Lin-sv<^2;G2YE@M;l7*c|i7p_d`tLi?g8nQ{Y(?R7xZt0B3yS3S`+q(7@h*I#;PCR&Khx! zRxMz`1dt;+DLBciXgeDw$No%@Z$o$HJWxA^JMGlsyJzu!!dO^F5q<4+e%~Xs*8p+2 g`?<3e6t?~xFR~k6j*urDh%5jA04Y_p%gNvX0NzhqQ2+n{ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_recommend_age8.webp b/app/src/main/res/drawable-xxxhdpi/ic_recommend_age8.webp new file mode 100644 index 0000000000000000000000000000000000000000..4265016b21526f2ee2d94909b32dd4c9d1892ca7 GIT binary patch literal 2072 zcmV+z2f8Q*)sp#yavY=I@!MAXOT{p}QoB;eQ2EI#@T|6Ug5^pE%Y!_u zkGNdpGR38ZONEwmj+QUc@`TF*xb$(U<5Hw$CtBWcxy5CH zOAnVCE{>L8(ei@J4K6cW+PG9{x#Vg27A?=XT;VdorHME+uo4Mk0M;%UU|t@6d(CF3{sYISIkA21|03R_e8GRbbQbdy=DX-e z&I73n`#=3}VBVIm?-(k*oqvq*=DnWx<4uu6l$<)Nyehf8CN=u1PFHTpTSPz<_sVvv zL|!Tm#9-9c*ED%UYqwqS%kD{aM<*KN4R={6D^Rs{X8*Dx7aPnFE;(bqsm5q-k#m~@ zHo)=;qE|*NK|q=K;%#{2EPEt~KrV9AQ}fZ@;X0o9VQSdP>9{=GS5J=+%Ad_Aj1RyYCs)%@#F%ct zZhFF-Kv;hi&Lp{X3IqqO$z+n>{$oG388&_P-q^SBUB-X;u*AZF_NcX-LTRgXq@N{| za!$e_?*Dh}dxsWO=k;gxeFNKmQSR98(41Ds7K00wX|PYG^LGD}aJyyDLG8zKZzxUg zbIV12l#_fUCM})F2bwzyc2*6}DjR3%bNp!`9Dn|GE-2dr3YJOCt30vqta{>NK{JC? z2#%J-tEy>13FK*CP|Rk_>`2W^gol*ATBj1uBl+bSRLW<`m=7sWOHiiL&&pz)Q>v-P z*K#f85&_UYdj2}Te4Mq1ZqcTVi~XnE$Mt-zyfRmV(fKX3fn=?`-EkEPSfclTp6_{V z2&+Df5|IvC$Vm9O`DUna)W|j=MjrX7dh(KSq!^QrHw?ccI6(Kb2kk5u4_m7=_%3z> z{~|V|WNlnCkdeRRzhVx431<5&t0|-FYu}XPx#oAo7T*l+6(X7CRctB$dJcRZlsvk5 zg}%x5)H!ON3QOLQO?ioHlE_#IDHPjX0s zeDixR5AIFw-0%Fuk2s8p13A(w$XOrA_!n2PmD=@jEQJUz4?g-i*VeIGp8TCPaP@Sa z+LYjJ0XYsek>T=~B1Mektok&J9-YYpA@2hmDY#zC($TNx11*QaF+z)s$SmTQcL-9d z^crjj(8ynL{Y8iFPP`mbGhF9i0AhAkKP?94{P~&izi=n3A*D_PCsvxpF9^4B*Y37} z`YgS=9Mw%j1mf@*MzAE*L`?IteI9$B32$O3&S#o56KVWK_-(7S%3fkeqU|{9+}S|i z5v?pVcO^MC)sN}!(~i;_fO)mzI&IPCrlvpkGm#cQ?0DZPS|wm@=$AYBu0*-@hnKLd z&tFV2=gR8=y2$h4hSX72n6SUbl*Wz~j;Z2QxN>~*<7JYn0X|~x5zlJ8)=dz^27}0+ zb>UxY$ZDNXKKDG>lt+y8H#b)Z+IugLSwIm1$(dBy(#tmkik1BWb(5x=DtFtkhPV${eC5##(k(ohpk;?#g zM0Dr136FEK}QrvmnXXOffASo!_Ky()j27jofvS+g=jFr(EG9Qp>8Q$DAjm>_=W%$8v)2Uu z1z3|(R^L%Uzw`0|2UtX+r6WbqUfFW)UG%X==^o}`gXF&DjQC2{RECLcrfFIL7RBY* z?^$jJXQ1DH+?`d@MP%a`QAilT%?IGd3sB#H4nv=+N})GTU&b)C1^xfjQt1D4S>c#@ z#6mT8>OJtcH{PHrn1@P-q&PG-kNf@?$o+xzjZbxXBl)`RT?R+1OUsqEFZ3?N9E_!J z`xEU)Y)%19otB(s+iR?l`~Uzk5g?cTJAbKX`?z!JKfHUj%{sq - + android:layout_marginRight="12dp" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + android:layout_marginLeft="8dp" + android:orientation="vertical" + app:layout_constraintEnd_toStartOf="@+id/rating_score_container" + app:layout_constraintStart_toEndOf="@+id/gameIconContainer" + app:layout_constraintTop_toTopOf="@+id/gameIconContainer"> + + - + Date: Mon, 23 Aug 2021 11:55:07 +0800 Subject: [PATCH 094/151] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E8=BD=AE=E6=92=AD=E5=9B=BE=E6=98=BE=E7=A4=BA=E8=83=8C=E6=99=AF?= =?UTF-8?q?=E8=89=B2=E6=80=A7=E8=83=BD=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fragment/HomeSearchToolWrapperFragment.kt | 50 +++++++++---------- 1 file changed, 24 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt index c3f22e5621..e5c68a4f76 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt @@ -50,7 +50,7 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { private var mTabDefaultColor: Int = 0 private var mCurrentAppBarColor: Int = 0 - private var mCurrentHomeAppBarColor: Int = 0 + private var mCurrentSelectBannerColor: Int = 0 private var mIsDisplayingLightContent = false @@ -61,7 +61,7 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { private var mFragmentList = ArrayList() - private var mIsBannerShow = true + private var mIsBannerShow = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -303,37 +303,35 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { fun onScrollChanged(totalHeight: Int, offset: Int) { if (mIsBannerShow && offset >= totalHeight) { + val homeTab = mViewModel?.tabs?.value?.find { it.type == "home" } mIsBannerShow = false - changeAppBarColor(Color.WHITE) - } else if(!mIsBannerShow && offset < totalHeight) { - mIsBannerShow = true - changeAppBarColor(mCurrentHomeAppBarColor) - } - mTabSelectedColor = - if (offset < totalHeight) TAB_DEFAULT_COLOR_LIGHT else TAB_SELECTED_COLOR - mTabDefaultColor = - if (offset < totalHeight) TAB_DEFAULT_COLOR_LIGHT else TAB_DEFAULT_COLOR - if (offset < totalHeight) { - mBinding?.indicatorView?.updateIndicatorDrawable(R.drawable.ic_home_tab_indicator_white.toDrawable()) - } else { mBinding?.indicatorView?.updateIndicatorDrawable(R.drawable.ic_home_tab_indicator_colorful.toDrawable()) + homeTab?.primaryColor = Color.WHITE + homeTab?.useLightStyle = false + mIsDisplayingLightContent = false + changeAppBarColor(Color.WHITE) + DisplayUtils.setLightStatusBar(requireActivity(), !mIsDisplayingLightContent) + mTabSelectedColor = TAB_SELECTED_COLOR + mTabDefaultColor = TAB_DEFAULT_COLOR + updateTabTextStyle(mLastSelectedPosition, 0f) + } else if (!mIsBannerShow && offset < totalHeight) { + val homeTab = mViewModel?.tabs?.value?.find { it.type == "home" } + mIsBannerShow = true + mBinding?.indicatorView?.updateIndicatorDrawable(R.drawable.ic_home_tab_indicator_white.toDrawable()) + homeTab?.primaryColor = mCurrentSelectBannerColor + homeTab?.useLightStyle = true + mIsDisplayingLightContent = true + changeAppBarColor(mCurrentSelectBannerColor) + DisplayUtils.setLightStatusBar(requireActivity(), !mIsDisplayingLightContent) + mTabSelectedColor = TAB_DEFAULT_COLOR_LIGHT + mTabDefaultColor = TAB_DEFAULT_COLOR_LIGHT + updateTabTextStyle(mLastSelectedPosition, 0f) } - val homeTab = mViewModel?.tabs?.value?.find { it.type == "home" } - homeTab?.primaryColor = if (offset < totalHeight) mCurrentHomeAppBarColor else Color.WHITE - homeTab?.useLightStyle = offset < totalHeight - mIsDisplayingLightContent = offset < totalHeight - DisplayUtils.setLightStatusBar(requireActivity(), !mIsDisplayingLightContent) - updateTabTextStyle(mLastSelectedPosition, 0f) } fun changeAppBarColor(color: Int) { if (color != Color.WHITE) { - mCurrentHomeAppBarColor = color - val homeTab = mViewModel?.tabs?.value?.find { it.type == "home" } - homeTab?.primaryColor = color - homeTab?.useLightStyle = true - mIsDisplayingLightContent = true - DisplayUtils.setLightStatusBar(requireActivity(), !mIsDisplayingLightContent) + mCurrentSelectBannerColor = color } updateAppBarStyle(color, color != Color.WHITE) } From 84a08493e35b683a1408e7552165e0066aac11f8 Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 23 Aug 2021 14:42:32 +0800 Subject: [PATCH 095/151] =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E8=BD=AE=E6=92=AD=E5=9B=BE=E5=88=87=E6=8D=A2=E6=97=B6=E7=9A=84?= =?UTF-8?q?=E8=83=8C=E6=99=AF=E6=98=BE=E7=A4=BA=E6=95=88=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/view/ScrollEventListener.kt | 369 ++++++++++++++++++ .../com/gh/gamecenter/home/HomeFragment.kt | 3 +- .../gh/gamecenter/home/HomeFragmentAdapter.kt | 2 +- .../home/slide/HomeSlideListViewHolder.kt | 88 +++-- 4 files changed, 423 insertions(+), 39 deletions(-) create mode 100644 app/src/main/java/com/gh/common/view/ScrollEventListener.kt diff --git a/app/src/main/java/com/gh/common/view/ScrollEventListener.kt b/app/src/main/java/com/gh/common/view/ScrollEventListener.kt new file mode 100644 index 0000000000..d1098bff63 --- /dev/null +++ b/app/src/main/java/com/gh/common/view/ScrollEventListener.kt @@ -0,0 +1,369 @@ +package com.gh.common.view + +import android.view.View +import android.view.ViewGroup +import android.view.ViewGroup.MarginLayoutParams +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import androidx.viewpager2.widget.ViewPager2 +import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback +import androidx.viewpager2.widget.ViewPager2.ScrollState + +/** + * 从 ViewPager2 源码摘抄的,更多细节可见 ScrollEventAdapter.java + */ +class ScrollEventListener(private val mRecyclerView: RecyclerView) : + RecyclerView.OnScrollListener() { + private annotation class AdapterState() + + private var mCallback: ViewPager2.OnPageChangeCallback? = null + private val mLayoutManager = (mRecyclerView.layoutManager as LinearLayoutManager) + + // state related fields + @AdapterState + private var mAdapterState: Int = 0 + + @ScrollState + var scrollState: Int = 0 + + private val mScrollValues: ScrollEventValues = ScrollEventValues() + private var mDragStartPosition: Int = 0 + private var mTarget: Int = 0 + private var mDispatchSelected: Boolean = false + private var mScrollHappened: Boolean = false + private var mDataSetChangeHappened: Boolean = false + + init { + resetState() + } + + /** + * @return `true` if a fake drag is ongoing. Returns `false` from the moment the + * [ViewPager2.endFakeDrag] is called. + */ + var isFakeDragging: Boolean = false + private set + + private fun resetState() { + mAdapterState = STATE_IDLE + scrollState = ViewPager2.SCROLL_STATE_IDLE + mScrollValues.reset() + mDragStartPosition = NO_POSITION + mTarget = NO_POSITION + mDispatchSelected = false + mScrollHappened = false + isFakeDragging = false + mDataSetChangeHappened = false + } + + fun setOnPageChangeCallback(callback: OnPageChangeCallback) { + mCallback = callback + } + + /** + * This method only deals with some cases of [AdapterState] transitions. The rest of + * the state transition implementation is in the [.onScrolled] method. + */ + override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { + // User started a drag (not dragging -> dragging) + if (((mAdapterState != STATE_IN_PROGRESS_MANUAL_DRAG + || scrollState != ViewPager2.SCROLL_STATE_DRAGGING) + && newState == RecyclerView.SCROLL_STATE_DRAGGING) + ) { + startDrag(false) + return + } + + // Drag is released, RecyclerView is snapping to page (dragging -> settling) + // Note that mAdapterState is not updated, to remember we were dragging when settling + if (isInAnyDraggingState && newState == RecyclerView.SCROLL_STATE_SETTLING) { + // Only go through the settling phase if the drag actually moved the page + if (mScrollHappened) { + dispatchStateChanged(ViewPager2.SCROLL_STATE_SETTLING) + // Determine target page and dispatch onPageSelected on next scroll event + mDispatchSelected = true + } + return + } + + // Drag is finished (dragging || settling -> idle) + if (isInAnyDraggingState && newState == RecyclerView.SCROLL_STATE_IDLE) { + var dispatchIdle: Boolean = false + updateScrollEventValues() + if (!mScrollHappened) { + // Pages didn't move during drag, so either we're at the start or end of the list, + // or there are no pages at all. + // In the first case, ViewPager's contract requires at least one scroll event. + // In the second case, don't send that scroll event + if (mScrollValues.mPosition != RecyclerView.NO_POSITION) { + dispatchScrolled(mScrollValues.mPosition, 0f, 0) + } + dispatchIdle = true + } else if (mScrollValues.mOffsetPx == 0) { + // Normally we dispatch the selected page and go to idle in onScrolled when + // mOffsetPx == 0, but in this case the drag was still ongoing when onScrolled was + // called, so that didn't happen. And since mOffsetPx == 0, there will be no further + // scroll events, so fire the onPageSelected event and go to idle now. + // Note that if we _did_ go to idle in that last onScrolled event, this code will + // not be executed because mAdapterState has been reset to STATE_IDLE. + dispatchIdle = true + if (mDragStartPosition != mScrollValues.mPosition) { + dispatchSelected(mScrollValues.mPosition) + } + } + if (dispatchIdle) { + // Normally idle is fired in last onScrolled call, but either onScrolled was never + // called, or we were still dragging when the last onScrolled was called + dispatchStateChanged(ViewPager2.SCROLL_STATE_IDLE) + resetState() + } + } + if ((mAdapterState == STATE_IN_PROGRESS_SMOOTH_SCROLL + ) && (newState == RecyclerView.SCROLL_STATE_IDLE) && mDataSetChangeHappened + ) { + updateScrollEventValues() + if (mScrollValues.mOffsetPx == 0) { + if (mTarget != mScrollValues.mPosition) { + dispatchSelected( + if (mScrollValues.mPosition == NO_POSITION) 0 else mScrollValues.mPosition + ) + } + dispatchStateChanged(ViewPager2.SCROLL_STATE_IDLE) + resetState() + } + } + } + + /** + * This method only deals with some cases of [AdapterState] transitions. The rest of + * the state transition implementation is in the [.onScrollStateChanged] method. + */ + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + mScrollHappened = true + updateScrollEventValues() + if (mDispatchSelected) { + // Drag started settling, need to calculate target page and dispatch onPageSelected now + mDispatchSelected = false + val scrollingForward: Boolean = dy > 0 + + // "&& values.mOffsetPx != 0": filters special case where we're scrolling forward and + // the first scroll event after settling already got us at the target + mTarget = + if (scrollingForward && mScrollValues.mOffsetPx != 0) mScrollValues.mPosition + 1 else mScrollValues.mPosition + if (mDragStartPosition != mTarget) { + dispatchSelected(mTarget) + } + } else if (mAdapterState == STATE_IDLE) { + // onScrolled while IDLE means RV has just been populated after an adapter has been set. + // Contract requires us to fire onPageSelected as well. + val position: Int = mScrollValues.mPosition + // Contract forbids us to send position = -1 though + dispatchSelected(if (position == NO_POSITION) 0 else position) + } + + // If position = -1, there are no items. Contract says to send position = 0 instead. + dispatchScrolled( + if (mScrollValues.mPosition == NO_POSITION) 0 else mScrollValues.mPosition, + mScrollValues.mOffset, mScrollValues.mOffsetPx + ) + + // Dispatch idle in onScrolled instead of in onScrollStateChanged because RecyclerView + // doesn't send IDLE event when using setCurrentItem(x, false) + if (((mScrollValues.mPosition == mTarget || mTarget == NO_POSITION) + && (mScrollValues.mOffsetPx == 0) && !(scrollState == ViewPager2.SCROLL_STATE_DRAGGING)) + ) { + // When the target page is reached and the user is not dragging anymore, we're settled, + // so go to idle. + // Special case and a bit of a hack when mTarget == NO_POSITION: RecyclerView is being + // initialized and fires a single scroll event. This flags mScrollHappened, so we need + // to reset our state. However, we don't want to dispatch idle. But that won't happen; + // because we were already idle. + dispatchStateChanged(ViewPager2.SCROLL_STATE_IDLE) + resetState() + } + } + + /** + * Calculates the current position and the offset (as a percentage and in pixels) of that + * position from the center. + */ + private fun updateScrollEventValues() { + val values: ScrollEventValues = mScrollValues + values.mPosition = mLayoutManager.findFirstVisibleItemPosition() + if (values.mPosition == RecyclerView.NO_POSITION) { + values.reset() + return + } + val firstVisibleView: View? = mLayoutManager.findViewByPosition(values.mPosition) + if (firstVisibleView == null) { + values.reset() + return + } + var leftDecorations: Int = mLayoutManager.getLeftDecorationWidth(firstVisibleView) + var rightDecorations: Int = mLayoutManager.getRightDecorationWidth(firstVisibleView) + var topDecorations: Int = mLayoutManager.getTopDecorationHeight(firstVisibleView) + var bottomDecorations: Int = mLayoutManager.getBottomDecorationHeight(firstVisibleView) + val params: ViewGroup.LayoutParams = firstVisibleView.layoutParams + if (params is MarginLayoutParams) { + val margin: MarginLayoutParams = params + leftDecorations += margin.leftMargin + rightDecorations += margin.rightMargin + topDecorations += margin.topMargin + bottomDecorations += margin.bottomMargin + } + val decoratedHeight: Int = firstVisibleView.height + topDecorations + bottomDecorations + val decoratedWidth: Int = firstVisibleView.width + leftDecorations + rightDecorations + val isHorizontal: Boolean = mLayoutManager.orientation == ViewPager2.ORIENTATION_HORIZONTAL + val start: Int + val sizePx: Int + if (isHorizontal) { + sizePx = decoratedWidth + start = firstVisibleView.left - leftDecorations - mRecyclerView.paddingLeft + } else { + sizePx = decoratedHeight + start = firstVisibleView.top - topDecorations - mRecyclerView.paddingTop + } + values.mOffsetPx = -start + values.mOffset = if (sizePx == 0) 0F else values.mOffsetPx.toFloat() / sizePx + } + + private fun startDrag(isFakeDrag: Boolean) { + isFakeDragging = isFakeDrag + mAdapterState = + if (isFakeDrag) STATE_IN_PROGRESS_FAKE_DRAG else STATE_IN_PROGRESS_MANUAL_DRAG + if (mTarget != NO_POSITION) { + // Target was set means we were settling to that target + // Update "drag start page" to reflect the page that ViewPager2 thinks it is at + mDragStartPosition = mTarget + // Reset target because drags have no target until released + mTarget = NO_POSITION + } else if (mDragStartPosition == NO_POSITION) { + // ViewPager2 was at rest, set "drag start page" to current page + mDragStartPosition = position + } + dispatchStateChanged(ViewPager2.SCROLL_STATE_DRAGGING) + } + + fun notifyDataSetChangeHappened() { + mDataSetChangeHappened = true + } + + /** + * Let the adapter know a programmatic scroll was initiated. + */ + fun notifyProgrammaticScroll(target: Int, smooth: Boolean) { + mAdapterState = + if (smooth) STATE_IN_PROGRESS_SMOOTH_SCROLL else STATE_IN_PROGRESS_IMMEDIATE_SCROLL + // mFakeDragging is true when a fake drag is interrupted by an a11y command + // set it to false so endFakeDrag won't fling the RecyclerView + isFakeDragging = false + val hasNewTarget: Boolean = mTarget != target + mTarget = target + dispatchStateChanged(ViewPager2.SCROLL_STATE_SETTLING) + if (hasNewTarget) { + dispatchSelected(target) + } + } + + /** + * Let the adapter know that a fake drag has started. + */ + fun notifyBeginFakeDrag() { + mAdapterState = STATE_IN_PROGRESS_FAKE_DRAG + startDrag(true) + } + + /** + * @return `true` if there is no known scroll in progress + */ + val isIdle: Boolean + get() = scrollState == ViewPager2.SCROLL_STATE_IDLE + + /** + * @return `true` if the ViewPager2 is being dragged. Returns `false` from the + * moment the ViewPager2 starts settling or goes idle. + */ + val isDragging: Boolean + get() = scrollState == ViewPager2.SCROLL_STATE_DRAGGING + + /** + * Checks if the adapter state (not the scroll state) is in the manual or fake dragging state. + * @return `true` if [.mAdapterState] is either [ ][.STATE_IN_PROGRESS_MANUAL_DRAG] or [.STATE_IN_PROGRESS_FAKE_DRAG] + */ + private val isInAnyDraggingState: Boolean + get() = (mAdapterState == STATE_IN_PROGRESS_MANUAL_DRAG + || mAdapterState == STATE_IN_PROGRESS_FAKE_DRAG) + + /** + * Calculates the scroll position of the currently visible item of the ViewPager relative to its + * width. Calculated by adding the fraction by which the first visible item is off screen to its + * adapter position. E.g., if the ViewPager is currently scrolling from the second to the third + * page, the returned value will be between 1 and 2. Thus, non-integral values mean that the + * the ViewPager is settling towards its [current item][ViewPager2.getCurrentItem], or + * the user may be dragging it. + * + * @return The current scroll position of the ViewPager, relative to its width + */ + val relativeScrollPosition: Double + get() { + updateScrollEventValues() + return mScrollValues.mPosition + mScrollValues.mOffset.toDouble() + } + + private fun dispatchStateChanged(@ScrollState state: Int) { + // Callback contract for immediate-scroll requires not having state change notifications, + // but only when there was no smooth scroll in progress. + // By putting a suppress statement in here (rather than next to dispatch calls) we are + // simplifying the code of the class and enforcing the contract in one place. + if ((mAdapterState == STATE_IN_PROGRESS_IMMEDIATE_SCROLL + && scrollState == ViewPager2.SCROLL_STATE_IDLE) + ) { + return + } + if (scrollState == state) { + return + } + scrollState = state + if (mCallback != null) { + mCallback!!.onPageScrollStateChanged(state) + } + } + + private fun dispatchSelected(target: Int) { + if (mCallback != null) { + mCallback!!.onPageSelected(target) + } + } + + private fun dispatchScrolled(position: Int, offset: Float, offsetPx: Int) { + if (mCallback != null) { + mCallback!!.onPageScrolled(position, offset, offsetPx) + } + } + + private val position: Int + get() { + return mLayoutManager.findFirstVisibleItemPosition() + } + + private class ScrollEventValues { + var mPosition: Int = 0 + var mOffset: Float = 0f + var mOffsetPx: Int = 0 + fun reset() { + mPosition = RecyclerView.NO_POSITION + mOffset = 0f + mOffsetPx = 0 + } + } + + companion object { + private const val STATE_IDLE: Int = 0 + private const val STATE_IN_PROGRESS_MANUAL_DRAG: Int = 1 + private const val STATE_IN_PROGRESS_SMOOTH_SCROLL: Int = 2 + private const val STATE_IN_PROGRESS_IMMEDIATE_SCROLL: Int = 3 + private const val STATE_IN_PROGRESS_FAKE_DRAG: Int = 4 + private const val NO_POSITION: Int = -1 + } + +} diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt b/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt index a7cdc6c322..87aef93ac2 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeFragment.kt @@ -1,6 +1,5 @@ package com.gh.gamecenter.home -import android.graphics.Color import android.os.Bundle import android.view.View import androidx.core.content.ContextCompat @@ -104,7 +103,7 @@ class HomeFragment : BaseFragment() { mLayoutManager = mAutomaticLayoutManager mListAdapter = HomeFragmentAdapter(requireContext(), mViewModel, mLayoutManager) { if (parentFragment is HomeSearchToolWrapperFragment) { - (parentFragment as HomeSearchToolWrapperFragment).changeAppBarColor(it.hexStringToIntColor()) + (parentFragment as HomeSearchToolWrapperFragment).changeAppBarColor(it) } } mExposureListener = ExposureListener(this, mListAdapter) diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt b/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt index ff42ddbc2e..70b6b183e7 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt @@ -38,7 +38,7 @@ class HomeFragmentAdapter( context: Context, val viewModel: HomeViewModel, val layoutManager: LinearLayoutManager, - val callback: (colorStr: String) -> Unit + val callback: (colorStr: Int) -> Unit ) : DiffUtilAdapter(context), IExposable { private var mLoadStatus: LoadStatus? = null diff --git a/app/src/main/java/com/gh/gamecenter/home/slide/HomeSlideListViewHolder.kt b/app/src/main/java/com/gh/gamecenter/home/slide/HomeSlideListViewHolder.kt index f17ba5ef52..0ee49dc962 100644 --- a/app/src/main/java/com/gh/gamecenter/home/slide/HomeSlideListViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/home/slide/HomeSlideListViewHolder.kt @@ -4,9 +4,11 @@ import android.annotation.SuppressLint import android.graphics.Color import android.graphics.drawable.GradientDrawable import android.view.MotionEvent +import androidx.core.graphics.ColorUtils import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.PagerSnapHelper import androidx.recyclerview.widget.RecyclerView +import androidx.viewpager2.widget.ViewPager2 import com.gh.base.BaseRecyclerViewHolder import com.gh.common.exposure.ExposureSource import com.gh.common.util.MtaHelper @@ -14,16 +16,15 @@ import com.gh.common.util.hexStringToIntColor import com.gh.common.util.throwExceptionInDebug import com.gh.common.view.DrawableView import com.gh.common.view.FixLinearLayoutManager +import com.gh.common.view.ScrollEventListener import com.gh.common.view.TouchSlopRecyclerView import com.gh.gamecenter.databinding.HomeSlideListBinding -import com.gh.gamecenter.entity.HomeSlide import com.gh.gamecenter.home.HomeItemData -import com.lightgame.utils.Utils import kotlin.math.abs class HomeSlideListViewHolder( val binding: HomeSlideListBinding, - val callback: (colorStr: String) -> Unit + val callback: (colorStr: Int) -> Unit ) : BaseRecyclerViewHolder(binding.root) { @@ -98,48 +99,63 @@ class HomeSlideListViewHolder( return false } }) - setPlaceholderColor(slideList, 0) + updateImmersiveColor(slideList[0].placeholderColor.hexStringToIntColor()) - binding.recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() { - var lastStatePosition = -1 - var lastScrollState = RecyclerView.SCROLL_STATE_IDLE + binding.recyclerView.addOnScrollListener(ScrollEventListener(binding.recyclerView).apply { + setOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { + var lastStatePosition = -1 + var lastScrollState = RecyclerView.SCROLL_STATE_IDLE - override fun onScrollStateChanged(recyclerView: RecyclerView, scrollState: Int) { - // MTA 统计 - if (scrollState == RecyclerView.SCROLL_STATE_IDLE) { - val view = snapHelper.findSnapView(layoutManager) - var curPosition = 0 - if (view != null) { - curPosition = adapter.getActualPosition(layoutManager.getPosition(view)) + override fun onPageScrollStateChanged(state: Int) { + super.onPageScrollStateChanged(state) + + if (scrollState == RecyclerView.SCROLL_STATE_IDLE) { + val view = snapHelper.findSnapView(layoutManager) + var curPosition = 0 + if (view != null) { + curPosition = adapter.getActualPosition(layoutManager.getPosition(view)) + } + if (lastScrollState == RecyclerView.SCROLL_STATE_DRAGGING && curPosition != lastStatePosition) { + MtaHelper.onEvent( + "首页_新", + "轮播_滑动", + if (curPosition > lastStatePosition) "左滑" else "右滑" + ) + } + lastStatePosition = curPosition + lastScrollState = scrollState + updateImmersiveColor(slideList[curPosition].placeholderColor.hexStringToIntColor()) + } else if (scrollState == RecyclerView.SCROLL_STATE_DRAGGING) { + lastScrollState = scrollState } - if (lastScrollState == RecyclerView.SCROLL_STATE_DRAGGING && curPosition != lastStatePosition) { - MtaHelper.onEvent( - "首页_新", - "轮播_滑动", - if (curPosition > lastStatePosition) "左滑" else "右滑" - ) - } - lastStatePosition = curPosition - lastScrollState = scrollState - setPlaceholderColor(slideList, curPosition) - } else if (scrollState == RecyclerView.SCROLL_STATE_DRAGGING) { - lastScrollState = scrollState } - } - override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { - updateZoomAnimation() - } + override fun onPageScrolled( + position: Int, + positionOffset: Float, + positionOffsetPixels: Int + ) { + val currentPosition = adapter.getActualPosition(position) + val nextPosition = adapter.getActualPosition(position + 1) + + val currentColor = + slideList[currentPosition].placeholderColor.hexStringToIntColor() + val nextColor = slideList[nextPosition].placeholderColor.hexStringToIntColor() + + val colorInBetween = + ColorUtils.blendARGB(currentColor, nextColor, positionOffset) + + updateZoomAnimation() + updateImmersiveColor(colorInBetween) + } + }) }) } - private fun setPlaceholderColor( - slideList: List, - position: Int - ) { - callback.invoke(slideList[position].placeholderColor) + private fun updateImmersiveColor(color: Int) { + callback.invoke(color) val gradientDrawable = DrawableView.getGradientDrawable( - slideList[position].placeholderColor.hexStringToIntColor(), + color, Color.WHITE, GradientDrawable.Orientation.TOP_BOTTOM, 0f ) binding.placeholderView.background = gradientDrawable From ce2c6bed0adc742416152c2ae696e2c739e91724 Mon Sep 17 00:00:00 2001 From: leafwai Date: Mon, 23 Aug 2021 15:37:35 +0800 Subject: [PATCH 096/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E5=B0=8F=E7=B1=B3=E7=AD=89=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E7=AC=AC=E4=B8=89=E6=96=B9=E5=AE=89=E8=A3=85=E5=BC=95?= =?UTF-8?q?=E5=AF=BC=E5=8A=9F=E8=83=BD-=E5=AE=A2=E6=88=B7=E7=AB=AF=20https?= =?UTF-8?q?://git.ghzs.com/pm/halo-app-issues/-/issues/1410?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/constant/Config.java | 32 ++++++++++ .../com/gh/common/constant/Constants.java | 6 ++ .../gamecenter/entity/GameGuidePopupEntity.kt | 28 +++++++++ .../gamedetail/GameDetailFragment.kt | 55 ++++++++++++++++-- .../retrofit/service/ApiService.java | 11 ++++ .../drawable-xxxhdpi/ic_install_arrow.webp | Bin 0 -> 166 bytes .../drawable-xxxhdpi/ic_install_close.webp | Bin 0 -> 224 bytes .../res/drawable-xxxhdpi/ic_install_hint.webp | Bin 0 -> 2862 bytes app/src/main/res/drawable/bg_install_hint.xml | 13 +++++ .../main/res/layout/detail_download_item.xml | 55 ++++++++++++++++++ app/src/main/res/values/colors.xml | 2 + 11 files changed, 198 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/entity/GameGuidePopupEntity.kt create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_install_arrow.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_install_close.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/ic_install_hint.webp create mode 100644 app/src/main/res/drawable/bg_install_hint.xml diff --git a/app/src/main/java/com/gh/common/constant/Config.java b/app/src/main/java/com/gh/common/constant/Config.java index 39b990b3f5..911525d2f9 100644 --- a/app/src/main/java/com/gh/common/constant/Config.java +++ b/app/src/main/java/com/gh/common/constant/Config.java @@ -1,5 +1,6 @@ package com.gh.common.constant; +import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; import android.os.Build; @@ -12,6 +13,7 @@ import com.gh.common.util.PackageUtils; import com.gh.common.util.SPUtils; import com.gh.gamecenter.BuildConfig; import com.gh.gamecenter.SuggestionActivity; +import com.gh.gamecenter.entity.GameGuidePopupEntity; import com.gh.gamecenter.entity.NewSettingsEntity; import com.gh.gamecenter.entity.NewsEntity; import com.gh.gamecenter.entity.SettingsEntity; @@ -27,6 +29,7 @@ import org.greenrobot.eventbus.EventBus; import java.util.List; import androidx.annotation.Nullable; + import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.schedulers.Schedulers; @@ -68,6 +71,7 @@ public class Config { private static SettingsEntity mSettingsEntity; private static NewSettingsEntity mNewSettingsEntity; + private static GameGuidePopupEntity mGameGuidePopupEntity; public static final String FIX_DOWNLOAD_KEY = "isFixDownload"; public static final String FIX_PLUGIN_KEY = "isFixPlugin"; @@ -225,6 +229,21 @@ public class Config { return mNewSettingsEntity; } + @Nullable + public static GameGuidePopupEntity getGameGuidePopupEntityEntity() { + if (mGameGuidePopupEntity == null) { + try { + String json = SPUtils.getString(Constants.SP_GAME_DETAIL_INSTALL_GUIDE_CONTENT); + if (!TextUtils.isEmpty(json)) { + mGameGuidePopupEntity = GsonUtils.fromJson(json, GameGuidePopupEntity.class); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + return mGameGuidePopupEntity; + } + private static boolean isExistDownloadFilter() { if (getSettings() == null || getSettings().getDownload() == null || getSettings().getDownload().size() == 0) { return false; @@ -277,6 +296,7 @@ public class Config { editor.apply(); } + @SuppressLint("CheckResult") public static void getGhzsSettings() { String channel = HaloApp.getInstance().getChannel(); RetrofitManager.getInstance(HaloApp.getInstance().getApplication()) @@ -312,5 +332,17 @@ public class Config { SPUtils.setString(Constants.SP_NEW_SETTINGS, GsonUtils.toJson(data)); } }); + + RetrofitManager.getInstance(HaloApp.getInstance().getApplication()) + .getApi().getGameGuidePopup(Build.MANUFACTURER, Build.VERSION.RELEASE, Build.MODEL, channel, Constants.API_VERSION) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BiResponse() { + @Override + public void onSuccess(GameGuidePopupEntity data) { + mGameGuidePopupEntity = data; + SPUtils.setString(Constants.SP_GAME_DETAIL_INSTALL_GUIDE_CONTENT, GsonUtils.toJson(data)); + } + }); } } 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 fe82cf3855..a4915e1450 100644 --- a/app/src/main/java/com/gh/common/constant/Constants.java +++ b/app/src/main/java/com/gh/common/constant/Constants.java @@ -6,6 +6,8 @@ import com.halo.assistant.HaloApp; public class Constants { + public static final String API_VERSION = "v5d2d0"; + public static final int SEND_NEWS_FEEDBACK = 0x126; public static final int SEND_COMMENT_FEEDBACK = 0x127; @@ -217,6 +219,10 @@ public class Constants { public static final String SP_COMMUNITY_HOME_VIDEO_GUIDE = "community_home_video_guide"; // 论坛详情申请版主引导 public static final String SP_FORUM_DETAIL_MODERATOR_GUIDE = "forum_detail_moderator_guide"; + // 游戏详情安装引导 + public static final String SP_GAME_DETAIL_INSTALL_GUIDE = "game_detail_install_guide"; + // 游戏详情安装引导内容 + public static final String SP_GAME_DETAIL_INSTALL_GUIDE_CONTENT = "game_detail_install_guide_content"; //手机号码匹配规则 public static final String REGEX_MOBILE = "^((13[0-9])|(15[^4,\\D])|(18[0,5-9]))\\d{8}$"; diff --git a/app/src/main/java/com/gh/gamecenter/entity/GameGuidePopupEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/GameGuidePopupEntity.kt new file mode 100644 index 0000000000..e3e64c94ea --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/entity/GameGuidePopupEntity.kt @@ -0,0 +1,28 @@ +package com.gh.gamecenter.entity + +import com.google.gson.annotations.SerializedName + +data class GameGuidePopupEntity( + @SerializedName("_id") + var id: String = "", + var content: String = "", + var jump: Jump +) { + data class Jump( + var type: String = "", + var title: String = "", + var link: String = "", + @SerializedName("link_text") + var linkText: String = "", + var text: String = "", + @SerializedName("link_community") + var linkCommunity: CommunityEntity? = null, + var display: Display? = Display(), + ) { + data class Display( + var slide: Boolean = false, + var recommend: Boolean = false, + var refresh: Boolean = false + ) + } +} diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index db3d49a4b9..94263e6aec 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -25,6 +25,7 @@ import com.ethanhua.skeleton.Skeleton import com.ethanhua.skeleton.ViewSkeletonScreen import com.gh.base.adapter.FragmentAdapter import com.gh.base.fragment.BaseFragment_TabLayout +import com.gh.common.constant.Config import com.gh.common.constant.Constants import com.gh.common.databind.BindingAdapters import com.gh.common.dialog.ReserveDialogFragment @@ -41,10 +42,7 @@ import com.gh.common.xapk.XapkInstaller import com.gh.common.xapk.XapkUnzipStatus import com.gh.download.DownloadManager import com.gh.download.server.BrowserInstallHelper -import com.gh.gamecenter.DownloadManagerActivity -import com.gh.gamecenter.R -import com.gh.gamecenter.SearchActivity -import com.gh.gamecenter.ShellActivity +import com.gh.gamecenter.* import com.gh.gamecenter.adapter.viewholder.DetailViewHolder import com.gh.gamecenter.entity.* import com.gh.gamecenter.eventbus.* @@ -195,6 +193,15 @@ class GameDetailFragment : NormalFragment() { @BindView(R.id.browser_install_hint_tv) lateinit var mBrowserInstallHintTv: TextView + @BindView(R.id.install_hint_container) + lateinit var mInstallContainer: View + + @BindView(R.id.install_hint_close_iv) + lateinit var mInstallCloseIv: View + + @BindView(R.id.install_hint_tv) + lateinit var mInstallHintTv: TextView + @BindView(R.id.recommendView) lateinit var mRecommendView: View @@ -272,6 +279,7 @@ class GameDetailFragment : NormalFragment() { mRecommendPopupEntity?.popupDetail?.link?.text, downloadEntity.gameId, downloadEntity.name) } } else if (downloadEntity.status == DownloadStatus.done) { + showInstallHint() if (downloadEntity.gameId == mViewModel.game?.id) { hideRecommendView() } @@ -281,6 +289,8 @@ class GameDetailFragment : NormalFragment() { ?: "", mRecommendPopupEntity?.popupDetail?.link?.type, mRecommendPopupEntity?.popupDetail?.link?.text, downloadEntity.gameId, downloadEntity.name) } + } else if (downloadEntity.status == DownloadStatus.downloading) { + showInstallHint() } } } @@ -492,6 +502,18 @@ class GameDetailFragment : NormalFragment() { if (gameResource.status == Status.SUCCESS) { mViewModel.logHistory(gameResource.data!!) mGameEntity = gameResource.data + val isInstalled = PackageUtils.isInstalledFromAllPackage( + requireContext(), + mGameEntity?.simulator?.apk?.packageName + ) + val status = GameUtils.getDownloadBtnText( + requireContext(), + mGameEntity, + PluginLocation.only_game + ) + if (status == getString(R.string.install) && !isInstalled) { + showInstallHint() + } // 添加启动弹窗的相关信息 if (mEntrance.contains(EntranceUtils.ENTRANCE_WELCOME) && mEntrance.countOccurrences("+") <= 1) { @@ -1226,6 +1248,31 @@ class GameDetailFragment : NormalFragment() { } } + private fun showInstallHint() { + val gameGuidePopupEntity = Config.getGameGuidePopupEntityEntity() + if (SPUtils.getBoolean(Constants.SP_GAME_DETAIL_INSTALL_GUIDE, true) && gameGuidePopupEntity != null) { + showReserveGuide(false) + SPUtils.setBoolean(Constants.SP_GAME_DETAIL_RESERVE_GUIDE, false) + mInstallHintTv.text = gameGuidePopupEntity.content + mInstallContainer.visibility = View.VISIBLE + mInstallContainer.setDebouncedClickListener { + requireContext().startActivity( + WebActivity.getIntent( + requireContext(), + gameGuidePopupEntity.jump.link, + gameGuidePopupEntity.jump.title, + false, + 1 + ) + ) + } + mInstallCloseIv.setDebouncedClickListener { + mInstallContainer.visibility = View.GONE + SPUtils.setBoolean(Constants.SP_GAME_DETAIL_INSTALL_GUIDE, false) + } + } + } + private fun initRecommendUI() { val recommendPopupList = mViewModel.recommendPopupLiveData.value mRecommendPopupEntity = RecommendPopupHelper.getRecommendPopup(mViewModel.game, recommendPopupList) 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 2084ee2f37..1e2ff3f26c 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 @@ -34,6 +34,7 @@ import com.gh.gamecenter.entity.GameColumnCollection; import com.gh.gamecenter.entity.GameDetailEntity; import com.gh.gamecenter.entity.GameDigestEntity; import com.gh.gamecenter.entity.GameEntity; +import com.gh.gamecenter.entity.GameGuidePopupEntity; import com.gh.gamecenter.entity.ServerPublishEntity; import com.gh.gamecenter.entity.GameVideoInfo; import com.gh.gamecenter.entity.HelpCategoryEntity; @@ -3272,4 +3273,14 @@ public interface ApiService { @POST("bbses/activities/explore/tasks/explore:finish") Single postExplorerFinish(); + /** + * 获取引导浮窗 + */ + @GET("api_go/games_guide_popup") + Single getGameGuidePopup( + @Query("manufacture") String manufacture, + @Query("android_version") String systemVersion, + @Query("model") String model, + @Query("channel") String channel, + @Query("api_version") String apiVersion); } \ No newline at end of file diff --git a/app/src/main/res/drawable-xxxhdpi/ic_install_arrow.webp b/app/src/main/res/drawable-xxxhdpi/ic_install_arrow.webp new file mode 100644 index 0000000000000000000000000000000000000000..34e1bf6cea01c8265abcff7a8e8e7ced795508d0 GIT binary patch literal 166 zcmV;X09pT1Nk&GV00012MM6+kP&iDH0000lAHW9?H$V^wlED5r8?CSgnSjNjt$z>& z{19Z@Z2nO5xXcx@kp%6hu>`Af{vbyX0JWs!;(afe`(P8i8AH)m(3H~D@0EI0000lAHW9?M_`a`q#nTesCKCXy)@Z{3 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/ic_install_hint.webp b/app/src/main/res/drawable-xxxhdpi/ic_install_hint.webp new file mode 100644 index 0000000000000000000000000000000000000000..a76536b295c277e050f9b6c917c292fe2ae2fc4e GIT binary patch literal 2862 zcmWNRdpwg11IM2|HfCFFvoT7ZG1`O>x*r>}9+xz03gu*T7v-pjH%86ze z)j@6@af}e%6JC)nZ&z>Vu0t+we|^9Iem}p@=g0HqaO|)Eu*=7byOX;Y(W;Tf64c_h_Z8ZK>dDB>s_D_+;u z8U_A+Zob^B-HU)xdnkAagPe@`wmcEiJ;|n@W%fO|iaD}q5F2Z7CosD-0}T{0*>0B; z2qq8Dw)F6`!Te8WW8!o;LhvO9RJ-SsF5&sieo?kyd?!G`j5Z5|i*<*c+1$5ncy^E8BIMpy|r}7?C2|(v^#dIi9H`9x!~vGP9cUx=!-u7;ldW5x3W&n?y=^p zNyYEe9zF|Kms9VS>neJC~QdCg5l{yMzDz7-@LEl?Z)S;_x1Oi#(4+mW3eeTUm5Mp>kkP5 zVO9aXNJz9~LeQD~vc0Xhq5sB(3$e|U3k557w(sF*lq5v0eq`6A+z9U*c%xYrA8M|+ z(4Vyu<6rL`w9S|QWScL~^?u7hN#!8PX>MTZS=En>`Q(3=wru?NVPvn&bA~zl^64ey z;DXckSz7DY$Lr=So$ZG1H~N~a4yPcQhkWr`fixG%_~|5s*a#m^)O112p>w-#x27EW z<>oI7Z$GW>m{2@AZ@GOiN!br^>vQU8_9|HI4`6IewJf5~13I%Dh!f=bE$b?>mKiDD zDM%N7Z+e-E&P^+;jZ%oI-m)Nj90=MY7-&6M4tGL;8VxT8lrVuI0!ZPbMIkwMUyc}m z^QpUgecjSKx2q>!eSP=jVdf(V2BRm;@?f*Iuz(3Qo?@5DNW*YbN?5C=xh-v?L$JFf z1KNB%g_tTf4>7-ku90AZ-LX4$5FJJKa|g+kD7Kem(%t@t<<@%z*HV`{GR~AFxJ4nE zdbCOjlhFhbTzGUmJqSxA*r3dX?6_>gre6MkEzd4mwWdCwX7>VRfUZmA2O%&Vn)go% z=#+e1XkHys-(0j1Y4_Lbk)wG6WG0KlWV25B8A8QAVsxRl283gRAn*jc8{JoSbChqx zwFq{J7Q2wyayPwTm?n~F^JB_nwnS!*HZ)AHpTMblXhF}yL6C@u;2XJAhNb-r|MzMw{2a{W_Q=M{C$cIKoB&Y>l(f>P*32 z9)V-7Ks)P4CT%?(S~GF+QA0K;pr{k>=B$@v*6vW&fTThPY_|j1o=B7i=#Ko-emwoy zAJ)77%?7OkC6Qx?BCEk|!H#|^~#7KOxnM3N7bGGzu%qkRhnKk4LoCkr)@q3PY_aqP9 zG`kyl_|;z$cPSz%+Qn%Q!wlOIVp9}35mnznw{#y3$u)`dW-ceQ0CC5!a~>_}2cHg1 zA8R4iAQK8*UnuZcq8MU(jIWiqXYZMP)poGf^5}*8_ftNC%LahckW2F48LL{-e`nqL zzMlbT__xbgRa77t3;Azoy%w9hko{zSHuPAFUh;&&OG%5zvBMDnT@G@>S3J2NY!wb< zk0a>jSlo+d4q8a_mo{dm^b{PN*>7;XN!|F6ZZvL(J8Ra~S--Vh-V@l(SJ?MZ`r}Wa z{9sO~v!LXUXkBd;)7Ek8_@~SE)?NUt^DotCtW+h z%Ysfxi(UT|_GwMaEF_8X>Bm+6o|Jvu4c~uVO8vt`3ZBgpqrGTaY?$dk=kiFGK_&<p` zr5TvamSz4*F7bHkECMRiK+F>rCz^%@`<{3MSpoieZgX~oXLS zS5npmVS|xGzFuBX^1IxXCCAgRO*fpL*^dMgV?g~r2+dc6Hs&WVXv%I)Bftz0$Zu)c z=-}T*lH`$RjCQ5>JwDsVC@p>c{=PAiRZfcFQFc%()Ly<~mC7B=*O%5|E+!Dl(V((? zI-y)1!me-wFpgzX0t)5oSFK@DI>Um;ivXUEXNn-1BBbwnC+jBI<*s2VuCi@doET+@ z)MAh)2Z5Sj4+g~3SaFX15^L@zO@$vasoNT(7o#x6kl!M6PNd}@ULPk zN0hgrk}9&Wy+X(Ym9Te+NH=g*=x_^7WOD7xDX?GU!!zz}a3fyAMEYF`#@gdWT67&f z8g)bJ{PXen`53j-!kt%Swr}W$+CZKl=9fp%@vJKq6<`^O5n)Po7BnFuh!jEv6CFdk zd!uRHn(&pXVKsFV+^C`Ea3ndhU|p1qbc(CwYo*efZMIA*gku3=sb?mkD?YV*fBZf& z`o$^s!&|pWl?uaWihFfsR_Dto5e%6*s*CS~aF&JPM4fSLaD=e@$HBR@j+k2NwO6us zOK%cY8Yfm^vVxLM!qs(r9>JEM$!06_@q#?qo5a}Um^^o`9XBL11j@Xv~dabYl~(;ZB^t9G>?Q0Gz0xIxzQ-f`#rMr0ct^fhyxlrEqqEDkQ%6>LtHfFFObKqV8iedm zVMJOfY(@YM71xKx7!bQ>CLWB(TP@7p*8lfULfhhG)l}f-Zx2dBzKmj)Mc<@eH6at- zV4I3As0+{aWw60MSBvFXq;FE}jdkN8a}N%DD9!f#%qaCS+p@Il%%26bg2Wb@M1U;E zi#Tk47S*1C8z_pr1=96bSdLGI%+DV9ejwX((O0qN`XSuN`$l!rI6`P1of8yBBnKIi zI2HAU=1twA&P@3a)AY|{O-=Mn&sCDDfO|e?bNXBzHh{pviB4hz3QFs! z``Ykq`f}Rj{NMli7|Z!MI<>~a>Sw~WaMhh#Zrv1Gv~VRgC%?<)%Hrp)&aI2-Gj{W{ zgtpX|?{jaK9*<}}7i+RQM-?(uAon~p`bl@V*3-vw-iOeZ{v(@{t2B1X-D|w`?||80 HrxoV^3E{FL literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/bg_install_hint.xml b/app/src/main/res/drawable/bg_install_hint.xml new file mode 100644 index 0000000000..6284917b29 --- /dev/null +++ b/app/src/main/res/drawable/bg_install_hint.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/detail_download_item.xml b/app/src/main/res/layout/detail_download_item.xml index 1d8c7af8df..a6c0a7641d 100644 --- a/app/src/main/res/layout/detail_download_item.xml +++ b/app/src/main/res/layout/detail_download_item.xml @@ -74,6 +74,61 @@ android:layout_marginRight="8dp" /> + + + + + + + + + + + + + + #74FFFF #60D5FF #EDF5FC + #EBFAF7 #b2b2b2 #9a9a9a #3a3a3a @@ -268,6 +269,7 @@ #17C2A1 #0089D1 #00DBA4 + #07B896 #99666666 #6621282E From e737d16f0ff2ecc5f7ff1ae1ad055ad3d0a10d6f Mon Sep 17 00:00:00 2001 From: leafwai Date: Mon, 23 Aug 2021 16:16:22 +0800 Subject: [PATCH 097/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E5=B0=8F=E7=B1=B3=E7=AD=89=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E7=AC=AC=E4=B8=89=E6=96=B9=E5=AE=89=E8=A3=85=E5=BC=95?= =?UTF-8?q?=E5=AF=BC=E5=8A=9F=E8=83=BD-=E6=95=B0=E6=8D=AE=E5=9F=8B?= =?UTF-8?q?=E7=82=B9=20https://git.ghzs.com/pm/halo-app-issues/-/issues/14?= =?UTF-8?q?12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/NewLogUtils.kt | 50 ++++++++++++++++--- .../gamedetail/GameDetailFragment.kt | 7 +++ 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/NewLogUtils.kt b/app/src/main/java/com/gh/common/util/NewLogUtils.kt index ed034e2167..31c2152c26 100644 --- a/app/src/main/java/com/gh/common/util/NewLogUtils.kt +++ b/app/src/main/java/com/gh/common/util/NewLogUtils.kt @@ -41,15 +41,15 @@ object NewLogUtils { @SuppressLint("CheckResult") fun logForumContentBrowser(contentId: String, contentType: String) { val requestBody = hashMapOf( - Pair("content_id", contentId), - Pair("content_type", contentType) + Pair("content_id", contentId), + Pair("content_type", contentType) ).createRequestBody() RetrofitManager.getInstance(HaloApp.getInstance()) - .api - .postBrowses(requestBody) - .subscribeOn(Schedulers.io()) - .subscribe(EmptyResponse()) + .api + .postBrowses(requestBody) + .subscribeOn(Schedulers.io()) + .subscribe(EmptyResponse()) } // 游戏详情点击顶部标签 @@ -1113,4 +1113,42 @@ object NewLogUtils { } log(json, "bbs_community", false) } + + fun logGuidePopShow(guideId: String){ + val json = json { + "event" to "guide_pop_show" + "payload" to json { + "guide_pop_id" to guideId + } + "meta" to LogUtils.getMetaObject() + "timestamp" to System.currentTimeMillis() / 1000 + } + log(json,"event",false) + } + + fun logGuidePopClose(guideId: String){ + val json = json { + "event" to "guide_pop_close" + "payload" to json { + "guide_pop_id" to guideId + } + "meta" to LogUtils.getMetaObject() + "timestamp" to System.currentTimeMillis() / 1000 + } + log(json,"event",false) + } + + fun logGuidePopLinkClick(guideId: String, linkType: String, linkTitle: String){ + val json = json { + "event" to "guide_pop_link_click" + "payload" to json { + "guide_pop_id" to guideId + "link_type" to linkType + "link_title" to linkTitle + } + "meta" to LogUtils.getMetaObject() + "timestamp" to System.currentTimeMillis() / 1000 + } + log(json,"event",false) + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index a28a3d75db..acabd46297 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -1476,6 +1476,7 @@ class GameDetailFragment : NormalFragment() { SPUtils.setBoolean(Constants.SP_GAME_DETAIL_RESERVE_GUIDE, false) mInstallHintTv.text = gameGuidePopupEntity.content mInstallContainer.visibility = View.VISIBLE + NewLogUtils.logGuidePopShow(gameGuidePopupEntity.id) mInstallContainer.setDebouncedClickListener { requireContext().startActivity( WebActivity.getIntent( @@ -1486,10 +1487,16 @@ class GameDetailFragment : NormalFragment() { 1 ) ) + NewLogUtils.logGuidePopLinkClick( + gameGuidePopupEntity.id, + gameGuidePopupEntity.jump.type, + gameGuidePopupEntity.jump.title + ) } mInstallCloseIv.setDebouncedClickListener { mInstallContainer.visibility = View.GONE SPUtils.setBoolean(Constants.SP_GAME_DETAIL_INSTALL_GUIDE, false) + NewLogUtils.logGuidePopClose(gameGuidePopupEntity.id) } } } From 3e7e98d555487df638ba9de2431aff00bfcd32b8 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Mon, 23 Aug 2021 17:21:44 +0800 Subject: [PATCH 098/151] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=9C=A8=E6=96=B0?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=89=93=E5=BC=80=E5=85=A8=E5=B1=8Fwebview?= =?UTF-8?q?=E7=9A=84JS=E8=B0=83=E7=94=A8=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/DefaultJsApi.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/java/com/gh/common/DefaultJsApi.kt b/app/src/main/java/com/gh/common/DefaultJsApi.kt index 4d3c2fcef3..8084b85a9f 100644 --- a/app/src/main/java/com/gh/common/DefaultJsApi.kt +++ b/app/src/main/java/com/gh/common/DefaultJsApi.kt @@ -387,6 +387,11 @@ class DefaultJsApi(var context: Context) { mLoginHandler = null } + @JavascriptInterface + fun openInNewFullWebview(url: Any) { + runOnUiThread { DirectUtils.directToFullScreenWebPage(context, url.toString(), true) } + } + @Keep internal data class ImageEvent(var imageList: ArrayList = arrayListOf(), var position: Int = 0) From 1d66637b1101c65460523f764c43f26eefad55c3 Mon Sep 17 00:00:00 2001 From: leafwai Date: Tue, 24 Aug 2021 10:20:07 +0800 Subject: [PATCH 099/151] =?UTF-8?q?=E8=A1=A5=E5=85=85=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=9F=8B=E7=82=B9=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/util/NewLogUtils.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/com/gh/common/util/NewLogUtils.kt b/app/src/main/java/com/gh/common/util/NewLogUtils.kt index 31c2152c26..b863173ee4 100644 --- a/app/src/main/java/com/gh/common/util/NewLogUtils.kt +++ b/app/src/main/java/com/gh/common/util/NewLogUtils.kt @@ -1114,6 +1114,7 @@ object NewLogUtils { log(json, "bbs_community", false) } + //出现引导浮窗 fun logGuidePopShow(guideId: String){ val json = json { "event" to "guide_pop_show" @@ -1126,6 +1127,7 @@ object NewLogUtils { log(json,"event",false) } + //关闭引导浮窗 fun logGuidePopClose(guideId: String){ val json = json { "event" to "guide_pop_close" @@ -1138,6 +1140,7 @@ object NewLogUtils { log(json,"event",false) } + //点击引导浮窗链接 fun logGuidePopLinkClick(guideId: String, linkType: String, linkTitle: String){ val json = json { "event" to "guide_pop_link_click" From a48b4db55015e4607e5a4b7dc99c5f4baee0477d Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Tue, 24 Aug 2021 11:33:40 +0800 Subject: [PATCH 100/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E6=B8=B8=E6=88=8F=E7=A4=BC=E5=8C=85?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=88=E7=AC=AC=E4=BA=8C=E6=9C=9F=EF=BC=89?= =?UTF-8?q?(4)=20https://git.ghzs.com/pm/halo-app-issues/-/issues/1325?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/Extensions.kt | 30 +++++++++++++++++++ .../adapter/LibaoDetailAdapter.java | 17 +++++++---- .../gh/gamecenter/entity/LibaoDetailEntity.kt | 3 ++ 3 files changed, 44 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/Extensions.kt b/app/src/main/java/com/gh/common/util/Extensions.kt index c67a9c3d2a..db011d7e92 100644 --- a/app/src/main/java/com/gh/common/util/Extensions.kt +++ b/app/src/main/java/com/gh/common/util/Extensions.kt @@ -792,6 +792,36 @@ fun ExpandTextView.setTextWithInterceptingInternalUrl( setShrankTextAndExpandedText(shrankSsb, expandedSsb) } +fun TextView.setTextWithInterceptingInternalUrl(text: CharSequence) { + var ssb = text.interceptUrlSpanAndRoundImageSpan() + // 去掉旧版本 Android 系统 [Html.FROM_HTML_MODE_LEGACY] 产生的两个换行符 (丑陋的代码) + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + while (ssb.contains("\n\n")) { + val index = ssb.indexOf("\n\n", 0, true) + ssb = SpannableStringBuilder( + ssb.subSequence( + 0, + index + ) + ).append(ssb.subSequence(index + "\n".length, ssb.length)) + } + } + // 去掉多余的 P 标签换行 + if (ssb.endsWith("\n", true)) { + ssb = + SpannableStringBuilder((ssb.subSequence(0, ssb.length - "\n".length))) + } + + movementMethod = CustomLinkMovementMethod.getInstance() + + ssb = TextHelper.updateSpannableStringWithHighlightedSpan( + context, + ssb, + highlightedTextClickListener = null + ) + setText(ssb) +} + fun CharSequence.interceptUrlSpanAndRoundImageSpan(): SpannableStringBuilder { return SpannableStringBuilder.valueOf(this).apply { getSpans(0, length, URLSpan::class.java).forEach { 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 ce974a877e..710f295640 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java @@ -12,13 +12,17 @@ import android.view.View; import android.view.ViewGroup; 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.base.OnRequestCallBackListener; import com.gh.common.util.DisplayUtils; +import com.gh.common.util.ExtensionsKt; +import com.gh.common.util.ExtraTagHandler; import com.gh.common.util.LibaoUtils; +import com.gh.common.util.PicassoImageGetter; import com.gh.common.util.PlatformUtils; import com.gh.common.util.SpanBuilder; import com.gh.common.util.StringUtils; @@ -275,7 +279,7 @@ public class LibaoDetailAdapter extends BaseRecyclerAdapter { if (mLibaoEntity.getStatus() != null && mLibaoDetailEntity != null) { LibaoUtils.initLibaoBtn(mContext, holder.libaoCopyBtn, mLibaoEntity, mLibaoDetailEntity.getInstallRequired(), this, false, - StringUtils.buildString(mEntrance, "+(礼包详情[", mLibaoEntity.getName(), "])") ,null); + StringUtils.buildString(mEntrance, "+(礼包详情[", mLibaoEntity.getName(), "])"), null); } // 判断按钮状态是否为空(礼包详情进入),重新获取 @@ -327,11 +331,12 @@ public class LibaoDetailAdapter extends BaseRecyclerAdapter { holder.mLibaodetailTimeStart.setText(StringUtils.buildString("开始时间:", start)); holder.mLibaodetailTimeEnd.setText(StringUtils.buildString("截止时间:", end)); } - - } - if (mLibaoDetailEntity.getDes() != null && position == getItemCount() - 2) { - holder.mLibaodetailDesLl.setVisibility(View.VISIBLE); - holder.mLibaodetailDes.setText(Html.fromHtml(mLibaoDetailEntity.getDes())); + if (mLibaoDetailEntity.getNewDes() != null && position == getItemCount() - 2) { + holder.mLibaodetailDesLl.setVisibility(View.VISIBLE); + CharSequence spanned = HtmlCompat.fromHtml(mLibaoDetailEntity.getNewDes(), HtmlCompat.FROM_HTML_MODE_COMPACT, + new PicassoImageGetter(holder.mLibaodetailDes), new ExtraTagHandler()); + ExtensionsKt.setTextWithInterceptingInternalUrl(holder.mLibaodetailDes, spanned); + } } } diff --git a/app/src/main/java/com/gh/gamecenter/entity/LibaoDetailEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/LibaoDetailEntity.kt index 2721a6ba62..ee8c63f5fa 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/LibaoDetailEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/LibaoDetailEntity.kt @@ -12,6 +12,9 @@ class LibaoDetailEntity { var des: String? = null + @SerializedName("new_des") + var newDes: String? = null + @SerializedName("install_required") var installRequired: Boolean = false From 17455efe82cf78656003b323bd07f3c37f781462 Mon Sep 17 00:00:00 2001 From: juntao Date: Tue, 24 Aug 2021 11:45:35 +0800 Subject: [PATCH 101/151] =?UTF-8?q?=E5=BA=94=E7=94=A8=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=87=B3=205.2.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 2c8b67124d..467566f2d0 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,8 +7,8 @@ ext { targetSdkVersion = 26 // application info (每个大版本之间的 versionCode 增加 20) - versionCode = 370 - versionName = "5.1.0" + versionCode = 390 + versionName = "5.2.0" applicationId = "com.gh.gamecenter" // AndroidX From 0e27e8ee3b20a678f1a52df300f91e979d670aaa Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Tue, 24 Aug 2021 14:29:05 +0800 Subject: [PATCH 102/151] =?UTF-8?q?=E5=A4=84=E7=90=86=E7=A4=BC=E5=8C=85?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E4=BD=BF=E7=94=A8=E8=AF=B4=E6=98=8E=E4=B8=8D?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/gamecenter/adapter/LibaoDetailAdapter.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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 710f295640..29f119a9d0 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/LibaoDetailAdapter.java @@ -331,9 +331,13 @@ public class LibaoDetailAdapter extends BaseRecyclerAdapter { holder.mLibaodetailTimeStart.setText(StringUtils.buildString("开始时间:", start)); holder.mLibaodetailTimeEnd.setText(StringUtils.buildString("截止时间:", end)); } - if (mLibaoDetailEntity.getNewDes() != null && position == getItemCount() - 2) { + String des = mLibaoDetailEntity.getNewDes(); + if (des == null) { + des = mLibaoDetailEntity.getDes(); + } + if (des != null && position == getItemCount() - 2) { holder.mLibaodetailDesLl.setVisibility(View.VISIBLE); - CharSequence spanned = HtmlCompat.fromHtml(mLibaoDetailEntity.getNewDes(), HtmlCompat.FROM_HTML_MODE_COMPACT, + CharSequence spanned = HtmlCompat.fromHtml(des, HtmlCompat.FROM_HTML_MODE_COMPACT, new PicassoImageGetter(holder.mLibaodetailDes), new ExtraTagHandler()); ExtensionsKt.setTextWithInterceptingInternalUrl(holder.mLibaodetailDes, spanned); } From 15458df9825b7bc66c81a4ebb50877201b22c035 Mon Sep 17 00:00:00 2001 From: leafwai Date: Tue, 24 Aug 2021 17:41:22 +0800 Subject: [PATCH 103/151] =?UTF-8?q?=E6=B7=BB=E5=8A=A0UI=E9=80=9A=E7=94=A8?= =?UTF-8?q?=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/res/drawable/divider_1dp.xml | 5 ++++ app/src/main/res/drawable/divider_1px.xml | 5 ++++ app/src/main/res/drawable/gradient_blue.xml | 6 ++++ app/src/main/res/drawable/gradient_cyan.xml | 6 ++++ app/src/main/res/drawable/gradient_green.xml | 6 ++++ .../res/drawable/gradient_light_yellow.xml | 6 ++++ app/src/main/res/drawable/gradient_orange.xml | 6 ++++ .../res/drawable/gradient_purple_blue.xml | 8 +++++ app/src/main/res/drawable/gradient_yelow.xml | 6 ++++ app/src/main/res/values/colors.xml | 29 +++++++++++++++++-- app/src/main/res/values/dimens.xml | 19 ++++++++++++ 11 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/drawable/divider_1dp.xml create mode 100644 app/src/main/res/drawable/divider_1px.xml create mode 100644 app/src/main/res/drawable/gradient_blue.xml create mode 100644 app/src/main/res/drawable/gradient_cyan.xml create mode 100644 app/src/main/res/drawable/gradient_green.xml create mode 100644 app/src/main/res/drawable/gradient_light_yellow.xml create mode 100644 app/src/main/res/drawable/gradient_orange.xml create mode 100644 app/src/main/res/drawable/gradient_purple_blue.xml create mode 100644 app/src/main/res/drawable/gradient_yelow.xml diff --git a/app/src/main/res/drawable/divider_1dp.xml b/app/src/main/res/drawable/divider_1dp.xml new file mode 100644 index 0000000000..ad8fff68c7 --- /dev/null +++ b/app/src/main/res/drawable/divider_1dp.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/divider_1px.xml b/app/src/main/res/drawable/divider_1px.xml new file mode 100644 index 0000000000..9ab42cb136 --- /dev/null +++ b/app/src/main/res/drawable/divider_1px.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/gradient_blue.xml b/app/src/main/res/drawable/gradient_blue.xml new file mode 100644 index 0000000000..8982cff9ed --- /dev/null +++ b/app/src/main/res/drawable/gradient_blue.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/gradient_cyan.xml b/app/src/main/res/drawable/gradient_cyan.xml new file mode 100644 index 0000000000..e982451c3a --- /dev/null +++ b/app/src/main/res/drawable/gradient_cyan.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/gradient_green.xml b/app/src/main/res/drawable/gradient_green.xml new file mode 100644 index 0000000000..653f7c462e --- /dev/null +++ b/app/src/main/res/drawable/gradient_green.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/gradient_light_yellow.xml b/app/src/main/res/drawable/gradient_light_yellow.xml new file mode 100644 index 0000000000..dacfb61642 --- /dev/null +++ b/app/src/main/res/drawable/gradient_light_yellow.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/gradient_orange.xml b/app/src/main/res/drawable/gradient_orange.xml new file mode 100644 index 0000000000..cdf94277ee --- /dev/null +++ b/app/src/main/res/drawable/gradient_orange.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/gradient_purple_blue.xml b/app/src/main/res/drawable/gradient_purple_blue.xml new file mode 100644 index 0000000000..082fcfcd56 --- /dev/null +++ b/app/src/main/res/drawable/gradient_purple_blue.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/gradient_yelow.xml b/app/src/main/res/drawable/gradient_yelow.xml new file mode 100644 index 0000000000..fec83edafc --- /dev/null +++ b/app/src/main/res/drawable/gradient_yelow.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 11f37ef504..cf04965bba 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -4,10 +4,37 @@ #2496FF + + #FFA142 + + #FF4147 + + #06CEA8 + #1383EB #991383EB + + #333333 + #666666 + #999999 + #CCCCCC + + + #F5F5F5 + + #EEEEEE + + #1A000000 + + #66000000 + @color/white @@ -16,8 +43,6 @@ @color/text_9a9a9a #B3B3B3 - - #f5f5f5 @color/bg_ededed diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index d503f4740c..7e7f0c1ad2 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,5 +1,24 @@ + + 20sp + 18sp + 16sp + 14sp + 13sp + 12sp + 11sp + 10sp + 0dp From 65bd15b573f9df211205619f77ec433fc45d239f Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Tue, 24 Aug 2021 18:07:30 +0800 Subject: [PATCH 104/151] =?UTF-8?q?=E5=A4=84=E7=90=86=E9=A6=96=E9=A1=B5?= =?UTF-8?q?=E8=BD=AE=E6=92=AD=E5=9B=BETab=E5=88=87=E6=8D=A2=E9=A2=9C?= =?UTF-8?q?=E8=89=B2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fragment/HomeSearchToolWrapperFragment.kt | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt index e5c68a4f76..a47d14fcc0 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt @@ -62,6 +62,7 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { private var mFragmentList = ArrayList() private var mIsBannerShow = false + private var mHomeTab: SubjectRecommendEntity? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -99,6 +100,7 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { if (mDefaultSelectedTab == -1) { mDefaultSelectedTab = mViewModel?.defaultTabPosition ?: 0 } + mHomeTab = it?.find { tab -> tab.type == "home" } initViewPager(it) // 当 tab 为一个的时候隐藏顶部 tab 栏,停用 nestedScroll @@ -303,11 +305,10 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { fun onScrollChanged(totalHeight: Int, offset: Int) { if (mIsBannerShow && offset >= totalHeight) { - val homeTab = mViewModel?.tabs?.value?.find { it.type == "home" } mIsBannerShow = false mBinding?.indicatorView?.updateIndicatorDrawable(R.drawable.ic_home_tab_indicator_colorful.toDrawable()) - homeTab?.primaryColor = Color.WHITE - homeTab?.useLightStyle = false + mHomeTab?.primaryColor = Color.WHITE + mHomeTab?.useLightStyle = false mIsDisplayingLightContent = false changeAppBarColor(Color.WHITE) DisplayUtils.setLightStatusBar(requireActivity(), !mIsDisplayingLightContent) @@ -315,11 +316,10 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { mTabDefaultColor = TAB_DEFAULT_COLOR updateTabTextStyle(mLastSelectedPosition, 0f) } else if (!mIsBannerShow && offset < totalHeight) { - val homeTab = mViewModel?.tabs?.value?.find { it.type == "home" } mIsBannerShow = true mBinding?.indicatorView?.updateIndicatorDrawable(R.drawable.ic_home_tab_indicator_white.toDrawable()) - homeTab?.primaryColor = mCurrentSelectBannerColor - homeTab?.useLightStyle = true + mHomeTab?.primaryColor = mCurrentSelectBannerColor + mHomeTab?.useLightStyle = true mIsDisplayingLightContent = true changeAppBarColor(mCurrentSelectBannerColor) DisplayUtils.setLightStatusBar(requireActivity(), !mIsDisplayingLightContent) @@ -332,6 +332,7 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { fun changeAppBarColor(color: Int) { if (color != Color.WHITE) { mCurrentSelectBannerColor = color + mHomeTab?.primaryColor = mCurrentSelectBannerColor } updateAppBarStyle(color, color != Color.WHITE) } From 4826c35a701ed1f7a2b66c929da2e55aee88aef0 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Wed, 25 Aug 2021 11:52:59 +0800 Subject: [PATCH 105/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA3=E6=9C=9F-?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E5=B1=95=E7=A4=BA-=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E4=B8=BE=E6=8A=A5=E5=BC=B9=E7=AA=97(0825=20=E4=BA=A7=E5=93=81?= =?UTF-8?q?=E9=AA=8C=E6=94=B6=E9=97=AE=E9=A2=981)=20https://git.ghzs.com/p?= =?UTF-8?q?m/halo-app-issues/-/issues/1421?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/CommentHelper.kt | 20 +++++++++++++++---- .../java/com/gh/common/util/DialogUtils.java | 2 +- .../gamedetail/rating/RatingReplyAdapter.kt | 2 -- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/CommentHelper.kt b/app/src/main/java/com/gh/common/util/CommentHelper.kt index 07e2324be2..2cf66d0786 100644 --- a/app/src/main/java/com/gh/common/util/CommentHelper.kt +++ b/app/src/main/java/com/gh/common/util/CommentHelper.kt @@ -5,6 +5,8 @@ import android.view.LayoutInflater import android.view.View import android.widget.LinearLayout import android.widget.TextView +import com.gh.common.constant.Constants +import com.gh.common.json.json import com.gh.common.util.CommentUtils.copyText import com.gh.common.view.BugFixedPopupWindow import com.gh.gamecenter.CommentDetailActivity @@ -203,7 +205,12 @@ object CommentHelper { if (error == null) { Utils.toast(context, "投诉失败,请稍后重试") } else { - Utils.toast(context, "投诉失败,${error.message}") + if (error is HttpException) { + ErrorHelper.handleError( + HaloApp.getInstance().application, + error.response().errorBody()?.string() + ) + } } } } @@ -493,9 +500,14 @@ object CommentHelper { context: Context, reportCallback: (reportType: String) -> Unit ) { - val reportTypes = arrayListOf("垃圾广告营销", "恶意攻击谩骂", "淫秽色情信息", "违法有害信息", "其它") - DialogUtils.showVideoComplaintDialog(context, reportTypes, null) { text -> - reportCallback.invoke(text) + DialogUtils.showReportReasonDialog( + context, + Constants.REPORT_LIST.toList() as ArrayList + ) { reason, desc -> + val json = json { + "reason" to if (reason != "其他原因") reason else desc + } + reportCallback.invoke(json.toString()) } } 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 6c53440eed..e91661de2e 100644 --- a/app/src/main/java/com/gh/common/util/DialogUtils.java +++ b/app/src/main/java/com/gh/common/util/DialogUtils.java @@ -2017,7 +2017,7 @@ public class DialogUtils { } @SuppressLint("SetTextI18n") - public static void showReportReasonDialog(Context context, ArrayList items,ReportReasonCallBack callBack) { + public static void showReportReasonDialog(Context context, ArrayList items, ReportReasonCallBack callBack) { context = checkDialogContext(context); final Dialog dialog = new Dialog(context, R.style.DialogWindowTransparent); diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt index 8bb9a65983..7c532c18cd 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt @@ -361,7 +361,6 @@ class RatingReplyAdapter(context: Context, } "投诉" -> { mContext.ifLogin("游戏详情-评分-评论详情- 投诉评论") { - OptionDialogHelper.showOptionDialog(mContext, Constants.REPORT_LIST.toList(), callback = { reportType -> DialogUtils.showReportReasonDialog(mContext, Constants.REPORT_LIST.toList() as java.util.ArrayList ) { reason, desc -> @@ -370,7 +369,6 @@ class RatingReplyAdapter(context: Context, mEntityList[1].comment!!.id, replyEntity.id, if (reason != "其他原因") reason else desc) } - }) } } "回复" -> { From e02708bb0ee190c0db18249ebc16c28e2c81862c Mon Sep 17 00:00:00 2001 From: leafwai Date: Wed, 25 Aug 2021 14:52:41 +0800 Subject: [PATCH 106/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E6=B5=8F=E8=A7=88=E5=99=A8=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96(0825=E6=B5=8B?= =?UTF-8?q?=E8=AF=95)https://git.ghzs.com/pm/halo-app-issues/-/issues/1323?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index acabd46297..d5b9ea12de 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -1465,7 +1465,7 @@ class GameDetailFragment : NormalFragment() { } } else { mBrowserInstallContainer.visibility = View.GONE - mSwitchBtn.visibility = View.VISIBLE + mSwitchBtn.visibility = View.GONE } } From e9089395606f17747685890bc5ee1bda43a1514b Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Wed, 25 Aug 2021 14:55:55 +0800 Subject: [PATCH 107/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA3=E6=9C=9F-?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E5=B1=95=E7=A4=BA-=E5=A4=B4=E5=83=8F?= =?UTF-8?q?=E4=BF=A1=E6=81=AF(0825=20=E4=BA=A7=E5=93=81=E9=AA=8C=E6=94=B6?= =?UTF-8?q?=E9=97=AE=E9=A2=981,2,3)=20https://git.ghzs.com/pm/halo-app-iss?= =?UTF-8?q?ues/-/issues/1406?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gamecenter/gamedetail/rating/RatingReplyAdapter.kt | 4 ++-- .../com/gh/gamecenter/personal/NewPersonalFragment.kt | 2 +- .../com/gh/gamecenter/personal/PersonalFragment.kt | 2 +- .../qa/video/detail/desc/VideoDescTopViewHolder.kt | 10 ++++++++++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt index 7c532c18cd..b5209afb4c 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt @@ -302,9 +302,9 @@ class RatingReplyAdapter(context: Context, userName.text = replyEntity.user.name if (replyEntity.user.badge != null) { sdvUserBadge.visibility = View.VISIBLE - tvBadgeName.visibility = View.VISIBLE +// tvBadgeName.visibility = View.VISIBLE ImageUtils.display(sdvUserBadge, replyEntity.user.badge.icon) - tvBadgeName.text = replyEntity.user.badge.name +// tvBadgeName.text = replyEntity.user.badge.name } else { sdvUserBadge.visibility = View.GONE tvBadgeName.visibility = View.GONE diff --git a/app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.kt b/app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.kt index 1e43a6894b..3b46aa5b78 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personal/NewPersonalFragment.kt @@ -465,7 +465,7 @@ class NewPersonalFragment : BaseLazyFragment() { mStubBinding.personalUserIcon.display( if (mUserInfoEntity?.iconBorder == null) "" else mUserInfoEntity?.iconBorder?.url, mUserInfoEntity?.icon, - if (mUserInfoEntity?.auth == null) "" else mUserInfoEntity?.auth?.icon + null ) displayIcon(mStubBinding.personalUserSmallIcon, mUserInfoEntity?.icon) mStubBinding.personalUserName.visibility = View.VISIBLE diff --git a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.kt b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.kt index 999dfd69f3..6708a61769 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.kt @@ -525,7 +525,7 @@ class PersonalFragment : BaseLazyFragment() { mStubBinding.personalUserIcon.display( if (mUserInfoEntity?.iconBorder == null) "" else mUserInfoEntity?.iconBorder?.url, mUserInfoEntity?.icon, - if (mUserInfoEntity?.auth == null) "" else mUserInfoEntity?.auth?.icon + null ) displayIcon(mStubBinding.personalUserSmallIcon, mUserInfoEntity?.icon) mStubBinding.personalUserName.visibility = View.VISIBLE diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt index 171ec60fc7..ca7c168abb 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoDescTopViewHolder.kt @@ -107,6 +107,16 @@ class VideoDescTopViewHolder( "视频贴", entity.bbs?.id ?: "", bbsType, entity.id ) } + binding.badgeIv.setOnClickListener { + DialogUtils.showViewBadgeDialog(binding.root.context, entity.user.badge) { + DirectUtils.directToBadgeWall( + binding.root.context, + entity.user.id, + entity.user.name, + entity.user.badge?.icon + ) + } + } } private fun initAnimation(entity: ForumVideoEntity) { From 7ec7eb29e4f570c056ec27bc7a56fc037f48d117 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Wed, 25 Aug 2021 17:47:04 +0800 Subject: [PATCH 108/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA3=E6=9C=9F-?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E5=B1=95=E7=A4=BA-=E7=A4=BE=E5=8C=BA?= =?UTF-8?q?=E6=90=9C=E7=B4=A2=E9=A1=B5=20https://git.ghzs.com/pm/halo-app-?= =?UTF-8?q?issues/-/issues/1405?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/gamecenter/entity/SettingsEntity.kt | 266 ++++++++++-------- .../ForumOrUserSearchDefaultFragment.kt | 43 ++- .../ForumOrUserSearchDefaultViewModel.kt | 31 ++ .../retrofit/service/ApiService.java | 6 + .../search/SearchDefaultHotAdapter.kt | 17 +- 5 files changed, 226 insertions(+), 137 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchDefaultViewModel.kt diff --git a/app/src/main/java/com/gh/gamecenter/entity/SettingsEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/SettingsEntity.kt index ad65cb2ace..69700b3d50 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/SettingsEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/SettingsEntity.kt @@ -7,34 +7,34 @@ import com.google.gson.annotations.SerializedName import com.halo.assistant.HaloApp data class SettingsEntity( - var download: List? = listOf(), - var suggestion: Suggestion? = null, - var search: Search? = null, - var community: CommunityEntity? = null, - var image: Image? = null, - var support: Support? = null, - @SerializedName("community_entrance") - private var communityEntrance: String? = "", - @SerializedName("game_comment_blacklist") - var gameCommentBlackList: List? = listOf(), - @SerializedName("game_download_blacklist") - var gameDownloadBlackList: List = listOf(), - @SerializedName("game_package_match") - var gamePackageMatch: List? = listOf(), - @SerializedName("ad") - var adList: List? = listOf(), - @SerializedName("appointment_success") - var appointment: Appointment? = Appointment(), - @SerializedName("article_entrance") - private var articleEntrance: String = "", - @SerializedName("video_advertisement") - var videoAdvertisement: VideoAds? = null, //新增字段video_advertisement,可能为空,代表广告关闭 - @SerializedName("game_dome_switch") - var gameDomeSwitch: String = "",//试玩显示开关,on打开 - @SerializedName("permission_popup_switch") - var permissionPopupSwitch: String = "off",//权限引导弹窗开关,on/off - @SerializedName("permission_popup_applied_versions") - var permissionPopupAppliedVersions: PermissionPopupAppliedVersions = PermissionPopupAppliedVersions() + var download: List? = listOf(), + var suggestion: Suggestion? = null, + var search: Search? = null, + var community: CommunityEntity? = null, + var image: Image? = null, + var support: Support? = null, + @SerializedName("community_entrance") + private var communityEntrance: String? = "", + @SerializedName("game_comment_blacklist") + var gameCommentBlackList: List? = listOf(), + @SerializedName("game_download_blacklist") + var gameDownloadBlackList: List = listOf(), + @SerializedName("game_package_match") + var gamePackageMatch: List? = listOf(), + @SerializedName("ad") + var adList: List? = listOf(), + @SerializedName("appointment_success") + var appointment: Appointment? = Appointment(), + @SerializedName("article_entrance") + private var articleEntrance: String = "", + @SerializedName("video_advertisement") + var videoAdvertisement: VideoAds? = null, //新增字段video_advertisement,可能为空,代表广告关闭 + @SerializedName("game_dome_switch") + var gameDomeSwitch: String = "",//试玩显示开关,on打开 + @SerializedName("permission_popup_switch") + var permissionPopupSwitch: String = "off",//权限引导弹窗开关,on/off + @SerializedName("permission_popup_applied_versions") + var permissionPopupAppliedVersions: PermissionPopupAppliedVersions = PermissionPopupAppliedVersions() ) { fun setCommunityEntrance(communityEntrance: String) { @@ -43,9 +43,9 @@ data class SettingsEntity( fun showCommunityEntrance(): Boolean { val preferences = - PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance().application) + PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance().application) val isFixCommunity = - preferences.getBoolean(Config.FIX_COMMUNITY_KEY, false) + preferences.getBoolean(Config.FIX_COMMUNITY_KEY, false) if (isFixCommunity) return true if ("on" == communityEntrance) { @@ -61,9 +61,9 @@ data class SettingsEntity( fun showArticleEntrance(): Boolean { val preferences = - PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance().application) + PreferenceManager.getDefaultSharedPreferences(HaloApp.getInstance().application) val isFixArticle = - preferences.getBoolean(Config.FIX_ARTICLE_KEY, false) + preferences.getBoolean(Config.FIX_ARTICLE_KEY, false) if (isFixArticle) return true if ("on" == articleEntrance) { @@ -74,62 +74,68 @@ data class SettingsEntity( } data class Support( - var qq: String? = "", - @SerializedName("qq-group") - var qQun: String? = "", - @SerializedName("qq-group-key") - var qQunKey: String? = "") + var qq: String? = "", + @SerializedName("qq-group") + var qQun: String? = "", + @SerializedName("qq-group-key") + var qQunKey: String? = "" + ) data class Oss( - var jpeg: String? = "", - var gif: String? = "", - var webp: String? = "", - @SerializedName("gif_thumb") - var gitThumb: String? = "", - @SerializedName("gif_watermark") - var gifWaterMark: String? = "") + var jpeg: String? = "", + var gif: String? = "", + var webp: String? = "", + @SerializedName("gif_thumb") + var gitThumb: String? = "", + @SerializedName("gif_watermark") + var gifWaterMark: String? = "" + ) data class Image( - @SerializedName("upload_limit_size") - var uploadLimitSize: Long = 0, - @SerializedName("process_limit_size") - var processLimitSize: Long = 0, - var size: Int = 0, - var quality: Int = 0, - var ratio: Int = 0, - var oss: Oss? = null) + @SerializedName("upload_limit_size") + var uploadLimitSize: Long = 0, + @SerializedName("process_limit_size") + var processLimitSize: Long = 0, + var size: Int = 0, + var quality: Int = 0, + var ratio: Int = 0, + var oss: Oss? = null + ) data class Search( - @SerializedName("default") - var defaultData: List? = listOf(), - @SerializedName("remen") - var hotSearch: List? = listOf(), - @SerializedName("tag") - var hotTag: List? = listOf()) + @SerializedName("default") + var defaultData: List? = listOf(), + @SerializedName("remen") + var hotSearch: List? = listOf(), + @SerializedName("tag") + var hotTag: List? = listOf() + ) data class Suggestion( - var plugin: List? = listOf(), - var game: List? = listOf(), - var libao: List? = listOf(), - var service: List? = listOf(), - var report: List? = listOf(), - @SerializedName("online_game") - var onlineGame: List? = listOf(), - @SerializedName("local_game") - var localGame: List? = listOf(), - @SerializedName("welfare_game") - var welfareGame: List? = listOf(), - @SerializedName("gjlocal_game") - var internationalLocalGame: List? = listOf(), - @SerializedName("gjonline_game") - var internationalOnlineGame: List? = listOf(), - var video: List? = listOf()) + var plugin: List? = listOf(), + var game: List? = listOf(), + var libao: List? = listOf(), + var service: List? = listOf(), + var report: List? = listOf(), + @SerializedName("online_game") + var onlineGame: List? = listOf(), + @SerializedName("local_game") + var localGame: List? = listOf(), + @SerializedName("welfare_game") + var welfareGame: List? = listOf(), + @SerializedName("gjlocal_game") + var internationalLocalGame: List? = listOf(), + @SerializedName("gjonline_game") + var internationalOnlineGame: List? = listOf(), + var video: List? = listOf() + ) data class Download( - var game: String? = "", - var policy: String? = "", - var pluginfy: Boolean = false, - var time: TimeEntity? = null) { + var game: String? = "", + var policy: String? = "", + var pluginfy: Boolean = false, + var time: TimeEntity? = null + ) { class TimeEntity { var start: Long = 0 var end: Long = 0 @@ -137,38 +143,47 @@ data class SettingsEntity( } data class AD( - var location: String? = "", - var image: String? = "", - var title: String? = "", - var type: String? = "", - var text: String? = "", - var link: String? = "", - @SerializedName("link_community", alternate = ["community"]) - var community: CommunityEntity? = CommunityEntity()) { + var location: String? = "", + var image: String? = "", + var title: String? = "", + var type: String? = "", + var text: String? = "", + var link: String? = "", + @SerializedName("link_community", alternate = ["community"]) + var community: CommunityEntity? = CommunityEntity() + ) { fun toLinkEntity(): LinkEntity { - return LinkEntity(title = title, image = image, link = link, type = type, text = text, community = community) + return LinkEntity( + title = title, + image = image, + link = link, + type = type, + text = text, + community = community + ) } } data class GameWithPackages( - @SerializedName("game_id") - var gameId: String? = "", - var packages: List? = listOf() + @SerializedName("game_id") + var gameId: String? = "", + var packages: List? = listOf() ) data class HotSearch( - @SerializedName("_id") - var id: String, - var name: String, - val icon: String, - @SerializedName("name_suffix") - var nameSuffix: String? = null, - @SerializedName("ori_icon") - var rawIcon: String? = null, - @SerializedName("icon_subscript") - var iconSubscript: String? = null, - @SerializedName("recommend_type") - var recommendType: String? = "none"//none:无、hot: 热门、new: 上新、surge: 飙升 + @SerializedName("_id") + var id: String, + var name: String, + val icon: String, + @SerializedName("name_suffix") + var nameSuffix: String? = null, + @SerializedName("ori_icon") + var rawIcon: String? = null, + @SerializedName("icon_subscript") + var iconSubscript: String? = null, + @SerializedName("recommend_type") + var recommendType: String? = "none",//none:无、hot: 热门、new: 上新、surge: 飙升 + var type: String? = ""//论坛类型 ) { var exposureEvent: ExposureEvent? = null @@ -178,10 +193,11 @@ data class SettingsEntity( } data class Appointment( - @SerializedName("with_mobile") - var withMobile: DialogConfig = DialogConfig(), - @SerializedName("without_mobile") - var withoutMobile: DialogConfig = DialogConfig()) { + @SerializedName("with_mobile") + var withMobile: DialogConfig = DialogConfig(), + @SerializedName("without_mobile") + var withoutMobile: DialogConfig = DialogConfig() + ) { class DialogConfig { @SerializedName("html_content") var htmlContent: String = "" @@ -196,31 +212,31 @@ data class SettingsEntity( } data class VideoAds( - var center: ArrayList? = null, - var left: ArrayList? = null, - var right: ArrayList? = null + var center: ArrayList? = null, + var left: ArrayList? = null, + var right: ArrayList? = null ) data class Advertisement( - var duration: Int = -1, //广告总显示秒数 - var frequency: Int = -1,//广告出现频率 - var image: String = "", - var link: String = "", - @SerializedName("link_community") - var linkCommunity: CommunityEntity? = null, - @SerializedName("link_type") - var linkType: String = "", - var title: String = "", - var type: String = "", //广告类型。revolving走马灯,image图片 - @SerializedName("link_text") - var text: String = "", - var display: Display? = Display() + var duration: Int = -1, //广告总显示秒数 + var frequency: Int = -1,//广告出现频率 + var image: String = "", + var link: String = "", + @SerializedName("link_community") + var linkCommunity: CommunityEntity? = null, + @SerializedName("link_type") + var linkType: String = "", + var title: String = "", + var type: String = "", //广告类型。revolving走马灯,image图片 + @SerializedName("link_text") + var text: String = "", + var display: Display? = Display() ) data class PermissionPopupAppliedVersions( - val install: ArrayList = arrayListOf(), - @SerializedName("xapk_unzip") - val xapkUnzip: ArrayList = arrayListOf() + val install: ArrayList = arrayListOf(), + @SerializedName("xapk_unzip") + val xapkUnzip: ArrayList = arrayListOf() ) } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchDefaultFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchDefaultFragment.kt index c0bf8fc80a..abec2f6861 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchDefaultFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchDefaultFragment.kt @@ -1,18 +1,51 @@ package com.gh.gamecenter.forum.search +import android.os.Bundle import android.view.View import androidx.constraintlayout.widget.ConstraintLayout +import androidx.recyclerview.widget.GridLayoutManager import com.gh.common.util.DialogUtils import com.gh.common.util.dip2px +import com.gh.common.util.viewModelProvider import com.gh.gamecenter.databinding.FragmentSearchDefaultBinding import com.gh.gamecenter.eventbus.EBSearch +import com.gh.gamecenter.forum.detail.ForumDetailActivity import com.gh.gamecenter.search.SearchDefaultFragment +import com.gh.gamecenter.search.SearchDefaultHotAdapter import com.lightgame.utils.Util_System_Keyboard import org.greenrobot.eventbus.EventBus class ForumOrUserSearchDefaultFragment : SearchDefaultFragment() { private lateinit var mSearchDao: ForumSearchDao + private lateinit var mViewModel: ForumOrUserSearchDefaultViewModel + private var mAdapter: SearchDefaultHotAdapter? = null + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + mViewModel = viewModelProvider() + mViewModel.hotSearchLiveData.observe(viewLifecycleOwner) { + mHotSearchList = it + initHotSearch() + } + } + + private fun initHotSearch() { + mBinding.isExistHotSearch = mHotSearchList?.isNotEmpty() + mBinding.hotList.run { + layoutManager = GridLayoutManager(context, 2) + adapter = SearchDefaultHotAdapter(context, mHotSearchList, callBack = { + requireActivity().startActivity( + ForumDetailActivity.getIntent( + requireContext(), + it.id, + "搜索论坛-热门搜索" + ) + ) + Util_System_Keyboard.hideSoftKeyboardByIBinder(context, windowToken) + }).apply { mAdapter = this } + } + } override fun initDao() { mSearchDao = ForumSearchDao() @@ -23,20 +56,20 @@ class ForumOrUserSearchDefaultFragment : SearchDefaultFragment() { mBinding = FragmentSearchDefaultBinding.bind(mCachedView) mBinding.hotTagTitle.visibility = View.GONE mBinding.hotTagFlexContainer.visibility = View.GONE - mBinding.hotTitle.visibility = View.GONE - mBinding.hotList.visibility = View.GONE + mBinding.hotTitle.text = "热门论坛" val params = mBinding.historyTitle.layoutParams as ConstraintLayout.LayoutParams params.topMargin = 0.5f.dip2px() mBinding.historyTitle.layoutParams = params - - mBinding.isExistHistory = mHistoryList?.isNotEmpty() mBinding.historyFlexContainer.setLimitHeight(mFlexMaxHeight) createFlexContent(mBinding.historyFlex, mHistoryList, clickListener = { val key = mHistoryList!![it] mSearchDao.add(key) EventBus.getDefault().post(EBSearch("history", key)) - Util_System_Keyboard.hideSoftKeyboardByIBinder(context, mBinding.historyFlex.windowToken) + Util_System_Keyboard.hideSoftKeyboardByIBinder( + context, + mBinding.historyFlex.windowToken + ) }) mBinding.historyClear.setOnClickListener { diff --git a/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchDefaultViewModel.kt b/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchDefaultViewModel.kt new file mode 100644 index 0000000000..7cf853b1b0 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchDefaultViewModel.kt @@ -0,0 +1,31 @@ +package com.gh.gamecenter.forum.search + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.MutableLiveData +import com.gh.common.util.observableToMain +import com.gh.gamecenter.entity.SettingsEntity +import com.gh.gamecenter.retrofit.Response +import com.gh.gamecenter.retrofit.RetrofitManager + +class ForumOrUserSearchDefaultViewModel(application: Application) : AndroidViewModel(application) { + val hotSearchLiveData = MutableLiveData>() + + init { + getHotSearch() + } + + private fun getHotSearch() { + RetrofitManager.getInstance(getApplication()).api + .hotSearches + .compose(observableToMain()) + .subscribe(object : Response>() { + override fun onResponse(response: List?) { + super.onResponse(response) + if (!response.isNullOrEmpty()) { + hotSearchLiveData.postValue(response) + } + } + }) + } +} \ No newline at end of file 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 1e2ff3f26c..651e91b499 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 @@ -3283,4 +3283,10 @@ public interface ApiService { @Query("model") String model, @Query("channel") String channel, @Query("api_version") String apiVersion); + + /** + * 获取论坛热门搜索列表 + */ + @GET("bbses/hot_searches") + Observable> getHotSearches(); } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchDefaultHotAdapter.kt b/app/src/main/java/com/gh/gamecenter/search/SearchDefaultHotAdapter.kt index c3795e8f68..2e0106b3ce 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchDefaultHotAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/search/SearchDefaultHotAdapter.kt @@ -15,10 +15,11 @@ import com.halo.assistant.HaloApp import com.lightgame.adapter.BaseRecyclerAdapter import kotlinx.android.synthetic.main.dialog_notification_hint.* -class SearchDefaultHotAdapter(context: Context, - val hotList: List?, - val callBack: (SettingsEntity.HotSearch) -> Unit) - : BaseRecyclerAdapter(context) { +class SearchDefaultHotAdapter( + context: Context, + val hotList: List?, + val callBack: (SettingsEntity.HotSearch) -> Unit +) : BaseRecyclerAdapter(context) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SearchDefaultHotViewHolder { val view = mLayoutInflater.inflate(R.layout.search_default_hot_item, parent, false) @@ -40,7 +41,8 @@ class SearchDefaultHotAdapter(context: Context, name.postDelayed({ name.isSelected = true }, 500) } val drawableRes = "ic_search_no_${position + 1}" - val drawableId = mContext.resources.getIdentifier(drawableRes, "drawable", mContext.packageName) + val drawableId = + mContext.resources.getIdentifier(drawableRes, "drawable", mContext.packageName) index.setImageDrawable(drawableId.toDrawable()) val textColor = when (position) { 0 -> R.color.text_ff5151.toColor() @@ -52,7 +54,7 @@ class SearchDefaultHotAdapter(context: Context, val labelIcon = when (hotSearch.recommendType) { "hot" -> R.drawable.ic_search_hot "new" -> R.drawable.ic_search_new - "surge" -> R.drawable.ic_search_surge + "surge", "rise" -> R.drawable.ic_search_surge else -> -1 } if (labelIcon != -1) { @@ -74,4 +76,5 @@ class SearchDefaultHotAdapter(context: Context, } } -class SearchDefaultHotViewHolder(val binding: SearchDefaultHotItemBinding) : BaseRecyclerViewHolder(binding.root) \ No newline at end of file +class SearchDefaultHotViewHolder(val binding: SearchDefaultHotItemBinding) : + BaseRecyclerViewHolder(binding.root) \ No newline at end of file From 6436bc6191598dbedccd19f2d6271ff5c85ab3f3 Mon Sep 17 00:00:00 2001 From: juntao Date: Wed, 25 Aug 2021 18:00:24 +0800 Subject: [PATCH 109/151] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E4=BC=98=E5=8C=96=200824=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E9=97=AE=E9=A2=98=20https://git.ghzs.com/pm/halo-app-issues/-/?= =?UTF-8?q?issues/1244?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/GameUtils.java | 1 + .../download/UpdatableGameAdapter.kt | 7 +-- .../download/UpdatableGameFragment.kt | 3 ++ .../download/UpdatableGameViewModel.kt | 43 +++++++++++-------- .../rating/RatingCommentItemViewHolder.kt | 7 ++- .../packagehelper/PackageRepository.kt | 4 +- .../packagehelper/PackageViewModel.kt | 7 ++- 7 files changed, 46 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/GameUtils.java b/app/src/main/java/com/gh/common/util/GameUtils.java index 0b55a93c57..76f251db73 100644 --- a/app/src/main/java/com/gh/common/util/GameUtils.java +++ b/app/src/main/java/com/gh/common/util/GameUtils.java @@ -226,6 +226,7 @@ public class GameUtils { gameUpdateEntity.setPluginDesc(gameEntity.getPluginDesc()); gameUpdateEntity.setFormat(apkEntity.getFormat()); gameUpdateEntity.setCurrentVersion(PackageUtils.getVersionNameByPackageName(apkEntity.getPackageName())); + gameUpdateEntity.setCategory(gameEntity.getCategory()); GameCollectionEntity pluggableCollection = getPluggableCollectionFromGameEntity(gameEntity, apkEntity.getPackageName()); if (pluggableCollection != null) { diff --git a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt index 8d29158c12..767f802c92 100644 --- a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameAdapter.kt @@ -161,7 +161,8 @@ class UpdatableGameAdapter(private var mViewModel: UpdatableGameViewModel) : } nameTv.text = nameText currentVersionTv.text = "当前:V${update.currentVersion}" - newVersionTv.text = "新版:V${update.version} | ${update.size}" + newVersionTv.text = "最新:V${update.version} | ${update.size}" + optionIv.goneIf(itemData.otherVersionUpdate != null) optionIv.setOnClickListener { showIgnoreOption(it, update, itemData.ignoredUpdate != null) } @@ -295,8 +296,8 @@ class UpdatableGameAdapter(private var mViewModel: UpdatableGameViewModel) : } } else { updateBtn.setText(R.string.launch) - updateBtn.setTextColor(R.color.theme_font.toColor()) - updateBtn.setBackgroundResource(R.drawable.detail_downloading_normal_style) + updateBtn.setTextColor(Color.WHITE) + updateBtn.setBackgroundResource(R.drawable.download_button_normal_style) } } else { if (update.isPluggable) { diff --git a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameFragment.kt b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameFragment.kt index 86d3a5ce01..7dfab6da2f 100644 --- a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameFragment.kt @@ -5,6 +5,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import com.gh.base.fragment.LazyFragment import com.gh.common.exposure.ExposureListener import com.gh.common.util.EntranceUtils +import com.gh.common.util.goneIf import com.gh.common.util.observeNonNull import com.gh.common.util.viewModelProvider import com.gh.gamecenter.MainActivity @@ -14,6 +15,7 @@ import com.gh.gamecenter.eventbus.EBDownloadStatus import com.gh.gamecenter.eventbus.EBReuse import com.gh.gamecenter.fragment.MainWrapperFragment import com.gh.gamecenter.packagehelper.PackageViewModel +import kotlinx.android.synthetic.main.fragment_game_updatable.* import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode @@ -44,6 +46,7 @@ class UpdatableGameFragment : LazyFragment() { } mViewModel?.updatableData?.observe(viewLifecycleOwner) { mAdapter.submitList(it) + mBinding?.noDataContainer?.root?.goneIf(!it.isNullOrEmpty()) } } diff --git a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt index 639170c88d..1e4977a50f 100644 --- a/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/download/UpdatableGameViewModel.kt @@ -114,6 +114,8 @@ class UpdatableGameViewModel( */ private fun constructPackageUpdateList(updatableList: ArrayList) : ArrayList { + // 包名数组列表,因为 hashmap 在不同的系统版本上的实现不一样,在部分系统上会根据 key 的值重排序破坏列表顺序 + val packageNameList = arrayListOf() val packageNameAndUpdateListMap = hashMapOf>() val packageUpdateList: ArrayList = arrayListOf() @@ -122,44 +124,46 @@ class UpdatableGameViewModel( var list = packageNameAndUpdateListMap[update.packageName] if (list == null) { list = arrayListOf() + packageNameList.add(update.packageName) packageNameAndUpdateListMap[update.packageName] = list } list.add(update) } // 找到我的版本 - for ((packageName, list) in packageNameAndUpdateListMap) { - val sign = PackageUtils.getApkSignatureByPackageName(getApplication(), packageName) - val isSignByGh = PackageUtils.isSignedByGh(getApplication(), packageName) - val ghId = if (isSignByGh) PackageUtils.getGhId(packageName) else null - val versionName = PackageUtils.getVersionNameByPackageName(packageName) ?: "" + for (packageName in packageNameList) { + val samePackageNameUpdateList = packageNameAndUpdateListMap[packageName] ?: arrayListOf() + val installedSignature = PackageUtils.getApkSignatureByPackageName(getApplication(), packageName) + val isInstalledSignByGh = PackageUtils.isSignedByGh(getApplication(), packageName) + val installedGhId = if (isInstalledSignByGh) PackageUtils.getGhId(packageName) else null + val installedVersionName = PackageUtils.getVersionNameByPackageName(packageName) ?: "" var matchedVersionUpdate: GameUpdateEntity? = null val mismatchedVersionUpdateList: ArrayList = arrayListOf() // 已安装的游戏为插件游戏,找插件包里的 GH_ID 跟我的版本一样的作为我的版本 - if (isSignByGh && ghId != null) { - for (update in list) { - if (update.id == ghId) { + if (isInstalledSignByGh && installedGhId != null) { + for (update in samePackageNameUpdateList) { + if (update.id == installedGhId) { matchedVersionUpdate = update } else { mismatchedVersionUpdateList.add(update) } } - } else if (mDownloadedGameIdAndPackageNameDao.contains(packageName)) { + } else if (mDownloadedGameIdAndPackageNameDao.getRawString().contains(packageName)) { // 光环曾经下载过对应包名的游戏,找到对应游戏ID的更新作为我的版本 val idAndPackageNameString = mDownloadedGameIdAndPackageNameDao.getRawString() - for (update in list) { - if (idAndPackageNameString.contains(update.id)) { + for (update in samePackageNameUpdateList) { + if (matchedVersionUpdate == null && idAndPackageNameString.contains(update.id)) { matchedVersionUpdate = update } else { mismatchedVersionUpdateList.add(update) } } - } else if (list.find { it.signature == sign } != null) { + } else if (samePackageNameUpdateList.find { it.signature == installedSignature } != null) { // 存在同包名同签名的游戏,以同包名同签名的游戏作为我的版本 - for (update in list) { - if (sign == update.signature) { + for (update in samePackageNameUpdateList) { + if (installedSignature == update.signature) { matchedVersionUpdate = update } else { mismatchedVersionUpdateList.add(update) @@ -167,7 +171,7 @@ class UpdatableGameViewModel( } } else { // 以同包名中七天下载量最高的游戏作为我的版本 - for (update in list) { + for (update in samePackageNameUpdateList) { if (update.download >= matchedVersionUpdate?.download ?: 0) { matchedVersionUpdate = update } @@ -183,7 +187,7 @@ class UpdatableGameViewModel( val iterator = mismatchedVersionUpdateList.iterator() while (iterator.hasNext()) { val update = iterator.next() - if (update.version == versionName) { + if (update.version == installedVersionName) { iterator.remove() continue } @@ -313,15 +317,16 @@ class UpdatableGameViewModel( if (invalidPackageUpdateList.isNotEmpty()) { if (updatableDataItemList.size != 0) { updatableDataItemList.add(UpdatableDataItem(divider = WHITE)) + updatableDataItemList.add(UpdatableDataItem(divider = GREY)) } - updatableDataItemList.add(UpdatableDataItem(divider = GREY)) updatableDataItemList.add(UpdatableDataItem(header = "以下游戏有其他版本可以更新")) - for (packageUpdate in validPackageUpdateList) { + for (packageUpdate in invalidPackageUpdateList) { if (packageUpdate.mismatchedVersionUpdateList.isNotEmpty()) { updatableDataItemList.add(UpdatableDataItem(normalUpdateWithArrow = packageUpdate.matchedVersionUpdate)) updatableDataItemList.add( UpdatableDataItem( - otherVersionUpdateHint = mOtherVersionExpandedMap[packageUpdate.matchedVersionUpdate.packageName] == true + otherVersionUpdateHint = mOtherVersionExpandedMap[packageUpdate.matchedVersionUpdate.packageName] == true, + miscPackageName = packageUpdate.matchedVersionUpdate.packageName ) ) if (mOtherVersionExpandedMap[packageUpdate.matchedVersionUpdate.packageName] == true) { 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 3008ab7428..58ab1a5ed6 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 @@ -37,7 +37,7 @@ import com.squareup.picasso.Picasso import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers -import java.util.ArrayList +import java.util.* import java.util.regex.Pattern class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseRecyclerViewHolder(binding.root) { @@ -264,6 +264,11 @@ class RatingCommentItemViewHolder(val binding: RatingCommentItemBinding) : BaseR }, auditText.length - 3, auditText.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) audit.text = auditText audit.movementMethod = LinkMovementMethod() + + comment.post { + comment.visibility = View.INVISIBLE + vote.visibility = View.INVISIBLE + } } } } diff --git a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt index f29357cbdc..de00423c69 100644 --- a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt +++ b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt @@ -82,7 +82,7 @@ object PackageRepository { mInstalledPkgList.addAll(list) notifyInstallPkgData() - loadInstalledGameDigestAndNotifyData(list) + loadInstalledGameDigestAndNotifyData(list, true) loadGhzsUpdate() } } @@ -264,6 +264,8 @@ object PackageRepository { pluginDesc = game.pluginDesc format = apk.format signature = apk.signature ?: "" + currentVersion = PackageUtils.getVersionNameByPackageName(apk.packageName) + category = game.category }) } } diff --git a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageViewModel.kt b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageViewModel.kt index 8458ff3cfe..d6a37c8fbe 100644 --- a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageViewModel.kt @@ -46,8 +46,11 @@ class PackageViewModel(application: Application, val mediatorLiveData = MediatorLiveData>() mediatorLiveData.addSource(mRepository.gameUpdateLiveData) { val decoratedList = ArrayList(it) - for (currentVersion in mRepository.currentVersionList) { - decoratedList.add(currentVersion) + + if (decoratedList.isNotEmpty()) { + for (currentVersion in mRepository.currentVersionList) { + decoratedList.add(currentVersion) + } } mediatorLiveData.postValue(decoratedList) From 480e18b79a68b8297f056fe2213eca7688898fa9 Mon Sep 17 00:00:00 2001 From: juntao Date: Wed, 25 Aug 2021 18:02:17 +0800 Subject: [PATCH 110/151] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=BC=80=E6=9C=8D?= =?UTF-8?q?=E8=A1=A8=E7=9B=B8=E5=85=B3=E4=BC=98=E5=8C=96(0825=E6=B5=8B?= =?UTF-8?q?=E8=AF=952)=20https://git.ghzs.com/pm/halo-app-issues/-/issues/?= =?UTF-8?q?1220#note=5F114996?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/databind/BindingAdapters.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/gh/common/databind/BindingAdapters.java b/app/src/main/java/com/gh/common/databind/BindingAdapters.java index a768183665..a8fa7a81d8 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -760,7 +760,7 @@ public class BindingAdapters { if (test != null // 这个判断用于开测表列表 && !"type_tag".equals(test.getGameTag())) { - if ("custom".equals(test.getGameTag())) { + if ("custom".equals(test.getGameTag()) && !TextUtils.isEmpty(test.getText())) { TagStyleEntity typeTag = new TagStyleEntity(); typeTag.setName(test.getText() != null ? test.getText() : ""); typeTag.setBackground("E8F3FF"); From f865e95ae13b83a85efbb3582f65bef51f518def Mon Sep 17 00:00:00 2001 From: juntao Date: Wed, 25 Aug 2021 18:23:30 +0800 Subject: [PATCH 111/151] =?UTF-8?q?Revert=20"=E4=B8=B4=E6=97=B6=E7=AE=80?= =?UTF-8?q?=E5=8D=95=E5=A4=84=E7=90=86=E5=85=89=E9=81=87=E6=B8=B8=E6=88=8F?= =?UTF-8?q?=E5=8C=85=E7=82=B9=E5=87=BB=E6=9B=B4=E6=96=B0=E6=97=B6=E4=BC=9A?= =?UTF-8?q?=E5=8D=A1=E4=BD=8F=E7=9A=84=E9=97=AE=E9=A2=98"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 86edc8b9 --- .../com/gh/common/util/DownloadObserver.kt | 26 +++---- .../com/gh/common/util/PackageInstaller.kt | 30 +++----- .../java/com/gh/common/util/PackageUtils.java | 17 +---- .../gamecenter/receiver/InstallReceiver.java | 76 +++++++++---------- 4 files changed, 59 insertions(+), 90 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/DownloadObserver.kt b/app/src/main/java/com/gh/common/util/DownloadObserver.kt index 8816acf9e8..11fa9a29ba 100644 --- a/app/src/main/java/com/gh/common/util/DownloadObserver.kt +++ b/app/src/main/java/com/gh/common/util/DownloadObserver.kt @@ -6,8 +6,6 @@ import com.gh.base.BaseActivity import com.gh.common.constant.Constants import com.gh.common.exposure.ExposureUtils import com.gh.common.exposure.meta.MetaUtil -import com.gh.common.runOnIoThread -import com.gh.common.runOnUiThread import com.gh.common.simulator.SimulatorDownloadManager import com.gh.common.simulator.SimulatorGameManager import com.gh.common.util.EnergyTaskHelper.postEnergyTask @@ -168,21 +166,17 @@ object DownloadObserver { Utils.toast(mApplication, R.string.install_failure_hint) downloadManager.cancel(downloadEntity.url) } else { - runOnIoThread { - if (PackageUtils.isInstallable(mApplication, downloadEntity.path)) { - downloadEntity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION] = "YES" - tryWithDefaultCatch { - runOnUiThread { - PackageInstaller.install(mApplication, downloadEntity, false) - } - } + if (PackageUtils.isCanLaunchSetup(mApplication, downloadEntity.path)) { + downloadEntity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION] = "YES" + tryWithDefaultCatch { + PackageInstaller.install(mApplication, downloadEntity, false) + } + } else { + // 弹出卸载提示框 + if (downloadEntity.isPlugin) { + EventBus.getDefault().post(EBShowDialog(BaseActivity.PLUGGABLE, downloadEntity.path)) } else { - // 弹出卸载提示框 - if (downloadEntity.isPlugin) { - EventBus.getDefault().post(EBShowDialog(BaseActivity.PLUGGABLE, downloadEntity.path)) - } else { - EventBus.getDefault().post(EBShowDialog(BaseActivity.SIGNATURE_CONFLICT, downloadEntity.path)) - } + EventBus.getDefault().post(EBShowDialog(BaseActivity.SIGNATURE_CONFLICT, downloadEntity.path)) } } } diff --git a/app/src/main/java/com/gh/common/util/PackageInstaller.kt b/app/src/main/java/com/gh/common/util/PackageInstaller.kt index cc79b536cf..a59453478e 100644 --- a/app/src/main/java/com/gh/common/util/PackageInstaller.kt +++ b/app/src/main/java/com/gh/common/util/PackageInstaller.kt @@ -10,8 +10,6 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.content.FileProvider import com.gh.common.constant.Constants import com.gh.common.dialog.InstallPermissionDialogFragment -import com.gh.common.runOnIoThread -import com.gh.common.runOnUiThread import com.gh.common.xapk.XapkInstaller import com.gh.download.server.BrowserInstallHelper import com.gh.gamecenter.BuildConfig @@ -79,26 +77,20 @@ object PackageInstaller { return } - runOnIoThread { - if (PackageUtils.isInstallable(context, pkgPath)) { - runOnUiThread { - HaloApp.put(Constants.LAST_INSTALL_GAME, pkgPath) + if (PackageUtils.isCanLaunchSetup(context, pkgPath)) { + HaloApp.put(Constants.LAST_INSTALL_GAME, pkgPath) - val installIntent = getInstallIntent(context, pkgPath) - context.startActivity(installIntent) + val installIntent = getInstallIntent(context, pkgPath) + context.startActivity(installIntent) + } else { + if (isPluggin) { + DialogHelper.showPluginDialog(context) { + uninstall(context, pkgPath) } } else { - runOnUiThread { - if (isPluggin) { - DialogHelper.showPluginDialog(context) { - uninstall(context, pkgPath) - } - } else { - // 非插件化的同包名不同签名冲突 - DialogHelper.showSignatureConflictDialog(context) { - uninstall(context, pkgPath) - } - } + // 非插件化的同包名不同签名冲突 + DialogHelper.showSignatureConflictDialog(context) { + uninstall(context, pkgPath) } } } diff --git a/app/src/main/java/com/gh/common/util/PackageUtils.java b/app/src/main/java/com/gh/common/util/PackageUtils.java index a0c627bda1..d5b688132b 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -16,10 +16,8 @@ import android.os.PowerManager; import android.text.TextUtils; import androidx.annotation.Nullable; -import androidx.annotation.WorkerThread; import com.g00fy2.versioncompare.Version; -import com.gh.common.AppExecutor; import com.gh.common.xapk.XapkInstaller; import com.gh.gamecenter.BuildConfig; import com.gh.gamecenter.entity.ApkEntity; @@ -228,13 +226,9 @@ public class PackageUtils { return null; } - // TODO 找一个更高效的方式来比较 V2 签名 + // TODO 找一个更好的办法来比较签名并且不触发 ANR public static boolean compareSignatureBetweenInstalledAppWithApk(Context context, String packageName, String apkFilePath) { try { - AppExecutor.getUiExecutor().execute(() -> { - ToastUtils.toast("安装包校验中,约需要3~5秒,请稍候"); - }); - // 据 Sentry 统计,刚上架一个周末的包里对这个方法有 700+ 次调用,然后其中一部分会造成 ANR Signature sig = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures[0]; @@ -287,14 +281,11 @@ public class PackageUtils { } /** - * 根据 path 获取 apk 是否可安装 (全新安装或覆盖安装) - * - * 由于部分不存在 V1 签名的大安装包在调用系统 API 获取签名信息时会非常慢,所以请在工作线程里调用此方法 + * 根据 path 获取 apk 信息确定处理方式 * - * @return true 为可直接唤起系统 PackageInstaller, false 为需要插件化 + * @return true 为直接唤起系统 PackageInstaller, false 为需要插件化 */ - @WorkerThread - public static boolean isInstallable(Context context, String path) { + public static boolean isCanLaunchSetup(Context context, String path) { String packageName = getPackageNameByPath(context, path); if (TextUtils.isEmpty(packageName)) { diff --git a/app/src/main/java/com/gh/gamecenter/receiver/InstallReceiver.java b/app/src/main/java/com/gh/gamecenter/receiver/InstallReceiver.java index d18dfa1c1b..69e48dc8bf 100644 --- a/app/src/main/java/com/gh/gamecenter/receiver/InstallReceiver.java +++ b/app/src/main/java/com/gh/gamecenter/receiver/InstallReceiver.java @@ -7,7 +7,6 @@ import android.content.Intent; import android.os.Bundle; import com.gh.base.fragment.BaseFragment_ViewPager; -import com.gh.common.AppExecutor; import com.gh.common.constant.Constants; import com.gh.common.util.DownloadNotificationHelper; import com.gh.common.util.EntranceUtils; @@ -45,49 +44,42 @@ public class InstallReceiver extends BroadcastReceiver { } updateNotification(downloadEntity); - DownloadEntity finalDownloadEntity = downloadEntity; - AppExecutor.getIoExecutor().execute(() -> { - if (PackageUtils.isInstallable(context, path)) { - AppExecutor.getUiExecutor().execute(() -> { - if (finalDownloadEntity != null) { - PackageInstaller.install(context, finalDownloadEntity); - } else { - PackageInstaller.install(context, false, path); - } - }); + if (PackageUtils.isCanLaunchSetup(context, path)) { + if (downloadEntity != null) { + PackageInstaller.install(context, downloadEntity); } else { - AppExecutor.getUiExecutor().execute(() -> { - if (RunningUtils.isRunning(context)) { - if (RunningUtils.isEqualsTop(context, DownloadManagerActivity.class.getName())) { - // 这里是指从后台返回到前台 前两个的是关键 - Intent intent2 = new Intent(); - intent2.setAction(Intent.ACTION_MAIN); - intent2.addCategory(Intent.CATEGORY_LAUNCHER); - intent2.setComponent(new ComponentName(context, DownloadManagerActivity.class)); - intent2.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); - context.startActivity(intent2); - - EventBus.getDefault().post(new EBMiPush("plugin_install", path)); - } else { - Intent intent2 = new Intent(context, DownloadManagerActivity.class); - intent2.putExtra(BaseFragment_ViewPager.ARGS_INDEX, 0); - intent2.putExtra(EntranceUtils.KEY_PATH, path); - intent2.putExtra(EntranceUtils.KEY_ENTRANCE, "(安装跳转)"); - intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - context.startActivity(intent2); - } - } else { - // 应用未在运行 - Bundle bundle = new Bundle(); - bundle.putString(KEY_TO, DownloadManagerActivity.TAG); - bundle.putInt(BaseFragment_ViewPager.ARGS_INDEX, 0); - bundle.putString(EntranceUtils.KEY_PATH, path); - bundle.putString(EntranceUtils.KEY_ENTRANCE, "(安装跳转)"); - context.startActivity(SplashScreenActivity.getSplashScreenIntent(context, bundle)); - } - }); + PackageInstaller.install(context, false, path); } - }); + } else { + if (RunningUtils.isRunning(context)) { + if (RunningUtils.isEqualsTop(context, DownloadManagerActivity.class.getName())) { + // 这里是指从后台返回到前台 前两个的是关键 + Intent intent2 = new Intent(); + intent2.setAction(Intent.ACTION_MAIN); + intent2.addCategory(Intent.CATEGORY_LAUNCHER); + intent2.setComponent(new ComponentName(context, DownloadManagerActivity.class)); + intent2.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); + context.startActivity(intent2); + + EventBus.getDefault().post(new EBMiPush("plugin_install", path)); + } else { + Intent intent2 = new Intent(context, DownloadManagerActivity.class); + intent2.putExtra(BaseFragment_ViewPager.ARGS_INDEX, 0); + intent2.putExtra(EntranceUtils.KEY_PATH, path); + intent2.putExtra(EntranceUtils.KEY_ENTRANCE, "(安装跳转)"); + intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent2); + } + } else { + // 应用未在运行 + Bundle bundle = new Bundle(); + bundle.putString(KEY_TO, DownloadManagerActivity.TAG); + bundle.putInt(BaseFragment_ViewPager.ARGS_INDEX, 0); + bundle.putString(EntranceUtils.KEY_PATH, path); + bundle.putString(EntranceUtils.KEY_ENTRANCE, "(安装跳转)"); + context.startActivity(SplashScreenActivity.getSplashScreenIntent(context, bundle)); + } + } }); } From 1906451060b56983f98b10c7e9c571e612473b37 Mon Sep 17 00:00:00 2001 From: juntao Date: Thu, 26 Aug 2021 10:17:08 +0800 Subject: [PATCH 112/151] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E7=B3=BB?= =?UTF-8?q?=E5=88=97=E9=97=AA=E9=80=80=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 修复因为特殊处理光遇更新判断而触发的其它下载闪退问题 2. 修复帖子视频详情页点击点赞/关注等按钮触发一键登录时的闪退问题 3. 修复下载完成点击通知栏下载完成通知偶发的闪退问题 4. 修复从首页安利墙发表新安利后点击到达评论可能触发的闪退问题 5. 修复论坛详情在页面被内存回收重建时下拉刷新的闪退问题 6. 修复游戏详情页浏览专区在页面被内存回收重建时点返回按钮偶发的闪退问题 7. 修复开测表列表不存在推荐标签时的闪退问题 --- .../java/com/gh/common/util/CheckLoginUtils.java | 13 +++++++++++-- .../main/java/com/gh/common/util/DialogHelper.kt | 10 ++++++---- .../java/com/gh/common/util/DownloadItemUtils.java | 8 ++++++-- .../java/com/gh/common/util/PackageInstaller.kt | 5 ++--- .../com/gh/gamecenter/amway/AmwaySuccessFragment.kt | 10 +++++++++- .../gamecenter/forum/detail/ForumDetailActivity.kt | 2 ++ .../gh/gamecenter/gamedetail/GameDetailFragment.kt | 4 +++- 7 files changed, 39 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/CheckLoginUtils.java b/app/src/main/java/com/gh/common/util/CheckLoginUtils.java index 8c4f525fe2..92b9550043 100644 --- a/app/src/main/java/com/gh/common/util/CheckLoginUtils.java +++ b/app/src/main/java/com/gh/common/util/CheckLoginUtils.java @@ -1,9 +1,11 @@ package com.gh.common.util; +import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.text.TextUtils; +import com.gh.base.CurrentActivityHolder; import com.gh.common.constant.Constants; import com.gh.gamecenter.LoginActivity; import com.gh.gamecenter.manager.UserManager; @@ -16,14 +18,21 @@ import com.lightgame.utils.Utils; public class CheckLoginUtils { - public static void checkLogin(final Context context, String entrance, OnLoginListener listener) { + public static void checkLogin(Context context, String entrance, OnLoginListener listener) { if (!isLogin()) { if (listener != null) Utils.toast(context, "需要登录"); LogUtils.login("dialog", null, entrance); LogUtils.login("activity", null, entrance); if (SPUtils.getBoolean(Constants.SP_HAS_GET_PHONE_INFO) || NetworkUtils.isOpenMobileData(context)) { - QuickLoginHelper.startLogin(context, entrance); + // 需要确保传入的 context 不为 application + if (!(context instanceof Activity)) { + context = CurrentActivityHolder.getCurrentActivity(); + } + + if (context != null) { + QuickLoginHelper.startLogin(context, entrance); + } } else { // 有可能App未启动 Bundle bundle = new Bundle(); diff --git a/app/src/main/java/com/gh/common/util/DialogHelper.kt b/app/src/main/java/com/gh/common/util/DialogHelper.kt index 68d5158cb6..2b5edba059 100644 --- a/app/src/main/java/com/gh/common/util/DialogHelper.kt +++ b/app/src/main/java/com/gh/common/util/DialogHelper.kt @@ -1,5 +1,6 @@ package com.gh.common.util +import android.app.Activity import android.app.Dialog import android.content.Context import android.graphics.Color @@ -35,9 +36,11 @@ object DialogHelper { uiModificationCallback: ((binding: DialogAlertDefaultBinding) -> Unit)? = null, trackMtaEvent: Boolean = false, mtaEvent: String = "", - mtaKey: String = ""): Dialog { + mtaKey: String = "") { val solidContext = checkDialogContext(context) + if (solidContext is Activity && solidContext.isFinishing) return + val dialog = if (trackMtaEvent) { TrackableDialog(solidContext, R.style.GhAlertDialog, mtaEvent, mtaKey) } else { @@ -97,7 +100,6 @@ object DialogHelper { dialog.setContentView(contentView) dialog.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) dialog.show() - return dialog } /** @@ -114,8 +116,8 @@ object DialogHelper { negativeClickCallback: EmptyCallback, trackMtaEvent: Boolean = false, mtaEvent: String = "", - mtaKey: String = ""): Dialog { - return showDialog( + mtaKey: String = "") { + showDialog( context = context, title = title, content = content, diff --git a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java index 18252c6689..d439cd0b0a 100644 --- a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java +++ b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java @@ -386,7 +386,9 @@ public class DownloadItemUtils { holder.gameDes.setVisibility(View.GONE); holder.gameProgressbar.setVisibility(View.VISIBLE); holder.gameInfo.setVisibility(View.VISIBLE); - holder.recommendContainer.setVisibility(View.GONE); + if (holder.recommendContainer != null) { + holder.recommendContainer.setVisibility(View.GONE); + } } else { holder.gameProgressbar.setVisibility(View.GONE); holder.gameInfo.setVisibility(View.GONE); @@ -395,7 +397,9 @@ public class DownloadItemUtils { if (briefStyle != null && recommendStyle != null && briefStyle.contains("recommend")) { - holder.recommendContainer.setVisibility(View.VISIBLE); + if (holder.recommendContainer != null) { + holder.recommendContainer.setVisibility(View.VISIBLE); + } if (holder.gameRating != null) holder.gameRating.setVisibility(View.GONE); holder.gameDes.setVisibility(View.GONE); diff --git a/app/src/main/java/com/gh/common/util/PackageInstaller.kt b/app/src/main/java/com/gh/common/util/PackageInstaller.kt index a59453478e..3a23b350d1 100644 --- a/app/src/main/java/com/gh/common/util/PackageInstaller.kt +++ b/app/src/main/java/com/gh/common/util/PackageInstaller.kt @@ -1,7 +1,6 @@ package com.gh.common.util import android.app.Activity -import android.app.Application import android.content.Context import android.content.Intent import android.net.Uri @@ -46,7 +45,7 @@ object PackageInstaller { // TODO 此处可能遇到 activity 是 WXEntryActivity // TODO 当 activity 全部出栈,但是应用还在下载游戏,下载完会唤不起安装! - if (currentActivity is AppCompatActivity) { + if (currentActivity is AppCompatActivity && !currentActivity.isFinishing) { InstallPermissionDialogFragment.show(currentActivity, downloadEntity) { // 取消状态栏下载完成的通知,若存在 downloadEntity.meta[Constants.MARK_ALREADY_TRIGGERED_INSTALLATION] = "YES" @@ -125,7 +124,7 @@ object PackageInstaller { // 应用内更新不加 FLAG_ACTIVITY_NEW_TASK 在模拟器上会出现安装完成后安装界面也一并消失的类似闪退的表现 // Application 上下文就更不用说了 val pkgName = PackageUtils.getPackageNameByPath(context, path) - if (pkgName == context.packageName || context is Application) { + if (pkgName == context.packageName || context !is Activity) { installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) } installIntent.setDataAndType(uri, "application/vnd.android.package-archive") diff --git a/app/src/main/java/com/gh/gamecenter/amway/AmwaySuccessFragment.kt b/app/src/main/java/com/gh/gamecenter/amway/AmwaySuccessFragment.kt index ff834eed5d..b3e4814e76 100644 --- a/app/src/main/java/com/gh/gamecenter/amway/AmwaySuccessFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/amway/AmwaySuccessFragment.kt @@ -30,7 +30,15 @@ class AmwaySuccessFragment : NormalFragment() { setNavigationTitle("安利墙") checkCommentBtn.setOnClickListener { - GameDetailActivity.startGameDetailCommentActivity(requireContext(), mGameEntity, "安利墙") + if (mGameEntity != null) { + GameDetailActivity.startGameDetailCommentActivity( + requireContext(), + mGameEntity, + "安利墙" + ) + } else { + requireActivity().finish() + } } checkAmwayBtn.setOnClickListener { diff --git a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailActivity.kt index a79d0f88d9..f5d4c85b05 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumDetailActivity.kt @@ -32,6 +32,8 @@ class ForumDetailActivity : BaseActivity() { return Pair(intent.getStringExtra(EntranceUtils.KEY_BBS_ID) ?: "", "") } + override fun preventRecreateFragmentByFragmentManager(): Boolean = true + companion object { @JvmStatic fun getIntent(context: Context, bbsId: String, entrance: String): Intent { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt index 010955bf3f..618d980d5c 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.kt @@ -1299,7 +1299,9 @@ class GameDetailFragment : NormalFragment() { override fun onBackPressed(): Boolean { mOrientationUtils?.backToProtVideo() - if (mViewPager.currentItem == INDEX_TRENDES && fragmentsList[INDEX_TRENDES] is WebFragment) { + if (mViewPager.currentItem == INDEX_TRENDES + && fragmentsList[INDEX_TRENDES] is WebFragment + && fragmentsList[INDEX_TRENDES].isAdded) { return (fragmentsList[INDEX_TRENDES] as WebFragment).onBackPressed() } From efd81a4e0c1c0d5e25c6058da8c821b3358ad863 Mon Sep 17 00:00:00 2001 From: juntao Date: Thu, 26 Aug 2021 10:22:00 +0800 Subject: [PATCH 113/151] =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=8D=87=E7=BA=A7?= =?UTF-8?q?=E5=88=B0=205.1.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dependencies.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 2c8b67124d..0a2cfab4ed 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,8 +7,8 @@ ext { targetSdkVersion = 26 // application info (每个大版本之间的 versionCode 增加 20) - versionCode = 370 - versionName = "5.1.0" + versionCode = 371 + versionName = "5.1.1" applicationId = "com.gh.gamecenter" // AndroidX From bd8bda40ec9a99be85432617a5ddb52b23c5e942 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Thu, 26 Aug 2021 10:42:08 +0800 Subject: [PATCH 114/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E6=96=B0=E7=A4=BE=E5=8C=BA3=E6=9C=9F-?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E5=B1=95=E7=A4=BA-=E5=A4=B4=E5=83=8F?= =?UTF-8?q?=E4=BF=A1=E6=81=AF(0825=20=E4=BA=A7=E5=93=81=E9=AA=8C=E6=94=B6?= =?UTF-8?q?=E9=97=AE=E9=A2=982)=20https://git.ghzs.com/pm/halo-app-issues/?= =?UTF-8?q?-/issues/1406?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gamedetail/rating/RatingReplyAdapter.kt | 304 +++++++++++++----- 1 file changed, 225 insertions(+), 79 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt index b5209afb4c..4aed265c42 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingReplyAdapter.kt @@ -51,10 +51,12 @@ import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers -class RatingReplyAdapter(context: Context, - val entrance: String, - val viewModel: RatingReplyViewModel, - val replyCallback: (RatingReplyEntity?) -> Unit) : ListAdapter(context), IExposable { +class RatingReplyAdapter( + context: Context, + val entrance: String, + val viewModel: RatingReplyViewModel, + val replyCallback: (RatingReplyEntity?) -> Unit +) : ListAdapter(context), IExposable { private val ITEM_COMMENT = 211 private val ITEM_SECTION_TITLE = 212 @@ -64,7 +66,8 @@ class RatingReplyAdapter(context: Context, override fun setListData(updateData: MutableList?) { if (mEntityList.size > 0 && mEntityList[mEntityList.size - 1].reply == null - && updateData != null && updateData.size > 0 && updateData[updateData.size - 1].reply != null) { + && updateData != null && updateData.size > 0 && updateData[updateData.size - 1].reply != null + ) { mEntityList = ArrayList(updateData) notifyDataSetChanged() } else { @@ -149,12 +152,19 @@ class RatingReplyAdapter(context: Context, holder.binding.game = game holder.itemView.setOnClickListener { - GameDetailActivity.startGameDetailActivity(mContext, game, BaseActivity.mergeEntranceAndPath(entrance, path), mExposureEvent) + GameDetailActivity.startGameDetailActivity( + mContext, + game, + BaseActivity.mergeEntranceAndPath(entrance, path), + mExposureEvent + ) } holder.binding.gameDownload.run { - DownloadItemUtils.setOnClickListener(mContext, this, - game, 0, this@RatingReplyAdapter, - entrance, BaseActivity.mergeEntranceAndPath(entrance, path), mExposureEvent) + DownloadItemUtils.setOnClickListener( + mContext, this, + game, 0, this@RatingReplyAdapter, + entrance, BaseActivity.mergeEntranceAndPath(entrance, path), mExposureEvent + ) // 显示预约 if (game.isReservable) { @@ -202,13 +212,22 @@ class RatingReplyAdapter(context: Context, isClickable = false } } else if (game.getApk().size == 1) { - GameUtils.setDownloadBtnStatus(mContext, game, this, PluginLocation.only_game) - val downloadEntity = DownloadManager.getInstance(mContext).getDownloadEntityByUrl(game.getApk()[0].url) + GameUtils.setDownloadBtnStatus( + mContext, + game, + this, + PluginLocation.only_game + ) + val downloadEntity = DownloadManager.getInstance(mContext) + .getDownloadEntityByUrl(game.getApk()[0].url) if (downloadEntity != null) { if (downloadEntity.status == DownloadStatus.done) { setText(R.string.install) setTextColor(Color.WHITE) - if (downloadEntity.isPluggable && PackagesManager.isInstalled(downloadEntity.packageName)) { + if (downloadEntity.isPluggable && PackagesManager.isInstalled( + downloadEntity.packageName + ) + ) { setBackgroundResource(R.drawable.game_item_btn_plugin_style) } else { setBackgroundResource(R.drawable.game_item_btn_download_style) @@ -220,11 +239,21 @@ class RatingReplyAdapter(context: Context, setText(R.string.downloading) } setBackgroundResource(R.drawable.game_item_btn_downloading_style) - setTextColor(ContextCompat.getColorStateList(context, R.color.text_downloading_style)) + setTextColor( + ContextCompat.getColorStateList( + context, + R.color.text_downloading_style + ) + ) } } } else { - GameUtils.setDownloadBtnStatus(mContext, game, this, PluginLocation.only_game) + GameUtils.setDownloadBtnStatus( + mContext, + game, + this, + PluginLocation.only_game + ) } } } @@ -236,7 +265,10 @@ class RatingReplyAdapter(context: Context, root.setPadding(20F.dip2px(), 0, 0, 0) content.setExpandMaxLines(Int.MAX_VALUE) content.setOnLongClickListener(View.OnLongClickListener { - commentData.content.replace(RatingEditActivity.LABEL_REPLACE_REGEX.toRegex(), "").copyTextAndToast() + commentData.content.replace( + RatingEditActivity.LABEL_REPLACE_REGEX.toRegex(), + "" + ).copyTextAndToast() return@OnLongClickListener true }) comment.setOnClickListener { @@ -271,29 +303,75 @@ class RatingReplyAdapter(context: Context, val replyEntity = mEntityList[position].reply!! holder.binding.run { data = replyEntity - content.setTextWithHighlightedTextWrappedInsideWrapper(text = data?.content - ?: "", copyClickedText = true) + content.setTextWithHighlightedTextWrappedInsideWrapper( + text = data?.content + ?: "", copyClickedText = true + ) val parent = replyEntity.parent - userIcon.display(replyEntity.user.border, replyEntity.user.icon, replyEntity.user.auth?.icon) + userIcon.display( + replyEntity.user.border, + replyEntity.user.icon, + replyEntity.user.auth?.icon + ) if (parent != null) { val replyName: String val replyNameSpannable: SpannableStringBuilder if (replyEntity.user.badge != null && replyEntity.parent.user.badge == null) { replyName = "${replyEntity.user.name} 回复 ${parent.user.name}" - replyNameSpannable = SpanBuilder(replyName).color(mContext, replyEntity.user.name!!.length + 4, replyEntity.user.name!!.length + 6, R.color.text_9a9a9a).build() - setBadgeSpan(replyEntity.user, replyNameSpannable, replyEntity.user.name!!.length + 1, replyEntity.user.name!!.length + 2) + replyNameSpannable = SpanBuilder(replyName).color( + mContext, + replyEntity.user.name!!.length + 4, + replyEntity.user.name!!.length + 6, + R.color.text_9a9a9a + ).build() + setBadgeSpan( + replyEntity.user, + replyNameSpannable, + replyEntity.user.name!!.length + 1, + replyEntity.user.name!!.length + 2 + ) } else if (replyEntity.user.badge == null && replyEntity.parent.user.badge != null) { replyName = "${replyEntity.user.name} 回复 ${parent.user.name} " - replyNameSpannable = SpanBuilder(replyName).color(mContext, replyEntity.user.name!!.length + 1, replyEntity.user.name!!.length + 4, R.color.text_9a9a9a).build() - setBadgeSpan(parent.user, replyNameSpannable, replyEntity.user.name!!.length + parent.user.name!!.length + 5, replyEntity.user.name!!.length + parent.user.name!!.length + 6) + replyNameSpannable = SpanBuilder(replyName).color( + mContext, + replyEntity.user.name!!.length + 1, + replyEntity.user.name!!.length + 4, + R.color.text_9a9a9a + ).build() + setBadgeSpan( + parent.user, + replyNameSpannable, + replyEntity.user.name!!.length + parent.user.name!!.length + 5, + replyEntity.user.name!!.length + parent.user.name!!.length + 6 + ) } else if (replyEntity.user.badge != null && replyEntity.parent.user.badge != null) { replyName = "${replyEntity.user.name} 回复 ${parent.user.name} " - replyNameSpannable = SpanBuilder(replyName).color(mContext, replyEntity.user.name!!.length + 4, replyEntity.user.name!!.length + 6, R.color.text_9a9a9a).build() - setBadgeSpan(replyEntity.user, replyNameSpannable, replyEntity.user.name!!.length + 1, replyEntity.user.name!!.length + 2) - setBadgeSpan(parent.user, replyNameSpannable, replyEntity.user.name!!.length + parent.user.name!!.length + 8, replyEntity.user.name!!.length + parent.user.name!!.length + 9) + replyNameSpannable = SpanBuilder(replyName).color( + mContext, + replyEntity.user.name!!.length + 4, + replyEntity.user.name!!.length + 6, + R.color.text_9a9a9a + ).build() + setBadgeSpan( + replyEntity.user, + replyNameSpannable, + replyEntity.user.name!!.length + 1, + replyEntity.user.name!!.length + 2 + ) + setBadgeSpan( + parent.user, + replyNameSpannable, + replyEntity.user.name!!.length + parent.user.name!!.length + 8, + replyEntity.user.name!!.length + parent.user.name!!.length + 9 + ) } else { replyName = "${replyEntity.user.name} 回复 ${parent.user.name}" - replyNameSpannable = SpanBuilder(replyName).color(mContext, replyEntity.user.name!!.length + 1, replyEntity.user.name!!.length + 4, R.color.text_9a9a9a).build() + replyNameSpannable = SpanBuilder(replyName).color( + mContext, + replyEntity.user.name!!.length + 1, + replyEntity.user.name!!.length + 4, + R.color.text_9a9a9a + ).build() userName.text = replyNameSpannable } sdvUserBadge.visibility = View.GONE @@ -311,9 +389,20 @@ class RatingReplyAdapter(context: Context, } } sdvUserBadge.setOnClickListener { - MtaHelper.onEvent("进入徽章墙_用户记录", "游戏评论详情", "${replyEntity.user.name}(${replyEntity.user.id})") - MtaHelper.onEvent("徽章中心", "进入徽章中心", "游戏评论详情") - DirectUtils.directToBadgeWall(mContext, replyEntity.user.id, replyEntity.user.name, replyEntity.user.icon) + DialogUtils.showViewBadgeDialog(mContext, replyEntity.user.badge) { + MtaHelper.onEvent( + "进入徽章墙_用户记录", + "游戏评论详情", + "${replyEntity.user.name}(${replyEntity.user.id})" + ) + MtaHelper.onEvent("徽章中心", "进入徽章中心", "游戏评论详情") + DirectUtils.directToBadgeWall( + mContext, + replyEntity.user.id, + replyEntity.user.name, + replyEntity.user.icon + ) + } } tvBadgeName.setOnClickListener { sdvUserBadge.performClick() } @@ -327,7 +416,8 @@ class RatingReplyAdapter(context: Context, }) } else { viewModel.voteReply(replyEntity.id, false, callback = { - vote.text = if (replyEntity.vote == 0) "" else (replyEntity.vote).toString() + vote.text = + if (replyEntity.vote == 0) "" else (replyEntity.vote).toString() vote.isChecked = false }) } @@ -354,54 +444,97 @@ class RatingReplyAdapter(context: Context, isChildLongClick = false return@setOnClickListener } - OptionDialogHelper.showOptionDialog(mContext, dialogTypeList, callback = { type -> - when (type) { - "复制" -> { - replyEntity.content.replace(RatingEditActivity.LABEL_REPLACE_REGEX.toRegex(), "").copyTextAndToast() - } - "投诉" -> { - mContext.ifLogin("游戏详情-评分-评论详情- 投诉评论") { - DialogUtils.showReportReasonDialog(mContext, + OptionDialogHelper.showOptionDialog( + mContext, + dialogTypeList, + callback = { type -> + when (type) { + "复制" -> { + replyEntity.content.replace( + RatingEditActivity.LABEL_REPLACE_REGEX.toRegex(), + "" + ).copyTextAndToast() + } + "投诉" -> { + mContext.ifLogin("游戏详情-评分-评论详情- 投诉评论") { + DialogUtils.showReportReasonDialog( + mContext, Constants.REPORT_LIST.toList() as java.util.ArrayList ) { reason, desc -> SimpleRequestHelper.reportGameCommentReply( mEntityList[0].game!!.id, mEntityList[1].comment!!.id, - replyEntity.id, if (reason != "其他原因") reason else desc) + replyEntity.id, + if (reason != "其他原因") reason else desc + ) } + } + } + "回复" -> { + replyCallback.invoke(replyEntity) } } - "回复" -> { - replyCallback.invoke(replyEntity) - } - } - }) + }) } content.setOnLongClickListener(View.OnLongClickListener { isChildLongClick = true - replyEntity.content.replace(RatingEditActivity.LABEL_REPLACE_REGEX.toRegex(), "").copyTextAndToast() + replyEntity.content.replace( + RatingEditActivity.LABEL_REPLACE_REGEX.toRegex(), + "" + ).copyTextAndToast() return@OnLongClickListener true }) userIcon.setOnClickListener { - DirectUtils.directToHomeActivity(mContext, replyEntity.user.id, entrance, path) + DirectUtils.directToHomeActivity( + mContext, + replyEntity.user.id, + entrance, + path + ) } userName.setOnClickListener { - DirectUtils.directToHomeActivity(mContext, replyEntity.user.id, entrance, path) + DirectUtils.directToHomeActivity( + mContext, + replyEntity.user.id, + entrance, + path + ) } } } is ListSectionItemViewHolder -> { val title = "全部回复 ${mEntityList[position].replyCount}" - holder.sectionTitle.text = SpanBuilder(title).color(5, title.length, "#80333333").build() + holder.sectionTitle.text = + SpanBuilder(title).color(5, title.length, "#80333333").build() holder.sortPositive.setOnClickListener { - holder.sortNegative.setTextColor(ContextCompat.getColor(mContext, R.color.title)) - holder.sortPositive.setTextColor(ContextCompat.getColor(mContext, R.color.theme_font)) + holder.sortNegative.setTextColor( + ContextCompat.getColor( + mContext, + R.color.title + ) + ) + holder.sortPositive.setTextColor( + ContextCompat.getColor( + mContext, + R.color.theme_font + ) + ) viewModel.sortList(RatingReplyViewModel.SORT_POSITIVE) } holder.sortNegative.setOnClickListener { - holder.sortNegative.setTextColor(ContextCompat.getColor(mContext, R.color.theme_font)) - holder.sortPositive.setTextColor(ContextCompat.getColor(mContext, R.color.title)) + holder.sortNegative.setTextColor( + ContextCompat.getColor( + mContext, + R.color.theme_font + ) + ) + holder.sortPositive.setTextColor( + ContextCompat.getColor( + mContext, + R.color.title + ) + ) viewModel.sortList(RatingReplyViewModel.SORT_NEGATION) } } @@ -442,34 +575,44 @@ class RatingReplyAdapter(context: Context, } @SuppressLint("CheckResult") - private fun RatingReplyItemBinding.setBadgeSpan(user: UserEntity, replyNameSpannable: SpannableStringBuilder, startIndex: Int, endIndex: Int) { + private fun RatingReplyItemBinding.setBadgeSpan( + user: UserEntity, + replyNameSpannable: SpannableStringBuilder, + startIndex: Int, + endIndex: Int + ) { Single.just(user.badge?.icon) - .map { - Picasso.with(mContext).load(Uri.parse(it)).priority(Picasso.Priority.HIGH).get() - }.subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe({ - val bitmapDrawable = BitmapDrawable(mContext.resources, it) - bitmapDrawable.setBounds(0, 0, 16F.dip2px(), 16F.dip2px()) - replyNameSpannable.setSpan(CenterImageSpan(bitmapDrawable), startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) - replyNameSpannable.setSpan(object : ClickableSpan() { - override fun updateDrawState(ds: TextPaint) { - super.updateDrawState(ds) - ds.isUnderlineText = false - } + .map { + Picasso.with(mContext).load(Uri.parse(it)).priority(Picasso.Priority.HIGH).get() + }.subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe({ + val bitmapDrawable = BitmapDrawable(mContext.resources, it) + bitmapDrawable.setBounds(0, 0, 16F.dip2px(), 16F.dip2px()) + replyNameSpannable.setSpan( + CenterImageSpan(bitmapDrawable), + startIndex, + endIndex, + Spanned.SPAN_EXCLUSIVE_EXCLUSIVE + ) + replyNameSpannable.setSpan(object : ClickableSpan() { + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.isUnderlineText = false + } - override fun onClick(widget: View) { - MtaHelper.onEvent("进入徽章墙_用户记录", "游戏评论详情", "${user.name}(${user.id})") - MtaHelper.onEvent("徽章中心", "进入徽章中心", "游戏评论详情") - DirectUtils.directToBadgeWall(mContext, user.id, user.name, user.icon) - } + override fun onClick(widget: View) { + MtaHelper.onEvent("进入徽章墙_用户记录", "游戏评论详情", "${user.name}(${user.id})") + MtaHelper.onEvent("徽章中心", "进入徽章中心", "游戏评论详情") + DirectUtils.directToBadgeWall(mContext, user.id, user.name, user.icon) + } - }, startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) - userName.movementMethod = CustomLinkMovementMethod.getInstance() - userName.text = replyNameSpannable - }, { - it.printStackTrace() - }) + }, startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + userName.movementMethod = CustomLinkMovementMethod.getInstance() + userName.text = replyNameSpannable + }, { + it.printStackTrace() + }) } fun handleSyncData(requestCode: Int, intent: Intent?) { @@ -497,6 +640,9 @@ class RatingReplyAdapter(context: Context, return null } - class RatingReplyHeadItemViewHolder(val binding: RatingReplyHeadItemBinding) : BaseRecyclerViewHolder(binding.root) - class RatingReplyItemViewHolder(val binding: RatingReplyItemBinding) : BaseRecyclerViewHolder(binding.root) + class RatingReplyHeadItemViewHolder(val binding: RatingReplyHeadItemBinding) : + BaseRecyclerViewHolder(binding.root) + + class RatingReplyItemViewHolder(val binding: RatingReplyItemBinding) : + BaseRecyclerViewHolder(binding.root) } \ No newline at end of file From a06e6c581d08b88d9927bda71992ca998e115849 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Thu, 26 Aug 2021 11:04:52 +0800 Subject: [PATCH 115/151] =?UTF-8?q?=E4=BC=98=E5=8C=96=E5=BC=80=E6=B5=8B?= =?UTF-8?q?=E8=A1=A8=E5=8A=A0=E8=BD=BD=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/databind/BindingAdapters.java | 11 ++++++----- .../gh/gamecenter/retrofit/service/ApiService.java | 7 ------- .../gamecenter/servers/GameServersContentFragment.kt | 3 +-- .../gamecenter/servers/GameServersContentViewModel.kt | 2 +- 4 files changed, 8 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/gh/common/databind/BindingAdapters.java b/app/src/main/java/com/gh/common/databind/BindingAdapters.java index a8fa7a81d8..2a429ff747 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -772,12 +772,13 @@ public class BindingAdapters { typeTag.setBackground("FFF3E0"); typeTag.setColor("FA8500"); tagStyle.add(typeTag); + + TagStyleEntity timeTag = new TagStyleEntity(); + timeTag.setName(GameViewUtils.getGameTestDate(test.getStart())); + timeTag.setBackground("E0FFF9"); + timeTag.setColor("00A887"); + tagStyle.add(timeTag); } -// TagStyleEntity timeTag = new TagStyleEntity(); -// timeTag.setName(GameViewUtils.getGameTestDate(test.getStart())); -// timeTag.setBackground("E0FFF9"); -// timeTag.setColor("00A887"); -// tagStyle.add(timeTag); } else { tagStyle = gameEntity.getTagStyle(); } 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 651e91b499..4b139792e8 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 @@ -384,13 +384,6 @@ public interface ApiService { // @GET("settings") // Observable getHotSearch(); - /** - * 获取开服表数据 - */ - @GET("games/servers") - Observable> getKaiFuData(@Query("filter") String type, @Query("page") int page); - - /** * 获取开服表数据 */ diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt index 1e118f5361..41527d616f 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentFragment.kt @@ -120,8 +120,7 @@ class GameServersContentFragment : BaseFragment() { mAdapter?.loadChange(Pair("down", LoadStatus.INIT)) loadData(action = "down") } - } - if (mLayoutManager?.findLastVisibleItemPosition() == mAdapter!!.itemCount - 1 + } else if (mLayoutManager?.findLastVisibleItemPosition() == mAdapter!!.itemCount - 1 && newState == RecyclerView.SCROLL_STATE_IDLE && !mAdapter!!.isNextOver() && !mAdapter!!.isNextLoading()) { diff --git a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt index ebf57508c9..6a26ee7df5 100644 --- a/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/servers/GameServersContentViewModel.kt @@ -191,7 +191,7 @@ class GameServersContentViewModel(application: Application) isInit = false when { -// data.size < 20 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_OVER)) + data.size < 10 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_OVER)) list.size == 0 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_EMPTY)) list.size > 0 -> loadStatusLiveData.postValue(Pair(action, LoadStatus.INIT_LOADED)) } From 6cfeddf3d4b56e2ba2c9549a88f8dec8467c236b Mon Sep 17 00:00:00 2001 From: juntao Date: Thu, 26 Aug 2021 11:43:38 +0800 Subject: [PATCH 116/151] =?UTF-8?q?=E5=A4=84=E7=90=86=E9=A6=96=E9=A1=B5=20?= =?UTF-8?q?debug=20=E7=8A=B6=E6=80=81=E9=97=AA=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt index a47d14fcc0..b34dbccaa7 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt @@ -343,6 +343,8 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { // 避免部分被内嵌的 Fragment 不能正常运作 if (mFragmentList.size > mLastSelectedPosition) { val fragment: Fragment = mFragmentList[mLastSelectedPosition] + if (!fragment.isAdded) return@tryCatchInRelease + fragment.onPause() val childFragmentManager = fragment.childFragmentManager val fragments = childFragmentManager.fragments @@ -352,6 +354,8 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { } if (mFragmentList.size > currentSelectedPosition) { val fragment: Fragment = mFragmentList[currentSelectedPosition] + if (!fragment.isAdded) return@tryCatchInRelease + fragment.onResume() val childFragmentManager = fragment.childFragmentManager val fragments = childFragmentManager.fragments From 882d7273a186aacb9750c0a9cfe7e9391a30264b Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Thu, 26 Aug 2021 16:26:38 +0800 Subject: [PATCH 117/151] =?UTF-8?q?=E3=80=90=E5=85=89=E7=8E=AF=E5=8A=A9?= =?UTF-8?q?=E6=89=8BV5.2.0=E3=80=91=E9=A6=96=E9=A1=B5=E8=BD=AE=E6=92=AD?= =?UTF-8?q?=E5=9B=BE=E6=98=BE=E7=A4=BA=E8=83=8C=E6=99=AF=E8=89=B2=E5=8A=9F?= =?UTF-8?q?=E8=83=BD(20210826=E6=B5=8B=E8=AF=95=E9=97=AE=E9=A2=981)=20http?= =?UTF-8?q?s://git.ghzs.com/pm/halo-app-issues/-/issues/1321?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fragment/HomeSearchToolWrapperFragment.kt | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt index a47d14fcc0..c3ea0a8b1a 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/fragment/HomeSearchToolWrapperFragment.kt @@ -310,7 +310,7 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { mHomeTab?.primaryColor = Color.WHITE mHomeTab?.useLightStyle = false mIsDisplayingLightContent = false - changeAppBarColor(Color.WHITE) + updateAppBarColorWhenScrollChanged(Color.WHITE) DisplayUtils.setLightStatusBar(requireActivity(), !mIsDisplayingLightContent) mTabSelectedColor = TAB_SELECTED_COLOR mTabDefaultColor = TAB_DEFAULT_COLOR @@ -321,7 +321,7 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { mHomeTab?.primaryColor = mCurrentSelectBannerColor mHomeTab?.useLightStyle = true mIsDisplayingLightContent = true - changeAppBarColor(mCurrentSelectBannerColor) + updateAppBarColorWhenScrollChanged(mCurrentSelectBannerColor) DisplayUtils.setLightStatusBar(requireActivity(), !mIsDisplayingLightContent) mTabSelectedColor = TAB_DEFAULT_COLOR_LIGHT mTabDefaultColor = TAB_DEFAULT_COLOR_LIGHT @@ -329,7 +329,7 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { } } - fun changeAppBarColor(color: Int) { + private fun updateAppBarColorWhenScrollChanged(color: Int) { if (color != Color.WHITE) { mCurrentSelectBannerColor = color mHomeTab?.primaryColor = mCurrentSelectBannerColor @@ -337,6 +337,14 @@ class HomeSearchToolWrapperFragment : SearchToolWrapperFragment() { updateAppBarStyle(color, color != Color.WHITE) } + fun changeAppBarColor(color: Int) { + mCurrentSelectBannerColor = color + if (mIsBannerShow) { + mHomeTab?.primaryColor = mCurrentSelectBannerColor + updateAppBarStyle(color, color != Color.WHITE) + } + } + private fun notifyChildFragmentLifecycle(currentSelectedPosition: Int) { tryCatchInRelease { // 补充 Viewpager Fragment 的生命周期, 先调用旧选中 fragment 的 onPause 再当前的 onResume From bf90131841e862edc62f375e1505d2d82d7f57b0 Mon Sep 17 00:00:00 2001 From: juntao Date: Thu, 26 Aug 2021 17:22:39 +0800 Subject: [PATCH 118/151] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=BC=80=E6=9C=8D?= =?UTF-8?q?=E8=A1=A8=E7=9B=B8=E5=85=B3=E4=BC=98=E5=8C=96(0826=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E7=AC=AC7=E7=82=B9)=20https://git.ghzs.com/pm/halo-ap?= =?UTF-8?q?p-issues/-/issues/1220?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../catalog/NewCatalogListAdapter.kt | 2 - .../catalog/NewCatalogListViewModel.kt | 1 + .../category2/CategoryV2ListAdapter.kt | 2 - .../category2/CategoryV2ListViewModel.kt | 1 + .../com/gh/gamecenter/entity/GameEntity.kt | 553 ++++++++++-------- .../mygame/MyFollowedGameAdapter.kt | 1 - .../mygame/MyFollowedGameViewModel.kt | 1 + .../gamecenter/mygame/MyReservationAdapter.kt | 2 - .../mygame/MyReservationViewModel.kt | 2 +- .../gh/gamecenter/mygame/PlayedGameAdapter.kt | 2 - .../gamecenter/mygame/PlayedGameViewModel.kt | 5 +- app/src/main/res/layout/game_item.xml | 6 +- 12 files changed, 302 insertions(+), 276 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListAdapter.kt b/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListAdapter.kt index daa164d8e1..f04f58f077 100644 --- a/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListAdapter.kt @@ -19,7 +19,6 @@ import com.gh.gamecenter.R import com.gh.gamecenter.adapter.viewholder.FooterViewHolder import com.gh.gamecenter.adapter.viewholder.GameViewHolder import com.gh.gamecenter.baselist.ListAdapter -import com.gh.gamecenter.baselist.LoadType import com.gh.gamecenter.entity.GameEntity import com.gh.gamecenter.eventbus.EBDownloadStatus import com.gh.gamecenter.game.GameItemViewHolder @@ -89,7 +88,6 @@ class NewCatalogListAdapter(context: Context, holder.binding.game = gameEntity holder.initServerType(gameEntity) - holder.binding.hideSize = true holder.binding.executePendingBindings() GameViewUtils.setLabelList(mContext, holder.binding.labelList, gameEntity.tagStyle) diff --git a/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListViewModel.kt b/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListViewModel.kt index 967577ca10..40af2225c1 100644 --- a/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/catalog/NewCatalogListViewModel.kt @@ -37,6 +37,7 @@ class NewCatalogListViewModel(application: Application) : ListViewModel game.hideSizeInsideDes = true } ExposureUtils.updateExposureSequence(it) mResultLiveData.postValue(it) } diff --git a/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListAdapter.kt b/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListAdapter.kt index ecd9c28efa..31cf755d13 100644 --- a/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListAdapter.kt @@ -1,7 +1,6 @@ package com.gh.gamecenter.category2 import android.content.Context -import android.graphics.Typeface import android.util.SparseArray import android.view.ViewGroup import androidx.databinding.DataBindingUtil @@ -122,7 +121,6 @@ class CategoryV2ListAdapter(context: Context, holder.binding.game = gameEntity holder.initServerType(gameEntity) - holder.binding.hideSize = true holder.binding.executePendingBindings() GameViewUtils.setLabelList(mContext, holder.binding.labelList, gameEntity.tagStyle) diff --git a/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListViewModel.kt b/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListViewModel.kt index ec6885bf61..ba37ae3f18 100644 --- a/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/category2/CategoryV2ListViewModel.kt @@ -38,6 +38,7 @@ class CategoryV2ListViewModel(application: Application, override fun mergeResultLiveData() { mResultLiveData.addSource(mListLiveData) { ExposureUtils.updateExposureSequence(it) + it.forEach { game -> game.hideSizeInsideDes = true } mResultLiveData.postValue(it) } } diff --git a/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt index 4485e1ad7e..3b210771ef 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt @@ -1,6 +1,7 @@ package com.gh.gamecenter.entity import android.os.Parcelable +import android.text.TextUtils import com.gh.common.constant.Config import com.gh.common.constant.Constants import com.gh.common.exposure.ExposureEvent @@ -19,239 +20,239 @@ import kotlin.collections.ArrayList @Parcelize data class GameEntity( - @SerializedName("_id") - var id: String = "", - @SerializedName("icon") - private var mIcon: String? = null, - @SerializedName("ori_icon") - private var mRawIcon: String? = null, - @SerializedName("name") - private var mName: String? = null, // 将 name 变成私有 mName 调用 name 时直接拼接成 mName + nameSuffix - @SerializedName("name_suffix") - var nameSuffix: String = "", - @SerializedName("brief") - private var mBrief: String? = null, + @SerializedName("_id") + var id: String = "", + @SerializedName("icon") + private var mIcon: String? = null, + @SerializedName("ori_icon") + private var mRawIcon: String? = null, + @SerializedName("name") + private var mName: String? = null, // 将 name 变成私有 mName 调用 name 时直接拼接成 mName + nameSuffix + @SerializedName("name_suffix") + var nameSuffix: String = "", + @SerializedName("brief") + private var mBrief: String? = null, - @SerializedName("appointment") - private var mReservable: Boolean = false, // 此游戏是否处于可预约状态 - @SerializedName("appointment_button") - var reserveStatus: String = "", // 预约状态供用户预约列表使用,值存在的话,有两种值 -> appointment(已预约), download(已上线) + @SerializedName("appointment") + private var mReservable: Boolean = false, // 此游戏是否处于可预约状态 + @SerializedName("appointment_button") + var reserveStatus: String = "", // 预约状态供用户预约列表使用,值存在的话,有两种值 -> appointment(已预约), download(已上线) - // 插件标签 - private var tag: ArrayList? = null, - private var apk: ArrayList? = null, - @SerializedName("apk_normal") - private var apkNormal: ArrayList? = null, - @SerializedName("apk_search") - var apkSearch: ArrayList? = null, + // 插件标签 + private var tag: ArrayList? = null, + private var apk: ArrayList? = null, + @SerializedName("apk_normal") + private var apkNormal: ArrayList? = null, + @SerializedName("apk_search") + var apkSearch: ArrayList? = null, - @SerializedName("apk_index") - var apkIndex: ArrayList? = null, + @SerializedName("apk_index") + var apkIndex: ArrayList? = null, - var collection: ArrayList = ArrayList(), - var slide: String? = null, - var test: TestEntity? = null, + var collection: ArrayList = ArrayList(), + var slide: String? = null, + var test: TestEntity? = null, - @SerializedName("d_button_add_word") - private var mDownloadAddWord: String? = null, + @SerializedName("d_button_add_word") + private var mDownloadAddWord: String? = null, - var image: String? = null, - var type: String? = null, - var isPluggable: Boolean = false, - var link: String? = null, - var text: String? = "", - @SerializedName("link_community", alternate = ["community"]) - var community: CommunityEntity? = CommunityEntity(), - var display: Display? = null, + var image: String? = null, + var type: String? = null, + var isPluggable: Boolean = false, + var link: String? = null, + var text: String? = "", + @SerializedName("link_community", alternate = ["community"]) + var community: CommunityEntity? = CommunityEntity(), + var display: Display? = null, - @SerializedName("apk_link") - var apkLink: ArrayList? = null, + @SerializedName("apk_link") + var apkLink: ArrayList? = null, - @SerializedName("concern_article_exists") - var isNewsExists: Boolean = true, + @SerializedName("concern_article_exists") + var isNewsExists: Boolean = true, - @SerializedName("download_off_text") - private var mDownloadOffText: String? = null, + @SerializedName("download_off_text") + private var mDownloadOffText: String? = null, - @SerializedName("download_off_status") - private var mDownloadOffStatus: String? = null, // "off/dialog/toast", 只关闭、关闭且弹窗、关闭且toast + @SerializedName("download_off_status") + private var mDownloadOffStatus: String? = null, // "off/dialog/toast", 只关闭、关闭且弹窗、关闭且toast - @SerializedName("download_off_dialog") - private var mDownloadOffDialog: Dialog? = null, + @SerializedName("download_off_dialog") + private var mDownloadOffDialog: Dialog? = null, - @SerializedName("libao_exists") - var isLibaoExists: Boolean = false, + @SerializedName("libao_exists") + var isLibaoExists: Boolean = false, - @SerializedName("server_remark") - var serverRemark: String? = null, + @SerializedName("server_remark") + var serverRemark: String? = null, - @SerializedName("server_type") - var serverType: String? = null, + @SerializedName("server_type") + var serverType: String? = null, - @SerializedName("server_label") - var serverLabel: ColorEntity? = null, + @SerializedName("server_label") + var serverLabel: ColorEntity? = null, - @SerializedName("server") - var serverEntity: ServerCalendarEntity? = null, + @SerializedName("server") + var serverEntity: ServerCalendarEntity? = null, - @SerializedName("server_genre") - var serverGenre: String? = null, + @SerializedName("server_genre") + var serverGenre: String? = null, - @SerializedName("remaining_server") - var serverRemaining: List? = null, + @SerializedName("remaining_server") + var serverRemaining: List? = null, - var kaifuTimeHint: Long? = null, + var kaifuTimeHint: Long? = null, - var subjectData: GameSubjectData? = null, + var subjectData: GameSubjectData? = null, - // 所有标签(插件标签和游戏标签) - @SerializedName(value = "tag_style", alternate = arrayOf("new_tag_style")) - private var mTagStyle: ArrayList = ArrayList(), - var des: String? = null, - // 用来标记在专题中的序号,仅用于曝光记录 - var sequence: Int? = -1, - // 用来标记在外部页面中的序号,仅用于曝光记录,具体细节可见 https://git.ghzs.com/pm/halo-app-issues/-/issues/1087 - var outerSequence: Int? = -1, - // 用来标记平台名称,仅用于曝光记录 - var platform: String? = "", + // 所有标签(插件标签和游戏标签) + @SerializedName(value = "tag_style", alternate = arrayOf("new_tag_style")) + private var mTagStyle: ArrayList = ArrayList(), + var des: String? = null, + // 用来标记在专题中的序号,仅用于曝光记录 + var sequence: Int? = -1, + // 用来标记在外部页面中的序号,仅用于曝光记录,具体细节可见 https://git.ghzs.com/pm/halo-app-issues/-/issues/1087 + var outerSequence: Int? = -1, + // 用来标记平台名称,仅用于曝光记录 + var platform: String? = "", - // 用来标记下载的类型,仅用于曝光记录 - @SerializedName("download_type") - var downloadType: String? = "", + // 用来标记下载的类型,仅用于曝光记录 + @SerializedName("download_type") + var downloadType: String? = "", - // 用来标记下载完成的类型,仅用于曝光记录 - @SerializedName("download_complete_type") - var downloadCompleteType: String? = "", + // 用来标记下载完成的类型,仅用于曝光记录 + @SerializedName("download_complete_type") + var downloadCompleteType: String? = "", - // 用于开服表标记是否为置顶项目 - @SerializedName("is_fixed_top") - var fixedTop: Boolean? = false, - var fixedTopHint: Boolean? = false, + // 用于开服表标记是否为置顶项目 + @SerializedName("is_fixed_top") + var fixedTop: Boolean? = false, + var fixedTopHint: Boolean? = false, - @SerializedName("download_notice") - val downloadAd: LinkEntity? = null, + @SerializedName("download_notice") + val downloadAd: LinkEntity? = null, - // 社区名字,用于首页替换游戏曝光时使用 - var subjectName: String? = null, + // 社区名字,用于首页替换游戏曝光时使用 + var subjectName: String? = null, - // 关联应用,供首页替换游戏确定该游戏是否应该被替换使用 - @SerializedName("relation_game_ids") - var relatedGameIds: ArrayList? = arrayListOf(), + // 关联应用,供首页替换游戏确定该游戏是否应该被替换使用 + @SerializedName("relation_game_ids") + var relatedGameIds: ArrayList? = arrayListOf(), - @SerializedName("download_dialog") - var downloadDialog: ArrayList

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 W-f$Lr^d!Il00000000000000P1_Vj~ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/bg_energy_house.webp b/app/src/main/res/drawable-xxhdpi/bg_energy_house.webp index aab0b724e17262f839f6575c1db66c831db34b43..3457cb9ef9671dbf4f04b8981206078c79d1ab85 100644 GIT binary patch literal 31496 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 z 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 AD*ylh diff --git a/app/src/main/res/drawable-xxhdpi/ic_energy_center_invite.webp b/app/src/main/res/drawable-xxhdpi/ic_energy_center_invite.webp deleted file mode 100644 index 906d17e40dcf1a31fefc3e4571e4d9d8b6f65a8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5322 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 diff --git a/app/src/main/res/drawable-xxhdpi/ic_energy_center_more.webp b/app/src/main/res/drawable-xxhdpi/ic_energy_center_more.webp deleted file mode 100644 index 93b2b9800bb3da0857b9f3350950028b35d8c30b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2042 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 Y8!D=OT`mz}pl^;BeV9)&AQG5>0H*Qsa{vGU diff --git a/app/src/main/res/drawable-xxhdpi/ic_energy_center_sign.webp b/app/src/main/res/drawable-xxhdpi/ic_energy_center_sign.webp deleted file mode 100644 index 23b0c7ad870d16b598bc9799ac6632510fc621b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17000 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 CjBH^5 diff --git a/app/src/main/res/drawable-xxhdpi/ic_energy_center_sign_normal.webp b/app/src/main/res/drawable-xxhdpi/ic_energy_center_sign_normal.webp deleted file mode 100644 index 0e77584516c20d77b2a63a24492d5ff78bc4c07b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4120 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 ATmS$7 diff --git a/app/src/main/res/drawable-xxhdpi/ic_energy_center_top_energy.webp b/app/src/main/res/drawable-xxhdpi/ic_energy_center_top_energy.webp deleted file mode 100644 index 301c6aa82f1dc8f2bb05049367670ad12da5590c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1444 zcmV;V1zY-3Nk>1pok7MM6+kP&il$0000G0000l001ul06|PpNI3xj00BqAFp{Li zK^k~>*NBLKWDxOmvS#?p!*})~6}7nl1H?v>6iL&)$IQ&w{+sx)dspi~PDKA5xosm! zX7AlIr=+UhkjfZNYW9bV_2GKY9M+3rznRP-edZ^rGhLpe)Ok7W@JS57b9=sx4{T|B zHh_v`8ngW?KEi(1Ft1EOYx$0kv20mU5`*k%u!*lQFfV}rNt1JY={%t<*~ho|8e=d1 z#Ti^e;4;Af9a@`^pk;sJ&1Hxz@r03Q&k$ke2DJAfvu}f^`6FZ=B)9G^gmze(zCws; zYOX?RMgJ61r~W9!SY$EQS&U;Ao{f+(;{U7P;WEf(@p1RJ__mRF&<>NpN zS`xu-EwSTn|Xk=6;lZz#f8rS^uCP1wXc*vEKlH$v>rk-MqH?f8&=So>gza zen)M9dYb;%`6ZD__~oiW_Z_ky{NMYx^1s`E=6@SM%6=ev{rUs_Z{=6eNASPn|J^?* z|GfYI|E=N!^_$pp^i)w8KV~5vwOKb8#n0qz!XMSCE|=Eh&so6s7cC&fg1+vu0wk6X zkoi>{U19)p_h)fjJP$eqSPuX2?0p~r0RI2j`Feliy;FDoD{^Pw_p6t0+w~0 z-KZG!AW>fe>({)Dq4;;txjKE^J+t_<8yXpeh~Sgiu`*Ztxw~M8L(gZk5{HIE{0pyi zc{K0+ecc2)g~cO)`FPD9_M!NWXhN_B74}A(;y&LISyQu>1y7~%)O)Llr;PY`>km^+ z;P9lX1Js>wIY-Ywgh1WmPNVG+r2d0CfrA0T#97~=@pmB`(7~R8{YJ*Hena6p(K0+L zT50%)hV*Nbjjm9#?Ih+OxwGy*TTllNnZYB?y!%M>hi-WUH)iMNajcL4coQiq6Te`u zzW|ga5GB`7=~gM0GtA|`&~4z4opk^bp#wKJxBc4ZqT$KeAgb{{-PSIEzwy+$5c3v@ z(c#NqSwmd$v+j9sPy)e4!20`DDN~%{RZst_?x`y!jf7%S2k7~j(r15X1?q6jUcsgLT{(}yyG!%b}<3|2^o zpEVF8lG+8WVDJl*hHT%{fG}d5-1QcpM@umRN)}5}9DdgI;Da#$$-^P^?V&+EU-1w9 zMs>8(Tk4T8QC-0^acuwd7gT*2Q2bYSEI8vLfmIU+pz=QGIkCU~lC&q^{&(W{Ovfbe z%XtwX&8K5S(w4x?mGISBQLCMHf8zPC+~nMjnt@z-7g|PV|1Y|LH49v_u%bsxmc;W% y^yfs1OCyiVGlw%8V`Jc6j$8CkJ|iQUV_a6N6x>0~ZIa(BB)xRUyCX-Spa1}P`sH8% diff --git a/app/src/main/res/drawable-xxhdpi/ic_exchange_commodity.webp b/app/src/main/res/drawable-xxhdpi/ic_exchange_commodity.webp deleted file mode 100644 index e6c3cc2e7617c330911b2f933e21d788ad741cff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6850 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 diff --git a/app/src/main/res/drawable-xxhdpi/ic_lottery_paradise.webp b/app/src/main/res/drawable-xxhdpi/ic_lottery_paradise.webp deleted file mode 100644 index 312e8ce3da1fb932990a2581da5ab22df418cb51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7794 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/bg_bottom_sheet_expanded.webp b/app/src/main/res/drawable-xxxhdpi/bg_bottom_sheet_expanded.webp new file mode 100644 index 0000000000000000000000000000000000000000..aa5370f8d0927a1f364d0a83b019d0f43a15c371 GIT binary patch literal 16960 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 Qu1Ls#1315f!6eYX0YY$;$^ZZW literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/bg_commodity_cover.webp b/app/src/main/res/drawable-xxxhdpi/bg_commodity_cover.webp new file mode 100644 index 0000000000000000000000000000000000000000..9108acd695e816912cfaaaedafc5062e9eaebad9 GIT binary patch literal 1226 zcmWIYbaOkz!oU#j>J$(bU=hK^z`!5?#Pv)J%}flAJ^>!ej0_Bnl8Z8>SMB~EfA2|( z%YSu+OVVO7@&(zq!$Na)lxkCs++tA;P_n_2jpU zi76?CJ(`k!O2)P@JJs}IeSL}WN1dV@?=N`7M7rB_%Y2LGP@Ub8KDDuV!R|*vvLDw3 zz2K0Me%-A;bLNff0?SRV9-Zu?Xp*D#?d;LbXA|G+eq3`|=->1D!GrEMF){!{PoaXD zf#E_5!(2wK2BsD!J41vzc~b%Bl=Ho|8hg|K2IwzI?-f*LmG_h8}KT;wRqr;N5rG zdXK_?IV+h-PgL_)PN|vmWc62e&r7GHwN&N52X3~qT3`PA{nb*tn}w@9w*Oyu-EmWU z$kfx_Dks(NsLL%~btXO2#_edHUvSF2OHogBPkVNqu~}OxvgS8``sA$3Z{M#DnH&1& z{QqH(L{g@>)z8kl{PO+HrG}n6Z$9O{95UZ?)%o}P4g9{Y++R>V@0#7!)EVEcmY8~! zTDlznm1(G9YZq1|Nk%dmNQ=ezg+$S{{#63`L*`T>L0EL zO4ZH0(oiS#k0Feqvaycw2jd0CzY{pGGnOvAa&$_!%z|5nr+60=q!=D#i`{hpdE?jr zHLGIJ&Nj=rxj79&C5dtb$^88g(x!T{&3$6h(QYxFh>cLnqUK;Yl2WLSQ3@7zqaiUG z67Y;Pyc5Hj`u-l?{rl_w{{H^{K9pMK+fcbw#$iT#XTPl_hS~UCVU9}z7w3z;a|AvIr(NGu zVSV4jF=_3W7BMXtL;cYj1%`kBf9TmJsD{{uS2;@S4UsC@suVS!K4-1wup z+y36!IJ=Oq+Hi94jH7$=WdnC=zR6LLpCubV_1tA0P9AOfg!zINXB8H8&(3&mc5ma- zl@E^{E?&4=HdtyBU-Lxm-Uo{%=D4lh?D*_Y-s$K!|9N5mI;p=W z{_~7q-{#gg9mzXw|M_&w!*t0dB1KG}6@F$sH|G{jYZAI`&e83!z3=4Oe*82xN XeW$Sh--H|ec`U|;|MMeNo0 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/bg_commodity_tag.webp b/app/src/main/res/drawable-xxxhdpi/bg_commodity_tag.webp new file mode 100644 index 0000000000000000000000000000000000000000..7103d903fa3c863663c0c22370193eee8ec58704 GIT binary patch literal 772 zcmV+f1N;0^Nk&He0ssJ4MM6+kP&il$0000G00030002t>06|PpNQD3Z009{?X&ZWX z{uOr~BKki8N{*BR$F*&}*pY{ZIjtwx9(5g@kJyW9Q61w^(;8*Iqv@(9$T$4Bqp2AfPIhu|LH?hK?j;#2QXb?dA<{it0nNZv+)cJrb+GVW< z25fWOp?j8Z-6Fix?6;1cVoI-sU?5SBZ$X*J9M+Y^MptBiHvK0{Z+Hn7w?YXR;Ve?}8$N zcnFK!y4+3i&=!|D`-^bRasR`XqmS=K1zE9ZTOM>w2OX*@$q(G!VUfQ8tu7_90cG0> zR3)yx8=3}qJuUiK@Jx0N!qe^VDe|=10cF}_UKQogS)tzrIJAMlQr8j~nZFvWxolaP z7R`)tLM79e7Sh>?a<&?3A;lNi&wRz{2>@n-Th^?TUCT;ncG(QN*f5CKS|9$p4p|}p zw7YJE|M?nY{r~!){P<=M;Lh9pJ8o^%-2eLb@JSqf-laf4{2QK4|NIie19)+!Kdr9_ zy&3aLWMOdddCF(CGTtW{c(&<~?Dit)=@xfA+}bhvd`6T{?Tsa<)MaPytsgf24?oWT z$2ri~{n_x>%F}+M$gQ7Tr>}V8|I`1!(b&konOtAoNbvuE;xxeD|He?JICOvfxZnVb C`Feu@ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/bg_energy_center_day.webp b/app/src/main/res/drawable-xxxhdpi/bg_energy_center_day.webp deleted file mode 100644 index e4de495d6299b93356802728d48868014f5c150e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29118 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 V1h|pPagd^!+O75*3?qZleg{$moxK16 diff --git a/app/src/main/res/drawable-xxxhdpi/bg_energy_center_night.webp b/app/src/main/res/drawable-xxxhdpi/bg_energy_center_night.webp deleted file mode 100644 index 4c408e3c1a8a2cb362a47dcbb7b2c994c03d10c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29560 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 diff --git a/app/src/main/res/drawable-xxxhdpi/bg_energy_center_top.webp b/app/src/main/res/drawable-xxxhdpi/bg_energy_center_top.webp new file mode 100644 index 0000000000000000000000000000000000000000..7bb9f9b46d482046d72993ca163b30ab147bc568 GIT binary patch literal 114252 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�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