From f1302dd1bbf8a6bf9fcf38ff0dad519b613a4e53 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Mon, 24 May 2021 15:51:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=A7=86=E9=A2=91=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E9=A1=B6=E9=83=A8=E5=8C=BA=E5=9F=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gamecenter/qa/comment/CommentActivity.kt | 11 ++- .../qa/comment/NewCommentFragment.kt | 72 +++++++++---------- .../qa/video/detail/ForumTopVideoView.kt | 5 +- .../video/detail/ForumVideoDetailActivity.kt | 2 +- .../video/detail/ForumVideoDetailFragment.kt | 41 ++++++++--- .../video/detail/ForumVideoDetailViewModel.kt | 23 +++++- .../detail/comment/VideoCommentAdapter.kt | 4 +- .../detail/comment/VideoCommentFragment.kt | 62 ++++++++++++++-- .../detail/comment/VideoCommentViewHolder.kt | 69 +++++++++++++++++- .../detail/comment/VideoCommentViewModel.kt | 27 ++++++- .../detail/desc/VideoDescTopViewHolder.kt | 8 ++- .../video/detail/desc/VideoDescViewModel.kt | 2 +- .../layout/fragment_forum_video_detail.xml | 5 ++ .../layout/fragment_video_comment_list.xml | 35 ++++++++- ..._forum_video_detail_videoview_portrait.xml | 17 ++--- 15 files changed, 301 insertions(+), 82 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/CommentActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/CommentActivity.kt index e86ae399c5..c9999a1fc1 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/CommentActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/CommentActivity.kt @@ -38,6 +38,7 @@ class CommentActivity : BaseActivity() { val videoId = intent.getStringExtra(VIDEO_ID) ?: "" val isVideoAuthor = intent.getBooleanExtra(IS_VIDEO_AUTHOR, false) + val isStairsComment = intent.getBooleanExtra(IS_STAIRS_COMMENT, false) val commentEntity: CommentEntity? = intent.getParcelableExtra(COMMENT_ENTITY) ?: null @@ -89,6 +90,8 @@ class CommentActivity : BaseActivity() { commentCount, isVideoAuthor, commentEntity, + mShowInputOnly, + isStairsComment, commentCallback) } } @@ -96,7 +99,7 @@ class CommentActivity : BaseActivity() { supportFragmentManager.beginTransaction().replace(R.id.answerCommentPlaceholderView, commentFragment!!, NewCommentFragment::class.java.simpleName).commitNowAllowingStateLoss() maskView.alpha = 0f - if (videoId.isNullOrEmpty()) { + if (!isStairsComment) { maskView.animate().alpha(1f).setDuration(300).start() } answerCommentPlaceholderView.translationY = (DisplayUtils.getScreenHeight()).toFloat() @@ -128,6 +131,7 @@ class CommentActivity : BaseActivity() { const val COMMENT_ENTITY = "comment_entity" const val IS_VIDEO_AUTHOR = "isVideoAuthor" const val SHOW_KEYBOARD = "show_keyboard" + const val IS_STAIRS_COMMENT = "is_stairs_comment" const val ARTICLE_ID = "article_id" const val COMMUNITY_ID = "community_id" @@ -159,12 +163,15 @@ class CommentActivity : BaseActivity() { } @JvmStatic - fun getVideoCommentIntent(context: Context, videoId: String, commentCount: Int? = 0, isVideoAuthor: Boolean, showKeyboard: Boolean): Intent { + fun getVideoCommentIntent(context: Context, videoId: String, commentCount: Int? = 0, isVideoAuthor: Boolean, + showKeyboard: Boolean, showInputOnly: Boolean = false, isStairsComment: Boolean = true): Intent { val intent = Intent(context, CommentActivity::class.java) intent.putExtra(VIDEO_ID, videoId) intent.putExtra(COMMENT_COUNT, commentCount) intent.putExtra(IS_VIDEO_AUTHOR, isVideoAuthor) intent.putExtra(SHOW_KEYBOARD, showKeyboard) + intent.putExtra(SHOW_INPUT_ONLY, showInputOnly) + intent.putExtra(IS_STAIRS_COMMENT, isStairsComment) if (context is Activity) { context.overridePendingTransition(0, 0) } diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentFragment.kt index 682fe0d6b0..23dbdc6369 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentFragment.kt @@ -12,6 +12,7 @@ import android.widget.* import androidx.annotation.Nullable import androidx.core.content.ContextCompat import androidx.core.os.bundleOf +import androidx.fragment.app.Fragment import androidx.lifecycle.Observer import androidx.recyclerview.widget.RecyclerView import butterknife.BindView @@ -465,32 +466,6 @@ open class NewCommentFragment : ListFragment } open fun popInputLayout(isPopup: Boolean, height: Int) { - /*mCommentLine.goneIf(isPopup) - mShadowView.goneIf(mShowInputOnly || !isPopup) - if (requireActivity() is CommentDetailActivity) { - val shadowView = (requireActivity() as CommentDetailActivity).shadowView - shadowView.visibility = if (isPopup && !mShowInputOnly) View.VISIBLE else View.GONE - DisplayUtils.setLightStatusBar(requireActivity(), !isPopup) - shadowView.setOnClickListener { Util_System_Keyboard.hideSoftKeyboard(activity) } - } - mAnswerContent.orientation = if (isPopup) LinearLayout.VERTICAL else LinearLayout.HORIZONTAL - if (isPopup) { - mAnswerContent.background = ContextCompat.getDrawable(requireActivity(), R.drawable.bg_shape_white_radius_10_top_only) - } else { - mAnswerContent.setBackgroundColor(ContextCompat.getColor(requireActivity(), R.color.white)) - mOffset = Math.abs(height) - } - - val mScrollViewParams = mScrollView.layoutParams as LinearLayout.LayoutParams - mScrollViewParams.width = if (isPopup) LinearLayout.LayoutParams.MATCH_PARENT else 0 - mScrollViewParams.height = if (isPopup) DisplayUtils.dip2px(64f) else DisplayUtils.dip2px(28f) - mScrollView.layoutParams = mScrollViewParams - - val mLayoutParams = commentInputContainer.layoutParams as FrameLayout.LayoutParams - mLayoutParams.height = if (isPopup) DisplayUtils.dip2px(130f) else LinearLayout.LayoutParams.WRAP_CONTENT - mLayoutParams.bottomMargin = if (isPopup) height + mOffset - DisplayUtils.dip2px(12F) else 0 - commentInputContainer.layoutParams = mLayoutParams*/ - mCommentLine.goneIf(mShowInputOnly || isPopup) mShadowView.goneIf(mShowInputOnly || !isPopup) if (requireActivity() is CommentDetailActivity) { @@ -574,6 +549,7 @@ open class NewCommentFragment : ListFragment const val SHOW_INPUT_ONLY = "showInputOnly" const val COMMENT_ENTITY = "commentEntity" const val IS_VIDEO_AUTHOR = "isVideoAuthor" + const val IS_STAIRS_COMMENT = "is_stairs_comment" fun getAnswerCommentInstance(answerId: String, showSoftKeyboardOnStartUp: Boolean, @@ -626,19 +602,41 @@ open class NewCommentFragment : ListFragment commentCount: Int, isVideoAuthor: Boolean, commentEntity: CommentEntity? = null, + showInputOnly: Boolean, + isStairsComment: Boolean, listener: AnswerDetailFragment.CommentListener) - : StairsCommentFragment { - return StairsCommentFragment().apply { - mCommentListener = listener - with(bundleOf( - SHOW_SOFT_KEY_BOARD_ON_STARTUP to showSoftKeyboardOnStartUp, - VIDEO_ID to videoId, - COMMENT_COUNT to commentCount, - COMMENT_TYPE to CommentType.VIDEO, - COMMENT_ENTITY to commentEntity, - IS_VIDEO_AUTHOR to isVideoAuthor - )) + : Fragment { + return if (isStairsComment){ + StairsCommentFragment().apply { + mCommentListener = listener + with(bundleOf( + SHOW_SOFT_KEY_BOARD_ON_STARTUP to showSoftKeyboardOnStartUp, + VIDEO_ID to videoId, + COMMENT_COUNT to commentCount, + COMMENT_TYPE to CommentType.VIDEO, + COMMENT_ENTITY to commentEntity, + IS_VIDEO_AUTHOR to isVideoAuthor + )) + } + }else { + NewCommentFragment().apply { + mCommentListener = listener + with(bundleOf( + SHOW_SOFT_KEY_BOARD_ON_STARTUP to showSoftKeyboardOnStartUp, + VIDEO_ID to videoId, + COMMENT_COUNT to commentCount, + COMMENT_TYPE to CommentType.VIDEO, + COMMENT_ENTITY to commentEntity, + SHOW_INPUT_ONLY to showInputOnly, + IS_STAIRS_COMMENT to isStairsComment, + IS_VIDEO_AUTHOR to isVideoAuthor + )) + } } + + + + } } } 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 bfaad05fc7..bb19a0477c 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 @@ -13,6 +13,7 @@ import android.widget.SeekBar import androidx.core.content.ContextCompat import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager +import com.facebook.drawee.view.SimpleDraweeView import com.gh.common.constant.Constants import com.gh.common.observer.MuteCallback import com.gh.common.observer.VolumeObserver @@ -37,8 +38,8 @@ class ForumTopVideoView @JvmOverloads constructor(context: Context, attrs: Attri private var mVolumeObserver: VolumeObserver private var mMuteDisposable: Disposable? = null private var mIsAutoPlay = false + var thumbImage: SimpleDraweeView = findViewById(R.id.thumbImage) var mForumVideoEntity: ForumVideoEntity? = null - var viewModel: ForumVideoDetailViewModel? = null var uuid = UUID.randomUUID().toString() @@ -194,7 +195,7 @@ class ForumTopVideoView @JvmOverloads constructor(context: Context, attrs: Attri } fun updateThumb(url: String) { - Picasso.with(context).load(url).fit().into(findViewById(R.id.thumbImage)) + ImageUtils.display(thumbImage, url) } override fun touchDoubleUp() { 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 6c937fa57e..49d9c0ad3f 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 @@ -24,7 +24,7 @@ class ForumVideoDetailActivity : BaseActivity() { } companion object { - const val VIDEO_PATCH_REQUEST=100 + const val VIDEO_PATCH_REQUEST = 100 fun getIntent(context: Context, videoId: String): Intent { val intent = Intent(context, ForumVideoDetailActivity::class.java) intent.putExtra(EntranceUtils.KEY_VIDEO_ID, videoId) 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 fa22a195a0..2a691c973d 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 @@ -14,9 +14,12 @@ import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat +import androidx.core.os.bundleOf import androidx.core.view.ViewCompat import androidx.fragment.app.Fragment import androidx.lifecycle.Lifecycle +import androidx.lifecycle.Observer +import androidx.lifecycle.lifecycleScope import com.ethanhua.skeleton.Skeleton import com.ethanhua.skeleton.ViewSkeletonScreen import com.gh.base.BaseActivity @@ -72,6 +75,7 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { private var mCommentCountTv: TextView? = null private var mMoreMenuItem: MenuItem? = null private var mForumVideoEntity: ForumVideoEntity? = null + private var mVideoId = "" private val dataWatcher = object : DataWatcher() { override fun onDataChanged(downloadEntity: DownloadEntity) { @@ -87,8 +91,8 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { } override fun initFragmentList(fragments: MutableList) { - fragments.add(VideoDescFragment()) - fragments.add(VideoCommentFragment()) + fragments.add(VideoDescFragment().apply { arguments = bundleOf(EntranceUtils.KEY_VIDEO_ID to mVideoId) }) + fragments.add(VideoCommentFragment().apply { arguments = bundleOf(EntranceUtils.KEY_VIDEO_ID to mVideoId) }) } override fun initTabTitleList(tabTitleList: MutableList) { @@ -96,6 +100,11 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { tabTitleList.add("评论") } + override fun onCreate(savedInstanceState: Bundle?) { + mVideoId = arguments?.getString(EntranceUtils.KEY_VIDEO_ID) ?: "" + super.onCreate(savedInstanceState) + } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) mBinding.toolbar.inflateMenu(R.menu.menu_forum_video_detail) @@ -104,8 +113,7 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { (mBinding.toolbar.layoutParams as ViewGroup.MarginLayoutParams).topMargin = insets.systemWindowInsetTop insets.consumeSystemWindowInsets() } - val videoId = arguments?.getString(EntranceUtils.KEY_VIDEO_ID) ?: "" - mViewModel = viewModelProviderFromParent(ForumVideoDetailViewModel.Factory(videoId)) + mViewModel = viewModelProviderFromParent(ForumVideoDetailViewModel.Factory(mVideoId)) mSkeleton = Skeleton.bind(mBinding.skeleton).shimmer(false).load(R.layout.fragment_video_detail_skeleton).show() mBinding.toolbar.setNavigationOnClickListener { requireActivity().finish() } @@ -142,17 +150,30 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { if (it.status == Status.SUCCESS) { val entity = it.data as ForumVideoEntity mForumVideoEntity = entity + mCommentCountTv?.text = entity.commentCount.toString() mBinding.topVideoView.setForumVideoEntity(mForumVideoEntity) updateVideoParams() setUpTopVideo(entity.url, entity.poster) - mCommentCountTv?.text = entity.commentCount.toString() setGameInfo(entity) + mBinding.container.visibility = View.VISIBLE + mBinding.reuseNoneData.root.visibility = View.GONE + mBinding.reuseNoConnection.root.visibility = View.GONE } else { - mBinding.reuseNoConnection.root.visibility = View.VISIBLE + mBinding.container.visibility = View.GONE + if (it.exception != null && it.exception.code() == 404) { + mBinding.reuseNoneData.reuseTvNoneData.text = "页面不见了" + mBinding.reuseNoneData.root.visibility = View.VISIBLE + } else { + mBinding.reuseNoConnection.root.visibility = View.VISIBLE + } } mBinding.reuseLoading.root.visibility = View.GONE mSkeleton?.hide() } + mViewModel.deleteLiveData.observe(viewLifecycleOwner, Observer { + ToastUtils.showToast("删除成功") + requireActivity().finish() + }) } private fun setGameInfo(entity: ForumVideoEntity) { @@ -197,10 +218,10 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { private fun updateVideoParams() { if (mForumVideoEntity == null) return val videoInfo = mForumVideoEntity!!.videoInfo - val ratio = if (videoInfo.width == 0 || videoInfo.height == 0) { - 180 / 101f + val ratio = if (videoInfo.width < videoInfo.height) { + 3 / 4f //竖屏 } else { - videoInfo.width / videoInfo.height.toFloat() + 180 / 101f //横屏 } val updateWidth = DisplayUtils.getScreenWidth() val updateHeight = updateWidth / ratio @@ -430,7 +451,7 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { } "删除" -> { DialogUtils.showNewAlertDialog(requireContext(), "提示", "删除视频后,其中的所有评论及回复都将被删除", "取消", "删除", {}, { -// mViewModel.doHideThisArticle(mViewModel.detailEntity!!.community.id, mViewModel.articleId) + mViewModel.deleteVideo(mForumVideoEntity?.id ?: "") }) } } 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 dd12d02dd7..2b53e1bdd2 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 @@ -5,6 +5,7 @@ import android.app.Application import android.net.Uri import android.text.TextUtils import androidx.lifecycle.* +import com.gh.common.util.ErrorHelper import com.gh.common.util.observableToMain import com.gh.gamecenter.entity.ForumVideoEntity import com.gh.gamecenter.entity.VideoEntity @@ -15,7 +16,10 @@ import com.gh.gamecenter.retrofit.RetrofitManager import com.google.android.exoplayer2.upstream.cache.CacheUtil import com.google.gson.JsonObject import com.halo.assistant.HaloApp +import com.lightgame.utils.Utils +import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers +import okhttp3.ResponseBody import retrofit2.HttpException import tv.danmaku.ijk.media.exo2.ExoSourceManager @@ -25,6 +29,7 @@ class ForumVideoDetailViewModel(application: Application, val videoId: String) : val detailLiveData = MediatorLiveData>() val updateDetailLiveData = MediatorLiveData() var needToUpdateShareCount = MutableLiveData() + var deleteLiveData = MutableLiveData() init { getVideoDetail() @@ -51,8 +56,7 @@ class ForumVideoDetailViewModel(application: Application, val videoId: String) : @SuppressLint("CheckResult") fun shareVideoStatistics(videoEntity: ForumVideoEntity?) { if (videoEntity == null) return - RetrofitManager.getInstance(getApplication()) - .api.shareVideoStatistics(videoEntity.id) + mApi.shareVideoStatistics(videoEntity.id) .subscribeOn(Schedulers.io()) .subscribe(object : BiResponse() { override fun onSuccess(data: JsonObject) { @@ -68,6 +72,21 @@ class ForumVideoDetailViewModel(application: Application, val videoId: String) : } + fun deleteVideo(videoId: String) { + mApi.deleteVideo(videoId) + .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) + } + }) + } + fun isTopVideoPartlyCached(topVideoUrl: String): Boolean { val cache = ExoSourceManager.getCacheSingleInstance(HaloApp.getInstance().application, null) val key = CacheUtil.generateKey(Uri.parse(topVideoUrl)) diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentAdapter.kt index 2517217139..c48c67a8c0 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentAdapter.kt @@ -10,7 +10,7 @@ import com.gh.gamecenter.baselist.ListAdapter import com.gh.gamecenter.databinding.ItemArticleDetailCommentBinding import com.gh.gamecenter.entity.CommentEntity -class VideoCommentAdapter(val context: Context) : ListAdapter(context) { +class VideoCommentAdapter(val context: Context, val mViewModel: VideoCommentViewModel, val entrance: String) : ListAdapter(context) { public override fun setListData(updateData: MutableList?) { super.setListData(updateData) @@ -39,7 +39,7 @@ class VideoCommentAdapter(val context: Context) : ListAdapter(con override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { if (holder is VideoCommentViewHolder) { val commentEntity = mEntityList[position] - holder.bindComment(commentEntity) + holder.bindComment(commentEntity, mViewModel, entrance) } } } \ No newline at end of file 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 7d65532569..431aff98ff 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 @@ -1,18 +1,30 @@ package com.gh.gamecenter.qa.video.detail.comment +import android.os.Bundle +import android.view.View import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView +import com.gh.common.util.* import com.gh.common.view.CustomDividerItemDecoration import com.gh.gamecenter.R import com.gh.gamecenter.baselist.LazyListFragment import com.gh.gamecenter.baselist.ListAdapter +import com.gh.gamecenter.databinding.FragmentVideoCommentListBinding import com.gh.gamecenter.entity.CommentEntity +import com.gh.gamecenter.entity.ForumVideoEntity +import com.gh.gamecenter.manager.UserManager +import com.gh.gamecenter.mvvm.Status +import com.gh.gamecenter.qa.comment.CommentActivity +import com.gh.gamecenter.qa.video.detail.ForumVideoDetailViewModel class VideoCommentFragment : LazyListFragment() { + private lateinit var mBinding: FragmentVideoCommentListBinding + private lateinit var mVideoDetailViewModel: ForumVideoDetailViewModel private var mAdapter: VideoCommentAdapter? = null + private var mVideoId = "" override fun provideListAdapter(): ListAdapter<*> { - return mAdapter ?: VideoCommentAdapter(requireContext()).apply { + return mAdapter ?: VideoCommentAdapter(requireContext(), mListViewModel, mEntrance).apply { mAdapter = this } } @@ -26,15 +38,51 @@ class VideoCommentFragment : LazyListFragment() - repeat(10) { - list.add(CommentEntity()) + mBinding.replyTv.setDebouncedClickListener { + startCommentActivity() } - mAdapter?.setListData(list) - onLoadDone() + observeData() } + + private fun observeData() { + mVideoDetailViewModel.detailLiveData.observeNonNull(this) { + if (it.status == Status.SUCCESS) { + mListViewModel.videoDetail = it.data as ForumVideoEntity + mBinding.allCommentCountTv.text = mListViewModel.videoDetail?.commentCount.toString() + onRefresh() + } + } + } + + private fun startCommentActivity() { + mListViewModel.videoDetail?.let { + val intent = CommentActivity.getVideoCommentIntent( + requireContext(), + it.id, + it.commentCount, + it.user.id == UserManager.getInstance().userId, + true, true, false + ) + startActivityForResult(intent, CommentActivity.REQUEST_CODE) + } + } + + override fun isAutomaticLoad(): Boolean = false } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentViewHolder.kt index 7b539afe05..4c172c6704 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentViewHolder.kt @@ -1,11 +1,78 @@ package com.gh.gamecenter.qa.video.detail.comment +import android.annotation.SuppressLint +import android.text.SpannableStringBuilder import com.gh.base.BaseRecyclerViewHolder +import com.gh.common.util.* +import com.gh.gamecenter.R import com.gh.gamecenter.databinding.ItemArticleDetailCommentBinding import com.gh.gamecenter.entity.CommentEntity +import com.gh.gamecenter.qa.article.detail.BaseArticleDetailCommentAdapter +import com.gh.gamecenter.qa.article.detail.BaseArticleDetailCommentViewModel +import com.gh.gamecenter.qa.comment.CommentActivity class VideoCommentViewHolder(val binding: ItemArticleDetailCommentBinding) : BaseRecyclerViewHolder(binding.root) { - fun bindComment(comment: CommentEntity) { + fun bindComment(comment: CommentEntity, mViewModel: VideoCommentViewModel, entrance: String) { + binding.comment = comment + binding.userIconIv.display(comment.user.border, comment.user.icon, comment.user.auth?.icon) + binding.contentTv.text = comment.content + binding.likeCountTv.text = mViewModel.getLikeText(comment.vote) + if (comment.me?.isCommentVoted == true) { + binding.likeCountTv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.comment_vote_select, 0, 0, 0) + } else { + binding.likeCountTv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.comment_vote_unselect, 0, 0, 0) + } + binding.commentCountTv.text = mViewModel.getCommentText(comment.reply, "回复") + binding.likeCountTv.setDebouncedClickListener { + binding.likeCountTv.context.ifLogin("视频评论-点赞") { + } + } + binding.userIconIv.setOnClickListener { + DirectUtils.directToHomeActivity(binding.root.context, comment.user.id, 1, entrance, "视频详情") + } + binding.userNameTv.setOnClickListener { binding.userIconIv.performClick() } + + binding.badgeTv.setOnClickListener { + DialogUtils.showViewBadgeDialog(binding.root.context, comment.user.badge) { + DirectUtils.directToBadgeWall(binding.root.context, comment.user.id, comment.user.name, comment.user.icon) + } + } + binding.badgeIv.setOnClickListener { binding.badgeTv.performClick() } + updateSubComment(comment, mViewModel, entrance) + } + + + @SuppressLint("SetTextI18n") + fun updateSubComment(comment: CommentEntity, mViewModel: VideoCommentViewModel, entrance: String) { + val subCommentList = comment.subCommentList + val articleOwnerUserId = mViewModel.videoDetail?.user?.id ?: "" + binding.moreSubCommentBtn.goneIf(comment.reply < 3) + binding.moreSubCommentBtn.text = "查看全部${comment.reply}条回复" + binding.subCommentContainer.goneIf(subCommentList.isNullOrEmpty()) + binding.firstSubCommentTv.goneIf(subCommentList?.firstOrNull() == null) + binding.secondSubCommentTv.goneIf(subCommentList?.secondOrNull() == null) + binding.subCommentContainer.setRoundedColorBackground(R.color.text_F5F5F5, 5F) + + subCommentList?.firstOrNull()?.let { + binding.firstSubCommentTv.text = getSubCommentSpanned(it.user.name, if (it.user.id == articleOwnerUserId) "作者" else "", it.content) + } + subCommentList?.secondOrNull()?.let { + binding.secondSubCommentTv.text = getSubCommentSpanned(it.user.name, if (it.user.id == articleOwnerUserId) "作者" else "", it.content) + } + binding.subCommentContainer.setOnClickListener { + + } + } + + 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 colonSpan = SpanBuilder(colon).color(0, colon.length, R.color.theme_font).build() + return SpannableStringBuilder().append(nameSpan).append(authorSpan).append(colonSpan).append(content) } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentViewModel.kt index a39aee5ae9..43ad810166 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/comment/VideoCommentViewModel.kt @@ -1,16 +1,39 @@ package com.gh.gamecenter.qa.video.detail.comment import android.app.Application +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider import com.gh.gamecenter.baselist.ListViewModel import com.gh.gamecenter.entity.CommentEntity +import com.gh.gamecenter.entity.ForumVideoEntity +import com.gh.gamecenter.retrofit.RetrofitManager +import com.halo.assistant.HaloApp import io.reactivex.Observable -class VideoCommentViewModel(application: Application) : ListViewModel(application) { +class VideoCommentViewModel(application: Application, val videoId: String) : ListViewModel(application) { + private val mApi = RetrofitManager.getInstance(getApplication()).api + var videoDetail: ForumVideoEntity? = null + override fun provideDataObservable(page: Int): Observable>? { - return null + return mApi.getVideoCommentList(videoId, page) } override fun mergeResultLiveData() { mResultLiveData.addSource(mListLiveData, mResultLiveData::postValue) } + + + fun getLikeText(likeCount: Int, defaultLikeText: String = "赞同"): String { + return if (likeCount == 0) defaultLikeText else "$likeCount" + } + + fun getCommentText(commentCount: Int, defaultComment: String): String { + return if (commentCount == 0) defaultComment else "$commentCount" + } + + class Factory(private val videoId: String) : ViewModelProvider.NewInstanceFactory() { + override fun create(modelClass: Class): T { + return VideoCommentViewModel(HaloApp.getInstance().application, videoId) as T + } + } } \ No newline at end of file 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 2479a50cd7..b039a912c1 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,9 +17,9 @@ 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) { + private var mIsAnimationFinish = true fun bindData(entity: ForumVideoEntity) { initAnimation() - ImageUtils.display(binding.userAvatar, entity.user.icon) binding.userNameTv.text = entity.user.name binding.fansAndTimeTv.text = "${entity.user.count.fans}粉丝 · ${CommentUtils.getCommentTime(entity.time.upload)}" @@ -100,6 +100,7 @@ class VideoDescTopViewHolder(val binding: ItemVideoDescTopBinding, var mIsExpand if (!mIsExpand) { binding.titleTv.maxLines = Int.MAX_VALUE } + mIsAnimationFinish = false } animator.doOnEnd { if (mIsExpand) { @@ -107,8 +108,11 @@ class VideoDescTopViewHolder(val binding: ItemVideoDescTopBinding, var mIsExpand } mIsExpand = !mIsExpand binding.expandMoreIv.rotation = if (mIsExpand) 180f else 0f + mIsAnimationFinish = true + } + if (mIsAnimationFinish) { + animator.start() } - animator.start() } } 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 3261ed2e62..b2f671c004 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 @@ -141,7 +141,7 @@ class VideoDescViewModel(application: Application) : ListViewModel() { override fun onSuccess(data: ResponseBody) { diff --git a/app/src/main/res/layout/fragment_forum_video_detail.xml b/app/src/main/res/layout/fragment_forum_video_detail.xml index 8133055b37..e67022a123 100644 --- a/app/src/main/res/layout/fragment_forum_video_detail.xml +++ b/app/src/main/res/layout/fragment_forum_video_detail.xml @@ -6,6 +6,7 @@ android:layout_height="match_parent"> + + + android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto"> + + + + + + + android:layout_height="match_parent"> - + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:scaleType="centerCrop" />