From 2211f562c746d751d228f560dfa24b12d0d7749b Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Sat, 8 May 2021 15:52:41 +0800 Subject: [PATCH 01/61] =?UTF-8?q?=E6=8A=BD=E7=A6=BB=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E5=B8=96=E5=AD=90=E3=80=81=E5=9B=9E=E7=AD=94=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/base/BaseRichEditorActivity.kt | 84 +++++++++-- .../com/gh/base/BaseRichEditorViewModel.kt | 109 ++++++++++++++ .../qa/answer/edit/AnswerEditActivity.kt | 114 ++------------ .../qa/answer/edit/AnswerEditViewModel.kt | 96 +----------- .../qa/article/edit/ArticleEditActivity.kt | 140 +++++------------- .../qa/article/edit/ArticleEditViewModel.kt | 121 +-------------- 6 files changed, 239 insertions(+), 425 deletions(-) create mode 100644 app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt diff --git a/app/src/main/java/com/gh/base/BaseRichEditorActivity.kt b/app/src/main/java/com/gh/base/BaseRichEditorActivity.kt index 38cad65797..8ca519744e 100644 --- a/app/src/main/java/com/gh/base/BaseRichEditorActivity.kt +++ b/app/src/main/java/com/gh/base/BaseRichEditorActivity.kt @@ -13,6 +13,7 @@ import android.widget.FrameLayout import android.widget.ImageView import android.widget.TextView import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer import butterknife.OnClick import com.gh.common.AppExecutor import com.gh.common.util.* @@ -32,9 +33,13 @@ import com.halo.assistant.HaloApp import com.lightgame.utils.Util_System_Keyboard import com.lightgame.utils.Utils import com.lightgame.view.CheckableImageView +import com.zhihu.matisse.Matisse +import com.zhihu.matisse.MimeType import kotterknife.bindView +import org.json.JSONArray +import org.json.JSONObject -abstract class BaseRichEditorActivity : ToolBarActivity() { +abstract class BaseRichEditorActivity : ToolBarActivity() { val mRichEditor by bindView(R.id.rich_editor) @@ -55,21 +60,22 @@ abstract class BaseRichEditorActivity : ToolBarActivity() { private val mEditorParagraphContainer by bindView(R.id.editor_paragraph_container) private val mEditorLinkContainer by bindView(R.id.editor_link_container) private val mEditorInsertDetailContainer by bindView(R.id.editor_insert_detail_container) - val mAddLabelContainer by bindView(R.id.add_label_container) + private val mAddLabelContainer by bindView(R.id.add_label_container) + private val mLabelArrowIv by bindView(R.id.label_arrow) val mAddLabelTv by bindView(R.id.add_label_tv) val mLabelNumTv by bindView(R.id.label_num_tv) - val mLabelArrowIv by bindView(R.id.label_arrow) val mTagsContainer by bindView(R.id.tagsContainer) private var mCurrentParagraphStyle = "" private var mIsExtendedKeyboardShow = false - + private var mAgreePostPic: Boolean = false + protected lateinit var mViewModel: VM override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) DialogUtils.fixWebViewKeyboardNotWorking(this) if (resultCode != Activity.RESULT_OK) return - var insertData: EditorInsertEntity? = null + var insertData: EditorInsertEntity? when (requestCode) { INSERT_ANSWER_CODE -> { val answer = data?.getParcelableExtra(AnswerEntity::class.java.simpleName) @@ -95,6 +101,9 @@ abstract class BaseRichEditorActivity : ToolBarActivity() { mRichEditor.insertCustomStyleLink(insertData) } } + REQUEST_CODE_IMAGE -> { + if (data != null) mViewModel.uploadPic(data) + } VideoActivity.INSERT_VIDEO_CODE -> { val video = data?.getParcelableExtra(MyVideoEntity::class.java.simpleName) if (video != null) { @@ -107,12 +116,12 @@ abstract class BaseRichEditorActivity : ToolBarActivity() { AppExecutor.uiExecutor.executeWithDelay(Runnable { Util_System_Keyboard.showSoftKeyboard(this) }, 100) - } @SuppressLint("AddJavascriptInterface", "ClickableViewAccessibility") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + mViewModel = provideViewModel() mAddLabelContainer.visibility = if (this is ArticleEditActivity) View.VISIBLE else View.GONE mRichEditor.setPadding(20, 15, 20, 15) // 防止个别手机在Js里无法获取粘贴内容 @@ -129,8 +138,29 @@ abstract class BaseRichEditorActivity : ToolBarActivity() { mRichEditor.hasFocus() } else false } + observeData() } + private fun observeData(){ + mViewModel.chooseImagesUpload.observe(this, Observer { + for (key in it.keys) { + mRichEditor.insertPlaceholderImage(key) + } + }) + mViewModel.chooseImagesUploadSuccess.observe(this, Observer { + val jsonArray = JSONArray() + for (key in it.keys) { + val jsonObject = JSONObject() + jsonObject.put("id", key) + jsonObject.put("url", it[key]) + jsonArray.put(jsonObject) + } + mRichEditor.replacePlaceholderImage(jsonArray.toString()) + AppExecutor.uiExecutor.executeWithDelay(Runnable { + Util_System_Keyboard.showSoftKeyboard(this) + }, 100) + }) + } fun closeExtendedKeyboard() { mEditorInsertDetailContainer.visibility = View.GONE @@ -170,9 +200,6 @@ abstract class BaseRichEditorActivity : ToolBarActivity() { } } - open fun getSelectedLabel(): Int = 0 - - @OnClick(R.id.editor_image, R.id.editor_font, R.id.editor_link, R.id.add_label_container, R.id.editor_font_underline, R.id.editor_font_bold, R.id.editor_font_italic, R.id.editor_font_strikethrough, R.id.editor_paragraph_h1, R.id.editor_paragraph_h2, R.id.editor_paragraph_h3, @@ -286,6 +313,41 @@ abstract class BaseRichEditorActivity : ToolBarActivity() { } }) } + R.id.editor_image -> { + if (!mAgreePostPic && !NetworkUtils.isWifiOr4GOr3GConnected(this)) { + mAgreePostPic = true + DialogUtils.showAlertDialog(this, + "警告", + "当前使用移动网络,上传图片会消耗手机流量", + "我知道了", "", { startMediaStore() }, null) + return + } + startMediaStore() + } + } + } + + private fun startMediaStore() { + MtaHelper.onEvent(mtaEventName(), "插入图片", "插入图片") + if (mViewModel.mapImages.size >= 50) { + toast(R.string.answer_edit_max_img_hint) + return + } + try { + PermissionHelper.checkStoragePermissionBeforeAction(this, object : EmptyCallback { + override fun onCallback() { + Matisse.from(this@BaseRichEditorActivity) + .choose(MimeType.ofImage()) + .showSingleMediaType(true) + .countable(true) + .addFilter(GhMatisseFilter()) + .maxSelectable(10) + .forResult(REQUEST_CODE_IMAGE) + } + }) + } catch (e: Exception) { + toast(R.string.media_image_hint) + e.printStackTrace() } } @@ -417,7 +479,9 @@ abstract class BaseRichEditorActivity : ToolBarActivity() { } } + open fun getSelectedLabel(): Int = 0 abstract fun mtaEventName(): String + abstract fun provideViewModel(): VM companion object { const val ELEMENT_NAME_BOLD = " b " @@ -434,5 +498,7 @@ abstract class BaseRichEditorActivity : ToolBarActivity() { const val INSERT_ARTICLE_CODE = 412 const val INSERT_GAME_CODE = 413 const val MAX_INPUT_TEXT_NUM = 10000 + + const val REQUEST_CODE_IMAGE = 120 } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt b/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt new file mode 100644 index 0000000000..eebfec6290 --- /dev/null +++ b/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt @@ -0,0 +1,109 @@ +package com.gh.base + +import android.app.Application +import android.content.Intent +import android.text.TextUtils +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.MutableLiveData +import com.gh.common.util.* +import com.gh.gamecenter.R +import com.gh.gamecenter.entity.ErrorEntity +import com.gh.gamecenter.qa.answer.edit.AnswerEditActivity +import com.gh.gamecenter.retrofit.RetrofitManager +import com.gh.gamecenter.retrofit.service.ApiService +import com.lightgame.utils.Utils +import com.zhihu.matisse.Matisse +import com.zhihu.matisse.internal.utils.PathUtils +import io.reactivex.disposables.Disposable +import retrofit2.HttpException +import java.io.File +import java.util.ArrayList +import java.util.LinkedHashMap + +abstract class BaseRichEditorViewModel(application: Application) : AndroidViewModel(application) { + val mApi: ApiService = RetrofitManager.getInstance(application).api + val uploadingImage = ArrayList>() + val chooseImagesUpload = MutableLiveData>() + val chooseImagesUploadSuccess = MutableLiveData>() + var uploadImageSubscription: Disposable? = null + val mapImages = HashMap() + + //检查图片是否符合规则并上传图片 + fun uploadPic(data: Intent) { + val uris = Matisse.obtainResult(data) + val pictureList = ArrayList() + for (uri in uris) { + val picturePath = PathUtils.getPath(getApplication(), uri) + if (picturePath != null) { + 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)) + continue + } + Utils.log("picturePath = $picturePath") + pictureList.add(picturePath) + } else { + Utils.log("picturePath is null") + } + } + if (pictureList.size == 0) return + + 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 onSuccess(imageUrl: LinkedHashMap, errorMap: Map) { + val uploadMap = uploadingImage.find { it.containsKey(MD5Utils.getUrlMD5(imageUrl.entries.iterator().next().key)) } + uploadMap?.let { + for (key in imageUrl.keys) { + uploadMap[MD5Utils.getUrlMD5(key)] = AnswerEditActivity.FILE_HOST + key.decodeURI() + mapImages[TextUtils.htmlEncode(key).decodeURI()] = imageUrl[key] ?: "" + } + chooseImagesUploadSuccess.postValue(uploadMap) + uploadingImage.remove(uploadMap) + } + val errorSize = pictureList.size - imageUrl.size + if (errorSize > 0) { + 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 + + 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() + "张图片上传失败") + } + } + }) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditActivity.kt index 1a7c83e9bb..1d9bda2cf8 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditActivity.kt @@ -31,31 +31,21 @@ import com.gh.gamecenter.qa.entity.Questions import com.gh.gamecenter.video.VideoVerifyItemViewHolder import com.gh.gamecenter.video.detail.VideoDetailContainerViewModel import com.halo.assistant.HaloApp -import com.zhihu.matisse.Matisse -import com.zhihu.matisse.MimeType -import org.json.JSONArray import org.json.JSONObject /** * Created by khy on 10/04/18. */ -class AnswerEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { +class AnswerEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { private lateinit var mMenuDraft: MenuItem private lateinit var mMenuPost: MenuItem private lateinit var mBinding: FragmentAnswerEditBinding - private lateinit var mViewModel: AnswerEditViewModel - private var mProcessingDialog: WaitingDialogFragment? = null private var mUploadImageCancelDialog: Dialog? = null - private var mCommunityName: String? = null - private var mOpenAnswerInNewPage: Boolean = false - private var mAgreePostPic: Boolean = false - private var mKeyboardHeightProvider: KeyboardHeightProvider? = null - private var mIsKeyBoardShow = false override fun mtaEventName(): String { @@ -72,9 +62,7 @@ class AnswerEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - if (requestCode == REQUEST_CODE_IMAGE && resultCode == Activity.RESULT_OK) { - if (data != null) mViewModel.postImg(data) - } else if (requestCode == ANSWER_DRAFT_REQUEST_CODE && resultCode == Activity.RESULT_OK) { + if (requestCode == ANSWER_DRAFT_REQUEST_CODE && resultCode == Activity.RESULT_OK) { mViewModel.getUserAnswerDrafts() } } @@ -87,15 +75,6 @@ class AnswerEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { mCommunityName = intent?.getStringExtra(EntranceUtils.KEY_COMMUNITY_NAME) mOpenAnswerInNewPage = intent?.getBooleanExtra(EntranceUtils.KEY_ANSWER_OPEN_IN_NEW_PAGE, false)!! mBinding = FragmentAnswerEditBinding.bind(mContentView) - - val factory = AnswerEditViewModel.Factory( - HaloApp.getInstance().application, - intent?.getStringExtra(EntranceUtils.KEY_ANSWER_ID), - intent?.getStringExtra(EntranceUtils.KEY_ANSWER_CONTENT), - intent?.getStringExtra(EntranceUtils.KEY_DRAFT_ID), - intent?.getParcelableExtra(Questions::class.java.simpleName) ?: Questions()) - mViewModel = ViewModelProviders.of(this, factory).get(AnswerEditViewModel::class.java) - addObserver() initQuestionContent() @@ -138,6 +117,17 @@ class AnswerEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { checkPostButtonEnable() } + override fun provideViewModel(): AnswerEditViewModel { + val factory = AnswerEditViewModel.Factory( + HaloApp.getInstance().application, + intent?.getStringExtra(EntranceUtils.KEY_ANSWER_ID), + intent?.getStringExtra(EntranceUtils.KEY_ANSWER_CONTENT), + intent?.getStringExtra(EntranceUtils.KEY_DRAFT_ID), + intent?.getParcelableExtra(Questions::class.java.simpleName) ?: Questions()) + mViewModel = ViewModelProviders.of(this, factory).get(AnswerEditViewModel::class.java) + return mViewModel + } + override fun getLayoutId(): Int { return R.layout.fragment_answer_edit } @@ -200,19 +190,9 @@ class AnswerEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { when (code) { 403037 -> consume { if (TextUtils.isEmpty(mViewModel.draftId)) { - DialogUtils.showAlertDialog(this, - "发布失败", - "问题已被删除,无法发布回答", - "好吧", - "", - { finish() }, - null) + DialogUtils.showAlertDialog(this, "发布失败", "问题已被删除,无法发布回答", "好吧", "", { finish() }, null) } else { - DialogUtils.showAlertDialog(this, - "发布失败", - "问题已被删除,需要删除草稿吗?", - "删除草稿", - "暂不", + DialogUtils.showAlertDialog(this, "发布失败", "问题已被删除,需要删除草稿吗?", "删除草稿", "暂不", { mViewModel.deleteAnswerDraft() finish() @@ -250,23 +230,6 @@ class AnswerEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { } } - mViewModel.chooseImagesUpload.observe(this, Observer { - for (key in it.keys) { - mRichEditor.insertPlaceholderImage(key) - } - }) - - mViewModel.chooseImagesUploadSuccess.observe(this, Observer { - val jsonArray = JSONArray() - for (key in it.keys) { - val jsonObject = JSONObject() - jsonObject.put("id", key) - jsonObject.put("url", it[key]) - jsonArray.put(jsonObject) - } - mRichEditor.replacePlaceholderImage(jsonArray.toString()) - }) - mViewModel.deleteDraftLiveDate.observe(this, Observer { if (it == true) { setResult(Activity.RESULT_OK) @@ -481,28 +444,11 @@ class AnswerEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { mViewModel.saveAnswerDrafts(editContent, forcedExit) } - @OnClick( - R.id.editor_image, - R.id.question_images_1, - R.id.question_images_2, - R.id.question_images_3) + @OnClick(R.id.question_images_1, R.id.question_images_2, R.id.question_images_3) fun onClick(view: View) { val videoSize = if (!mViewModel.question.videos.isNullOrEmpty()) 1 else 0 when (view.id) { - R.id.editor_image -> { - MtaHelper.onEvent("发表答案", "上传图片", mCommunityName) - if (!mAgreePostPic && !NetworkUtils.isWifiOr4GOr3GConnected(this)) { - mAgreePostPic = true - DialogUtils.showAlertDialog(this, - "警告", - "当前使用移动网络,上传图片会消耗手机流量", - "我知道了", "", { startMediaStore() }, null) - MtaHelper.onEvent("发表答案", "上传图片-移动网络提示", mCommunityName) - return - } - startMediaStore() - } R.id.question_images_1 -> { val question = mViewModel.question if (!question.videos.isNullOrEmpty()) { @@ -538,36 +484,9 @@ class AnswerEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { } } - - private fun startMediaStore() { - MtaHelper.onEvent(mtaEventName(), "插入图片", "插入图片") - if (mViewModel.mapImages.size >= 50) { - toast(R.string.answer_edit_max_img_hint) - return - } - try { - PermissionHelper.checkStoragePermissionBeforeAction(this, object : EmptyCallback { - override fun onCallback() { - Matisse.from(this@AnswerEditActivity) - .choose(MimeType.ofImage()) - .showSingleMediaType(true) - .countable(true) - .addFilter(GhMatisseFilter()) - .maxSelectable(10) - .forResult(REQUEST_CODE_IMAGE) - } - }) - } catch (e: Exception) { - toast(R.string.media_image_hint) - e.printStackTrace() - } - } - companion object { - const val SAVE_DRAFTS = 110 const val AUTO_SAVE_DRAFT = 1 - const val REQUEST_CODE_IMAGE = 111 const val SAVE_DRAFTS_INTERVAL_TIME = 15000 const val SAVE_DRAFTS_TOAST_COUNT = 3 const val MIN_ANSWER_TEXT_LENGTH = 6 @@ -577,7 +496,6 @@ class AnswerEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { const val FILE_HOST = "file:///" const val ANSWER_DRAFT_CHANGE_TAG = "ANSWER_DRAFT_CHANGE_TAG" - /** * 撰写回答 */ diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditViewModel.kt index 04c358c816..6fe87eef38 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditViewModel.kt @@ -1,7 +1,6 @@ package com.gh.gamecenter.qa.answer.edit import android.app.Application -import android.content.Intent import android.text.TextUtils import androidx.lifecycle.* import com.gh.base.fragment.WaitingDialogFragment @@ -13,16 +12,13 @@ import com.gh.gamecenter.R import com.gh.gamecenter.eventbus.EBReuse import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.mvvm.Resource +import com.gh.base.BaseRichEditorViewModel import com.gh.gamecenter.qa.entity.AnswerDraftEntity import com.gh.gamecenter.qa.entity.Questions import com.gh.gamecenter.retrofit.Response -import com.gh.gamecenter.retrofit.RetrofitManager import com.lightgame.utils.Utils -import com.zhihu.matisse.Matisse -import com.zhihu.matisse.internal.utils.PathUtils import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers -import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers import okhttp3.MediaType import okhttp3.RequestBody @@ -32,34 +28,20 @@ import org.greenrobot.eventbus.EventBus import org.json.JSONException import org.json.JSONObject import retrofit2.HttpException -import java.io.File -import java.util.* class AnswerEditViewModel(application: Application, var answerId: String?, // 以mAnswerId为标识,如果mAnswerId不为空则是-修改答案(不需要保存草稿) 为空则是-编写答案 var answerContent: String?, var draftId: String?, - var question: Questions) : AndroidViewModel(application) { - + var question: Questions) : BaseRichEditorViewModel(application) { private var mPostDraftsCount: Int = 0 - private val mApi = RetrofitManager.getInstance(getApplication()).api - var cacheAnswerContent: String? = null - val processDialog = MediatorLiveData() val postLiveData = MediatorLiveData>() - val postImageLiveData = MediatorLiveData>>() val deleteDraftLiveDate = MediatorLiveData() val draftsLiveData = MediatorLiveData() val saveDraftsLiveData = MediatorLiveData() // 自动保存不会回调 - val uploadingImage = ArrayList>() - val chooseImagesUpload = MutableLiveData>() - val chooseImagesUploadSuccess = MutableLiveData>() - - var uploadImageSubscription: Disposable? = null - val mapImages = HashMap() - fun postAnswer(editContent: String) { processDialog.postValue(WaitingDialogFragment.WaitingDialogData("提交中...", true)) @@ -141,80 +123,6 @@ class AnswerEditViewModel(application: Application, }) } - fun postImg(data: Intent) { - val uris = Matisse.obtainResult(data) - val pictureList = ArrayList() - for (uri in uris) { - val picturePath = PathUtils.getPath(getApplication(), uri) - if (picturePath != null) { - 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)) - continue - } - Utils.log("picturePath = $picturePath") - pictureList.add(picturePath) - } else { - Utils.log("picturePath is null") - } - } - - if (pictureList.size == 0) return - 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 onSuccess(imageUrl: LinkedHashMap, errorMap: Map) { - val uploadMap = uploadingImage.find { it.containsKey(MD5Utils.getUrlMD5(imageUrl.entries.iterator().next().key)) } - uploadMap?.let { - for (key in imageUrl.keys) { - uploadMap[MD5Utils.getUrlMD5(key)] = AnswerEditActivity.FILE_HOST + key.decodeURI() - mapImages[TextUtils.htmlEncode(key).decodeURI()] = imageUrl[key] ?: "" - } - chooseImagesUploadSuccess.postValue(uploadMap) - uploadingImage.remove(uploadMap) - } - val errorSize = pictureList.size - imageUrl.size - if (errorSize > 0) { - 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 - - for (error in errorMap.values) { - if (error is HttpException && error.code() == 403) { - Utils.toast(getApplication(), errorSize.toString() + "张违规图片上传失败") - return - } - } - if (errorSize == 1) { - Utils.toast(getApplication(), "图片上传失败") - } else { - Utils.toast(getApplication(), errorSize.toString() + "张图片上传失败") - } - } - }) - } - fun getUserAnswerDrafts() { mApi .getUserAnswerDrafts(question.id, 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 0568e0dcb6..0cc778948d 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 @@ -20,7 +20,6 @@ import androidx.lifecycle.ViewModelProviders import butterknife.OnClick import com.gh.base.BaseRichEditorActivity import com.gh.base.fragment.WaitingDialogFragment -import com.gh.common.AppExecutor import com.gh.common.util.* import com.gh.common.view.GameIconView import com.gh.gamecenter.R @@ -33,16 +32,11 @@ import com.gh.gamecenter.qa.dialog.ChooseForumDialogFragment import com.gh.gamecenter.qa.entity.ArticleDetailEntity import com.gh.gamecenter.qa.entity.ArticleDraftEntity import com.gh.gamecenter.qa.questions.edit.TagsSelectFragment -import com.lightgame.utils.Util_System_Keyboard import com.lightgame.utils.Utils -import com.zhihu.matisse.Matisse -import com.zhihu.matisse.MimeType import kotterknife.bindView import org.greenrobot.eventbus.EventBus -import org.json.JSONArray -import org.json.JSONObject -class ArticleEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { +class ArticleEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { private val mEditPlaceholder by bindView(R.id.article_placeholder) private val mForumContainerView by bindView(R.id.forum_container) @@ -51,14 +45,9 @@ class ArticleEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { private val mEditTitle by bindView(R.id.article_edit_title) private lateinit var mMenuDraft: MenuItem private lateinit var mMenuPost: MenuItem - - private lateinit var mViewModel: ArticleEditViewModel - private var mProcessingDialog: WaitingDialogFragment? = null private var mUploadImageCancelDialog: Dialog? = null - private var mPostDraftsCount: Int = 0 - private var mAgreePostPic = false private val FILE_HOST = "file:///" private var mKeyboardHeightProvider: KeyboardHeightProvider? = null private var mIsKeyBoardShow = false @@ -90,9 +79,7 @@ class ArticleEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - if (data != null && requestCode == REQUEST_CODE_IMAGE) { - mViewModel.uploadPic(data) - } else if (requestCode == ARTICLE_DRAFT_REQUEST_CODE && resultCode == Activity.RESULT_OK) { + if (requestCode == ARTICLE_DRAFT_REQUEST_CODE && resultCode == Activity.RESULT_OK) { val draftEntity = data?.getParcelableExtra(ArticleDraftEntity::class.java.simpleName) if (draftEntity != null) { mViewModel.draftEntity = draftEntity @@ -109,10 +96,6 @@ class ArticleEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { mMenuPost = mToolbar.menu.findItem(R.id.menu_answer_post) mToolbar.navigationIcon = null mMenuDraft.isVisible = true - mViewModel = ViewModelProviders.of(this).get(ArticleEditViewModel::class.java) - mViewModel.detailEntity = intent.getParcelableExtra(ArticleDetailEntity::class.java.simpleName) - mViewModel.draftEntity = intent.getParcelableExtra(ArticleDraftEntity::class.java.simpleName) - mViewModel.openArticleInNewPage = intent.getBooleanExtra(EntranceUtils.KEY_ARTICLE_OPEN_IN_NEW_PAGE, false) checkPostButtonEnable() mKeyboardHeightProvider = KeyboardHeightProvider(this) @@ -155,28 +138,15 @@ class ArticleEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { observeData() } - private fun observeData() { - mViewModel.chooseImagesUpload.observe(this, Observer { - for (key in it.keys) { - mRichEditor.insertPlaceholderImage(key) - } - }) - mViewModel.chooseImagesUploadSuccess.observe(this, Observer { - val jsonArray = JSONArray() - for (key in it.keys) { - val jsonObject = JSONObject() - jsonObject.put("id", key) - jsonObject.put("url", it[key]) - jsonArray.put(jsonObject) - } - mRichEditor.replacePlaceholderImage(jsonArray.toString()) - closeExtendedKeyboard() - AppExecutor.uiExecutor.executeWithDelay(Runnable { - Util_System_Keyboard.showSoftKeyboard(this) - }, 100) - checkPostButtonEnable() - }) + override fun provideViewModel(): ArticleEditViewModel { + mViewModel = ViewModelProviders.of(this).get(ArticleEditViewModel::class.java) + mViewModel.detailEntity = intent.getParcelableExtra(ArticleDetailEntity::class.java.simpleName) + mViewModel.draftEntity = intent.getParcelableExtra(ArticleDraftEntity::class.java.simpleName) + mViewModel.openArticleInNewPage = intent.getBooleanExtra(EntranceUtils.KEY_ARTICLE_OPEN_IN_NEW_PAGE, false) + return mViewModel + } + private fun observeData() { // 保存草稿 mViewModel.postArticleDrafts.observe(this, Observer { pair -> if (pair != null) { @@ -271,23 +241,27 @@ class ArticleEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { } }) - if (mViewModel.detailEntity != null) { // 修改文章 内容填充 - setNavigationTitle("修改帖子") - setPatchContent() - } else if (mViewModel.draftEntity != null) { - setNavigationTitle("发布帖子") - setArticleDraft() - mBaseHandler.sendEmptyMessageDelayed(1, SAVE_DRAFTS_INTERVAL_TIME.toLong()) - } else {// 启动自动保存草稿 - setNavigationTitle("发布帖子") - mBaseHandler.sendEmptyMessageDelayed(1, SAVE_DRAFTS_INTERVAL_TIME.toLong()) - mViewModel.mSelectCommunityData = intent.getParcelableExtra(CommunityEntity::class.java.simpleName) - if (mViewModel.mSelectCommunityData != null) { - setGameName() - mGameName.isEnabled = false - mGameName.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null) + when { + mViewModel.detailEntity != null -> { // 修改文章 内容填充 + setNavigationTitle("修改帖子") + setPatchContent() + } + mViewModel.draftEntity != null -> { + setNavigationTitle("发布帖子") + setArticleDraft() + mBaseHandler.sendEmptyMessageDelayed(1, SAVE_DRAFTS_INTERVAL_TIME.toLong()) + } + else -> {// 启动自动保存草稿 + setNavigationTitle("发布帖子") + mBaseHandler.sendEmptyMessageDelayed(1, SAVE_DRAFTS_INTERVAL_TIME.toLong()) + mViewModel.mSelectCommunityData = intent.getParcelableExtra(CommunityEntity::class.java.simpleName) + if (mViewModel.mSelectCommunityData != null) { + setGameName() + mGameName.isEnabled = false + mGameName.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null) + } + mEditTitle.requestFocus() } - mEditTitle.requestFocus() } mViewModel.notSelectForum.observe(this, Observer { if (it) showSelectGameDialog() @@ -296,26 +270,12 @@ class ArticleEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { override fun getSelectedLabel(): Int = mViewModel.selectedTags.size - @OnClick(R.id.backBtn, R.id.article_game_name, R.id.editor_image) + @OnClick(R.id.backBtn, R.id.article_game_name) fun onClick(v: View) { when (v.id) { R.id.backBtn -> { onBackPressed() } - R.id.editor_image -> { - MtaHelper.onEvent("发表文章", "上传图片", UserManager.getInstance().community.name) - if (!mAgreePostPic && !NetworkUtils.isWifiOr4GOr3GConnected(this)) { - mAgreePostPic = true - DialogUtils.showAlertDialog(this, - "警告", - "当前使用移动网络,上传图片会消耗手机流量", - "我知道了", "", - DialogUtils.ConfirmListener { startMediaStore() }, null) - MtaHelper.onEvent("发表文章", "上传图片-移动网络提示", UserManager.getInstance().community.name) - return - } - startMediaStore() - } R.id.article_game_name -> { MtaHelper.onEvent("发表文章", "指定游戏", UserManager.getInstance().community.name) showSelectGameDialog() @@ -323,39 +283,6 @@ class ArticleEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { } } - private fun showDraftFailureDialog() { - DialogUtils.showAlertDialog(this, - "提示", - "确定退出?已撰写的内容将会丢失", - "继续撰写", "退出", - null, DialogUtils.CancelListener { finish() }) - } - - private fun startMediaStore() { - MtaHelper.onEvent(mtaEventName(), "插入图片", "插入图片") - if (mViewModel.mapImg.size >= 50) { - toast(R.string.answer_edit_max_img_hint) - return - } - - try { - PermissionHelper.checkStoragePermissionBeforeAction(this, object : EmptyCallback { - override fun onCallback() { - Matisse.from(this@ArticleEditActivity) - .choose(MimeType.ofImage()) - .showSingleMediaType(true) - .countable(true) - .addFilter(GhMatisseFilter()) - .maxSelectable(10) - .forResult(REQUEST_CODE_IMAGE) - } - }) - } catch (e: Exception) { - toast(R.string.media_image_hint) - e.printStackTrace() - } - } - private fun setArticleDraft() { val community = mViewModel.draftEntity?.community if (!community?.id.isNullOrEmpty() && !community?.name.isNullOrEmpty()) { @@ -404,8 +331,8 @@ class ArticleEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { private fun getReplaceRealContent(): String { var content = mRichEditor.html - for (s in mViewModel.mapImg.keys) { - content = content?.replace(FILE_HOST + s, mViewModel.mapImg[s].toString()) + for (s in mViewModel.mapImages.keys) { + content = content?.replace(FILE_HOST + s, mViewModel.mapImages[s].toString()) } return content } @@ -588,7 +515,6 @@ class ArticleEditActivity : BaseRichEditorActivity(), KeyboardHeightObserver { companion object { const val SAVE_DRAFTS_INTERVAL_TIME = 15000 const val ARTICLE_DRAFT_REQUEST_CODE = 105 - const val REQUEST_CODE_IMAGE = 120 const val ARTICLE_DRAFT_CHANGE_TAG = "ANSWER_DRAFT_CHANGE_TAG" const val ARTICLE_POSTED_TAG = "ARTICLE_POSTED_TAG" diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt index e1cc274607..98af7dee3d 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt @@ -1,30 +1,23 @@ package com.gh.gamecenter.qa.article.edit import android.app.Application -import android.content.Intent import android.text.TextUtils import android.view.Gravity -import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData import com.gh.base.fragment.WaitingDialogFragment import com.gh.common.util.* import com.gh.gamecenter.R import com.gh.gamecenter.entity.CommunityEntity -import com.gh.gamecenter.entity.ErrorEntity import com.gh.gamecenter.eventbus.EBReuse import com.gh.gamecenter.manager.UserManager -import com.gh.gamecenter.qa.answer.edit.AnswerEditActivity +import com.gh.base.BaseRichEditorViewModel import com.gh.gamecenter.qa.entity.ArticleDetailEntity import com.gh.gamecenter.qa.entity.ArticleDraftEntity import com.gh.gamecenter.qa.questions.edit.QuestionEditViewModel import com.gh.gamecenter.retrofit.Response -import com.gh.gamecenter.retrofit.RetrofitManager import com.lightgame.utils.Utils -import com.zhihu.matisse.Matisse -import com.zhihu.matisse.internal.utils.PathUtils import io.reactivex.android.schedulers.AndroidSchedulers -import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers import okhttp3.MediaType import okhttp3.RequestBody @@ -33,46 +26,26 @@ import org.greenrobot.eventbus.EventBus import org.json.JSONArray import org.json.JSONObject import retrofit2.HttpException -import java.io.File -import java.util.* import kotlin.collections.ArrayList -import kotlin.collections.HashMap - -class ArticleEditViewModel(application: Application) : AndroidViewModel(application) { - - private val mApi = RetrofitManager.getInstance(getApplication()).api - - val MIN_ARTICLE_TEXT_LENGTH = 6 - val MAX_ARTICLE_TEXT_LENGTH = 10000 +class ArticleEditViewModel(application: Application) : BaseRichEditorViewModel(application) { + private val MIN_ARTICLE_TEXT_LENGTH = 6 + private val MAX_ARTICLE_TEXT_LENGTH = 10000 val processDialog = MediatorLiveData() val postArticle = MediatorLiveData() val postArticleDrafts = MediatorLiveData>() val articleDraftsContent = MediatorLiveData() val error = MutableLiveData() val notSelectForum = MutableLiveData() - - val uploadingImage = ArrayList>() - val chooseImagesUpload = MutableLiveData>() - val chooseImagesUploadSuccess = MutableLiveData>() - - var uploadImageSubscription: Disposable? = null - var mSelectCommunityData: CommunityEntity? = null - - val mapImg = HashMap() - val titleTags = MediatorLiveData>() var defaultTags = MediatorLiveData>() val selectedTags: MutableList = ArrayList() var selectedTagsChange = MediatorLiveData() - var detailEntity: ArticleDetailEntity? = null var draftEntity: ArticleDraftEntity? = null - var title: String? = null var content: String? = null - var openArticleInNewPage: Boolean = false /** @@ -136,92 +109,6 @@ class ArticleEditViewModel(application: Application) : AndroidViewModel(applicat return true } - /** - * 检查图片是否符合规则并上传图片 - * @param picPath 图片本地路径 - */ - fun uploadPic(data: Intent) { - val uris = Matisse.obtainResult(data) - val pictureList = ArrayList() - for (uri in uris) { - val picturePath = PathUtils.getPath(getApplication(), uri) - if (picturePath != null) { - 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)) - continue - } - Utils.log("picturePath = $picturePath") - pictureList.add(picturePath) - } else { - Utils.log("picturePath is null") - } - } - - if (pictureList.size == 0) return - - 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 onSuccess(imageUrl: LinkedHashMap, errorMap: Map) { - val uploadMap = uploadingImage.find { it.containsKey(MD5Utils.getUrlMD5(imageUrl.entries.iterator().next().key)) } - uploadMap?.let { - for (key in imageUrl.keys) { - uploadMap[MD5Utils.getUrlMD5(key)] = AnswerEditActivity.FILE_HOST + key.decodeURI() - mapImg[TextUtils.htmlEncode(key).decodeURI()] = imageUrl[key] ?: "" - } - chooseImagesUploadSuccess.postValue(uploadMap) - uploadingImage.remove(uploadMap) - } - val errorSize = pictureList.size - imageUrl.size - if (errorSize > 0) { - 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 - - 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() + "张图片上传失败") - } - } - }) - } - /** * 选择动作(选中标签/移除已选中的标签) */ From 942af39b2d36a76bfd2e525400a4a38d7188349c Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Wed, 12 May 2021 16:55:18 +0800 Subject: [PATCH 02/61] =?UTF-8?q?=E5=A4=A7=E8=87=B4=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E8=AE=BA=E5=9D=9B=E3=80=81=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E8=A7=86=E9=A2=91=E3=80=81=E9=A2=84=E8=A7=88?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E3=80=81=E5=8F=91=E8=A7=86=E9=A2=91UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 31 +- .../com/gh/base/BaseRichEditorActivity.kt | 32 +- .../com/gh/base/BaseRichEditorViewModel.kt | 27 ++ .../com/gh/common/util/EntranceUtils.java | 3 + .../gh/gamecenter/entity/LocalVideoEntity.kt | 13 + .../forum/home/ForumHomeFragment.kt | 14 +- .../qa/article/edit/ArticleEditActivity.kt | 16 +- .../qa/dialog/ChooseForumActivity.kt | 111 +++++++ .../qa/dialog/ChooseForumContainerAdapter.kt | 39 +++ .../qa/dialog/ChooseForumContainerFragment.kt | 53 ++++ .../dialog/ChooseForumContainerViewModel.kt | 20 ++ .../qa/dialog/ChooseForumDialogFragment.kt | 74 ----- .../gamecenter/qa/editor/LocalVideoAdapter.kt | 38 ++- .../qa/editor/LocalVideoFragment.kt | 51 ++- .../qa/editor/PreviewVideoActivity.kt | 34 ++ .../qa/editor/PreviewVideoFragment.kt | 180 +++++++++++ .../gh/gamecenter/qa/editor/VideoActivity.kt | 60 ++-- .../qa/questions/edit/QuestionEditActivity.kt | 36 ++- .../gamecenter/qa/video/PreviewVideoView.kt | 59 ++++ .../qa/video/publish/VideoPublishActivity.kt | 26 ++ .../qa/video/publish/VideoPublishFragment.kt | 293 ++++++++++++++++++ .../qa/video/publish/VideoPublishViewModel.kt | 9 + .../video/upload/view/UploadVideoActivity.kt | 5 +- .../video/upload/view/VideoFileEntity.kt | 5 +- .../community_edit_article.webp | Bin 4434 -> 7496 bytes .../drawable-xxhdpi/community_edit_close.png | Bin 0 -> 765 bytes .../drawable-xxhdpi/community_edit_close.webp | Bin 1788 -> 0 bytes .../community_edit_question.webp | Bin 4656 -> 7224 bytes .../drawable-xxhdpi/community_edit_video.webp | Bin 0 -> 6944 bytes .../drawable-xxhdpi/ic_choose_activity.webp | Bin 0 -> 1018 bytes .../main/res/drawable-xxhdpi/ic_del_video.png | Bin 0 -> 1921 bytes .../icon_upload_video_btn.webp | Bin 0 -> 1234 bytes .../main/res/drawable/bg_change_cover_btn.xml | 6 + .../border_round_stroke_0dot5_eee_999.xml | 13 + .../main/res/layout/activity_editor_video.xml | 61 +++- .../res/layout/activity_video_publish.xml | 46 +++ .../main/res/layout/community_edit_window.xml | 138 +++++---- .../main/res/layout/dialog_choose_forum.xml | 88 +++++- .../res/layout/fragment_preview_video.xml | 99 ++++++ .../res/layout/fragment_video_publish.xml | 278 +++++++++++++++++ .../main/res/layout/item_video_selector.xml | 19 ++ .../main/res/layout/layout_preview_video.xml | 38 +++ app/src/main/res/layout/local_video_item.xml | 19 +- app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/styles.xml | 7 + 45 files changed, 1798 insertions(+), 244 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/entity/LocalVideoEntity.kt create mode 100644 app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumActivity.kt create mode 100644 app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerAdapter.kt create mode 100644 app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerFragment.kt create mode 100644 app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerViewModel.kt delete mode 100644 app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumDialogFragment.kt create mode 100644 app/src/main/java/com/gh/gamecenter/qa/editor/PreviewVideoActivity.kt create mode 100644 app/src/main/java/com/gh/gamecenter/qa/editor/PreviewVideoFragment.kt create mode 100644 app/src/main/java/com/gh/gamecenter/qa/video/PreviewVideoView.kt create mode 100644 app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishActivity.kt create mode 100644 app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt create mode 100644 app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishViewModel.kt create mode 100644 app/src/main/res/drawable-xxhdpi/community_edit_close.png delete mode 100644 app/src/main/res/drawable-xxhdpi/community_edit_close.webp create mode 100644 app/src/main/res/drawable-xxhdpi/community_edit_video.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_choose_activity.webp create mode 100644 app/src/main/res/drawable-xxhdpi/ic_del_video.png create mode 100644 app/src/main/res/drawable-xxhdpi/icon_upload_video_btn.webp create mode 100644 app/src/main/res/drawable/bg_change_cover_btn.xml create mode 100644 app/src/main/res/drawable/border_round_stroke_0dot5_eee_999.xml create mode 100644 app/src/main/res/layout/activity_video_publish.xml create mode 100644 app/src/main/res/layout/fragment_preview_video.xml create mode 100644 app/src/main/res/layout/fragment_video_publish.xml create mode 100644 app/src/main/res/layout/item_video_selector.xml create mode 100644 app/src/main/res/layout/layout_preview_video.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5083acb860..9941e0158c 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,15 +29,15 @@ - - + + - + @@ -76,9 +76,9 @@ android:icon="@mipmap/logo" android:label="@string/app_name" android:largeHeap="true" + android:networkSecurityConfig="@xml/network_security_config" android:resizeableActivity="true" android:theme="@style/AppCompatTheme.APP" - android:networkSecurityConfig="@xml/network_security_config" tools:replace="android:allowBackup" tools:targetApi="n"> @@ -514,6 +514,12 @@ android:theme="@style/Theme.Transparent" android:windowSoftInputMode="adjustNothing" /> + + + android:launchMode="singleTask" + android:screenOrientation="portrait" /> + + + + - + android:theme="@android:style/Theme.Dialog"/> : ToolBarAct super.onActivityResult(requestCode, resultCode, data) DialogUtils.fixWebViewKeyboardNotWorking(this) if (resultCode != Activity.RESULT_OK) return - var insertData: EditorInsertEntity? + val insertData: EditorInsertEntity? when (requestCode) { INSERT_ANSWER_CODE -> { val answer = data?.getParcelableExtra(AnswerEntity::class.java.simpleName) @@ -104,11 +106,17 @@ abstract class BaseRichEditorActivity : ToolBarAct REQUEST_CODE_IMAGE -> { if (data != null) mViewModel.uploadPic(data) } - VideoActivity.INSERT_VIDEO_CODE -> { - val video = data?.getParcelableExtra(MyVideoEntity::class.java.simpleName) - if (video != null) { - mRichEditor.focusEditor() - mRichEditor.insertCustomVideo(video) + INSERT_VIDEO_CODE -> { +// val video = data?.getParcelableExtra(MyVideoEntity::class.java.simpleName) +// if (video != null) { +// mRichEditor.focusEditor() +// mRichEditor.insertCustomVideo(video) +// } + val localVideoList = data?.getParcelableArrayListExtra(LocalVideoEntity::class.java.name) + ?: arrayListOf() + if (localVideoList.isNotEmpty()) { + mViewModel.localVideoList.addAll(localVideoList) + mViewModel.uploadVideo() } } } @@ -141,7 +149,7 @@ abstract class BaseRichEditorActivity : ToolBarAct observeData() } - private fun observeData(){ + private fun observeData() { mViewModel.chooseImagesUpload.observe(this, Observer { for (key in it.keys) { mRichEditor.insertPlaceholderImage(key) @@ -309,7 +317,7 @@ abstract class BaseRichEditorActivity : ToolBarAct object : EmptyCallback { override fun onCallback() { MtaHelper.onEvent(mtaEventName(), "插入链接", "插入链接-视频") - startActivityForResult(VideoActivity.getIntent(this@BaseRichEditorActivity), VideoActivity.INSERT_VIDEO_CODE) + startActivityForResult(VideoActivity.getIntent(this@BaseRichEditorActivity, 3), INSERT_VIDEO_CODE) } }) } @@ -426,6 +434,13 @@ abstract class BaseRichEditorActivity : ToolBarAct return super.handleBackPressed() } + override fun onDestroy() { + super.onDestroy() + val path = mViewModel.currentUploadingVideo?.filePath + if (path != null && UploadManager.isUploading(path)) { + UploadManager.cancelTask(path) + } + } private inner class OnCursorChangeListener { @JavascriptInterface @@ -500,5 +515,6 @@ abstract class BaseRichEditorActivity : ToolBarAct const val MAX_INPUT_TEXT_NUM = 10000 const val REQUEST_CODE_IMAGE = 120 + const val INSERT_VIDEO_CODE = 121 } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt b/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt index eebfec6290..fad4da7044 100644 --- a/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt +++ b/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt @@ -8,9 +8,12 @@ import androidx.lifecycle.MutableLiveData import com.gh.common.util.* import com.gh.gamecenter.R import com.gh.gamecenter.entity.ErrorEntity +import com.gh.gamecenter.entity.LocalVideoEntity import com.gh.gamecenter.qa.answer.edit.AnswerEditActivity import com.gh.gamecenter.retrofit.RetrofitManager import com.gh.gamecenter.retrofit.service.ApiService +import com.gh.gamecenter.video.upload.OnUploadListener +import com.gh.gamecenter.video.upload.UploadManager import com.lightgame.utils.Utils import com.zhihu.matisse.Matisse import com.zhihu.matisse.internal.utils.PathUtils @@ -27,6 +30,8 @@ abstract class BaseRichEditorViewModel(application: Application) : AndroidViewMo val chooseImagesUploadSuccess = MutableLiveData>() var uploadImageSubscription: Disposable? = null val mapImages = HashMap() + val localVideoList = ArrayList() + var currentUploadingVideo: LocalVideoEntity? = null //检查图片是否符合规则并上传图片 fun uploadPic(data: Intent) { @@ -106,4 +111,26 @@ abstract class BaseRichEditorViewModel(application: Application) : AndroidViewMo } }) } + + fun uploadVideo() { + if (localVideoList.isEmpty()) return + currentUploadingVideo = localVideoList[0] + UploadManager.createUploadTask(currentUploadingVideo!!.filePath, object : OnUploadListener { + override fun onProgressChanged(uploadFilePath: String, currentSize: Long, totalSize: Long, speed: Long) { + val percent = currentSize * 100 / totalSize.toFloat() + Utils.log("上传中...${percent.roundTo(1)}%") + } + + override fun onUploadSuccess(uploadFilePath: String, url: String) { + Utils.log("上传完成:$uploadFilePath--$url") + localVideoList.remove(currentUploadingVideo!!) + currentUploadingVideo = null + uploadVideo() + } + + override fun onUploadFailure(uploadFilePath: String, errorMsg: String) { + + } + }) + } } \ No newline at end of file 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 095ade8041..b8a4044abf 100644 --- a/app/src/main/java/com/gh/common/util/EntranceUtils.java +++ b/app/src/main/java/com/gh/common/util/EntranceUtils.java @@ -235,6 +235,9 @@ public class EntranceUtils { public static final String KEY_IS_QA_FEEDBACK = "is_qa_feedback"; public static final String KEY_IS_CLICK_RECEIVE_BTN = "is_click_receive_btn"; public static final String KEY_SHOW_QUICK_LOGIN = "show_quick_login"; + public static final String KEY_VIDEO_LIST = "video_list"; + public static final String KEY_CHOOSE_FORUM_TYPE = "choose_forum_type"; + public static final String KEY_CHOOSE_MAX_COUNT = "choose_max_count"; public static void jumpActivity(Context context, Bundle bundle) { bundle.putBoolean(KEY_REQUIRE_REDIRECT, true); diff --git a/app/src/main/java/com/gh/gamecenter/entity/LocalVideoEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/LocalVideoEntity.kt new file mode 100644 index 0000000000..56a46dfb80 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/entity/LocalVideoEntity.kt @@ -0,0 +1,13 @@ +package com.gh.gamecenter.entity + +import android.net.Uri +import android.os.Parcelable +import kotlinx.android.parcel.Parcelize + +@Parcelize +data class LocalVideoEntity( + var filePath: String = "", + var poster: String = "", + var contentUri: Uri? = null, + var duration: Long = 0 +) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumHomeFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumHomeFragment.kt index 6fb9a95271..fd199c9a78 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumHomeFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumHomeFragment.kt @@ -39,6 +39,7 @@ import com.gh.gamecenter.qa.CommunityFragment import com.gh.gamecenter.qa.article.edit.ArticleEditActivity import com.gh.gamecenter.qa.questions.edit.QuestionEditActivity import com.gh.gamecenter.qa.recommends.AskRecommendsSubjectPageAdapter +import com.gh.gamecenter.qa.video.publish.VideoPublishActivity import com.gh.gamecenter.user.UserViewModel import com.google.android.material.appbar.AppBarLayout import kotterknife.bindView @@ -330,7 +331,7 @@ class ForumHomeFragment : BaseLazyTabFragment() { window?.setWindowAnimations(R.style.community_publication_animation) dialog.setContentView(contentView, params) dialog.show() - contentView.findViewById(R.id.community_edit_article).setOnClickListener { + contentView.findViewById(R.id.community_edit_article_container).setOnClickListener { context?.ifLogin("论坛首页", action = { checkStoragePermissionBeforeAction { showRegulationTestDialogIfNeeded { @@ -341,7 +342,7 @@ class ForumHomeFragment : BaseLazyTabFragment() { } }) } - contentView.findViewById(R.id.community_edit_question).setOnClickListener { + contentView.findViewById(R.id.community_edit_question_container).setOnClickListener { context?.ifLogin("论坛首页", action = { checkStoragePermissionBeforeAction { showRegulationTestDialogIfNeeded { @@ -352,6 +353,15 @@ class ForumHomeFragment : BaseLazyTabFragment() { } }) } + contentView.findViewById(R.id.community_edit_video_container).setOnClickListener { + checkStoragePermissionBeforeAction { + showRegulationTestDialogIfNeeded { + MtaHelper.onEvent("论坛首页", "发布", "发视频") + startActivity(VideoPublishActivity.getIntent(requireContext())) + dialog.dismiss() + } + } + } contentView.findViewById(R.id.community_edit_close).setOnClickListener { dialog.dismiss() } 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 0cc778948d..c923e4b623 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 @@ -28,7 +28,7 @@ import com.gh.gamecenter.eventbus.EBReuse import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.qa.answer.edit.AnswerEditActivity import com.gh.gamecenter.qa.article.draft.ArticleDraftActivity -import com.gh.gamecenter.qa.dialog.ChooseForumDialogFragment +import com.gh.gamecenter.qa.dialog.ChooseForumActivity import com.gh.gamecenter.qa.entity.ArticleDetailEntity import com.gh.gamecenter.qa.entity.ArticleDraftEntity import com.gh.gamecenter.qa.questions.edit.TagsSelectFragment @@ -79,12 +79,17 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - if (requestCode == ARTICLE_DRAFT_REQUEST_CODE && resultCode == Activity.RESULT_OK) { - val draftEntity = data?.getParcelableExtra(ArticleDraftEntity::class.java.simpleName) + if (data == null || resultCode != Activity.RESULT_OK) return + if (requestCode == ARTICLE_DRAFT_REQUEST_CODE) { + val draftEntity = data.getParcelableExtra(ArticleDraftEntity::class.java.simpleName) if (draftEntity != null) { mViewModel.draftEntity = draftEntity setArticleDraft() } + } else if (requestCode == ChooseForumActivity.CHOOSE_FORUM_REQUEST) { + val community = data.getParcelableExtra(EntranceUtils.KEY_COMMUNITY_DATA) + mViewModel.mSelectCommunityData = community + setGameName() } } @@ -418,10 +423,7 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb } private fun showSelectGameDialog() { - ChooseForumDialogFragment.show(this) { - mViewModel.mSelectCommunityData = it - setGameName() - } + ChooseForumActivity.startChooseForumActivity(this) } private fun setGameName() { diff --git a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumActivity.kt new file mode 100644 index 0000000000..f4cf1d7894 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumActivity.kt @@ -0,0 +1,111 @@ +package com.gh.gamecenter.qa.dialog + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.View +import androidx.core.widget.doOnTextChanged +import androidx.fragment.app.Fragment +import com.gh.base.BaseActivity +import com.gh.base.adapter.FragmentAdapter +import com.gh.common.util.DisplayUtils +import com.gh.common.util.EntranceUtils +import com.gh.common.util.doOnEnd +import com.gh.gamecenter.R +import com.gh.gamecenter.databinding.DialogChooseForumBinding +import com.gh.gamecenter.entity.CommunityEntity + +class ChooseForumActivity : BaseActivity() { + private lateinit var binding: DialogChooseForumBinding + private var mSearchResultFragment: ChooseForumContainerFragment? = null + private val mTabTitleList = arrayListOf("我的关注", "热门论坛") + private val mFragmentsList: ArrayList = arrayListOf() + + override fun getLayoutId(): Int = R.layout.dialog_choose_forum + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + DisplayUtils.transparentStatusBar(this) + binding = DialogChooseForumBinding.bind(mContentView) + + initViewPager() + binding.searchEt.doOnTextChanged { _, _, _, _ -> + if (binding.searchEt.text.isNullOrEmpty()) { + switchUI(false) + } else { + switchUI(true) + mSearchResultFragment?.setSearchKey(binding.searchEt.text.toString()) + } + } + binding.closeIv.setOnClickListener { finish() } + binding.maskView.alpha = 0f + binding.maskView.animate().alpha(1f).setDuration(300).start() + binding.maskView.setOnClickListener { binding.closeIv.performClick() } + binding.forumContainer.translationY = (DisplayUtils.getScreenHeight()).toFloat() + binding.forumContainer.animate().translationY(0f).setDuration(300).start() + } + + private fun initViewPager() { + mFragmentsList.clear() + mFragmentsList.add(ChooseForumContainerFragment.getInstance(ChooseForumContainerFragment.ChooseForumType.ATTENTION)) + mFragmentsList.add(ChooseForumContainerFragment.getInstance(ChooseForumContainerFragment.ChooseForumType.HOT)) + binding.viewPager.offscreenPageLimit = mFragmentsList.size + binding.viewPager.adapter = FragmentAdapter(supportFragmentManager, mFragmentsList, mTabTitleList) + binding.tabLayout.setupWithViewPager(binding.viewPager) + binding.tabIndicator.setupWithTabLayout(binding.tabLayout) + binding.tabIndicator.setupWithViewPager(binding.viewPager) + binding.tabIndicator.setIndicatorWidth(20) + } + + private fun switchUI(isSearch: Boolean) { + if (isSearch) { + binding.tabContainer.visibility = View.GONE + binding.line.visibility = View.GONE + binding.viewPager.visibility = View.GONE + binding.searchResultContainer.visibility = View.VISIBLE + + if (mSearchResultFragment == null || mSearchResultFragment?.isAdded == false) { + val beginTransaction = supportFragmentManager.beginTransaction() + mSearchResultFragment = supportFragmentManager.findFragmentByTag(ChooseForumContainerFragment::class.java.simpleName) as? ChooseForumContainerFragment + ?: ChooseForumContainerFragment.getInstance(ChooseForumContainerFragment.ChooseForumType.SEARCH) as ChooseForumContainerFragment + beginTransaction.replace(binding.searchResultContainer.id, mSearchResultFragment!!, ChooseForumContainerFragment::class.java.simpleName) + beginTransaction.commitAllowingStateLoss() + } + } else { + binding.tabContainer.visibility = View.VISIBLE + binding.line.visibility = View.VISIBLE + binding.viewPager.visibility = View.VISIBLE + binding.searchResultContainer.visibility = View.GONE + } + } + + fun chooseSuccess(community: CommunityEntity) { + val intent = Intent() + intent.putExtra(EntranceUtils.KEY_COMMUNITY_DATA, community) + setResult(Activity.RESULT_OK, intent) + finish() + } + + override fun finish() { + overridePendingTransition(0, 0) + binding.maskView.animate().alpha(0f).setDuration(300).start() + binding.root.animate() + .translationY(DisplayUtils.getScreenHeight().toFloat()) + .setDuration(300) + .doOnEnd { + super.finish() + } + .start() + } + + companion object { + const val CHOOSE_FORUM_REQUEST = 10 + + fun startChooseForumActivity(context: Activity) { + val intent = Intent(context, ChooseForumActivity::class.java) + context.overridePendingTransition(0, 0) + context.startActivityForResult(intent, CHOOSE_FORUM_REQUEST) + } + } +} \ No newline at end of file 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 new file mode 100644 index 0000000000..17eb6129c1 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerAdapter.kt @@ -0,0 +1,39 @@ +package com.gh.gamecenter.qa.dialog + +import android.content.Context +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView +import com.gh.base.BaseRecyclerViewHolder +import com.gh.common.util.MtaHelper +import com.gh.common.util.goneIf +import com.gh.gamecenter.baselist.ListAdapter +import com.gh.gamecenter.databinding.ForumItemBinding +import com.gh.gamecenter.entity.CommunityEntity +import com.gh.gamecenter.entity.ForumEntity +import com.gh.gamecenter.forum.detail.ForumDetailActivity +import com.gh.gamecenter.qa.entity.CommunitySelectEntity + +class ChooseForumContainerAdapter(content: Context, val onSelectCallback: ((entity: CommunityEntity) -> Unit)? = null) : ListAdapter(content) { + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return ForumItemViewHolder(ForumItemBinding.inflate(LayoutInflater.from(mContext), parent, false)) + } + + override fun getItemCount(): Int = mEntityList.size + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is ForumItemViewHolder) { + val forumEntity = mEntityList[position] + holder.binding.entity = forumEntity + holder.binding.forumIcon.displayGameIcon(forumEntity.game.getIcon(), forumEntity.game.iconSubscript) + holder.binding.followTv.visibility = View.GONE + holder.itemView.setOnClickListener { + onSelectCallback?.invoke(CommunityEntity(forumEntity.id, forumEntity.name, icon = forumEntity.game.getIcon(), iconSubscript = forumEntity.game.iconSubscript)) + } + } + } + + class ForumItemViewHolder(val binding: ForumItemBinding) : BaseRecyclerViewHolder(binding.root) +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerFragment.kt new file mode 100644 index 0000000000..c08df92906 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerFragment.kt @@ -0,0 +1,53 @@ +package com.gh.gamecenter.qa.dialog + +import android.os.Bundle +import android.view.View +import androidx.core.os.bundleOf +import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView +import com.gh.common.util.EntranceUtils +import com.gh.gamecenter.baselist.ListAdapter +import com.gh.gamecenter.baselist.ListFragment +import com.gh.gamecenter.entity.CommunityEntity +import com.gh.gamecenter.entity.ForumEntity + +class ChooseForumContainerFragment : ListFragment() { + + private var mAdapter: ChooseForumContainerAdapter? = null + private var type: String = "" + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + type = arguments?.getString(EntranceUtils.KEY_CHOOSE_FORUM_TYPE) ?: "" + } + + override fun provideListAdapter(): ListAdapter<*> { + return mAdapter ?: ChooseForumContainerAdapter(requireContext()) { + if (requireActivity() is ChooseForumActivity) { + (requireActivity() as ChooseForumActivity).chooseSuccess(it) + } + }.apply { + mAdapter = this + } + } + + fun setSearchKey(key: String) { + + } + + override fun isAutomaticLoad(): Boolean = type != ChooseForumType.SEARCH.value + + override fun getItemDecoration(): RecyclerView.ItemDecoration? = null + + companion object { + fun getInstance(type: ChooseForumType): Fragment { + return ChooseForumContainerFragment().with(bundleOf(EntranceUtils.KEY_CHOOSE_FORUM_TYPE to type.value)) + } + } + + enum class ChooseForumType(val value: String) { + ATTENTION("attention"), + HOT("hot"), + SEARCH("search") + } +} diff --git a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerViewModel.kt new file mode 100644 index 0000000000..ca56c64108 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerViewModel.kt @@ -0,0 +1,20 @@ +package com.gh.gamecenter.qa.dialog + +import android.app.Application +import com.gh.gamecenter.baselist.ListViewModel +import com.gh.gamecenter.entity.ForumEntity +import com.gh.gamecenter.manager.UserManager +import com.gh.gamecenter.retrofit.RetrofitManager +import com.gh.gamecenter.retrofit.service.ApiService +import io.reactivex.Observable + +class ChooseForumContainerViewModel(application: Application) : ListViewModel(application) { + private val mApi: ApiService = RetrofitManager.getInstance(getApplication()).api + override fun provideDataObservable(page: Int): Observable> { + return mApi.getFollowsForum(UserManager.getInstance().userId) + } + + override fun mergeResultLiveData() { + mResultLiveData.addSource>(mListLiveData) { mResultLiveData.postValue(it) } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumDialogFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumDialogFragment.kt deleted file mode 100644 index 492b4e543b..0000000000 --- a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumDialogFragment.kt +++ /dev/null @@ -1,74 +0,0 @@ -package com.gh.gamecenter.qa.dialog - -import android.app.Dialog -import android.os.Bundle -import android.view.Gravity -import android.view.LayoutInflater -import android.view.View -import android.view.ViewGroup -import androidx.appcompat.app.AppCompatActivity -import androidx.fragment.app.FragmentTransaction -import com.gh.base.fragment.BaseDialogFragment -import com.gh.gamecenter.R -import com.gh.gamecenter.databinding.DialogChooseForumBinding -import com.gh.gamecenter.entity.CommunityEntity -import com.gh.gamecenter.forum.select.ForumSelectFragment -import com.halo.assistant.HaloApp - -class ChooseForumDialogFragment : BaseDialogFragment() { - private lateinit var binding: DialogChooseForumBinding - var onSelectCallback: ((entity: CommunityEntity) -> Unit)? = null - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - binding = DialogChooseForumBinding.inflate(inflater, container, false) - return binding.root - } - - override fun onViewCreated(view: View, savedInstanceState: Bundle?) { - super.onViewCreated(view, savedInstanceState) - val beginTransaction = childFragmentManager.beginTransaction() - val forumSelectFragment = childFragmentManager.findFragmentByTag(ForumSelectFragment::class.java.simpleName) as? ForumSelectFragment - ?: ForumSelectFragment() - forumSelectFragment.onSelectCallback = { - onSelectCallback?.invoke(it) - dismissAllowingStateLoss() - } - beginTransaction.replace(binding.container.id, forumSelectFragment, ForumSelectFragment::class.java.simpleName) - beginTransaction.commitAllowingStateLoss() - binding.closeIv.setOnClickListener { dismissAllowingStateLoss() } - } - - override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { - val createDialog = super.onCreateDialog(savedInstanceState) - createDialog.setCanceledOnTouchOutside(true) - - val window = createDialog.window - window?.setGravity(Gravity.BOTTOM) - window?.setWindowAnimations(R.style.community_publication_animation) - return createDialog - } - - override fun onStart() { - super.onStart() - val width = HaloApp.getInstance().application.resources.displayMetrics.widthPixels - val height = dialog?.window?.attributes?.height ?: ViewGroup.LayoutParams.WRAP_CONTENT - dialog?.window?.setLayout(width, height) - } - - - companion object { - fun show(activity: AppCompatActivity, onSelectCallback: ((entity: CommunityEntity) -> Unit)) { - var fragment = activity.supportFragmentManager.findFragmentByTag(ChooseForumDialogFragment::class.java.name) as? ChooseForumDialogFragment - if (fragment == null) { - fragment = ChooseForumDialogFragment() - fragment.onSelectCallback = onSelectCallback - fragment.show(activity.supportFragmentManager, ChooseForumDialogFragment::class.java.name) - } else { - fragment.onSelectCallback = onSelectCallback - val transaction: FragmentTransaction = activity.supportFragmentManager.beginTransaction() - transaction.show(fragment) - transaction.commit() - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/editor/LocalVideoAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/editor/LocalVideoAdapter.kt index 146aeff7fa..d0851e313e 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/editor/LocalVideoAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/editor/LocalVideoAdapter.kt @@ -1,25 +1,23 @@ package com.gh.gamecenter.qa.editor +import android.content.Context import android.database.Cursor import android.view.LayoutInflater -import android.view.View import android.view.ViewGroup -import androidx.appcompat.app.AppCompatActivity import com.gh.base.BaseRecyclerViewHolder +import com.gh.common.util.ImageUtils import com.gh.common.util.TimeUtils +import com.gh.common.util.ToastUtils import com.gh.gamecenter.R import com.gh.gamecenter.databinding.LocalVideoItemBinding -import com.gh.gamecenter.databinding.PhotoPosterItemBinding -import com.gh.gamecenter.video.upload.view.UploadVideoActivity -import com.gh.gamecenter.video.videomanager.VideoManagerActivity import com.halo.assistant.HaloApp import com.zhihu.matisse.internal.entity.Item import com.zhihu.matisse.internal.entity.SelectionSpec import com.zhihu.matisse.internal.ui.adapter.RecyclerViewCursorAdapter import com.zhihu.matisse.internal.utils.PathUtils -class LocalVideoAdapter : RecyclerViewCursorAdapter(null) { - private val mImageResize = HaloApp.getInstance().application.resources.displayMetrics.widthPixels / 3 +class LocalVideoAdapter(val context: Context, val maxChooseSize: Int, val callback: (ArrayList) -> Unit) : RecyclerViewCursorAdapter(null) { + private val mSelectedVideoList = arrayListOf() override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): LocalVideoPreviewViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.local_video_item, parent, false) @@ -27,22 +25,34 @@ class LocalVideoAdapter : RecyclerViewCursorAdapter } override fun onBindViewHolder(holder: LocalVideoPreviewViewHolder, cursor: Cursor?, position: Int) { - val item = Item.valueOf(cursor) - SelectionSpec.getInstance().imageEngine.loadThumbnail( - HaloApp.getInstance().application, mImageResize, null, - holder.binding.preview, item.contentUri) + ImageUtils.display(holder.binding.preview, "file:///${PathUtils.getPath(context, item.contentUri)}") holder.binding.durationTv.text = TimeUtils.formatVideoDuration(item.duration / 1000) + holder.binding.checkImageView.isChecked = mSelectedVideoList.contains(item) holder.itemView.setOnClickListener { - val path = PathUtils.getPath(holder.itemView.context, item.contentUri) - val intent = UploadVideoActivity.getIntent(holder.itemView.context, path, "本地视频", "", "") - (holder.itemView.context as AppCompatActivity).startActivityForResult(intent, VideoActivity.INSERT_VIDEO_CODE) + if (mSelectedVideoList.contains(item)) { + mSelectedVideoList.remove(item) + notifyItemChanged(position) + callback.invoke(mSelectedVideoList) + } else { + if (mSelectedVideoList.size < maxChooseSize) { + mSelectedVideoList.add(item) + notifyItemChanged(position) + callback.invoke(mSelectedVideoList) + } else { + ToastUtils.showToast("至多选择${maxChooseSize}条视频") + } + } } } override fun getItemViewType(position: Int, cursor: Cursor?): Int { return 0 } + + fun getSelectedVideoList(): ArrayList { + return mSelectedVideoList + } } class LocalVideoPreviewViewHolder(val binding: LocalVideoItemBinding) : BaseRecyclerViewHolder(binding.root) diff --git a/app/src/main/java/com/gh/gamecenter/qa/editor/LocalVideoFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/editor/LocalVideoFragment.kt index abefa8c9f3..a8f59a1bcb 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/editor/LocalVideoFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/editor/LocalVideoFragment.kt @@ -8,12 +8,19 @@ import android.view.LayoutInflater import android.view.View import androidx.recyclerview.widget.GridLayoutManager import com.gh.base.fragment.BaseFragment +import com.gh.common.util.EntranceUtils import com.gh.common.util.dip2px +import com.gh.common.util.toColor +import com.gh.common.util.toDrawable import com.gh.common.view.GridSpacingItemDecoration +import com.gh.gamecenter.R import com.gh.gamecenter.databinding.ActivityEditorVideoBinding +import com.gh.gamecenter.entity.LocalVideoEntity import com.gh.gamecenter.video.upload.view.UploadVideoActivity +import com.shuyu.gsyvideoplayer.GSYVideoManager import com.zhihu.matisse.internal.entity.Album import com.zhihu.matisse.internal.model.AlbumMediaCollection +import com.zhihu.matisse.internal.utils.PathUtils class LocalVideoFragment : BaseFragment(), AlbumMediaCollection.AlbumMediaCallbacks { lateinit var binding: ActivityEditorVideoBinding @@ -31,10 +38,38 @@ class LocalVideoFragment : BaseFragment(), AlbumMediaCollection.AlbumMediaC super.onCreate(savedInstanceState) binding.reuseTvNoneData.text = "暂无数据~" binding.listRv.layoutManager = GridLayoutManager(requireContext(), 3) - binding.listRv.addItemDecoration(GridSpacingItemDecoration(3, 1F.dip2px(), false)) - mAdapter = LocalVideoAdapter() + binding.listRv.addItemDecoration(GridSpacingItemDecoration(3, 4F.dip2px(), false)) + val maxChooseCount = arguments?.getInt(EntranceUtils.KEY_CHOOSE_MAX_COUNT, 1) + mAdapter = LocalVideoAdapter(requireContext(), maxChooseCount ?: 1) { + binding.previewTv.isEnabled = it.isNotEmpty() + binding.confirmTv.isEnabled = it.isNotEmpty() + if (it.isEmpty()) { + binding.previewTv.setTextColor(R.color.text_cccccc.toColor()) + binding.confirmTv.alpha = 0.6f + } else { + binding.previewTv.setTextColor(R.color.text_666666.toColor()) + binding.confirmTv.alpha = 1f + } + binding.numTv.text = "${it.size}/${mAdapter.maxChooseSize}" + } + binding.numTv.text = "0/${mAdapter.maxChooseSize}" binding.listRv.adapter = mAdapter binding.listRefresh.isEnabled = false + + binding.previewTv.setOnClickListener { + val intent = PreviewVideoActivity.getIntent(requireContext(), mAdapter.getSelectedVideoList()) + requireActivity().startActivityForResult(intent, PREVIEW_VIDEO) + } + binding.confirmTv.setOnClickListener { + val localVideoList = arrayListOf() + mAdapter.getSelectedVideoList().forEach { + localVideoList.add(LocalVideoEntity(PathUtils.getPath(requireContext(), it.uri))) + } + val intent = Intent() + intent.putExtra(LocalVideoEntity::class.java.name, localVideoList) + requireActivity().setResult(Activity.RESULT_OK, intent) + requireActivity().finish() + } } override fun onAlbumMediaReset() { @@ -60,11 +95,9 @@ class LocalVideoFragment : BaseFragment(), AlbumMediaCollection.AlbumMediaC override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - if (data != null && requestCode == VideoActivity.INSERT_VIDEO_CODE) { - if (resultCode == UploadVideoActivity.RESULT_CODE_VIDEO) { - requireActivity().setResult(Activity.RESULT_OK, data) - requireActivity().finish() - } + if (data != null) { + requireActivity().setResult(Activity.RESULT_OK, data) + requireActivity().finish() } } @@ -73,4 +106,8 @@ class LocalVideoFragment : BaseFragment(), AlbumMediaCollection.AlbumMediaC mAlbumMediaCollection?.onDestroy() } + companion object { + const val PREVIEW_VIDEO = 100 + } + } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/editor/PreviewVideoActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/editor/PreviewVideoActivity.kt new file mode 100644 index 0000000000..45421caa37 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/qa/editor/PreviewVideoActivity.kt @@ -0,0 +1,34 @@ +package com.gh.gamecenter.qa.editor + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import com.gh.base.BaseActivity +import com.gh.common.util.DisplayUtils +import com.gh.common.util.EntranceUtils +import com.gh.gamecenter.R +import com.zhihu.matisse.internal.entity.Item + +class PreviewVideoActivity : BaseActivity() { + override fun getLayoutId(): Int { + return R.layout.activity_amway + } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + DisplayUtils.transparentStatusBar(this) + + val containerFragment = supportFragmentManager.findFragmentByTag(PreviewVideoFragment::class.java.simpleName) + ?: PreviewVideoFragment().with(intent.extras) + // 若 placeholder 外层为 RelativeLayout 的话,会出现莫名的偏移 + supportFragmentManager.beginTransaction().replace(R.id.placeholder, containerFragment, PreviewVideoFragment::class.java.simpleName).commitAllowingStateLoss() + } + + companion object { + fun getIntent(context: Context,videos:ArrayList): Intent { + val intent = Intent(context, PreviewVideoActivity::class.java) + intent.putExtra(EntranceUtils.KEY_VIDEO_LIST,videos) + return intent + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/editor/PreviewVideoFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/editor/PreviewVideoFragment.kt new file mode 100644 index 0000000000..7ccf0c0972 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/qa/editor/PreviewVideoFragment.kt @@ -0,0 +1,180 @@ +package com.gh.gamecenter.qa.editor + +import android.app.Activity +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.facebook.drawee.generic.GenericDraweeHierarchyBuilder +import com.facebook.drawee.generic.RoundingParams +import com.facebook.drawee.view.SimpleDraweeView +import com.gh.base.fragment.BaseFragment +import com.gh.base.fragment.WaitingDialogFragment +import com.gh.common.util.* +import com.gh.common.view.GridSpacingItemColorDecoration +import com.gh.gamecenter.CropImageActivity +import com.gh.gamecenter.R +import com.gh.gamecenter.databinding.FragmentPreviewVideoBinding +import com.gh.gamecenter.databinding.ItemVideoSelectorBinding +import com.gh.gamecenter.entity.LocalVideoEntity +import com.gh.gamecenter.video.poster.PosterEditActivity +import com.gh.gamecenter.video.upload.view.UploadVideoActivity +import com.lightgame.adapter.BaseRecyclerAdapter +import com.shuyu.gsyvideoplayer.GSYVideoManager +import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder +import com.zhihu.matisse.internal.entity.Item +import com.zhihu.matisse.internal.utils.PathUtils + +class PreviewVideoFragment : BaseFragment() { + private lateinit var mBinding: FragmentPreviewVideoBinding + private var mVideoItems: ArrayList = arrayListOf() + private var mProcessingDialog: WaitingDialogFragment? = null + private lateinit var mVideoSelectorAdapter: VideoSelectorAdapter + private val mLocalVideoList = arrayListOf() + override fun getLayoutId(): Int = 0 + + override fun getInflatedLayout(): View { + mBinding = FragmentPreviewVideoBinding.inflate(LayoutInflater.from(requireContext()), null, false) + return mBinding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + mVideoItems = arguments?.getParcelableArrayList(EntranceUtils.KEY_VIDEO_LIST) + ?: arrayListOf() + if (mVideoItems.isNotEmpty()) { + mVideoItems.forEach { + val localVideoEntity = LocalVideoEntity( + PathUtils.getPath(requireContext(), it.uri), + contentUri = it.contentUri, + duration = it.duration + ) + mLocalVideoList.add(localVideoEntity) + } + initVideo(mLocalVideoList[0]) + } + mBinding.numTv.text = "(1/${mVideoItems.size})" + mVideoSelectorAdapter = VideoSelectorAdapter(requireContext(), mLocalVideoList) { entity, position -> + mBinding.videoView.release() + mBinding.numTv.text = "(${position + 1}/${mVideoItems.size})" + initVideo(entity) + } + mBinding.videoSelectorRv.adapter = mVideoSelectorAdapter + mBinding.videoSelectorRv.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false) + mBinding.videoSelectorRv.addItemDecoration(GridSpacingItemColorDecoration(requireContext(), 8, 0, R.color.transparent)) + mBinding.confirmTv.setOnClickListener { + val intent = Intent() + intent.putExtra(LocalVideoEntity::class.java.name, mLocalVideoList) + requireActivity().setResult(Activity.RESULT_OK, intent) + requireActivity().finish() + } + + mBinding.changeCoverTv.setOnClickListener { + val item = mVideoItems[mVideoSelectorAdapter.selectPosition] + val intent = PosterEditActivity.getIntentByPath(requireContext(), PathUtils.getPath(requireContext(), item.uri)) + startActivityForResult(intent, UploadVideoActivity.REQUEST_CODE_IMAGE_CROP) + } + mBinding.backBtn.setOnClickListener { requireActivity().finish() } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + if (data == null || resultCode != Activity.RESULT_OK) return + if (requestCode == UploadVideoActivity.REQUEST_CODE_IMAGE_CROP) { + val imagePath = data.getStringExtra(CropImageActivity.RESULT_CLIP_PATH) ?: "" + if (imagePath.isNotEmpty()) { + uploadImage(imagePath) + } + } + } + + private fun uploadImage(imagePath: String) { + mProcessingDialog = WaitingDialogFragment.newInstance("图片上传中...", false) + mProcessingDialog?.show(requireActivity().supportFragmentManager, WaitingDialogFragment::class.java.name) + UploadImageUtils.uploadImage(UploadImageUtils.UploadType.poster, imagePath, object : UploadImageUtils.OnUploadImageListener { + override fun onSuccess(imageUrl: String) { + mProcessingDialog?.dismiss() + mLocalVideoList[mVideoSelectorAdapter.selectPosition].poster = imageUrl + mBinding.videoView.updateThumb(imageUrl) + } + + override fun onError(e: Throwable?) { + mProcessingDialog?.dismiss() + ToastUtils.showToast("上传失败") + } + + override fun onProgress(total: Long, progress: Long) {} + }) + } + + private fun initVideo(entity: LocalVideoEntity) { + GSYVideoOptionBuilder() + .setIsTouchWiget(false) + .setUrl(entity.filePath) + .setRotateViewAuto(false) + .setCacheWithPlay(false) + .setRotateWithSystem(false) + .setReleaseWhenLossAudio(true) + .setLooping(false) + .setShowFullAnimation(false) + .build(mBinding.videoView) + if (entity.poster.isNotEmpty()) { + mBinding.videoView.updateThumb(entity.poster) + } else { + mBinding.videoView.updateThumb("file:///${PathUtils.getPath(requireContext(), entity.contentUri)}") + } + } + + class VideoSelectorAdapter(context: Context, val localVideoList: ArrayList, val callback: (LocalVideoEntity, Int) -> Unit) : BaseRecyclerAdapter(context) { + var selectPosition: Int = 0 + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return VideoSelectorViewHolder(ItemVideoSelectorBinding.inflate(LayoutInflater.from(mContext), parent, false)) + } + + override fun getItemCount(): Int = localVideoList.size + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is VideoSelectorViewHolder) { + val item = localVideoList[position] + setPreviewBorder(holder.binding.preview, selectPosition == position) + ImageUtils.display(holder.binding.preview, "file:///${PathUtils.getPath(mContext, item.contentUri)}") + holder.binding.root.setOnClickListener { + selectPosition = position + callback.invoke(localVideoList[selectPosition], selectPosition) + notifyDataSetChanged() + } + } + } + + private fun setPreviewBorder(view: SimpleDraweeView, isSelected: Boolean) { + val params = RoundingParams() + params.setBorder(if (isSelected) R.color.white.toColor() else R.color.transparent.toColor(), 1f.dip2px().toFloat()) + params.setCornersRadius(4f.dip2px().toFloat()) + val build = GenericDraweeHierarchyBuilder.newInstance(mContext.resources) + .setRoundingParams(params) + .build() + view.hierarchy = build + } + } + + class VideoSelectorViewHolder(val binding: ItemVideoSelectorBinding) : RecyclerView.ViewHolder(binding.root) + + override fun onResume() { + super.onResume() + GSYVideoManager.onResume() + } + + override fun onPause() { + super.onPause() + GSYVideoManager.onPause() + } + + override fun onDestroy() { + super.onDestroy() + GSYVideoManager.releaseAllVideos() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/editor/VideoActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/editor/VideoActivity.kt index d4034d8471..584b3d3e8e 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/editor/VideoActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/editor/VideoActivity.kt @@ -17,6 +17,7 @@ import androidx.viewpager.widget.ViewPager import com.gh.base.ToolBarActivity import com.gh.base.adapter.FragmentAdapter import com.gh.base.fragment.BaseFragment_TabLayout +import com.gh.common.util.EntranceUtils import com.gh.common.util.viewModelProvider import com.gh.common.view.TabIndicatorView import com.gh.gamecenter.R @@ -48,6 +49,7 @@ class VideoActivity : ToolBarActivity(), AlbumCollection.AlbumCallbacks { private lateinit var mAlbumsSpinner: VideoAlbumsSpanner private lateinit var mAlbumsAdapter: VideoAlbumsAdapter private val mAlbumCollection = AlbumCollection() + private var mIsFirstAlbumLoad = true override fun getLayoutId(): Int = R.layout.activity_video_tablayout_viewpager @@ -55,11 +57,13 @@ class VideoActivity : ToolBarActivity(), AlbumCollection.AlbumCallbacks { super.onCreate(savedInstanceState) mViewModel = viewModelProvider() - mViewModel.obsListData.observe(this, Observer { - initViewPager() - initAlbumsSpinner() - }) - mViewModel.load(LoadType.REFRESH) +// mViewModel.obsListData.observe(this, Observer { +// initViewPager() +// initAlbumsSpinner() +// }) +// mViewModel.load(LoadType.REFRESH) + initViewPager() + initAlbumsSpinner() } private fun initAlbumsSpinner() { @@ -95,19 +99,22 @@ class VideoActivity : ToolBarActivity(), AlbumCollection.AlbumCallbacks { mAlbumCollection.loadAlbums() } - override fun onAlbumLoad(cursor: Cursor?) { - mAlbumsAdapter.swapCursor(cursor) - mBaseHandler.post { - cursor?.moveToPosition(mAlbumCollection.currentSelection) - val album = Album.valueOf(cursor) - if (album.isAll && SelectionSpec.getInstance().capture) { - album.addCaptureCount() - } - if (mLocalVideoFragment?.isAdded == true) { - mLocalVideoFragment?.loadVideos(album) + if (mIsFirstAlbumLoad) { + mIsFirstAlbumLoad = false + mAlbumsAdapter.swapCursor(cursor) + mBaseHandler.post { + cursor?.moveToPosition(mAlbumCollection.currentSelection) + val album = Album.valueOf(cursor) + if (album.isAll && SelectionSpec.getInstance().capture) { + album.addCaptureCount() + } + if (mLocalVideoFragment?.isAdded == true) { + mLocalVideoFragment?.loadVideos(album) + } } } + } override fun onAlbumReset() { @@ -115,14 +122,15 @@ class VideoActivity : ToolBarActivity(), AlbumCollection.AlbumCallbacks { } private fun initViewPager() { - if (!mViewModel.obsListData.value.isNullOrEmpty()) { + /*if (!mViewModel.obsListData.value.isNullOrEmpty()) { mTabTitleList.add("视频库") mFragmentsList.add(OnlineVideoFragment()) } else { mTabIndicatorView.visibility = View.GONE - } + }*/ + mTabIndicatorView.visibility = View.GONE mTabTitleList.add("本地视频") - mLocalVideoFragment = LocalVideoFragment() + mLocalVideoFragment = LocalVideoFragment().apply { arguments = intent.extras } mFragmentsList.add(mLocalVideoFragment!!) mViewPager.offscreenPageLimit = mFragmentsList.size mViewPager.adapter = FragmentAdapter(supportFragmentManager, mFragmentsList, mTabTitleList) @@ -146,9 +154,11 @@ class VideoActivity : ToolBarActivity(), AlbumCollection.AlbumCallbacks { private fun provideTabView(tabTitle: String): View { val binding = TabItemChooseVideoBinding.inflate(LayoutInflater.from(this), null, false) binding.tabTitle.text = tabTitle - if (mViewModel.obsListData.value.isNullOrEmpty()) { - binding.tabTitle.setTextColor(ContextCompat.getColor(this, R.color.text_333333)) - } +// if (mViewModel.obsListData.value.isNullOrEmpty()) { +// binding.tabTitle.setTextColor(ContextCompat.getColor(this, R.color.text_333333)) +// } + binding.tabTitle.setTextColor(ContextCompat.getColor(this, R.color.text_333333)) + binding.tabTitle.textSize = 16f if (tabTitle == "本地视频") { binding.tabArrow.visibility = View.VISIBLE binding.root.setOnTouchListener { _, _ -> @@ -169,10 +179,10 @@ class VideoActivity : ToolBarActivity(), AlbumCollection.AlbumCallbacks { } companion object { - const val INSERT_VIDEO_CODE = 414 - - fun getIntent(context: Context): Intent { - return Intent(context, VideoActivity::class.java) + fun getIntent(context: Context, maxChooseCount: Int = 1): Intent { + return Intent(context, VideoActivity::class.java).apply { + putExtra(EntranceUtils.KEY_CHOOSE_MAX_COUNT, maxChooseCount) + } } } } \ No newline at end of file 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 60a988cb5a..df9294cf9e 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 @@ -20,6 +20,7 @@ import androidx.core.widget.addTextChangedListener import androidx.databinding.DataBindingUtil import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders +import com.gh.base.BaseRichEditorActivity.Companion.INSERT_VIDEO_CODE import com.gh.base.ToolBarActivity import com.gh.base.fragment.WaitingDialogFragment import com.gh.common.AppExecutor @@ -38,7 +39,7 @@ import com.gh.gamecenter.mvvm.Status import com.gh.gamecenter.qa.answer.edit.AnswerEditActivity import com.gh.gamecenter.qa.article.draft.ArticleDraftActivity import com.gh.gamecenter.qa.article.edit.ArticleEditActivity -import com.gh.gamecenter.qa.dialog.ChooseForumDialogFragment +import com.gh.gamecenter.qa.dialog.ChooseForumActivity import com.gh.gamecenter.qa.editor.VideoActivity import com.gh.gamecenter.qa.entity.CommunityVideoEntity import com.gh.gamecenter.qa.entity.QuestionDraftEntity @@ -84,12 +85,12 @@ class QuestionEditActivity : ToolBarActivity(), KeyboardHeightObserver { @SuppressLint("Recycle") override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) - - if (requestCode == MEDIA_STORE_REQUEST && resultCode == RESULT_OK) { + if (data == null || resultCode != Activity.RESULT_OK) return + if (requestCode == MEDIA_STORE_REQUEST) { val selectedPics = Matisse.obtainResult(data) mViewModel.validatePic(selectedPics) - } else if (requestCode == VideoActivity.INSERT_VIDEO_CODE && resultCode == RESULT_OK) { - val videoEntity = data?.getParcelableExtra(MyVideoEntity::class.java.simpleName) + } else if (requestCode == INSERT_VIDEO_CODE) { + val videoEntity = data.getParcelableExtra(MyVideoEntity::class.java.simpleName) if (videoEntity != null) { mViewModel.videoLiveData.postValue(CommunityVideoEntity( id = videoEntity.id, @@ -98,13 +99,22 @@ class QuestionEditActivity : ToolBarActivity(), KeyboardHeightObserver { duration = RichEditor.formatVideoDuration(videoEntity.length), status = videoEntity.status)) } - } else if (requestCode == QUESTION_DRAFT_REQUEST_CODE && resultCode == RESULT_OK) { - val draftEntity = data?.getParcelableExtra(QuestionDraftEntity::class.java.simpleName) + } else if (requestCode == QUESTION_DRAFT_REQUEST_CODE) { + 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) + mViewModel.communityEntity = community + if (mViewModel.questionEntity != null) { + mViewModel.questionEntity?.community?.id = community?.id ?: "" + mViewModel.questionEntity?.community?.name = community?.name ?: "" + } + setForumName() + mBinding.vm = mViewModel } } @@ -494,7 +504,7 @@ class QuestionEditActivity : ToolBarActivity(), KeyboardHeightObserver { object : EmptyCallback { override fun onCallback() { MtaHelper.onEvent("发表问题", "插入链接", "插入视频") - startActivityForResult(VideoActivity.getIntent(this@QuestionEditActivity), VideoActivity.INSERT_VIDEO_CODE) + startActivityForResult(VideoActivity.getIntent(this@QuestionEditActivity), INSERT_VIDEO_CODE) } }) } @@ -574,15 +584,7 @@ class QuestionEditActivity : ToolBarActivity(), KeyboardHeightObserver { } private fun showSelectGameDialog() { - ChooseForumDialogFragment.show(this) { - mViewModel.communityEntity = it - if (mViewModel.questionEntity != null) { - mViewModel.questionEntity?.community?.id = it.id - mViewModel.questionEntity?.community?.name = it.name - } - setForumName() - mBinding.vm = mViewModel - } + ChooseForumActivity.startChooseForumActivity(this) } // Limits of EditText diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/PreviewVideoView.kt b/app/src/main/java/com/gh/gamecenter/qa/video/PreviewVideoView.kt new file mode 100644 index 0000000000..71e8e94f15 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/qa/video/PreviewVideoView.kt @@ -0,0 +1,59 @@ +package com.gh.gamecenter.qa.video + +import android.content.Context +import android.net.Uri +import android.util.AttributeSet +import android.view.Surface +import android.view.View +import android.widget.ImageView +import com.facebook.drawee.view.SimpleDraweeView +import com.gh.common.util.ImageUtils +import com.gh.gamecenter.R +import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer +import com.squareup.picasso.Picasso + +class PreviewVideoView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : StandardGSYVideoPlayer(context, attrs) { + + var thumbImage: SimpleDraweeView = findViewById(R.id.thumbImage) + + override fun getLayoutId(): Int { + return R.layout.layout_preview_video + } + + + /******************* 下方两个重载方法,在播放开始前不屏蔽封面,不需要可屏蔽 ********************/ + + override fun onSurfaceUpdated(surface: Surface) { + super.onSurfaceUpdated(surface) + if (mThumbImageViewLayout != null && mThumbImageViewLayout.visibility == View.VISIBLE) { + mThumbImageViewLayout.visibility = View.INVISIBLE + } + } + + fun updateThumb(url: String) { + ImageUtils.display(thumbImage, url) + } + + override fun setViewShowState(view: View?, visibility: Int) { + if (view === mThumbImageViewLayout && visibility != View.VISIBLE) { + return + } + super.setViewShowState(view, visibility) + } + + /********************************各类UI的状态显示*********************************************/ + + override fun touchSurfaceMoveFullLogic(absDeltaX: Float, absDeltaY: Float) { + super.touchSurfaceMoveFullLogic(absDeltaX, absDeltaY) + //不给触摸快进,如果需要,屏蔽下方代码即可 + mChangePosition = false + //不给触摸音量,如果需要,屏蔽下方代码即可 + mChangeVolume = false + //不给触摸亮度,如果需要,屏蔽下方代码即可 + mBrightness = false + } + + override fun touchDoubleUp() { + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishActivity.kt new file mode 100644 index 0000000000..adf1a5b69f --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishActivity.kt @@ -0,0 +1,26 @@ +package com.gh.gamecenter.qa.video.publish + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import android.view.View +import com.gh.gamecenter.NormalActivity +import com.gh.gamecenter.R + +class VideoPublishActivity : NormalActivity() { + override fun getLayoutId(): Int = R.layout.activity_video_publish + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + mToolbar.navigationIcon = null + findViewById(R.id.backBtn).setOnClickListener { finish() } + } + + companion object { + @JvmStatic + fun getIntent(context: Context): Intent { + return getTargetIntent(context, VideoPublishActivity::class.java, VideoPublishFragment::class.java) + } + } + +} \ No newline at end of file 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 new file mode 100644 index 0000000000..8c32d62cd7 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishFragment.kt @@ -0,0 +1,293 @@ +package com.gh.gamecenter.qa.video.publish + +import android.app.Activity +import android.content.Intent +import android.media.MediaMetadataRetriever +import android.media.ThumbnailUtils +import android.net.Uri +import android.os.Bundle +import android.provider.MediaStore +import android.view.LayoutInflater +import android.view.MenuItem +import android.view.View +import androidx.core.content.ContextCompat +import androidx.core.widget.doOnTextChanged +import com.gh.base.BaseRichEditorActivity +import com.gh.common.runOnUiThread +import com.gh.common.util.* +import com.gh.gamecenter.CropImageActivity +import com.gh.gamecenter.R +import com.gh.gamecenter.databinding.FragmentVideoPublishBinding +import com.gh.gamecenter.entity.CommunityEntity +import com.gh.gamecenter.entity.LocalVideoEntity +import com.gh.gamecenter.entity.VideoEntity +import com.gh.gamecenter.normal.NormalFragment +import com.gh.gamecenter.qa.dialog.ChooseForumActivity +import com.gh.gamecenter.qa.editor.VideoActivity +import com.gh.gamecenter.video.poster.PosterEditActivity +import com.gh.gamecenter.video.upload.OnUploadListener +import com.gh.gamecenter.video.upload.UploadManager +import com.gh.gamecenter.video.upload.view.VideoFileEntity +import com.lightgame.download.FileUtils +import java.io.File + +class VideoPublishFragment : NormalFragment() { + + private lateinit var mBinding: FragmentVideoPublishBinding + private lateinit var mViewModel: VideoPublishViewModel + private var mVideoFileEntity: VideoFileEntity? = null + private lateinit var mMenuDraft: MenuItem + private lateinit var mMenuPost: MenuItem + + override fun getLayoutId(): Int = 0 + + override fun getInflatedLayout(): View { + mBinding = FragmentVideoPublishBinding.inflate(LayoutInflater.from(requireContext()), null, false) + return mBinding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + setNavigationTitle("发视频") + initMenu(R.menu.menu_answer_post) + mMenuDraft = getItemMenu(R.id.menu_draft) + mMenuPost = getItemMenu(R.id.menu_answer_post) + mViewModel = viewModelProvider() + + mBinding.title.filters = arrayOf(TextHelper.getFilter(50, "标题最多50个字")) + mBinding.title.doOnTextChanged { text, start, count, after -> + if (text?.contains("\n") == true) { + mBinding.title.setText(text.toString().replace("\n", "")) + mBinding.title.setSelection(start) + return@doOnTextChanged + } + if (PatternUtils.isHasSpace(text.toString())) { + mBinding.title.setText(PatternUtils.replaceSpace(text.toString())) + mBinding.title.setSelection(start) + return@doOnTextChanged + } + checkPostButtonEnable() + } + + mBinding.uploadButton.setOnClickListener { + PermissionHelper.checkStoragePermissionBeforeAction(requireActivity(), object : EmptyCallback { + override fun onCallback() { + startActivityForResult(VideoActivity.getIntent(requireContext(), 1), BaseRichEditorActivity.INSERT_VIDEO_CODE) + } + }) + } + mBinding.videoPosterPatchHint.setOnClickListener { startMediaStore() } + mBinding.forumContainer.setOnClickListener { + ChooseForumActivity.startChooseForumActivity(requireActivity()) + } + mBinding.chooseActivityContainer.setOnClickListener { + //选择活动 + } + mBinding.deleteVideoIv.setOnClickListener { + + } + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + 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) + ?: arrayListOf() + if (localVideoList.isNotEmpty()) { + initUpload(localVideoList[0]) + } + } else if (requestCode == REQUEST_CODE_IMAGE_CROP) { + val imagePath = data.getStringExtra(CropImageActivity.RESULT_CLIP_PATH) + mBinding.videoPoster.setImageURI("file://$imagePath") + mVideoFileEntity?.poster = imagePath ?: "" + } else if (requestCode == ChooseForumActivity.CHOOSE_FORUM_REQUEST) { + val community = data.getParcelableExtra(EntranceUtils.KEY_COMMUNITY_DATA) + mViewModel.communityEntity = community + setForumName() + } + } + + private fun initUpload(localVideoEntity: LocalVideoEntity) { + val videoPath = localVideoEntity.filePath + if (videoPath.isEmpty() || !File(videoPath).exists()) { + handleFileNotFound() + return + } + if (localVideoEntity.poster.isNotEmpty()) { + ImageUtils.display(mBinding.videoPoster, localVideoEntity.poster) + } else { + val thumbnail = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Images.Thumbnails.MINI_KIND) + mBinding.videoPoster.setImageBitmap(thumbnail) + } + + mBinding.uploadButton.visibility = View.GONE + mBinding.videoPosterMask.visibility = View.GONE + mBinding.pauseButton.setOnClickListener { + when { + UploadManager.isUploading(videoPath) -> { + mBinding.uploadStatus.text = "上传已暂停" + mBinding.uploadInfoContainer.visibility = View.VISIBLE + mBinding.uploadSpeed.visibility = View.GONE + mBinding.pauseButton.setImageResource(R.drawable.upload_resume) + mBinding.pauseButton.visibility = View.VISIBLE + UploadManager.cancelTask(videoPath) + } + File(videoPath).exists() -> { + mBinding.uploadStatus.text = "视频上传中..." + mBinding.uploadInfoContainer.visibility = View.VISIBLE + mBinding.pauseButton.setImageResource(R.drawable.upload_pause) + mBinding.pauseButton.visibility = View.VISIBLE + createUploadTask(videoPath) + } + else -> { + handleFileNotFound() + toast("上传失败,视频文件不存在") + } + } + } + val videoFile = File(videoPath) + val retriever = MediaMetadataRetriever() + val fileUri = Uri.fromFile(videoFile) + retriever.setDataSource(requireContext(), fileUri) + val time = retriever.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION) ?: "0" + val timeInSecond = java.lang.Long.parseLong(time) / 1000 + retriever.release() + + var format = "" + tryWithDefaultCatch { + val mimeType = FileUtils.getFileMimeType(requireContext(), videoPath) + if (mimeType != null) { + val split = mimeType.split("/") + format = if (split.count() >= 2) { + split[1] + } else { + mimeType + } + } + } + + mVideoFileEntity = VideoFileEntity(videoPath, null, localVideoEntity.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) { + 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.uploadProgress.update(((360 * currentSize) / totalSize).toInt(), "") + } + } + + override fun onUploadSuccess(uploadFilePath: String, url: String) { + runOnUiThread { + handleUploadSuccess(url) + } + } + + override fun onUploadFailure(uploadFilePath: String, errorMsg: String) { + runOnUiThread { + if (!File(uploadFilePath).exists()) { + handleFileNotFound() + toast("上传失败,视频文件不存在") + } else { + mBinding.uploadStatus.text = "网络错误,中断上传" + mBinding.pauseButton.setImageResource(R.drawable.upload_resume) + mBinding.pauseButton.visibility = View.VISIBLE + toast("网络错误,请检查网络正常后再重试") + } + mBinding.uploadSpeed.visibility = View.GONE + } + } + }) + } + + private fun handleFileNotFound() { + mBinding.uploadButton.visibility = View.VISIBLE + mBinding.uploadInfoContainer.visibility = View.GONE + mBinding.videoPosterMask.visibility = View.VISIBLE + } + + private fun handleUploadSuccess(url: String) { + mBinding.uploadButton.visibility = View.GONE + mBinding.uploadInfoContainer.visibility = View.GONE + mBinding.videoPosterMask.visibility = View.GONE + mBinding.videoPosterPatchHint.visibility = View.VISIBLE + mBinding.uploadProgress.update(360, "") + mVideoFileEntity?.url = url + } + + private fun setForumName() { + if (mViewModel.communityEntity != null) { + mBinding.chooseForumTv.text = mViewModel.communityEntity?.name + mBinding.forumIconView.visibility = View.VISIBLE + mBinding.forumIconView.displayGameIcon(mViewModel.communityEntity?.icon, mViewModel.communityEntity?.iconSubscript) + mBinding.forumContainer.background = ContextCompat.getDrawable(requireContext(), R.drawable.bg_shape_f8_radius_4) + mBinding.chooseForumTv.setCompoundDrawablesWithIntrinsicBounds(null, null, ContextCompat.getDrawable(requireContext(), R.drawable.ic_article_edit_choose_forum_arrow_gray), null) + mBinding.chooseForumTv.setTextColor(ContextCompat.getColor(requireContext(), R.color.text_333333)) + } + } + + private fun checkPostButtonEnable() { + + } + + override fun onMenuItemClick(menuItem: MenuItem?) { + super.onMenuItemClick(menuItem) + when (menuItem?.itemId) { + R.id.menu_answer_post -> { + + } + R.id.menu_draft -> { + + } + } + } + + 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") + } + } + startActivityForResult(intent, REQUEST_CODE_IMAGE_CROP) + } + }) + } catch (e: Exception) { + toast(R.string.media_image_hint) + e.printStackTrace() + } + } + + override fun onDestroy() { + super.onDestroy() + val path = mVideoFileEntity?.path + if (path != null && UploadManager.isUploading(path)) { + UploadManager.cancelTask(path) + } + } + + companion object { + const val REQUEST_CODE_IMAGE_CROP = 101 + } + +} \ No newline at end of file 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 new file mode 100644 index 0000000000..41a3cd9508 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishViewModel.kt @@ -0,0 +1,9 @@ +package com.gh.gamecenter.qa.video.publish + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import com.gh.gamecenter.entity.CommunityEntity + +class VideoPublishViewModel(application: Application) : AndroidViewModel(application) { + var communityEntity: CommunityEntity? = null +} \ No newline at end of file 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 927256cc0f..2f7a74b5b4 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 @@ -584,7 +584,8 @@ class UploadVideoActivity : ToolBarActivity() { } else { val localVideoPoster = application.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) @@ -728,7 +729,7 @@ class UploadVideoActivity : ToolBarActivity() { } } } - mVideoFileEntity = VideoFileEntity(videoPath, null, timeInSecond, videoFile.length(), format) + mVideoFileEntity = VideoFileEntity(videoPath, null, "", timeInSecond, videoFile.length(), format) createUploadTask(videoPath) } diff --git a/app/src/main/java/com/gh/gamecenter/video/upload/view/VideoFileEntity.kt b/app/src/main/java/com/gh/gamecenter/video/upload/view/VideoFileEntity.kt index 58dc296f92..0161bb4d02 100644 --- a/app/src/main/java/com/gh/gamecenter/video/upload/view/VideoFileEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/video/upload/view/VideoFileEntity.kt @@ -3,7 +3,8 @@ package com.gh.gamecenter.video.upload.view data class VideoFileEntity( val path: String, var url: String?, - val length: Long, - val size: Long, + var poster: String, + var length: Long = 0, + var size: Long = 0, val format: String ) \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/community_edit_article.webp b/app/src/main/res/drawable-xxhdpi/community_edit_article.webp index 05d8cfd60dd97c2dba226753f15f70555da02f22..5fb8624587ee1de8eb52699ee3d2a4e7a91ca90e 100644 GIT binary patch literal 7496 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 Y)DMIo7d-%1>_>u|uG}F=000000FgY-ivR!s diff --git a/app/src/main/res/drawable-xxhdpi/community_edit_close.png b/app/src/main/res/drawable-xxhdpi/community_edit_close.png new file mode 100644 index 0000000000000000000000000000000000000000..8383082598e06159325153f2c77345529c1b194d GIT binary patch literal 765 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(;Zvw#`F1}W^m|1ySwfhpb7#W5s< z_3bRjyh8>8uCp(#-co%eG~wbr?y%S`+PgHu8Na;^?F#xo$z$D9mE`Juju|?RJsZ>i z%`Q~fR#TpSR4GAl14jgl4wD#T_W@J42NgDUk4klK6@9tmef0hJ-(O#r{5o{{>it{W zYA5tveaC+P!h@HQ-nAx^`Z`p4*lX>@yN`NbHnDfK{+i6byVNgi-{PA&-%RG8-~V@8 zMC_c0Cmu}g{4mKc zp^e20vk$FeUhZ_gZ7GBI!i)Uf{N+ElzjEBIy~X|N6ZN&5=e_*i`R1(^_vsE*DV>^& z4T&{OQn81eT3d~^3}jRsE+?*LsJk&2Hzjn(Q{SU;w$?x2>-G=e^bk`-271W+4s24g~U8!;s5jf0x&*rdYrHLlI(JQPIH3N;hA&S`TDE1 j@ot7CiU!vQVagx4ePUWaIG8>O03|(7S3j3^P67Zb-qhqbnbH)i z+$&94S|-f(L21m|(k|XA&9|{${&G;-bLnf8UzCyOTo=1j#&)(A!CD#2K!fO{j6QL) zk;!P$Re@wQQgBi*Pr)emS^=d!#-D=95%L)10Kd-Sz85oYkgBI$o#@OV50S@RG`Zbi#;kX-lYn5`cC4KZ@e3>oA=Tv z;C$(k^(5UVGP;7<44r}``&?jwPy+AFTr>TAx^BqWIFB{kZgn*6~)iZA{&*`k)hQOBgtpdtF#s!q7!3Z`0jm zN@23s^v@~SH=Z!x&ARO{2De@23Ybn-`PJfI9>Uf|785e^*R0l;tkjz%Ke8wkN;@!G1N4K~1N5-`LBHixaCRcW;e&B- z00qwiyz$hH??E7Yo*}dI0Yyh45D8Ff49O$}e5b!UU-Q2nPENGo<}WnsGPfcFN->VQ zpn0HW(Aq`Y6xKL!?veSvn8nFCaB8d7A==q!iB3}={E=KWm;eC&|0fLfm5nZTM4i3) zT`}rALTCR3?4ITK4V2#dhjmD}p9lJ;nqt&SYPj)-@IO&=>IRsHja2Vf{$1{0MRMgn zV?Cx~$G^)Ti7DxS_|73`f;@zdI?Z$fD#&$s!buk>@kqLOW97jgwv)}=G#svxfzNyx zawJJDe0ulY=)VW!l+`1Mo3S8M0Cv+o^ZPE`JS_e$6Y zSV#X*n9E?LJpWgY*XW`QDqazPcKAUY4!Z-8?ArLV-Ur^J`ppr7}66Gjwr1h-T zdDkxq68yS3_7C=MBWBQ$$fb>`;1`Nj!LRe7#^_B0{sI2>8T_ z({0sr^oxufv#(qLV$~p@JJsa~-ik}VcVSxj+G&r$n99s(DbK$@5g zvwjfx+3eKXY(ve;O(r@4GldZL3D=it_;d7;(h=;`v} z4nO|!e%JwYUS6=odK6<9H^AonP4}$B*DZ6GI7srJYYfjU#N%?lJRm{#VVvdOc>xv8 zlpKE*vaC*h-Kx4)e5#YTqTiYLc{cKxrdf7GH$)uq%4-v6VWk-e{whbcgA~~FP@x%+ zeq-MVqJOXbv{177yTMe0K5Jb@tC;Zo5Q@yJ7M13I_jEoXzKDh_mikH)*?7v(A}_bi zW0j*B47&cK$TS$LK)@&g8COC49!Ow!p&LbWmp$s9`4x=v>`sgLl= zMpx3>3^8<{+YG<|65?NQWRS4q2U}DewQKvG%c@ebdnDtSu~dI}3TS66ECI35S*7^o zUgE?CG;>knzY0lR42zW+T`SRw@;w^`4-GAOJ@da=9i`(ROXSW3Cl&sgMqa{loJzE@ e=bQmnUwrj`dW-JvJE-96-&%iLqiIK}0002_KaUas diff --git a/app/src/main/res/drawable-xxhdpi/community_edit_question.webp b/app/src/main/res/drawable-xxhdpi/community_edit_question.webp index d312d27892a13c02d7842754ed274915a6406f72..c093c8cfa8b9147184f52ce4ae04c11676ffbea5 100644 GIT binary patch literal 7224 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 G5r6=_y(m=x literal 4656 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 diff --git a/app/src/main/res/drawable-xxhdpi/community_edit_video.webp b/app/src/main/res/drawable-xxhdpi/community_edit_video.webp new file mode 100644 index 0000000000000000000000000000000000000000..2a7459bff8e36b368c6aa808a4f1bbba79428c26 GIT binary patch literal 6944 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/ic_del_video.png b/app/src/main/res/drawable-xxhdpi/ic_del_video.png new file mode 100644 index 0000000000000000000000000000000000000000..f37d1eeb974e1e9e744e0cf96a636a1fcc855eea GIT binary patch literal 1921 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 w$|{o5Yrk2fT0;HnV;-9j7Co%XHq)$ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/bg_change_cover_btn.xml b/app/src/main/res/drawable/bg_change_cover_btn.xml new file mode 100644 index 0000000000..1d2e5fd0e9 --- /dev/null +++ b/app/src/main/res/drawable/bg_change_cover_btn.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/border_round_stroke_0dot5_eee_999.xml b/app/src/main/res/drawable/border_round_stroke_0dot5_eee_999.xml new file mode 100644 index 0000000000..2e24f2006c --- /dev/null +++ b/app/src/main/res/drawable/border_round_stroke_0dot5_eee_999.xml @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_editor_video.xml b/app/src/main/res/layout/activity_editor_video.xml index fbf97bbd5c..7eface2233 100644 --- a/app/src/main/res/layout/activity_editor_video.xml +++ b/app/src/main/res/layout/activity_editor_video.xml @@ -6,22 +6,71 @@ android:background="@color/white" android:orientation="vertical"> - - + android:layout_marginLeft="2dp" + android:layout_marginRight="2dp"> - + android:layout_height="match_parent" + android:orientation="vertical"> + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/community_edit_window.xml b/app/src/main/res/layout/community_edit_window.xml index 857ab0022d..590c50dbf9 100644 --- a/app/src/main/res/layout/community_edit_window.xml +++ b/app/src/main/res/layout/community_edit_window.xml @@ -6,87 +6,103 @@ - + app:layout_constraintTop_toTopOf="parent"> - + + + + + + - + + + + + + + + - - - + app:layout_constraintStart_toEndOf="@+id/community_edit_question_container" + app:layout_constraintTop_toTopOf="parent"> + + + + + + - - - + app:layout_constraintRight_toRightOf="parent" /> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_choose_forum.xml b/app/src/main/res/layout/dialog_choose_forum.xml index 30b893105c..29dbff9d52 100644 --- a/app/src/main/res/layout/dialog_choose_forum.xml +++ b/app/src/main/res/layout/dialog_choose_forum.xml @@ -2,14 +2,23 @@ + android:layout_height="match_parent" + android:background="@color/transparent" + android:focusable="true" + android:focusableInTouchMode="true"> + + + android:background="@drawable/game_detail_more_dialog_background"> - + + + + + + + + + + + + app:layout_constraintTop_toBottomOf="@+id/line" /> + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_preview_video.xml b/app/src/main/res/layout/fragment_preview_video.xml new file mode 100644 index 0000000000..53ee8687d7 --- /dev/null +++ b/app/src/main/res/layout/fragment_preview_video.xml @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_video_publish.xml b/app/src/main/res/layout/fragment_video_publish.xml new file mode 100644 index 0000000000..bfe9e6002e --- /dev/null +++ b/app/src/main/res/layout/fragment_video_publish.xml @@ -0,0 +1,278 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_video_selector.xml b/app/src/main/res/layout/item_video_selector.xml new file mode 100644 index 0000000000..34fa87a15e --- /dev/null +++ b/app/src/main/res/layout/item_video_selector.xml @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_preview_video.xml b/app/src/main/res/layout/layout_preview_video.xml new file mode 100644 index 0000000000..333348787d --- /dev/null +++ b/app/src/main/res/layout/layout_preview_video.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/local_video_item.xml b/app/src/main/res/layout/local_video_item.xml index e5b3c1bd23..4819f1391d 100644 --- a/app/src/main/res/layout/local_video_item.xml +++ b/app/src/main/res/layout/local_video_item.xml @@ -8,20 +8,33 @@ + app:roundingBorderColor="@color/black_alpha_10" + app:roundingBorderWidth="0.5dp" /> + #0D000000 #1A000000 #4D000000 + #99000000 #66000000 #80000000 diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 417428d210..06a72e0c7f 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -69,6 +69,13 @@ + + + + \ No newline at end of file From 87597dbd1f7995f9f407d07821d37c2a0380c090 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Sat, 29 May 2021 16:07:33 +0800 Subject: [PATCH 22/61] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=B8=96=E5=AD=90?= =?UTF-8?q?=E3=80=81=E9=97=AE=E9=A2=98=E5=8F=91=E5=B8=83=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/base/BaseRichEditorViewModel.kt | 13 ++- .../detail/ForumArticleAskListAdapter.kt | 3 +- .../forum/detail/ForumDetailFragment.kt | 4 +- .../forum/home/CommunityHomeFragment.kt | 4 +- .../home/ForumArticleAskItemViewHolder.kt | 4 +- .../forum/home/ForumHomeFragment.kt | 4 +- .../search/ForumContentSearchListAdapter.kt | 7 +- .../fuli/answer/GameDetailAnswerAdapter.kt | 4 +- .../message/MessageItemViewHolder.java | 5 +- .../personalhome/home/UserHistoryFragment.kt | 4 +- .../qa/{VideoInsertType.kt => BbsType.kt} | 6 +- .../detail/ArticleDetailContentViewHolder.kt | 4 + .../qa/article/edit/ArticleEditActivity.kt | 72 +++++++++++++--- .../qa/article/edit/ArticleEditViewModel.kt | 24 ++++-- .../article/edit/ArticleTagsSelectFragment.kt | 2 +- .../qa/entity/ArticleDetailEntity.kt | 10 ++- .../qa/entity/ArticleDraftEntity.kt | 10 ++- .../qa/entity/QuestionDraftEntity.kt | 11 ++- .../qa/entity/QuestionsDetailEntity.kt | 9 ++ .../gamecenter/qa/follow/AskFollowAdapter.kt | 3 +- .../newest/AskQuestionsNewBodyFragment.java | 3 +- .../qa/questions/edit/QuestionEditActivity.kt | 83 +++++++++++++++---- .../questions/edit/QuestionEditViewModel.kt | 25 +++++- .../qa/questions/edit/TagsSelectFragment.kt | 19 +++-- .../newdetail/NewQuestionDetailActivity.kt | 9 +- .../newdetail/NewQuestionDetailFragment.kt | 77 +++++++++++++++++ .../newdetail/NewQuestionDetailViewModel.kt | 38 +++++++++ .../QuestionDetailContentViewHolder.kt | 5 ++ .../AskQuestionsRecommendsFragment.java | 4 +- .../newest/RecommendNewestAdapter.kt | 3 +- .../qa/video/publish/VideoPublishActivity.kt | 8 +- .../qa/video/publish/VideoPublishFragment.kt | 23 +++-- .../res/layout/fragment_article_detail.xml | 5 +- 33 files changed, 403 insertions(+), 102 deletions(-) rename app/src/main/java/com/gh/gamecenter/qa/{VideoInsertType.kt => BbsType.kt} (53%) diff --git a/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt b/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt index fa2498ef08..e2c28f5d69 100644 --- a/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt +++ b/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt @@ -12,7 +12,7 @@ import com.gh.common.util.* import com.gh.gamecenter.R import com.gh.gamecenter.entity.ErrorEntity import com.gh.gamecenter.entity.LocalVideoEntity -import com.gh.gamecenter.qa.VideoInsertType +import com.gh.gamecenter.qa.BbsType import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager import com.gh.gamecenter.retrofit.service.ApiService @@ -45,6 +45,7 @@ abstract class BaseRichEditorViewModel(application: Application) : AndroidViewMo val localVideoList = ArrayList() val uploadVideoErrorList = ArrayList() var currentUploadingVideo: LocalVideoEntity? = null + var type: String = ""//游戏论坛:game_bbs 官方论坛:official_bbs private var mUploadVideoListener: UploadVideoListener? = null val TITLE_MIN_LENGTH = 6 val MIN_TEXT_LENGTH = 6 @@ -232,6 +233,14 @@ abstract class BaseRichEditorViewModel(application: Application) : AndroidViewMo }) } + private fun getVideoType(): String { + return when (type) { + BbsType.GAME_BBS.value -> BbsType.GAME_BBS_INSERT.value + BbsType.OFFICIAL_BBS.value -> BbsType.OFFICIAL_BBS_INSERT.value + else -> "" + } + } + fun postVideoInfo(url: String, poster: String) { val map = HashMap().apply { put("poster", poster) @@ -239,7 +248,7 @@ abstract class BaseRichEditorViewModel(application: Application) : AndroidViewMo put("format", currentUploadingVideo?.format ?: "") put("size", currentUploadingVideo?.size ?: 0) put("length", currentUploadingVideo?.duration ?: 0) - put("type", VideoInsertType.GAME_BBS_INSERT.value) + put("type", getVideoType()) } val requestBody = map.toRequestBody() mApi.postBbsVideo(requestBody) 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 e4c5fb81f2..3f6d7564d4 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 @@ -82,8 +82,7 @@ class ForumArticleAskListAdapter(context: Context, val bbsId: String, val mEntra mContext.startActivity(ArticleDetailActivity.getIntent(mContext, CommunityEntity(bbsId), answer.id!!, mEntrance, path)) } else { MtaHelper.onEvent(holder.getEventId(entrance), holder.getKey(entrance), "${answer.articleTitle}(${answer.id})") -// mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, answer.id, mEntrance, path)) - mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, CommunityEntity(bbsId), answer.id + mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, answer.id ?: "", mEntrance, path)) } } 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 62c475b228..eaed3f4bd6 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 @@ -44,7 +44,7 @@ import com.gh.gamecenter.forum.search.ForumOrUserSearchActivity import com.gh.gamecenter.gamedetail.GameDetailFragment import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.mvvm.Status -import com.gh.gamecenter.qa.VideoInsertType +import com.gh.gamecenter.qa.BbsType import com.gh.gamecenter.qa.article.edit.ArticleEditActivity import com.gh.gamecenter.qa.questions.edit.QuestionEditActivity import com.gh.gamecenter.qa.video.publish.VideoPublishActivity @@ -440,7 +440,7 @@ class ForumDetailFragment : BaseLazyTabFragment() { val communityEntity = CommunityEntity(mForumDetail?.id ?: "", mForumDetail?.name ?: "", icon = mForumDetail?.game?.getIcon(), iconSubscript = mForumDetail?.game?.iconSubscript) - startActivity(VideoPublishActivity.getIntent(requireContext(), communityEntity, VideoInsertType.GAME_BBS, mEntrance, "论坛详情")) + startActivity(VideoPublishActivity.getIntent(requireContext(), communityEntity, BbsType.GAME_BBS, mEntrance, "论坛详情")) dialog.dismiss() } }) 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 b3b023d4fe..648896e781 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 @@ -21,7 +21,7 @@ import com.gh.gamecenter.eventbus.EBTypeChange import com.gh.gamecenter.forum.search.ForumOrUserSearchActivity import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.qa.CommunityFragment -import com.gh.gamecenter.qa.VideoInsertType +import com.gh.gamecenter.qa.BbsType import com.gh.gamecenter.qa.article.edit.ArticleEditActivity import com.gh.gamecenter.qa.questions.edit.QuestionEditActivity import com.gh.gamecenter.qa.video.publish.VideoPublishActivity @@ -210,7 +210,7 @@ class CommunityHomeFragment : LazyFragment() { checkStoragePermissionBeforeAction { showRegulationTestDialogIfNeeded { MtaHelper.onEvent("论坛首页", "发布", "发视频") - startActivity(VideoPublishActivity.getIntent(requireContext(), null, VideoInsertType.GAME_BBS, mEntrance, "论坛首页")) + startActivity(VideoPublishActivity.getIntent(requireContext(), null, BbsType.GAME_BBS, mEntrance, "论坛首页")) dialog.dismiss() } } 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 911134b7d3..673e8bc4be 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 @@ -18,8 +18,8 @@ import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.qa.entity.AnswerEntity import com.gh.gamecenter.qa.entity.ArticleEntity import com.gh.gamecenter.qa.entity.QuestionsDetailEntity -import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity import com.gh.gamecenter.qa.questions.invite.QuestionsInviteActivity +import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : BaseAnswerOrArticleItemViewHolder(binding.root) { @@ -166,7 +166,7 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B MtaHelper.onEvent(getEventId(entrance), getKey(entrance), "评论图标") } else { val intent = if (entity.questions.answerCount > 0) { - QuestionsDetailActivity.getIntent(it.context, entity.questions.id, entrance, "") + NewQuestionDetailActivity.getIntent(it.context, entity.questions.id, entrance, "") } else { MtaHelper.onEvent(getEventId(entrance), getKey(entrance), "我来回答") AnswerEditActivity.getIntent(it.context, entity.questions, entity.communityName) diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumHomeFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumHomeFragment.kt index 641c3594fc..e824d85155 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumHomeFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumHomeFragment.kt @@ -36,7 +36,7 @@ import com.gh.gamecenter.forum.select.ForumSelectActivity import com.gh.gamecenter.fragment.MainWrapperFragment import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.qa.CommunityFragment -import com.gh.gamecenter.qa.VideoInsertType +import com.gh.gamecenter.qa.BbsType import com.gh.gamecenter.qa.article.edit.ArticleEditActivity import com.gh.gamecenter.qa.questions.edit.QuestionEditActivity import com.gh.gamecenter.qa.recommends.AskRecommendsSubjectPageAdapter @@ -358,7 +358,7 @@ class ForumHomeFragment : BaseLazyTabFragment() { checkStoragePermissionBeforeAction { showRegulationTestDialogIfNeeded { MtaHelper.onEvent("论坛首页", "发布", "发视频") - startActivity(VideoPublishActivity.getIntent(requireContext(), null, VideoInsertType.GAME_BBS, mEntrance, "论坛首页")) + startActivity(VideoPublishActivity.getIntent(requireContext(), null, BbsType.GAME_BBS, mEntrance, "论坛首页")) dialog.dismiss() } } 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 1f236f8bbd..8e5136717a 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 @@ -20,12 +20,11 @@ import com.gh.gamecenter.baselist.ListAdapter import com.gh.gamecenter.databinding.CommunityAnswerItemBinding import com.gh.gamecenter.databinding.ForumSearchContentListBinding import com.gh.gamecenter.entity.CommunityEntity -import com.gh.gamecenter.entity.RatingComment import com.gh.gamecenter.forum.home.ForumArticleAskItemViewHolder import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.qa.entity.AnswerEntity import com.gh.gamecenter.qa.entity.Questions -import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity +import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity class ForumContentSearchListAdapter(context: Context, val mListViewModel: ForumContentSearchListViewModel, val mEntrance: String) : ListAdapter(context), ISyncAdapterHandler { @@ -106,7 +105,7 @@ class ForumContentSearchListAdapter(context: Context, val mListViewModel: ForumC mContext.startActivity(ArticleDetailActivity.getIntent(mContext, CommunityEntity(answer.bbs.id), answer.id!!, mEntrance, "")) } else { MtaHelper.onEvent(holder.getEventId(entrance), holder.getKey(entrance), "${answer.articleTitle}(${answer.id})") - mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, answer.id, mEntrance, "")) + mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, answer.id?:"", mEntrance, "")) } } if (answer.type != "community_article") { @@ -155,7 +154,7 @@ class ForumContentSearchListAdapter(context: Context, val mListViewModel: ForumC if ("community_article" == answer.type) { mContext.startActivity(ArticleDetailActivity.getIntent(mContext, CommunityEntity(answer.bbs.id), answer.id!!, mEntrance, "")) } else { - mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, answer.id, mEntrance, "")) + mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, answer.id?:"", mEntrance, "")) } } } diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/answer/GameDetailAnswerAdapter.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/answer/GameDetailAnswerAdapter.kt index 9d8c82f45a..e9a460eb14 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/answer/GameDetailAnswerAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/fuli/answer/GameDetailAnswerAdapter.kt @@ -18,7 +18,7 @@ import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.qa.entity.AnswerEntity import com.gh.gamecenter.qa.entity.Questions -import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity +import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity import com.halo.assistant.HaloApp import com.lightgame.adapter.BaseRecyclerAdapter @@ -59,7 +59,7 @@ class GameDetailAnswerAdapter(context: Context, mContext.startActivity(ArticleDetailActivity.getIntent(mContext, CommunityEntity(entity.articleCommunityId, ""), entity.id!!, mEntrance, path)) } else { MtaHelper.onEvent("游戏详情_新", "点击问题", mViewModel.game?.name + "+" + entity.questions.title) - mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, entity.questions.id, mEntrance, path)) + mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, entity.questions.id, mEntrance, path)) } } diff --git a/app/src/main/java/com/gh/gamecenter/message/MessageItemViewHolder.java b/app/src/main/java/com/gh/gamecenter/message/MessageItemViewHolder.java index 47d81cc881..449e796f1f 100644 --- a/app/src/main/java/com/gh/gamecenter/message/MessageItemViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/message/MessageItemViewHolder.java @@ -34,6 +34,7 @@ import com.gh.gamecenter.qa.comment.CommentActivity; import com.gh.gamecenter.qa.entity.Questions; import com.gh.gamecenter.qa.follow.AskFollowMoreDialog; import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity; +import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity; import com.gh.gamecenter.retrofit.Response; import com.gh.gamecenter.retrofit.RetrofitManager; import com.gh.gamecenter.video.detail.VideoDetailContainerViewModel; @@ -527,7 +528,7 @@ public class MessageItemViewHolder extends BaseRecyclerViewHolder case "invited": if (view.getId() == R.id.message_original || view.getId() == R.id.message_item) { MessageEntity.Question question = entity.getQuestion(); - context.startActivity(QuestionsDetailActivity.getIntent(context, question.getId(), entrance, path)); + context.startActivity(NewQuestionDetailActivity.getIntent(context, question.getId(), entrance, path)); Questions questions = new Questions(); questions.setId(question.getId()); @@ -539,7 +540,7 @@ public class MessageItemViewHolder extends BaseRecyclerViewHolder case "follow_question": if (view.getId() == R.id.message_original) { MessageEntity.Question question = entity.getQuestion(); - context.startActivity(QuestionsDetailActivity.getIntent(context, question.getId(), entrance, path)); + context.startActivity(NewQuestionDetailActivity.getIntent(context, question.getId(), entrance, path)); Questions questions = new Questions(); questions.setId(question.getId()); 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 98967e7822..58707183ba 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 @@ -26,7 +26,7 @@ import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.qa.entity.AnswerDetailEntity import com.gh.gamecenter.qa.entity.ArticleDetailEntity import com.gh.gamecenter.qa.entity.QuestionsDetailEntity -import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity +import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity import com.halo.assistant.HaloApp import kotlinx.android.synthetic.main.fragment_user_history.* @@ -84,7 +84,7 @@ class UserHistoryFragment : ListFragment(), Keyb override fun handleMessage(msg: Message) { super.handleMessage(msg) if (msg.what == 1) { - if (mViewModel.mSelectCommunityData != null - && !TextUtils.isEmpty(mEditTitle.text.trim()) + if (!TextUtils.isEmpty(mEditTitle.text.trim()) && (!TextUtils.isEmpty(mRichEditor.text) || mRichEditor.html.contains("(), Keyb val community = data.getParcelableExtra(EntranceUtils.KEY_COMMUNITY_DATA) mViewModel.mSelectCommunityData = community setGameName() + } else if (requestCode == VideoPublishFragment.REQUEST_GAME_CODE) { + val game = data.getParcelableExtra(GameEntity::class.java.simpleName) + if (game != null) { + mViewModel.gameEntity = game + setGameName() + } } } @@ -240,6 +250,7 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb setNavigationTitle("发布帖子") mBaseHandler.sendEmptyMessageDelayed(1, SAVE_DRAFTS_INTERVAL_TIME.toLong()) mViewModel.mSelectCommunityData = intent.getParcelableExtra(CommunityEntity::class.java.simpleName) + mViewModel.type = intent?.getStringExtra(BbsType::class.java.simpleName) ?: "" if (mViewModel.mSelectCommunityData != null) { setGameName() mGameName.isEnabled = false @@ -282,6 +293,14 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb mViewModel.mSelectCommunityData?.icon = mViewModel.draftEntity?.community?.game?.getIcon() mViewModel.mSelectCommunityData?.iconSubscript = mViewModel.draftEntity?.community?.game?.iconSubscript } + if (!mViewModel.draftEntity?.tagActivityId.isNullOrEmpty() && !mViewModel.draftEntity?.tagActivityName.isNullOrEmpty()) { + mViewModel.selectActivityLabelEntity = ActivityLabelEntity(mViewModel.draftEntity?.tagActivityId + ?: "", mViewModel.draftEntity?.tagActivityName ?: "") + mActivityTitle.text = mViewModel.draftEntity?.tagActivityName ?: "" + mActivityTitle.setTextColor(R.color.text_FA8500.toColor()) + } + mViewModel.type = mViewModel.draftEntity?.type ?: "" + mViewModel.gameEntity = mViewModel.gameEntity mEditTitle.setText(mViewModel.draftEntity?.title) mGameName.isEnabled = true setGameName() @@ -290,10 +309,18 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb private fun setPatchContent() { //编辑贴子可能存在草稿 + mViewModel.type = mViewModel.detailEntity?.type ?: "" mViewModel.draftEntity = mViewModel.detailEntity?.me?.articleDraft mViewModel.mSelectCommunityData = mViewModel.detailEntity?.community mViewModel.mSelectCommunityData?.icon = mViewModel.detailEntity?.community?.game?.getIcon() mViewModel.mSelectCommunityData?.iconSubscript = mViewModel.detailEntity?.community?.game?.iconSubscript + mViewModel.gameEntity = mViewModel.detailEntity?.gameEntity + if (!mViewModel.detailEntity?.tagActivityId.isNullOrEmpty() && !mViewModel.detailEntity?.tagActivityName.isNullOrEmpty()) { + mViewModel.selectActivityLabelEntity = ActivityLabelEntity(mViewModel.detailEntity?.tagActivityId + ?: "", mViewModel.detailEntity?.tagActivityName ?: "") + mActivityTitle.text = mViewModel.detailEntity?.tagActivityName ?: "" + mActivityTitle.setTextColor(R.color.text_FA8500.toColor()) + } setGameName() //编辑帖子草稿箱入口不存在 @@ -409,17 +436,34 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb } private fun showSelectGameDialog() { - ChooseForumActivity.startChooseForumActivity(this) + if (mViewModel.type == BbsType.GAME_BBS.value) { + ChooseForumActivity.startChooseForumActivity(this) + } else if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { + startActivityForResult(GameActivity.getIntent(this, GameActivity.SELECT_GAME_TITLE), VideoPublishFragment.REQUEST_GAME_CODE) + } } private fun setGameName() { if (mViewModel.mSelectCommunityData != null) { - mGameName.text = mViewModel.mSelectCommunityData?.name - mForumIcon.visibility = View.VISIBLE - mForumIcon.displayGameIcon(mViewModel.mSelectCommunityData?.icon, mViewModel.mSelectCommunityData?.iconSubscript) - mForumContainerView.background = ContextCompat.getDrawable(this, R.drawable.bg_shape_f8_radius_4) - mGameName.setCompoundDrawablesWithIntrinsicBounds(null, null, ContextCompat.getDrawable(this, R.drawable.ic_article_edit_choose_forum_arrow_gray), null) - mGameName.setTextColor(ContextCompat.getColor(this, R.color.text_333333)) + if (mViewModel.type == BbsType.GAME_BBS.value) { + mGameName.text = mViewModel.mSelectCommunityData?.name + mForumIcon.displayGameIcon(mViewModel.mSelectCommunityData?.icon, mViewModel.mSelectCommunityData?.iconSubscript) + setForumUI() + } else if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { + if (mViewModel.gameEntity == null) { + mGameName.text = "选择游戏" + } else { + mGameName.text = mViewModel.gameEntity?.name + mForumIcon.displayGameIcon(mViewModel.gameEntity?.icon, mViewModel.gameEntity?.iconSubscript) + setForumUI() + } + } + } else { + if (mViewModel.type == BbsType.GAME_BBS.value) { + mGameName.text = "选择论坛" + } else if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { + mGameName.text = "选择游戏" + } } val beginTransaction = supportFragmentManager.beginTransaction() @@ -431,6 +475,13 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb checkPostButtonEnable() } + private fun setForumUI() { + mForumIcon.visibility = View.VISIBLE + mForumContainerView.background = ContextCompat.getDrawable(this, R.drawable.bg_shape_f8_radius_4) + mGameName.setCompoundDrawablesWithIntrinsicBounds(null, null, ContextCompat.getDrawable(this, R.drawable.ic_article_edit_choose_forum_arrow_gray), null) + mGameName.setTextColor(ContextCompat.getColor(this, R.color.text_333333)) + } + override fun onMenuItemClick(item: MenuItem?): Boolean { if (item?.itemId == R.id.menu_answer_post) { debounceActionWithInterval(R.id.menu_answer_post, 1000L) { @@ -489,8 +540,9 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb } @JvmStatic - fun getIntent(context: Context, community: CommunityEntity?): Intent { + fun getIntent(context: Context, community: CommunityEntity?, type: BbsType = BbsType.GAME_BBS): Intent { val intent = Intent(context, ArticleEditActivity::class.java) + intent.putExtra(BbsType::class.java.simpleName, type.value) intent.putExtra(CommunityEntity::class.java.simpleName, community) return intent } diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt index 685e943de5..69a8ecafa6 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt @@ -13,6 +13,8 @@ import com.gh.gamecenter.eventbus.EBReuse import com.gh.gamecenter.manager.UserManager import com.gh.base.BaseRichEditorViewModel import com.gh.gamecenter.entity.ActivityLabelEntity +import com.gh.gamecenter.entity.GameEntity +import com.gh.gamecenter.qa.BbsType import com.gh.gamecenter.qa.entity.ArticleDetailEntity import com.gh.gamecenter.qa.entity.ArticleDraftEntity import com.gh.gamecenter.qa.questions.edit.QuestionEditViewModel @@ -46,6 +48,7 @@ class ArticleEditViewModel(application: Application) : BaseRichEditorViewModel(a var content: String? = null var openArticleInNewPage: Boolean = false var selectActivityLabelEntity: ActivityLabelEntity? = null + var gameEntity: GameEntity? = null /** * 获取默认标签和确定当前communityId @@ -93,6 +96,10 @@ class ArticleEditViewModel(application: Application) : BaseRichEditorViewModel(a notSelectForum.postValue(true) return false } + if (type == BbsType.OFFICIAL_BBS.value && gameEntity == null) { + ToastUtils.showToast("请选择游戏", if (isKeyBoardShow) Gravity.CENTER else -1) + return false + } return true } @@ -105,6 +112,7 @@ class ArticleEditViewModel(application: Application) : BaseRichEditorViewModel(a if (articleContent < MIN_TEXT_LENGTH) return false if (articleContent > MAX_TEXT_LENGTH) return false if (detailEntity != null && detailEntity?.title == title && detailEntity?.content == content) return false + if (type == BbsType.OFFICIAL_BBS.value && gameEntity == null) return false return true } @@ -232,17 +240,23 @@ class ArticleEditViewModel(application: Application) : BaseRichEditorViewModel(a } private fun getArticleBody(): JSONObject { - val tags = JSONArray() - for (tag in selectedTags) { - tags.put(tag) - } val jsonObject = JSONObject() jsonObject.put("title", title) jsonObject.put("content", content) - jsonObject.put("tags", tags) if (detailEntity != null) { jsonObject.put("article_id", detailEntity?.id) } + if (selectActivityLabelEntity != null) { + jsonObject.put("tag_activity_id", selectActivityLabelEntity?.id) + jsonObject.put("tag_activity_name", selectActivityLabelEntity?.name) + } + if (type.isNotEmpty()) { + jsonObject.put("type", type) + } + if (gameEntity != null) { + jsonObject.put("game_id", gameEntity?.id) + } + jsonObject.put("tags", JSONArray()) return jsonObject } diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleTagsSelectFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleTagsSelectFragment.kt index 2de861f727..dd66362a3b 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleTagsSelectFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleTagsSelectFragment.kt @@ -92,7 +92,7 @@ class ArticleTagsSelectFragment : BaseFragment() { toast(R.string.questionsdetail_max_tag_hint) } } - mViewModel?.getDefaultTag() +// mViewModel?.getDefaultTag() } fun publishArticle() { 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 e6c7531c98..dfb6413e85 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 @@ -2,6 +2,7 @@ package com.gh.gamecenter.qa.entity import android.os.Parcelable import com.gh.gamecenter.entity.CommunityEntity +import com.gh.gamecenter.entity.GameEntity import com.gh.gamecenter.entity.MeEntity import com.gh.gamecenter.entity.UserEntity import com.google.gson.annotations.SerializedName @@ -26,6 +27,13 @@ data class ArticleDetailEntity(@SerializedName("_id") var images: List = ArrayList(), @SerializedName("images_info") var imagesInfo: List = ArrayList(), - var videos: List = ArrayList()) : Parcelable + 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 +) : Parcelable diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDraftEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDraftEntity.kt index f53ee8f15e..47eaba566b 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDraftEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDraftEntity.kt @@ -2,6 +2,7 @@ package com.gh.gamecenter.qa.entity import android.os.Parcelable import com.gh.gamecenter.entity.CommunityEntity +import com.gh.gamecenter.entity.GameEntity import com.google.gson.annotations.SerializedName import kotlinx.android.parcel.Parcelize @@ -14,7 +15,14 @@ data class ArticleDraftEntity(@SerializedName("_id") val time: Time = Time(), @SerializedName("article_id") val articleId: String = "", - val community: CommunityEntity = CommunityEntity()) : Parcelable + val community: CommunityEntity = CommunityEntity(), + @SerializedName("tag_activity_id") + var tagActivityId: String = "", + @SerializedName("tag_activity_name") + var tagActivityName: String = "", + var type: String = "", + var gameEntity: GameEntity? = null +) : Parcelable @Parcelize data class Time(val create: Long = 0, diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/QuestionDraftEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/QuestionDraftEntity.kt index d6c86844ad..d334c829f7 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/QuestionDraftEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/QuestionDraftEntity.kt @@ -2,6 +2,7 @@ package com.gh.gamecenter.qa.entity import android.os.Parcelable import com.gh.gamecenter.entity.CommunityEntity +import com.gh.gamecenter.entity.GameEntity import com.google.gson.annotations.SerializedName import kotlinx.android.parcel.Parcelize @@ -18,5 +19,13 @@ data class QuestionDraftEntity( var videos: ArrayList = arrayListOf(), var tags: List = arrayListOf(), @SerializedName("question_id") - var questionId: String = "" + var questionId: String = "", + @SerializedName("game_id") + var gameId: String = "", + @SerializedName("tag_activity_id") + var tagActivityId: String = "", + @SerializedName("tag_activity_name") + var tagActivityName: String = "", + var type: String = "", + var gameEntity: GameEntity? = null ) : Parcelable \ No newline at end of file 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 c248add547..0d9c460fd4 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 @@ -2,6 +2,7 @@ package com.gh.gamecenter.qa.entity import android.os.Parcelable import com.gh.gamecenter.entity.CommunityEntity +import com.gh.gamecenter.entity.GameEntity import com.gh.gamecenter.entity.MeEntity import com.gh.gamecenter.entity.UserEntity import com.google.gson.annotations.SerializedName @@ -32,6 +33,14 @@ data class QuestionsDetailEntity( @SerializedName("follow_count") private var followCount: Int = 0, var user: UserEntity = UserEntity(), + @SerializedName("game_id") + var gameId: String = "", + @SerializedName("tag_activity_id") + var tagActivityId: String = "", + @SerializedName("tag_activity_name") + var tagActivityName: String = "", + var type: String = "", + var gameEntity: GameEntity? = null, //提交问题用 @SerializedName("draft_id") var draftId: String = "" diff --git a/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowAdapter.kt index 4e7d322761..554ecf0ba7 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/follow/AskFollowAdapter.kt @@ -17,6 +17,7 @@ import com.gh.gamecenter.personalhome.home.UserHistoryAdapter import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity +import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity class AskFollowAdapter(val context: Context, val viewModel: AskFollowViewModel) : ListAdapter(context), ISyncAdapterHandler { @@ -108,7 +109,7 @@ class AskFollowAdapter(val context: Context, val viewModel: AskFollowViewModel) } else { historyEntity?.question?.id } - mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, id, mEntrance, path)) + mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, id?:"", mEntrance, path)) } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/newest/AskQuestionsNewBodyFragment.java b/app/src/main/java/com/gh/gamecenter/qa/newest/AskQuestionsNewBodyFragment.java index 7a44a82aaa..6a8f5bb606 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/newest/AskQuestionsNewBodyFragment.java +++ b/app/src/main/java/com/gh/gamecenter/qa/newest/AskQuestionsNewBodyFragment.java @@ -20,6 +20,7 @@ import com.gh.gamecenter.baselist.NormalListViewModel; import com.gh.gamecenter.eventbus.EBReuse; import com.gh.gamecenter.eventbus.EBTypeChange; import com.gh.gamecenter.manager.UserManager; +import com.gh.gamecenter.qa.BbsType; import com.gh.gamecenter.qa.CommunityFragment; import com.gh.gamecenter.qa.entity.Questions; import com.gh.gamecenter.qa.questions.edit.QuestionEditActivity; @@ -71,7 +72,7 @@ public class AskQuestionsNewBodyFragment extends ListFragment startActivity(QuestionEditActivity.Companion.getIntent(getContext())); + mOnLoginListener = () -> startActivity(QuestionEditActivity.Companion.getIntent(getContext(), BbsType.GAME_BBS)); } @Override 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 ec602f8e93..4fb671acbd 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 @@ -23,21 +23,22 @@ import com.gh.common.AppExecutor import com.gh.common.util.* import com.gh.gamecenter.R import com.gh.gamecenter.databinding.ActivityQuestionsEditBinding -import com.gh.gamecenter.entity.CommunityEntity -import com.gh.gamecenter.entity.NotificationUgc -import com.gh.gamecenter.entity.Permissions +import com.gh.gamecenter.entity.* import com.gh.gamecenter.eventbus.EBReuse import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.mvvm.Status +import com.gh.gamecenter.qa.BbsType import com.gh.gamecenter.qa.answer.edit.AnswerEditActivity import com.gh.gamecenter.qa.article.draft.ArticleDraftActivity import com.gh.gamecenter.qa.article.edit.ArticleEditActivity import com.gh.gamecenter.qa.dialog.ChooseActivityDialogFragment import com.gh.gamecenter.qa.dialog.ChooseForumActivity +import com.gh.gamecenter.qa.editor.GameActivity import com.gh.gamecenter.qa.entity.QuestionDraftEntity import com.gh.gamecenter.qa.entity.QuestionsDetailEntity import com.gh.gamecenter.qa.questions.draft.QuestionDraftActivity import com.gh.gamecenter.qa.questions.edit.tip.QuestionTitleTipAdapter +import com.gh.gamecenter.qa.video.publish.VideoPublishFragment import com.lightgame.utils.Utils import org.greenrobot.eventbus.EventBus import org.json.JSONObject @@ -86,14 +87,19 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke } setForumName() mBinding.vm = mViewModel + } else if (requestCode == VideoPublishFragment.REQUEST_GAME_CODE) { + val game = data.getParcelableExtra(GameEntity::class.java.simpleName) + if (game != null) { + mViewModel.gameEntity = game + setForumName() + } } } override fun handleMessage(msg: Message) { super.handleMessage(msg) if (msg.what == 1) { - if (mViewModel.communityEntity != null - && !mViewModel.title.isNullOrEmpty() + if (!mViewModel.title.isNullOrEmpty() && !mViewModel.content.isNullOrEmpty()) { mViewModel.title = mBinding.questionseditTitle.text.toString() mViewModel.content = getReplaceRealContent() @@ -204,6 +210,7 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke 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.type = intent?.getStringExtra(BbsType::class.java.simpleName) ?: "" mBaseHandler.sendEmptyMessageDelayed(1, SAVE_DRAFTS_INTERVAL_TIME.toLong()) } } @@ -225,11 +232,18 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke private fun setPatchContent(detailEntity: QuestionsDetailEntity) { mMenuDraft.isVisible = false + mViewModel.type = detailEntity.type mViewModel.questionDraftEntity = detailEntity.me.questionDraft mViewModel.questionEntity = detailEntity mViewModel.communityEntity = detailEntity.community mViewModel.communityEntity?.icon = detailEntity.community.game?.getIcon() 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) + mBinding.activityTitle.text = detailEntity.tagActivityName + mBinding.activityTitle.setTextColor(R.color.text_FA8500.toColor()) + } mViewModel.isModeratorPatch = intent.getBooleanExtra(EntranceUtils.KEY_QUESTION_MODERATOR_PATCH, false) @@ -251,10 +265,16 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke mViewModel.communityEntity = draftEntity.bbs mViewModel.communityEntity?.icon = draftEntity.bbs?.game?.getIcon() mViewModel.communityEntity?.iconSubscript = draftEntity.bbs?.game?.iconSubscript + if (draftEntity.tagActivityId.isNotEmpty() && draftEntity.tagActivityName.isNotEmpty()) { + mViewModel.selectActivityLabelEntity = ActivityLabelEntity(draftEntity.tagActivityId, draftEntity.tagActivityName) + mBinding.activityTitle.text = draftEntity.tagActivityName + mBinding.activityTitle.setTextColor(R.color.text_FA8500.toColor()) + } + setEditHtml(draftEntity.description) + mViewModel.gameEntity = draftEntity.gameEntity mViewModel.title = draftEntity.title mViewModel.content = draftEntity.description mBinding.questionseditTitle.setText(mViewModel.title) - setEditHtml(mViewModel.content) setForumName() } @@ -334,7 +354,9 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke } }) mViewModel.questionDraftsContent.observe(this, Observer { - mViewModel.questionDraftEntity = it + mViewModel.questionDraftEntity?.bbs = it.bbs + mViewModel.questionDraftEntity?.gameEntity = it.gameEntity + mViewModel.questionDraftEntity?.description = it.description setQuestionDraft(it) }) @@ -416,7 +438,11 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke } private fun showSelectGameDialog() { - ChooseForumActivity.startChooseForumActivity(this) + if (mViewModel.type == BbsType.GAME_BBS.value) { + ChooseForumActivity.startChooseForumActivity(this) + } else if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { + startActivityForResult(GameActivity.getIntent(this, GameActivity.SELECT_GAME_TITLE), VideoPublishFragment.REQUEST_GAME_CODE) + } } // Limits of EditText @@ -545,12 +571,25 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke private fun setForumName() { if (mViewModel.communityEntity != null) { - mBinding.chooseForumTv.text = mViewModel.communityEntity?.name - mBinding.forumIconView.visibility = View.VISIBLE - mBinding.forumIconView.displayGameIcon(mViewModel.communityEntity?.icon, mViewModel.communityEntity?.iconSubscript) - mBinding.forumContainer.background = ContextCompat.getDrawable(this, R.drawable.bg_shape_f8_radius_4) - 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)) + if (mViewModel.type == BbsType.GAME_BBS.value) { + mBinding.chooseForumTv.text = mViewModel.communityEntity?.name + 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) + setForumUI() + } + } + } else { + if (mViewModel.type == BbsType.GAME_BBS.value) { + mBinding.chooseForumTv.text = "选择论坛" + } else if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { + mBinding.chooseForumTv.text = "选择游戏" + } } val beginTransaction = supportFragmentManager.beginTransaction() @@ -562,6 +601,13 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke checkPostButtonEnable() } + private fun setForumUI() { + mBinding.forumIconView.visibility = View.VISIBLE + mBinding.forumContainer.background = ContextCompat.getDrawable(this, R.drawable.bg_shape_f8_radius_4) + 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)) + } + private fun setEditHtml(html: String?) { mBinding.richEditor.setHtml(html, false) try { @@ -594,13 +640,16 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke } // 新增问题 - fun getIntent(context: Context): Intent { - return Intent(context, QuestionEditActivity::class.java) + fun getIntent(context: Context, type: BbsType = BbsType.GAME_BBS): Intent { + val intent = Intent(context, QuestionEditActivity::class.java) + intent.putExtra(BbsType::class.java.simpleName, type.value) + return intent } - fun getIntent(context: Context, communityEntity: CommunityEntity): Intent { + fun getIntent(context: Context, communityEntity: CommunityEntity, type: BbsType = BbsType.GAME_BBS): Intent { val intent = Intent(context, QuestionEditActivity::class.java) intent.putExtra(CommunityEntity::class.java.simpleName, communityEntity) + intent.putExtra(BbsType::class.java.simpleName, type.value) return intent } 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 5a94caf8bf..d2de201516 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 @@ -12,10 +12,12 @@ import com.gh.common.util.* import com.gh.gamecenter.R import com.gh.gamecenter.entity.ActivityLabelEntity import com.gh.gamecenter.entity.CommunityEntity +import com.gh.gamecenter.entity.GameEntity import com.gh.gamecenter.entity.Permissions import com.gh.gamecenter.eventbus.EBReuse import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.mvvm.Resource +import com.gh.gamecenter.qa.BbsType import com.gh.gamecenter.qa.entity.QuestionDraftEntity import com.gh.gamecenter.qa.entity.QuestionsDetailEntity import com.gh.gamecenter.retrofit.BiResponse @@ -56,6 +58,7 @@ class QuestionEditViewModel(application: Application) : BaseRichEditorViewModel( val selectedTags: MutableList = ArrayList() val selectedTagsChange = MediatorLiveData() var selectActivityLabelEntity: ActivityLabelEntity? = null + var gameEntity: GameEntity? = null fun initCommunityDataAndDraft() { if (questionEntity != null) { @@ -121,6 +124,11 @@ class QuestionEditViewModel(application: Application) : BaseRichEditorViewModel( return false } + if (type == BbsType.OFFICIAL_BBS.value && gameEntity == null) { + ToastUtils.showToast("请选择游戏", if (isKeyBoardShow) Gravity.CENTER else -1) + return false + } + // 检查标题结尾是否存在问号,没则主动加上 if (title!!.length <= QUESTION_TITLE_MAX_LENGTH) { val endString = title?.substring(title!!.length - 1, title!!.length) @@ -141,6 +149,7 @@ class QuestionEditViewModel(application: Application) : BaseRichEditorViewModel( if (articleContent < MIN_TEXT_LENGTH) return false if (articleContent > MAX_TEXT_LENGTH) return false if (questionEntity != null && questionEntity?.title == title && questionEntity?.description == content) return false + if (type == BbsType.OFFICIAL_BBS.value && gameEntity == null) return false return true } @@ -185,6 +194,10 @@ class QuestionEditViewModel(application: Application) : BaseRichEditorViewModel( if (!questionDraftEntity?.id.isNullOrEmpty()) { entity.draftId = questionDraftEntity?.id ?: "" } + entity.type = type + entity.gameId = gameEntity?.id ?: "" + entity.tagActivityId = selectActivityLabelEntity?.id ?: "" + entity.tagActivityName = selectActivityLabelEntity?.name ?: "" val observable = if (questionEntity != null) { if (!isModeratorPatch) { questionEntity?.images = entity.images @@ -237,7 +250,7 @@ class QuestionEditViewModel(application: Application) : BaseRichEditorViewModel( }) } - fun moderatorsPatchQuestion(isPatchTags: Boolean) { + private fun moderatorsPatchQuestion(isPatchTags: Boolean) { val bodyJson = if (isPatchTags) { val tagsJson = JSONObject() tagsJson.put("tags", JSONArray(selectedTags)) @@ -246,6 +259,10 @@ class QuestionEditViewModel(application: Application) : BaseRichEditorViewModel( val entity = QuestionsDetailEntity() entity.title = title entity.description = content + entity.type = type + entity.gameId = gameEntity?.id ?: "" + entity.tagActivityId = selectActivityLabelEntity?.id ?: "" + entity.tagActivityName = selectActivityLabelEntity?.name ?: "" GsonUtils.toJson(entity) } @@ -303,7 +320,11 @@ class QuestionEditViewModel(application: Application) : BaseRichEditorViewModel( communityId = communityEntity?.id ?: "", tags = selectedTags.toList(), title = title ?: "", - description = content ?: "" + description = content ?: "", + type = type, + gameId = gameEntity?.id ?: "", + tagActivityId = selectActivityLabelEntity?.id ?: "", + tagActivityName = selectActivityLabelEntity?.name ?: "" ) if (questionEntity != null) { draftEntity.questionId = questionEntity?.id ?: "" diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/TagsSelectFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/TagsSelectFragment.kt index 314c96d256..ed2694cf7b 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/edit/TagsSelectFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/edit/TagsSelectFragment.kt @@ -26,6 +26,7 @@ import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.mvvm.Status import com.gh.gamecenter.qa.entity.QuestionsDetailEntity import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity +import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity import com.google.android.flexbox.FlexboxLayout import com.lightgame.utils.Util_System_Keyboard import kotterknife.bindView @@ -78,9 +79,9 @@ class TagsSelectFragment : BaseFragment() { mViewModel?.isModeratorPatch = isModeratorPatch mViewModel?.questionEntity = arguments?.getParcelable(QuestionsDetailEntity::class.java.simpleName) - mViewModel?.getDefaultTag(isLoadOver = { +// mViewModel?.getDefaultTag(isLoadOver = { // initTags() - }) +// }) mViewModel?.moderatorPostLiveData?.observe(this, Observer { if (it?.status == Status.SUCCESS) { @@ -125,8 +126,8 @@ class TagsSelectFragment : BaseFragment() { activity?.setResult(Activity.RESULT_OK, data) } else { val data = JSONObject(it.data ?: "") - startActivity(QuestionsDetailActivity.getIntent(context, data.getString("_id"), - "", "问题编辑")) + startActivity(NewQuestionDetailActivity.getIntent(requireContext(), data.getString("_id") + ?: "", mEntrance, "发布问题")) activity?.setResult(Activity.RESULT_OK) } if (mViewModel?.checkIsAllUploadedAndToast() == true) { @@ -154,7 +155,7 @@ class TagsSelectFragment : BaseFragment() { }, { MtaHelper.onEvent("提交相似问题弹窗", UserManager.getInstance().community.name, "问题相似-去看看") - val intent = QuestionsDetailActivity.getIntent(context, data?.questionId, mEntrance, "相似问题") + val intent = NewQuestionDetailActivity.getIntent(requireContext(), data?.questionId?:"", mEntrance, "相似问题") context?.startActivity(intent) }) } @@ -167,7 +168,7 @@ class TagsSelectFragment : BaseFragment() { null, "去看看", null, { MtaHelper.onEvent("提交重复问题弹窗", UserManager.getInstance().community.name, "问题重复-去看看") - val intent = QuestionsDetailActivity.getIntent(context, data?.questionId, mEntrance, "重复问题") + val intent = NewQuestionDetailActivity.getIntent(requireContext(), data?.questionId?:"", mEntrance, "重复问题") context?.startActivity(intent) }) } @@ -187,9 +188,9 @@ class TagsSelectFragment : BaseFragment() { mCancelBtn.text = "取消" mTitle.text = "修改标签" } else { - mViewModel?.getDefaultTag(isLoadOver = { - //initTags() - }) +// mViewModel?.getDefaultTag(isLoadOver = { +// initTags() +// }) } mAddTagBtn.setOnClickListener { diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailActivity.kt index 951d931c2c..6efd274d98 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailActivity.kt @@ -31,16 +31,16 @@ class NewQuestionDetailActivity : NormalActivity() { override fun getBusinessId(): Pair { return Pair( targetFragment.arguments?.getString(EntranceUtils.KEY_QUESTIONS_ID) ?: "", - targetFragment.arguments?.getParcelable(EntranceUtils.KEY_COMMUNITY_DATA)?.id ?: "") + targetFragment.arguments?.getParcelable(EntranceUtils.KEY_COMMUNITY_DATA)?.id + ?: "") } companion object { @JvmStatic - fun getIntent(context: Context, community: CommunityEntity, questionId: String, entrance: String, path: String): Intent { + fun getIntent(context: Context, questionId: String, entrance: String, path: String): Intent { val intent = Intent(context, NewQuestionDetailActivity::class.java) intent.putExtra(EntranceUtils.KEY_ENTRANCE, mergeEntranceAndPath(entrance, path)) intent.putExtra(EntranceUtils.KEY_QUESTIONS_ID, questionId) - intent.putExtra(EntranceUtils.KEY_COMMUNITY_DATA, community) intent.putExtra(EntranceUtils.KEY_PATH, path) return intent } @@ -49,11 +49,10 @@ class NewQuestionDetailActivity : NormalActivity() { * 自动滚动到评论区域 */ @JvmStatic - fun getCommentIntent(context: Context, community: CommunityEntity, questionId: String, entrance: String, path: String): Intent { + fun getCommentIntent(context: Context, questionId: String, entrance: String, path: String): Intent { val intent = Intent(context, NewQuestionDetailActivity::class.java) intent.putExtra(EntranceUtils.KEY_ENTRANCE, mergeEntranceAndPath(entrance, path)) intent.putExtra(EntranceUtils.KEY_QUESTIONS_ID, questionId) - intent.putExtra(EntranceUtils.KEY_COMMUNITY_DATA, community) intent.putExtra(EntranceUtils.KEY_SCROLL_TO_COMMENT_AREA, true) intent.putExtra(EntranceUtils.KEY_PATH, path) return intent 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 d538cde4d3..aa9cbf7470 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 @@ -3,27 +3,40 @@ package com.gh.gamecenter.qa.questions.newdetail import android.app.Activity import android.content.Intent import android.os.Bundle +import android.text.TextUtils import android.view.LayoutInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup import android.widget.TextView +import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat +import androidx.lifecycle.Lifecycle import androidx.recyclerview.widget.RecyclerView import com.ethanhua.skeleton.Skeleton import com.gh.common.util.* import com.gh.gamecenter.R +import com.gh.gamecenter.SuggestionActivity import com.gh.gamecenter.baselist.ListAdapter import com.gh.gamecenter.databinding.FragmentArticleDetailBinding import com.gh.gamecenter.entity.CommunityEntity +import com.gh.gamecenter.entity.MenuItemEntity +import com.gh.gamecenter.eventbus.EBDeleteDetail import com.gh.gamecenter.manager.UserManager +import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.qa.article.detail.CommentItemData +import com.gh.gamecenter.qa.article.edit.ArticleEditActivity import com.gh.gamecenter.qa.comment.CommentActivity import com.gh.gamecenter.qa.comment.base.BaseCommentAdapter import com.gh.gamecenter.qa.comment.base.BaseCommentFragment import com.gh.gamecenter.qa.comment.base.BaseCommentViewModel +import com.gh.gamecenter.qa.dialog.MoreFunctionPanelDialog +import com.gh.gamecenter.qa.questions.detail.QuestionsDetailFragment +import com.gh.gamecenter.qa.questions.edit.QuestionEditActivity import com.gh.gamecenter.qa.questions.invite.QuestionsInviteActivity +import com.gh.gamecenter.suggest.SuggestType import com.halo.assistant.HaloApp +import org.greenrobot.eventbus.EventBus class NewQuestionDetailFragment : BaseCommentFragment() { private var mScrollToCommentArea: Boolean = false @@ -69,6 +82,7 @@ class NewQuestionDetailFragment : BaseCommentFragment + val entities = ArrayList() + if (questionEntity.user.id != UserManager.getInstance().userId) { + entities.add(MenuItemEntity("投诉", R.drawable.icon_gamedetail_copyright)) + } + if (questionEntity.me.isModerator) { + 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)) + } + val shareIcon = if (questionEntity.images.isNotEmpty()) { + questionEntity.images[0] + } else { + getString(R.string.share_ghzs_logo) + } + var description = questionEntity.description + if (TextUtils.isEmpty(description)) { + description = getString(R.string.ask_share_default_summary) + } + val shareUrl = if (isPublishEnv()) { + getString(R.string.share_questions_url, questionEntity.id) + } else { + getString(R.string.share_questions_url_dev, questionEntity.id) + } + val shareUtils = ShareUtils.getInstance(activity) + shareUtils.shareParamsDetail( + activity, + shareUrl, + shareIcon, + getString(R.string.ask_share_questions_title, questionEntity.title, questionEntity.answersCount), + description, + ShareUtils.ShareEntrance.askNormal, + questionEntity.id, null) + MoreFunctionPanelDialog.showMoreDialog(requireActivity() as AppCompatActivity, entities, questionEntity.title + ?: "", shareUtils) { + when (it.text) { + "投诉" -> { + SuggestionActivity.startSuggestionActivity(context, SuggestType.normal, "report", + "问题投诉(" + questionEntity.id + "):") + } + "编辑" -> { + val intent = QuestionEditActivity.getManagerIntent(requireContext(), questionEntity) + startActivityForResult(intent, QuestionsDetailFragment.QUESTIONS_EDIT_REQUEST) + } + + "删除" -> { + DialogUtils.showNewAlertDialog(requireContext(), "提示", "删除问题后,其中的所有回答都将被删除", "取消", "删除", {}, { + mListViewModel.moderatorsHideQuestion() + }) + } + } + } + } + } + } } \ No newline at end of file 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 11a02be7bd..e16b875890 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 @@ -6,7 +6,11 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.gh.common.util.observableToMain import com.gh.gamecenter.R +import com.gh.gamecenter.baselist.LoadStatus +import com.gh.gamecenter.baselist.LoadType import com.gh.gamecenter.entity.CommentEntity +import com.gh.gamecenter.entity.Permissions +import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.qa.article.detail.ArticleDetailViewModel import com.gh.gamecenter.qa.article.detail.CommentItemData import com.gh.gamecenter.qa.comment.base.BaseCommentViewModel @@ -18,6 +22,7 @@ import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import okhttp3.ResponseBody +import org.json.JSONObject import retrofit2.HttpException class NewQuestionDetailViewModel(application: Application, questionId: String = "", communityId: String = "") : @@ -25,6 +30,7 @@ class NewQuestionDetailViewModel(application: Application, questionId: String = private val mApi = RetrofitManager.getInstance(getApplication()).api var questionRenderedLiveData = MutableLiveData() var questionPageFinishedLiveData = MutableLiveData() + val moderatorsHideLiveData = MutableLiveData() val mFollowLiveData = MutableLiveData() var questionDetail: QuestionsDetailEntity? = null val followLiveData = mFollowLiveData @@ -98,6 +104,38 @@ class NewQuestionDetailViewModel(application: Application, questionId: String = }) } + 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) + } + } + + 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) + } + }) + } + class Factory(private val application: Application, private val questionId: String = "", private val communityId: String = "") : ViewModelProvider.NewInstanceFactory() { 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 16a77a3135..6b0107c931 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 @@ -106,6 +106,11 @@ class QuestionDetailContentViewHolder(var binding: ItemArticleDetailContentBindi updateFollowBtn(question.me.isFollower) } + if (question.tagActivityId.isNotEmpty() && question.tagActivityName.isNotEmpty()) { + activityNameTv.text = question.tagActivityName + activityNameTv.visibility = View.VISIBLE + } + badgeIv.goneIf(question.user.badge == null) badgeTv.goneIf(question.user.badge == null) badgeTv.text = question.user.badge?.name diff --git a/app/src/main/java/com/gh/gamecenter/qa/recommends/AskQuestionsRecommendsFragment.java b/app/src/main/java/com/gh/gamecenter/qa/recommends/AskQuestionsRecommendsFragment.java index f6a2d120a8..0235709149 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/recommends/AskQuestionsRecommendsFragment.java +++ b/app/src/main/java/com/gh/gamecenter/qa/recommends/AskQuestionsRecommendsFragment.java @@ -23,6 +23,7 @@ import com.gh.gamecenter.eventbus.EBTypeChange; import com.gh.gamecenter.eventbus.EBUserFollow; import com.gh.gamecenter.fragment.MainWrapperFragment; import com.gh.gamecenter.manager.UserManager; +import com.gh.gamecenter.qa.BbsType; import com.gh.gamecenter.qa.CommunityFragment; import com.gh.gamecenter.qa.entity.AnswerEntity; import com.gh.gamecenter.qa.questions.edit.QuestionEditActivity; @@ -35,6 +36,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.RecyclerView; + import butterknife.BindView; import butterknife.OnClick; @@ -70,7 +72,7 @@ public class AskQuestionsRecommendsFragment extends ListFragment startActivity(QuestionEditActivity.Companion.getIntent(requireContext())); + mOnLoginListener = () -> startActivity(QuestionEditActivity.Companion.getIntent(requireContext(), BbsType.GAME_BBS)); mParentFragment = exhaustParentFragment(); diff --git a/app/src/main/java/com/gh/gamecenter/qa/recommends/newest/RecommendNewestAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/recommends/newest/RecommendNewestAdapter.kt index 6677d6f885..fd4dff2b85 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/recommends/newest/RecommendNewestAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/recommends/newest/RecommendNewestAdapter.kt @@ -17,6 +17,7 @@ import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.qa.entity.AnswerEntity import com.gh.gamecenter.qa.entity.Questions import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity +import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity open class RecommendNewestAdapter(context: Context) : ListAdapter(context), ISyncAdapterHandler { @@ -65,7 +66,7 @@ open class RecommendNewestAdapter(context: Context) : ListAdapter( mContext.startActivity(ArticleDetailActivity.getIntent(mContext, UserManager.getInstance().community, answer.id!!, "", getPath())) } else { val questions = answer.questions - mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.id, "", getPath())) + mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, questions.id, "", getPath())) } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishActivity.kt index 197e1f1b7f..29716d98d9 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishActivity.kt @@ -10,9 +10,7 @@ import com.gh.gamecenter.NormalActivity import com.gh.gamecenter.R import com.gh.gamecenter.entity.CommunityEntity import com.gh.gamecenter.entity.ForumVideoEntity -import com.gh.gamecenter.entity.VideoDraftEntity -import com.gh.gamecenter.entity.VideoEntity -import com.gh.gamecenter.qa.VideoInsertType +import com.gh.gamecenter.qa.BbsType class VideoPublishActivity : NormalActivity() { override fun getLayoutId(): Int = R.layout.activity_video_publish @@ -25,10 +23,10 @@ class VideoPublishActivity : NormalActivity() { companion object { @JvmStatic - fun getIntent(context: Context, communityEntity: CommunityEntity?, type: VideoInsertType, entrance: String, path: String): Intent { + fun getIntent(context: Context, communityEntity: CommunityEntity?, type: BbsType, entrance: String, path: String): Intent { val bundle = Bundle() bundle.putParcelable(CommunityEntity::class.java.simpleName, communityEntity) - bundle.putString(VideoInsertType::class.java.simpleName, type.value) + bundle.putString(BbsType::class.java.simpleName, type.value) bundle.putString(EntranceUtils.KEY_ENTRANCE, ToolBarActivity.mergeEntranceAndPath(entrance, path)) bundle.putString(EntranceUtils.KEY_PATH, path) return getTargetIntent(context, VideoPublishActivity::class.java, VideoPublishFragment::class.java, bundle) 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 2329c0d87b..23d3701c0e 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 @@ -28,17 +28,14 @@ import com.gh.gamecenter.entity.* import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.mvvm.Status import com.gh.gamecenter.normal.NormalFragment -import com.gh.gamecenter.qa.VideoInsertType -import com.gh.gamecenter.qa.article.edit.ArticleEditActivity +import com.gh.gamecenter.qa.BbsType import com.gh.gamecenter.qa.dialog.ChooseActivityDialogFragment import com.gh.gamecenter.qa.dialog.ChooseForumActivity import com.gh.gamecenter.qa.editor.GameActivity import com.gh.gamecenter.qa.editor.LocalMediaActivity -import com.gh.gamecenter.qa.entity.ArticleDraftEntity import com.gh.gamecenter.video.poster.PosterEditActivity import com.gh.gamecenter.video.upload.OnUploadListener import com.gh.gamecenter.video.upload.UploadManager -import com.gh.gamecenter.video.upload.view.UploadVideoActivity import com.gh.gamecenter.video.upload.view.VideoFileEntity import com.gh.gamecenter.video.videomanager.VideoDraftActivity import com.lightgame.download.FileUtils @@ -72,7 +69,7 @@ class VideoPublishFragment : NormalFragment() { mViewModel.videoDraft = arguments?.getParcelable(VideoDraftEntity::class.java.simpleName) mViewModel.videoPatch = arguments?.getParcelable(ForumVideoEntity::class.java.simpleName) mViewModel.communityEntity = arguments?.getParcelable(CommunityEntity::class.java.simpleName) - mType = arguments?.getString(VideoInsertType::class.java.simpleName) ?: "" + mType = arguments?.getString(BbsType::class.java.simpleName) ?: "" initData() observeData() checkPostButtonEnable() @@ -104,9 +101,9 @@ class VideoPublishFragment : NormalFragment() { } mBinding.videoPosterPatchHint.setOnClickListener { startMediaStore() } mBinding.forumContainer.setOnClickListener { - if (mType == VideoInsertType.GAME_BBS.value) { + if (mType == BbsType.GAME_BBS.value) { ChooseForumActivity.startChooseForumActivity(requireActivity()) - } else if (mType == VideoInsertType.OFFICIAL_BBS.value) { + } else if (mType == BbsType.OFFICIAL_BBS.value) { startActivityForResult(GameActivity.getIntent(requireContext(), GameActivity.SELECT_GAME_TITLE), REQUEST_GAME_CODE) } } @@ -386,11 +383,11 @@ class VideoPublishFragment : NormalFragment() { private fun setForumName() { if (mViewModel.communityEntity != null) { - if (mType == VideoInsertType.GAME_BBS.value) { + if (mType == BbsType.GAME_BBS.value) { mBinding.chooseForumTv.text = mViewModel.communityEntity?.name mBinding.forumIconView.displayGameIcon(mViewModel.communityEntity?.icon, mViewModel.communityEntity?.iconSubscript) setForumUI() - } else if (mType == VideoInsertType.OFFICIAL_BBS.value) { + } else if (mType == BbsType.OFFICIAL_BBS.value) { if (mViewModel.gameEntity == null) { mBinding.chooseForumTv.text = "选择游戏" } else { @@ -400,9 +397,9 @@ class VideoPublishFragment : NormalFragment() { } } } else { - if (mType == VideoInsertType.GAME_BBS.value) { + if (mType == BbsType.GAME_BBS.value) { mBinding.chooseForumTv.text = "选择论坛" - } else if (mType == VideoInsertType.OFFICIAL_BBS.value) { + } else if (mType == BbsType.OFFICIAL_BBS.value) { mBinding.chooseForumTv.text = "选择游戏" } } @@ -428,7 +425,7 @@ class VideoPublishFragment : NormalFragment() { val des = mBinding.videoDes.text.toString() if (mVideoFileEntity?.url.isNullOrEmpty()) return false if (mViewModel.communityEntity == null) return false - if (mType == VideoInsertType.OFFICIAL_BBS.value && mViewModel.gameEntity == null) return false + if (mType == BbsType.OFFICIAL_BBS.value && mViewModel.gameEntity == null) return false if (title.isEmpty()) return false if (des.isEmpty()) return false if (mViewModel.videoPatch != null && mViewModel.videoPatch?.title == title && mViewModel.videoPatch?.des == des) return false @@ -537,7 +534,7 @@ class VideoPublishFragment : NormalFragment() { toast("请选择论坛") return } - if (!isDraft && mType == VideoInsertType.OFFICIAL_BBS.value && mViewModel.gameEntity == null) { + if (!isDraft && mType == BbsType.OFFICIAL_BBS.value && mViewModel.gameEntity == null) { toast("请选择游戏") return } diff --git a/app/src/main/res/layout/fragment_article_detail.xml b/app/src/main/res/layout/fragment_article_detail.xml index ef4b4793f3..8bcd148075 100644 --- a/app/src/main/res/layout/fragment_article_detail.xml +++ b/app/src/main/res/layout/fragment_article_detail.xml @@ -59,7 +59,7 @@ android:id="@+id/listContainer" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_above="@id/bottomContainer" + android:layout_above="@id/bottomShadowView" android:layout_below="@id/toolbar" android:descendantFocusability="beforeDescendants" android:focusableInTouchMode="true"> @@ -84,13 +84,12 @@ android:id="@+id/bottomShadowView" android:layout_width="match_parent" android:layout_height="6dp" - android:layout_above="@id/bottomContainer" + android:layout_above="@id/input_container" android:alpha="0.3" android:background="@drawable/shadow" /> Date: Sat, 29 May 2021 17:17:09 +0800 Subject: [PATCH 23/61] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E6=8E=A8=E8=8D=90=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../video/detail/ForumVideoDetailFragment.kt | 12 +++++----- .../video/detail/ForumVideoDetailViewModel.kt | 1 + .../qa/video/detail/desc/VideoDescAdapter.kt | 22 +++++++++++++++---- .../qa/video/detail/desc/VideoDescFragment.kt | 3 +++ .../video/detail/desc/VideoDescViewModel.kt | 4 +++- .../video/detail/desc/VideoItemViewHolder.kt | 5 ++--- .../retrofit/service/ApiService.java | 6 +++++ app/src/main/res/layout/item_forum_video.xml | 21 +++++++++++++----- 8 files changed, 56 insertions(+), 18 deletions(-) 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 d9532e76a6..6ca1dc18ac 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 @@ -203,6 +203,8 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { } private fun updateToolbarStyle(isToolbarWhite: Boolean) { + if (isToolbarWhite == mViewModel.currentToolbarStatus) return + mViewModel.currentToolbarStatus = isToolbarWhite mBinding.toolbar.setNavigationIcon(if (isToolbarWhite) R.drawable.ic_bar_back else R.drawable.ic_bar_back_light) mMoreMenuItem?.setIcon(if (isToolbarWhite) R.drawable.ic_menu_gamedetail_more else R.drawable.ic_menu_gamedetail_more_light) mBinding.toolbar.setBackgroundColor(ContextCompat.getColor(requireContext(), if (isToolbarWhite) R.color.white else R.color.transparent)) @@ -404,11 +406,11 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { if (mForumVideoEntity?.user?.id != UserManager.getInstance().userId) { entities.add(MenuItemEntity("投诉", R.drawable.icon_gamedetail_copyright)) } - if (mForumVideoEntity?.me!!.isModerator) { - val isEnable = mForumVideoEntity?.isHighlighted == true || mForumVideoEntity?.user?.id == UserManager.getInstance().userId - entities.add(MenuItemEntity("加精", if (isEnable) - R.drawable.icon_more_panel_essence_unenable else R.drawable.icon_more_panel_essence, isEnable = !isEnable)) - } +// if (mForumVideoEntity?.me!!.isModerator) { +// val isEnable = mForumVideoEntity?.isHighlighted == true || mForumVideoEntity?.user?.id == UserManager.getInstance().userId +// entities.add(MenuItemEntity("加精", if (isEnable) +// R.drawable.icon_more_panel_essence_unenable else R.drawable.icon_more_panel_essence, isEnable = !isEnable)) +// } if (mForumVideoEntity?.me!!.isModerator || mForumVideoEntity?.user?.id == UserManager.getInstance().userId) { entities.add(MenuItemEntity("删除", R.drawable.icon_more_panel_delete)) } 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 2b53e1bdd2..a188ae35fb 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 @@ -30,6 +30,7 @@ class ForumVideoDetailViewModel(application: Application, val videoId: String) : val updateDetailLiveData = MediatorLiveData() var needToUpdateShareCount = MutableLiveData() var deleteLiveData = MutableLiveData() + var currentToolbarStatus = true init { getVideoDetail() 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 8e85eb3eaa..5986659ecc 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 @@ -12,15 +12,22 @@ import com.gh.gamecenter.baselist.ListAdapter import com.gh.gamecenter.databinding.ItemForumVideoBinding import com.gh.gamecenter.databinding.ItemVideoDescTopBinding import com.gh.gamecenter.entity.VideoDescItemEntity +import com.gh.gamecenter.qa.video.detail.ForumVideoDetailActivity import com.gh.gamecenter.qa.video.detail.ForumVideoDetailViewModel -class VideoDescAdapter(context: Context, val mVideoDetailViewModel: ForumVideoDetailViewModel, val mViewModel: VideoDescViewModel) : ListAdapter(context) { +class VideoDescAdapter(context: Context, val mVideoDetailViewModel: ForumVideoDetailViewModel, val mViewModel: VideoDescViewModel) : + ListAdapter(context) { private var mContentIsExpand = false private var expandHeight = 0 private var shrinkHeight = 0 - public override fun setListData(updateData: MutableList?) { - super.setListData(updateData) + override fun areItemsTheSame(oldItem: VideoDescItemEntity?, newItem: VideoDescItemEntity?): Boolean { + return oldItem == newItem || oldItem?.recommendVideo?.id == newItem?.recommendVideo?.id + } + + override fun areContentsTheSame(oldItem: VideoDescItemEntity?, newItem: VideoDescItemEntity?): Boolean { + return oldItem?.recommendVideo?.vote == newItem?.recommendVideo?.vote + && oldItem?.recommendVideo?.commentCount == newItem?.recommendVideo?.commentCount } override fun getItemViewType(position: Int): Int { @@ -70,7 +77,14 @@ class VideoDescAdapter(context: Context, val mVideoDetailViewModel: ForumVideoDe holder.bindData(videoDescItemEntity.topVideoInfo!!) } is VideoItemViewHolder -> { - + val entity = mEntityList[position] + val recommendVideo = entity.recommendVideo + holder.binding.video = recommendVideo + holder.binding.root.setOnClickListener { + recommendVideo?.let { + mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, it.id)) + } + } } is FooterViewHolder -> { holder.initItemPadding() 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 45a7cf18c0..bd447f759c 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 @@ -40,6 +40,7 @@ class VideoDescFragment : LazyListFragment() override fun provideDataObservable(page: Int): Observable>? { - return null + return RetrofitManager.getInstance(getApplication()).api.getRecommendVideo(topVideoDetail?.id, page) } override fun mergeResultLiveData() { diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoItemViewHolder.kt index 69fd747781..961dffb697 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/detail/desc/VideoItemViewHolder.kt @@ -3,7 +3,6 @@ package com.gh.gamecenter.qa.video.detail.desc import com.gh.base.BaseRecyclerViewHolder import com.gh.gamecenter.databinding.ItemForumVideoBinding import com.gh.gamecenter.databinding.ItemVideoDescTopBinding +import com.gh.gamecenter.entity.ForumVideoEntity -class VideoItemViewHolder(val binding: ItemForumVideoBinding) : BaseRecyclerViewHolder(binding.root) { - -} \ No newline at end of file +class VideoItemViewHolder(val binding: ItemForumVideoBinding) : BaseRecyclerViewHolder(binding.root) \ 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 08d35472a9..bd2b6e99f0 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 @@ -3027,4 +3027,10 @@ public interface ApiService { */ @POST("bbses/unread") Single> getForumUnreadStatus(@Body RequestBody body); + + /** + * 获取视频详情推荐视频 + */ + @GET("bbses/videos/{video_id}/recommends") + Observable> getRecommendVideo(@Path("video_id") String videoId, @Query("page") int page); } \ No newline at end of file diff --git a/app/src/main/res/layout/item_forum_video.xml b/app/src/main/res/layout/item_forum_video.xml index bdc708ae35..69a2c8b9c6 100644 --- a/app/src/main/res/layout/item_forum_video.xml +++ b/app/src/main/res/layout/item_forum_video.xml @@ -1,6 +1,15 @@ + + + + + + + + app:layout_constraintTop_toTopOf="parent" + app:roundedCornerRadius="4dp" /> Date: Tue, 1 Jun 2021 09:26:26 +0800 Subject: [PATCH 24/61] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E5=88=86=E5=89=B2=E7=BA=BF=E6=98=BE=E7=A4=BA=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../view/CustomDividerItemDecoration.kt | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/app/src/main/java/com/gh/common/view/CustomDividerItemDecoration.kt b/app/src/main/java/com/gh/common/view/CustomDividerItemDecoration.kt index 8e7e30d323..060fd1d0b6 100644 --- a/app/src/main/java/com/gh/common/view/CustomDividerItemDecoration.kt +++ b/app/src/main/java/com/gh/common/view/CustomDividerItemDecoration.kt @@ -1,11 +1,13 @@ package com.gh.common.view import android.content.Context +import android.graphics.Canvas import android.graphics.Rect import android.view.View import android.widget.LinearLayout import androidx.recyclerview.widget.DividerItemDecoration import androidx.recyclerview.widget.RecyclerView +import kotlin.math.roundToInt class CustomDividerItemDecoration( context: Context, @@ -13,6 +15,7 @@ class CustomDividerItemDecoration( var notDecorateTheFirstItem: Boolean = false, var notDecorateTheLastItem: Boolean = false, var notDecorateTheFirstTwoItems: Boolean = false) : DividerItemDecoration(context, LinearLayout.VERTICAL) { + private val mBounds = Rect() override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) { if (onlyDecorateTheFirstItem) { @@ -31,4 +34,42 @@ class CustomDividerItemDecoration( } } + override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) { + if (parent.layoutManager == null || drawable == null) { + return + } + drawVertical(c, parent) + } + + private fun drawVertical(canvas: Canvas, parent: RecyclerView) { + canvas.save() + val left: Int + val right: Int + if (parent.clipToPadding) { + left = parent.paddingLeft + right = parent.width - parent.paddingRight + canvas.clipRect(left, parent.paddingTop, right, + parent.height - parent.paddingBottom) + } else { + left = 0 + right = parent.width + } + val childCount = parent.childCount + for (i in 0 until childCount) { + val child = parent.getChildAt(i) + parent.getDecoratedBoundsWithMargins(child, mBounds) + var bottom = mBounds.bottom + child.translationY.roundToInt() + val rect = Rect() + getItemOffsets(rect, child, parent, RecyclerView.State()) + val top = if (rect.bottom > 0) { + bottom - (drawable?.intrinsicHeight ?: 0) + } else { + bottom = 0 + 0 + } + drawable?.setBounds(left, top, right, bottom) + drawable?.draw(canvas) + } + canvas.restore() + } } \ No newline at end of file From a6a3d769bd24cf569592c19c67a90a2f237ac725 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Wed, 2 Jun 2021 18:16:56 +0800 Subject: [PATCH 25/61] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=AE=BA=E5=9D=9B?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B5=E7=9A=84=E8=A7=86=E9=A2=91Tab?= =?UTF-8?q?=E5=92=8C=E4=B8=AA=E4=BA=BA=E4=B8=BB=E9=A1=B5=E7=9A=84=E5=8F=91?= =?UTF-8?q?=E5=B8=83Tab=E7=9A=84=E8=A7=86=E9=A2=91=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/history/HistoryDatabase.kt | 19 +- .../gh/gamecenter/entity/ForumVideoEntity.kt | 12 +- .../gh/gamecenter/entity/PersonalEntity.kt | 2 +- .../entity/PersonalHistoryEntity.kt | 32 +++ .../detail/ForumArticleAskListAdapter.kt | 24 +- .../detail/ForumArticleAskListFragment.kt | 7 +- .../detail/ForumArticleAskListViewModel.kt | 7 +- .../forum/detail/ForumDetailFragment.kt | 27 ++- .../forum/home/ArticleItemVideoView.kt | 186 ++++++++++----- .../home/ForumArticleAskItemViewHolder.kt | 63 ++++- .../forum/home/ForumArticleListFragment.kt | 44 ++-- .../personalhome/UserHomeFragment.kt | 9 +- .../personalhome/home/UserHistoryAdapter.kt | 54 ++++- .../personalhome/home/UserHistoryFragment.kt | 21 +- .../personalhome/home/UserHistoryViewModel.kt | 4 +- .../BaseAnswerOrArticleItemViewHolder.kt | 216 +++++++++++------- .../gh/gamecenter/qa/entity/AnswerEntity.kt | 49 +++- .../gh/gamecenter/qa/entity/ArticleEntity.kt | 20 +- .../video/detail/ForumVideoDetailActivity.kt | 16 +- .../video/detail/ForumVideoDetailFragment.kt | 8 + .../video/detail/desc/VideoDescViewModel.kt | 10 +- .../retrofit/service/ApiService.java | 6 + .../room/converter/VideoInfoConverter.java | 23 ++ .../main/res/layout/community_answer_item.xml | 4 +- .../main/res/layout/fragment_forum_detail.xml | 33 +++ .../main/res/layout/fragment_forum_list.xml | 66 ------ app/src/main/res/layout/user_history_item.xml | 6 +- 27 files changed, 683 insertions(+), 285 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/room/converter/VideoInfoConverter.java diff --git a/app/src/main/java/com/gh/common/history/HistoryDatabase.kt b/app/src/main/java/com/gh/common/history/HistoryDatabase.kt index 33e51e8f7f..68f72f2e74 100644 --- a/app/src/main/java/com/gh/common/history/HistoryDatabase.kt +++ b/app/src/main/java/com/gh/common/history/HistoryDatabase.kt @@ -26,7 +26,8 @@ import com.halo.assistant.HaloApp ListStringConverter::class, CommunityVideoConverter::class, UserConverter::class, - ImageInfoConverter::class) + ImageInfoConverter::class, + VideoInfoConverter::class) abstract class HistoryDatabase : RoomDatabase() { @@ -79,6 +80,21 @@ abstract class HistoryDatabase : RoomDatabase() { } } + val MIGRATION_8_9: Migration = object : Migration(8, 9) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("Alter TABLE ArticleEntity add des TEXT DEFAULT ''") + database.execSQL("Alter TABLE ArticleEntity add url TEXT DEFAULT ''") + database.execSQL("Alter TABLE ArticleEntity add videoInfo TEXT DEFAULT ''") + database.execSQL("Alter TABLE ArticleEntity add poster TEXT DEFAULT ''") + database.execSQL("Alter TABLE ArticleEntity add length INTEGER DEFAULT 0") + database.execSQL("Alter TABLE AnswerEntity add des TEXT DEFAULT ''") + database.execSQL("Alter TABLE AnswerEntity add url TEXT DEFAULT ''") + database.execSQL("Alter TABLE AnswerEntity add videoInfo TEXT DEFAULT ''") + database.execSQL("Alter TABLE AnswerEntity add poster TEXT DEFAULT ''") + database.execSQL("Alter TABLE AnswerEntity add length INTEGER DEFAULT 0") + } + } + val instance by lazy { Room.databaseBuilder(HaloApp.getInstance().application, HistoryDatabase::class.java, "USER_TRACK_HISTORY_DATABASE") .addMigrations(MIGRATION_2_3) @@ -87,6 +103,7 @@ abstract class HistoryDatabase : RoomDatabase() { .addMigrations(MIGRATION_5_6) .addMigrations(MIGRATION_6_7) .addMigrations(MIGRATION_7_8) + .addMigrations(MIGRATION_8_9) .build() } } 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 2c2e365f3b..c7d2cd153e 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/ForumVideoEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/ForumVideoEntity.kt @@ -1,22 +1,22 @@ package com.gh.gamecenter.entity import android.os.Parcelable -import com.gh.gamecenter.qa.entity.ImageInfo import com.google.gson.annotations.SerializedName +import kotlinx.android.parcel.IgnoredOnParcel import kotlinx.android.parcel.Parcelize @Parcelize open class ForumVideoEntity( @SerializedName("_id") - val id: String = "", + var id: String = "", var title: String = "", var des: String = "", var poster: String = "", - val url: String = "", + var url: String = "", val user: PersonalEntity = PersonalEntity(), val me: MeEntity = MeEntity(), val size: Long = 0, - val length: Long = 0, + var length: Long = 0, // 有三种状态 pass通过,fail未通过,pending审核中 var status: String = "", val format: String = "Mp4", @@ -40,7 +40,9 @@ open class ForumVideoEntity( var videoInfo: VideoInfo = VideoInfo(), @SerializedName("is_jx") var isHighlighted: Boolean = true, - var bbs: CommunityEntity? = null + var bbs: CommunityEntity? = null, + @IgnoredOnParcel + var videoIsMuted: Boolean = false //是否静音标记 ) : Parcelable @Parcelize diff --git a/app/src/main/java/com/gh/gamecenter/entity/PersonalEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/PersonalEntity.kt index 064dc16061..30d11efd49 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/PersonalEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/PersonalEntity.kt @@ -41,7 +41,7 @@ data class PersonalEntity( @SerializedName("today_visit") val todayVisit: Int? = 0) : Parcelable { - fun getQaCount() = answer + question + communityArticle + fun getTotalCount() = video + answer + question + communityArticle } } diff --git a/app/src/main/java/com/gh/gamecenter/entity/PersonalHistoryEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/PersonalHistoryEntity.kt index cae895052e..c72da67917 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/PersonalHistoryEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/PersonalHistoryEntity.kt @@ -18,6 +18,12 @@ data class PersonalHistoryEntity( val type: String = "", var question: Question = Question(), var brief: String = "", + var des: String = "", + var url: String = "", + @SerializedName("video_info") + var videoInfo: VideoInfo = VideoInfo(), + var poster: String = "", + var length: Long = 0, var count: Count = Count(), val time: Long = 0, var title: String = "", @@ -124,6 +130,9 @@ data class PersonalHistoryEntity( if (type.contains("article")) { answer.type = "community_article" } + if (type.contains("video")) { + answer.type = "video" + } return answer } @@ -136,4 +145,27 @@ data class PersonalHistoryEntity( question.communityName = community.name return question } + + fun transformForumVideoEntity(): ForumVideoEntity { + val forumVideoEntity = ForumVideoEntity() + if (type == "video") { + forumVideoEntity.id = id + forumVideoEntity.title = title + forumVideoEntity.des = des + forumVideoEntity.url = url + forumVideoEntity.poster = poster + forumVideoEntity.length = length + forumVideoEntity.videoInfo = videoInfo + } else { + forumVideoEntity.title = title + forumVideoEntity.des = brief + if (getPassVideos().isNotEmpty()) { + forumVideoEntity.id = getPassVideos()[0].id + forumVideoEntity.url = getPassVideos()[0].url + forumVideoEntity.poster = getPassVideos()[0].poster + forumVideoEntity.videoInfo = VideoInfo(width = getPassVideos()[0].width, height = getPassVideos()[0].height) + } + } + return forumVideoEntity + } } \ No newline at end of file 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 3f6d7564d4..6a6f251782 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 @@ -20,8 +20,8 @@ import com.gh.gamecenter.forum.home.ForumArticleAskItemViewHolder import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.qa.entity.AnswerEntity import com.gh.gamecenter.qa.entity.Questions -import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity +import com.gh.gamecenter.qa.video.detail.ForumVideoDetailActivity class ForumArticleAskListAdapter(context: Context, val bbsId: String, val mEntrance: String, val path: String) : ListAdapter(context), ISyncAdapterHandler { @@ -61,6 +61,7 @@ class ForumArticleAskListAdapter(context: Context, val bbsId: String, val mEntra answer.questions = questions if (path == "精华") answer.type = "community_article" if (path == "问答") answer.type = "question" + if (path == "视频") answer.type = "video" if (answer.bbs.id.isEmpty()) answer.bbs.id = bbsId @@ -77,13 +78,20 @@ class ForumArticleAskListAdapter(context: Context, val bbsId: String, val mEntra answerViewHolder.bindForumAnswerItem(answer, mEntrance, path) answerViewHolder.itemView.setOnClickListener { val entrance = BaseActivity.mergeEntranceAndPath(mEntrance, path) - if ("community_article" == answer.type) { - MtaHelper.onEvent(holder.getEventId(entrance), holder.getKey(entrance), "${answer.articleTitle}(${answer.id})") - mContext.startActivity(ArticleDetailActivity.getIntent(mContext, CommunityEntity(bbsId), answer.id!!, mEntrance, path)) - } else { - MtaHelper.onEvent(holder.getEventId(entrance), holder.getKey(entrance), "${answer.articleTitle}(${answer.id})") - mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, answer.id - ?: "", mEntrance, path)) + when (answer.type) { + "community_article" -> { + MtaHelper.onEvent(holder.getEventId(entrance), holder.getKey(entrance), "${answer.articleTitle}(${answer.id})") + mContext.startActivity(ArticleDetailActivity.getIntent(mContext, CommunityEntity(bbsId), answer.id!!, mEntrance, path)) + } + "video" -> { + MtaHelper.onEvent(holder.getEventId(entrance), holder.getKey(entrance), "${answer.articleTitle}(${answer.id})") + mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, answer.id ?:"")) + } + else -> { + MtaHelper.onEvent(holder.getEventId(entrance), holder.getKey(entrance), "${answer.articleTitle}(${answer.id})") + mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, answer.id + ?: "", mEntrance, path)) + } } } } 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 8ce88b45c4..7c3227bf13 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 @@ -64,7 +64,12 @@ class ForumArticleAskListFragment : ListFragment(application) { var sort: String = "time.reply" + var videoSort: String = "recommend" override fun provideDataObservable(page: Int): Observable> { return when (mPath) { @@ -23,9 +23,12 @@ class ForumArticleAskListViewModel(application: Application, val bbsId: String = "精华" -> { RetrofitManager.getInstance(getApplication()).api.getEssenceForumList(bbsId, page) } - else -> { + "问答" -> { RetrofitManager.getInstance(getApplication()).api.getAskForumList(bbsId, page) } + else -> { + RetrofitManager.getInstance(getApplication()).api.getVideoForumList(bbsId, UrlFilterUtils.getFilterQuery(videoSort, "-1"), page) + } } } 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 eaed3f4bd6..1f80d4c3a8 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 @@ -59,12 +59,14 @@ class ForumDetailFragment : BaseLazyTabFragment() { private var mAllForumArticleAskListFragment: ForumArticleAskListFragment? = null private var mEssenceForumArticleAskListFragment: ForumArticleAskListFragment? = null private var mAskForumArticleAskListFragment: ForumArticleAskListFragment? = null + private var mVideoForumArticleAskListFragment: ForumArticleAskListFragment? = null private var bbsId: String = "" private var mViewModel: ForumDetailViewModel? = null private var mForumDetail: ForumDetailEntity? = null private lateinit var mBinding: FragmentForumDetailBinding private var mFilter = "最新回复" + private var mVideoFilter = "推荐" private var mLastPosition = 0 override fun initFragmentList(fragments: MutableList) { @@ -74,15 +76,19 @@ class ForumDetailFragment : BaseLazyTabFragment() { EntranceUtils.KEY_PATH to "精华", EntranceUtils.KEY_BBS_ID to bbsId)) as ForumArticleAskListFragment? mAskForumArticleAskListFragment = ForumArticleAskListFragment().with(bundleOf(EntranceUtils.KEY_ENTRANCE to "论坛详情", EntranceUtils.KEY_PATH to "问答", EntranceUtils.KEY_BBS_ID to bbsId)) as ForumArticleAskListFragment? + mVideoForumArticleAskListFragment = ForumArticleAskListFragment().with(bundleOf(EntranceUtils.KEY_ENTRANCE to "论坛详情", + EntranceUtils.KEY_PATH to "视频", EntranceUtils.KEY_BBS_ID to bbsId)) as ForumArticleAskListFragment? fragments.add(mAllForumArticleAskListFragment!!) fragments.add(mEssenceForumArticleAskListFragment!!) fragments.add(mAskForumArticleAskListFragment!!) + fragments.add(mVideoForumArticleAskListFragment!!) } override fun initTabTitleList(tabTitleList: MutableList) { tabTitleList.add(TAB_TITLE_ALL) tabTitleList.add(TAB_TITLE_ESSENCE) tabTitleList.add(TAB_TITLE_ASK) + tabTitleList.add(TAB_TITLE_VIDEO) } override fun getInflatedLayout(): View { @@ -164,6 +170,7 @@ class ForumDetailFragment : BaseLazyTabFragment() { }) mViewPager.doOnPageSelected { mBinding.filterContainer.goneIf(it != 0) + mBinding.videoFilterContainer.goneIf(it != 3) MtaHelper.onEvent("论坛详情", getKeyValue(mLastPosition), getKeyValue(it)) mLastPosition = it } @@ -231,7 +238,7 @@ class ForumDetailFragment : BaseLazyTabFragment() { } } - @OnClick(R.id.filterContainer, R.id.community_edit, R.id.moderatorTv, R.id.reuse_no_connection, R.id.gameZoneTv, + @OnClick(R.id.filterContainer, R.id.videoFilterContainer, R.id.community_edit, R.id.moderatorTv, R.id.reuse_no_connection, R.id.gameZoneTv, R.id.followTv, R.id.forumThumbBig, R.id.searchIv, R.id.forumRuleContainer) fun onViewClick(view: View) { when (view.id) { @@ -240,7 +247,7 @@ class ForumDetailFragment : BaseLazyTabFragment() { } R.id.filterContainer -> { MtaHelper.onEvent("论坛详情", "全部Tab", "过滤选项") - showFilterPopupWindow { + showFilterPopupWindow (arrayListOf("最新发布", "最新回复")) { mFilter = it mBinding.forumFilter.text = mFilter if (mAllForumArticleAskListFragment != null && mViewPager.currentItem == 0) { @@ -248,6 +255,16 @@ class ForumDetailFragment : BaseLazyTabFragment() { } } } + R.id.videoFilterContainer -> { + MtaHelper.onEvent("论坛详情", "视频Tab", "过滤选项") + showFilterPopupWindow (arrayListOf("推荐", "最新发布")) { + mVideoFilter = it + mBinding.videoForumFilter.text = mVideoFilter + if (mVideoForumArticleAskListFragment != null && mViewPager.currentItem == 3) { + mVideoForumArticleAskListFragment?.onRefresh(mVideoFilter) + } + } + } R.id.community_edit -> { showCommunityEditWindow() } @@ -352,8 +369,7 @@ class ForumDetailFragment : BaseLazyTabFragment() { } - private fun showFilterPopupWindow(clickListener: (String) -> Unit) { - val contentList = arrayListOf("最新发布", "最新回复") + private fun showFilterPopupWindow(contentList: ArrayList, clickListener: (String) -> Unit) { val inflater = LayoutInflater.from(requireContext()) val layout = inflater.inflate(R.layout.layout_popup_container, null) val popupWindow = PopupWindow( @@ -371,7 +387,7 @@ class ForumDetailFragment : BaseLazyTabFragment() { val container = layout.findViewById(R.id.container) for (text in contentList) { val item = inflater.inflate(R.layout.layout_popup_option_item, container, false) - if (mFilter == text) { + if (mVideoFilter == text) { (item as TextView).setTextColor(ContextCompat.getColor(requireContext(), R.color.theme_font)) } else { (item as TextView).setTextColor(ContextCompat.getColor(requireContext(), R.color.text_999999)) @@ -476,6 +492,7 @@ class ForumDetailFragment : BaseLazyTabFragment() { const val TAB_TITLE_ALL = "全部" const val TAB_TITLE_ESSENCE = "精华" const val TAB_TITLE_ASK = "问答" + const val TAB_TITLE_VIDEO = "视频" const val EB_SHOW_QUESTION_BUTTON = "EB_SHOW_QUESTION_BUTTON" const val EB_HIDE_QUESTION_BUTTON = "EB_HIDE_QUESTION_BUTTON" } diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt index 3c71bf2313..8e84265b9f 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt @@ -6,30 +6,30 @@ import android.content.Context import android.os.Bundle import android.os.Handler import android.util.AttributeSet -import android.util.Log import android.view.Surface import android.view.View import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView -import androidx.appcompat.app.AppCompatActivity import com.facebook.drawee.view.SimpleDraweeView -import com.gh.common.observer.MuteCallback -import com.gh.common.observer.VolumeObserver -import com.gh.common.util.ImageUtils +import com.gh.common.constant.Constants +import com.gh.common.util.* import com.gh.gamecenter.R -import com.gh.gamecenter.qa.entity.CommunityVideoEntity +import com.gh.gamecenter.entity.ForumVideoEntity import com.gh.gamecenter.video.detail.CustomManager +import com.lightgame.utils.Utils import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer import com.shuyu.gsyvideoplayer.video.base.GSYVideoView -import kotlinx.android.synthetic.main.piece_video_control.view.* +import com.shuyu.gsyvideoplayer.video.base.GSYVideoViewBridge +import io.reactivex.disposables.Disposable import java.util.* class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : StandardGSYVideoPlayer(context, attrs) { - private var mMuteCallback: MuteCallback - private var mVolumeObserver: VolumeObserver - private var mVideoEntity: CommunityVideoEntity? = null +// private var mMuteCallback: MuteCallback +// private var mVolumeObserver: VolumeObserver + private var mVideoEntity: ForumVideoEntity? = null + private var mMuteDisposable: Disposable? = null var uuid = UUID.randomUUID().toString() var thumbImage: SimpleDraweeView = findViewById(R.id.thumbImage) @@ -37,6 +37,8 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At var completeContainer: LinearLayout = findViewById(R.id.completeContainer) var replayIv: ImageView = findViewById(R.id.replayIv) var replayTv: TextView = findViewById(R.id.replayTv) + var shareIv: ImageView = findViewById(R.id.shareIv) + var shareTv: TextView = findViewById(R.id.shareTv) var volume: ImageView = findViewById(R.id.volume) override fun getLayoutId(): Int { @@ -48,17 +50,61 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At volume.setOnClickListener { toggleMute() } } - mMuteCallback = object : MuteCallback { - override fun onMute(isMute: Boolean) { - if (isMute) { - mute() - } else { - unMute() - } - } - } +// mMuteCallback = object : MuteCallback { +// override fun onMute(isMute: Boolean) { +// if (isMute) { +// mute() +// } else { +// unMute() +// } +// } +// } +// +// mVolumeObserver = VolumeObserver(context, Handler(), mMuteCallback) + } - mVolumeObserver = VolumeObserver(context, Handler(), mMuteCallback) + override fun getGSYVideoManager(): GSYVideoViewBridge { + CustomManager.getCustomManager(getKey()).initContext(context.applicationContext) + return CustomManager.getCustomManager(getKey()) + } + + override fun startPlayLogic() { + super.startPlayLogic() + val topVideoVoiceStatus = SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true) + if (topVideoVoiceStatus) { + violenceUpdateMuteStatus() + } + } + + private fun violenceUpdateMuteStatus() { + if (mMuteDisposable != null) { + mMuteDisposable?.dispose() + mMuteDisposable = null + } + mMuteDisposable = rxTimer(25) { + if (it >= 400) { + mMuteDisposable?.dispose() + mMuteDisposable = null + } + mute() + } + } + + // 不需要弹弹窗,直接播放 + override fun showWifiDialog() { + startPlayLogic() + //val trafficVideo = PreferenceManager.getDefaultSharedPreferences(context).getBoolean(SettingsFragment.TRAFFIC_VIDEO_SP_KEY, false) + //if (trafficVideo) { + // 不延迟的话 isCacheFile 可能直接返回 false + postDelayed({ + // 这个库的 NetworkUtils.isWifiConnected 可能会触发空指针,这里换为我们自己的 + if (!com.shuyu.gsyvideoplayer.utils.NetworkUtils.isAvailable(mContext) && !gsyVideoManager.isCacheFile) { + Utils.toast(context, "网络异常,请检查手机网络状态") + } else if (!NetworkUtils.isWifiConnected(mContext) && !gsyVideoManager.isCacheFile) { + Utils.toast(context, "当前为非Wi-Fi环境,请注意流量消耗") + } + }, 100) + // } } override fun updateStartImage() { @@ -101,7 +147,7 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At durationTv.text = duration } - fun updateVideoData(video: CommunityVideoEntity) { + fun updateVideoData(video: ForumVideoEntity) { mVideoEntity = video } @@ -138,6 +184,12 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At // uploadVideoStreamingPlaying("重新播放") } replayTv.setOnClickListener { replayIv.performClick() } + shareIv.setOnClickListener { + share() + } + shareTv.setOnClickListener { + shareIv.performClick() + } } // if (currentState == GSYVideoView.CURRENT_STATE_PLAYING) { @@ -152,11 +204,6 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At } } - override fun changeUiToPlayingClear() { - super.changeUiToPlayingClear() -// setViewShowState(mBottomProgressBar, View.GONE) - } - override fun changeUiToPlayingShow() { super.changeUiToPlayingShow() setViewShowState(mBottomProgressBar, View.VISIBLE) @@ -190,39 +237,66 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At CustomManager.getCustomManager(getKey()).isNeedMute = false } - fun observeVolume(activity: AppCompatActivity) { - activity.contentResolver?.registerContentObserver( - android.provider.Settings.System.CONTENT_URI, true, mVolumeObserver) + private fun share() { + mVideoEntity?.let { + val shareIcon = it.poster + val shareUrl = if (isPublishEnv()) { + "https://m.ghzs666.com/video/${it.id}" + } else { + "https://resource.ghzs.com/page/video_play/video/video.html?video=${it.id}" + } + ShareUtils.getInstance(context).showShareWindowsCallback(context as Activity, + this, + shareUrl, + shareIcon, + it.title, + it.des, + ShareUtils.ShareEntrance.video, it.id, object : ShareUtils.ShareCallBack { + override fun onSuccess(label: String) { +// if ("短信" == label || "复制链接" == label) viewModel?.shareVideoStatistics(it) + } - activity.application?.registerActivityLifecycleCallbacks( - object : Application.ActivityLifecycleCallbacks { - override fun onActivityPaused(a: Activity) { - if (activity == a) { - activity.contentResolver?.unregisterContentObserver(mVolumeObserver) - activity.application?.unregisterActivityLifecycleCallbacks(this) - } - } - - override fun onActivityStarted(activity: Activity) { - } - - override fun onActivityDestroyed(activity: Activity) { - } - - override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { - } - - override fun onActivityStopped(activity: Activity) { - } - - override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { - } - - override fun onActivityResumed(activity: Activity) { - } - }) + override fun onCancel() { +// uploadVideoStreamingPlaying("取消分享") + } + }) + } } + +// fun observeVolume(activity: AppCompatActivity) { +// activity.contentResolver?.registerContentObserver( +// android.provider.Settings.System.CONTENT_URI, true, mVolumeObserver) +// +// activity.application?.registerActivityLifecycleCallbacks( +// object : Application.ActivityLifecycleCallbacks { +// override fun onActivityPaused(a: Activity) { +// if (activity == a) { +// activity.contentResolver?.unregisterContentObserver(mVolumeObserver) +// activity.application?.unregisterActivityLifecycleCallbacks(this) +// } +// } +// +// override fun onActivityStarted(activity: Activity) { +// } +// +// override fun onActivityDestroyed(activity: Activity) { +// } +// +// override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { +// } +// +// override fun onActivityStopped(activity: Activity) { +// } +// +// override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { +// } +// +// override fun onActivityResumed(activity: Activity) { +// } +// }) +// } + fun getKey(): String { return uuid } 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 673e8bc4be..9b5b7932f7 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 @@ -20,6 +20,7 @@ import com.gh.gamecenter.qa.entity.ArticleEntity import com.gh.gamecenter.qa.entity.QuestionsDetailEntity import com.gh.gamecenter.qa.questions.invite.QuestionsInviteActivity import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity +import com.gh.gamecenter.qa.video.detail.ForumVideoDetailActivity import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : BaseAnswerOrArticleItemViewHolder(binding.root) { @@ -47,6 +48,11 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B binding.title.text = SpanBuilder(title).image(0, 1, R.drawable.ic_ask_label).build() } else { binding.content.visibility = View.VISIBLE + if (entity.type == "video") { + binding.content.goneIf(entity.des.isEmpty()) + } else { + binding.content.visibility = View.VISIBLE + } //若文章内有图片和视频,标题后增加‘有视频’标签 issues-1052 if (entity.getPassVideos().isNotEmpty() && entity.images.isNotEmpty()) { val videoSpan = SpanBuilder(" ").image(1, " ".length, R.drawable.ic_article_video_label).build() @@ -59,7 +65,11 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B } binding.imageContainer.bindData(entity, entrance, path) - bindVideoData(entity) + if (entity.type == "video") { + bindVideoData(entity) + } else { + bindArticleVideoData(entity) + } val user = entity.user binding.userBadgeName.setOnClickListener { binding.userBadgeIcon.performClick() } @@ -95,7 +105,46 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B binding.executePendingBindings() } - fun bindVideoData(entity: AnswerEntity) { + private fun bindVideoData(entity: AnswerEntity) { + binding.run { + if (entity.url.isEmpty()) { + horizontalVideoView.visibility = View.GONE + verticalVideoView.visibility = View.GONE + } else { + val videoInfo = entity.videoInfo + val visibleView = if (videoInfo.height > videoInfo.width) { + horizontalVideoView.visibility = View.GONE + verticalVideoView.visibility = View.VISIBLE + verticalVideoView + } else { + horizontalVideoView.visibility = View.VISIBLE + verticalVideoView.visibility = View.GONE + horizontalVideoView + } + + GSYVideoOptionBuilder() + .setIsTouchWiget(false) + .setUrl(entity.url) + .setRotateViewAuto(false) + .setCacheWithPlay(true) + .setRotateWithSystem(false) + .setReleaseWhenLossAudio(true) + .setLooping(false) + .setShowFullAnimation(false) + .setEnlargeImageRes(R.drawable.ic_article_video_full_screen) + .build(visibleView) + visibleView.run { + updateVideoData(entity.transformForumVideoEntity()) + updateThumb(entity.poster) + updateDurationTv(TimeUtils.formatDuration(entity.length)) + updateMuteStatus() +// observeVolume(itemView.context as AppCompatActivity) + } + } + } + } + + private fun bindArticleVideoData(entity: AnswerEntity) { binding.run { if (entity.getPassVideos().isNullOrEmpty()) { horizontalVideoView.visibility = View.GONE @@ -124,18 +173,18 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B .setEnlargeImageRes(R.drawable.ic_article_video_full_screen) .build(visibleView) visibleView.run { - updateVideoData(video) + updateVideoData(entity.transformForumVideoEntity()) updateThumb(video.poster) updateDurationTv(video.duration) updateMuteStatus() - observeVolume(itemView.context as AppCompatActivity) +// observeVolume(itemView.context as AppCompatActivity) } } } } override fun bindCommendAndVote(entity: AnswerEntity, entrance: String) { - if (entity.type == "community_article") { + if (entity.type == "community_article" || entity.type == "video") { binNormalView(entity) } else { if (entity.questions.answerCount > 0) { @@ -164,6 +213,8 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B entrance, "") itemView.context.startActivity(intent) MtaHelper.onEvent(getEventId(entrance), getKey(entrance), "评论图标") + } else if (entity.type == "video") { + itemView.context.startActivity(ForumVideoDetailActivity.getIntent(itemView.context, entity.id ?: "")) } else { val intent = if (entity.questions.answerCount > 0) { NewQuestionDetailActivity.getIntent(it.context, entity.questions.id, entrance, "") @@ -180,7 +231,7 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B debounceActionWithInterval(R.id.container_like, 1000) { CheckLoginUtils.checkLogin(itemView.context, entrance) { - if (entity.type == "community_article") { + if (entity.type == "community_article" || entity.type == "video") { MtaHelper.onEvent(getEventId(entrance), getKey(entrance), "点赞图标") if (!voteIcon.isChecked) voteAnswer(entity) else cancelAnswerVote(entity) 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 ad9f1524aa..c9f52e538b 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 @@ -10,7 +10,7 @@ import com.gh.common.iinterface.IScrollable import com.gh.common.util.* import com.gh.gamecenter.R import com.gh.gamecenter.baselist.LazyListFragment -import com.gh.gamecenter.baselist.ListAdapter +import com.gh.gamecenter.baselist.LoadType import com.gh.gamecenter.databinding.FragmentForumListBinding import com.gh.gamecenter.entity.ForumEntity import com.gh.gamecenter.eventbus.EBDeleteDetail @@ -28,9 +28,10 @@ class ForumArticleListFragment : LazyListFragment { - if (!::mAdapter.isInitialized) { - mAdapter = ForumArticleListAdapter(requireContext(), mEntrance, mPath) - } - return mAdapter - } + override fun provideListAdapter() = mAdapter ?: ForumArticleListAdapter(requireContext(), mEntrance, mPath).apply { mAdapter = this } override fun onRefresh() { super.onRefresh() - mBinding?.recordForumsContainer?.visibility = View.GONE mViewModel?.getRecordForums() } + override fun onLoadRefresh() { + showSkeleton(true) + if (mReuseNoConn != null) mReuseNoConn!!.visibility = View.GONE + if (mListLoading != null) mListLoading!!.visibility = if (mListRefresh == null || !mListRefresh!!.isRefreshing) View.VISIBLE else View.GONE + if (mReuseNoData != null) mReuseNoData!!.visibility = View.GONE + +// mListRv.visibility = View.GONE + mBaseHandler.postDelayed({ mListViewModel.load(LoadType.REFRESH) }, 500) + } + + override fun onLoadDone() { + super.onLoadDone() + if (CheckLoginUtils.isLogin()) mHaveLoadLoginData = true + } + private fun initRecordForums(list: List) { mBinding?.run { recordForumsContainer.visibility = View.VISIBLE @@ -134,14 +144,16 @@ class ForumArticleListFragment : LazyListFragment 0 -> 0 - count.getQaCount() > 0 -> 1 - count.video > 0 -> 2 + count.getTotalCount() > 0 -> 1 +// count.video > 0 -> 2 else -> 0 } } @@ -310,7 +310,6 @@ class UserHomeFragment : NormalFragment() { val fragmentList = listOf(gameFragment, qaFragment) val titleList = listOf("游戏", "发布") - val countList = listOf(count.gameComment, count.getQaCount(), count.video) viewpager.offscreenPageLimit = fragmentList.size viewpager.adapter = FragmentAdapter(childFragmentManager, fragmentList, titleList) @@ -322,13 +321,13 @@ class UserHomeFragment : NormalFragment() { for (i in 0 until tabLayout.tabCount) { val tab = tabLayout.getTabAt(i) ?: continue - val tabView = getTabView(titleList[i], countList[i]) + val tabView = getTabView(titleList[i]) tab.customView = tabView } BaseFragment_TabLayout.initTabStyle(tabLayout, viewpager.currentItem) } - private fun getTabView(title: String, count: Int): View { + private fun getTabView(title: String): View { 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) { 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 ff582c6908..bea561c4af 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 @@ -16,6 +16,7 @@ import com.gh.gamecenter.adapter.viewholder.PersonalHomeRatingViewHolder import com.gh.gamecenter.baselist.ListAdapter import com.gh.gamecenter.databinding.PersonalHomeRatingBinding import com.gh.gamecenter.databinding.UserHistoryItemBinding +import com.gh.gamecenter.entity.ForumVideoEntity import com.gh.gamecenter.entity.PersonalHistoryEntity import com.gh.gamecenter.gamedetail.rating.edit.RatingEditActivity import com.gh.gamecenter.personalhome.PersonalItemViewHolder @@ -26,7 +27,7 @@ import java.util.regex.Pattern class UserHistoryAdapter(context: Context, private val mListViewModel: UserHistoryViewModel, private val mEntrance: String, - val itemClickCallback: (historyEntity: PersonalHistoryEntity, position: Int) -> Unit) + private val itemClickCallback: (historyEntity: PersonalHistoryEntity, position: Int) -> Unit) : ListAdapter(context) { private var mExpandSparseBooleanArray = SparseBooleanArray() @@ -82,7 +83,11 @@ class UserHistoryAdapter(context: Context, answer.communityId = historyEntity.community.id answer.communityName = historyEntity.community.name holder.binding.imageContainer.bindData(answer, mEntrance) - bindVideoData(holder.binding, historyEntity) + if (historyEntity.type == "video") { + bindVideoData(holder.binding, historyEntity.transformForumVideoEntity()) + } else { + bindArticleVideoData(holder.binding, historyEntity) + } holder.binding.run { entity = historyEntity @@ -124,7 +129,46 @@ class UserHistoryAdapter(context: Context, } } - private fun bindVideoData(binding: UserHistoryItemBinding, entity: PersonalHistoryEntity) { + private fun bindVideoData(binding: UserHistoryItemBinding, entity: ForumVideoEntity) { + binding.run { + if (entity.url.isEmpty()) { + horizontalVideoView.visibility = View.GONE + verticalVideoView.visibility = View.GONE + } else { + val videoInfo = entity.videoInfo + val visibleView = if (videoInfo.height > videoInfo.width) { + horizontalVideoView.visibility = View.GONE + verticalVideoView.visibility = View.VISIBLE + verticalVideoView + } else { + horizontalVideoView.visibility = View.VISIBLE + verticalVideoView.visibility = View.GONE + horizontalVideoView + } + + GSYVideoOptionBuilder() + .setIsTouchWiget(false) + .setUrl(entity.url) + .setRotateViewAuto(false) + .setCacheWithPlay(true) + .setRotateWithSystem(false) + .setReleaseWhenLossAudio(true) + .setLooping(false) + .setShowFullAnimation(false) + .setEnlargeImageRes(R.drawable.ic_article_video_full_screen) + .build(visibleView) + visibleView.run { + updateVideoData(entity) + updateThumb(entity.poster) + updateDurationTv(TimeUtils.formatDuration(entity.length)) + updateMuteStatus() +// observeVolume(mContext as AppCompatActivity) + } + } + } + } + + private fun bindArticleVideoData(binding: UserHistoryItemBinding, entity: PersonalHistoryEntity) { binding.run { if (entity.getPassVideos().isNullOrEmpty()) { horizontalVideoView.visibility = View.GONE @@ -153,11 +197,11 @@ class UserHistoryAdapter(context: Context, .setEnlargeImageRes(R.drawable.ic_article_video_full_screen) .build(visibleView) visibleView.run { - updateVideoData(video) + updateVideoData(entity.transformForumVideoEntity()) updateThumb(video.poster) updateDurationTv(video.duration) updateMuteStatus() - observeVolume(mContext as AppCompatActivity) +// observeVolume(mContext as AppCompatActivity) } } } 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 46269827eb..0ff949e1e6 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 @@ -11,6 +11,7 @@ import com.gh.gamecenter.R import com.gh.gamecenter.baselist.ListAdapter import com.gh.gamecenter.baselist.ListFragment import com.gh.gamecenter.databinding.FragmentUserPublishBinding +import com.gh.gamecenter.entity.ForumVideoEntity import com.gh.gamecenter.entity.PersonalEntity import com.gh.gamecenter.entity.PersonalHistoryEntity import com.gh.gamecenter.entity.RatingComment @@ -20,6 +21,7 @@ import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.qa.entity.AnswerDetailEntity import com.gh.gamecenter.qa.entity.ArticleDetailEntity import com.gh.gamecenter.qa.entity.QuestionsDetailEntity +import com.gh.gamecenter.qa.video.detail.ForumVideoDetailActivity import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity import com.halo.assistant.HaloApp @@ -54,8 +56,8 @@ class UserHistoryFragment : ListFragment { + val resultData = data.getParcelableExtra(ForumVideoEntity::class.java.simpleName) + historyEntity?.apply { + count.vote = resultData?.vote ?: 0 + count.comment = resultData?.commentCount ?: 0 + des = HtmlUtils.stripHtmlCode(resultData?.des ?: "") + title = resultData?.title ?: "" + me.isVoted = resultData?.me?.isVoted ?: false + } + } } mAdapter?.notifyItemChanged(dataPosition) } diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryViewModel.kt b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryViewModel.kt index 2b785b99c9..2e2096c239 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/home/UserHistoryViewModel.kt @@ -107,13 +107,15 @@ class UserHistoryViewModel(application: Application, var userId: String, private ALL("all"), COMMUNITY_ARTICLE("community_article"), QUESTION("question"), - ANSWER("answer"); + ANSWER("answer"), + VIDEO("video"); fun getDisplayText() = when (this) { ALL -> "全部" QUESTION -> "提问" ANSWER -> "回答" COMMUNITY_ARTICLE -> "帖子" + VIDEO -> "视频" } companion object { 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 d884906f80..0205b1d5aa 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 @@ -1,5 +1,6 @@ package com.gh.gamecenter.qa.answer +import android.annotation.SuppressLint import android.view.View import android.widget.TextView import com.airbnb.lottie.LottieAnimationView @@ -14,6 +15,8 @@ import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.qa.comment.CommentActivity import com.gh.gamecenter.qa.entity.AnswerEntity import com.gh.gamecenter.qa.entity.ArticleEntity +import com.gh.gamecenter.qa.video.detail.ForumVideoDetailActivity +import com.gh.gamecenter.retrofit.BiResponse import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager import com.lightgame.utils.Utils @@ -52,6 +55,8 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH entity.id ?: "", entrance, "") itemView.context.startActivity(intent) + } else if (entity.type == "video") { + itemView.context.startActivity(ForumVideoDetailActivity.getIntent(itemView.context, entity.id ?: "")) } else { val intent = CommentActivity.getAnswerCommentIntent(itemView.context, entity.id!!, @@ -143,7 +148,7 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH if (!entity.active) { voteIcon.setImageResource(R.drawable.community_vote_unavailable) voteCount.setTextColor(R.color.text_cccccc.toColor()) - } else if (entity.me.isCommunityArticleVote || entity.me.isAnswerVoted) { + } else if (entity.me.isCommunityArticleVote || entity.me.isAnswerVoted || entity.me.isVoted) { voteIcon.setImageResource(R.drawable.community_vote_selector) voteIcon.isChecked = true voteCount.setTextColor(R.color.theme_font.toColor()) @@ -166,64 +171,86 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH } } + @SuppressLint("CheckResult") fun voteAnswer(entity: AnswerEntity) { entity.vote = entity.vote + 1 voteCount.text = if (entity.vote > 0) entity.vote.toString() else "赞同" playVoteAnimation() - val voteObservable = if (entity.type == "community_article") { - val communityId = if (entity.articleCommunityId.isNotEmpty()) entity.articleCommunityId - else entity.bbs.id - RetrofitManager.getInstance(itemView.context).api - .postCommunityArticleVote(communityId, entity.id) - } else { - RetrofitManager.getInstance(itemView.context).api - .postAnswerVote(entity.id) - } - voteObservable - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Response() { - override fun onResponse(response: VoteEntity?) { - if (entity.type == "community_article") { - entity.me.isCommunityArticleVote = true - EnergyTaskHelper.postEnergyTask("vote_community_article", entity.id) - } else { - entity.me.isAnswerVoted = true - EnergyTaskHelper.postEnergyTask("vote_answer", entity.id) + if (entity.type == "video") { + RetrofitManager.getInstance(itemView.context) + .api.voteVideo(entity.id) + .subscribeOn(Schedulers.io()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: ResponseBody) { + //Utils.toast(getApplication(), "已点赞") + EnergyTaskHelper.postEnergyTask("vote_video", entity.id) } - ToastUtils.showToast("已赞同") - } - override fun onFailure(e: HttpException?) { - ErrorHelper.handleErrorWithCustomizedHandler(itemView.context, e?.response()?.errorBody()?.string(), false) { - if (403008 == it) { - Utils.toast(itemView.context, R.string.ask_vote_hint) - true - } else if (403036 == it) { - Utils.toast(itemView.context, R.string.ask_vote_limit_hint) - true - } else if (404001 == it) { - Utils.toast(itemView.context, "内容可能已被删除") - entity.active = false - setVoteAndCommentStyle(entity) - true + override fun onFailure(exception: Exception) { + super.onFailure(exception) + entity.vote = entity.vote - 1 + entity.me.isVoted = false + voteCount.text = if (entity.vote > 0) entity.vote.toString() else "赞同" + setVoteAndCommentStyle(entity) + } + }) + } else { + val voteObservable = if (entity.type == "community_article") { + val communityId = if (entity.articleCommunityId.isNotEmpty()) entity.articleCommunityId + else entity.bbs.id + RetrofitManager.getInstance(itemView.context).api + .postCommunityArticleVote(communityId, entity.id) + } else { + RetrofitManager.getInstance(itemView.context).api + .postAnswerVote(entity.id) + } + voteObservable + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: VoteEntity?) { + if (entity.type == "community_article") { + entity.me.isCommunityArticleVote = true + EnergyTaskHelper.postEnergyTask("vote_community_article", entity.id) } else { - entity.vote = entity.vote - 1 - if (entity.type == "community_article") { - entity.me.isCommunityArticleVote = true + entity.me.isAnswerVoted = true + EnergyTaskHelper.postEnergyTask("vote_answer", entity.id) + } + ToastUtils.showToast("已赞同") + } + + override fun onFailure(e: HttpException?) { + ErrorHelper.handleErrorWithCustomizedHandler(itemView.context, e?.response()?.errorBody()?.string(), false) { + if (403008 == it) { + Utils.toast(itemView.context, R.string.ask_vote_hint) + true + } else if (403036 == it) { + Utils.toast(itemView.context, R.string.ask_vote_limit_hint) + true + } else if (404001 == it) { + Utils.toast(itemView.context, "内容可能已被删除") + entity.active = false + setVoteAndCommentStyle(entity) + true } else { - entity.me.isAnswerVoted = true + entity.vote = entity.vote - 1 + if (entity.type == "community_article") { + entity.me.isCommunityArticleVote = true + } else { + entity.me.isAnswerVoted = true + } + voteCount.text = if (entity.vote > 0) entity.vote.toString() else "赞同" + setVoteAndCommentStyle(entity) + false } - voteCount.text = if (entity.vote > 0) entity.vote.toString() else "赞同" - setVoteAndCommentStyle(entity) - false } } - } - }) + }) + } } + @SuppressLint("CheckResult") fun cancelAnswerVote(entity: AnswerEntity) { entity.vote = entity.vote - 1 @@ -231,54 +258,73 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH voteCount.setTextColor(R.color.text_999999.toColor()) voteCount.text = if (entity.vote > 0) entity.vote.toString() else "赞同" - val unVoteObservable = if (entity.type == "community_article") { - entity.me.isCommunityArticleVote = false + if (entity.type == "video") { + RetrofitManager.getInstance(itemView.context) + .api.undoVoteVideo(entity.id) + .subscribeOn(Schedulers.io()) + .subscribe(object : BiResponse() { + override fun onSuccess(data: ResponseBody) { + Utils.toast(itemView.context, "取消点赞") + } - val communityId = if (entity.articleCommunityId.isNotEmpty()) entity.articleCommunityId - else entity.bbs.id - RetrofitManager.getInstance(itemView.context).api - .postCommunityArticleUnVote(communityId, entity.id) + override fun onFailure(exception: Exception) { + super.onFailure(exception) + entity.vote = entity.vote + 1 + entity.me.isVoted = true + voteCount.text = if (entity.vote > 0) entity.vote.toString() else "赞同" + setVoteAndCommentStyle(entity) + } + }) } else { - entity.me.isAnswerVoted = false + val unVoteObservable = if (entity.type == "community_article") { + entity.me.isCommunityArticleVote = false - RetrofitManager.getInstance(itemView.context).api - .postAnswerUnvote(entity.id) - } - unVoteObservable - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Response() { - override fun onResponse(response: VoteEntity?) { - Utils.toast(itemView.context, "取消赞同") - } + val communityId = if (entity.articleCommunityId.isNotEmpty()) entity.articleCommunityId + else entity.bbs.id + RetrofitManager.getInstance(itemView.context).api + .postCommunityArticleUnVote(communityId, entity.id) + } else { + entity.me.isAnswerVoted = false - override fun onFailure(e: HttpException?) { - ErrorHelper.handleErrorWithCustomizedHandler(itemView.context, e?.response()?.errorBody()?.string(), false) { - if (403008 == it) { - Utils.toast(itemView.context, R.string.ask_vote_hint) - true - } else if (403036 == it) { - Utils.toast(itemView.context, R.string.ask_vote_limit_hint) - true - } else if (404001 == it) { - Utils.toast(itemView.context, "内容可能已被删除") - entity.active = false - setVoteAndCommentStyle(entity) - true - } else { - entity.vote = entity.vote + 1 - if (entity.type == "community_article") { - entity.me.isCommunityArticleVote = true + RetrofitManager.getInstance(itemView.context).api + .postAnswerUnvote(entity.id) + } + unVoteObservable + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: VoteEntity?) { + Utils.toast(itemView.context, "取消赞同") + } + + override fun onFailure(e: HttpException?) { + ErrorHelper.handleErrorWithCustomizedHandler(itemView.context, e?.response()?.errorBody()?.string(), false) { + if (403008 == it) { + Utils.toast(itemView.context, R.string.ask_vote_hint) + true + } else if (403036 == it) { + Utils.toast(itemView.context, R.string.ask_vote_limit_hint) + true + } else if (404001 == it) { + Utils.toast(itemView.context, "内容可能已被删除") + entity.active = false + setVoteAndCommentStyle(entity) + true } else { - entity.me.isAnswerVoted = true + entity.vote = entity.vote + 1 + if (entity.type == "community_article") { + entity.me.isCommunityArticleVote = true + } else { + entity.me.isAnswerVoted = true + } + voteCount.text = if (entity.vote > 0) entity.vote.toString() else "赞同" + setVoteAndCommentStyle(entity) + false } - voteCount.text = if (entity.vote > 0) entity.vote.toString() else "赞同" - setVoteAndCommentStyle(entity) - false } } - } - }) + }) + } } fun voteArticle(entity: ArticleEntity) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt index 09361c5e1a..c4b3f8be44 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt @@ -10,9 +10,7 @@ import androidx.room.TypeConverters import com.gh.common.annotation.SyncIgnore import com.gh.common.annotation.SyncPage import com.gh.common.syncpage.SyncFieldConstants -import com.gh.gamecenter.entity.CommunityEntity -import com.gh.gamecenter.entity.MeEntity -import com.gh.gamecenter.entity.UserEntity +import com.gh.gamecenter.entity.* import com.gh.gamecenter.room.converter.* import com.google.gson.annotations.SerializedName @@ -113,6 +111,18 @@ class AnswerEntity() : Parcelable { @SerializedName("popular_answer") var popularAnswer: AnswerEntity? = null + var des: String = "" + + var url: String = "" + + @TypeConverters(VideoInfoConverter::class) + @SerializedName("video_info") + var videoInfo: VideoInfo = VideoInfo() + + var poster: String = "" + + var length: Long = 0 + fun getPassVideos(): List { val passVideos = arrayListOf() for (video in videos) { @@ -138,6 +148,11 @@ class AnswerEntity() : Parcelable { active = parcel.readByte() != 0.toByte() type = parcel.readString() ?: "" time = parcel.readLong() + des = parcel.readString() ?: "" + url = parcel.readString() ?: "" + videoInfo = parcel.readParcelable(VideoInfo::class.java.classLoader) ?: VideoInfo() + poster = parcel.readString() ?: "" + length = parcel.readLong() } override fun writeToParcel(parcel: Parcel, flags: Int) { @@ -157,12 +172,40 @@ class AnswerEntity() : Parcelable { parcel.writeByte(if (active) 1 else 0) parcel.writeString(type) parcel.writeLong(time ?: 0) + parcel.writeString(des) + parcel.writeString(url) + parcel.writeParcelable(videoInfo, flags) + parcel.writeString(poster) + parcel.writeLong(length) } override fun describeContents(): Int { return 0 } + fun transformForumVideoEntity(): ForumVideoEntity { + val forumVideoEntity = ForumVideoEntity() + if (type == "video") { + forumVideoEntity.id = id ?: "" + forumVideoEntity.title = articleTitle ?: "" + forumVideoEntity.des = des + forumVideoEntity.url = url + forumVideoEntity.poster = poster + forumVideoEntity.length = length + forumVideoEntity.videoInfo = videoInfo + } else { + forumVideoEntity.title = questions.title ?: "" + forumVideoEntity.des = brief ?: "" + if (getPassVideos().isNotEmpty()) { + forumVideoEntity.id = getPassVideos()[0].id + forumVideoEntity.url = getPassVideos()[0].url + forumVideoEntity.poster = getPassVideos()[0].poster + forumVideoEntity.videoInfo = VideoInfo(width = getPassVideos()[0].width, height = getPassVideos()[0].height) + } + } + return forumVideoEntity + } + companion object { const val TAG: String = "AnswerEntity" diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt index 0f1c68b709..7ceabe6046 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt @@ -10,10 +10,8 @@ import com.gh.common.syncpage.SyncFieldConstants import com.gh.gamecenter.entity.CommunityEntity import com.gh.gamecenter.entity.MeEntity import com.gh.gamecenter.entity.UserEntity -import com.gh.gamecenter.room.converter.CommunityVideoConverter -import com.gh.gamecenter.room.converter.ImageInfoConverter -import com.gh.gamecenter.room.converter.ListStringConverter -import com.gh.gamecenter.room.converter.StringArrayListConverter +import com.gh.gamecenter.entity.VideoInfo +import com.gh.gamecenter.room.converter.* import com.google.gson.annotations.SerializedName import kotlinx.android.parcel.Parcelize @@ -45,7 +43,14 @@ data class ArticleEntity( @Ignore var commentable: Boolean = true, @Ignore - var bbs: CommunityEntity = CommunityEntity() + var bbs: CommunityEntity = CommunityEntity(), + var des: String = "", + var url: String = "", + @TypeConverters(VideoInfoConverter::class) + @SerializedName("video_info") + var videoInfo: VideoInfo = VideoInfo(), + var poster: String = "", + var length: Long = 0 ) : Parcelable { fun getPassVideos(): List { @@ -78,6 +83,11 @@ data class ArticleEntity( answer.bbs = bbs answer.type = "community_article" answer.imagesInfo = imagesInfo + answer.des = des + answer.url = url + answer.videoInfo = videoInfo + answer.poster = poster + answer.length = length return answer } } 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 49d9c0ad3f..26196d61a8 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 @@ -3,12 +3,16 @@ package com.gh.gamecenter.qa.video.detail import android.content.Context import android.content.Intent import android.os.Bundle +import androidx.fragment.app.Fragment import com.gh.base.BaseActivity import com.gh.common.util.DisplayUtils import com.gh.common.util.EntranceUtils import com.gh.gamecenter.R +import com.gh.gamecenter.normal.NormalFragment class ForumVideoDetailActivity : BaseActivity() { + var containerFragment: Fragment? = null + override fun getLayoutId(): Int { return R.layout.activity_amway } @@ -17,10 +21,18 @@ class ForumVideoDetailActivity : BaseActivity() { super.onCreate(savedInstanceState) DisplayUtils.transparentStatusBar(this) - val containerFragment = supportFragmentManager.findFragmentByTag(ForumVideoDetailFragment::class.java.simpleName) + containerFragment = supportFragmentManager.findFragmentByTag(ForumVideoDetailFragment::class.java.simpleName) ?: ForumVideoDetailFragment().with(intent.extras) // 若 placeholder 外层为 RelativeLayout 的话,会出现莫名的偏移 - supportFragmentManager.beginTransaction().replace(R.id.placeholder, containerFragment, ForumVideoDetailFragment::class.java.simpleName).commitAllowingStateLoss() + supportFragmentManager.beginTransaction().replace(R.id.placeholder, containerFragment!!, ForumVideoDetailFragment::class.java.simpleName).commitAllowingStateLoss() + } + + override fun onBackPressed() { + if (containerFragment is NormalFragment + && (containerFragment as NormalFragment).isAdded + && !(containerFragment as NormalFragment).onBackPressed()) { + super.onBackPressed() + } } companion object { 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 6ca1dc18ac..a78d9229dd 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 @@ -5,6 +5,7 @@ import android.content.Context import android.content.Intent import android.graphics.Color import android.os.Bundle +import android.util.Log import android.view.LayoutInflater import android.view.MenuItem import android.view.View @@ -500,4 +501,11 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { mBinding.topVideoView.release() mBinding.topVideoView.disposableTimer() } + + override fun onBackPressed(): Boolean { + if (SyncDataBetweenPageHelper.setResultAndFinish(requireActivity(), mForumVideoEntity)) { + return true + } + return super.onBackPressed() + } } \ No newline at end of file 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 d2467048a0..4ea5d8bf94 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 @@ -15,6 +15,7 @@ import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager import com.lightgame.utils.Utils import io.reactivex.Observable +import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import okhttp3.ResponseBody import retrofit2.HttpException @@ -69,11 +70,12 @@ class VideoDescViewModel(application: Application) : ListViewModel() { override fun onSuccess(data: ResponseBody) { topVideoDetail?.let { - it.me.isVoted = false - it.vote = it.vote - 1 + it.me.isVoted = true + it.vote = it.vote + 1 handleSuccessLiveData.postValue(true) ToastUtils.showToast("点赞爆棚,视频能让更多人看见!") } @@ -93,8 +95,8 @@ class VideoDescViewModel(application: Application) : ListViewModel() { override fun onSuccess(data: ResponseBody) { topVideoDetail?.let { - it.me.isVoted = true - it.vote = it.vote + 1 + it.me.isVoted = false + it.vote = it.vote - 1 handleSuccessLiveData.postValue(true) } } 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 bd2b6e99f0..9a08b784ae 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 @@ -2694,6 +2694,12 @@ public interface ApiService { @GET("bbses/{bbs_id}/questions?view=digest") Observable> getAskForumList(@Path("bbs_id") String bbsId, @Query("page") int page); + /** + * 获取论坛问答Tab内容(视频) + */ + @GET("bbses/{bbs_id}/videos") + Observable> getVideoForumList(@Path("bbs_id") String bbsId, @Query("sort") String sort, @Query("page") int page); + /** * 获取论坛版主 */ diff --git a/app/src/main/java/com/gh/gamecenter/room/converter/VideoInfoConverter.java b/app/src/main/java/com/gh/gamecenter/room/converter/VideoInfoConverter.java new file mode 100644 index 0000000000..a938a6dbe8 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/room/converter/VideoInfoConverter.java @@ -0,0 +1,23 @@ +package com.gh.gamecenter.room.converter; + +import androidx.room.TypeConverter; + +import com.gh.gamecenter.entity.UserEntity; +import com.gh.gamecenter.entity.VideoInfo; +import com.google.gson.Gson; + +/** + * Created by khy on 18/04/18. + */ + +public class VideoInfoConverter { + @TypeConverter + public static String toVideoInfoString(VideoInfo data) { + return new Gson().toJson(data); + } + + @TypeConverter + public static VideoInfo toVideoInfo(String token) { + return new Gson().fromJson(token, VideoInfo.class); + } +} diff --git a/app/src/main/res/layout/community_answer_item.xml b/app/src/main/res/layout/community_answer_item.xml index deca8adf5c..e3e98774dc 100644 --- a/app/src/main/res/layout/community_answer_item.xml +++ b/app/src/main/res/layout/community_answer_item.xml @@ -179,7 +179,7 @@ android:includeFontPadding="false" android:lineSpacingExtra="4dp" android:maxLines="2" - android:text="@{entity.questions.title}" + android:text="@{(entity.type == `video`)? entity.articleTitle : entity.questions.title}" android:textColor="@color/text_333333" android:textSize="16sp" app:layout_constraintTop_toBottomOf="@id/user_icon" @@ -195,7 +195,7 @@ android:includeFontPadding="false" android:lineSpacingExtra="4dp" android:maxLines="2" - android:text="@{entity.brief}" + android:text="@{(entity.type == `video`)? entity.des : entity.brief}" android:textColor="@color/text_666666" android:textSize="14sp" app:layout_constraintTop_toBottomOf="@id/title" diff --git a/app/src/main/res/layout/fragment_forum_detail.xml b/app/src/main/res/layout/fragment_forum_detail.xml index f3dd408bc2..a461eace0d 100644 --- a/app/src/main/res/layout/fragment_forum_detail.xml +++ b/app/src/main/res/layout/fragment_forum_detail.xml @@ -380,6 +380,39 @@ android:layout_height="wrap_content" android:src="@drawable/ic_filter_down" /> + + + + + + + diff --git a/app/src/main/res/layout/fragment_forum_list.xml b/app/src/main/res/layout/fragment_forum_list.xml index a91edd33d8..21d85a18a6 100644 --- a/app/src/main/res/layout/fragment_forum_list.xml +++ b/app/src/main/res/layout/fragment_forum_list.xml @@ -84,70 +84,4 @@ - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/user_history_item.xml b/app/src/main/res/layout/user_history_item.xml index a05536cd1d..66981cb658 100644 --- a/app/src/main/res/layout/user_history_item.xml +++ b/app/src/main/res/layout/user_history_item.xml @@ -189,7 +189,7 @@ android:includeFontPadding="false" android:lineSpacingExtra="4dp" android:maxLines="2" - android:text="@{(entity.type.contains(`question`) || entity.type.contains(`article`))?entity.title:entity.question.title}" + android:text="@{(entity.type.contains(`question`) || entity.type.contains(`article`) || entity.type.contains(`video`))?entity.title:entity.question.title}" android:textColor="@color/text_333333" android:textSize="16sp" app:layout_constraintTop_toBottomOf="@id/user_icon" @@ -197,7 +197,7 @@ Date: Thu, 3 Jun 2021 10:28:36 +0800 Subject: [PATCH 26/61] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=A4=BE=E5=8C=BA-?= =?UTF-8?q?=E6=8E=A8=E8=8D=90Tab=E5=88=97=E8=A1=A8=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../category/NewCategoryListFragment.kt | 7 +-- .../forum/home/ArticleItemVideoView.kt | 12 ++--- .../forum/home/ForumArticleListFragment.kt | 44 ++++++++----------- .../main/res/layout/fragment_forum_list.xml | 34 +++++++------- 4 files changed, 46 insertions(+), 51 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/category/NewCategoryListFragment.kt b/app/src/main/java/com/gh/gamecenter/category/NewCategoryListFragment.kt index 4fbd87807d..aa410163f5 100644 --- a/app/src/main/java/com/gh/gamecenter/category/NewCategoryListFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/category/NewCategoryListFragment.kt @@ -8,10 +8,7 @@ import butterknife.BindView import com.ethanhua.skeleton.Skeleton import com.gh.common.constant.Constants import com.gh.common.exposure.ExposureListener -import com.gh.common.util.DialogUtils -import com.gh.common.util.EntranceUtils -import com.gh.common.util.observeNonNull -import com.gh.common.util.viewModelProvider +import com.gh.common.util.* import com.gh.common.view.ConfigFilterView import com.gh.common.xapk.XapkInstaller import com.gh.common.xapk.XapkUnzipStatus @@ -139,7 +136,7 @@ class NewCategoryListFragment : ListFragment(), IScrollable { @@ -54,22 +54,23 @@ class ForumArticleListFragment : LazyListFragment - val dy = scrollY - oldScrollY - if (dy > CommunityFragment.FOLLOW_HINT_TRIGGER_HEIGHT) { - EventBus.getDefault().post(EBTypeChange(CommunityFragment.EB_HIDE_QUESTION_BUTTON, 0)) - } else if (dy < -CommunityFragment.FOLLOW_HINT_TRIGGER_HEIGHT) { - EventBus.getDefault().post(EBTypeChange(CommunityFragment.EB_SHOW_QUESTION_BUTTON, 0)) - } + appbar.addOnOffsetChangedListener(AppBarLayout.OnOffsetChangedListener { _, verticalOffset -> + mListRefresh?.isEnabled = abs(verticalOffset) <= 2 + }) + + mListRv.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + if (dy > CommunityFragment.FOLLOW_HINT_TRIGGER_HEIGHT) { + EventBus.getDefault().post(EBTypeChange(CommunityFragment.EB_HIDE_QUESTION_BUTTON, 0)) + } else if (dy < -CommunityFragment.FOLLOW_HINT_TRIGGER_HEIGHT) { + EventBus.getDefault().post(EBTypeChange(CommunityFragment.EB_SHOW_QUESTION_BUTTON, 0)) } - ) + } + }) } } @@ -98,17 +99,10 @@ class ForumArticleListFragment : LazyListFragment - + android:layout_height="match_parent"> - + android:background="@null" + app:elevation="0dp" + app:layout_behavior="com.gh.common.view.FixAppBarLayoutBehavior"> + android:paddingBottom="12dp" + app:layout_scrollFlags="scroll"> + - - - + + Date: Thu, 3 Jun 2021 10:29:57 +0800 Subject: [PATCH 27/61] =?UTF-8?q?1.=E6=94=B6=E8=97=8F/=E5=8F=96=E6=B6=88?= =?UTF-8?q?=E6=94=B6=E8=97=8F=E9=97=AE=E9=A2=98=202.=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=88=91=E7=9A=84=E8=AE=BA=E5=9D=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 4 +++ .../java/com/gh/common/util/CommentHelper.kt | 12 ++++++++ .../gamecenter/collection/AnswerAdapter.java | 8 ++++-- .../java/com/gh/gamecenter/entity/MeEntity.kt | 3 ++ .../qa/answer/detail/AnswerDetailFragment.kt | 10 +++++-- .../detail/SimpleAnswerDetailActivity.kt | 21 ++++++++++++++ .../detail/SimpleAnswerDetailFragment.kt | 19 +++++++++++++ .../qa/article/draft/ArticleDraftAdapter.kt | 6 ++-- .../qa/comment/base/BaseCommentAdapter.kt | 20 +++++++++++++ .../qa/draft/CommunityDraftWrapperActivity.kt | 6 ++-- .../qa/entity/QuestionsDetailEntity.kt | 1 + .../gamecenter/qa/myqa/MyAnswerAdapter.java | 22 +++++++++++---- .../qa/myqa/MyAskWrapperFragment.java | 8 +++--- .../qa/myqa/MyQuestionsAdapter.java | 3 +- .../newdetail/NewQuestionDetailActivity.kt | 11 ++++++++ .../newdetail/NewQuestionDetailFragment.kt | 21 +++++++++++++- .../newdetail/NewQuestionDetailViewModel.kt | 28 ++++++++++++++++++- .../QuestionDetailContentViewHolder.kt | 11 ++++---- .../qa/video/publish/VideoPublishActivity.kt | 10 +++++++ .../qa/video/publish/VideoPublishFragment.kt | 6 ++++ .../retrofit/service/ApiService.java | 12 ++++++++ .../video/videomanager/VideoDraftAdapter.kt | 16 ++--------- .../video/videomanager/VideoDraftFragment.kt | 15 +++++++++- 23 files changed, 229 insertions(+), 44 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/qa/answer/detail/SimpleAnswerDetailActivity.kt create mode 100644 app/src/main/java/com/gh/gamecenter/qa/answer/detail/SimpleAnswerDetailFragment.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 884393b974..f4f65152ef 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -682,6 +682,10 @@ android:name=".forum.list.ForumListActivity" android:screenOrientation="portrait" /> + + implements ISyncAda holder.itemView.setOnClickListener(v -> { if (entity.getActive()) { - mContext.startActivity(AnswerDetailActivity.getIntent(mContext, entity.getId(), mEntrance, path)); +// mContext.startActivity(AnswerDetailActivity.getIntent(mContext, entity.getId(), mEntrance, path)); + mContext.startActivity(NewQuestionDetailActivity.getCommentIntent(mContext, entity.getQuestions().getId(), entity.getId(), mEntrance, path)); } else { showDeleteDialog(entity.getId()); } @@ -112,7 +115,8 @@ public class AnswerAdapter extends ListAdapter implements ISyncAda }); viewHolder.getBinding().title.setOnClickListener(v -> { Questions questions = entity.getQuestions(); - mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.getId(), mEntrance, path)); +// mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.getId(), mEntrance, path)); + mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, questions.getId(), mEntrance, path)); }); break; case ItemViewType.ITEM_FOOTER: 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 f8718ab257..b7f4a94f79 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/MeEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/MeEntity.kt @@ -52,6 +52,9 @@ class MeEntity(@SerializedName("is_community_voted") @SerializedName("is_article_favorite") var isArticleFavorite: Boolean = false, + @SerializedName("is_question_favorite") + var isQuestionFavorite : Boolean = false, + @SerializedName("is_toolkit_favorite") var isToolkitFavorite: Boolean = false, 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 c206e5ea71..e6bbf37c2f 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 @@ -63,7 +63,7 @@ import java.io.IOException import java.util.* import kotlin.collections.ArrayList -class AnswerDetailFragment : NormalFragment() { +open class AnswerDetailFragment : NormalFragment() { @BindView(R.id.reuse_no_connection) lateinit var mNoConn: View @@ -126,7 +126,7 @@ class AnswerDetailFragment : NormalFragment() { private var mRefreshFooter: AnswerDetailRefreshFooter? = null private var mSkeletonScreen: SkeletonScreen? = null - private lateinit var mBinding: FragmentAnswerDetailBinding + lateinit var mBinding: FragmentAnswerDetailBinding lateinit var mViewModel: AnswerDetailViewModel private lateinit var mContainerViewModel: AnswerDetailContainerViewModel @@ -994,10 +994,14 @@ class AnswerDetailFragment : NormalFragment() { private fun hideLoadingViewAndShowContent() { mNoConn.visibility = View.GONE - mBinding.bottomController.root.visibility = View.VISIBLE + mBinding.bottomController.root.visibility = if (shouldShowBottomController()) View.VISIBLE else View.GONE mBinding.scrollView.visibility = View.VISIBLE } + open fun shouldShowBottomController(): Boolean { + return true + } + @SuppressLint("SetTextI18n") private fun updateQuestionView(question: Questions) { val video = if (!question.videos.isNullOrEmpty()) question.videos[0] else null 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 new file mode 100644 index 0000000000..71a9234155 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/SimpleAnswerDetailActivity.kt @@ -0,0 +1,21 @@ +package com.gh.gamecenter.qa.answer.detail + +import android.content.Context +import android.content.Intent +import android.os.Bundle +import com.gh.base.BaseActivity +import com.gh.common.util.EntranceUtils +import com.gh.gamecenter.NormalActivity + +class SimpleAnswerDetailActivity : NormalActivity() { + + companion object { + fun getIntent(context: Context, answerId: String, entrance: String, path: String): Intent { + val bundle = Bundle() + bundle.putString(EntranceUtils.KEY_ANSWER_ID, answerId) + bundle.putString(EntranceUtils.KEY_ENTRANCE, BaseActivity.mergeEntranceAndPath(entrance, path)) + bundle.putString(EntranceUtils.KEY_PATH, path) + return getTargetIntent(context, SimpleAnswerDetailActivity::class.java, SimpleAnswerDetailFragment::class.java, bundle) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/detail/SimpleAnswerDetailFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/SimpleAnswerDetailFragment.kt new file mode 100644 index 0000000000..aad62b30cb --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/detail/SimpleAnswerDetailFragment.kt @@ -0,0 +1,19 @@ +package com.gh.gamecenter.qa.answer.detail + +import android.os.Bundle +import android.view.View + +class SimpleAnswerDetailFragment : AnswerDetailFragment() { + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + mBinding.refreshLayout.isEnabled = false + mBinding.answerDetailTitleRl.visibility = View.GONE + mBinding.bottomController.root.visibility = View.GONE + mBinding.topPaddingView.visibility = View.GONE + mBinding.bottomShadowView.visibility = View.GONE + mBinding.bottomDividerView.visibility = View.GONE + } + + override fun shouldShowBottomController(): Boolean = false +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/draft/ArticleDraftAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/article/draft/ArticleDraftAdapter.kt index 8ca82e2700..75380b4aae 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/draft/ArticleDraftAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/draft/ArticleDraftAdapter.kt @@ -14,9 +14,9 @@ import com.gh.gamecenter.baselist.ListAdapter import com.gh.gamecenter.databinding.CommunityArticleDraftItemBinding import com.gh.gamecenter.qa.entity.ArticleDraftEntity -class ArticleDraftAdapter(context: Context - , private val deleteCallback: (ArticleDraftEntity) -> Unit - , private val selectCallback: (ArticleDraftEntity) -> Unit) : ListAdapter(context) { +class ArticleDraftAdapter(context: Context, + private val deleteCallback: (ArticleDraftEntity) -> Unit, + private val selectCallback: (ArticleDraftEntity) -> Unit) : ListAdapter(context) { override fun areItemsTheSame(oldItem: ArticleDraftEntity, newItem: ArticleDraftEntity): Boolean { return !TextUtils.isEmpty(oldItem.id) && oldItem.id == newItem.id 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 9287b791fc..583f08421d 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 @@ -436,7 +436,27 @@ abstract class BaseCommentAdapter(context: Context, //TODO:问题评论更多操作 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, { + }) + } + "置顶" -> { + DialogUtils.showNewAlertDialog(binding.root.context, "提示", "是否将此条评论置顶?", "取消", "确认", null, Gravity.CENTER, false, {}, { + + }) + } + "取消置顶" -> { + DialogUtils.showNewAlertDialog(binding.root.context, "提示", "是否将此条评论取消置顶?", "取消", "确认", null, Gravity.CENTER, false, {}, { + + }) + } + } + } + }) } private fun showVideoCommentOptions(view: View, binding: ItemArticleDetailCommentBinding, comment: CommentEntity, viewModel: BaseCommentViewModel, deleteCallBack: ((comment: CommentEntity) -> Unit)?) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/draft/CommunityDraftWrapperActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/draft/CommunityDraftWrapperActivity.kt index 2d2cde3ad3..74272d938f 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/draft/CommunityDraftWrapperActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/draft/CommunityDraftWrapperActivity.kt @@ -6,8 +6,8 @@ import android.os.Bundle import androidx.fragment.app.Fragment import com.gh.base.BaseActivity_TabLayout import com.gh.gamecenter.qa.article.draft.ArticleDraftFragment -import com.gh.gamecenter.qa.answer.draft.AnswerDraftFragment import com.gh.gamecenter.qa.questions.draft.QuestionDraftFragment +import com.gh.gamecenter.video.videomanager.VideoDraftFragment class CommunityDraftWrapperActivity : BaseActivity_TabLayout() { @@ -19,13 +19,13 @@ class CommunityDraftWrapperActivity : BaseActivity_TabLayout() { override fun initFragmentList(fragments: MutableList) { fragments.add(ArticleDraftFragment()) fragments.add(QuestionDraftFragment()) - fragments.add(AnswerDraftFragment()) + fragments.add(VideoDraftFragment()) } override fun initTabTitleList(tabTitleList: MutableList) { tabTitleList.add("帖子草稿") tabTitleList.add("问题草稿") - tabTitleList.add("回答草稿") + tabTitleList.add("视频草稿") } companion object { 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 0d9c460fd4..1c0000092e 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 @@ -41,6 +41,7 @@ data class QuestionsDetailEntity( var tagActivityName: String = "", var type: String = "", var gameEntity: GameEntity? = null, + var time:TimeEntity = TimeEntity(), //提交问题用 @SerializedName("draft_id") var draftId: String = "" diff --git a/app/src/main/java/com/gh/gamecenter/qa/myqa/MyAnswerAdapter.java b/app/src/main/java/com/gh/gamecenter/qa/myqa/MyAnswerAdapter.java index 53ec5d94c0..201871bbb7 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/myqa/MyAnswerAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/qa/myqa/MyAnswerAdapter.java @@ -17,6 +17,7 @@ import com.gh.gamecenter.qa.answer.MyAnswerViewHolder; import com.gh.gamecenter.qa.answer.detail.AnswerDetailActivity; import com.gh.gamecenter.qa.entity.AnswerEntity; import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity; +import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity; import org.jetbrains.annotations.Nullable; @@ -67,13 +68,22 @@ class MyAnswerAdapter extends ListAdapter implements ISyncAdapterH answerViewHolder.bindItem(entity, mEntrance); CommunityMyAnswerItemBinding binding = answerViewHolder.getBinding(); binding.imageContainer.bindData(entity, mEntrance, ""); - binding.title.setOnClickListener(v -> - mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, - entity.getQuestions().getId(), mEntrance, "我的光环-我的问答-我的回答"))); +// binding.title.setOnClickListener(v -> +// mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, +// entity.getQuestions().getId(), mEntrance, "我的光环-我的问答-我的回答"))); +// +// holder.itemView.setOnClickListener(v -> +// mContext.startActivity(AnswerDetailActivity.getIntent(mContext, +// entity.getId(), mEntrance, "我的光环-我的问答-我的回答"))); - holder.itemView.setOnClickListener(v -> - mContext.startActivity(AnswerDetailActivity.getIntent(mContext, - entity.getId(), mEntrance, "我的光环-我的问答-我的回答"))); + binding.title.setOnClickListener(v -> { + mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, + entity.getQuestions().getId(), mEntrance, "我的光环-我的问答-我的回答")); + }); + holder.itemView.setOnClickListener(v -> { + mContext.startActivity(NewQuestionDetailActivity.getCommentIntent(mContext, + entity.getQuestions().getId(), entity.getId(), mEntrance, "我的光环-我的问答-我的回答")); + }); break; case ItemViewType.ITEM_FOOTER: diff --git a/app/src/main/java/com/gh/gamecenter/qa/myqa/MyAskWrapperFragment.java b/app/src/main/java/com/gh/gamecenter/qa/myqa/MyAskWrapperFragment.java index 800b729c1e..eb99b2f3ed 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/myqa/MyAskWrapperFragment.java +++ b/app/src/main/java/com/gh/gamecenter/qa/myqa/MyAskWrapperFragment.java @@ -27,16 +27,16 @@ public class MyAskWrapperFragment extends BaseFragment_TabLayout { String entrance = null; if (getArguments() != null) entrance = getArguments().getString(EntranceUtils.KEY_ENTRANCE); - fragments.add(ConcernQuestionsFragment.getInstance(entrance)); - fragments.add(MyQuestionsFragment.getInstance(entrance)); +// fragments.add(ConcernQuestionsFragment.getInstance(entrance)); +// fragments.add(MyQuestionsFragment.getInstance(entrance)); fragments.add(MyAnswerFragment.getInstance(entrance)); fragments.add(MyArticleFragment.getInstance(entrance, UserManager.getInstance().getUserId())); } @Override protected void initTabTitleList(List tabTitleList) { - tabTitleList.add("关注问题"); - tabTitleList.add("我的问题"); +// tabTitleList.add("关注问题"); +// tabTitleList.add("我的问题"); tabTitleList.add("我的回答"); tabTitleList.add("我的帖子"); } diff --git a/app/src/main/java/com/gh/gamecenter/qa/myqa/MyQuestionsAdapter.java b/app/src/main/java/com/gh/gamecenter/qa/myqa/MyQuestionsAdapter.java index 6784514e52..fa468007de 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/myqa/MyQuestionsAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/qa/myqa/MyQuestionsAdapter.java @@ -17,6 +17,7 @@ import com.gh.gamecenter.databinding.CommunityQuestionItemBinding; import com.gh.gamecenter.qa.entity.Questions; import com.gh.gamecenter.qa.questions.CommunityQuestionViewHolder; import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity; +import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity; import kotlin.Pair; @@ -62,7 +63,7 @@ public class MyQuestionsAdapter extends ListAdapter implements ISyncA case ItemViewType.ITEM_BODY: Questions questions = mEntityList.get(position); ((CommunityQuestionViewHolder) holder).bindMyQuestionViewHolder(questions,mEntrance,"我的光环-我的问答-我的问题"); - holder.itemView.setOnClickListener(v -> mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, questions.getId(), mEntrance, "我的光环-我的问答-我的问题"))); + holder.itemView.setOnClickListener(v -> mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, questions.getId(), mEntrance, "我的光环-我的问答-我的问题"))); break; case ItemViewType.ITEM_FOOTER: FooterViewHolder footerViewHolder = (FooterViewHolder) holder; diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailActivity.kt index 6efd274d98..6099ca64a3 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailActivity.kt @@ -57,5 +57,16 @@ class NewQuestionDetailActivity : NormalActivity() { intent.putExtra(EntranceUtils.KEY_PATH, path) return intent } + + @JvmStatic + fun getCommentIntent(context: Context, questionId: String, answerId: String, entrance: String, path: String): Intent { + val intent = Intent(context, NewQuestionDetailActivity::class.java) + intent.putExtra(EntranceUtils.KEY_ENTRANCE, mergeEntranceAndPath(entrance, path)) + intent.putExtra(EntranceUtils.KEY_QUESTIONS_ID, questionId) + intent.putExtra(EntranceUtils.KEY_ANSWER_ID, answerId) + intent.putExtra(EntranceUtils.KEY_SCROLL_TO_COMMENT_AREA, true) + intent.putExtra(EntranceUtils.KEY_PATH, path) + return intent + } } } \ 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 aa9cbf7470..62fba38097 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 @@ -106,13 +106,18 @@ class NewQuestionDetailFragment : BaseCommentFragment() var questionPageFinishedLiveData = MutableLiveData() val moderatorsHideLiveData = MutableLiveData() + val favoriteLiveData = MutableLiveData() val mFollowLiveData = MutableLiveData() var questionDetail: QuestionsDetailEntity? = null val followLiveData = mFollowLiveData @@ -136,6 +140,28 @@ class NewQuestionDetailViewModel(application: Application, questionId: String = }) } + @SuppressLint("CheckResult") + fun postFavoriteQuestion() { + if (questionDetail == null) return + val single = if (questionDetail?.me?.isQuestionFavorite == true) { + mApi.deleteFavoriteQuestion(UserManager.getInstance().userId, questionId) + } else { + 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) + } + }) + } + class Factory(private val application: Application, private val questionId: String = "", private val communityId: String = "") : ViewModelProvider.NewInstanceFactory() { 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 6b0107c931..38f2433120 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 @@ -83,12 +83,11 @@ class QuestionDetailContentViewHolder(var binding: ItemArticleDetailContentBindi if (richEditor.currentContent != question.description) { richEditor.setHtml(question.description, true) } - -// if (question.time.create == question.time.edit) { -// 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)) -// } + if (question.time.create == question.time.edit) { + 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)) + } richEditor.visibility = View.VISIBLE question.community.game?.let { gameName.text = question.community.name diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishActivity.kt index 29716d98d9..078bc921bc 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishActivity.kt @@ -10,6 +10,7 @@ import com.gh.gamecenter.NormalActivity import com.gh.gamecenter.R import com.gh.gamecenter.entity.CommunityEntity import com.gh.gamecenter.entity.ForumVideoEntity +import com.gh.gamecenter.entity.VideoDraftEntity import com.gh.gamecenter.qa.BbsType class VideoPublishActivity : NormalActivity() { @@ -40,6 +41,15 @@ class VideoPublishActivity : NormalActivity() { bundle.putString(EntranceUtils.KEY_PATH, path) return getTargetIntent(context, VideoPublishActivity::class.java, VideoPublishFragment::class.java, bundle) } + + @JvmStatic + fun getDraftIntent(context: Context, draftEntity: VideoDraftEntity, entrance: String, path: String): Intent { + val bundle = Bundle() + bundle.putParcelable(VideoDraftEntity::class.java.simpleName, draftEntity) + bundle.putString(EntranceUtils.KEY_ENTRANCE, ToolBarActivity.mergeEntranceAndPath(entrance, path)) + bundle.putString(EntranceUtils.KEY_PATH, path) + return getTargetIntent(context, VideoPublishActivity::class.java, VideoPublishFragment::class.java, bundle) + } } } \ No newline at end of file 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 23d3701c0e..52803ae1f1 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 @@ -124,11 +124,16 @@ class VideoPublishFragment : NormalFragment() { private fun initData() { val videoPatch = mViewModel.videoPatch + val videoDraft = mViewModel.videoDraft when { videoPatch != null -> { setNavigationTitle("编辑视频") setVideoPatch(videoPatch) } + videoDraft != null -> { + setNavigationTitle("发视频") + setVideoDraft() + } else -> { setNavigationTitle("发视频") PermissionHelper.checkStoragePermissionBeforeAction(requireActivity(), object : EmptyCallback { @@ -213,6 +218,7 @@ class VideoPublishFragment : NormalFragment() { } } } + private fun setVideoPatch(videoPatch: ForumVideoEntity) { mMenuDraft.isVisible = false mType = videoPatch.type 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 bd2b6e99f0..d94bc9b3dc 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 @@ -3033,4 +3033,16 @@ public interface ApiService { */ @GET("bbses/videos/{video_id}/recommends") Observable> getRecommendVideo(@Path("video_id") String videoId, @Query("page") int page); + + /** + * 添加问题收藏 + */ + @POST("users/{user_id}/favorites/questions/{question_id}") + Single favoriteQuestion(@Path("user_id") String userId, @Path("question_id") String questionId); + + /** + * 取消问题收藏 + */ + @DELETE("users/{user_id}/favorites/questions/{question_id}") + Single deleteFavoriteQuestion(@Path("user_id") String userId, @Path("question_id") String questionId); } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/video/videomanager/VideoDraftAdapter.kt b/app/src/main/java/com/gh/gamecenter/video/videomanager/VideoDraftAdapter.kt index a3e5b014e2..9908a07cfa 100644 --- a/app/src/main/java/com/gh/gamecenter/video/videomanager/VideoDraftAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/video/videomanager/VideoDraftAdapter.kt @@ -1,14 +1,11 @@ package com.gh.gamecenter.video.videomanager -import android.app.Activity import android.content.Context -import android.content.Intent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.LinearLayout import android.widget.TextView -import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.gh.base.BaseRecyclerViewHolder @@ -18,17 +15,13 @@ import com.gh.common.view.BugFixedPopupWindow import com.gh.gamecenter.R import com.gh.gamecenter.adapter.viewholder.FooterViewHolder import com.gh.gamecenter.baselist.ListAdapter -import com.gh.gamecenter.databinding.CommunityArticleDraftItemBinding import com.gh.gamecenter.databinding.CommunityVideoDraftItemBinding -import com.gh.gamecenter.databinding.VideoVerifyItemBinding import com.gh.gamecenter.entity.VideoDraftEntity -import com.gh.gamecenter.qa.article.draft.ArticleDraftViewHolder -import com.gh.gamecenter.video.VideoVerifyItemViewHolder -import com.gh.gamecenter.video.upload.view.UploadVideoActivity class VideoDraftAdapter(context: Context, private val mViewModel: VideoDraftViewModel, - private val mEntrance: String) : ListAdapter(context) { + private val mEntrance: String, + private val selectCallback: (VideoDraftEntity) -> Unit) : ListAdapter(context) { private val mPath = "草稿箱" @@ -83,10 +76,7 @@ class VideoDraftAdapter(context: Context, PermissionHelper.checkStoragePermissionBeforeAction(mContext, object : EmptyCallback { override fun onCallback() { - val intent = Intent() - intent.putExtra(VideoDraftEntity::class.java.simpleName, draftEntity) - (mContext as AppCompatActivity).setResult(Activity.RESULT_OK, intent) - (mContext as AppCompatActivity).finish() + selectCallback.invoke(draftEntity) } }) } diff --git a/app/src/main/java/com/gh/gamecenter/video/videomanager/VideoDraftFragment.kt b/app/src/main/java/com/gh/gamecenter/video/videomanager/VideoDraftFragment.kt index dadf705486..4b47adce31 100644 --- a/app/src/main/java/com/gh/gamecenter/video/videomanager/VideoDraftFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/video/videomanager/VideoDraftFragment.kt @@ -1,8 +1,10 @@ package com.gh.gamecenter.video.videomanager +import android.app.Activity import android.content.Intent import android.os.Bundle import android.view.View +import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView @@ -13,6 +15,8 @@ import com.gh.common.view.GridSpacingItemDecoration import com.gh.gamecenter.R import com.gh.gamecenter.baselist.ListFragment import com.gh.gamecenter.entity.VideoDraftEntity +import com.gh.gamecenter.qa.draft.CommunityDraftWrapperActivity +import com.gh.gamecenter.qa.video.publish.VideoPublishActivity import com.gh.gamecenter.video.upload.view.UploadVideoActivity class VideoDraftFragment : ListFragment() { @@ -36,7 +40,16 @@ class VideoDraftFragment : ListFragment() override fun provideListAdapter(): VideoDraftAdapter { if (mAdapter == null) { - mAdapter = VideoDraftAdapter(requireContext(), mListViewModel, mEntrance) + mAdapter = VideoDraftAdapter(requireContext(), mListViewModel, mEntrance) { + if (requireActivity() is CommunityDraftWrapperActivity) { + startActivity(VideoPublishActivity.getDraftIntent(requireContext(), it, mEntrance, "视频草稿")) + } else { + val intent = Intent() + intent.putExtra(VideoDraftEntity::class.java.simpleName, it) + requireActivity().setResult(Activity.RESULT_OK, intent) + requireActivity().finish() + } + } } return mAdapter!! } From 22cadc77f0cf4f76cd71a304d5ac90916faba1c4 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Thu, 3 Jun 2021 11:28:09 +0800 Subject: [PATCH 28/61] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9"=E7=A4=BE=E5=8C=BA-?= =?UTF-8?q?=E6=8E=A8=E8=8D=90Tab=E6=9C=80=E8=BF=91=E6=B5=8F=E8=A7=88?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E9=A6=96=E4=B8=AAItem=E6=9C=AA=E8=AF=BB?= =?UTF-8?q?=E7=BA=A2=E7=82=B9=E5=B7=B2=E8=AF=BB=E4=BD=86=E6=9C=AA=E6=B6=88?= =?UTF-8?q?=E5=A4=B1"=E9=97=AE=E9=A2=98=202.=E4=BF=AE=E6=94=B9=E9=A6=96?= =?UTF-8?q?=E9=A1=B5=E5=BA=95=E9=83=A8=E5=AF=BC=E8=88=AA=E6=A0=8F=E5=8A=A8?= =?UTF-8?q?=E7=94=BB=E4=B8=8D=E5=AF=B9=E5=BA=94=E9=97=AE=E9=A2=98=203.?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BA=E5=9D=9B=E8=AF=A6=E6=83=85=E9=A1=B5?= =?UTF-8?q?=E5=85=B3=E6=B3=A8=E6=8C=89=E9=92=AE=E6=98=BE=E7=A4=BA=E4=B8=8D?= =?UTF-8?q?=E5=85=A8=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/gamecenter/forum/home/ForumArticleListFragment.kt | 8 +++++++- .../com/gh/gamecenter/fragment/MainWrapperFragment.java | 2 +- app/src/main/res/layout/fragment_forum_detail.xml | 2 -- 3 files changed, 8 insertions(+), 4 deletions(-) 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 9ce8dfc92d..7d3a3d2112 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 @@ -155,7 +155,13 @@ class ForumArticleListFragment : LazyListFragment Date: Thu, 3 Jun 2021 11:27:44 +0800 Subject: [PATCH 29/61] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=AE=80=E5=8D=95?= =?UTF-8?q?=E7=9A=84=20Log=20=E5=B7=A5=E5=85=B7=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/json/JsonBuilder.kt | 32 ++++++++++++++++++ .../java/com/gh/common/util/NewLogUtils.kt | 33 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 app/src/main/java/com/gh/common/json/JsonBuilder.kt create mode 100644 app/src/main/java/com/gh/common/util/NewLogUtils.kt diff --git a/app/src/main/java/com/gh/common/json/JsonBuilder.kt b/app/src/main/java/com/gh/common/json/JsonBuilder.kt new file mode 100644 index 0000000000..dabce29095 --- /dev/null +++ b/app/src/main/java/com/gh/common/json/JsonBuilder.kt @@ -0,0 +1,32 @@ +package com.gh.common.json + +import org.json.JSONArray +import org.json.JSONObject +import java.util.* + +//Source: https://stackoverflow.com/questions/41861449/kotlin-dsl-for-creating-json-objects-without-creating-garbage + +fun json(build: JsonObjectBuilder.() -> Unit): JSONObject { + return JsonObjectBuilder().json(build) +} + +class JsonObjectBuilder { + private val deque: Deque = ArrayDeque() + + fun json(build: JsonObjectBuilder.() -> Unit): JSONObject { + deque.push(JSONObject()) + this.build() + return deque.pop() + } + + infix fun String.to(value: T) { + // wrap value into json block if it is a lambda + val wrapped = when (value) { + is Function0<*> -> json { value.invoke() } + is Array<*> -> JSONArray().apply { value.forEach { put(it) } } + else -> value + } + + deque.peek().put(this, wrapped) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/common/util/NewLogUtils.kt b/app/src/main/java/com/gh/common/util/NewLogUtils.kt new file mode 100644 index 0000000000..2338bf2d5a --- /dev/null +++ b/app/src/main/java/com/gh/common/util/NewLogUtils.kt @@ -0,0 +1,33 @@ +package com.gh.common.util + +import com.gh.common.json.json +import com.gh.common.loghub.LoghubUtils +import com.gh.gamecenter.entity.LinkEntity +import com.lightgame.utils.Utils +import org.json.JSONObject + +object NewLogUtils { + + // 专题右上角的点击事件 + fun logSubjectTopTabClick(buttonName: String?, subjectName: String?, linkEntity: LinkEntity?) { + val json = json { + "event" to "column_list_click_button" + "button_type" to buttonName + "column_name" to subjectName + "meta" to LogUtils.getMetaObject() + if (linkEntity != null) { + "link_type" to linkEntity.type + "link_title" to linkEntity.text + } + "timestamp" to System.currentTimeMillis() / 1000 + } + + log(json, "event", false) + } + + private fun log(jsonObject: JSONObject, logStore: String, uploadImmediately: Boolean) { + Utils.log("NewLogUtils", jsonObject.toString(4)) + LoghubUtils.log(jsonObject, logStore, uploadImmediately) + } + +} \ No newline at end of file From 58ea0bb51db3a5d64f36df6feffb35ee80c2507d Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Fri, 4 Jun 2021 14:25:17 +0800 Subject: [PATCH 30/61] =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=AE=BA=E5=9D=9B?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=B5=81=E8=A7=86=E9=A2=91=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../forum/home/ArticleItemVideoView.kt | 211 +++++++++++------- .../home/ForumArticleAskItemViewHolder.kt | 69 +++++- .../personalhome/home/UserHistoryAdapter.kt | 63 +++++- .../ic_article_video_replay.png | Bin 2085 -> 0 bytes .../ic_article_video_share.png | Bin 2456 -> 0 bytes .../res/layout/layout_article_item_video.xml | 67 ++++-- .../layout/piece_article_video_control.xml | 35 ++- 7 files changed, 324 insertions(+), 121 deletions(-) delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_article_video_replay.png delete mode 100644 app/src/main/res/drawable-xxxhdpi/ic_article_video_share.png diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt index 6daedbc515..e0c5a0b8b8 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt @@ -1,16 +1,14 @@ package com.gh.gamecenter.forum.home import android.app.Activity -import android.app.Application import android.content.Context -import android.os.Bundle -import android.os.Handler import android.util.AttributeSet import android.view.Surface import android.view.View import android.widget.ImageView -import android.widget.LinearLayout +import android.widget.SeekBar import android.widget.TextView +import androidx.core.content.ContextCompat import com.facebook.drawee.view.SimpleDraweeView import com.gh.common.constant.Constants import com.gh.common.util.* @@ -18,6 +16,7 @@ import com.gh.gamecenter.R import com.gh.gamecenter.entity.ForumVideoEntity import com.gh.gamecenter.video.detail.CustomManager import com.lightgame.utils.Utils +import com.shuyu.gsyvideoplayer.utils.CommonUtil import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer import com.shuyu.gsyvideoplayer.video.base.GSYVideoView import com.shuyu.gsyvideoplayer.video.base.GSYVideoViewBridge @@ -26,41 +25,40 @@ import java.util.* class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : StandardGSYVideoPlayer(context, attrs) { -// private var mMuteCallback: MuteCallback -// private var mVolumeObserver: VolumeObserver private var mVideoEntity: ForumVideoEntity? = null private var mMuteDisposable: Disposable? = null + private var mIsAutoPlay = false var uuid = UUID.randomUUID().toString() var thumbImage: SimpleDraweeView = findViewById(R.id.thumbImage) var durationTv: TextView = findViewById(R.id.durationTv) - var completeContainer: LinearLayout = findViewById(R.id.completeContainer) - var replayIv: ImageView = findViewById(R.id.replayIv) + var completeContainer: View = findViewById(R.id.completeContainer) var replayTv: TextView = findViewById(R.id.replayTv) - var shareIv: ImageView = findViewById(R.id.shareIv) var shareTv: TextView = findViewById(R.id.shareTv) var volume: ImageView = findViewById(R.id.volume) + var remainingTv: TextView = findViewById(R.id.remainingTv) + var back: ImageView = findViewById(R.id.back) override fun getLayoutId(): Int { return R.layout.layout_article_item_video } init { + SPUtils.setBoolean(getMuteKey(), SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true)) + post { volume.setOnClickListener { toggleMute() } } -// mMuteCallback = object : MuteCallback { -// override fun onMute(isMute: Boolean) { -// if (isMute) { -// mute() -// } else { -// unMute() -// } -// } -// } -// -// mVolumeObserver = VolumeObserver(context, Handler(), mMuteCallback) + if (mIfCurrentIsFullscreen) { + showBackBtn() + } else { + hideBackBtn() + } + + setBackFromFullScreenListener { + clearFullscreenLayout() + } } override fun getGSYVideoManager(): GSYVideoViewBridge { @@ -68,15 +66,17 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At return CustomManager.getCustomManager(getKey()) } - override fun startPlayLogic() { - super.startPlayLogic() - val topVideoVoiceStatus = SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true) - if (topVideoVoiceStatus) { - violenceUpdateMuteStatus() - } + fun startPlayLogic(isAutoPlay: Boolean) { + mIsAutoPlay = isAutoPlay + startPlayLogic() } - private fun violenceUpdateMuteStatus() { + override fun prepareVideo() { + super.prepareVideo() + violenceUpdateMuteStatus() + } + + fun violenceUpdateMuteStatus() { if (mMuteDisposable != null) { mMuteDisposable?.dispose() mMuteDisposable = null @@ -86,13 +86,13 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At mMuteDisposable?.dispose() mMuteDisposable = null } - mute() + updateMuteStatus() } } // 不需要弹弹窗,直接播放 override fun showWifiDialog() { - startPlayLogic() + startPlayLogic(false) //val trafficVideo = PreferenceManager.getDefaultSharedPreferences(context).getBoolean(SettingsFragment.TRAFFIC_VIDEO_SP_KEY, false) //if (trafficVideo) { // 不延迟的话 isCacheFile 可能直接返回 false @@ -138,9 +138,57 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At super.onSurfaceUpdated(surface) if (mThumbImageViewLayout != null && mThumbImageViewLayout.visibility == View.VISIBLE) { mThumbImageViewLayout.visibility = View.INVISIBLE + uploadVideoStreamingPlaying("开始播放") } } + //监控播放错误 +// override fun onError(what: Int, extra: Int) { +// super.onError(what, extra) +// Utils.toast(context, "网络错误,视频播放失败") +// setViewShowState(mStartButton, View.INVISIBLE) +//// errorContainer.visibility = View.VISIBLE +// } + + override fun releaseVideos() { + uploadVideoStreamingPlaying("结束播放") + CustomManager.releaseAllVideos(getKey()) + } + + override fun onVideoPause() { + super.onVideoPause() + uploadVideoStreamingPlaying("暂停播放") + } + + // 重载以减少横竖屏切换的时间 + override fun checkoutState() { + removeCallbacks(mCheckoutTask) + postDelayed(mCheckoutTask, 300) + } + + override fun clearFullscreenLayout() { + super.clearFullscreenLayout() + updateMuteStatus() + hideBackBtn() + } + + override fun setProgressAndTime(progress: Int, secProgress: Int, currentTime: Int, totalTime: Int, forceChange: Boolean) { + super.setProgressAndTime(progress, secProgress, currentTime, totalTime, forceChange) + if (remainingTv.visibility == View.VISIBLE) { + remainingTv.text = CommonUtil.stringForTime(totalTime - currentTime) + } + } + + private fun showBackBtn() { + mTopContainer.background = ContextCompat.getDrawable(context, R.drawable.video_title_bg) + back.visibility = View.VISIBLE + } + + private fun hideBackBtn() { + mTopContainer?.setBackgroundResource(0) + back.visibility = View.GONE + } + fun updateThumb(url: String) { ImageUtils.display(thumbImage, url) } @@ -180,18 +228,6 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At super.setStateAndUi(state) if (currentState == GSYVideoView.CURRENT_STATE_PREPAREING) { setViewShowState(durationTv, View.GONE) - replayIv.setOnClickListener { - startButton.performClick() -// violenceUpdateMuteStatus() -// uploadVideoStreamingPlaying("重新播放") - } - replayTv.setOnClickListener { replayIv.performClick() } - shareIv.setOnClickListener { - share() - } - shareTv.setOnClickListener { - shareIv.performClick() - } } // if (currentState == GSYVideoView.CURRENT_STATE_PLAYING) { @@ -201,6 +237,15 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At if (currentState == GSYVideoView.CURRENT_STATE_AUTO_COMPLETE) { hideAllWidget() setViewShowState(completeContainer, View.VISIBLE) + mTopContainer.visibility = View.VISIBLE + replayTv.setOnClickListener { + startButton.performClick() + violenceUpdateMuteStatus() + uploadVideoStreamingPlaying("重新播放") + } + shareTv.setOnClickListener { + share() + } } else { setViewShowState(completeContainer, View.GONE) } @@ -208,18 +253,24 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At override fun changeUiToPlayingShow() { super.changeUiToPlayingShow() - setViewShowState(mBottomProgressBar, View.VISIBLE) + if (!mIfCurrentIsFullscreen) setViewShowState(mBottomProgressBar, View.VISIBLE) + } + + override fun changeUiToPlayingClear() { + super.changeUiToPlayingClear() + if (mIfCurrentIsFullscreen) setViewShowState(mBottomProgressBar, View.GONE) } private fun toggleMute() { if (mVideoEntity?.videoIsMuted == true) { - unMute() + unMute(true) } else { - mute() + mute(true) } } fun updateMuteStatus() { + mVideoEntity?.videoIsMuted = SPUtils.getBoolean(getMuteKey(), true) if (mVideoEntity?.videoIsMuted == true) { mute() } else { @@ -227,16 +278,35 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At } } - private fun mute() { + private fun mute(isManual: Boolean = false) { mVideoEntity?.videoIsMuted = true + SPUtils.setBoolean(getMuteKey(), true) volume.setImageResource(R.drawable.ic_article_video_volume_off) CustomManager.getCustomManager(getKey()).isNeedMute = true + if (isManual) { +// Utils.toast(context, "当前处于静音状态") + uploadVideoStreamingPlaying("点击静音") + } } - private fun unMute() { + private fun unMute(isManual: Boolean = false) { mVideoEntity?.videoIsMuted = false + SPUtils.setBoolean(getMuteKey(), false) volume.setImageResource(R.drawable.ic_article_video_volume_on) CustomManager.getCustomManager(getKey()).isNeedMute = false + if (isManual) { + uploadVideoStreamingPlaying("取消静音") + } + } + + override fun onAutoCompletion() { + super.onAutoCompletion() + uploadVideoStreamingPlaying("播放完毕") + } + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + super.onStopTrackingTouch(seekBar) + uploadVideoStreamingPlaying("拖动") } private fun share() { @@ -259,47 +329,30 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At } override fun onCancel() { -// uploadVideoStreamingPlaying("取消分享") + uploadVideoStreamingPlaying("取消分享") } }) } } + fun uploadVideoStreamingPlaying(action: String) { -// fun observeVolume(activity: AppCompatActivity) { -// activity.contentResolver?.registerContentObserver( -// android.provider.Settings.System.CONTENT_URI, true, mVolumeObserver) -// -// activity.application?.registerActivityLifecycleCallbacks( -// object : Application.ActivityLifecycleCallbacks { -// override fun onActivityPaused(a: Activity) { -// if (activity == a) { -// activity.contentResolver?.unregisterContentObserver(mVolumeObserver) -// activity.application?.unregisterActivityLifecycleCallbacks(this) -// } -// } -// -// override fun onActivityStarted(activity: Activity) { -// } -// -// override fun onActivityDestroyed(activity: Activity) { -// } -// -// override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) { -// } -// -// override fun onActivityStopped(activity: Activity) { -// } -// -// override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { -// } -// -// override fun onActivityResumed(activity: Activity) { -// } -// }) -// } + } + + fun setFullViewStatus() { + mProgressBar.visibility = View.VISIBLE + mCurrentTimeTextView.visibility = View.VISIBLE + mTotalTimeTextView.visibility = View.VISIBLE + mBottomProgressBar.visibility = View.GONE + remainingTv.visibility = View.GONE + durationTv.visibility = View.GONE + } fun getKey(): String { return uuid } + + fun getMuteKey(): String { + return Constants.SP_VIDEO_PLAY_MUTE + uuid + } } \ 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 9b5b7932f7..0e6e9a6209 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 @@ -1,15 +1,16 @@ package com.gh.gamecenter.forum.home +import android.app.Activity import android.text.SpannableStringBuilder import android.view.View -import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import com.gh.base.BaseActivity import com.gh.common.util.* 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.forum.detail.ForumDetailActivity import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.qa.answer.BaseAnswerOrArticleItemViewHolder @@ -22,6 +23,8 @@ import com.gh.gamecenter.qa.questions.invite.QuestionsInviteActivity import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity 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 class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : BaseAnswerOrArticleItemViewHolder(binding.root) { @@ -66,7 +69,7 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B binding.imageContainer.bindData(entity, entrance, path) if (entity.type == "video") { - bindVideoData(entity) + bindVideoData(entity.transformForumVideoEntity()) } else { bindArticleVideoData(entity) } @@ -105,7 +108,7 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B binding.executePendingBindings() } - private fun bindVideoData(entity: AnswerEntity) { + private fun bindVideoData(entity: ForumVideoEntity) { binding.run { if (entity.url.isEmpty()) { horizontalVideoView.visibility = View.GONE @@ -122,6 +125,8 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B horizontalVideoView } + val orientationUtils = OrientationUtils(itemView.context as Activity, visibleView) + orientationUtils.isEnable = false GSYVideoOptionBuilder() .setIsTouchWiget(false) .setUrl(entity.url) @@ -131,14 +136,35 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B .setReleaseWhenLossAudio(true) .setLooping(false) .setShowFullAnimation(false) - .setEnlargeImageRes(R.drawable.ic_article_video_full_screen) + .setEnlargeImageRes(R.drawable.ic_game_detail_enter_full_screen) + .setShrinkImageRes(R.drawable.ic_game_detail_exit_full_screen) + .setVideoAllCallBack(object : GSYSampleCallBack() { + override fun onQuitFullscreen(url: String?, vararg objects: Any) { + orientationUtils.backToProtVideo() + visibleView.uploadVideoStreamingPlaying("退出全屏") + } + }) .build(visibleView) visibleView.run { - updateVideoData(entity.transformForumVideoEntity()) + updateVideoData(entity) updateThumb(entity.poster) updateDurationTv(TimeUtils.formatDuration(entity.length)) - updateMuteStatus() -// observeVolume(itemView.context as AppCompatActivity) + + fullscreenButton.setOnClickListener { + val horizontalVideoView = startWindowFullscreen(itemView.context, true, true) as? ArticleItemVideoView + if (horizontalVideoView == null) { + toastInInternalRelease("全屏失败,请向技术人员提供具体的操作步骤") + return@setOnClickListener + } + orientationUtils.resolveByClick() + horizontalVideoView.uuid = uuid + horizontalVideoView.updateVideoData(entity) + horizontalVideoView.updateThumb(entity.poster) + horizontalVideoView.violenceUpdateMuteStatus() + horizontalVideoView.setFullViewStatus() + uploadVideoStreamingPlaying("开始播放") + uploadVideoStreamingPlaying("点击全屏") + } } } } @@ -161,6 +187,8 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B horizontalVideoView } + val orientationUtils = OrientationUtils(itemView.context as Activity, visibleView) + orientationUtils.isEnable = false GSYVideoOptionBuilder() .setIsTouchWiget(false) .setUrl(video.url) @@ -170,14 +198,35 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B .setReleaseWhenLossAudio(true) .setLooping(false) .setShowFullAnimation(false) - .setEnlargeImageRes(R.drawable.ic_article_video_full_screen) + .setEnlargeImageRes(R.drawable.ic_game_detail_enter_full_screen) + .setShrinkImageRes(R.drawable.ic_game_detail_exit_full_screen) + .setVideoAllCallBack(object : GSYSampleCallBack() { + override fun onQuitFullscreen(url: String?, vararg objects: Any) { + orientationUtils.backToProtVideo() + visibleView.uploadVideoStreamingPlaying("退出全屏") + } + }) .build(visibleView) visibleView.run { updateVideoData(entity.transformForumVideoEntity()) updateThumb(video.poster) updateDurationTv(video.duration) - updateMuteStatus() -// observeVolume(itemView.context as AppCompatActivity) + + fullscreenButton.setOnClickListener { + val horizontalVideoView = startWindowFullscreen(itemView.context, true, true) as? ArticleItemVideoView + if (horizontalVideoView == null) { + toastInInternalRelease("全屏失败,请向技术人员提供具体的操作步骤") + return@setOnClickListener + } + orientationUtils.resolveByClick() + horizontalVideoView.uuid = uuid + horizontalVideoView.updateVideoData(entity.transformForumVideoEntity()) + horizontalVideoView.updateThumb(video.poster) + horizontalVideoView.violenceUpdateMuteStatus() + horizontalVideoView.setFullViewStatus() + uploadVideoStreamingPlaying("开始播放") + uploadVideoStreamingPlaying("点击全屏") + } } } } 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 bea561c4af..d7bb13e082 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 @@ -1,11 +1,11 @@ package com.gh.gamecenter.personalhome.home +import android.app.Activity import android.content.Context import android.text.SpannableStringBuilder import android.util.SparseBooleanArray import android.view.View import android.view.ViewGroup -import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.RecyclerView import com.gh.common.constant.ItemViewType import com.gh.common.util.* @@ -18,10 +18,13 @@ import com.gh.gamecenter.databinding.PersonalHomeRatingBinding import com.gh.gamecenter.databinding.UserHistoryItemBinding import com.gh.gamecenter.entity.ForumVideoEntity import com.gh.gamecenter.entity.PersonalHistoryEntity +import com.gh.gamecenter.forum.home.ArticleItemVideoView import com.gh.gamecenter.gamedetail.rating.edit.RatingEditActivity import com.gh.gamecenter.personalhome.PersonalItemViewHolder import com.gh.gamecenter.qa.entity.AnswerEntity import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder +import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack +import com.shuyu.gsyvideoplayer.utils.OrientationUtils import java.util.regex.Pattern class UserHistoryAdapter(context: Context, @@ -146,6 +149,8 @@ class UserHistoryAdapter(context: Context, horizontalVideoView } + val orientationUtils = OrientationUtils(mContext as Activity, visibleView) + orientationUtils.isEnable = false GSYVideoOptionBuilder() .setIsTouchWiget(false) .setUrl(entity.url) @@ -155,14 +160,35 @@ class UserHistoryAdapter(context: Context, .setReleaseWhenLossAudio(true) .setLooping(false) .setShowFullAnimation(false) - .setEnlargeImageRes(R.drawable.ic_article_video_full_screen) + .setEnlargeImageRes(R.drawable.ic_game_detail_enter_full_screen) + .setShrinkImageRes(R.drawable.ic_game_detail_exit_full_screen) + .setVideoAllCallBack(object : GSYSampleCallBack() { + override fun onQuitFullscreen(url: String?, vararg objects: Any) { + orientationUtils.backToProtVideo() + visibleView.uploadVideoStreamingPlaying("退出全屏") + } + }) .build(visibleView) visibleView.run { updateVideoData(entity) updateThumb(entity.poster) updateDurationTv(TimeUtils.formatDuration(entity.length)) - updateMuteStatus() -// observeVolume(mContext as AppCompatActivity) + + fullscreenButton.setOnClickListener { + val horizontalVideoView = startWindowFullscreen(mContext, true, true) as? ArticleItemVideoView + if (horizontalVideoView == null) { + toastInInternalRelease("全屏失败,请向技术人员提供具体的操作步骤") + return@setOnClickListener + } + orientationUtils.resolveByClick() + horizontalVideoView.uuid = uuid + horizontalVideoView.updateVideoData(entity) + horizontalVideoView.updateThumb(entity.poster) + horizontalVideoView.violenceUpdateMuteStatus() + horizontalVideoView.setFullViewStatus() + uploadVideoStreamingPlaying("开始播放") + uploadVideoStreamingPlaying("点击全屏") + } } } } @@ -185,6 +211,8 @@ class UserHistoryAdapter(context: Context, horizontalVideoView } + val orientationUtils = OrientationUtils(mContext as Activity, visibleView) + orientationUtils.isEnable = false GSYVideoOptionBuilder() .setIsTouchWiget(false) .setUrl(video.url) @@ -194,14 +222,35 @@ class UserHistoryAdapter(context: Context, .setReleaseWhenLossAudio(true) .setLooping(false) .setShowFullAnimation(false) - .setEnlargeImageRes(R.drawable.ic_article_video_full_screen) + .setEnlargeImageRes(R.drawable.ic_game_detail_enter_full_screen) + .setShrinkImageRes(R.drawable.ic_game_detail_exit_full_screen) + .setVideoAllCallBack(object : GSYSampleCallBack() { + override fun onQuitFullscreen(url: String?, vararg objects: Any) { + orientationUtils.backToProtVideo() + visibleView.uploadVideoStreamingPlaying("退出全屏") + } + }) .build(visibleView) visibleView.run { updateVideoData(entity.transformForumVideoEntity()) updateThumb(video.poster) updateDurationTv(video.duration) - updateMuteStatus() -// observeVolume(mContext as AppCompatActivity) + + fullscreenButton.setOnClickListener { + val horizontalVideoView = startWindowFullscreen(mContext, true, true) as? ArticleItemVideoView + if (horizontalVideoView == null) { + toastInInternalRelease("全屏失败,请向技术人员提供具体的操作步骤") + return@setOnClickListener + } + orientationUtils.resolveByClick() + horizontalVideoView.uuid = uuid + horizontalVideoView.updateVideoData(entity.transformForumVideoEntity()) + horizontalVideoView.updateThumb(video.poster) + horizontalVideoView.violenceUpdateMuteStatus() + horizontalVideoView.setFullViewStatus() + uploadVideoStreamingPlaying("开始播放") + uploadVideoStreamingPlaying("点击全屏") + } } } } diff --git a/app/src/main/res/drawable-xxxhdpi/ic_article_video_replay.png b/app/src/main/res/drawable-xxxhdpi/ic_article_video_replay.png deleted file mode 100644 index 7500720b48122b1f2f2175290ddfcc2ca36c4070..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2085 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 W{lGVw&j6?Z0000 + - - - - - + android:textSize="14sp" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintLeft_toLeftOf="parent" + app:layout_constraintRight_toLeftOf="@+id/shareTv" /> + android:textSize="14sp" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintLeft_toRightOf="@+id/replayTv" /> + + + + + + + diff --git a/app/src/main/res/layout/piece_article_video_control.xml b/app/src/main/res/layout/piece_article_video_control.xml index a608e268a1..ec681d783d 100644 --- a/app/src/main/res/layout/piece_article_video_control.xml +++ b/app/src/main/res/layout/piece_article_video_control.xml @@ -22,12 +22,13 @@ android:id="@+id/fullscreen" android:layout_width="32dp" android:layout_height="32dp" - android:src="@drawable/ic_article_video_volume_off" + android:padding="10dp" + android:src="@drawable/ic_game_detail_enter_full_screen" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintRight_toRightOf="parent" /> + + From a107a19d953ae4bcef5fc03a6b3db4ed51231dc8 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Fri, 4 Jun 2021 15:43:53 +0800 Subject: [PATCH 31/61] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=A4=BE=E5=8C=BA-?= =?UTF-8?q?=E8=AE=BA=E5=9D=9BTab-=E5=AE=98=E6=96=B9=E8=AE=BA=E5=9D=9B?= =?UTF-8?q?=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/gamecenter/entity/ForumEntity.kt | 1 + .../gh/gamecenter/forum/home/ForumFragment.kt | 20 ++++++++- .../gamecenter/forum/home/ForumViewModel.kt | 24 ++++++++++ .../gamecenter/forum/list/ForumListAdapter.kt | 6 ++- .../forum/list/ForumListVIewModel.kt | 1 + .../retrofit/service/ApiService.java | 7 +++ .../com/gh/gamecenter/room/AppDatabase.java | 2 +- app/src/main/res/layout/fragment_forum.xml | 1 + .../main/res/layout/official_forum_item.xml | 45 +++++++++++++++++++ 9 files changed, 103 insertions(+), 4 deletions(-) create mode 100644 app/src/main/res/layout/official_forum_item.xml diff --git a/app/src/main/java/com/gh/gamecenter/entity/ForumEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/ForumEntity.kt index dbde7d82c7..e19b513735 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/ForumEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/ForumEntity.kt @@ -11,6 +11,7 @@ data class ForumEntity( var id: String = "", var game: SimpleGame = SimpleGame(), var name: String = "", + var icon: String = "", @SerializedName("is_follow") var isFollow: Boolean = 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 bf9816582b..2961b72fb0 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 @@ -6,6 +6,7 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.gh.base.fragment.LazyFragment +import com.gh.common.util.observeNonNull import com.gh.common.util.viewModelProvider import com.gh.common.view.GridSpacingItemColorDecoration import com.gh.gamecenter.R @@ -56,7 +57,7 @@ class ForumFragment: LazyFragment() { reuseNoConnection.root.visibility = View.VISIBLE reuseNoConnection.root.setOnClickListener { reuseLoading.root.visibility = View.VISIBLE - mViewModel?.getFollowForum() + mViewModel?.getData() } } } @@ -81,13 +82,17 @@ class ForumFragment: LazyFragment() { reuseNoConnection.root.visibility = View.VISIBLE reuseNoConnection.root.setOnClickListener { reuseLoading.root.visibility = View.VISIBLE - mViewModel?.getHotForum() + mViewModel?.getData() } } } } }) + mViewModel?.officialForums?.observeNonNull(viewLifecycleOwner) { + if (it.isNotEmpty()) initOfficialForums(it) + } + initWelfare() } @@ -136,6 +141,17 @@ class ForumFragment: LazyFragment() { } } + private fun initOfficialForums(list: List) { + mBinding?.run { + officialForumContainer.visibility = View.VISIBLE + officialMore.setOnClickListener { startActivity(ForumListActivity.getIntent(requireContext(), ForumListActivity.TYPE_OFFICIAL)) } + officialForumRv.layoutManager = GridLayoutManager(requireContext(), 2) + val newList = if (list.size > 6) list.subList(0, 6) else list + officialForumRv.adapter = OfficialForumAdapter(requireContext(), "社区-论坛-热门论坛", newList) + officialForumRv.addItemDecoration(GridSpacingItemColorDecoration(requireContext(), 0, 16, R.color.transparent)) + } + } + private fun initWelfare() { val welfareLists = arrayListOf>() welfareLists.run { 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 67820f1f09..ca2198944c 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 @@ -22,15 +22,21 @@ class ForumViewModel(application: Application) : AndroidViewModel(application) { private val api = RetrofitManager.getInstance(getApplication()).api val followForumsLiveData = MediatorLiveData>() val hotForums = MediatorLiveData>() + val officialForums = MediatorLiveData>() var followForums = arrayListOf() var followStatusForums = arrayListOf() init { + getData() + } + + fun getData() { if (CheckLoginUtils.isLogin()) { getFollowForum() } else { getHotForum() } + getOfficialForum() } @SuppressLint("CheckResult") @@ -112,6 +118,24 @@ class ForumViewModel(application: Application) : AndroidViewModel(application) { }) } + @SuppressLint("CheckResult") + fun getOfficialForum() { + api.getOfficialForum(1) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response>() { + override fun onResponse(response: List?) { + super.onResponse(response) + officialForums.postValue(response) + } + + override fun onFailure(e: HttpException?) { + super.onFailure(e) + officialForums.postValue(null) + } + }) + } + @SuppressLint("CheckResult") fun followForum(bbsId: String, onSuccess: () -> Unit) { RetrofitManager.getInstance(getApplication()).api diff --git a/app/src/main/java/com/gh/gamecenter/forum/list/ForumListAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/list/ForumListAdapter.kt index 51cff29fcf..784ba74a5f 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/list/ForumListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/list/ForumListAdapter.kt @@ -51,7 +51,11 @@ class ForumListAdapter(context: Context, entity = forumEntity executePendingBindings() - forumIcon.displayGameIcon(forumEntity.game.getIcon(), forumEntity.game.iconSubscript) + if (mViewModel?.type == ForumListActivity.TYPE_OFFICIAL) { + forumIcon.displayGameIcon(forumEntity.icon, "") + } else { + forumIcon.displayGameIcon(forumEntity.game.getIcon(), forumEntity.game.iconSubscript) + } topLine.visibility = if (position == 0) View.GONE else View.VISIBLE if (mViewModel?.type == ForumListActivity.TYPE_FOLLOW) { diff --git a/app/src/main/java/com/gh/gamecenter/forum/list/ForumListVIewModel.kt b/app/src/main/java/com/gh/gamecenter/forum/list/ForumListVIewModel.kt index fd223c036e..fce7c1e799 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/list/ForumListVIewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/list/ForumListVIewModel.kt @@ -26,6 +26,7 @@ class ForumListViewModel(application: Application): ListViewModel mApi.getFollowsForum(UserManager.getInstance().userId) ForumListActivity.TYPE_HOT -> mApi.getHotForumWithPage(page) + ForumListActivity.TYPE_OFFICIAL -> mApi.getOfficialForum(page) else -> mApi.getHotForumWithPage(page) } } 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 29e9233684..e939fa43dc 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 @@ -21,6 +21,7 @@ import com.gh.gamecenter.entity.ConcernEntity; import com.gh.gamecenter.entity.DeviceDialogEntity; import com.gh.gamecenter.entity.EnergyTaskCompleteEntity; import com.gh.gamecenter.entity.FollowersOrFansEntity; +import com.gh.gamecenter.entity.ForumActivityEntity; import com.gh.gamecenter.entity.ForumCategoryEntity; import com.gh.gamecenter.entity.ForumDetailEntity; import com.gh.gamecenter.entity.ForumEntity; @@ -2634,6 +2635,12 @@ public interface ApiService { @GET("./bbses:hot") Observable> getHotForumWithPage(@Query("page") int page); + /** + * 官方论坛列表 + */ + @GET("./bbses:official") + Observable> getOfficialForum(@Query("page") int page); + /** * 获取论坛分类 */ diff --git a/app/src/main/java/com/gh/gamecenter/room/AppDatabase.java b/app/src/main/java/com/gh/gamecenter/room/AppDatabase.java index 34c8a0df5b..2d04962e82 100644 --- a/app/src/main/java/com/gh/gamecenter/room/AppDatabase.java +++ b/app/src/main/java/com/gh/gamecenter/room/AppDatabase.java @@ -197,7 +197,7 @@ public abstract class AppDatabase extends RoomDatabase { static final Migration MIGRATION_18_19 = new Migration(18, 19) { @Override public void migrate(@NonNull SupportSQLiteDatabase database) { - database.execSQL("CREATE TABLE ForumEntity (id TEXT NOT NULL PRIMARY KEY, game TEXT NOT NULL, name TEXT NOT NULL, isFollow INTEGER NOT NULL DEFAULT 0, isRecommend INTEGER NOT NULL DEFAULT 0, orderTag INTEGER NOT NULL DEFAULT 0, unread INTEGER NOT NULL DEFAULT 0)"); + database.execSQL("CREATE TABLE ForumEntity (id TEXT NOT NULL PRIMARY KEY, game TEXT NOT NULL, name TEXT NOT NULL, icon TEXT, isFollow INTEGER NOT NULL DEFAULT 0, isRecommend INTEGER NOT NULL DEFAULT 0, orderTag INTEGER NOT NULL DEFAULT 0, unread INTEGER NOT NULL DEFAULT 0)"); } }; diff --git a/app/src/main/res/layout/fragment_forum.xml b/app/src/main/res/layout/fragment_forum.xml index 56308c37a8..f7cfe4667c 100644 --- a/app/src/main/res/layout/fragment_forum.xml +++ b/app/src/main/res/layout/fragment_forum.xml @@ -142,6 +142,7 @@ android:id="@+id/officialForumRv" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="16dp" android:overScrollMode="never" android:nestedScrollingEnabled="false" app:layout_constraintTop_toBottomOf="@+id/officialTitle" diff --git a/app/src/main/res/layout/official_forum_item.xml b/app/src/main/res/layout/official_forum_item.xml new file mode 100644 index 0000000000..3197d15b83 --- /dev/null +++ b/app/src/main/res/layout/official_forum_item.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + \ No newline at end of file From 1dbabe3cda963048bf00f30a1f323914284f0f3c Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Fri, 4 Jun 2021 16:19:07 +0800 Subject: [PATCH 32/61] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E6=BC=8F=E4=BC=A0?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../forum/home/OfficialForumAdapter.kt | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 app/src/main/java/com/gh/gamecenter/forum/home/OfficialForumAdapter.kt diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/OfficialForumAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/home/OfficialForumAdapter.kt new file mode 100644 index 0000000000..e48ea70c16 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/forum/home/OfficialForumAdapter.kt @@ -0,0 +1,46 @@ +package com.gh.gamecenter.forum.home + +import android.content.Context +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import com.gh.base.BaseRecyclerViewHolder +import com.gh.common.util.CheckLoginUtils +import com.gh.common.util.DataCollectionUtils +import com.gh.common.util.MtaHelper +import com.gh.common.util.ifLogin +import com.gh.gamecenter.* +import com.gh.gamecenter.databinding.ForumWelfareItemBinding +import com.gh.gamecenter.databinding.HotForumItemBinding +import com.gh.gamecenter.databinding.OfficialForumItemBinding +import com.gh.gamecenter.entity.ForumEntity +import com.gh.gamecenter.forum.detail.ForumDetailActivity +import com.gh.gamecenter.manager.UserManager +import com.lightgame.adapter.BaseRecyclerAdapter + +class OfficialForumAdapter(context: Context, + private val entrance: String, + private var mList: List) + : BaseRecyclerAdapter(context) { + + + override fun getItemCount() = mList.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) + = OfficialForumViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.official_forum_item, parent, false)) + + + override fun onBindViewHolder(holder: OfficialForumViewHolder, position: Int) { + holder.binding.run { + + val forumEntity = mList[position] + entity = forumEntity + executePendingBindings() + + root.setOnClickListener { + mContext.startActivity(ForumDetailActivity.getIntent(mContext, forumEntity.id, entrance)) + } + } + } + + class OfficialForumViewHolder(val binding: OfficialForumItemBinding) : BaseRecyclerViewHolder(binding.root) +} \ No newline at end of file From 0faf4087623ddd7d9e7b646cec596c9a57628d2d Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Fri, 4 Jun 2021 17:44:49 +0800 Subject: [PATCH 33/61] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=B0=E7=A4=BE?= =?UTF-8?q?=E5=8C=BA=E7=9B=B8=E5=85=B3=E6=95=B0=E6=8D=AE=E5=BA=93=E8=BF=81?= =?UTF-8?q?=E7=A7=BB=E6=8A=A5=E9=94=99=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/history/HistoryDatabase.kt | 20 +++++++++---------- .../retrofit/service/ApiService.java | 1 - .../com/gh/gamecenter/room/AppDatabase.java | 11 ++++++++-- 3 files changed, 19 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/gh/common/history/HistoryDatabase.kt b/app/src/main/java/com/gh/common/history/HistoryDatabase.kt index 68f72f2e74..e6e5683771 100644 --- a/app/src/main/java/com/gh/common/history/HistoryDatabase.kt +++ b/app/src/main/java/com/gh/common/history/HistoryDatabase.kt @@ -82,16 +82,16 @@ abstract class HistoryDatabase : RoomDatabase() { val MIGRATION_8_9: Migration = object : Migration(8, 9) { override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("Alter TABLE ArticleEntity add des TEXT DEFAULT ''") - database.execSQL("Alter TABLE ArticleEntity add url TEXT DEFAULT ''") - database.execSQL("Alter TABLE ArticleEntity add videoInfo TEXT DEFAULT ''") - database.execSQL("Alter TABLE ArticleEntity add poster TEXT DEFAULT ''") - database.execSQL("Alter TABLE ArticleEntity add length INTEGER DEFAULT 0") - database.execSQL("Alter TABLE AnswerEntity add des TEXT DEFAULT ''") - database.execSQL("Alter TABLE AnswerEntity add url TEXT DEFAULT ''") - database.execSQL("Alter TABLE AnswerEntity add videoInfo TEXT DEFAULT ''") - database.execSQL("Alter TABLE AnswerEntity add poster TEXT DEFAULT ''") - database.execSQL("Alter TABLE AnswerEntity add length INTEGER DEFAULT 0") + database.execSQL("Alter TABLE ArticleEntity add des TEXT NOT NULL DEFAULT ''") + database.execSQL("Alter TABLE ArticleEntity add url TEXT NOT NULL DEFAULT ''") + database.execSQL("Alter TABLE ArticleEntity add videoInfo TEXT NOT NULL DEFAULT ''") + database.execSQL("Alter TABLE ArticleEntity add poster TEXT NOT NULL DEFAULT ''") + database.execSQL("Alter TABLE ArticleEntity add length INTEGER NOT NULL DEFAULT 0") + database.execSQL("Alter TABLE AnswerEntity add des TEXT NOT NULL DEFAULT ''") + database.execSQL("Alter TABLE AnswerEntity add url TEXT NOT NULL DEFAULT ''") + database.execSQL("Alter TABLE AnswerEntity add videoInfo TEXT NOT NULL DEFAULT ''") + database.execSQL("Alter TABLE AnswerEntity add poster TEXT NOT NULL DEFAULT ''") + database.execSQL("Alter TABLE AnswerEntity add length INTEGER NOT NULL DEFAULT 0") } } 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 e939fa43dc..525dacc857 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 @@ -21,7 +21,6 @@ import com.gh.gamecenter.entity.ConcernEntity; import com.gh.gamecenter.entity.DeviceDialogEntity; import com.gh.gamecenter.entity.EnergyTaskCompleteEntity; import com.gh.gamecenter.entity.FollowersOrFansEntity; -import com.gh.gamecenter.entity.ForumActivityEntity; import com.gh.gamecenter.entity.ForumCategoryEntity; import com.gh.gamecenter.entity.ForumDetailEntity; import com.gh.gamecenter.entity.ForumEntity; diff --git a/app/src/main/java/com/gh/gamecenter/room/AppDatabase.java b/app/src/main/java/com/gh/gamecenter/room/AppDatabase.java index 2d04962e82..1a9f35e779 100644 --- a/app/src/main/java/com/gh/gamecenter/room/AppDatabase.java +++ b/app/src/main/java/com/gh/gamecenter/room/AppDatabase.java @@ -23,6 +23,7 @@ import com.gh.gamecenter.room.converter.SimpleGameConverter; import com.gh.gamecenter.room.converter.SimulatorConverter; import com.gh.gamecenter.room.converter.StringArrayListConverter; import com.gh.gamecenter.room.converter.TagStyleListConverter; +import com.gh.gamecenter.room.converter.VideoInfoConverter; import com.gh.gamecenter.room.dao.AnswerDao; import com.gh.gamecenter.room.dao.CommentDraftDao; import com.gh.gamecenter.room.dao.ForumDao; @@ -49,7 +50,8 @@ import com.gh.gamecenter.video.upload.UploadEntity; TagStyleListConverter.class, SimulatorConverter.class, ApkArrayListConverter.class, - SimpleGameConverter.class + SimpleGameConverter.class, + VideoInfoConverter.class }) public abstract class AppDatabase extends RoomDatabase { @@ -197,7 +199,12 @@ public abstract class AppDatabase extends RoomDatabase { static final Migration MIGRATION_18_19 = new Migration(18, 19) { @Override public void migrate(@NonNull SupportSQLiteDatabase database) { - database.execSQL("CREATE TABLE ForumEntity (id TEXT NOT NULL PRIMARY KEY, game TEXT NOT NULL, name TEXT NOT NULL, icon TEXT, isFollow INTEGER NOT NULL DEFAULT 0, isRecommend INTEGER NOT NULL DEFAULT 0, orderTag INTEGER NOT NULL DEFAULT 0, unread INTEGER NOT NULL DEFAULT 0)"); + database.execSQL("CREATE TABLE ForumEntity (id TEXT NOT NULL PRIMARY KEY, game TEXT NOT NULL, name TEXT NOT NULL, icon TEXT NOT NULL, isFollow INTEGER NOT NULL, isRecommend INTEGER NOT NULL, orderTag INTEGER NOT NULL, unread INTEGER NOT NULL)"); + database.execSQL("Alter TABLE AnswerEntity add des TEXT NOT NULL DEFAULT ''"); + database.execSQL("Alter TABLE AnswerEntity add url TEXT NOT NULL DEFAULT ''"); + database.execSQL("Alter TABLE AnswerEntity add videoInfo TEXT NOT NULL DEFAULT ''"); + database.execSQL("Alter TABLE AnswerEntity add poster TEXT NOT NULL DEFAULT ''"); + database.execSQL("Alter TABLE AnswerEntity add length INTEGER NOT NULL DEFAULT 0"); } }; From 898bf3e432440d8f68881ba15cf24e2f6ba8e156 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Sat, 5 Jun 2021 10:27:49 +0800 Subject: [PATCH 34/61] =?UTF-8?q?=E7=B2=97=E7=95=A5=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E6=96=B0=E9=97=AE=E9=A2=98=E8=AF=A6=E6=83=85=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/CommentHelper.kt | 23 ++++-- .../java/com/gh/common/util/CommentUtils.java | 5 +- .../com/gh/common/util/EntranceUtils.java | 1 + .../com/gh/common/util/PostCommentUtils.java | 25 ++++++ .../home/ForumArticleAskItemViewHolder.kt | 10 +-- .../article/detail/ArticleDetailViewModel.kt | 4 +- .../gamecenter/qa/comment/CommentActivity.kt | 8 +- .../qa/comment/NewCommentAdapter.kt | 2 +- .../qa/comment/NewCommentViewModel.kt | 5 +- .../qa/comment/base/BaseCommentAdapter.kt | 19 +++-- .../qa/comment/base/BaseCommentViewModel.kt | 79 ++++++++++--------- .../CommentConversationFragment.kt | 10 +++ .../CommentConversationViewModel.kt | 24 +++--- .../newdetail/NewQuestionDetailAdapter.kt | 1 + .../newdetail/NewQuestionDetailFragment.kt | 52 +++++++++++- .../newdetail/NewQuestionDetailViewModel.kt | 11 ++- .../QuestionDetailContentViewHolder.kt | 24 ++---- .../qa/video/detail/ForumTopVideoView.kt | 4 +- .../detail/comment/VideoCommentAdapter.kt | 15 ++++ .../detail/comment/VideoCommentFragment.kt | 31 +++++++- .../detail/comment/VideoCommentViewModel.kt | 2 +- .../retrofit/service/ApiService.java | 65 ++++++++++++++- .../item_article_detail_comment_empty.xml | 44 +++++------ 23 files changed, 328 insertions(+), 136 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 f44a986ece..2340757580 100644 --- a/app/src/main/java/com/gh/common/util/CommentHelper.kt +++ b/app/src/main/java/com/gh/common/util/CommentHelper.kt @@ -99,7 +99,7 @@ object CommentHelper { listener: OnCommentOptionClickListener? = null) { val context = view.context val dialogOptions = ArrayList() - if (isShowTop && articleId != null && commentEntity.me?.isArticleOrAnswerAuthor == true) { + if (isShowTop && (articleId != null || questionId != null) && commentEntity.me?.isArticleOrAnswerAuthor == true) { dialogOptions.add(if (commentEntity.isTop) "取消置顶" else "置顶") } @@ -109,7 +109,7 @@ object CommentHelper { } if (isVideoAuthor || (videoId != null && commentEntity.user.id == UserManager.getInstance().userId)) { dialogOptions.add("删除评论") - } else if (articleId != null && (commentEntity.user.id == UserManager.getInstance().userId || + } else if ((articleId != null || questionId != null) && (commentEntity.user.id == UserManager.getInstance().userId || commentEntity.me?.isModerator == true || commentEntity.me?.isArticleOrAnswerAuthor == true)) { dialogOptions.add("删除评论") } @@ -168,12 +168,19 @@ object CommentHelper { } } - if (answerId != null) { - PostCommentUtils.postAnswerReportData(context, commentEntity.id, answerId, reportType, commentListener) - } else if (articleId != null) { - PostCommentUtils.reportCommunityArticleComment(context, communityId, articleId, commentEntity.id, reportType, commentListener) - } else { - PostCommentUtils.reportVideoComment(context, videoId, commentEntity.id, reportType, commentListener) + when { + answerId != null -> { + PostCommentUtils.postAnswerReportData(context, commentEntity.id, answerId, reportType, commentListener) + } + articleId != null -> { + PostCommentUtils.reportCommunityArticleComment(context, communityId, articleId, commentEntity.id, reportType, commentListener) + } + questionId != null -> { + PostCommentUtils.reportQuestionComment(context, questionId, commentEntity.id, reportType, commentListener) + } + else -> { + PostCommentUtils.reportVideoComment(context, videoId, commentEntity.id, reportType, commentListener) + } } } } diff --git a/app/src/main/java/com/gh/common/util/CommentUtils.java b/app/src/main/java/com/gh/common/util/CommentUtils.java index 5471cfe04b..57e84b47ac 100644 --- a/app/src/main/java/com/gh/common/util/CommentUtils.java +++ b/app/src/main/java/com/gh/common/util/CommentUtils.java @@ -271,6 +271,7 @@ public class CommentUtils { String articleId, String articleCommunityId, String videoId, + String questionId, final CommentEntity commentEntity, final TextView commentLikeCountTv, final ImageView commentLikeIv, @@ -294,7 +295,7 @@ public class CommentUtils { commentLikeCountTv.setText(NumberUtils.transSimpleCount(commentEntity.getVote())); commentLikeCountTv.setVisibility(View.VISIBLE); - PostCommentUtils.likeComment(context, answerId, articleId, articleCommunityId, videoId, commentEntity.getId(), + PostCommentUtils.likeComment(context, answerId, articleId, articleCommunityId, videoId, questionId, commentEntity.getId(), new PostCommentUtils.PostCommentListener() { @Override public void postSuccess(JSONObject response) { @@ -348,7 +349,7 @@ public class CommentUtils { String entrance = "视频流-评论-点赞"; CheckLoginUtils.checkLogin(context, entrance, () -> { - PostCommentUtils.likeComment(context, answerId, articleId, articleCommunityId, videoId, commentEntity.getId(), + PostCommentUtils.likeComment(context, answerId, articleId, articleCommunityId, videoId, "", commentEntity.getId(), new PostCommentUtils.PostCommentListener() { @Override public void postSuccess(JSONObject response) { 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 9bf22f5e60..bf6cada522 100644 --- a/app/src/main/java/com/gh/common/util/EntranceUtils.java +++ b/app/src/main/java/com/gh/common/util/EntranceUtils.java @@ -239,6 +239,7 @@ public class EntranceUtils { public static final String KEY_CHOOSE_FORUM_TYPE = "choose_forum_type"; public static final String KEY_CHOOSE_MAX_COUNT = "choose_max_count"; public static final String KEY_COMMENT_COUNT = "comment_count"; + public static final String KEY_IS_COMMENT_CONVERSATION = "is_comment_conversation"; public static void jumpActivity(Context context, Bundle bundle) { bundle.putBoolean(KEY_REQUIRE_REDIRECT, true); diff --git a/app/src/main/java/com/gh/common/util/PostCommentUtils.java b/app/src/main/java/com/gh/common/util/PostCommentUtils.java index 63e6a96544..dec59ec097 100644 --- a/app/src/main/java/com/gh/common/util/PostCommentUtils.java +++ b/app/src/main/java/com/gh/common/util/PostCommentUtils.java @@ -117,6 +117,7 @@ public class PostCommentUtils { String articleId, String articleCommunityId, String videoId, + String questionId, final String commentId, final PostCommentListener listener) { @@ -126,6 +127,8 @@ public class PostCommentUtils { observable = RetrofitManager.getInstance(context).getApi().postVoteAnswerComment(answerId, commentId); } else if (!TextUtils.isEmpty(articleId)) { observable = RetrofitManager.getInstance(context).getApi().postVoteCommunityArticleComment(articleCommunityId, articleId, commentId); + } else if (!TextUtils.isEmpty(questionId)) { + observable = RetrofitManager.getInstance(context).getApi().postVoteQuestionComment(questionId, commentId); } else { observable = RetrofitManager.getInstance(context).getApi().postVoteToVideo(videoId, commentId); } @@ -258,6 +261,28 @@ public class PostCommentUtils { } }); } + public static void reportQuestionComment(final Context context, + final String questionId, + final String commentId, + final String reportData, + final PostCommentListener listener) { + RequestBody body = RequestBody.create(MediaType.parse("application/json"), reportData); + RetrofitManager.getInstance(context).getApi() + .postQuestionCommentReport(questionId, commentId, body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { + @Override + public void onResponse(ResponseBody response) { + listener.postSuccess(null); + } + + @Override + public void onFailure(HttpException e) { + listener.postFailed(e); + } + }); + } public interface PostCommentListener { void postSuccess(JSONObject response); 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 9b5b7932f7..c4c865b8f6 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 @@ -214,15 +214,13 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B itemView.context.startActivity(intent) MtaHelper.onEvent(getEventId(entrance), getKey(entrance), "评论图标") } else if (entity.type == "video") { - itemView.context.startActivity(ForumVideoDetailActivity.getIntent(itemView.context, entity.id ?: "")) + itemView.context.startActivity(ForumVideoDetailActivity.getIntent(itemView.context, entity.id + ?: "")) } else { - val intent = if (entity.questions.answerCount > 0) { - NewQuestionDetailActivity.getIntent(it.context, entity.questions.id, entrance, "") - } else { + if (entity.questions.answerCount == 0) { MtaHelper.onEvent(getEventId(entrance), getKey(entrance), "我来回答") - AnswerEditActivity.getIntent(it.context, entity.questions, entity.communityName) } - itemView.context.startActivity(intent) + itemView.context.startActivity(NewQuestionDetailActivity.getCommentIntent(it.context, entity.questions.id, entrance, "")) } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailViewModel.kt index a470bc599c..7779e7c779 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailViewModel.kt @@ -33,8 +33,6 @@ class ArticleDetailViewModel(application: Application, communityId: String = "") : BaseCommentViewModel(application, articleId = articleId, communityId = communityId, videoId = "", questionId = "") { - private val mApi = RetrofitManager.getInstance(getApplication()).api - var detailEntity: ArticleDetailEntity? = null val mFollowLiveData = MutableLiveData() @@ -292,7 +290,7 @@ class ArticleDetailViewModel(application: Application, }) } - override fun hideCommunityArticleCommentSuccess() { + override fun hideCommentSuccess() { detailEntity?.count?.comment = (detailEntity?.count?.comment ?: 0) - 1 loadResultLiveData.postValue(LoadResult.SUCCESS) } 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 fdb56fe5df..d7c6b34b0a 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 @@ -30,6 +30,7 @@ class CommentActivity : BaseActivity() { DisplayUtils.transparentStatusBar(this) val commentCount = intent.getIntExtra(COMMENT_COUNT, 0) val showKeyboard = intent.getBooleanExtra(SHOW_KEYBOARD, false) + val isCommentConversation = intent.getBooleanExtra(EntranceUtils.KEY_IS_COMMENT_CONVERSATION, false) val answerId = intent.getStringExtra(ANSWER_ID) ?: "" val articleId = intent.getStringExtra(ARTICLE_ID) ?: "" @@ -62,6 +63,9 @@ class CommentActivity : BaseActivity() { } } else { commentFragment = when { + isCommentConversation && commentId.isNotEmpty() -> { + CommentConversationFragment().with(intent.extras) + } answerId.isNotEmpty() -> { NewCommentFragment.getAnswerCommentInstance( answerId, @@ -92,9 +96,6 @@ class CommentActivity : BaseActivity() { commentEntity, commentCallback) } - commentId.isNotEmpty() -> { - CommentConversationFragment().with(intent.extras) - } else -> { NewCommentFragment.getVideoCommentInstance( videoId, @@ -240,6 +241,7 @@ class CommentActivity : BaseActivity() { intent.putExtra(EntranceUtils.KEY_COMMENT_ID, commentId) intent.putExtra(EntranceUtils.KEY_SHOW_KEYBOARD_IF_NEEDED, showKeyboard) intent.putExtra(EntranceUtils.KEY_PATH, path) + intent.putExtra(EntranceUtils.KEY_IS_COMMENT_CONVERSATION, true) return intent } 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 ec6b8994b3..e0a6637d38 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 @@ -116,7 +116,7 @@ class NewCommentAdapter(context: Context, holder.commentLikeContainer.setOnClickListener { CommentUtils.likeComment(mContext, mViewModel.answerId, mViewModel.articleId, - mViewModel.communityId, mViewModel.videoId, commentEntity, holder.commentLikeCountTv, holder.commentLikeIv, null) + mViewModel.communityId, mViewModel.videoId, mViewModel.questionId, commentEntity, holder.commentLikeCountTv, holder.commentLikeIv, null) } holder.itemView.setOnClickListener { diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentViewModel.kt index 9c0f14868f..5a9f0565f5 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentViewModel.kt @@ -97,10 +97,9 @@ open class NewCommentViewModel(application: Application, CommentType.COMMUNITY_QUESTION, CommentType.COMMUNITY_QUESTION_CONVERSATION -> { if (commentEntity == null) { - api.postQuestionAnswer(body, questionId) + api.postQuestionComment(questionId, body) } else { - //TODO:问题评论回复接口 - api.postQuestionAnswer(body, questionId) + api.postReplyToQuestionComment(questionId, commentEntity.id, body) } } 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 583f08421d..4802776fc5 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 @@ -434,24 +434,30 @@ abstract class BaseCommentAdapter(context: Context, } } - //TODO:问题评论更多操作 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, {}, { - + 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) + } + } }) } } @@ -466,7 +472,7 @@ abstract class BaseCommentAdapter(context: Context, when (option) { "删除评论" -> { DialogUtils.showNewAlertDialog(binding.moreIv.context, "提示", "删除评论后,评论下所有的回复都将被删除", "取消", "删除", null, { - viewModel.deleteVideoComment(comment) { + viewModel.deleteComment(comment) { deleteCallBack?.invoke(comment) } }) @@ -490,8 +496,7 @@ abstract class BaseCommentAdapter(context: Context, when (option) { "删除评论" -> { DialogUtils.showNewAlertDialog(binding.moreIv.context, "提示", "删除评论后,评论下所有的回复都将被删除", "取消", "删除", null, { - viewModel.hideCommunityArticleComment(comment.id - ?: "") { + viewModel.deleteComment(comment) { deleteCallBack?.invoke(comment) } }) 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 050d917800..dd17a30144 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 @@ -6,10 +6,7 @@ import androidx.lifecycle.MutableLiveData import com.gh.common.syncpage.SyncDataEntity import com.gh.common.syncpage.SyncFieldConstants import com.gh.common.syncpage.SyncPageRepository -import com.gh.common.util.CommentDraftContainer -import com.gh.common.util.ErrorHelper -import com.gh.common.util.PostCommentUtils -import com.gh.common.util.ToastUtils +import com.gh.common.util.* import com.gh.gamecenter.baselist.ListViewModel import com.gh.gamecenter.baselist.LoadParams import com.gh.gamecenter.baselist.LoadStatus @@ -18,9 +15,9 @@ import com.gh.gamecenter.entity.CommentDraft import com.gh.gamecenter.entity.CommentEntity import com.gh.gamecenter.entity.MeEntity import com.gh.gamecenter.qa.article.detail.CommentItemData -import com.gh.gamecenter.retrofit.BiResponse import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager +import com.gh.gamecenter.retrofit.service.ApiService import com.lightgame.utils.Utils import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers @@ -30,7 +27,7 @@ import retrofit2.HttpException 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 val loadResultLiveData = MutableLiveData() @@ -133,7 +130,7 @@ abstract class BaseCommentViewModel(application: Application, var articleId: Str } fun like(comment: CommentEntity) { - PostCommentUtils.likeComment(getApplication(), null, articleId, communityId, videoId, comment.id, + PostCommentUtils.likeComment(getApplication(), null, articleId, communityId, videoId, questionId, comment.id, object : PostCommentUtils.PostCommentListener { override fun postSuccess(response: JSONObject?) { updateLike(comment.id ?: "", true) @@ -196,14 +193,24 @@ abstract class BaseCommentViewModel(application: Application, var articleId: Str } } - fun hideCommunityArticleComment(commentId: String, callback: () -> Unit) { - RetrofitManager.getInstance(getApplication()).api - .hideCommunityArticleComment(communityId, articleId, commentId) - .observeOn(AndroidSchedulers.mainThread()) - .subscribeOn(Schedulers.io()) + @SuppressLint("CheckResult") + fun deleteComment(entity: CommentEntity, callback: () -> Unit) { + val observable = when { + videoId.isNotEmpty() -> { + mApi.deleteVideoComment(videoId, entity.id).toObservable() + } + questionId.isNotEmpty() -> { + mApi.deleteQuestionComment(questionId, entity.id).toObservable() + } + articleId.isNotEmpty() -> { + mApi.hideCommunityArticleComment(communityId, articleId, entity.id) + } + else -> null + } ?: return + observable.compose(observableToMain()) .subscribe(object : Response() { override fun onResponse(response: ResponseBody?) { - hideCommunityArticleCommentSuccess() + hideCommentSuccess() callback.invoke() } @@ -211,7 +218,7 @@ abstract class BaseCommentViewModel(application: Application, var articleId: Str super.onFailure(e) e?.let { httpException -> if (httpException.code() == 403) { - val string = e.response().errorBody()?.string() + val string = e.response().errorBody()?.string() ?: "" val errorJson = JSONObject(string) val errorCode = errorJson.getInt("code") if (errorCode == 403059) { @@ -226,34 +233,33 @@ abstract class BaseCommentViewModel(application: Application, var articleId: Str }) } - @SuppressLint("CheckResult") - fun deleteVideoComment(entity: CommentEntity, callback: () -> Unit) { - RetrofitManager.getInstance(getApplication()).api - .deleteVideoComment(videoId, entity.id) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : BiResponse() { - override fun onSuccess(data: ResponseBody) { - callback.invoke() - } - - override fun onFailure(exception: Exception) { - super.onFailure(exception) - ToastUtils.showToast("删除失败") - } - }) - } - 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) { map["again"] = isAgain } - RetrofitManager.getInstance(getApplication()).api.commentTop(communityId, articleId, commentId, map) + when { + articleId.isNotEmpty() -> { + mApi.postArticleCommentTop(communityId, articleId, commentId, map) + } + questionId.isNotEmpty() -> { + mApi.postQuestionCommentTop(questionId, commentId, map) + } + else -> null + } } else { - RetrofitManager.getInstance(getApplication()).api.commentUnTop(communityId, articleId, commentId) - } + when { + articleId.isNotEmpty() -> { + mApi.postArticleCommentUnTop(communityId, articleId, commentId) + } + questionId.isNotEmpty() -> { + mApi.postQuestionCommentUnTop(questionId, commentId) + } + else -> null + } + } ?: return + observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : Response() { @@ -277,8 +283,7 @@ abstract class BaseCommentViewModel(application: Application, var articleId: Str } - - open fun hideCommunityArticleCommentSuccess() {} + open fun hideCommentSuccess() {} enum class LoadResult { SUCCESS, diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/conversation/CommentConversationFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/conversation/CommentConversationFragment.kt index a34233ad8b..34b685369f 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/conversation/CommentConversationFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/conversation/CommentConversationFragment.kt @@ -5,6 +5,7 @@ import android.content.Intent import android.os.Bundle import android.view.LayoutInflater import android.view.View +import androidx.appcompat.app.AppCompatActivity import com.ethanhua.skeleton.Skeleton import com.gh.common.AppExecutor import com.gh.common.util.* @@ -174,6 +175,15 @@ class CommentConversationFragment : BaseCommentFragment { - //TODO:获取问题评论回复接口 - null + mApi.getQuestionCommentReply(questionId, commentId, currentSortType.value, page) } else -> null } @@ -47,11 +44,20 @@ class CommentConversationViewModel(application: Application, @SuppressLint("CheckResult") fun getComment() { - //TODO:获取单条视频评论 - //TODO:获取单条问题评论 - - mApi.getCommunityArticleComment(communityId, articleId, commentId) - .subscribeOn(Schedulers.io()) + val single = when { + articleId.isNotEmpty() -> { + mApi.getCommunityArticleComment(communityId, articleId, commentId) + } + videoId.isNotEmpty() -> { + //TODO:获取单条视频评论 + null + } + questionId.isNotEmpty() -> { + mApi.getCommunityQuestionComment(questionId, commentId) + } + else -> null + } ?: return + single.subscribeOn(Schedulers.io()) .subscribe(object : BiResponse() { @SuppressLint("CheckResult") override fun onSuccess(data: CommentEntity) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailAdapter.kt index b8e286df6d..938a88487d 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailAdapter.kt @@ -4,6 +4,7 @@ import android.content.Context import android.view.ViewGroup import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.RecyclerView +import com.gh.common.syncpage.ISyncAdapterHandler import com.gh.gamecenter.R import com.gh.gamecenter.baselist.LoadStatus import com.gh.gamecenter.databinding.ItemArticleDetailContentBinding 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 62fba38097..707958fa00 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 @@ -15,28 +15,30 @@ import androidx.lifecycle.Lifecycle import androidx.recyclerview.widget.RecyclerView import com.ethanhua.skeleton.Skeleton import com.gh.common.util.* +import com.gh.gamecenter.ImageViewerActivity import com.gh.gamecenter.R import com.gh.gamecenter.SuggestionActivity import com.gh.gamecenter.baselist.ListAdapter +import com.gh.gamecenter.baselist.LoadType import com.gh.gamecenter.databinding.FragmentArticleDetailBinding import com.gh.gamecenter.entity.CommunityEntity import com.gh.gamecenter.entity.MenuItemEntity import com.gh.gamecenter.eventbus.EBDeleteDetail import com.gh.gamecenter.manager.UserManager -import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.qa.article.detail.CommentItemData -import com.gh.gamecenter.qa.article.edit.ArticleEditActivity import com.gh.gamecenter.qa.comment.CommentActivity import com.gh.gamecenter.qa.comment.base.BaseCommentAdapter import com.gh.gamecenter.qa.comment.base.BaseCommentFragment import com.gh.gamecenter.qa.comment.base.BaseCommentViewModel import com.gh.gamecenter.qa.dialog.MoreFunctionPanelDialog +import com.gh.gamecenter.qa.entity.QuestionsDetailEntity import com.gh.gamecenter.qa.questions.detail.QuestionsDetailFragment import com.gh.gamecenter.qa.questions.edit.QuestionEditActivity import com.gh.gamecenter.qa.questions.invite.QuestionsInviteActivity import com.gh.gamecenter.suggest.SuggestType import com.halo.assistant.HaloApp import org.greenrobot.eventbus.EventBus +import java.util.HashSet class NewQuestionDetailFragment : BaseCommentFragment() { private var mScrollToCommentArea: Boolean = false @@ -75,6 +77,46 @@ class NewQuestionDetailFragment : BaseCommentFragment(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 + mAdapter?.questionDetailVH?.run { + if (questionImgUrlList.size > 0) { + if (imageSet.size == questionImgUrlList.size) { + binding.richEditor.replaceAllDfImage() + } else { + for (i in imageSet) { + val url = questionImgUrlList[i.toInt()] + binding.richEditor.replaceDfImageByUrl(url) + } + } + } + } + } else if (requestCode == CommentActivity.REQUEST_CODE) { + val commentCount = data.getIntExtra(CommentActivity.COMMENT_COUNT, 0) + if (commentCount != 0) { + mViewModel.questionDetail?.answersCount = commentCount + mViewModel.commentCount = commentCount + mBinding.inputContainer.bottomCommentTv.text = mViewModel.getCommentText(mViewModel.questionDetail?.answersCount + ?: 0, "回答") + updateFilterView() + if (EntranceUtils.ENTRANCE_WELCOME == mEntrance) { + LogUtils.uploadCommentFromWelcomeDialog() + } + mViewModel.load(LoadType.REFRESH) + } + } + } + private fun initToolbar() { mBinding.toolbar.inflateMenu(R.menu.menu_article_detail) mBinding.toolbar.setNavigationOnClickListener { @@ -96,7 +138,7 @@ class NewQuestionDetailFragment : BaseCommentFragment 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 ef4c910a98..275f5fb50e 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 @@ -30,7 +30,6 @@ import retrofit2.HttpException class NewQuestionDetailViewModel(application: Application, questionId: String = "", communityId: String = "") : BaseCommentViewModel(application, articleId = "", communityId = communityId, videoId = "", questionId = questionId) { - private val mApi = RetrofitManager.getInstance(getApplication()).api var questionRenderedLiveData = MutableLiveData() var questionPageFinishedLiveData = MutableLiveData() val moderatorsHideLiveData = MutableLiveData() @@ -64,19 +63,23 @@ class NewQuestionDetailViewModel(application: Application, questionId: String = } override fun provideDataObservable(page: Int): Observable>? { - //TODO:问题评论(回答)接口 - return null + return mApi.getQuestionComment(questionId, currentSortType.value, page) } override fun mergeResultLiveData() { mResultLiveData.addSource(mListLiveData) { mergeListData(it, displayFloor = true) } } + override fun hideCommentSuccess() { + questionDetail?.answersCount = (questionDetail?.answersCount ?: 0) - 1 + loadResultLiveData.postValue(LoadResult.SUCCESS) + } + fun follow() { followingCommand(true, questionDetail?.user?.id!!) } - fun unfollow() { + fun unFollow() { followingCommand(false, questionDetail?.user?.id!!) } 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 38f2433120..83098ecc14 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 @@ -2,13 +2,8 @@ package com.gh.gamecenter.qa.questions.newdetail 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.TextView import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.gh.common.runOnUiThread @@ -16,22 +11,17 @@ 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.gh.gamecenter.qa.entity.QuestionsDetailEntity -import com.google.android.flexbox.FlexboxLayout import java.util.* class QuestionDetailContentViewHolder(var binding: ItemArticleDetailContentBinding, var viewModel: NewQuestionDetailViewModel) : RecyclerView.ViewHolder(binding.root) { private var mEntrance = "" - val articleImgUrlList = ArrayList() + val questionImgUrlList = ArrayList() @SuppressLint("AddJavascriptInterface") fun bindView(question: QuestionsDetailEntity) { @@ -60,7 +50,7 @@ class QuestionDetailContentViewHolder(var binding: ItemArticleDetailContentBindi "确定取消", "暂不取消", DialogUtils.ConfirmListener { - viewModel.unfollow() + viewModel.unFollow() }, null) } } @@ -153,14 +143,14 @@ class QuestionDetailContentViewHolder(var binding: ItemArticleDetailContentBindi else -> { var current = 0 var i = 0 - val size = articleImgUrlList.size + val size = questionImgUrlList.size while (i < size) { - if (url.contains(articleImgUrlList.get(i))) { + if (url.contains(questionImgUrlList.get(i))) { current = i } i++ } - val intent = ImageViewerActivity.getIntent(binding.root.context, articleImgUrlList, current, + 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) } @@ -170,8 +160,8 @@ class QuestionDetailContentViewHolder(var binding: ItemArticleDetailContentBindi @JavascriptInterface fun imageArr(url: String) { val defUrl = url.split("\\?".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[0] - if (!articleImgUrlList.contains(defUrl) && !url.contains("web_load_dfimg_icon.png")) { - articleImgUrlList.add(defUrl) + if (!questionImgUrlList.contains(defUrl) && !url.contains("web_load_dfimg_icon.png")) { + questionImgUrlList.add(defUrl) } } } 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 c362c2e318..d76160a881 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 @@ -161,7 +161,7 @@ class ForumTopVideoView @JvmOverloads constructor(context: Context, attrs: Attri viewModel?.videoIsMuted = true volume.setImageResource(R.drawable.ic_game_detail_volume_off) CustomManager.getCustomManager(getKey()).isNeedMute = true - SPUtils.setBoolean(Constants.SP_TOP_VIDEO_VOICE, true) + SPUtils.setBoolean(Constants.SP_VIDEO_PLAY_MUTE, true) if (isManual) { Utils.toast(context, "当前处于静音状态") uploadVideoStreamingPlaying("点击静音") @@ -172,7 +172,7 @@ class ForumTopVideoView @JvmOverloads constructor(context: Context, attrs: Attri viewModel?.videoIsMuted = false volume.setImageResource(R.drawable.ic_game_detail_volume_on) CustomManager.getCustomManager(getKey()).isNeedMute = false - SPUtils.setBoolean(Constants.SP_TOP_VIDEO_VOICE, false) + SPUtils.setBoolean(Constants.SP_VIDEO_PLAY_MUTE, false) if (isManual) { uploadVideoStreamingPlaying("取消静音") } 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 7ea2e1a4da..c620d7584e 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 @@ -1,8 +1,23 @@ package com.gh.gamecenter.qa.video.detail.comment import android.content.Context +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.gh.gamecenter.R import com.gh.gamecenter.qa.comment.base.BaseCommentAdapter class VideoCommentAdapter(val context: Context, val mViewModel: VideoCommentViewModel, val entrance: String) : BaseCommentAdapter(context, mViewModel, AdapterType.COMMENT, entrance) { + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + if (holder is CommentErrorViewHolder) { + val container = holder.itemView.findViewById(R.id.container) + (container.layoutParams as RecyclerView.LayoutParams).apply { + height = RecyclerView.LayoutParams.MATCH_PARENT + container.layoutParams = this + } + } else { + super.onBindViewHolder(holder, position) + } + } } \ 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 12f8d0d599..59fed0112f 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 @@ -11,16 +11,13 @@ 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.baselist.LoadType 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.article.detail.CommentItemData import com.gh.gamecenter.qa.comment.CommentActivity import com.gh.gamecenter.qa.video.detail.ForumVideoDetailViewModel -import kotlinx.android.synthetic.main.piece_article_input_container.* class VideoCommentFragment : LazyListFragment() { private lateinit var mBinding: FragmentVideoCommentListBinding @@ -107,4 +104,32 @@ class VideoCommentFragment : LazyListFragment>? { 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 29e9233684..31a512b673 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 @@ -2800,13 +2800,13 @@ public interface ApiService { * 置顶评论 */ @POST("communities/{community_id}/articles/{article_id}/comments/{comment_id}:set-top") - Observable commentTop(@Path("community_id") String communityId, @Path("article_id") String articleId, @Path("comment_id") String commentId, @QueryMap Map params); + Observable postArticleCommentTop(@Path("community_id") String communityId, @Path("article_id") String articleId, @Path("comment_id") String commentId, @QueryMap Map params); /** * 取消置顶评论 */ @POST("communities/{community_id}/articles/{article_id}/comments/{comment_id}:unset-top") - Observable commentUnTop(@Path("community_id") String communityId, @Path("article_id") String articleId, @Path("comment_id") String commentId); + Observable postArticleCommentUnTop(@Path("community_id") String communityId, @Path("article_id") String articleId, @Path("comment_id") String commentId); /** * 获取推荐的论坛 @@ -3051,4 +3051,65 @@ public interface ApiService { */ @DELETE("users/{user_id}/favorites/questions/{question_id}") Single deleteFavoriteQuestion(@Path("user_id") String userId, @Path("question_id") String questionId); + + /** + * 问题评论(回答)列表 + */ + @GET("bbses/questions/{question_id}/comments") + Observable> getQuestionComment(@Path("question_id") String questionId, @Query("sort") String type, @Query("page") int page); + + /** + * 对社区问题发布评论(回答) + */ + @POST("bbses/questions/{question_id}/comments") + Observable postQuestionComment(@Path("question_id") String questionsId, @Body RequestBody body); + + + /** + * 回复社区问题评论(回答) + */ + @POST("bbses/questions/{question_id}/comments/{comment_id}:reply") + Observable postReplyToQuestionComment(@Path("question_id") String questionsId, @Path("comment_id") String commentId, @Body RequestBody body); + + /** + * 获取问题评论(回答) + */ + @GET("bbses/questions/{question_id}/comments/{comment_id}") + Single getCommunityQuestionComment(@Path("question_id") String questionId, @Path("comment_id") String commentId); + + /** + * 获取问题评论(回答)的回复(评论)列表 + */ + @GET("bbses/questions/{question_id}/comments/{comment_id}/replies") + Single> getQuestionCommentReply(@Path("question_id") String questionId, @Path("comment_id") String commentId, @Query("sort") String sort, @Query("page") int page); + + /** + * 点赞问题评论(回答) + */ + @POST("bbses/questions/{question_id}/comments/{comment_id}:vote") + Observable postVoteQuestionComment(@Path("question_id") String questioIid, @Path("comment_id") String commentId); + + /** + * 投诉问题的评论 + */ + @POST("bbses/questions/{question_id}/comments/{comment_id}:report") + Observable postQuestionCommentReport(@Path("question_id") String questionId, @Path("comment_id") String commentId, @Body RequestBody reportData); + + /** + * 删除问题评论 + */ + @POST("bbses/questions/{question_id}/comments/{comment_id}:hide") + Single deleteQuestionComment(@Path("question_id") String questionId, @Path("comment_id") String commentId); + + /** + * 置顶问题评论 + */ + @POST("bbses/questions/{question_id}/comments/{comment_id}:set-top") + Observable postQuestionCommentTop(@Path("question_id") String questionId, @Path("comment_id") String commentId, @QueryMap Map params); + + /** + * 取消问题置顶评论 + */ + @POST("bbses/questions/{question_id}/comments/{comment_id}:unset-top") + Observable postQuestionCommentUnTop(@Path("question_id") String questionId, @Path("comment_id") String commentId); } \ No newline at end of file diff --git a/app/src/main/res/layout/item_article_detail_comment_empty.xml b/app/src/main/res/layout/item_article_detail_comment_empty.xml index d5841ee065..1bc3a874a7 100644 --- a/app/src/main/res/layout/item_article_detail_comment_empty.xml +++ b/app/src/main/res/layout/item_article_detail_comment_empty.xml @@ -1,29 +1,23 @@ - + android:layout_height="288dp" + android:background="@color/white" + android:gravity="center" + android:orientation="vertical"> - + - - - - - - \ No newline at end of file + + \ No newline at end of file From 3c533b896b5397a8325de9e15a4801dff802d88d Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Sat, 5 Jun 2021 19:18:57 +0800 Subject: [PATCH 35/61] =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E6=88=91=E7=9A=84?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E5=B8=96=E5=AD=90=E3=80=81=E6=88=91=E7=9A=84?= =?UTF-8?q?=E6=94=B6=E8=97=8F=E5=B8=96=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/common/util/CommentHelper.kt | 2 + .../collection/CommunityArticleAdapter.kt | 15 ++- .../collection/CommunityArticleViewModel.kt | 15 ++- .../gh/gamecenter/entity/CommunityEntity.kt | 1 + .../java/com/gh/gamecenter/entity/MeEntity.kt | 10 +- .../forum/detail/ForumDetailFragment.kt | 21 ++-- .../BaseAnswerOrArticleItemViewHolder.kt | 110 +++++++++++------- .../answer/CommunityAnswerItemViewHolder.kt | 18 ++- .../gamecenter/qa/article/MyArticleAdapter.kt | 32 +++-- .../qa/article/MyArticleFragment.kt | 13 ++- .../gh/gamecenter/qa/entity/AnswerEntity.kt | 32 +++++ .../gh/gamecenter/qa/entity/ArticleEntity.kt | 6 +- .../gamecenter/qa/myqa/MyAnswerAdapter.java | 8 -- .../detail/comment/VideoCommentFragment.kt | 2 - .../retrofit/service/ApiService.java | 12 ++ .../res/layout/community_my_answer_item.xml | 4 +- 16 files changed, 211 insertions(+), 90 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 2340757580..0ef998a1ed 100644 --- a/app/src/main/java/com/gh/common/util/CommentHelper.kt +++ b/app/src/main/java/com/gh/common/util/CommentHelper.kt @@ -82,6 +82,8 @@ object CommentHelper { commentEntity = commentEntity, showConversation = false, questionId = questionId, + isShowTop = true, + ignoreModerator = true, listener = listener) } diff --git a/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleAdapter.kt b/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleAdapter.kt index cdd6e931dc..e053a94142 100644 --- a/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleAdapter.kt @@ -16,6 +16,7 @@ import com.gh.gamecenter.databinding.CommunityAnswerItemBinding import com.gh.gamecenter.qa.answer.CommunityAnswerItemViewHolder import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.qa.entity.ArticleEntity +import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity class CommunityArticleAdapter(context: Context, private val mViewModel: CommunityArticleViewModel, @@ -70,12 +71,16 @@ class CommunityArticleAdapter(context: Context, holder.bindArticleItem(entity, mEntrance, path) holder.itemView.setOnClickListener { - if (entity.active) { - mContext.startActivity(ArticleDetailActivity.getIntent(mContext, entity.community, entity.id, mEntrance, path)) + if (entity.type == "question") { + mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, entity.id, mEntrance, path)) } else { - DialogUtils.showCancelAlertDialog(mContext, "提示", "内容已被删除,是否取消收藏?", "取消收藏", "暂不", { - mViewModel.deleteCollection(entity.community.id, entity.id) - }, null) + if (entity.active) { + mContext.startActivity(ArticleDetailActivity.getIntent(mContext, entity.community, entity.id, mEntrance, path)) + } else { + DialogUtils.showCancelAlertDialog(mContext, "提示", "内容已被删除,是否取消收藏?", "取消收藏", "暂不", { + mViewModel.deleteCollection(entity.community.id, entity.id) + }, null) + } } if (!entity.read) { diff --git a/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleViewModel.kt b/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleViewModel.kt index 28e125a946..41d3df7963 100644 --- a/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleViewModel.kt @@ -9,6 +9,7 @@ import com.gh.gamecenter.R import com.gh.gamecenter.baselist.ListViewModel import com.gh.gamecenter.baselist.LoadType import com.gh.gamecenter.manager.UserManager +import com.gh.gamecenter.qa.entity.AnswerEntity import com.gh.gamecenter.qa.entity.ArticleEntity import com.gh.gamecenter.retrofit.BiResponse import com.gh.gamecenter.retrofit.Response @@ -17,11 +18,11 @@ import com.lightgame.utils.Utils import io.reactivex.Observable import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.functions.Function import io.reactivex.schedulers.Schedulers import okhttp3.ResponseBody import retrofit2.HttpException - class CommunityArticleViewModel(application: Application) : ListViewModel(application) { var type: String = CommunityArticleFragment.Type.COLLECTION.value @@ -32,7 +33,17 @@ class CommunityArticleViewModel(application: Application) : ListViewModel> { return if (type == CommunityArticleFragment.Type.COLLECTION.value) { - Single.fromObservable(RetrofitManager.getInstance(getApplication()).api.getCollectionCommunityArticle(UserManager.getInstance().userId, page)) + Single.fromObservable( + RetrofitManager.getInstance(getApplication()).api + .getCollectionArticleAndQuestion(UserManager.getInstance().userId, page) + .flatMap(Function, Observable>> { list -> + Observable.create { emitter-> + val articleList = list.map { it.transformArticleEntity() }.toList() + emitter.onNext(articleList) + emitter.onComplete() + } + }) + ) } else { if (page > 5) { Single.create { it.onSuccess(arrayListOf()) } diff --git a/app/src/main/java/com/gh/gamecenter/entity/CommunityEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/CommunityEntity.kt index 7158d242d9..8bde53e686 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/CommunityEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/CommunityEntity.kt @@ -14,6 +14,7 @@ data class CommunityEntity( var icon: String? = "", @SerializedName("icon_subscript") var iconSubscript: String? = null, + var type: String = "game_bbs",//game_bbs/official_bbs var game: SimpleGame? = null) : Parcelable { constructor(id: String = "", name: String = "") : this(id, name, "choiceness") 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 b7f4a94f79..1305149118 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/MeEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/MeEntity.kt @@ -53,16 +53,16 @@ class MeEntity(@SerializedName("is_community_voted") var isArticleFavorite: Boolean = false, @SerializedName("is_question_favorite") - var isQuestionFavorite : Boolean = false, + var isQuestionFavorite: Boolean = false, @SerializedName("is_toolkit_favorite") var isToolkitFavorite: Boolean = false, - @SerializedName("is_comment_own", alternate = ["is_answer_commented", "is_community_article_commented", "is_video_commented"]) + @SerializedName("is_comment_own", alternate = ["is_answer_commented", "is_community_article_commented", "is_video_commented", "is_question_commented"]) var isCommentOwner: Boolean = false, // 是否是当前评论的拥有者 @SyncPage(syncNames = [SyncFieldConstants.ARTICLE_COMMENT_VOTE]) - @SerializedName("is_comment_voted", alternate = ["is_answer_comment_voted", "is_video_comment_voted", "is_community_article_comment_voted"]) + @SerializedName("is_comment_voted", alternate = ["is_answer_comment_voted", "is_video_comment_voted", "is_community_article_comment_voted", "is_question_comment_voted"]) var isCommentVoted: Boolean = false, // 是否已经点赞过当前评论 @SerializedName("is_version_requested") @@ -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"]) - val isArticleOrAnswerAuthor: Boolean = false, //用于判断是否是当前评论关联的回答或文章的作者 + @SerializedName("is_answer_author", alternate = ["is_community_article_author", "is_question_author"]) + val isArticleOrAnswerAuthor: Boolean = false, //用于判断是否是当前评论关联的回答/文章/问题的作者 @SerializedName("article_draft") var articleDraft: ArticleDraftEntity? = null,//帖子详情可能返回草稿 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 1f80d4c3a8..2f53d68b22 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 @@ -214,10 +214,10 @@ class ForumDetailFragment : BaseLazyTabFragment() { adapter = ForumTopLinkAdapter(requireContext(), topLink) } } else { - val params = mBinding.tabContainer.layoutParams as LinearLayout.LayoutParams - params.topMargin = DisplayUtils.dip2px(-8f) - mBinding.tabContainer.layoutParams = params - mBinding.tabContainer.background = ContextCompat.getDrawable(requireContext(), R.drawable.background_shape_white_radius_5_top_only) + val params = mBinding.tabContainer.layoutParams as LinearLayout.LayoutParams + params.topMargin = DisplayUtils.dip2px(-8f) + mBinding.tabContainer.layoutParams = params + mBinding.tabContainer.background = ContextCompat.getDrawable(requireContext(), R.drawable.background_shape_white_radius_5_top_only) } if (background.isEmpty()) { @@ -247,7 +247,7 @@ class ForumDetailFragment : BaseLazyTabFragment() { } R.id.filterContainer -> { MtaHelper.onEvent("论坛详情", "全部Tab", "过滤选项") - showFilterPopupWindow (arrayListOf("最新发布", "最新回复")) { + showFilterPopupWindow(arrayListOf("最新发布", "最新回复")) { mFilter = it mBinding.forumFilter.text = mFilter if (mAllForumArticleAskListFragment != null && mViewPager.currentItem == 0) { @@ -257,7 +257,7 @@ class ForumDetailFragment : BaseLazyTabFragment() { } R.id.videoFilterContainer -> { MtaHelper.onEvent("论坛详情", "视频Tab", "过滤选项") - showFilterPopupWindow (arrayListOf("推荐", "最新发布")) { + showFilterPopupWindow(arrayListOf("推荐", "最新发布")) { mVideoFilter = it mBinding.videoForumFilter.text = mVideoFilter if (mVideoForumArticleAskListFragment != null && mViewPager.currentItem == 3) { @@ -317,7 +317,7 @@ class ForumDetailFragment : BaseLazyTabFragment() { } R.id.forumRuleContainer -> { - startActivity(NewsDetailActivity.getIntentById(requireContext(), Constants.FORUM_REGULATIONS_NEWS_ID,"论坛详情")) + startActivity(NewsDetailActivity.getIntentById(requireContext(), Constants.FORUM_REGULATIONS_NEWS_ID, "论坛详情")) } } } @@ -427,13 +427,14 @@ class ForumDetailFragment : BaseLazyTabFragment() { window?.setWindowAnimations(R.style.community_publication_animation) dialog.setContentView(contentView, params) dialog.show() + val bbsType = if (mForumDetail?.game == null) BbsType.OFFICIAL_BBS else BbsType.GAME_BBS contentView.findViewById(R.id.community_edit_article_container).setOnClickListener { context?.ifLogin("论坛详情", action = { checkStoragePermissionBeforeAction { MtaHelper.onEvent("论坛详情", "发布", "发帖子") startActivity(ArticleEditActivity.getIntent(requireContext(), CommunityEntity(mForumDetail?.id ?: "", mForumDetail?.name - ?: "", icon = mForumDetail?.game?.getIcon(), iconSubscript = mForumDetail?.game?.iconSubscript))) + ?: "", icon = mForumDetail?.game?.getIcon(), iconSubscript = mForumDetail?.game?.iconSubscript), bbsType)) dialog.dismiss() } }) @@ -444,7 +445,7 @@ class ForumDetailFragment : BaseLazyTabFragment() { MtaHelper.onEvent("论坛详情", "发布", "提问") startActivity(QuestionEditActivity.getIntent(requireContext(), CommunityEntity(mForumDetail?.id ?: "", mForumDetail?.name - ?: "", icon = mForumDetail?.game?.getIcon(), iconSubscript = mForumDetail?.game?.iconSubscript))) + ?: "", icon = mForumDetail?.game?.getIcon(), iconSubscript = mForumDetail?.game?.iconSubscript), bbsType)) dialog.dismiss() } }) @@ -456,7 +457,7 @@ class ForumDetailFragment : BaseLazyTabFragment() { val communityEntity = CommunityEntity(mForumDetail?.id ?: "", mForumDetail?.name ?: "", icon = mForumDetail?.game?.getIcon(), iconSubscript = mForumDetail?.game?.iconSubscript) - startActivity(VideoPublishActivity.getIntent(requireContext(), communityEntity, BbsType.GAME_BBS, mEntrance, "论坛详情")) + startActivity(VideoPublishActivity.getIntent(requireContext(), communityEntity, bbsType, mEntrance, "论坛详情")) dialog.dismiss() } }) 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 0205b1d5aa..1e68813f1c 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 @@ -12,9 +12,11 @@ import com.gh.gamecenter.entity.VoteEntity import com.gh.gamecenter.forum.detail.ForumDetailActivity import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity -import com.gh.gamecenter.qa.comment.CommentActivity import com.gh.gamecenter.qa.entity.AnswerEntity import com.gh.gamecenter.qa.entity.ArticleEntity +import com.gh.gamecenter.qa.entity.QuestionsDetailEntity +import com.gh.gamecenter.qa.questions.invite.QuestionsInviteActivity +import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity import com.gh.gamecenter.qa.video.detail.ForumVideoDetailActivity import com.gh.gamecenter.retrofit.BiResponse import com.gh.gamecenter.retrofit.Response @@ -47,22 +49,24 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH commentCountContainer.setOnClickListener { if (filterIllegalCommentStatus(entity.commentable, entity.active)) return@setOnClickListener - if (entity.type == "community_article") { - val communityId = if (entity.articleCommunityId.isNotEmpty()) entity.articleCommunityId - else UserManager.getInstance().community.id - val intent = ArticleDetailActivity.getCommentIntent(itemView.context, - CommunityEntity(communityId, entity.communityName ?: ""), - entity.id ?: "", - entrance, "") - itemView.context.startActivity(intent) - } else if (entity.type == "video") { - itemView.context.startActivity(ForumVideoDetailActivity.getIntent(itemView.context, entity.id ?: "")) - } else { - val intent = CommentActivity.getAnswerCommentIntent(itemView.context, - entity.id!!, - entity.commentCount, - false) - itemView.context.startActivity(intent) + when (entity.type) { + "community_article" -> { + val communityId = if (!entity.communityId.isNullOrEmpty()) entity.communityId + ?: "" else entity.bbs.id + val intent = ArticleDetailActivity.getCommentIntent(itemView.context, + CommunityEntity(communityId, entity.communityName ?: ""), + entity.id ?: "", entrance, "") + itemView.context.startActivity(intent) + } + "video" -> { + itemView.context.startActivity(ForumVideoDetailActivity.getIntent(itemView.context, entity.id + ?: "")) + } + else -> { + val intent = NewQuestionDetailActivity.getCommentIntent(itemView.context, entity.id + ?: "", entrance, "") + itemView.context.startActivity(intent) + } } } @@ -114,14 +118,19 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH commentCountContainer.setOnClickListener { if (filterIllegalCommentStatus(entity.commentable, entity.active)) return@setOnClickListener - val communityId = if (entity.community.id.isNotEmpty()) entity.community.id - else UserManager.getInstance().community.id - val intent = ArticleDetailActivity.getCommentIntent(itemView.context, - CommunityEntity(communityId, entity.community.name), - entity.id, - entrance, "") - itemView.context.startActivity(intent) - MtaHelper.onEvent(getEventId(entrance), getKey(entrance), "评论图标") + if (entity.type == "question") { + val intent = NewQuestionDetailActivity.getCommentIntent(it.context, entity.id, entrance, "") + itemView.context.startActivity(intent) + } else { + val communityId = if (entity.community.id.isNotEmpty()) entity.community.id + else UserManager.getInstance().community.id + val intent = ArticleDetailActivity.getCommentIntent(itemView.context, + CommunityEntity(communityId, entity.community.name), + entity.id, + entrance, "") + itemView.context.startActivity(intent) + MtaHelper.onEvent(getEventId(entrance), getKey(entrance), "评论图标") + } } voteCountContainer.setOnClickListener { @@ -129,9 +138,20 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH debounceActionWithInterval(R.id.container_like, 1000) { CheckLoginUtils.checkLogin(itemView.context, entrance) { - if (!voteIcon.isChecked) voteArticle(entity) - else cancelArticleVote(entity) - MtaHelper.onEvent(getEventId(entrance), getKey(entrance), "点赞图标") + if (entity.type == "question") { + val questionsDetailEntity = QuestionsDetailEntity( + id = entity.id, + title = entity.title, + images = entity.images, + description = entity.brief) + it.context.startActivity(QuestionsInviteActivity.getIntent(it.context, + questionsDetailEntity, + entrance)) + } else { + if (!voteIcon.isChecked) voteArticle(entity) + else cancelArticleVote(entity) + MtaHelper.onEvent(getEventId(entrance), getKey(entrance), "点赞图标") + } } } } @@ -139,23 +159,31 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH fun binNormalView(entity: AnswerEntity) { setVoteAndCommentStyle(entity) - commentCount.text = if (entity.commentCount > 0) entity.commentCount.toString() else "评论" - voteCount.text = if (entity.vote > 0) entity.vote.toString() else "赞同" + if (entity.type == "question") { + commentCount.text = if (entity.answerCount > 0) entity.answerCount.toString() else "回答" + voteCount.text = "邀请回答" + } else { + commentCount.text = if (entity.commentCount > 0) entity.commentCount.toString() else "评论" + voteCount.text = if (entity.vote > 0) entity.vote.toString() else "赞同" + } } private fun setVoteAndCommentStyle(entity: AnswerEntity) { - - if (!entity.active) { - voteIcon.setImageResource(R.drawable.community_vote_unavailable) - voteCount.setTextColor(R.color.text_cccccc.toColor()) - } else if (entity.me.isCommunityArticleVote || entity.me.isAnswerVoted || entity.me.isVoted) { - voteIcon.setImageResource(R.drawable.community_vote_selector) - voteIcon.isChecked = true - voteCount.setTextColor(R.color.theme_font.toColor()) + if (entity.type == "question") { + voteIcon.setImageDrawable(R.drawable.community_invite_follow.toDrawable()) } else { - voteIcon.setImageResource(R.drawable.community_vote_selector) - voteIcon.isChecked = false - voteCount.setTextColor(R.color.text_999999.toColor()) + if (!entity.active) { + voteIcon.setImageResource(R.drawable.community_vote_unavailable) + voteCount.setTextColor(R.color.text_cccccc.toColor()) + } else if (entity.me.isCommunityArticleVote || entity.me.isAnswerVoted || entity.me.isVoted) { + voteIcon.setImageResource(R.drawable.community_vote_selector) + voteIcon.isChecked = true + voteCount.setTextColor(R.color.theme_font.toColor()) + } else { + voteIcon.setImageResource(R.drawable.community_vote_selector) + voteIcon.isChecked = false + voteCount.setTextColor(R.color.text_999999.toColor()) + } } if (entity.commentable && entity.active) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/CommunityAnswerItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/CommunityAnswerItemViewHolder.kt index 22e78b26fe..20b9b4c7a2 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/CommunityAnswerItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/CommunityAnswerItemViewHolder.kt @@ -68,13 +68,19 @@ class CommunityAnswerItemViewHolder(val binding: CommunityAnswerItemBinding) : B binding.userIcon.display(entity.user.border, entity.user.icon, entity.user.auth?.icon) binding.imageContainer.bindData(entity, entrance, path) - if (entity.getPassVideos().isNotEmpty() && entity.images.isNotEmpty()) { - val title = binding.title.text - val videoSpan = SpanBuilder(" ").image(1, " ".length, R.drawable.ic_article_video_label).build() - binding.title.text = SpannableStringBuilder() - .append(title) - .append(videoSpan) + val spanBuilder = SpannableStringBuilder() + if (entity.type == "question") { + val title = " ${binding.title.text}" + val askLabelSpan = SpanBuilder(title).image(0, 1, R.drawable.ic_ask_label).build() + spanBuilder.append(askLabelSpan) + } else { + spanBuilder.append(binding.title.text) } + if (entity.getPassVideos().isNotEmpty() && entity.images.isNotEmpty()) { + val videoSpan = SpanBuilder(" ").image(1, " ".length, R.drawable.ic_article_video_label).build() + spanBuilder.append(videoSpan) + } + binding.title.text = spanBuilder val user = entity.user binding.userBadgeName.setOnClickListener { binding.userBadgeIcon.performClick() } binding.userBadgeIcon.setOnClickListener { diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/MyArticleAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/article/MyArticleAdapter.kt index 424dcb01ab..bbdb554cb2 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/MyArticleAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/MyArticleAdapter.kt @@ -4,17 +4,24 @@ import android.content.Context import android.text.SpannableStringBuilder import android.view.View import android.view.ViewGroup +import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.gh.common.constant.ItemViewType import com.gh.common.syncpage.ISyncAdapterHandler import com.gh.common.util.SpanBuilder +import com.gh.common.util.toDrawable import com.gh.gamecenter.R import com.gh.gamecenter.adapter.viewholder.FooterViewHolder import com.gh.gamecenter.baselist.ListAdapter import com.gh.gamecenter.databinding.CommunityMyAnswerItemBinding import com.gh.gamecenter.qa.answer.MyAnswerViewHolder import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity +import com.gh.gamecenter.qa.entity.AnswerEntity import com.gh.gamecenter.qa.entity.ArticleEntity +import com.gh.gamecenter.qa.entity.Questions +import com.gh.gamecenter.qa.entity.QuestionsDetailEntity +import com.gh.gamecenter.qa.questions.invite.QuestionsInviteActivity +import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity class MyArticleAdapter(context: Context, private val mEntrance: String, @@ -51,15 +58,26 @@ class MyArticleAdapter(context: Context, holder.bindItem(entity, mEntrance) holder.binding.executePendingBindings() holder.binding.imageContainer.bindData(entity.transformAnswerEntity(), mEntrance, mPath) - if (entity.getPassVideos().isNotEmpty() && entity.images.isNotEmpty()) { - val title = holder.binding.title.text - val videoSpan = SpanBuilder(" ").image(1, " ".length, R.drawable.ic_article_video_label).build() - holder.binding.title.text = SpannableStringBuilder() - .append(title) - .append(videoSpan) + val spanBuilder = SpannableStringBuilder() + if (entity.type == "question") { + val title = " ${holder.binding.title.text}" + val askLabelSpan = SpanBuilder(title).image(0, 1, R.drawable.ic_ask_label).build() + spanBuilder.append(askLabelSpan) + } else { + spanBuilder.append(holder.binding.title.text) } + holder.binding.title.text = spanBuilder + if (entity.getPassVideos().isNotEmpty() && entity.images.isNotEmpty()) { + val videoSpan = SpanBuilder(" ").image(1, " ".length, R.drawable.ic_article_video_label).build() + spanBuilder.append(videoSpan) + } + holder.itemView.setOnClickListener { - mContext.startActivity(ArticleDetailActivity.getIntent(mContext, entity.community, entity.id, mEntrance, mPath)) + if (entity.type == "question") { + mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, entity.id, mEntrance, mPath)) + } else { + mContext.startActivity(ArticleDetailActivity.getIntent(mContext, entity.bbs, entity.id, mEntrance, mPath)) + } } } else if (holder is FooterViewHolder) { holder.initFooterViewHolder(mIsLoading, mIsNetworkError, mIsOver) diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/MyArticleFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/article/MyArticleFragment.kt index 9605139395..4612a528e2 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/MyArticleFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/MyArticleFragment.kt @@ -14,10 +14,12 @@ import com.gh.gamecenter.baselist.LoadType import com.gh.gamecenter.baselist.NormalListViewModel import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.qa.article.edit.ArticleEditActivity +import com.gh.gamecenter.qa.entity.AnswerEntity import com.gh.gamecenter.qa.entity.ArticleEntity import com.gh.gamecenter.retrofit.RetrofitManager import com.halo.assistant.HaloApp import io.reactivex.Observable +import io.reactivex.functions.Function class MyArticleFragment : ListFragment>() { @@ -37,7 +39,16 @@ class MyArticleFragment : ListFragment>? { - return RetrofitManager.getInstance(HaloApp.getInstance().application).api.getMyArticle(mTargetUserId, page) + return RetrofitManager.getInstance(HaloApp.getInstance().application).api.getMyArticleAndQuestion(mTargetUserId, page) + .flatMap(object :Function, Observable>>{ + override fun apply(list: List): Observable> { + return Observable.create { emitter-> + val articleList = list.map { it.transformArticleEntity() }.toMutableList() + emitter.onNext(articleList) + emitter.onComplete() + } + } + }) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt index c4b3f8be44..515cef3481 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt @@ -123,6 +123,9 @@ class AnswerEntity() : Parcelable { var length: Long = 0 + @Ignore + var count: Count = Count() + fun getPassVideos(): List { val passVideos = arrayListOf() for (video in videos) { @@ -153,6 +156,7 @@ class AnswerEntity() : Parcelable { videoInfo = parcel.readParcelable(VideoInfo::class.java.classLoader) ?: VideoInfo() poster = parcel.readString() ?: "" length = parcel.readLong() + count = parcel.readParcelable(Count::class.java.classLoader) ?: Count() } override fun writeToParcel(parcel: Parcel, flags: Int) { @@ -177,6 +181,7 @@ class AnswerEntity() : Parcelable { parcel.writeParcelable(videoInfo, flags) parcel.writeString(poster) parcel.writeLong(length) + parcel.writeParcelable(count, flags) } override fun describeContents(): Int { @@ -206,6 +211,33 @@ class AnswerEntity() : Parcelable { return forumVideoEntity } + fun transformArticleEntity(): ArticleEntity { + val articleEntity = ArticleEntity() + articleEntity.id = id ?: "" + articleEntity.brief = if (!brief.isNullOrEmpty()) brief ?: "" else description ?: "" + articleEntity.title = articleTitle ?: "" + articleEntity.images = images + articleEntity.videos = videos + articleEntity.user = user + articleEntity.time = TimeEntity(time ?: 0) + articleEntity.count = Count(commentCount, vote, answerCount) + articleEntity.active = active + articleEntity.orderTag = orderTag + articleEntity.read = read + articleEntity.me = me + articleEntity.commentable = commentable + articleEntity.community = CommunityEntity(bbs.id, bbs.name, icon = bbs.game?.getIcon(), iconSubscript = bbs.game?.iconSubscript, game = bbs.game) + articleEntity.bbs = articleEntity.community + articleEntity.imagesInfo = imagesInfo + articleEntity.des = des + articleEntity.url = url + articleEntity.videoInfo = videoInfo + articleEntity.poster = poster + articleEntity.length = length + articleEntity.type = type + return articleEntity + } + companion object { const val TAG: String = "AnswerEntity" diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt index 7ceabe6046..4728f9fe47 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt @@ -50,7 +50,9 @@ data class ArticleEntity( @SerializedName("video_info") var videoInfo: VideoInfo = VideoInfo(), var poster: String = "", - var length: Long = 0 + var length: Long = 0, + @Ignore + var type: String = "" ) : Parcelable { fun getPassVideos(): List { @@ -81,7 +83,7 @@ data class ArticleEntity( answer.communityId = community.id answer.communityName = community.name answer.bbs = bbs - answer.type = "community_article" + answer.type = type answer.imagesInfo = imagesInfo answer.des = des answer.url = url diff --git a/app/src/main/java/com/gh/gamecenter/qa/myqa/MyAnswerAdapter.java b/app/src/main/java/com/gh/gamecenter/qa/myqa/MyAnswerAdapter.java index 201871bbb7..2ef610313c 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/myqa/MyAnswerAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/qa/myqa/MyAnswerAdapter.java @@ -68,14 +68,6 @@ class MyAnswerAdapter extends ListAdapter implements ISyncAdapterH answerViewHolder.bindItem(entity, mEntrance); CommunityMyAnswerItemBinding binding = answerViewHolder.getBinding(); binding.imageContainer.bindData(entity, mEntrance, ""); -// binding.title.setOnClickListener(v -> -// mContext.startActivity(QuestionsDetailActivity.getIntent(mContext, -// entity.getQuestions().getId(), mEntrance, "我的光环-我的问答-我的回答"))); -// -// holder.itemView.setOnClickListener(v -> -// mContext.startActivity(AnswerDetailActivity.getIntent(mContext, -// entity.getId(), mEntrance, "我的光环-我的问答-我的回答"))); - binding.title.setOnClickListener(v -> { mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, entity.getQuestions().getId(), mEntrance, "我的光环-我的问答-我的回答")); 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 59fed0112f..b96b59a552 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 @@ -90,8 +90,6 @@ class VideoCommentFragment : LazyListFragment> getMyArticle(@Path("user_id") String userId, @Query("page") int page); + /** + * 获取社区文章问题列表 + */ + @GET("users/{user_id}/communities/articles?view=home_page&type=article-question") + Observable> getMyArticleAndQuestion(@Path("user_id") String userId, @Query("page") int page); + /** * 获取用户的文章草稿列表 */ @@ -1504,6 +1510,12 @@ public interface ApiService { @GET("users/{user_id}/favorites/communities/articles") Observable> getCollectionCommunityArticle(@Path("user_id") String userId, @Query("page") int page); + /** + * 获取收藏的社区文章/问题列表 + */ + @GET("users/{user_id}/favorites/communities/articles?type=article-question") + Observable> getCollectionArticleAndQuestion(@Path("user_id") String userId, @Query("page") int page); + /** * 收藏社区文章 */ diff --git a/app/src/main/res/layout/community_my_answer_item.xml b/app/src/main/res/layout/community_my_answer_item.xml index 4fb83e4682..91158dcd99 100644 --- a/app/src/main/res/layout/community_my_answer_item.xml +++ b/app/src/main/res/layout/community_my_answer_item.xml @@ -6,6 +6,8 @@ + + Date: Mon, 7 Jun 2021 16:02:29 +0800 Subject: [PATCH 36/61] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AE=BA=E5=9D=9B?= =?UTF-8?q?=E5=8F=91=E5=B8=83=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/base/BaseRichEditorViewModel.kt | 26 ++++++++++-- .../gh/gamecenter/entity/ForumDetailEntity.kt | 21 +++++----- .../forum/detail/ForumDetailFragment.kt | 10 +++-- .../forum/home/CommunityHomeFragment.kt | 2 +- .../forum/home/ForumHomeFragment.kt | 2 +- .../main/java/com/gh/gamecenter/qa/BbsType.kt | 7 +++- .../qa/answer/edit/AnswerEditViewModel.kt | 3 ++ .../detail/ArticleDetailContentViewHolder.kt | 12 +++--- .../article/detail/ArticleDetailFragment.kt | 6 ++- .../qa/article/edit/ArticleEditActivity.kt | 20 ++++++---- .../qa/article/edit/ArticleEditViewModel.kt | 3 ++ .../qa/questions/edit/QuestionEditActivity.kt | 30 ++++++++------ .../questions/edit/QuestionEditViewModel.kt | 3 ++ .../newdetail/NewQuestionDetailFragment.kt | 11 +++-- .../newdetail/NewQuestionDetailViewModel.kt | 14 +++++-- .../QuestionDetailContentViewHolder.kt | 11 +++-- .../qa/video/publish/VideoPublishActivity.kt | 4 +- .../qa/video/publish/VideoPublishFragment.kt | 40 ++++++++++++------- .../qa/video/publish/VideoPublishViewModel.kt | 1 + .../retrofit/service/ApiService.java | 2 +- 20 files changed, 151 insertions(+), 77 deletions(-) diff --git a/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt b/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt index e2c28f5d69..feb6e726aa 100644 --- a/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt +++ b/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt @@ -45,7 +45,7 @@ abstract class BaseRichEditorViewModel(application: Application) : AndroidViewMo val localVideoList = ArrayList() val uploadVideoErrorList = ArrayList() var currentUploadingVideo: LocalVideoEntity? = null - var type: String = ""//游戏论坛:game_bbs 官方论坛:official_bbs + var type: String = "" //游戏论坛:game_bbs 官方论坛:official_bbs private var mUploadVideoListener: UploadVideoListener? = null val TITLE_MIN_LENGTH = 6 val MIN_TEXT_LENGTH = 6 @@ -235,8 +235,20 @@ abstract class BaseRichEditorViewModel(application: Application) : AndroidViewMo private fun getVideoType(): String { return when (type) { - BbsType.GAME_BBS.value -> BbsType.GAME_BBS_INSERT.value - BbsType.OFFICIAL_BBS.value -> BbsType.OFFICIAL_BBS_INSERT.value + BbsType.GAME_BBS.value -> { + when (getRichType()) { + RichType.ARTICLE -> BbsType.GAME_BBS_ARTICLE_INSERT.value + RichType.QUESTION -> BbsType.GAME_BBS_QUESTION_INSERT.value + else -> "" + } + } + BbsType.OFFICIAL_BBS.value -> { + when (getRichType()) { + RichType.ARTICLE -> BbsType.OFFICIAL_BBS_ARTICLE_INSERT.value + RichType.QUESTION -> BbsType.OFFICIAL_BBS_QUESTION_INSERT.value + else -> "" + } + } else -> "" } } @@ -299,6 +311,8 @@ abstract class BaseRichEditorViewModel(application: Application) : AndroidViewMo } return true } + + abstract fun getRichType(): RichType } interface UploadVideoListener { @@ -326,4 +340,10 @@ interface UploadVideoListener { * 上传失败 */ fun videoUploadFailed(id: String) +} + +enum class RichType { + ARTICLE, + QUESTION, + ANSWER } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/entity/ForumDetailEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/ForumDetailEntity.kt index b55b09d948..3fa58061b2 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/ForumDetailEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/ForumDetailEntity.kt @@ -14,15 +14,16 @@ data class ForumDetailEntity( var topLink: ArrayList = arrayListOf(), @SerializedName("zone_tab") var zone: ZoneEntity? = null, - var me: MeEntity = MeEntity() + var me: MeEntity = MeEntity(), + var type: String = "" //game_bbs/official_bbs ) { - fun convertForumDetailEntityToForumEntity(): ForumEntity { - val forumEntity = ForumEntity() - forumEntity.id = id - forumEntity.name = name - forumEntity.game = game - forumEntity.orderTag = System.currentTimeMillis() - forumEntity.unread = false - return forumEntity - } + fun convertForumDetailEntityToForumEntity(): ForumEntity { + val forumEntity = ForumEntity() + forumEntity.id = id + forumEntity.name = name + forumEntity.game = game + forumEntity.orderTag = System.currentTimeMillis() + forumEntity.unread = false + return forumEntity + } } \ No newline at end of file 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 2f53d68b22..9bdce63024 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 @@ -427,14 +427,14 @@ class ForumDetailFragment : BaseLazyTabFragment() { window?.setWindowAnimations(R.style.community_publication_animation) dialog.setContentView(contentView, params) dialog.show() - val bbsType = if (mForumDetail?.game == null) BbsType.OFFICIAL_BBS else BbsType.GAME_BBS contentView.findViewById(R.id.community_edit_article_container).setOnClickListener { context?.ifLogin("论坛详情", action = { checkStoragePermissionBeforeAction { MtaHelper.onEvent("论坛详情", "发布", "发帖子") startActivity(ArticleEditActivity.getIntent(requireContext(), CommunityEntity(mForumDetail?.id ?: "", mForumDetail?.name - ?: "", icon = mForumDetail?.game?.getIcon(), iconSubscript = mForumDetail?.game?.iconSubscript), bbsType)) + ?: "", icon = mForumDetail?.game?.getIcon(), iconSubscript = mForumDetail?.game?.iconSubscript), mForumDetail?.type + ?: "")) dialog.dismiss() } }) @@ -445,7 +445,8 @@ class ForumDetailFragment : BaseLazyTabFragment() { MtaHelper.onEvent("论坛详情", "发布", "提问") startActivity(QuestionEditActivity.getIntent(requireContext(), CommunityEntity(mForumDetail?.id ?: "", mForumDetail?.name - ?: "", icon = mForumDetail?.game?.getIcon(), iconSubscript = mForumDetail?.game?.iconSubscript), bbsType)) + ?: "", icon = mForumDetail?.game?.getIcon(), iconSubscript = mForumDetail?.game?.iconSubscript), mForumDetail?.type + ?: "")) dialog.dismiss() } }) @@ -457,7 +458,8 @@ class ForumDetailFragment : BaseLazyTabFragment() { val communityEntity = CommunityEntity(mForumDetail?.id ?: "", mForumDetail?.name ?: "", icon = mForumDetail?.game?.getIcon(), iconSubscript = mForumDetail?.game?.iconSubscript) - startActivity(VideoPublishActivity.getIntent(requireContext(), communityEntity, bbsType, mEntrance, "论坛详情")) + startActivity(VideoPublishActivity.getIntent(requireContext(), communityEntity, mForumDetail?.type + ?: "", mEntrance, "论坛详情")) dialog.dismiss() } }) 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 648896e781..d9e821ce6c 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 @@ -210,7 +210,7 @@ class CommunityHomeFragment : LazyFragment() { checkStoragePermissionBeforeAction { showRegulationTestDialogIfNeeded { MtaHelper.onEvent("论坛首页", "发布", "发视频") - startActivity(VideoPublishActivity.getIntent(requireContext(), null, BbsType.GAME_BBS, mEntrance, "论坛首页")) + startActivity(VideoPublishActivity.getIntent(requireContext(), null, "", mEntrance, "论坛首页")) dialog.dismiss() } } diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumHomeFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumHomeFragment.kt index e824d85155..117fb3026f 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumHomeFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumHomeFragment.kt @@ -358,7 +358,7 @@ class ForumHomeFragment : BaseLazyTabFragment() { checkStoragePermissionBeforeAction { showRegulationTestDialogIfNeeded { MtaHelper.onEvent("论坛首页", "发布", "发视频") - startActivity(VideoPublishActivity.getIntent(requireContext(), null, BbsType.GAME_BBS, mEntrance, "论坛首页")) + startActivity(VideoPublishActivity.getIntent(requireContext(), null, "", mEntrance, "论坛首页")) dialog.dismiss() } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/BbsType.kt b/app/src/main/java/com/gh/gamecenter/qa/BbsType.kt index 1430c25b11..82c46b65c4 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/BbsType.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/BbsType.kt @@ -3,6 +3,9 @@ package com.gh.gamecenter.qa enum class BbsType(val value: String) { GAME_BBS("game_bbs"),//游戏论坛 OFFICIAL_BBS("official_bbs"),//官方论坛 - GAME_BBS_INSERT("game_bbs_insert"),//游戏论坛视频插入 - OFFICIAL_BBS_INSERT("official_bbs_insert")//官方论坛视频插入 + + GAME_BBS_QUESTION_INSERT("game_bbs_question_insert"),//游戏论坛提问视频插入 + GAME_BBS_ARTICLE_INSERT("game_bbs_article_insert"),//游戏论坛帖子视频插入 + OFFICIAL_BBS_QUESTION_INSERT("official_bbs_question_insert"),//官方论坛提问视频插入 + OFFICIAL_BBS_ARTICLE_INSERT("official_bbs_article_insert")//官方论坛帖子视频插入 } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditViewModel.kt index f0c7511103..0f43a17765 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/answer/edit/AnswerEditViewModel.kt @@ -13,6 +13,7 @@ import com.gh.gamecenter.eventbus.EBReuse import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.mvvm.Resource import com.gh.base.BaseRichEditorViewModel +import com.gh.base.RichType import com.gh.gamecenter.qa.entity.AnswerDraftEntity import com.gh.gamecenter.qa.entity.Questions import com.gh.gamecenter.retrofit.Response @@ -189,6 +190,8 @@ class AnswerEditViewModel(application: Application, }) } + override fun getRichType(): RichType = RichType.ANSWER + class Factory(private val mApplication: Application, private val answerId: String?, private val answerContent: String?, 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 f5ce199add..9275b9da8e 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 @@ -91,12 +91,14 @@ class ArticleDetailContentViewHolder(var binding: ItemArticleDetailContentBindin releaseTimeTv.text = String.format("发布于%s 最后编辑于%s", NewsUtils.getFormattedTime(article.time.create), NewsUtils.getFormattedTime(article.time.edit)) } richEditor.visibility = View.VISIBLE - viewModel.detailEntity?.community?.game?.let { - gameName.text = viewModel.detailEntity?.community?.name - forumIconView.displayGameIcon(it.getIcon(), it.iconSubscript) + 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 + forumIconView.displayGameIcon(icon, iconSubscript) forumContainer.setOnClickListener { - DirectUtils.directForumDetail(forumContainer.context, viewModel.detailEntity?.communityId, "帖子详情") - LogUtils.uploadAccessToBbs(viewModel.detailEntity?.communityId, "文章内所属论坛") + DirectUtils.directForumDetail(forumContainer.context, entity.id, "帖子详情") + LogUtils.uploadAccessToBbs(entity.id, "文章内所属论坛") } } 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 39b04582fc..e528f74d0e 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 @@ -499,8 +499,10 @@ class ArticleDetailFragment : BaseCommentFragment(), Keyb } } else if (requestCode == ChooseForumActivity.CHOOSE_FORUM_REQUEST) { val community = data.getParcelableExtra(EntranceUtils.KEY_COMMUNITY_DATA) + mViewModel.type = community?.type ?: "" mViewModel.mSelectCommunityData = community + if (mViewModel.type == BbsType.GAME_BBS.value) { + mViewModel.gameEntity = null + } setGameName() } else if (requestCode == VideoPublishFragment.REQUEST_GAME_CODE) { val game = data.getParcelableExtra(GameEntity::class.java.simpleName) @@ -253,8 +257,10 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb mViewModel.type = intent?.getStringExtra(BbsType::class.java.simpleName) ?: "" if (mViewModel.mSelectCommunityData != null) { setGameName() - mGameName.isEnabled = false - mGameName.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null) + if (mViewModel.type == BbsType.GAME_BBS.value) { + mGameName.isEnabled = false + mGameName.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null) + } } mEditTitle.requestFocus() } @@ -436,10 +442,10 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb } private fun showSelectGameDialog() { - if (mViewModel.type == BbsType.GAME_BBS.value) { - ChooseForumActivity.startChooseForumActivity(this) - } else if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { + if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { startActivityForResult(GameActivity.getIntent(this, GameActivity.SELECT_GAME_TITLE), VideoPublishFragment.REQUEST_GAME_CODE) + } else { + ChooseForumActivity.startChooseForumActivity(this) } } @@ -540,9 +546,9 @@ class ArticleEditActivity : BaseRichEditorActivity(), Keyb } @JvmStatic - fun getIntent(context: Context, community: CommunityEntity?, type: BbsType = BbsType.GAME_BBS): Intent { + fun getIntent(context: Context, community: CommunityEntity?, type: String = ""): Intent { val intent = Intent(context, ArticleEditActivity::class.java) - intent.putExtra(BbsType::class.java.simpleName, type.value) + intent.putExtra(BbsType::class.java.simpleName, type) intent.putExtra(CommunityEntity::class.java.simpleName, community) return intent } diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt index 69a8ecafa6..7e237f3b43 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/edit/ArticleEditViewModel.kt @@ -12,6 +12,7 @@ import com.gh.gamecenter.entity.CommunityEntity import com.gh.gamecenter.eventbus.EBReuse import com.gh.gamecenter.manager.UserManager import com.gh.base.BaseRichEditorViewModel +import com.gh.base.RichType import com.gh.gamecenter.entity.ActivityLabelEntity import com.gh.gamecenter.entity.GameEntity import com.gh.gamecenter.qa.BbsType @@ -282,4 +283,6 @@ class ArticleEditViewModel(application: Application) : BaseRichEditorViewModel(a } }) } + + override fun getRichType(): RichType = RichType.ARTICLE } 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 4fb671acbd..1b2121a1db 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 @@ -81,10 +81,14 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke } else if (requestCode == ChooseForumActivity.CHOOSE_FORUM_REQUEST) { val community = data.getParcelableExtra(EntranceUtils.KEY_COMMUNITY_DATA) mViewModel.communityEntity = community + mViewModel.type = community?.type ?: "" if (mViewModel.questionEntity != null) { mViewModel.questionEntity?.community?.id = community?.id ?: "" mViewModel.questionEntity?.community?.name = community?.name ?: "" } + if (mViewModel.type == BbsType.GAME_BBS.value) { + mViewModel.gameEntity = null + } setForumName() mBinding.vm = mViewModel } else if (requestCode == VideoPublishFragment.REQUEST_GAME_CODE) { @@ -212,15 +216,16 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke 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) { + mViewModel.communityEntity = communityEntity + setForumName() + if (mViewModel.type == BbsType.GAME_BBS.value) { + mBinding.chooseForumTv.isEnabled = false + mBinding.chooseForumTv.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null) + } + } } } - - if (communityEntity != null) { - mViewModel.communityEntity = communityEntity - setForumName() - mBinding.chooseForumTv.isEnabled = false - mBinding.chooseForumTv.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null) - } } observeData() } @@ -265,6 +270,7 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke mViewModel.communityEntity = draftEntity.bbs mViewModel.communityEntity?.icon = draftEntity.bbs?.game?.getIcon() 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) mBinding.activityTitle.text = draftEntity.tagActivityName @@ -438,10 +444,10 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke } private fun showSelectGameDialog() { - if (mViewModel.type == BbsType.GAME_BBS.value) { - ChooseForumActivity.startChooseForumActivity(this) - } else if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { + if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { startActivityForResult(GameActivity.getIntent(this, GameActivity.SELECT_GAME_TITLE), VideoPublishFragment.REQUEST_GAME_CODE) + } else { + ChooseForumActivity.startChooseForumActivity(this) } } @@ -646,10 +652,10 @@ class QuestionEditActivity : BaseRichEditorActivity(), Ke return intent } - fun getIntent(context: Context, communityEntity: CommunityEntity, type: BbsType = BbsType.GAME_BBS): 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.value) + intent.putExtra(BbsType::class.java.simpleName, type) return intent } 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 d2de201516..e224e24623 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 @@ -7,6 +7,7 @@ import android.view.Gravity import androidx.lifecycle.MediatorLiveData import androidx.lifecycle.MutableLiveData import com.gh.base.BaseRichEditorViewModel +import com.gh.base.RichType import com.gh.base.fragment.WaitingDialogFragment import com.gh.common.util.* import com.gh.gamecenter.R @@ -350,6 +351,8 @@ class QuestionEditViewModel(application: Application) : BaseRichEditorViewModel( }) } + override fun getRichType(): RichType = RichType.QUESTION + companion object { const val QUESTION_TAG_MAX_COUNT = 5 const val QUESTION_TITLE_MAX_LENGTH = 50 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 707958fa00..75307d0b78 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 @@ -188,7 +188,7 @@ class NewQuestionDetailFragment : BaseCommentFragment(EntranceUtils.KEY_COMMUNITY_DATA)?.id - ?: "")) + ?: "", + arguments?.getString(EntranceUtils.KEY_ANSWER_ID) ?: "")) } override fun provideListAdapter(): ListAdapter<*> { 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 275f5fb50e..ee7f076ad1 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 @@ -28,7 +28,7 @@ import okhttp3.ResponseBody import org.json.JSONObject import retrofit2.HttpException -class NewQuestionDetailViewModel(application: Application, questionId: String = "", communityId: String = "") : +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() @@ -63,7 +63,11 @@ class NewQuestionDetailViewModel(application: Application, questionId: String = } override fun provideDataObservable(page: Int): Observable>? { - return mApi.getQuestionComment(questionId, currentSortType.value, page) + val map = hashMapOf() + if (answerId.isNotEmpty()) { + map["top_comment_id"] = answerId + } + return mApi.getQuestionComment(questionId, currentSortType.value, page, map) } override fun mergeResultLiveData() { @@ -167,13 +171,15 @@ class NewQuestionDetailViewModel(application: Application, questionId: String = class Factory(private val application: Application, private val questionId: String = "", - private val communityId: String = "") : ViewModelProvider.NewInstanceFactory() { + private val communityId: String = "", + private val answerId: String = "") : ViewModelProvider.NewInstanceFactory() { override fun create(modelClass: Class): T { return NewQuestionDetailViewModel( application = application, questionId = questionId, - communityId = communityId) as T + communityId = communityId, + answerId = answerId) as T } } } \ No newline at end of file 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 83098ecc14..a3b94a56db 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 @@ -79,11 +79,14 @@ class QuestionDetailContentViewHolder(var binding: ItemArticleDetailContentBindi releaseTimeTv.text = String.format("发布于%s 最后编辑于%s", NewsUtils.getFormattedTime(question.time.create), NewsUtils.getFormattedTime(question.time.edit)) } richEditor.visibility = View.VISIBLE - question.community.game?.let { - gameName.text = question.community.name - forumIconView.displayGameIcon(it.getIcon(), it.iconSubscript) + 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 + forumIconView.displayGameIcon(icon, iconSubscript) forumContainer.setOnClickListener { - DirectUtils.directForumDetail(forumContainer.context, question.community.id, "帖子详情") + DirectUtils.directForumDetail(forumContainer.context, entity.id, "问题详情") + LogUtils.uploadAccessToBbs(entity.id, "文章内所属论坛") } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishActivity.kt index 078bc921bc..e4220611aa 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/video/publish/VideoPublishActivity.kt @@ -24,10 +24,10 @@ class VideoPublishActivity : NormalActivity() { companion object { @JvmStatic - fun getIntent(context: Context, communityEntity: CommunityEntity?, type: BbsType, entrance: String, path: String): Intent { + fun getIntent(context: Context, communityEntity: CommunityEntity?, type: String, entrance: String, path: String): Intent { val bundle = Bundle() bundle.putParcelable(CommunityEntity::class.java.simpleName, communityEntity) - bundle.putString(BbsType::class.java.simpleName, type.value) + bundle.putString(BbsType::class.java.simpleName, type) bundle.putString(EntranceUtils.KEY_ENTRANCE, ToolBarActivity.mergeEntranceAndPath(entrance, path)) bundle.putString(EntranceUtils.KEY_PATH, path) return getTargetIntent(context, VideoPublishActivity::class.java, VideoPublishFragment::class.java, bundle) 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 52803ae1f1..d48ee116bc 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 @@ -50,7 +50,6 @@ class VideoPublishFragment : NormalFragment() { private lateinit var mMenuPost: MenuItem private var mUpdatedPosterPath = "" private var mProcessingDialog: WaitingDialogFragment? = null - private var mType = "" override fun getLayoutId(): Int = 0 @@ -69,7 +68,7 @@ class VideoPublishFragment : NormalFragment() { mViewModel.videoDraft = arguments?.getParcelable(VideoDraftEntity::class.java.simpleName) mViewModel.videoPatch = arguments?.getParcelable(ForumVideoEntity::class.java.simpleName) mViewModel.communityEntity = arguments?.getParcelable(CommunityEntity::class.java.simpleName) - mType = arguments?.getString(BbsType::class.java.simpleName) ?: "" + mViewModel.type = arguments?.getString(BbsType::class.java.simpleName) ?: "" initData() observeData() checkPostButtonEnable() @@ -101,10 +100,10 @@ class VideoPublishFragment : NormalFragment() { } mBinding.videoPosterPatchHint.setOnClickListener { startMediaStore() } mBinding.forumContainer.setOnClickListener { - if (mType == BbsType.GAME_BBS.value) { - ChooseForumActivity.startChooseForumActivity(requireActivity()) - } else if (mType == BbsType.OFFICIAL_BBS.value) { + if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { startActivityForResult(GameActivity.getIntent(requireContext(), GameActivity.SELECT_GAME_TITLE), REQUEST_GAME_CODE) + } else { + ChooseForumActivity.startChooseForumActivity(requireActivity()) } } mBinding.chooseActivityContainer.setOnClickListener { @@ -136,6 +135,13 @@ class VideoPublishFragment : NormalFragment() { } else -> { setNavigationTitle("发视频") + if (mViewModel.communityEntity != null) { + setForumName() + if (mViewModel.type == BbsType.GAME_BBS.value) { + mBinding.forumContainer.isEnabled = false + mBinding.chooseForumTv.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null) + } + } PermissionHelper.checkStoragePermissionBeforeAction(requireActivity(), object : EmptyCallback { override fun onCallback() { startActivityForResult(LocalMediaActivity.getIntent(requireContext(), LocalMediaActivity.ChooseType.VIDEO, 1), BaseRichEditorActivity.INSERT_VIDEO_CODE) @@ -143,7 +149,6 @@ class VideoPublishFragment : NormalFragment() { }) } } - setForumName() } private fun observeData() { @@ -203,6 +208,10 @@ class VideoPublishFragment : NormalFragment() { } else if (requestCode == ChooseForumActivity.CHOOSE_FORUM_REQUEST) { val community = data.getParcelableExtra(EntranceUtils.KEY_COMMUNITY_DATA) mViewModel.communityEntity = community + mViewModel.type = community?.type ?: "" + if (mViewModel.type == BbsType.GAME_BBS.value) { + mViewModel.gameEntity = null + } setForumName() } else if (requestCode == REQUEST_GAME_CODE) { val game = data.getParcelableExtra(GameEntity::class.java.simpleName) @@ -221,7 +230,7 @@ class VideoPublishFragment : NormalFragment() { private fun setVideoPatch(videoPatch: ForumVideoEntity) { mMenuDraft.isVisible = false - mType = videoPatch.type + mViewModel.type = videoPatch.type mViewModel.gameEntity = videoPatch.game mViewModel.communityEntity = videoPatch.bbs mViewModel.communityEntity?.icon = mViewModel.gameEntity?.icon @@ -235,6 +244,7 @@ class VideoPublishFragment : NormalFragment() { ImageUtils.display(mBinding.videoPoster, videoPatch.poster) handleUploadSuccess(videoPatch.url) mBinding.deleteVideoIv.visibility = View.GONE + setForumName() } private fun setVideoDraft() { @@ -245,7 +255,7 @@ class VideoPublishFragment : NormalFragment() { mViewModel.gameEntity = it.game } mViewModel.gameEntity = it.game - mType = it.type + mViewModel.type = it.type mBinding.title.setText(it.title) mBinding.videoDes.setText(it.des) if (it.tagActivityId.isNotEmpty() && it.tagActivityName.isNotEmpty()) { @@ -389,11 +399,11 @@ class VideoPublishFragment : NormalFragment() { private fun setForumName() { if (mViewModel.communityEntity != null) { - if (mType == BbsType.GAME_BBS.value) { + if (mViewModel.type == BbsType.GAME_BBS.value) { mBinding.chooseForumTv.text = mViewModel.communityEntity?.name mBinding.forumIconView.displayGameIcon(mViewModel.communityEntity?.icon, mViewModel.communityEntity?.iconSubscript) setForumUI() - } else if (mType == BbsType.OFFICIAL_BBS.value) { + } else if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { if (mViewModel.gameEntity == null) { mBinding.chooseForumTv.text = "选择游戏" } else { @@ -403,9 +413,9 @@ class VideoPublishFragment : NormalFragment() { } } } else { - if (mType == BbsType.GAME_BBS.value) { + if (mViewModel.type == BbsType.GAME_BBS.value) { mBinding.chooseForumTv.text = "选择论坛" - } else if (mType == BbsType.OFFICIAL_BBS.value) { + } else if (mViewModel.type == BbsType.OFFICIAL_BBS.value) { mBinding.chooseForumTv.text = "选择游戏" } } @@ -431,7 +441,7 @@ class VideoPublishFragment : NormalFragment() { val des = mBinding.videoDes.text.toString() if (mVideoFileEntity?.url.isNullOrEmpty()) return false if (mViewModel.communityEntity == null) return false - if (mType == BbsType.OFFICIAL_BBS.value && mViewModel.gameEntity == null) return false + if (mViewModel.type == BbsType.OFFICIAL_BBS.value && mViewModel.gameEntity == null) return false if (title.isEmpty()) return false if (des.isEmpty()) return false if (mViewModel.videoPatch != null && mViewModel.videoPatch?.title == title && mViewModel.videoPatch?.des == des) return false @@ -540,7 +550,7 @@ class VideoPublishFragment : NormalFragment() { toast("请选择论坛") return } - if (!isDraft && mType == BbsType.OFFICIAL_BBS.value && mViewModel.gameEntity == null) { + if (!isDraft && mViewModel.type == BbsType.OFFICIAL_BBS.value && mViewModel.gameEntity == null) { toast("请选择游戏") return } @@ -567,7 +577,7 @@ class VideoPublishFragment : NormalFragment() { length = mVideoFileEntity?.length ?: 0, poster = mViewModel.videoDraft?.poster ?: "", bbsId = mViewModel.communityEntity?.id ?: "", - type = mType, + type = mViewModel.type, gameId = mViewModel.gameEntity?.id ?: mViewModel.communityEntity?.game?.id ?: "", tagActivityId = mViewModel.selectActivityLabelEntity?.id ?: "", 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 4e89003da6..cd49b7a1d5 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 @@ -27,6 +27,7 @@ import java.io.File class VideoPublishViewModel(application: Application) : AndroidViewModel(application) { private val mApi = RetrofitManager.getInstance(getApplication()).api + var type: String = "" var communityEntity: CommunityEntity? = null var selectActivityLabelEntity: ActivityLabelEntity? = null var videoPatch: ForumVideoEntity? = null 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 7e0a938d6d..41a2f9cc1f 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 @@ -3074,7 +3074,7 @@ public interface ApiService { * 问题评论(回答)列表 */ @GET("bbses/questions/{question_id}/comments") - Observable> getQuestionComment(@Path("question_id") String questionId, @Query("sort") String type, @Query("page") int page); + Observable> getQuestionComment(@Path("question_id") String questionId, @Query("sort") String type, @Query("page") int page, @QueryMap Map params); /** * 对社区问题发布评论(回答) From f8d73772368effe6519cf31f0f043733bc610550 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Mon, 7 Jun 2021 18:45:43 +0800 Subject: [PATCH 37/61] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=96=B0=E7=A4=BE?= =?UTF-8?q?=E5=8C=BA-=E6=B4=BB=E5=8A=A8Tab?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/constant/Constants.java | 4 + .../java/com/gh/common/util/DirectUtils.kt | 15 +++ .../gamecenter/entity/ForumActivityEntity.kt | 40 +++++++ .../forum/home/CommunityHomeFragment.kt | 6 +- .../forum/home/ForumActivityAdapter.kt | 113 ++++++++++++++++++ .../forum/home/ForumActivityFragment.kt | 83 +++++++++++++ .../forum/home/ForumActivityViewModel.kt | 48 ++++++++ .../forum/home/ForumArticleListFragment.kt | 2 - .../forum/home/ForumArticleListViewModel.kt | 4 + .../retrofit/service/ApiService.java | 14 +++ .../res/color/forum_category_selector.xml | 5 + .../bg_forum_activity_status_blue.webp | Bin 0 -> 838 bytes .../bg_forum_activity_status_gray.webp | Bin 0 -> 732 bytes .../drawable/bg_forum_category_selected.xml | 7 ++ .../drawable/bg_forum_category_unselect.xml | 7 ++ .../selector_bg_forum_activity_category.xml | 7 ++ .../main/res/layout/forum_activity_item.xml | 83 +++++++++++++ .../res/layout/fragment_forum_activity.xml | 51 ++++++++ .../layout_forum_activity_category_item.xml | 14 +++ 19 files changed, 500 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/entity/ForumActivityEntity.kt create mode 100644 app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityAdapter.kt create mode 100644 app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityFragment.kt create mode 100644 app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityViewModel.kt create mode 100644 app/src/main/res/color/forum_category_selector.xml create mode 100644 app/src/main/res/drawable-xxxhdpi/bg_forum_activity_status_blue.webp create mode 100644 app/src/main/res/drawable-xxxhdpi/bg_forum_activity_status_gray.webp create mode 100644 app/src/main/res/drawable/bg_forum_category_selected.xml create mode 100644 app/src/main/res/drawable/bg_forum_category_unselect.xml create mode 100644 app/src/main/res/drawable/selector_bg_forum_activity_category.xml create mode 100644 app/src/main/res/layout/forum_activity_item.xml create mode 100644 app/src/main/res/layout/fragment_forum_activity.xml create mode 100644 app/src/main/res/layout/layout_forum_activity_category_item.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 7e335dd8e9..935745f26a 100644 --- a/app/src/main/java/com/gh/common/constant/Constants.java +++ b/app/src/main/java/com/gh/common/constant/Constants.java @@ -318,6 +318,10 @@ public class Constants { public static final String WITHDRAW_INFO_ADDRESS_DEV = "https://static-web.ghzs.com/shop-dev/index.html#/cash?from=ghzs"; public static final String WITHDRAW_INFO_ADDRESS = "https://static-web.ghzs.com/shop/index.html#/cash?from=ghzs"; + // 活动详情 + public static final String ACTIVITY_DETAIL_ADDRESS_DEV = "https://static-web.ghzs.com/ghzs_activity_dev/common.html?from=ghzs"; + public static final String ACTIVITY_DETAIL_ADDRESS = "https://static-web.ghzs.com/ghzs_activity_prod/common.html?from=ghzs"; + //最少需要多少数据才能上传 public static final int DATA_AMOUNT = 20; 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 54b04c3dd7..b7b57b6d72 100644 --- a/app/src/main/java/com/gh/common/util/DirectUtils.kt +++ b/app/src/main/java/com/gh/common/util/DirectUtils.kt @@ -1461,4 +1461,19 @@ object DirectUtils { url = String.format(Locale.CHINA, "%s×tamp=%d", url, (Date().time / 1000 / 1000.toFloat()).roundToInt()) directToFullScreenWebPage(context, url, true) } + + /** + * 跳转至活动详情 + */ + @JvmStatic + fun directToActivityDetail(context: Context, activityId: String, entrance: String) { + var url: String = if (isPublishEnv()) { + Constants.ACTIVITY_DETAIL_ADDRESS + } else { + Constants.ACTIVITY_DETAIL_ADDRESS + } + + url = String.format(Locale.CHINA, "%s&id=%s×tamp=%d", url, activityId, (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/entity/ForumActivityEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/ForumActivityEntity.kt new file mode 100644 index 0000000000..56f361d081 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/entity/ForumActivityEntity.kt @@ -0,0 +1,40 @@ +package com.gh.gamecenter.entity + +import com.google.gson.annotations.SerializedName + +data class ForumActivityCategoryEntity( + @SerializedName("_id") + var id: String = "", + var name: String = "" +) + +data class ForumActivityEntity( + @SerializedName("_id") + val id: String = "", + val title: String = "", + @SerializedName("tag_activity_id") + val activityId: String = "", //活动标签ID + @SerializedName("tag_activity_name") + val activityName: String = "", //活动标签名 + @SerializedName("game_id") + val gameId: String = "", + @SerializedName("game_name") + val gameName: String = "", + @SerializedName("effect_time") + val effectTime: ActivityTime = ActivityTime(), + @SerializedName("award_time") + val awardTime: ActivityTime = ActivityTime(), + val image: ActivityImage = ActivityImage(), + val name: String = "", + val unread: Boolean = false +) { + + data class ActivityTime( + val start: Long = 0, + val end: Long = 0 + ) + + data class ActivityImage( + val cover: String = "" + ) +} \ 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 d9e821ce6c..209dd4e804 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 @@ -33,7 +33,7 @@ class CommunityHomeFragment : LazyFragment() { private var mBinding: FragmentCommunityHomeBinding? = null private var mFragmentList = arrayListOf() - private var mTitleList = arrayListOf("推荐", "论坛") + private var mTitleList = arrayListOf("推荐", "论坛", "活动") private var mTabList = arrayListOf() override fun getRealLayoutId(): Int { @@ -85,6 +85,10 @@ class CommunityHomeFragment : LazyFragment() { ?: ForumFragment().with(bundleOf(EntranceUtils.KEY_ENTRANCE to "社区")) mFragmentList.add(forumFragment) + val activityFragment = childFragmentManager.findFragmentByTag("${tag}2") + ?: ForumActivityFragment().with(bundleOf(EntranceUtils.KEY_ENTRANCE to "活动")) + mFragmentList.add(activityFragment) + viewPager.run { offscreenPageLimit = mFragmentList.size adapter = FragmentAdapter(childFragmentManager, mFragmentList, mTitleList) 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 new file mode 100644 index 0000000000..8769eac174 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityAdapter.kt @@ -0,0 +1,113 @@ +package com.gh.gamecenter.forum.home + +import android.content.Context +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import androidx.recyclerview.widget.RecyclerView +import com.gh.base.BaseRecyclerViewHolder +import com.gh.common.constant.ItemViewType +import com.gh.common.exposure.time.TimeUtil +import com.gh.common.util.* +import com.gh.gamecenter.R +import com.gh.gamecenter.adapter.viewholder.FooterViewHolder +import com.gh.gamecenter.baselist.ListAdapter +import com.gh.gamecenter.databinding.ForumActivityItemBinding +import com.gh.gamecenter.entity.ForumActivityEntity + +class ForumActivityAdapter(context: Context, + val mViewModel: ForumActivityViewModel, + val mEntrance: String) : ListAdapter(context) { + + override fun getItemViewType(position: Int): Int { + if (position == itemCount - 1) return ItemViewType.ITEM_FOOTER + return ItemViewType.ITEM_BODY + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return when (viewType) { + ItemViewType.ITEM_FOOTER -> { + val view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false) + FooterViewHolder(view) + } + + else -> { + ForumActivityViewHolder(DataBindingUtil.inflate(mLayoutInflater, R.layout.forum_activity_item, parent, false)) + } + } + } + + override fun getItemCount(): Int { + return if (mEntityList.isNotEmpty()) mEntityList.size + FOOTER_ITEM_COUNT else 0 + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is ForumActivityViewHolder -> { + holder.binding.run { + val activityEntity = mEntityList[position] + entity = activityEntity + executePendingBindings() + + line.goneIf(position == 0) + + var status = "" + val currentTime = TimeUtil.currentTime() + when { + // 进行中 + currentTime > activityEntity.effectTime.start + && (currentTime < activityEntity.effectTime.end + || activityEntity.effectTime.end == null + || activityEntity.effectTime.end == 0L) -> { + status = "进行中" + statusTv.text = "进行中" + statusTv.setTextColor(R.color.theme_font.toColor()) + statusTv.setBackgroundResource(R.drawable.bg_forum_activity_status_blue) + if (activityEntity.effectTime.end == null || activityEntity.effectTime.end == 0L) { + timeTv.text = "长期有效" + } else { + val startTime = TimeUtils.getFormatTime(activityEntity.effectTime.start, "yyyy.MM.dd") + val endTime = TimeUtils.getFormatTime(activityEntity.effectTime.end, "yyyy.MM.dd") + timeTv.text = "$startTime 至 $endTime" + } + } + + // 奖励发放中 + currentTime > activityEntity.awardTime.start + && currentTime < activityEntity.awardTime.end -> { + status = "发放中" + statusTv.text = "发放中" + statusTv.setTextColor(R.color.theme_font.toColor()) + statusTv.setBackgroundResource(R.drawable.bg_forum_activity_status_blue) + val startTime = TimeUtils.getFormatTime(activityEntity.awardTime.start, "yyyy.MM.dd") + val endTime = TimeUtils.getFormatTime(activityEntity.awardTime.end, "yyyy.MM.dd") + timeTv.text = "$startTime 至 $endTime" + } + + // 已结束 + else -> { + status = "已结束" + statusTv.text = "已结束" + statusTv.setTextColor(R.color.white.toColor()) + statusTv.setBackgroundResource(R.drawable.bg_forum_activity_status_gray) + val startTime = TimeUtils.getFormatTime(activityEntity.effectTime.start, "yyyy.MM.dd") + val endTime = TimeUtils.getFormatTime(activityEntity.effectTime.end, "yyyy.MM.dd") + timeTv.text = "$startTime 至 $endTime" + } + } + + root.setOnClickListener { + if (status == "发放中") ToastUtils.toast("活动奖励发放中~") + if (status == "已结束") ToastUtils.toast("活动已结束~") + DirectUtils.directToActivityDetail(mContext, activityEntity.id, mEntrance) + } + } + } + + is FooterViewHolder -> { + holder.initFooterViewHolder(mViewModel, mIsLoading, mIsNetworkError, mIsOver) + } + } + } + + inner class ForumActivityViewHolder(val binding: ForumActivityItemBinding): BaseRecyclerViewHolder(binding.root) +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityFragment.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityFragment.kt new file mode 100644 index 0000000000..1a0d16496b --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityFragment.kt @@ -0,0 +1,83 @@ +package com.gh.gamecenter.forum.home + +import android.view.View +import android.view.ViewGroup +import android.widget.CheckedTextView +import com.gh.common.util.dip2px +import com.gh.common.util.observeNonNull +import com.gh.common.util.viewModelProvider +import com.gh.gamecenter.R +import com.gh.gamecenter.baselist.LazyListFragment +import com.gh.gamecenter.databinding.FragmentForumActivityBinding +import com.gh.gamecenter.databinding.LayoutForumActivityCategoryItemBinding +import com.gh.gamecenter.entity.ForumActivityCategoryEntity +import com.gh.gamecenter.entity.ForumActivityEntity +import com.google.android.flexbox.FlexboxLayout + +class ForumActivityFragment: LazyListFragment() { + + private var mBinding: FragmentForumActivityBinding? = null + private var mAdapter: ForumActivityAdapter? = null + + override fun getRealLayoutId() = R.layout.fragment_forum_activity + + override fun provideListAdapter() = + mAdapter ?: ForumActivityAdapter(requireContext(), mListViewModel, "论坛-活动").apply { mAdapter = this } + + override fun provideListViewModel(): ForumActivityViewModel { + return viewModelProvider() + } + + override fun onRealLayoutInflated(inflatedView: View) { + mBinding = FragmentForumActivityBinding.bind(inflatedView) + } + + override fun initRealView() { + super.initRealView() + + mListViewModel.categories.observeNonNull(viewLifecycleOwner) { + initCategoryView(ArrayList(it)) + } + } + + override fun getItemDecoration() = null + + private fun initCategoryView(list: ArrayList) { + if (list.isEmpty()) return + + mBinding?.categoryContainer?.visibility = View.VISIBLE + + list.add(0, ForumActivityCategoryEntity(id = "all", name = "全部")) + list.forEachIndexed { index, entity -> + val binding = LayoutForumActivityCategoryItemBinding.inflate(layoutInflater).apply { + val params = FlexboxLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT) + params.setMargins(0, 8F.dip2px(), 8F.dip2px(), 0) + params.height = 24F.dip2px() + root.layoutParams = params + + name.text = entity.name + name.isChecked = index == 0 + root.setOnClickListener { + updateCategory(index, entity) + } + } + + mBinding?.categoryContainer?.addView(binding.root) + } + } + + private fun updateCategory(index: Int, entity: ForumActivityCategoryEntity) { + updateCategoryView(index) + mListViewModel.categoryId = entity.id + onRefresh() + } + + private fun updateCategoryView(index: Int) { + mBinding?.categoryContainer?.run { + for (i in 0 until childCount) { + val categoryView = getChildAt(i) as CheckedTextView + categoryView.isChecked = index == i + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityViewModel.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityViewModel.kt new file mode 100644 index 0000000000..dc5fb1af9e --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumActivityViewModel.kt @@ -0,0 +1,48 @@ +package com.gh.gamecenter.forum.home + +import android.annotation.SuppressLint +import android.app.Application +import androidx.lifecycle.MutableLiveData +import com.gh.common.util.UrlFilterUtils +import com.gh.common.util.singleToMain +import com.gh.gamecenter.baselist.ListViewModel +import com.gh.gamecenter.entity.ForumActivityCategoryEntity +import com.gh.gamecenter.entity.ForumActivityEntity +import com.gh.gamecenter.retrofit.BiResponse +import com.gh.gamecenter.retrofit.RetrofitManager +import io.reactivex.Single + +class ForumActivityViewModel(application: Application) : ListViewModel(application) { + + var categoryId = "all" + var categories = MutableLiveData>() + + init { + getActivityCategories() + } + + @SuppressLint("CheckResult") + fun getActivityCategories() { + RetrofitManager.getInstance(getApplication()) + .api + .forumActivityCategories + .compose(singleToMain()) + .subscribe(object : BiResponse>() { + override fun onSuccess(data: List) { + categories.postValue(data) + } + }) + } + + override fun provideDataObservable(page: Int) = null + + override fun provideDataSingle(page: Int): Single> { + return RetrofitManager.getInstance(getApplication()) + .api.getForumActivities(UrlFilterUtils.getFilterQuery("category_id", categoryId), page) + } + + override fun mergeResultLiveData() { + mResultLiveData.addSource(mListLiveData) { mResultLiveData.postValue(it) } + } + +} \ No newline at end of file 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 7d3a3d2112..652535e672 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 @@ -46,8 +46,6 @@ class ForumArticleListFragment : LazyListFragment() var sort: String = "time.comment"//排序 time.edit 最新发布 time.comment 最新回复 + init { + getRecordForums() + } + override fun provideDataObservable(page: Int): Observable>? { return RetrofitManager.getInstance(getApplication()) .api.getForumRecommendsArticle(UrlFilterUtils.getFilterQuery(sort, "-1"), page) 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 41a2f9cc1f..fb10a3a504 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 @@ -21,6 +21,8 @@ import com.gh.gamecenter.entity.ConcernEntity; import com.gh.gamecenter.entity.DeviceDialogEntity; import com.gh.gamecenter.entity.EnergyTaskCompleteEntity; import com.gh.gamecenter.entity.FollowersOrFansEntity; +import com.gh.gamecenter.entity.ForumActivityCategoryEntity; +import com.gh.gamecenter.entity.ForumActivityEntity; import com.gh.gamecenter.entity.ForumCategoryEntity; import com.gh.gamecenter.entity.ForumDetailEntity; import com.gh.gamecenter.entity.ForumEntity; @@ -3130,4 +3132,16 @@ public interface ApiService { */ @POST("bbses/questions/{question_id}/comments/{comment_id}:unset-top") Observable postQuestionCommentUnTop(@Path("question_id") String questionId, @Path("comment_id") String commentId); + + /** + * 获取社区活动分类列表 + */ + @GET("videos/activities/category") + Single> getForumActivityCategories(); + + /** + * 获取社区活动列表 + */ + @GET("videos/activities") + Single> getForumActivities(@Query("filter") String filter, @Query("page") int page); } \ No newline at end of file diff --git a/app/src/main/res/color/forum_category_selector.xml b/app/src/main/res/color/forum_category_selector.xml new file mode 100644 index 0000000000..fafdf93fce --- /dev/null +++ b/app/src/main/res/color/forum_category_selector.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-xxxhdpi/bg_forum_activity_status_blue.webp b/app/src/main/res/drawable-xxxhdpi/bg_forum_activity_status_blue.webp new file mode 100644 index 0000000000000000000000000000000000000000..29486af370f81628eb8d4670115759af45ab7a8d GIT binary patch literal 838 zcmV-M1G)TCNk&FK0{{S5MM6+kP&il$0000G0002D001`t06|PpNG1UQ00Do(ux;D0 zxk|RPMMOLhh-vgY$GkJ1`_G*>?K0W2bEhrdLann15dn~7+g6>NxVz#W$06?SZ~o&U zyr0%?NA!OJWa%r`o5Pi%JpM1*SQ^ytr~IY0fqi!(+BUe8e^L{Jd+w4HofzIrCfs*H^qq}Cp*=o-|I>`S1Y9r)Xv@(vW8P}&8YC^do9k@IMq zQRNKsm)3+X&mlz{OFYN$c_d%4-W;yT^kolLP&gp+0RRB-4*;D3D!2eR06sAoi$kIz zp%T6P03ZVdvw%whru$$VflduZ4?qr*y6R7e*CG7R@&i4-IUnS@Cz^-9yZxYhGkGBR zSNhMm2k=kh|JuJ+zvzE-`jpaCb_MV&W@x&8GlUrVs$0Y^m!DebSUEg z12Q*lDvh@G>J^PMPoAD1Z|%K&|IiHv-I$-DWoz#$eQFt>+!@$iY$ z>?$IY-d(WL{AnA`LBqepU!8&W49!5U(CeQU-^Bl7d(|8!u$iS0trR2QSp2el+Z|g< zit9DZyl{S(@M>XARML|efM6{v0Rt9Ed)mY`)V|Vrh({iV*ylX;Nq)9gafLye2M|S) zry%i%%sb;X&q`xS`|b@NNUK;MQMlP?!@CaLjmlnP*Bs%goj*F#lF&kwcTQJI`Jx*& zjqyyGQK!C(68z^o){NiT(;f?=kuKg6ql~!tO$~NDdYwX^{yjB4^TgtlQ9@8aq_mC4 Qt4Q>XGho2I*Z=?k0FQy0!vFvP literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/bg_forum_activity_status_gray.webp b/app/src/main/res/drawable-xxxhdpi/bg_forum_activity_status_gray.webp new file mode 100644 index 0000000000000000000000000000000000000000..f57479b90f4a022f4de07b07beebaf8dbeb49534 GIT binary patch literal 732 zcmV<20weuWNk&H00ssJ4MM6+kP&il$0000G0002D001`t06|PpNG1UQ00Do(ux;D0 zxk|RPMMOLhh-vgY$GkJ1`_G*>?K0W2bEhrdLann15dn~7+g6>NxVz#W$06?SZ~o&U zyr0%?NA!OJWa%r`o5Pi%JpM1*SQ^ytr~IY0fqi!(+BUe8e^L{Jd+w4HofzIrCfs*H^qq}Cp*=o-|I>`S1Y9r)Xv@(vW8P}&8YC^do9k@IMq zQRNKsm)3+X&mlz{OFYN$c_d%4-W;yT^kolLP&gon0RR9H4*;D3D!2eR06sAoibJ9y zp%T9Q03ZVdw15fapO9B0{FgFLFt&-`0$=LBg+HqOz^y)Uqah)fC__#M&3rHAEA~^P!)~j3CrIm~dQaP8-t0HHGK*Hy^<$EZ zh;?Gw-&ZAo0RI2j{-0m|E&s7Y*x*X?ZY1}?PC6%4yPNfhR1~PS`B&Pcj%)azg{2L7 zn%mrU30P~}VIl-)KLh_SCNh@aJLqZpL<_-4i|vTd+BfXWaGm5eCIFJ9VU~RBamgi9 z$)F3p|D|NcnjtGGW74l?kN!~(t~FSr&`lcg8~$qwQM8M#UJM%RSGnIu!9$E|mX+?MmutfC~6Dfw*c7OPouv Oqs;>rfjZ7ShyVZ*Q)Alz literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/bg_forum_category_selected.xml b/app/src/main/res/drawable/bg_forum_category_selected.xml new file mode 100644 index 0000000000..0ab8d3be01 --- /dev/null +++ b/app/src/main/res/drawable/bg_forum_category_selected.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_forum_category_unselect.xml b/app/src/main/res/drawable/bg_forum_category_unselect.xml new file mode 100644 index 0000000000..834a7cf6aa --- /dev/null +++ b/app/src/main/res/drawable/bg_forum_category_unselect.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_bg_forum_activity_category.xml b/app/src/main/res/drawable/selector_bg_forum_activity_category.xml new file mode 100644 index 0000000000..70b14ba06f --- /dev/null +++ b/app/src/main/res/drawable/selector_bg_forum_activity_category.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/forum_activity_item.xml b/app/src/main/res/layout/forum_activity_item.xml new file mode 100644 index 0000000000..abd7e21f15 --- /dev/null +++ b/app/src/main/res/layout/forum_activity_item.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_forum_activity.xml b/app/src/main/res/layout/fragment_forum_activity.xml new file mode 100644 index 0000000000..55550afaeb --- /dev/null +++ b/app/src/main/res/layout/fragment_forum_activity.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_forum_activity_category_item.xml b/app/src/main/res/layout/layout_forum_activity_category_item.xml new file mode 100644 index 0000000000..f0bc95b6bf --- /dev/null +++ b/app/src/main/res/layout/layout_forum_activity_category_item.xml @@ -0,0 +1,14 @@ + + + \ No newline at end of file From 3805cb52f6a2c736fe7edd61fc3bed238cae0c8b Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Mon, 7 Jun 2021 21:38:07 +0800 Subject: [PATCH 38/61] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AE=BA=E5=9D=9B?= =?UTF-8?q?=E6=8F=92=E5=85=A5=E8=A7=86=E9=A2=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/base/BaseRichEditorActivity.kt | 17 ++- .../com/gh/base/BaseRichEditorViewModel.kt | 4 +- .../qa/editor/FullScreenVideoView.kt | 37 +++--- ...yout_full_screen_detail_video_portrait.xml | 124 ++++++++++++++++++ 4 files changed, 159 insertions(+), 23 deletions(-) create mode 100644 app/src/main/res/layout/layout_full_screen_detail_video_portrait.xml diff --git a/app/src/main/java/com/gh/base/BaseRichEditorActivity.kt b/app/src/main/java/com/gh/base/BaseRichEditorActivity.kt index 7e1a83ec30..66b9293c92 100644 --- a/app/src/main/java/com/gh/base/BaseRichEditorActivity.kt +++ b/app/src/main/java/com/gh/base/BaseRichEditorActivity.kt @@ -31,12 +31,11 @@ import com.gh.gamecenter.qa.entity.ArticleEntity import com.gh.gamecenter.qa.entity.EditorInsertEntity import com.gh.gamecenter.video.poster.PosterEditActivity import com.gh.gamecenter.video.upload.UploadManager +import com.google.gson.JsonObject import com.halo.assistant.HaloApp import com.lightgame.utils.Util_System_Keyboard import com.lightgame.utils.Utils import com.lightgame.view.CheckableImageView -import com.zhihu.matisse.Matisse -import com.zhihu.matisse.MimeType import kotterknife.bindView import org.json.JSONArray import org.json.JSONObject @@ -524,8 +523,18 @@ abstract class BaseRichEditorActivity : ToolBarAct mRichEditor.updateVideoProgress(id, progress) } - override fun videoUploadFinished(id: String, url: String, msg: String) { - mRichEditor.videoUploadFinished(id, url, msg) + override fun videoUploadFinished(id: String, url: String, msg: JsonObject) { + try { + val obj = JSONObject() + obj.put("poster", msg.get("poster").asString) + obj.put("url", msg.get("url").asString) + obj.put("duration", RichEditor.formatVideoDuration(msg.get("length").asLong / 1000)) + obj.put("id", msg.get("_id").asString) + obj.put("status", "pending") + mRichEditor.videoUploadFinished(id, url, obj.toString()) + } catch (e: java.lang.Exception) { + e.printStackTrace() + } } override fun changePoster(id: String, poster: String) { diff --git a/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt b/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt index feb6e726aa..b5720bb6d1 100644 --- a/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt +++ b/app/src/main/java/com/gh/base/BaseRichEditorViewModel.kt @@ -283,7 +283,7 @@ abstract class BaseRichEditorViewModel(application: Application) : AndroidViewMo private fun uploadSuccess(poster: String, url: String, data: JsonObject) { currentUploadingVideo?.let { mUploadVideoListener?.changePoster(it.id, poster) - mUploadVideoListener?.videoUploadFinished(it.id, url, data.toString()) + mUploadVideoListener?.videoUploadFinished(it.id, url, data) UploadManager.cancelTask(it.filePath) localVideoList.remove(it) } @@ -329,7 +329,7 @@ interface UploadVideoListener { /** * 上传视频完成 */ - fun videoUploadFinished(id: String, url: String, msg: String) + fun videoUploadFinished(id: String, url: String, msg: JsonObject) /** * 更换封面图 diff --git a/app/src/main/java/com/gh/gamecenter/qa/editor/FullScreenVideoView.kt b/app/src/main/java/com/gh/gamecenter/qa/editor/FullScreenVideoView.kt index e69f86e741..28770174f0 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/editor/FullScreenVideoView.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/editor/FullScreenVideoView.kt @@ -13,6 +13,7 @@ import android.view.View import android.widget.ImageView import android.widget.SeekBar import androidx.core.content.ContextCompat +import com.facebook.drawee.view.SimpleDraweeView import com.gh.common.constant.Constants import com.gh.common.observer.MuteCallback import com.gh.common.observer.VolumeObserver @@ -25,7 +26,6 @@ import com.shuyu.gsyvideoplayer.utils.NetworkUtils import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer import com.shuyu.gsyvideoplayer.video.base.GSYVideoView import com.shuyu.gsyvideoplayer.video.base.GSYVideoViewBridge -import com.squareup.picasso.Picasso import io.reactivex.disposables.Disposable import kotlinx.android.synthetic.main.layout_game_detail_video_portrait.view.* import kotlinx.android.synthetic.main.piece_video_control.view.* @@ -40,6 +40,7 @@ class FullScreenVideoView @JvmOverloads constructor(context: Context, attrs: Att private var mVideoIsMuted = false val backBtn = findViewById(R.id.back) var uuid = UUID.randomUUID().toString() + var thumbImage: SimpleDraweeView = findViewById(R.id.thumbImage) init { post { @@ -89,26 +90,28 @@ class FullScreenVideoView @JvmOverloads constructor(context: Context, attrs: Att //这个必须配置最上面的构造才能生效 override fun getLayoutId(): Int { - return R.layout.layout_game_detail_video_portrait + return R.layout.layout_full_screen_detail_video_portrait } fun observeVolume(activity: Activity?) { - activity?.applicationContext?.contentResolver?.registerContentObserver( - android.provider.Settings.System.CONTENT_URI, true, mVolumeObserver) + tryWithDefaultCatch { + activity?.applicationContext?.contentResolver?.registerContentObserver( + android.provider.Settings.System.CONTENT_URI, true, mVolumeObserver) - activity?.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks { - override fun onActivityPaused(activity: Activity) { - activity.applicationContext?.contentResolver?.unregisterContentObserver(mVolumeObserver) - activity.unregisterActivityLifecycleCallbacks(this) - } + activity?.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks { + override fun onActivityPaused(activity: Activity) { + activity.applicationContext?.contentResolver?.unregisterContentObserver(mVolumeObserver) + activity.unregisterActivityLifecycleCallbacks(this) + } - override fun onActivityStarted(activity: Activity) {} - override fun onActivityDestroyed(activity: Activity) {} - override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} - override fun onActivityStopped(activity: Activity) {} - override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {} - override fun onActivityResumed(activity: Activity) {} - }) + override fun onActivityStarted(activity: Activity) {} + override fun onActivityDestroyed(activity: Activity) {} + override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {} + override fun onActivityStopped(activity: Activity) {} + override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {} + override fun onActivityResumed(activity: Activity) {} + }) + } } fun startPlayLogic(isAutoPlay: Boolean) { @@ -188,7 +191,7 @@ class FullScreenVideoView @JvmOverloads constructor(context: Context, attrs: Att } 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/res/layout/layout_full_screen_detail_video_portrait.xml b/app/src/main/res/layout/layout_full_screen_detail_video_portrait.xml new file mode 100644 index 0000000000..cca446da1f --- /dev/null +++ b/app/src/main/res/layout/layout_full_screen_detail_video_portrait.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 576f06f25076a433e5c16742211044aec7dfb5df Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Tue, 8 Jun 2021 10:03:36 +0800 Subject: [PATCH 39/61] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9=E8=AE=BA=E5=9D=9B?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B5=E5=88=97=E8=A1=A8=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=AF=B9=E9=97=AE=E9=A2=98=202.?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BA=E5=9D=9B=E4=BF=A1=E6=81=AF=E6=B5=81?= =?UTF-8?q?=E5=B7=A6=E4=B8=8B=E8=A7=92=E5=AF=B9=E5=BA=94=E8=AE=BA=E5=9D=9B?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=87=BA=E6=9D=A5?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gh/common/databind/BindingAdapters.java | 7 +++++++ .../gamecenter/forum/home/ForumArticleAskItemViewHolder.kt | 1 - .../main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt | 1 - app/src/main/res/layout/community_answer_item.xml | 4 ++-- app/src/main/res/layout/user_history_item.xml | 4 ++-- 5 files changed, 11 insertions(+), 6 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 9cd5aa0f33..bb165a6414 100644 --- a/app/src/main/java/com/gh/common/databind/BindingAdapters.java +++ b/app/src/main/java/com/gh/common/databind/BindingAdapters.java @@ -336,6 +336,13 @@ public class BindingAdapters { } } + @BindingAdapter("gameIcon") + public static void setGameIcon(View view, GameEntity gameEntity) { + if (gameEntity != null && view instanceof GameIconView) { + ((GameIconView) view).displayGameIcon(gameEntity.getIcon(), gameEntity.getIconSubscript()); + } + } + @BindingAdapter("articleType") public static void setArticleType(TextView view, String articleType) { NewsUtils.setNewsType(view, articleType, 0, 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 d78df285b8..2c2a11d9ff 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 @@ -14,7 +14,6 @@ import com.gh.gamecenter.entity.ForumVideoEntity import com.gh.gamecenter.forum.detail.ForumDetailActivity import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.qa.answer.BaseAnswerOrArticleItemViewHolder -import com.gh.gamecenter.qa.answer.edit.AnswerEditActivity import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.qa.entity.AnswerEntity import com.gh.gamecenter.qa.entity.ArticleEntity diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt index 515cef3481..b99e49876f 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt @@ -38,7 +38,6 @@ class AnswerEntity() : Parcelable { @SerializedName("sequence_id") var sequenceId: String? = null - @SerializedName("brief", alternate = ["content"]) var brief: String? = null @SerializedName("title") diff --git a/app/src/main/res/layout/community_answer_item.xml b/app/src/main/res/layout/community_answer_item.xml index e3e98774dc..58ff446464 100644 --- a/app/src/main/res/layout/community_answer_item.xml +++ b/app/src/main/res/layout/community_answer_item.xml @@ -335,12 +335,12 @@ android:orientation="horizontal" android:background="@drawable/bg_shape_f5_radius_999"> - + gameIcon="@{entity.bbs.game.toGameEntity()}" /> - + gameIcon="@{entity.community.game.toGameEntity()}" /> Date: Tue, 8 Jun 2021 10:15:12 +0800 Subject: [PATCH 40/61] =?UTF-8?q?=E4=BF=AE=E6=94=B9ImageUtils=E4=B8=8D?= =?UTF-8?q?=E8=83=BD=E5=8A=A0=E8=BD=BD=E8=A7=86=E9=A2=91=E7=AC=AC=E4=B8=80?= =?UTF-8?q?=E5=B8=A7=E7=9A=84=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/util/ImageUtils.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 96e58629f7..8ee07ee132 100644 --- a/app/src/main/java/com/gh/common/util/ImageUtils.kt +++ b/app/src/main/java/com/gh/common/util/ImageUtils.kt @@ -91,7 +91,7 @@ object ImageUtils { val jpegConfig = Config.getSettings()?.image?.oss?.jpeg val webpConfig = Config.getSettings()?.image?.oss?.webp ?: Config.getSettings()?.image?.oss?.gif - if (jpegConfig != null) { + if (imageUrl?.contains("?x-oss-process") == false && jpegConfig != null) { return if (width == 0 || width == null) { "$imageUrl$webpConfig" } else { From 86f2aec9ca7cdfef16851683b0fcb292616d6848 Mon Sep 17 00:00:00 2001 From: juntao Date: Tue, 8 Jun 2021 15:28:26 +0800 Subject: [PATCH 41/61] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=A4=BE=E5=8C=BA?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E5=88=86=E4=BA=AB=E6=97=A5=E5=BF=97=E4=B8=8A?= =?UTF-8?q?=E6=8A=A5=E4=B8=A2=E5=A4=B1=E7=9A=84=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/util/ShareUtils.java | 53 ++++++++++------- .../qa/dialog/MoreFunctionPanelDialog.kt | 57 +++++++------------ 2 files changed, 53 insertions(+), 57 deletions(-) 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 97a4616c03..621176e9af 100644 --- a/app/src/main/java/com/gh/common/util/ShareUtils.java +++ b/app/src/main/java/com/gh/common/util/ShareUtils.java @@ -409,6 +409,11 @@ public class ShareUtils { //QQ分享 public void qqShare() { Utils.toast(mContext, R.string.share_skip); + + mShareType = ShareType.qq; + shareType = "qq_friend"; + LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); + Bundle params = new Bundle(); switch (mShareEntrance) { @@ -445,6 +450,10 @@ public class ShareUtils { public void wechatShare() { Utils.toast(mContext, R.string.share_skip); + shareType = "wechat_friend"; + mShareType = ShareType.wechat; + LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); + if (!PackageHelper.INSTANCE.getLocalPackageNameSet().contains("com.tencent.mm")) { Utils.toast(mContext, "没安装微信,分享失败"); return; @@ -561,6 +570,12 @@ public class ShareUtils { //QQ空间分享 public void qZoneShare() { Utils.toast(mContext, R.string.share_skip); + + mShareType = ShareType.qqZone; + shareType = "qq_zone"; + MtaHelper.onEvent("内容分享", "QQ空间", mTitle); + LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); + Bundle params = new Bundle(); switch (mShareEntrance) { @@ -601,6 +616,10 @@ public class ShareUtils { public void wechatMomentsShare() { Utils.toast(mContext, R.string.share_skip); + mShareType = ShareType.wechatMoments; + shareType = "wechat_moment"; + LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); + if (!PackageHelper.INSTANCE.getLocalPackageNameSet().contains("com.tencent.mm")) { Utils.toast(mContext, "没安装微信,分享失败"); return; @@ -642,6 +661,10 @@ public class ShareUtils { //新浪微博分享 public void sinaWeiboShare() { + mShareType = ShareType.weibo; + 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) { @@ -668,6 +691,10 @@ public class ShareUtils { //短信分享 public void shortMessageShare() { + mShareType = ShareType.weibo; + shareType = "sms"; + LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); + String smsBody; switch (mShareEntrance) { case news: @@ -714,6 +741,7 @@ public class ShareUtils { public void copyLink(String copyContent) { shareType = "copy_link"; LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); + LogUtils.uploadShareResult(shareType, shareEntrance.getName(), "success", shareUrl, mTitle, mSummary, resourceId); if (mShareEntrance != ShareEntrance.shareGh) { ExtensionsKt.copyTextAndToast(copyContent, "复制成功"); safelyDismiss(); @@ -745,50 +773,34 @@ public class ShareUtils { holder.shareLogo.setImageResource(arrLogo[position]); holder.shareLabel.setText(arrLabel[position]); holder.itemView.setOnClickListener(v -> { - if (mShareEntrance == ShareEntrance.shareGh) { - MtaHelper.onEvent("我的光环_新", "分享光环", arrLabel[position]); - } if (listener != null) { listener.onItemClick(holder.getAdapterPosition()); } switch (holder.getPosition()) { case 0: - shareType = "wechat_friend"; - MtaHelper.onEvent("内容分享", "微信好友", mTitle); - LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); wechatShare(); break; case 1: - shareType = "wechat_moment"; - MtaHelper.onEvent("内容分享", "微信朋友圈", mTitle); - LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); wechatMomentsShare(); break; case 2: - shareType = "qq_friend"; - MtaHelper.onEvent("内容分享", "QQ好友", mTitle); - LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); qqShare(); break; case 3: - shareType = "qq_zone"; - MtaHelper.onEvent("内容分享", "QQ空间", mTitle); - LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); qZoneShare(); break; case 4: - shareType = "sina_weibo"; - MtaHelper.onEvent("内容分享", "新浪微博", mTitle); - LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); sinaWeiboShare(); break; case 5: - MtaHelper.onEvent("内容分享", "短信", mTitle); shortMessageShare(); break; case 6: - MtaHelper.onEvent("内容分享", "复制链接", mTitle); + shareType = "copy_link"; + LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); + LogUtils.uploadShareResult(shareType, shareEntrance.getName(), "success", shareUrl, mTitle, mSummary, resourceId); + if (mShareEntrance == ShareEntrance.askInvite) { copyLink(mTitle + " - 光环助手" + shareUrl); } else if (mShareEntrance == ShareEntrance.askNormal || mShareEntrance == ShareEntrance.answerNormal) { @@ -811,6 +823,7 @@ public class ShareUtils { } else { shareType = "copy_link"; LogUtils.uploadShareType(shareType, shareEntrance.getName(), shareUrl, mTitle, mSummary, resourceId); + LogUtils.uploadShareResult(shareType, shareEntrance.getName(), "success", shareUrl, mTitle, mSummary, resourceId); } break; } 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 0a43590a56..44e5322704 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 @@ -1,14 +1,16 @@ package com.gh.gamecenter.qa.dialog import android.os.Bundle -import android.view.* +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup import android.widget.LinearLayout import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat import androidx.fragment.app.FragmentTransaction import com.gh.common.dialog.BaseDraggableDialogFragment -import com.gh.common.util.MtaHelper import com.gh.common.util.ShareUtils import com.gh.common.util.dip2px import com.gh.gamecenter.R @@ -24,7 +26,11 @@ class MoreFunctionPanelDialog : BaseDraggableDialogFragment() { var shareUtils: ShareUtils? = null var onItemClickCallback: ((menuItem: MenuItemEntity) -> Unit)? = null - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View { binding = DialogGameDetailMoreBinding.inflate(inflater, container, false) return binding.root } @@ -37,37 +43,14 @@ class MoreFunctionPanelDialog : BaseDraggableDialogFragment() { binding.feedbackTv.visibility = View.GONE binding.copyrightTv.visibility = View.GONE - binding.shareWechatTv.setOnClickListener { - shareUtils?.wechatShare() - MtaHelper.onEvent("内容分享", "微信好友", shareUtils?.title) - } - binding.sharePyquanTv.setOnClickListener { - shareUtils?.wechatMomentsShare() - MtaHelper.onEvent("内容分享", "微信朋友圈", shareUtils?.title) - } - binding.shareQqTv.setOnClickListener { - shareUtils?.qqShare() - MtaHelper.onEvent("内容分享", "QQ好友", shareUtils?.title) - } - binding.shareQqzoneTv.setOnClickListener { - shareUtils?.qZoneShare() - MtaHelper.onEvent("内容分享", "QQ空间", shareUtils?.title) - } - binding.shareWeiboTv.setOnClickListener { - shareUtils?.sinaWeiboShare() - MtaHelper.onEvent("内容分享", "新浪微博", shareUtils?.title) - } - binding.shareSmsTv.setOnClickListener { - shareUtils?.shortMessageShare() - MtaHelper.onEvent("内容分享", "短信", shareUtils?.title) - } - binding.copyLinkTv.setOnClickListener { - shareUtils?.copyLink(shareUrl) - MtaHelper.onEvent("内容分享", "复制链接", shareUtils?.title) - } - binding.cancelTv.setOnClickListener { - dismissAllowingStateLoss() - } + binding.shareWechatTv.setOnClickListener { shareUtils?.wechatShare() } + binding.sharePyquanTv.setOnClickListener { shareUtils?.wechatMomentsShare() } + binding.shareQqTv.setOnClickListener { shareUtils?.qqShare() } + binding.shareQqzoneTv.setOnClickListener { shareUtils?.qZoneShare() } + binding.shareWeiboTv.setOnClickListener { shareUtils?.sinaWeiboShare() } + binding.shareSmsTv.setOnClickListener { shareUtils?.shortMessageShare() } + binding.copyLinkTv.setOnClickListener { shareUtils?.copyLink(shareUrl) } + binding.cancelTv.setOnClickListener { dismissAllowingStateLoss() } addActionItem() } @@ -84,15 +67,15 @@ class MoreFunctionPanelDialog : BaseDraggableDialogFragment() { private fun createItemView(itemEntity: MenuItemEntity): View { val params = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT) - params.leftMargin = 16f.dip2px() + params.leftMargin = 16F.dip2px() return TextView(requireContext()).apply { - textSize = 11f + textSize = 11F text = itemEntity.text 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() + compoundDrawablePadding = 8F.dip2px() setCompoundDrawablesWithIntrinsicBounds(null, ContextCompat.getDrawable(requireContext(), itemEntity.normalIcon), null, null) } } From f1c5b80dc29f579c3bc83135fe84a9505c94b6e1 Mon Sep 17 00:00:00 2001 From: juntao Date: Tue, 8 Jun 2021 15:51:10 +0800 Subject: [PATCH 42/61] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=A4=BE=E5=8C=BA?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E6=B5=8F=E8=A7=88=E6=97=A5=E5=BF=97=E4=B8=8A?= =?UTF-8?q?=E6=8A=A5=20https://git.ghzs.com/pm/halo-app-issues/-/issues/12?= =?UTF-8?q?46?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gh/common/util/NewLogUtils.kt | 16 ++++++++++++++++ .../qa/article/detail/ArticleDetailViewModel.kt | 7 +++---- .../newdetail/NewQuestionDetailViewModel.kt | 4 +++- .../qa/video/detail/ForumVideoDetailFragment.kt | 1 - .../qa/video/detail/ForumVideoDetailViewModel.kt | 6 +++--- .../gamecenter/retrofit/service/ApiService.java | 6 ++++++ 6 files changed, 31 insertions(+), 9 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 2338bf2d5a..7870f789e9 100644 --- a/app/src/main/java/com/gh/common/util/NewLogUtils.kt +++ b/app/src/main/java/com/gh/common/util/NewLogUtils.kt @@ -3,7 +3,10 @@ package com.gh.common.util import com.gh.common.json.json import com.gh.common.loghub.LoghubUtils import com.gh.gamecenter.entity.LinkEntity +import com.gh.gamecenter.retrofit.RetrofitManager +import com.halo.assistant.HaloApp import com.lightgame.utils.Utils +import io.reactivex.schedulers.Schedulers import org.json.JSONObject object NewLogUtils { @@ -25,6 +28,19 @@ object NewLogUtils { log(json, "event", false) } + fun logForumContentBrowser(contentId: String, contentType: String) { + val requestBody = hashMapOf( + Pair("content_id", contentId), + Pair("content_type", contentType) + ).createRequestBody() + + RetrofitManager.getInstance(HaloApp.getInstance()) + .api + .postBrowses(requestBody) + .subscribeOn(Schedulers.io()) + .subscribe() + } + private fun log(jsonObject: JSONObject, logStore: String, uploadImmediately: Boolean) { Utils.log("NewLogUtils", jsonObject.toString(4)) LoghubUtils.log(jsonObject, logStore, uploadImmediately) diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailViewModel.kt index 7779e7c779..e144152b05 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailViewModel.kt @@ -7,10 +7,7 @@ import androidx.lifecycle.ViewModelProvider import com.gh.common.syncpage.SyncDataEntity import com.gh.common.syncpage.SyncFieldConstants import com.gh.common.syncpage.SyncPageRepository -import com.gh.common.util.CollectionUtils -import com.gh.common.util.ErrorHelper -import com.gh.common.util.EnergyTaskHelper -import com.gh.common.util.ToastUtils +import com.gh.common.util.* import com.gh.gamecenter.R import com.gh.gamecenter.entity.CommentEntity import com.gh.gamecenter.entity.VoteEntity @@ -66,6 +63,8 @@ class ArticleDetailViewModel(application: Application, commentCount = response?.count?.comment ?: 0 loadResultLiveData.postValue(LoadResult.SUCCESS) mergeListData(mListLiveData.value, displayFloor = true) + + NewLogUtils.logForumContentBrowser(articleId, "bbs_article") } override fun onFailure(e: HttpException?) { 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 ee7f076ad1..22cf5dcb6c 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 @@ -5,6 +5,7 @@ import android.app.Application import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider +import com.gh.common.util.NewLogUtils import com.gh.common.util.ToastUtils import com.gh.common.util.observableToMain import com.gh.common.util.singleToMain @@ -19,7 +20,6 @@ import com.gh.gamecenter.qa.comment.base.BaseCommentViewModel import com.gh.gamecenter.qa.entity.QuestionsDetailEntity import com.gh.gamecenter.retrofit.BiResponse import com.gh.gamecenter.retrofit.Response -import com.gh.gamecenter.retrofit.RetrofitManager import com.lightgame.utils.Utils import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers @@ -49,6 +49,8 @@ class NewQuestionDetailViewModel(application: Application, questionId: String = commentCount = response?.answersCount ?: 0 loadResultLiveData.postValue(LoadResult.SUCCESS) mergeListData(mListLiveData.value, displayFloor = true) + + NewLogUtils.logForumContentBrowser(questionId, "bbs_question") } override fun onFailure(e: HttpException?) { 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 a78d9229dd..1cd82fd80a 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 @@ -5,7 +5,6 @@ import android.content.Context import android.content.Intent import android.graphics.Color import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.MenuItem import android.view.View 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 a188ae35fb..0f983f3472 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,9 +6,9 @@ import android.net.Uri import android.text.TextUtils import androidx.lifecycle.* import com.gh.common.util.ErrorHelper +import com.gh.common.util.NewLogUtils import com.gh.common.util.observableToMain import com.gh.gamecenter.entity.ForumVideoEntity -import com.gh.gamecenter.entity.VideoEntity import com.gh.gamecenter.mvvm.Resource import com.gh.gamecenter.retrofit.BiResponse import com.gh.gamecenter.retrofit.Response @@ -16,8 +16,6 @@ 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 @@ -44,6 +42,8 @@ class ForumVideoDetailViewModel(application: Application, val videoId: String) : super.onResponse(response) if (response != null) { detailLiveData.postValue(Resource.success(response)) + + NewLogUtils.logForumContentBrowser(videoId, "bbs_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 fb10a3a504..db62598137 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 @@ -2106,6 +2106,12 @@ public interface ApiService { @POST("shares") Single postShareResult(@Body RequestBody body); + /** + * 社区内容浏览记录 + */ + @POST("browses") + Single postBrowses(@Body RequestBody body); + /** * 给一个视频新增评论 */ From 31fed948f03a6cd67336c32909dedd8204e1fbd1 Mon Sep 17 00:00:00 2001 From: juntao Date: Tue, 8 Jun 2021 15:54:44 +0800 Subject: [PATCH 43/61] =?UTF-8?q?=E6=9B=B4=E6=8D=A2=E7=A4=BE=E5=8C=BA-?= =?UTF-8?q?=E6=8E=A8=E8=8D=90=E7=9A=84=E6=8E=A5=E5=8F=A3=20https://git.ghz?= =?UTF-8?q?s.com/pm/halo-app-issues/-/issues/1246?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/gamecenter/forum/home/ForumArticleListViewModel.kt | 2 +- .../java/com/gh/gamecenter/retrofit/service/ApiService.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListViewModel.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListViewModel.kt index 7cbdc1d8a9..d12f646349 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListViewModel.kt @@ -31,7 +31,7 @@ class ForumArticleListViewModel(application: Application) : ListViewModel>? { return RetrofitManager.getInstance(getApplication()) - .api.getForumRecommendsArticle(UrlFilterUtils.getFilterQuery(sort, "-1"), page) + .api.getForumRecommends(UrlFilterUtils.getFilterQuery(sort, "-1"), page) } override fun mergeResultLiveData() { 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 db62598137..a775a443d6 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 @@ -2693,8 +2693,8 @@ public interface ApiService { /** * 获取论坛推荐Tab内容 */ - @GET("bbses/recommends/contents") - Observable> getForumRecommendsArticle(@Query("sort") String sort, @Query("page") int page); + @GET("bbses/recommends") + Observable> getForumRecommends(@Query("sort") String sort, @Query("page") int page); /** * 获取论坛详情 From d1183199cd16e1e1f35bd5c740d88fd89725c96b Mon Sep 17 00:00:00 2001 From: juntao Date: Tue, 8 Jun 2021 16:31:30 +0800 Subject: [PATCH 44/61] =?UTF-8?q?=E5=85=A8=E5=B1=80=E6=9B=B4=E6=94=B9?= =?UTF-8?q?=E8=B7=B3=E8=BD=AC=E8=A7=86=E9=A2=91=E8=AF=A6=E6=83=85=E7=9A=84?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=20https://git.ghzs.com/pm/halo-app-issues/-/?= =?UTF-8?q?issues/1254?= 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 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 b7b57b6d72..ed928a9990 100644 --- a/app/src/main/java/com/gh/common/util/DirectUtils.kt +++ b/app/src/main/java/com/gh/common/util/DirectUtils.kt @@ -50,6 +50,7 @@ import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.qa.column.detail.AskColumnDetailActivity import com.gh.gamecenter.qa.questions.detail.QuestionsDetailActivity import com.gh.gamecenter.qa.subject.CommunitySubjectActivity +import com.gh.gamecenter.qa.video.detail.ForumVideoDetailActivity import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager import com.gh.gamecenter.security.BindPhoneActivity @@ -833,7 +834,8 @@ object DirectUtils { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { val bundle = Bundle() bundle.putString(KEY_ENTRANCE, entrance ?: ENTRANCE_BROWSER) - bundle.putString(KEY_TO, VideoDetailActivity::class.java.name) + bundle.putString(KEY_TO, ForumVideoDetailActivity::class.java.name) + bundle.putString(KEY_VIDEO_ID, videoId); bundle.putString(KEY_PATH, path) bundle.putString(KEY_ID, videoId) bundle.putString(KEY_GAMEID, gameId) From b052ba1635ad6c3757cd87123ff179e1882e6e9f Mon Sep 17 00:00:00 2001 From: juntao Date: Tue, 8 Jun 2021 16:34:27 +0800 Subject: [PATCH 45/61] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84=20activity=20=E5=A3=B0=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f4f65152ef..e76111d982 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -559,10 +559,6 @@ android:name=".forum.select.ForumSelectActivity" android:screenOrientation="portrait" /> - - @@ -592,10 +588,6 @@ android:screenOrientation="portrait" android:theme="@style/TransparentStatusBarAndNavigationBar" /> - - From 6e3cb7a196be7fcc32a502487a1a9f37065a8a34 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Tue, 8 Jun 2021 17:39:06 +0800 Subject: [PATCH 46/61] =?UTF-8?q?1.=E8=AE=BA=E5=9D=9B=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=A7=86=E9=A2=91=E8=87=AA=E5=8A=A8=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E5=8A=9F=E8=83=BD=202.=E8=AE=BA=E5=9D=9B=E9=A6=96?= =?UTF-8?q?=E9=A1=B5=E6=90=9C=E7=B4=A2=E9=80=82=E9=85=8D=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E8=B4=B4=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/constant/Constants.java | 3 + .../detail/ForumArticleAskListFragment.kt | 118 ++++++++++--- .../detail/ForumArticleAskListViewModel.kt | 13 +- .../forum/home/ArticleItemVideoView.kt | 9 +- .../home/ForumArticleAskItemViewHolder.kt | 2 +- .../forum/home/ForumArticleListFragment.kt | 83 +++++++++ .../forum/home/ForumArticleListViewModel.kt | 9 +- .../forum/home/ForumScrollCalculatorHelper.kt | 167 ++++++++++++++++++ .../search/ForumContentSearchListAdapter.kt | 28 ++- .../forum/search/ForumOrUserSearchActivity.kt | 2 + .../gh/gamecenter/qa/entity/ArticleEntity.kt | 28 ++- 11 files changed, 426 insertions(+), 36 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/forum/home/ForumScrollCalculatorHelper.kt 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 935745f26a..3c28d0c88b 100644 --- a/app/src/main/java/com/gh/common/constant/Constants.java +++ b/app/src/main/java/com/gh/common/constant/Constants.java @@ -171,6 +171,9 @@ public class Constants { //首页视频播放进度 public static final String SP_HOME_VIDEO_PLAY_RECORD = "home_video_play_record"; + // 论坛内容视频播放进度 + public static final String SP_CONTENT_VIDEO_PLAY_RECORD = "content_video_play_record"; + // 用户是否曾经永久拒绝过存储权限 public static final String SP_USER_HAS_PERMANENTLY_DENIED_STORAGE_PERMISSION = "user_has_permanently_denied_storage_permission"; 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 7c3227bf13..f6332492df 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 @@ -4,15 +4,16 @@ import android.os.Bundle import android.view.View import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView -import com.gh.common.util.EntranceUtils -import com.gh.common.util.dip2px -import com.gh.common.util.viewModelProvider +import com.gh.common.AppExecutor +import com.gh.common.constant.Constants +import com.gh.common.util.* import com.gh.common.view.divider.HorizontalDividerItemDecoration import com.gh.gamecenter.R 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.forum.home.ForumScrollCalculatorHelper import com.gh.gamecenter.qa.CommunityFragment import com.gh.gamecenter.qa.entity.AnswerEntity import org.greenrobot.eventbus.EventBus @@ -23,9 +24,30 @@ class ForumArticleAskListFragment : ListFragment { + if (!::mAdapter.isInitialized) { + mAdapter = ForumArticleAskListAdapter(requireContext(), bbsId, mEntrance, mPath) + } + return mAdapter + } + + override fun getItemDecoration(): RecyclerView.ItemDecoration { + return HorizontalDividerItemDecoration.Builder(requireContext()) + .size(0.5f.dip2px()) + .margin(20f.dip2px()) + .color(ContextCompat.getColor(requireContext(), R.color.text_eeeeee)).build() + } + override fun onCreate(savedInstanceState: Bundle?) { bbsId = arguments?.getString(EntranceUtils.KEY_BBS_ID, "") ?: "" mPath = arguments?.getString(EntranceUtils.KEY_PATH) ?: "" @@ -33,17 +55,18 @@ class ForumArticleAskListFragment : ListFragment CommunityFragment.FOLLOW_HINT_TRIGGER_HEIGHT) { @@ -51,10 +74,34 @@ class ForumArticleAskListFragment : ListFragment { - if (!::mAdapter.isInitialized) { - mAdapter = ForumArticleAskListAdapter(requireContext(), bbsId, mEntrance, mPath) - } - return mAdapter + private fun scroll() { + val firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition() + val lastVisibleItem = mLayoutManager.findLastVisibleItemPosition() + mScrollCalculatorHelper?.onScroll(mViewModel?.videoList, firstVisibleItem, lastVisibleItem) } - override fun getItemDecoration(): RecyclerView.ItemDecoration { - return HorizontalDividerItemDecoration.Builder(requireContext()) - .size(0.5f.dip2px()) - .margin(20f.dip2px()) - .color(ContextCompat.getColor(requireContext(), R.color.text_eeeeee)).build() + private fun resumeVideo() { + mScrollCalculatorHelper?.run { + if (currentPlayer != null) { + val video = mViewModel?.videoList?.safelyGetInRelease(currentPosition) + if (video != null) { + val position = ForumScrollCalculatorHelper.getPlaySchedule(MD5Utils.getContentMD5(video.url)) + //这里必须要延迟操作,否则会白屏 + mBaseHandler.postDelayed({ + if (position != 0L) { + currentPlayer?.seekTo(position) + currentPlayer?.onVideoResume(false) + val videoVoiceStatus = SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true) + if (videoVoiceStatus) { + currentPlayer?.mute() + } else { + currentPlayer?.unMute() + } + } else { + currentPlayer?.release() + } + + }, 50) + } + } + } + } + + private fun pauseVideo() { + mScrollCalculatorHelper?.run { + if (currentPosition >= 0) { + currentPlayer?.onVideoPause() + val position = currentPlayer?.getCurrentPosition() ?: 0L + val video = mViewModel?.videoList?.safelyGetInRelease(currentPosition) + if (video != null) { + ForumScrollCalculatorHelper.savePlaySchedule(MD5Utils.getContentMD5(video.url), position) + } + } + } } override fun addSyncPageObserver(): Boolean = true diff --git a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListViewModel.kt b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListViewModel.kt index d20a114889..4c8008c85b 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListViewModel.kt @@ -5,6 +5,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModelProvider import com.gh.common.util.UrlFilterUtils import com.gh.gamecenter.baselist.ListViewModel +import com.gh.gamecenter.entity.ForumVideoEntity import com.gh.gamecenter.qa.entity.AnswerEntity import com.gh.gamecenter.retrofit.RetrofitManager import com.halo.assistant.HaloApp @@ -14,6 +15,7 @@ class ForumArticleAskListViewModel(application: Application, val bbsId: String = var sort: String = "time.reply" var videoSort: String = "recommend" + var videoList = listOf() override fun provideDataObservable(page: Int): Observable> { return when (mPath) { @@ -33,7 +35,16 @@ class ForumArticleAskListViewModel(application: Application, val bbsId: String = } override fun mergeResultLiveData() { - mResultLiveData.addSource(mListLiveData) { mResultLiveData.postValue(it) } + mResultLiveData.addSource(mListLiveData) { list -> + + if (mPath == "视频") + videoList = list.map { + if (mPath == "视频") it.type = "video" + it.transformForumVideoEntity() + } + + mResultLiveData.postValue(list) + } } class Factory(private val bbsId: String, val path: String) : ViewModelProvider.NewInstanceFactory() { diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt index e0c5a0b8b8..bb103dfae7 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt @@ -278,7 +278,7 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At } } - private fun mute(isManual: Boolean = false) { + fun mute(isManual: Boolean = false) { mVideoEntity?.videoIsMuted = true SPUtils.setBoolean(getMuteKey(), true) volume.setImageResource(R.drawable.ic_article_video_volume_off) @@ -289,7 +289,7 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At } } - private fun unMute(isManual: Boolean = false) { + fun unMute(isManual: Boolean = false) { mVideoEntity?.videoIsMuted = false SPUtils.setBoolean(getMuteKey(), false) volume.setImageResource(R.drawable.ic_article_video_volume_on) @@ -355,4 +355,9 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At fun getMuteKey(): String { return Constants.SP_VIDEO_PLAY_MUTE + uuid } + + fun getCurrentPosition(): Long { + return mCurrentPosition + } + } \ 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 2c2a11d9ff..b7bd4e7199 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 @@ -237,7 +237,7 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B } else { if (entity.questions.answerCount > 0) { commentCount.text = entity.questions.answerCount.toString() - commentCount.setCompoundDrawablesWithIntrinsicBounds(ContextCompat.getDrawable(itemView.context, R.drawable.community_comment_count), null, null, null) + commentCount.setCompoundDrawablesWithIntrinsicBounds(ContextCompat.getDrawable(itemView.context, R.drawable.community_question_answer_count), null, null, null) } else { commentCount.text = "我来回答" commentCount.setCompoundDrawablesWithIntrinsicBounds(ContextCompat.getDrawable(itemView.context, R.drawable.community_question_answer_edit), null, null, null) 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 652535e672..80a0e79fc0 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 @@ -5,6 +5,8 @@ import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import com.gh.common.AppExecutor +import com.gh.common.constant.Constants import com.gh.common.iinterface.IScrollable import com.gh.common.util.* import com.gh.gamecenter.R @@ -14,6 +16,8 @@ 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.forum.home.ForumScrollCalculatorHelper.Companion.getPlaySchedule +import com.gh.gamecenter.forum.home.ForumScrollCalculatorHelper.Companion.savePlaySchedule import com.gh.gamecenter.qa.CommunityFragment import com.gh.gamecenter.qa.entity.ArticleEntity import com.gh.gamecenter.user.UserViewModel @@ -29,6 +33,7 @@ class ForumArticleListFragment : LazyListFragment) { @@ -134,6 +171,52 @@ class ForumArticleListFragment : LazyListFragment= 0) { + currentPlayer?.onVideoPause() + val position = currentPlayer?.getCurrentPosition() ?: 0L + val video = mViewModel?.videoList?.safelyGetInRelease(currentPosition) + if (video != null) { + savePlaySchedule(MD5Utils.getContentMD5(video.url), position) + } + } + } + } + override fun addSyncPageObserver(): Boolean = true override fun provideSyncAdapter(): ForumArticleListAdapter = provideListAdapter() diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListViewModel.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListViewModel.kt index d12f646349..575f51369e 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumArticleListViewModel.kt @@ -9,6 +9,7 @@ import com.gh.common.util.singleToMain import com.gh.gamecenter.baselist.ListViewModel import com.gh.gamecenter.entity.ForumEntity import com.gh.gamecenter.entity.ForumUnreadEntity +import com.gh.gamecenter.entity.ForumVideoEntity import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.qa.entity.ArticleEntity import com.gh.gamecenter.retrofit.BiResponse @@ -24,6 +25,7 @@ class ForumArticleListViewModel(application: Application) : ListViewModel() var recordStatusForums = arrayListOf() var sort: String = "time.comment"//排序 time.edit 最新发布 time.comment 最新回复 + var videoList = listOf() init { getRecordForums() @@ -35,7 +37,12 @@ class ForumArticleListViewModel(application: Application) : ListViewModel + + videoList = list.map { it.transformForumVideoEntity() } + + mResultLiveData.postValue(list) + } } @SuppressLint("CheckResult") diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumScrollCalculatorHelper.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumScrollCalculatorHelper.kt new file mode 100644 index 0000000000..9554fc834a --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumScrollCalculatorHelper.kt @@ -0,0 +1,167 @@ +package com.gh.gamecenter.forum.home + +import android.graphics.Rect +import android.os.Handler +import android.os.Looper +import android.text.TextUtils +import android.view.View +import androidx.recyclerview.widget.RecyclerView +import com.gh.common.constant.Constants +import com.gh.common.util.MD5Utils +import com.gh.common.util.NetworkUtils +import com.gh.common.util.SPUtils +import com.gh.common.util.safelyGetInRelease +import com.gh.gamecenter.entity.ForumVideoEntity +import com.gh.gamecenter.setting.VideoSettingFragment +import com.gh.gamecenter.video.detail.CustomManager +import com.halo.assistant.HaloApp +import com.shuyu.gsyvideoplayer.video.base.GSYBaseVideoPlayer + +class ForumScrollCalculatorHelper(private val horizontalId: Int, + private val verticalId: Int, + private val rangeTop: Int) { + private var firstVisible = -1 + private var lastVisible = 0 + private var visibleCount = 0 + private var runnable: PlayRunnable? = null + var mItemData: List? = null + var currentPlayer: ArticleItemVideoView? = null + var currentPosition = -1 + var mListRv: RecyclerView? = null + + private val playHandler = Handler(Looper.getMainLooper()) + + fun onScrollStateChanged(view: RecyclerView?, scrollState: Int) { + mListRv = view + if (scrollState == RecyclerView.SCROLL_STATE_IDLE) { + playVideo(view) + } + } + + fun onScroll(itemData: List?, firstVisibleItem: Int, lastVisibleItem: Int) { + mItemData = itemData + firstVisible = firstVisibleItem + lastVisible = lastVisibleItem + visibleCount = lastVisibleItem - firstVisibleItem + releaseIfNeeded() + } + + //判断player是否划出了屏幕,划出了屏幕则需要释放 + private fun releaseIfNeeded() { + val rect = Rect() + if (currentPlayer != null) { + currentPlayer?.getLocalVisibleRect(rect) + val height = currentPlayer?.height + if (rect.top != 0 || rect.bottom != height) { + //保存进度 + val currentScheduler = currentPlayer?.currentPositionWhenPlaying?.toLong() ?: 0L + val video = mItemData?.safelyGetInRelease(currentPosition) + if (video != null) { + savePlaySchedule(MD5Utils.getContentMD5(video.url), currentScheduler) + } + CustomManager.releaseAllVideos(currentPlayer?.getKey()) +// currentPlayer?.resetDetailMask() + currentPlayer = null + currentPosition = -1 + } + } + } + + private fun playVideo(view: RecyclerView?) { + if (view == null) return + val layoutManager = view.layoutManager + var gsyBaseVideoPlayer: ArticleItemVideoView + for (i in firstVisible until lastVisible + 1) { + if (layoutManager == null || mItemData.isNullOrEmpty()) return + + val child = mListRv?.findViewHolderForAdapterPosition(i)?.itemView + val horizontalPlayer: View? = child?.findViewById(horizontalId) + val verticalPlayer: View? = child?.findViewById(verticalId) + val player = when { + horizontalPlayer?.visibility == View.VISIBLE -> horizontalPlayer + verticalPlayer?.visibility == View.VISIBLE -> verticalPlayer + else -> null + } + if (player == null || player !is ArticleItemVideoView) continue + + val video = mItemData?.safelyGetInRelease(i) + if (video == null || TextUtils.isEmpty(video.url)) continue + + val rect = Rect() + player.getLocalVisibleRect(rect) + val height = player.height + if (rect.top == 0 && rect.bottom == height) { + gsyBaseVideoPlayer = player + if (runnable != null) { + playHandler.removeCallbacks(runnable!!) + runnable = null + } + if (currentPlayer == gsyBaseVideoPlayer) return + val screenPosition = IntArray(2) + gsyBaseVideoPlayer.getLocationInWindow(screenPosition) + val rangePosition = screenPosition[1] + if (rangePosition >= rangeTop) { + runnable = PlayRunnable(gsyBaseVideoPlayer) + if (currentPlayer != null) { + CustomManager.releaseAllVideos(currentPlayer?.getKey()) +// currentPlayer?.resetDetailMask() + } + currentPlayer = gsyBaseVideoPlayer + currentPosition = i + //降低频率 + playHandler.postDelayed(runnable!!, 100) + break + } + } + + } + } + + private inner class PlayRunnable(var gsyBaseVideoPlayer: GSYBaseVideoPlayer?) : Runnable { + override fun run() { + if (gsyBaseVideoPlayer != null && !gsyBaseVideoPlayer!!.isInPlayingState) { + + val videoOption = SPUtils.getString(Constants.SP_CONTENT_VIDEO_OPTION, VideoSettingFragment.VIDEO_OPTION_WIFI) + ?: VideoSettingFragment.VIDEO_OPTION_WIFI + + when (videoOption) { + VideoSettingFragment.VIDEO_OPTION_ALL -> { + startPlayLogic(gsyBaseVideoPlayer) + } + + VideoSettingFragment.VIDEO_OPTION_WIFI -> { + if (NetworkUtils.isWifiConnected(HaloApp.getInstance().application)) { + startPlayLogic(gsyBaseVideoPlayer) + } + } + + else -> {} + } + } + } + } + + private fun startPlayLogic(gsyBaseVideoPlayer: GSYBaseVideoPlayer?) { + val videoView = gsyBaseVideoPlayer as? ArticleItemVideoView +// val position = getPlaySchedule(MD5Utils.getContentMD5(topVideo.url)) +// if (position > 0) { +// videoView?.seekOnStart = position +// } + videoView?.startPlayLogic() + } + + companion object { + + fun savePlaySchedule(key: String, schedule: Long) { + val record = SPUtils.getMap(Constants.SP_HOME_VIDEO_PLAY_RECORD) + record[key] = schedule.toString() + SPUtils.setMap(Constants.SP_CONTENT_VIDEO_PLAY_RECORD, record) + } + + fun getPlaySchedule(key: String): Long { + val record = SPUtils.getMap(Constants.SP_CONTENT_VIDEO_PLAY_RECORD) + return record[key]?.toLong() ?: 0L + } + } + +} \ No newline at end of file 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 8e5136717a..00b4375f3b 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 @@ -25,6 +25,7 @@ import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.qa.entity.AnswerEntity import com.gh.gamecenter.qa.entity.Questions import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity +import com.gh.gamecenter.qa.video.detail.ForumVideoDetailActivity class ForumContentSearchListAdapter(context: Context, val mListViewModel: ForumContentSearchListViewModel, val mEntrance: String) : ListAdapter(context), ISyncAdapterHandler { @@ -100,24 +101,37 @@ class ForumContentSearchListAdapter(context: Context, val mListViewModel: ForumC answerViewHolder.binding.content.text = answer.brief?.fromHtml() answerViewHolder.itemView.setOnClickListener { val entrance = BaseActivity.mergeEntranceAndPath(mEntrance, "") - if ("community_article" == answer.type) { - MtaHelper.onEvent(holder.getEventId(entrance), holder.getKey(entrance), "${answer.articleTitle}(${answer.id})") - mContext.startActivity(ArticleDetailActivity.getIntent(mContext, CommunityEntity(answer.bbs.id), answer.id!!, mEntrance, "")) - } else { - MtaHelper.onEvent(holder.getEventId(entrance), holder.getKey(entrance), "${answer.articleTitle}(${answer.id})") - mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, answer.id?:"", mEntrance, "")) + when (answer.type) { + "community_article" -> { + MtaHelper.onEvent(holder.getEventId(entrance), holder.getKey(entrance), "${answer.articleTitle}(${answer.id})") + mContext.startActivity(ArticleDetailActivity.getIntent(mContext, CommunityEntity(answer.bbs.id), answer.id!!, mEntrance, "")) + } + "video" -> { + MtaHelper.onEvent(holder.getEventId(entrance), holder.getKey(entrance), "${answer.articleTitle}(${answer.id})") + mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, answer.id ?:"")) + } + else -> { + MtaHelper.onEvent(holder.getEventId(entrance), holder.getKey(entrance), "${answer.articleTitle}(${answer.id})") + mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, answer.id?:"", mEntrance, "")) + } } } - if (answer.type != "community_article") { + if (answer.type == "question") { if (answer.questions.answerCount > 0) { answerViewHolder.commentCount.text = answer.questions.answerCount.toString() } else { answerViewHolder.commentCount.text = "回答" } + answerViewHolder.commentCount.setCompoundDrawablesWithIntrinsicBounds(ContextCompat.getDrawable(mContext, R.drawable.community_comment_count), null, null, null) answerViewHolder.voteCountContainer.visibility = View.GONE val params = answerViewHolder.binding.includeVoteAndComment.root.layoutParams as LinearLayout.LayoutParams params.width = 80f.dip2px() answerViewHolder.binding.includeVoteAndComment.root.layoutParams = params + } else { + answerViewHolder.voteCountContainer.visibility = View.VISIBLE + val params = answerViewHolder.binding.includeVoteAndComment.root.layoutParams as LinearLayout.LayoutParams + params.width = 160f.dip2px() + answerViewHolder.binding.includeVoteAndComment.root.layoutParams = params } } else { diff --git a/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchActivity.kt b/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchActivity.kt index 6b3945f73b..32c8641018 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/search/ForumOrUserSearchActivity.kt @@ -9,6 +9,7 @@ import com.gh.common.constant.Constants import com.gh.common.util.DirectUtils import com.gh.common.util.EntranceUtils import com.gh.common.util.showKeyBoard +import com.gh.common.util.toColor import com.gh.gamecenter.DisplayType import com.gh.gamecenter.R import com.gh.gamecenter.SearchActivity @@ -28,6 +29,7 @@ class ForumOrUserSearchActivity : SearchActivity() { "搜索此论坛中的内容" } searchEt.showKeyBoard() + searchBtn.setTextColor(R.color.theme_font.toColor()) } override fun search(type: SearchType, key: String?) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt index 4728f9fe47..6b9a2ec872 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt @@ -7,10 +7,7 @@ import androidx.room.PrimaryKey import androidx.room.TypeConverters import com.gh.common.annotation.SyncPage import com.gh.common.syncpage.SyncFieldConstants -import com.gh.gamecenter.entity.CommunityEntity -import com.gh.gamecenter.entity.MeEntity -import com.gh.gamecenter.entity.UserEntity -import com.gh.gamecenter.entity.VideoInfo +import com.gh.gamecenter.entity.* import com.gh.gamecenter.room.converter.* import com.google.gson.annotations.SerializedName import kotlinx.android.parcel.Parcelize @@ -92,6 +89,29 @@ data class ArticleEntity( answer.length = length return answer } + + fun transformForumVideoEntity(): ForumVideoEntity { + val forumVideoEntity = ForumVideoEntity() + if (type == "video") { + forumVideoEntity.id = id ?: "" + forumVideoEntity.title = title + forumVideoEntity.des = des + forumVideoEntity.url = url + forumVideoEntity.poster = poster + forumVideoEntity.length = length + forumVideoEntity.videoInfo = videoInfo + } else { + forumVideoEntity.title = title ?: "" + forumVideoEntity.des = brief ?: "" + if (getPassVideos().isNotEmpty()) { + forumVideoEntity.id = getPassVideos()[0].id + forumVideoEntity.url = getPassVideos()[0].url + forumVideoEntity.poster = getPassVideos()[0].poster + forumVideoEntity.videoInfo = VideoInfo(width = getPassVideos()[0].width, height = getPassVideos()[0].height) + } + } + return forumVideoEntity + } } @Parcelize From f34a95b36fac17de67ee1113d6ab8914d6a3eb98 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Tue, 8 Jun 2021 17:46:56 +0800 Subject: [PATCH 47/61] =?UTF-8?q?1.=E6=9B=B4=E6=8D=A2=E6=8F=90=E9=97=AE?= =?UTF-8?q?=E3=80=81=E8=8D=89=E7=A8=BF=E3=80=81=E9=97=AE=E9=A2=98=E8=AF=A6?= =?UTF-8?q?=E6=83=85=E6=8E=A5=E5=8F=A3=202.=E5=AF=B9=E6=8E=A5=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E5=B8=96=E8=AF=84=E8=AE=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/gamecenter/entity/CommentEntity.kt | 47 +++++++++-------- .../personalhome/home/UserHistoryFragment.kt | 2 +- .../qa/answer/detail/AnswerDetailFragment.kt | 2 +- .../qa/comment/NewCommentViewModel.kt | 2 +- .../CommentConversationViewModel.kt | 6 +-- .../qa/entity/QuestionsDetailEntity.kt | 6 ++- .../questions/edit/QuestionEditViewModel.kt | 50 +++++++++---------- .../newdetail/NewQuestionDetailAdapter.kt | 24 ++++++++- .../newdetail/NewQuestionDetailFragment.kt | 10 ++-- .../newdetail/NewQuestionDetailViewModel.kt | 4 +- .../detail/comment/VideoCommentFragment.kt | 28 ++++++++++- .../detail/comment/VideoCommentViewModel.kt | 11 ++-- .../detail/desc/VideoDescTopViewHolder.kt | 8 ++- .../retrofit/service/ApiService.java | 36 ++++++++----- .../layout/fragment_video_comment_list.xml | 6 +-- 15 files changed, 156 insertions(+), 86 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/entity/CommentEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/CommentEntity.kt index 96024b077b..92f57b65af 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/CommentEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/CommentEntity.kt @@ -7,30 +7,33 @@ import com.google.gson.annotations.SerializedName import kotlinx.android.parcel.Parcelize @Parcelize -data class CommentEntity(@SerializedName("_id") - var id: String? = null, - var user: UserEntity = UserEntity(), - var parent: ArticleCommentParent? = null, - @SerializedName("parent_user") - var parentUser: CommentParentEntity? = null, - var content: String? = null, - @SyncPage(syncNames = [SyncFieldConstants.ARTICLE_COMMENT_VOTE_COUNT]) - var vote: Int = 0, - @SyncPage(syncNames = [SyncFieldConstants.ARTICLE_COMMENT_REPLY_COUNT]) - var reply: Int = 0, - var time: Long = 0, - var priority: Int = 0, - @SerializedName("me") - var me: MeEntity? = null, - @SerializedName("is_top") - var isTop: Boolean = false,//是否置顶 - // 楼数,本地字段 - var floor: Int = 0, - @SerializedName("attached") // 楼中楼 - var subCommentList: ArrayList? = null) : Parcelable { +data class CommentEntity( + @SerializedName("_id") + var id: String? = null, + var user: UserEntity = UserEntity(), + var parent: ArticleCommentParent? = null, + @SerializedName("parent_user") + var parentUser: CommentParentEntity? = null, + var content: String? = null, + @SyncPage(syncNames = [SyncFieldConstants.ARTICLE_COMMENT_VOTE_COUNT]) + var vote: Int = 0, + @SyncPage(syncNames = [SyncFieldConstants.ARTICLE_COMMENT_REPLY_COUNT]) + var reply: Int = 0, + var time: Long = 0, + var priority: Int = 0, + @SerializedName("me") + var me: MeEntity? = null, + @SerializedName("is_top") + var isTop: Boolean = false,//是否置顶 + var type: String = "comment",//comment/answer,区分问题评论旧数据,answer表示旧数据(回答) + + // 楼数,本地字段 + var floor: Int = 0, + @SerializedName("attached") // 楼中楼 + var subCommentList: ArrayList? = null) : Parcelable { fun clone(): CommentEntity { - return CommentEntity(id, user, parent, parentUser, content, vote, reply, time, priority, me, isTop, floor, subCommentList) + return CommentEntity(id, user, parent, parentUser, content, vote, reply, time, priority, me, isTop, type, floor, subCommentList) } companion object { 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 0ff949e1e6..f7167737d2 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 @@ -215,7 +215,7 @@ class UserHistoryFragment : ListFragment(QuestionsDetailEntity::class.java.simpleName) historyEntity?.apply { title = resultData?.title ?: "" - count.answer = resultData?.answersCount ?: count.answer + count.answer = resultData?.count?.answer ?: count.answer } } 104 -> { 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 e6bbf37c2f..bc7d9f012b 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 @@ -1066,7 +1066,7 @@ open class AnswerDetailFragment : NormalFragment() { mBinding.answerCountTv.text = String.format("查看全部%d个回答", question.answerCount) // 作为 viewpager 里的第一个回答时隐藏问题内容 - if (mAnswerId == mContainerViewModel.answerIdList.first()) { + if (mContainerViewModel.answerIdList.isNotEmpty() && mAnswerId == mContainerViewModel.answerIdList.first()) { mQuestionContent.visibility = View.VISIBLE } else { mQuestionContent.visibility = View.GONE diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentViewModel.kt index 5a9f0565f5..0d80a3e9ab 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/NewCommentViewModel.kt @@ -64,7 +64,7 @@ open class NewCommentViewModel(application: Application, CommentType.COMMUNITY_ARTICLE -> api.getCommunityArticleCommentList(communityId, articleId, "time.create:1", page) CommentType.COMMUNITY_ARTICLE_CONVERSATION -> api.getCommunityArticleCommentConversation(communityId, articleId, commentId, page) - CommentType.VIDEO -> api.getVideoCommentList(videoId, page) + CommentType.VIDEO -> api.getVideoCommentList(videoId, page, mapOf()) CommentType.VIDEO_CONVERSATION -> api.getVideoCommentConversationList(videoId, commentId, page) else -> null } diff --git a/app/src/main/java/com/gh/gamecenter/qa/comment/conversation/CommentConversationViewModel.kt b/app/src/main/java/com/gh/gamecenter/qa/comment/conversation/CommentConversationViewModel.kt index a69ba79b70..849c7fb911 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/comment/conversation/CommentConversationViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/comment/conversation/CommentConversationViewModel.kt @@ -32,8 +32,7 @@ class CommentConversationViewModel(application: Application, mApi.getCommunityArticleCommentReply(communityId, articleId, commentId, currentSortType.value, page) } videoId.isNotEmpty() -> { - //TODO:获取视频评论回复接口 - null + mApi.getVideoCommentReply(videoId, commentId, currentSortType.value, page) } questionId.isNotEmpty() -> { mApi.getQuestionCommentReply(questionId, commentId, currentSortType.value, page) @@ -49,8 +48,7 @@ class CommentConversationViewModel(application: Application, mApi.getCommunityArticleComment(communityId, articleId, commentId) } videoId.isNotEmpty() -> { - //TODO:获取单条视频评论 - null + mApi.getCommunityVideoComment(videoId, commentId) } questionId.isNotEmpty() -> { mApi.getCommunityQuestionComment(questionId, commentId) 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 1c0000092e..a42868709b 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 @@ -18,14 +18,17 @@ data class QuestionsDetailEntity( var id: String? = null, var tags: List = ArrayList(), var title: String? = null, + @SerializedName("description", alternate = ["content"]) var description: String? = null, @SerializedName("related_question") var relatedQuestion: RelatedQuestion? = null, var images: List = ArrayList(), + @Deprecated("废弃") @SerializedName("answer_count") var answersCount: Int = 0, @SerializedName("answer_fold") var isAnswerFold: Boolean = false, + @SerializedName("bbs") var community: CommunityEntity = CommunityEntity(), var isExistDrafts: Boolean = false, var videos: List = ArrayList(), @@ -41,7 +44,8 @@ data class QuestionsDetailEntity( var tagActivityName: String = "", var type: String = "", var gameEntity: GameEntity? = null, - var time:TimeEntity = TimeEntity(), + var time: TimeEntity = TimeEntity(), + var count: Count = Count(), //提交问题用 @SerializedName("draft_id") var draftId: String = "" 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 e224e24623..c53580d038 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 @@ -184,41 +184,33 @@ class QuestionEditViewModel(application: Application) : BaseRichEditorViewModel( moderatorsPatchQuestion(isPatchTags) } + private fun getRequestParams(): HashMap { + val map = hashMapOf() + map["title"] = title ?: "" + map["content"] = content ?: "" + map["type"] = type + map["tag_activity_id"] = selectActivityLabelEntity?.id ?: "" + map["bbs_id"] = communityEntity?.id ?: "" + map["game_id"] = gameEntity?.id ?: "" + map["draft_id"] = questionDraftEntity?.id ?: "" + return map + } + /** * 提交问题 */ private fun postQuestion(isForce: Boolean) { - val entity = QuestionsDetailEntity() - entity.title = title - entity.description = content - entity.tags = selectedTags - if (!questionDraftEntity?.id.isNullOrEmpty()) { - entity.draftId = questionDraftEntity?.id ?: "" - } - entity.type = type - entity.gameId = gameEntity?.id ?: "" - entity.tagActivityId = selectActivityLabelEntity?.id ?: "" - entity.tagActivityName = selectActivityLabelEntity?.name ?: "" + val requestParams = getRequestParams() val observable = if (questionEntity != null) { - if (!isModeratorPatch) { - questionEntity?.images = entity.images - questionEntity?.title = entity.title - questionEntity?.description = entity.description - questionEntity?.tags = entity.tags - questionEntity?.videos = entity.videos - } - val body = RequestBody.create(MediaType.parse("application/json"), GsonUtils.toJson(entity)) - mApi.patchQuestions(body, questionEntity?.id) // patch + mApi.patchQuestions(requestParams.toRequestBody(), questionEntity?.id) // patch } else { val postContent = if (isForce) { // 标题重复提示后强制提交 - val bodyJson = JSONObject(GsonUtils.toJson(entity)) - bodyJson.put("again", true) - bodyJson.toString() + requestParams["again"] = true + requestParams } else { - GsonUtils.toJson(entity) + requestParams } - val body = RequestBody.create(MediaType.parse("application/json"), postContent) - mApi.postQuestions(body, communityEntity?.id) // add + mApi.postQuestions(postContent.toRequestBody()) // add } processDialog.postValue(WaitingDialogFragment.WaitingDialogData("提交中...", true)) @@ -291,7 +283,11 @@ class QuestionEditViewModel(application: Application) : BaseRichEditorViewModel( @SuppressLint("CheckResult") fun saveQuestionDraft(saveType: QuestionEditActivity.SaveDraftType) { - val body = getQuestionBody() + val requestParams = getRequestParams() + if (questionEntity != null) { + requestParams["question_id"] = questionEntity?.id ?: "" + } + val body = requestParams.toRequestBody() val observable = if (!questionDraftEntity?.id.isNullOrEmpty()) { mApi.updateQuestionDraft(UserManager.getInstance().userId, questionDraftEntity?.id, body) } else { diff --git a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailAdapter.kt b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailAdapter.kt index 938a88487d..b623b40df4 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/questions/newdetail/NewQuestionDetailAdapter.kt @@ -1,17 +1,21 @@ package com.gh.gamecenter.qa.questions.newdetail import android.content.Context +import android.text.SpannableStringBuilder import android.view.ViewGroup import androidx.databinding.DataBindingUtil import androidx.recyclerview.widget.RecyclerView import com.gh.common.syncpage.ISyncAdapterHandler +import com.gh.common.util.SpanBuilder +import com.gh.common.view.CustomLinkMovementMethod import com.gh.gamecenter.R import com.gh.gamecenter.baselist.LoadStatus import com.gh.gamecenter.databinding.ItemArticleDetailContentBinding +import com.gh.gamecenter.qa.answer.detail.SimpleAnswerDetailActivity import com.gh.gamecenter.qa.article.detail.ArticleDetailContentViewHolder import com.gh.gamecenter.qa.comment.base.BaseCommentAdapter -class NewQuestionDetailAdapter(context: Context, var mViewModel: NewQuestionDetailViewModel, type: AdapterType, entrance: String) : +class NewQuestionDetailAdapter(context: Context, var mViewModel: NewQuestionDetailViewModel, type: AdapterType, val entrance: String) : BaseCommentAdapter(context, mViewModel, type, entrance) { var questionDetailVH: QuestionDetailContentViewHolder? = null @@ -48,6 +52,24 @@ class NewQuestionDetailAdapter(context: Context, var mViewModel: NewQuestionDeta is CommentFilterViewHolder -> { holder.bindView(questions = mViewModel.questionDetail) } + is CommentItemViewHolder -> { + val comment = mEntityList[position].commentNormal + val spannableStringBuilder = SpannableStringBuilder() + if (comment?.type == "answer") { + val detailSpan = SpanBuilder("[查看回答详情]").click(0, 8, R.color.theme_font) { + val intent = SimpleAnswerDetailActivity.getIntent(holder.itemView.context, comment.id + ?: "", entrance, "问题详情") + holder.itemView.context.startActivity(intent) + }.build() + spannableStringBuilder.append(detailSpan) + holder.binding.contentTv.maxEms = 20 + } else { + holder.binding.contentTv.maxEms = Int.MAX_VALUE + } + spannableStringBuilder.append(comment?.content) + holder.binding.contentTv.text = spannableStringBuilder + holder.binding.contentTv.movementMethod = CustomLinkMovementMethod.getInstance() + } else -> super.onBindViewHolder(holder, position) } } 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 75307d0b78..72b9993ca9 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 @@ -104,9 +104,9 @@ class NewQuestionDetailFragment : BaseCommentFragment() { @@ -60,6 +62,14 @@ class VideoCommentFragment : LazyListFragment() override fun provideDataObservable(page: Int): Observable>? { - return mApi.getVideoCommentList(videoId, page) + return mApi.getVideoCommentList(videoId, page, mapOf("sort" to currentSortType.value)) } override fun mergeResultLiveData() { @@ -37,6 +37,11 @@ class VideoCommentViewModel(application: Application, videoId: String) : BaseCom } } + override fun hideCommentSuccess() { + videoDetail?.commentCount = (videoDetail?.commentCount ?: 0) - 1 + deleteCommentLiveData.postValue(true) + } + class Factory(private val videoId: String) : ViewModelProvider.NewInstanceFactory() { override fun create(modelClass: Class): T { return VideoCommentViewModel(HaloApp.getInstance().application, videoId) as T 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 b039a912c1..f18e6589c4 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 @@ -3,6 +3,7 @@ package com.gh.gamecenter.qa.video.detail.desc import android.animation.ValueAnimator import android.app.Activity import android.text.Layout +import android.view.View import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.animation.doOnEnd @@ -19,12 +20,13 @@ 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)}" binding.titleTv.text = entity.title binding.desTv.text = entity.des + binding.desTv.goneIf(entity.des.isEmpty()) + initAnimation() binding.likeCountTv.text = entity.vote.toString() binding.collectCountTv.text = entity.favorite.toString() @@ -74,7 +76,8 @@ class VideoDescTopViewHolder(val binding: ItemVideoDescTopBinding, var mIsExpand } else mShrinkHeight mExpandHeight = if (mExpandHeight == 0) { - getTextViewHeight(binding.titleTv) + getTextViewHeight(binding.desTv) + binding.desTv.marginTop + getTextViewHeight(binding.titleTv) + getTextViewHeight(binding.desTv) + + if (binding.desTv.visibility == View.VISIBLE) binding.desTv.marginTop else 0 } else mExpandHeight if (mIsExpand) { @@ -147,6 +150,7 @@ class VideoDescTopViewHolder(val binding: ItemVideoDescTopBinding, var mIsExpand } private fun getTextViewHeight(view: TextView, lineCount: Int = 0): Int { + if (view.visibility == View.GONE) return 0 val layout: Layout = view.layout val desired: Int = layout.getLineTop(if (lineCount > 0) lineCount else view.lineCount) val padding = view.compoundPaddingTop + view.compoundPaddingBottom 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 fb10a3a504..b5af919282 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 @@ -763,8 +763,8 @@ public interface ApiService { /** * 社区问题详情 */ - @GET("questions/{questions_id}?view=detail") - Observable getQuestionsById(@Path("questions_id") String questionsId); + @GET("bbses/questions/{question_id}?view=detail") + Observable getQuestionsById(@Path("question_id") String questionsId); /** * 社区问题的回答列表 @@ -880,13 +880,13 @@ public interface ApiService { /** * 添加社区问题 */ - @POST("communities/{community_id}/questions") - Observable postQuestions(@Body RequestBody body, @Path("community_id") String communityId); + @POST("bbses/questions") + Observable postQuestions(@Body RequestBody body); /** - * 添加社区问题 + * 编辑社区问题 */ - @POST("questions/{question_id}") + @PUT("bbses/questions/{question_id}") Observable patchQuestions(@Body RequestBody body, @Path("question_id") String questionId); /** @@ -2134,7 +2134,7 @@ public interface ApiService { * 获取评论列表.可以分页 */ @GET("videos/{video_id}/comments") - Observable> getVideoCommentList(@Path("video_id") String videoId, @Query("page") int page); + Observable> getVideoCommentList(@Path("video_id") String videoId, @Query("page") int page, @QueryMap Map params); /** * 获取评论的对话列表. @@ -2927,31 +2927,31 @@ public interface ApiService { /** * 新增一个问题草稿 */ - @POST("users/{user_id}/question_drafts") + @POST("users/{user_id}/bbses/question_drafts") Single addQuestionDraft(@Path("user_id") String userId, @Body RequestBody body); /** * 获取单个问题草稿 */ - @GET("users/{user_id}/question_drafts/{draft_id}") + @GET("users/{user_id}/bbses/question_drafts/{draft_id}") Single getQuestionDraft(@Path("user_id") String userId, @Path("draft_id") String draftId); /** * 修改一个问题草稿 */ - @POST("users/{user_id}/question_drafts/{draft_id}") + @PUT("users/{user_id}/bbses/question_drafts/{draft_id}") Single updateQuestionDraft(@Path("user_id") String userId, @Path("draft_id") String draftId, @Body RequestBody body); /** * 获取问题草稿列表 */ - @GET("users/{user_id}/question_drafts") + @GET("users/{user_id}/bbses/question_drafts") Observable> getQuestionDrafts(@Path("user_id") String userId); /** * 删除单个问题草稿 */ - @DELETE("users/{user_id}/question_drafts/{draft_id}") + @DELETE("users/{user_id}/bbses/question_drafts/{draft_id}") Observable deleteQuestionDraft(@Path("user_id") String userId, @Path("draft_id") String draftId); /** @@ -3144,4 +3144,16 @@ public interface ApiService { */ @GET("videos/activities") Single> getForumActivities(@Query("filter") String filter, @Query("page") int page); + + /** + * 获取单条视频评论 + */ + @GET("videos/{video_id}/comments/{comment_id}") + Single getCommunityVideoComment(@Path("video_id") String videoId, @Path("comment_id") String commentId); + + /** + * 获取视频评论回复 + */ + @GET("videos/{video_id}/comments/{comment_id}/replies") + Single> getVideoCommentReply(@Path("video_id") String videoId, @Path("comment_id") String commentId, @Query("sort") String sort, @Query("page") int page); } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_video_comment_list.xml b/app/src/main/res/layout/fragment_video_comment_list.xml index 091beb551b..8cee1660b2 100644 --- a/app/src/main/res/layout/fragment_video_comment_list.xml +++ b/app/src/main/res/layout/fragment_video_comment_list.xml @@ -39,7 +39,7 @@ android:textColor="@color/text_999999" /> Date: Tue, 8 Jun 2021 18:19:20 +0800 Subject: [PATCH 48/61] =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E9=A1=B5-=E5=86=85=E5=AE=B9=E6=90=9C=E7=B4=A2=E7=BB=93?= =?UTF-8?q?=E6=9E=9C=E5=A2=9E=E5=8A=A0=E8=A7=86=E9=A2=91=E5=B8=96=E7=9A=84?= =?UTF-8?q?=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../search/ForumContentSearchListAdapter.kt | 82 ++++--- .../res/layout/forum_search_content_list.xml | 230 +++++++++--------- 2 files changed, 172 insertions(+), 140 deletions(-) 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 00b4375f3b..15eff5337c 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 @@ -136,39 +136,59 @@ class ForumContentSearchListAdapter(context: Context, val mListViewModel: ForumC } else { val forumSearchHolder = holder as ForumSearchContentListViewHolder - forumSearchHolder.binding.entity = answer - if (answer.type == "question") { - forumSearchHolder.binding.content.visibility = View.GONE - val title = answer.questions.title ?: "" - val spannableStringBuilder = SpannableStringBuilder(" ") - spannableStringBuilder.setSpan(CenterImageSpan(mContext, R.drawable.ic_ask_label), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) - spannableStringBuilder.append(title.fromHtml()) - forumSearchHolder.binding.title.text = spannableStringBuilder - } else { - forumSearchHolder.binding.content.visibility = View.VISIBLE - forumSearchHolder.binding.title.text = answer.questions.title?.fromHtml() - } - when { - answer.getPassVideos().isNotEmpty() -> { - val poster = answer.getPassVideos()[0].poster - ImageUtils.display(forumSearchHolder.binding.image, poster, false) - forumSearchHolder.binding.image.visibility = View.VISIBLE - } - answer.images.isNotEmpty() -> { - forumSearchHolder.binding.image.visibility = View.VISIBLE - ImageUtils.display(forumSearchHolder.binding.image, answer.images[0], false) - } - else -> { - forumSearchHolder.binding.image.visibility = View.GONE - } - } + if (answer.type == "video") { + forumSearchHolder.binding.run { + normalContainer.visibility = View.GONE + includedAnswerItem.root.visibility = View.VISIBLE - forumSearchHolder.binding.content.text = answer.brief?.fromHtml() - forumSearchHolder.itemView.setOnClickListener { - if ("community_article" == answer.type) { - mContext.startActivity(ArticleDetailActivity.getIntent(mContext, CommunityEntity(answer.bbs.id), answer.id!!, mEntrance, "")) + includedAnswerItem.entity = answer + includedAnswerItem.executePendingBindings() + + val answerViewHolder = ForumArticleAskItemViewHolder(includedAnswerItem) + answerViewHolder.bindForumAnswerItem(answer, mEntrance, "") + answerViewHolder.itemView.setOnClickListener { + mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, answer.id ?:"")) + } + } + } else { + forumSearchHolder.binding.includedAnswerItem.root.visibility = View.GONE + forumSearchHolder.binding.normalContainer.visibility = View.VISIBLE + + forumSearchHolder.binding.entity = answer + if (answer.type == "question") { + forumSearchHolder.binding.content.visibility = View.GONE + val title = answer.questions.title ?: "" + val spannableStringBuilder = SpannableStringBuilder(" ") + spannableStringBuilder.setSpan(CenterImageSpan(mContext, R.drawable.ic_ask_label), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE) + spannableStringBuilder.append(title.fromHtml()) + forumSearchHolder.binding.title.text = spannableStringBuilder } else { - mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, answer.id?:"", mEntrance, "")) + forumSearchHolder.binding.content.visibility = View.VISIBLE + forumSearchHolder.binding.title.text = answer.questions.title?.fromHtml() + } + when { + answer.getPassVideos().isNotEmpty() -> { + val poster = answer.getPassVideos()[0].poster + ImageUtils.display(forumSearchHolder.binding.image, poster, false) + forumSearchHolder.binding.image.visibility = View.VISIBLE + } + answer.images.isNotEmpty() -> { + forumSearchHolder.binding.image.visibility = View.VISIBLE + ImageUtils.display(forumSearchHolder.binding.image, answer.images[0], false) + } + else -> { + forumSearchHolder.binding.image.visibility = View.GONE + } + } + + forumSearchHolder.binding.content.text = answer.brief?.fromHtml() + forumSearchHolder.itemView.setOnClickListener { + if ("community_article" == answer.type) { + mContext.startActivity(ArticleDetailActivity.getIntent(mContext, CommunityEntity(answer.bbs.id), answer.id!!, mEntrance, "")) + } else { + mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, answer.id + ?: "", mEntrance, "")) + } } } } diff --git a/app/src/main/res/layout/forum_search_content_list.xml b/app/src/main/res/layout/forum_search_content_list.xml index eec4c08023..52b0653f9e 100644 --- a/app/src/main/res/layout/forum_search_content_list.xml +++ b/app/src/main/res/layout/forum_search_content_list.xml @@ -1,5 +1,6 @@ - @@ -11,121 +12,132 @@ - + android:layout_height="wrap_content"> - + - - - - - - - - - - - - - + android:background="@color/white" + android:orientation="vertical" + android:paddingLeft="20dp" + android:paddingTop="16dp" + android:paddingRight="20dp"> - + + + + + + + + + + + + + + + android:layout_marginTop="12dp" + android:layout_marginBottom="16dp"> - - + - - + + + + + + \ No newline at end of file From daece9337c60e407438b208e35885a35b559c27d Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Wed, 9 Jun 2021 14:35:13 +0800 Subject: [PATCH 49/61] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B5=8F=E8=A7=88?= =?UTF-8?q?=E8=AE=B0=E5=BD=95-=E5=B8=96=E5=AD=90Item=E5=B7=A6=E4=B8=8B?= =?UTF-8?q?=E8=A7=92=E5=AF=B9=E5=BA=94=E8=AE=BA=E5=9D=9BUI=E6=9C=AA?= =?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/collection/CommunityArticleAdapter.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleAdapter.kt b/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleAdapter.kt index e053a94142..abf9d03cb2 100644 --- a/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleAdapter.kt @@ -13,6 +13,7 @@ import com.gh.gamecenter.R import com.gh.gamecenter.adapter.viewholder.FooterViewHolder import com.gh.gamecenter.baselist.ListAdapter import com.gh.gamecenter.databinding.CommunityAnswerItemBinding +import com.gh.gamecenter.entity.CommunityEntity import com.gh.gamecenter.qa.answer.CommunityAnswerItemViewHolder import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.qa.entity.ArticleEntity @@ -69,6 +70,9 @@ class CommunityArticleAdapter(context: Context, } } + if (entity.bbs == CommunityEntity()) { + entity.bbs = entity.community + } holder.bindArticleItem(entity, mEntrance, path) holder.itemView.setOnClickListener { if (entity.type == "question") { From b96104fcd919e5fbb23b07ab676e6b9d7886d1d9 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Wed, 9 Jun 2021 16:26:04 +0800 Subject: [PATCH 50/61] =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E7=A4=BE=E5=8C=BA?= =?UTF-8?q?=E6=8E=A8=E8=8D=90Tab=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../forum/home/ForumArticleListAdapter.kt | 45 ++++++++++++++++++- .../forum/home/ForumArticleListFragment.kt | 4 +- .../forum/home/ForumArticleListViewModel.kt | 1 + .../search/ForumContentSearchListAdapter.kt | 1 - 4 files changed, 47 insertions(+), 4 deletions(-) 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 0e37b68251..e3ccfba756 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 @@ -4,12 +4,14 @@ import android.content.Context import android.graphics.Color import android.view.View import android.view.ViewGroup +import android.widget.LinearLayout import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.gh.base.BaseActivity import com.gh.common.constant.ItemViewType import com.gh.common.syncpage.ISyncAdapterHandler import com.gh.common.util.MtaHelper +import com.gh.common.util.dip2px import com.gh.common.util.goneIf import com.gh.gamecenter.R import com.gh.gamecenter.adapter.viewholder.FooterViewHolder @@ -18,6 +20,8 @@ import com.gh.gamecenter.databinding.CommunityAnswerItemBinding import com.gh.gamecenter.entity.CommunityEntity import com.gh.gamecenter.qa.article.detail.ArticleDetailActivity import com.gh.gamecenter.qa.entity.ArticleEntity +import com.gh.gamecenter.qa.questions.newdetail.NewQuestionDetailActivity +import com.gh.gamecenter.qa.video.detail.ForumVideoDetailActivity class ForumArticleListAdapter(context: Context, val mEntrance: String, val path: String) : ListAdapter(context), ISyncAdapterHandler { @@ -55,6 +59,11 @@ class ForumArticleListAdapter(context: Context, val mEntrance: String, val path: val viewHolder = holder as ForumArticleAskItemViewHolder val articleEntity = mEntityList[position] articleEntity.community = CommunityEntity(articleEntity.bbs.id, articleEntity.bbs.name) + + if (articleEntity.type == "bbs_article") articleEntity.type = "community_article" + if (articleEntity.type == "bbs_question") articleEntity.type = "question" + if (articleEntity.type == "bbs_video") articleEntity.type = "video" + viewHolder.binding.run { topLine.goneIf(position == 0) contentContainer.setBackgroundColor(Color.TRANSPARENT) @@ -63,9 +72,41 @@ class ForumArticleListAdapter(context: Context, val mEntrance: String, val path: includeVoteAndComment.voteCountContainer.setBackgroundColor(Color.TRANSPARENT) } viewHolder.bindForumArticleItem(articleEntity, mEntrance, path) + + if (articleEntity.type == "question") { + if (articleEntity.count.answer > 0) { + viewHolder.commentCount.text = articleEntity.count.answer.toString() + } else { + viewHolder.commentCount.text = "回答" + } + viewHolder.commentCount.setCompoundDrawablesWithIntrinsicBounds(ContextCompat.getDrawable(mContext, R.drawable.community_comment_count), null, null, null) + viewHolder.voteCountContainer.visibility = View.GONE + val params = viewHolder.binding.includeVoteAndComment.root.layoutParams as LinearLayout.LayoutParams + params.width = 80f.dip2px() + viewHolder.binding.includeVoteAndComment.root.layoutParams = params + } else { + viewHolder.voteCountContainer.visibility = View.VISIBLE + val params = viewHolder.binding.includeVoteAndComment.root.layoutParams as LinearLayout.LayoutParams + params.width = 160f.dip2px() + viewHolder.binding.includeVoteAndComment.root.layoutParams = params + } + viewHolder.itemView.setOnClickListener { - MtaHelper.onEvent("论坛首页", viewHolder.getKey(BaseActivity.mergeEntranceAndPath(mEntrance, path)), "${articleEntity.title}(${articleEntity.id})") - mContext.startActivity(ArticleDetailActivity.getIntent(mContext, articleEntity.community, articleEntity.id, "", path)) + when (articleEntity.type) { + "community_article" -> { + MtaHelper.onEvent("论坛首页", viewHolder.getKey(BaseActivity.mergeEntranceAndPath(mEntrance, path)), "${articleEntity.title}(${articleEntity.id})") + mContext.startActivity(ArticleDetailActivity.getIntent(mContext, articleEntity.community, articleEntity.id, "", path)) + } + "video" -> { + MtaHelper.onEvent("论坛首页", viewHolder.getKey(BaseActivity.mergeEntranceAndPath(mEntrance, path)), "${articleEntity.title}(${articleEntity.id})") + mContext.startActivity(ForumVideoDetailActivity.getIntent(mContext, articleEntity.id ?:"")) + } + else -> { + MtaHelper.onEvent("论坛首页", viewHolder.getKey(BaseActivity.mergeEntranceAndPath(mEntrance, path)), "${articleEntity.title}(${articleEntity.id})") + mContext.startActivity(NewQuestionDetailActivity.getIntent(mContext, articleEntity.id + ?: "", mEntrance, path)) + } + } } } 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 80a0e79fc0..5b8a736ac5 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 @@ -37,6 +37,7 @@ class ForumArticleListFragment : LazyListFragment() init { + setOverLimitSize(0) getRecordForums() } 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 15eff5337c..db23647611 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 @@ -133,7 +133,6 @@ class ForumContentSearchListAdapter(context: Context, val mListViewModel: ForumC params.width = 160f.dip2px() answerViewHolder.binding.includeVoteAndComment.root.layoutParams = params } - } else { val forumSearchHolder = holder as ForumSearchContentListViewHolder if (answer.type == "video") { From 076c98977d10ed695a60f244e7decd7d706c39ae Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Wed, 9 Jun 2021 16:47:19 +0800 Subject: [PATCH 51/61] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E8=AF=84=E8=AE=BA=E4=B8=8D=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E4=BD=9C=E8=80=85=E6=A0=87=E7=AD=BE=202.=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E8=AF=A6=E6=83=85=E7=82=B9=E5=87=BB=E9=A1=B6?= =?UTF-8?q?=E9=83=A8=E8=BF=94=E5=9B=9E=E6=8C=89=E9=92=AE=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qa/comment/base/BaseCommentAdapter.kt | 20 ++++++++++++------ .../newdetail/NewQuestionDetailFragment.kt | 9 ++++++++ .../drawable-xxhdpi/icon_upload_video_btn.png | Bin 0 -> 3005 bytes .../icon_upload_video_btn.webp | Bin 1234 -> 0 bytes .../drawable/bg_forum_video_detail_shadow.xml | 2 +- .../activity_community_article_edit.xml | 5 ++--- .../res/layout/activity_questions_edit.xml | 4 ++-- .../res/layout/fragment_video_publish.xml | 2 +- 8 files changed, 29 insertions(+), 13 deletions(-) create mode 100644 app/src/main/res/drawable-xxhdpi/icon_upload_video_btn.png delete mode 100644 app/src/main/res/drawable-xxhdpi/icon_upload_video_btn.webp 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 4802776fc5..d35ac9c83c 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 @@ -189,8 +189,6 @@ abstract class BaseCommentAdapter(context: Context, fun bindView(article: ArticleDetailEntity? = null, questions: QuestionsDetailEntity? = null, comment: CommentEntity? = null) { binding.run { val commentCount = mViewModel.commentCount - -// commentHintTv.text = if (article != null) "全部评论" else "全部回复" commentHintTv.text = when { article != null -> { "全部评论" @@ -335,7 +333,17 @@ abstract class BaseCommentAdapter(context: Context, @SuppressLint("SetTextI18n") fun updateSubComment(comment: CommentEntity, viewModel: BaseCommentViewModel, entrance: String) { val subCommentList = comment.subCommentList - val articleOwnerUserId = viewModel.topItemData?.articleDetail?.user?.id ?: "" + val ownerUserId = when { + viewModel.articleId.isNotEmpty() -> { + viewModel.topItemData?.articleDetail?.user?.id ?: "" + } + viewModel.questionId.isNotEmpty() -> { + viewModel.topItemData?.questionDetail?.user?.id ?: "" + } + else -> { + "" + } + } binding.moreSubCommentBtn.goneIf(comment.reply < 3) binding.moreSubCommentBtn.text = "查看全部${comment.reply}条回复" binding.subCommentContainer.goneIf(subCommentList.isNullOrEmpty()) @@ -344,10 +352,10 @@ 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 == articleOwnerUserId) "作者" 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 == articleOwnerUserId) "作者" 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 { @@ -435,7 +443,7 @@ abstract class BaseCommentAdapter(context: Context, } private fun showQuestionCommentOption(view: View, binding: ItemArticleDetailCommentBinding, comment: CommentEntity, viewModel: BaseCommentViewModel, deleteCallBack: ((comment: CommentEntity) -> Unit)?) { - CommentHelper.showQuestionCommentOption(view,comment,viewModel.questionId,object :OnCommentOptionClickListener{ + CommentHelper.showQuestionCommentOption(view, comment, viewModel.questionId, object : OnCommentOptionClickListener { override fun onCommentOptionClick(entity: CommentEntity, option: String) { when (option) { "删除评论" -> { 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 72b9993ca9..29d578205b 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 @@ -351,6 +351,15 @@ class NewQuestionDetailFragment : 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/icon_upload_video_btn.webp b/app/src/main/res/drawable-xxhdpi/icon_upload_video_btn.webp deleted file mode 100644 index 1a9d18b6962d24f0f95bf5d05434945391d3371b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1234 zcmV;@1TFhgNk&G>1ONb6MM6+kP&il$0000G0001w0055w06|PpNJ;_#00G~^pphg+ z-@Wk6@89g3h=?2j3Cff|;^PKwe#r&Gc%L)+!(6B{r^8PJ&o@vcOv>f0r>yothasfQjDZ6m!Hm;`eN2Gds>k;|FP2( zqufSGG%R^>NzDhMI}D&mLDyy| zHTUy~2pHUpr2YX!yUg^pG(N6e*JdcqUaB^<7fJJPdS#}sh09R>puXGkMpo{5_`aF~ zfW)L_VF7i`5eH{z)VB;wHw1G;Kv!dcZ`DK7=7ts&4VXhV0N=6!bI1nZ zTQ<=7$OZ;18(5*E`;!fXbbMpOytA<`Wb}t*^uG!h1uImTL(#c)1uImTLs7d$1uImT zL(#ky1uImTLs7oB8Q+Tbqm7wE(f^_$-wK0s^~|Ag__dgZy%m$kz1=7aogF{C3i zeN6^{!M&&jZ>j-ZTVYdI$^n__>n0{5?Enn!MGYLINC42a71r9zG0^tR@lHP9kX zPv=X0_}^nzP&go30ssJz69An7Dv$t>06vjIn@J_4BB3j20I(7XX>Q#K^8f0+S*xY2 z2SMCaKY(}xbzeB=`Cr<6&ivo(2mH7CFHs-ce`F8VLB4sld4@ref3UAgmolPh9L|Pz z@$pel=B^~ixRiE97MP!P_uWr8t}wti_1@dQeRhIINO!D&4XF_i8}@0g54CxMQ&N{R zO53TECpEtz;P9xLNB+P}q#+W>Hw*uO0RH&TK>AzcO63efdof*Hm&zgL8Slw5vA@Yn z-mze3bS;Tx6`MEM!|TfkI)>9T>T)N*FcU}~l4x-W9tN41G^H{~0Y*`sKo1iJ$#&jd z4!aB!qNEO<6N>xabEmmSrVks*wj-e(*FSKp3fEwzpJWICgtQ54-a=72IP|u_VAStF z`Q7~b<{ZaFo+DIIbx;6ZF0YM4V(9<2Mkv`^WTW|xDE1;lR5+P7GpC1><_%Uxb4b@04|MKmTd`n zO3dloVbYD2DsG7@&Ux(c0f1oxq_g_)$zEt>zZGtD9;=~b_=~+0V3H#)b4B%5<8Hg3 zKNAVP;d-Zm-M&BWKYt8QVeG$&FP1nyhQ|! w$|{o5Yrk2fT0;HnV;-9j7Co%XHq)$ diff --git a/app/src/main/res/drawable/bg_forum_video_detail_shadow.xml b/app/src/main/res/drawable/bg_forum_video_detail_shadow.xml index 3f2dc7513c..4618e8ecb9 100644 --- a/app/src/main/res/drawable/bg_forum_video_detail_shadow.xml +++ b/app/src/main/res/drawable/bg_forum_video_detail_shadow.xml @@ -2,6 +2,6 @@ \ No newline at end of file diff --git a/app/src/main/res/layout/activity_community_article_edit.xml b/app/src/main/res/layout/activity_community_article_edit.xml index 4c103a7e35..96daa6b4f8 100644 --- a/app/src/main/res/layout/activity_community_article_edit.xml +++ b/app/src/main/res/layout/activity_community_article_edit.xml @@ -91,12 +91,11 @@ Date: Wed, 9 Jun 2021 18:10:10 +0800 Subject: [PATCH 52/61] =?UTF-8?q?1.=E4=BF=AE=E6=94=B9=E8=AE=BA=E5=9D=9B?= =?UTF-8?q?=E8=AF=A6=E6=83=85-=E8=A7=86=E9=A2=91Tab=E6=97=A0=E6=B3=95?= =?UTF-8?q?=E4=B8=8B=E6=8B=89=E5=88=B7=E6=96=B0=E9=97=AE=E9=A2=98=202.?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AE=BA=E5=9D=9B=E8=AF=A6=E6=83=85-?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E8=A7=86=E9=A2=91=E8=B4=B4=E6=9C=AA=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E5=86=85=E5=AE=B9=E9=97=AE=E9=A2=98=203.=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E8=AE=BA=E5=9D=9B=E8=AF=A6=E6=83=85-=E5=85=A8?= =?UTF-8?q?=E9=83=A8Tab=E7=9A=84=E9=97=AE=E7=AD=94=E8=B4=B4=E5=9B=9E?= =?UTF-8?q?=E7=AD=94=E6=95=B0=E9=87=8F=E4=B8=8D=E5=AF=B9=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/gamecenter/forum/detail/ForumArticleAskListAdapter.kt | 3 +-- .../gamecenter/forum/detail/ForumArticleAskListViewModel.kt | 1 - .../com/gh/gamecenter/forum/detail/ForumDetailFragment.kt | 3 +++ app/src/main/res/layout/community_answer_item.xml | 5 ++--- 4 files changed, 6 insertions(+), 6 deletions(-) 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 6a6f251782..d9c2ea7337 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 @@ -10,7 +10,6 @@ import com.gh.base.BaseActivity import com.gh.common.constant.ItemViewType import com.gh.common.syncpage.ISyncAdapterHandler import com.gh.common.util.MtaHelper -import com.gh.common.util.dip2px import com.gh.gamecenter.R import com.gh.gamecenter.adapter.viewholder.FooterViewHolder import com.gh.gamecenter.baselist.ListAdapter @@ -57,7 +56,7 @@ class ForumArticleAskListAdapter(context: Context, val bbsId: String, val mEntra questions.id = answer.id ?: "" questions.title = answer.articleTitle questions.description = answer.description - questions.answerCount = answer.answerCount + questions.answerCount = if (path == "全部") answer.count.answer else answer.answerCount answer.questions = questions if (path == "精华") answer.type = "community_article" if (path == "问答") answer.type = "question" diff --git a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListViewModel.kt b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListViewModel.kt index 4c8008c85b..de270e6933 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/detail/ForumArticleAskListViewModel.kt @@ -37,7 +37,6 @@ class ForumArticleAskListViewModel(application: Application, val bbsId: String = override fun mergeResultLiveData() { mResultLiveData.addSource(mListLiveData) { list -> - if (mPath == "视频") videoList = list.map { if (mPath == "视频") it.type = "video" it.transformForumVideoEntity() 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 9bdce63024..46a29e0fdc 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 @@ -184,6 +184,9 @@ class ForumDetailFragment : BaseLazyTabFragment() { if (mAskForumArticleAskListFragment != null && mViewPager.currentItem == 2) { mAskForumArticleAskListFragment?.refresh() } + if (mVideoForumArticleAskListFragment != null && mViewPager.currentItem == 3) { + mVideoForumArticleAskListFragment?.refresh() + } } LogUtils.uploadAccessToBbs(bbsId, "论坛详情") } diff --git a/app/src/main/res/layout/community_answer_item.xml b/app/src/main/res/layout/community_answer_item.xml index 58ff446464..f3365632d0 100644 --- a/app/src/main/res/layout/community_answer_item.xml +++ b/app/src/main/res/layout/community_answer_item.xml @@ -179,7 +179,7 @@ android:includeFontPadding="false" android:lineSpacingExtra="4dp" android:maxLines="2" - android:text="@{(entity.type == `video`)? entity.articleTitle : entity.questions.title}" + android:text="@{(entity.type.contains(`video`))? entity.articleTitle : entity.questions.title}" android:textColor="@color/text_333333" android:textSize="16sp" app:layout_constraintTop_toBottomOf="@id/user_icon" @@ -195,7 +195,7 @@ android:includeFontPadding="false" android:lineSpacingExtra="4dp" android:maxLines="2" - android:text="@{(entity.type == `video`)? entity.des : entity.brief}" + android:text="@{(entity.type.contains(`video`))? entity.des : entity.brief}" android:textColor="@color/text_666666" android:textSize="14sp" app:layout_constraintTop_toBottomOf="@id/title" @@ -238,7 +238,6 @@ android:id="@+id/popularAnswerContainer" drawable_radius="@{4}" drawable_solidColor="@{0xFFF5F6F7}" - visibleGone="@{entity.popularAnswer!=null}" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="8dp" From 2e09ac033b847cbf2a41232bcdb5a49d49cddc2c Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Wed, 9 Jun 2021 18:25:27 +0800 Subject: [PATCH 53/61] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E8=B4=B4=E7=B1=BB=E5=9E=8B=E8=BD=AC=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt | 2 +- app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt index b99e49876f..3f7bd8d7d8 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt @@ -189,7 +189,7 @@ class AnswerEntity() : Parcelable { fun transformForumVideoEntity(): ForumVideoEntity { val forumVideoEntity = ForumVideoEntity() - if (type == "video") { + if (type.contains("video")) { forumVideoEntity.id = id ?: "" forumVideoEntity.title = articleTitle ?: "" forumVideoEntity.des = des diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt index 6b9a2ec872..0990c02e77 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt @@ -92,7 +92,7 @@ data class ArticleEntity( fun transformForumVideoEntity(): ForumVideoEntity { val forumVideoEntity = ForumVideoEntity() - if (type == "video") { + if (type.contains("video")) { forumVideoEntity.id = id ?: "" forumVideoEntity.title = title forumVideoEntity.des = des From 2afb99b603b7da1a5e7499327feb1b971c6c0eca Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Wed, 9 Jun 2021 18:38:06 +0800 Subject: [PATCH 54/61] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E5=B8=96=E5=8F=91=E5=B8=83=E6=8C=89=E9=92=AE?= =?UTF-8?q?=E4=B8=80=E7=9B=B4=E6=98=AF=E7=BD=AE=E7=81=B0=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/gamecenter/qa/video/publish/VideoPublishFragment.kt | 7 ++++++- app/src/main/res/layout/fragment_video_publish.xml | 4 ++-- 2 files changed, 8 insertions(+), 3 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 d48ee116bc..2f077b35f6 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 @@ -242,6 +242,9 @@ class VideoPublishFragment : NormalFragment() { mBinding.activityTitle.text = videoPatch.tagActivityName mBinding.chooseActivityContainer.isEnabled = false ImageUtils.display(mBinding.videoPoster, videoPatch.poster) + if (mVideoFileEntity == null) { + mVideoFileEntity = VideoFileEntity("", videoPatch.url, videoPatch.poster, videoPatch.length, videoPatch.length, videoPatch.format) + } handleUploadSuccess(videoPatch.url) mBinding.deleteVideoIv.visibility = View.GONE setForumName() @@ -452,7 +455,9 @@ class VideoPublishFragment : NormalFragment() { super.onMenuItemClick(menuItem) when (menuItem?.itemId) { R.id.menu_answer_post -> { - verifyData(false) + if (checkData()){ + verifyData(false) + } } R.id.menu_draft -> { startActivityForResult(VideoDraftActivity.getIntent(requireContext()), REQUEST_CHOOSE_DRAFT) diff --git a/app/src/main/res/layout/fragment_video_publish.xml b/app/src/main/res/layout/fragment_video_publish.xml index 8c2fe378a0..007fd5dc43 100644 --- a/app/src/main/res/layout/fragment_video_publish.xml +++ b/app/src/main/res/layout/fragment_video_publish.xml @@ -8,7 +8,7 @@ android:focusableInTouchMode="true" android:orientation="vertical"> - - + Date: Thu, 10 Jun 2021 10:28:06 +0800 Subject: [PATCH 55/61] =?UTF-8?q?=E5=AE=8C=E6=88=90=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B-=E6=90=9C=E7=B4=A2=E8=AE=BA=E5=9D=9B?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qa/dialog/ChooseForumActivity.kt | 6 ++-- .../qa/dialog/ChooseForumContainerAdapter.kt | 4 ++- .../qa/dialog/ChooseForumContainerFragment.kt | 12 ++++--- .../dialog/ChooseForumContainerViewModel.kt | 33 ++++++++++++++----- .../retrofit/service/ApiService.java | 6 ++++ app/src/main/res/layout/forum_item.xml | 3 +- 6 files changed, 47 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumActivity.kt index f4cf1d7894..98cc78838b 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumActivity.kt @@ -35,7 +35,9 @@ class ChooseForumActivity : BaseActivity() { switchUI(false) } else { switchUI(true) - mSearchResultFragment?.setSearchKey(binding.searchEt.text.toString()) + if (mSearchResultFragment != null && mSearchResultFragment?.isAdded == true) { + mSearchResultFragment?.setSearchKey(binding.searchEt.text.toString()) + } } } binding.closeIv.setOnClickListener { finish() } @@ -68,7 +70,7 @@ class ChooseForumActivity : BaseActivity() { if (mSearchResultFragment == null || mSearchResultFragment?.isAdded == false) { val beginTransaction = supportFragmentManager.beginTransaction() mSearchResultFragment = supportFragmentManager.findFragmentByTag(ChooseForumContainerFragment::class.java.simpleName) as? ChooseForumContainerFragment - ?: ChooseForumContainerFragment.getInstance(ChooseForumContainerFragment.ChooseForumType.SEARCH) as ChooseForumContainerFragment + ?: ChooseForumContainerFragment.getInstance(ChooseForumContainerFragment.ChooseForumType.SEARCH, binding.searchEt.text.toString()) as ChooseForumContainerFragment beginTransaction.replace(binding.searchResultContainer.id, mSearchResultFragment!!, ChooseForumContainerFragment::class.java.simpleName) beginTransaction.commitAllowingStateLoss() } 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 c96a5781af..91b96d2995 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 @@ -6,6 +6,7 @@ import android.view.View import android.view.ViewGroup import androidx.recyclerview.widget.RecyclerView import com.gh.base.BaseRecyclerViewHolder +import com.gh.common.util.HtmlUtils import com.gh.common.util.MtaHelper import com.gh.common.util.goneIf import com.gh.gamecenter.baselist.ListAdapter @@ -30,7 +31,8 @@ class ChooseForumContainerAdapter(content: Context, val onSelectCallback: ((enti holder.binding.forumIcon.displayGameIcon(forumEntity.game.getIcon(), forumEntity.game.iconSubscript) holder.binding.followTv.visibility = View.GONE holder.itemView.setOnClickListener { - onSelectCallback?.invoke(CommunityEntity(forumEntity.id, forumEntity.name, game = forumEntity.game, icon = forumEntity.game.getIcon(), iconSubscript = forumEntity.game.iconSubscript)) + onSelectCallback?.invoke(CommunityEntity(forumEntity.id, HtmlUtils.stripHtml(forumEntity.name), + game = forumEntity.game, icon = forumEntity.game.getIcon(), iconSubscript = forumEntity.game.iconSubscript)) } } } diff --git a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerFragment.kt b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerFragment.kt index 4f6407313b..012e2cbff8 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/dialog/ChooseForumContainerFragment.kt @@ -16,9 +16,11 @@ class ChooseForumContainerFragment : ListFragment(application) { +class ChooseForumContainerViewModel(application: Application, val type: String, var searchKey: String) : ListViewModel(application) { private val mApi: ApiService = RetrofitManager.getInstance(getApplication()).api - override fun provideDataObservable(page: Int): Observable> { - return if (type == ChooseForumContainerFragment.ChooseForumType.ATTENTION.value) { - mApi.getFollowsForum(UserManager.getInstance().userId) - } else { - mApi.hotForum + init { + if (searchKey.isNotEmpty()) { + load(LoadType.REFRESH) } } + override fun provideDataObservable(page: Int): Observable> { + return when (type) { + ChooseForumContainerFragment.ChooseForumType.ATTENTION.value -> { + mApi.getFollowsForum(UserManager.getInstance().userId) + } + ChooseForumContainerFragment.ChooseForumType.HOT.value -> { + mApi.hotForum + } + else -> { + mApi.searchBbs(searchKey, page) + } + } + } + + fun setSearchKeyAndRefresh(searchKey: String) { + this.searchKey = searchKey + load(LoadType.REFRESH) + } override fun mergeResultLiveData() { mResultLiveData.addSource>(mListLiveData) { mResultLiveData.postValue(it) } } - class Factory(val type: String) : ViewModelProvider.NewInstanceFactory() { + class Factory(val type: String, val searchKey: String) : ViewModelProvider.NewInstanceFactory() { override fun create(modelClass: Class): T { - return ChooseForumContainerViewModel(HaloApp.getInstance().application, type) as T + return ChooseForumContainerViewModel(HaloApp.getInstance().application, type, searchKey) as T } } } \ 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 dc671749ef..73e7c73cc9 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 @@ -2648,6 +2648,12 @@ public interface ApiService { @GET("./bbses:hot") Observable> getHotForum(); + /** + * 搜索论坛 + */ + @GET("./bbses:search_name") + Observable> searchBbs(@Query("keyword") String keyword, @Query("page") int page); + /** * 热门论坛列表 */ diff --git a/app/src/main/res/layout/forum_item.xml b/app/src/main/res/layout/forum_item.xml index c609e7b3ed..ee467695a9 100644 --- a/app/src/main/res/layout/forum_item.xml +++ b/app/src/main/res/layout/forum_item.xml @@ -6,6 +6,7 @@ + From d7d2bf266732ae05d9a87179a4c4d2211156895f Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Thu, 10 Jun 2021 11:16:39 +0800 Subject: [PATCH 56/61] =?UTF-8?q?=E6=9B=B4=E6=8D=A2=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E6=94=B6=E8=97=8F/=E5=8F=96=E6=B6=88=E6=94=B6=E8=97=8F?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/gamecenter/retrofit/service/ApiService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 73e7c73cc9..92fc3bbb7f 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 @@ -3075,13 +3075,13 @@ public interface ApiService { /** * 添加问题收藏 */ - @POST("users/{user_id}/favorites/questions/{question_id}") + @POST("users/{user_id}/favorites/bbses/questions/{question_id}") Single favoriteQuestion(@Path("user_id") String userId, @Path("question_id") String questionId); /** * 取消问题收藏 */ - @DELETE("users/{user_id}/favorites/questions/{question_id}") + @DELETE("users/{user_id}/favorites/bbses/questions/{question_id}") Single deleteFavoriteQuestion(@Path("user_id") String userId, @Path("question_id") String questionId); /** From e81fa4ff1a84880525dbf79a262cc7e2b2f8b8c3 Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Thu, 10 Jun 2021 11:41:02 +0800 Subject: [PATCH 57/61] =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E5=B1=95=E7=A4=BA=E5=9B=BE=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/gamecenter/entity/ForumDetailEntity.kt | 3 +++ .../main/java/com/gh/gamecenter/entity/ForumEntity.kt | 3 ++- .../gh/gamecenter/forum/detail/ForumDetailFragment.kt | 9 +++++++-- .../forum/home/ForumArticleAskItemViewHolder.kt | 11 +++++++++++ .../gh/gamecenter/forum/home/ForumRecordsAdapter.kt | 6 +++++- .../com/gh/gamecenter/forum/list/ForumListAdapter.kt | 2 +- .../gamecenter/personalhome/PersonalItemViewHolder.kt | 10 +++++----- .../qa/answer/BaseAnswerOrArticleItemViewHolder.kt | 10 +++++++++- .../java/com/gh/gamecenter/qa/entity/ArticleEntity.kt | 1 + .../main/java/com/gh/gamecenter/room/AppDatabase.java | 2 +- app/src/main/res/layout/community_answer_item.xml | 4 ++-- app/src/main/res/layout/fragment_forum_detail.xml | 1 - app/src/main/res/layout/user_history_item.xml | 3 ++- 13 files changed, 49 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/entity/ForumDetailEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/ForumDetailEntity.kt index 3fa58061b2..d94d423282 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/ForumDetailEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/ForumDetailEntity.kt @@ -9,6 +9,7 @@ data class ForumDetailEntity( var game: SimpleGame = SimpleGame(), var background: String = "", var name: String = "", + var icon: String = "", var moderator: ArrayList = arrayListOf(), @SerializedName("top") var topLink: ArrayList = arrayListOf(), @@ -21,9 +22,11 @@ data class ForumDetailEntity( val forumEntity = ForumEntity() forumEntity.id = id forumEntity.name = name + forumEntity.icon = icon forumEntity.game = game forumEntity.orderTag = System.currentTimeMillis() forumEntity.unread = false + forumEntity.type = type return forumEntity } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/entity/ForumEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/ForumEntity.kt index e19b513735..bd408090f5 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/ForumEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/ForumEntity.kt @@ -17,7 +17,8 @@ data class ForumEntity( //本地字段,判断是否是推荐论坛 var isRecommend: Boolean = false, var orderTag: Long = 0, - var unread: Boolean = false + var unread: Boolean = false, + var type: String = "" //game_bbs/official_bbs ) { fun transformUnreadEntity(): ForumUnreadEntity { val forumUnreadEntity = ForumUnreadEntity() 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 46a29e0fdc..7c7e8706d4 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 @@ -206,8 +206,13 @@ class ForumDetailFragment : BaseLazyTabFragment() { private fun initUI() { mForumDetail?.apply { mBinding.entity = this - mBinding.forumThumbSmall.displayGameIcon(game.getIcon(), game.iconSubscript) - mBinding.forumThumbBig.displayGameIcon(game.getIcon(), game.iconSubscript) + if (type == "official_bbs") { + mBinding.forumThumbSmall.displayGameIcon(icon, null) + mBinding.forumThumbBig.displayGameIcon(icon, null) + } else { + mBinding.forumThumbSmall.displayGameIcon(game.getIcon(), game.iconSubscript) + mBinding.forumThumbBig.displayGameIcon(game.getIcon(), game.iconSubscript) + } mBinding.toolbar.setNavigationIcon(R.drawable.ic_bar_back_light) initModeratorHeadView(moderator) if (topLink.isNotEmpty()) { 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 b7bd4e7199..46c1be43e3 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 @@ -245,12 +245,23 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B voteCount.text = "邀请回答" voteIcon.setImageDrawable(ContextCompat.getDrawable(itemView.context, R.drawable.community_invite_follow)) } + + if (entity.bbs.type == "official_bbs") { + forumIcon?.displayGameIcon(entity.bbs.icon, null) + } else { + forumIcon?.displayGameIcon(entity.bbs.game?.getIcon(), entity.bbs.game?.iconSubscript) + } + forumNameTv.setOnClickListener { MtaHelper.onEvent(getEventId(entrance), getKey(entrance), if (entity.bbs.name.isEmpty()) entity.bbs.name else entity.bbs.name) itemView.context.startActivity(ForumDetailActivity.getIntent(itemView.context, entity.bbs.id, entrance)) LogUtils.uploadAccessToBbs(entity.bbs.id, "文章外所属论坛") } + forumNameContainer?.setOnClickListener { + forumNameTv.performClick() + } + commentCountContainer.setOnClickListener { if (filterIllegalCommentStatus(entity.commentable, entity.active)) return@setOnClickListener if (entity.type == "community_article") { diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ForumRecordsAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ForumRecordsAdapter.kt index 054451e924..d033ff6ec3 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ForumRecordsAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ForumRecordsAdapter.kt @@ -37,7 +37,11 @@ class ForumRecordsAdapter(context: Context, entity = forumEntity executePendingBindings() - forumIv.displayGameIcon(forumEntity.game.getIcon(), forumEntity.game.iconSubscript) + if (forumEntity.type == "official_bbs") { + forumIv.displayGameIcon(forumEntity.icon, null) + } else { + forumIv.displayGameIcon(forumEntity.game.getIcon(), forumEntity.game.iconSubscript) + } root.setOnClickListener { mContext.startActivity(ForumDetailActivity.getIntent(mContext, forumEntity.id, entrance)) diff --git a/app/src/main/java/com/gh/gamecenter/forum/list/ForumListAdapter.kt b/app/src/main/java/com/gh/gamecenter/forum/list/ForumListAdapter.kt index 784ba74a5f..1a00d7d358 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/list/ForumListAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/list/ForumListAdapter.kt @@ -52,7 +52,7 @@ class ForumListAdapter(context: Context, executePendingBindings() if (mViewModel?.type == ForumListActivity.TYPE_OFFICIAL) { - forumIcon.displayGameIcon(forumEntity.icon, "") + forumIcon.displayGameIcon(forumEntity.icon, null) } else { forumIcon.displayGameIcon(forumEntity.game.getIcon(), forumEntity.game.iconSubscript) } diff --git a/app/src/main/java/com/gh/gamecenter/personalhome/PersonalItemViewHolder.kt b/app/src/main/java/com/gh/gamecenter/personalhome/PersonalItemViewHolder.kt index 79ecde8198..9f61e07cd8 100644 --- a/app/src/main/java/com/gh/gamecenter/personalhome/PersonalItemViewHolder.kt +++ b/app/src/main/java/com/gh/gamecenter/personalhome/PersonalItemViewHolder.kt @@ -23,10 +23,10 @@ class PersonalItemViewHolder(val binding: UserHistoryItemBinding) : BaseAnswerOr bindCommendAndVote(entity.transformAnswerEntity(), entrance) // } - forumNameContainer?.visibility = View.GONE - forumNameContainer?.setOnClickListener { - MtaHelper.onEvent(getEventId(entrance), getKey(entrance), entity.community.name) - itemView.context.startActivity(ForumDetailActivity.getIntent(itemView.context, entity.community.id, entrance)) - } + forumNameLl?.visibility = View.GONE +// forumNameContainer?.setOnClickListener { +// MtaHelper.onEvent(getEventId(entrance), getKey(entrance), entity.community.name) +// itemView.context.startActivity(ForumDetailActivity.getIntent(itemView.context, entity.community.id, entrance)) +// } } } 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 1e68813f1c..f46d218bcf 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 @@ -6,6 +6,7 @@ import android.widget.TextView import com.airbnb.lottie.LottieAnimationView import com.gh.base.BaseRecyclerViewHolder import com.gh.common.util.* +import com.gh.common.view.GameIconView import com.gh.gamecenter.R import com.gh.gamecenter.entity.CommunityEntity import com.gh.gamecenter.entity.VoteEntity @@ -40,8 +41,9 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH val commentCountContainer: View = itemView.findViewById(R.id.comment_count_container) val voteCountContainer: View = itemView.findViewById(R.id.vote_count_container) val forumNameTv: View = itemView.findViewById(R.id.forumNameTv) + val forumNameLl: View? = itemView.findViewById(R.id.forumNameLl) val forumNameContainer: View? = itemView.findViewById(R.id.forumNameContainer) - val concernBtn: View? = itemView.findViewById(R.id.concernBtn) + val forumIcon: GameIconView? = itemView.findViewById(R.id.forumIcon) open fun bindCommendAndVote(entity: AnswerEntity, entrance: String) { @@ -105,6 +107,12 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH open fun bindCommendAndVote(entity: ArticleEntity, entrance: String) { binNormalView(entity.transformAnswerEntity()) + if (entity.bbs.type == "official_bbs") { + forumIcon?.displayGameIcon(entity.bbs.icon, null) + } else { + forumIcon?.displayGameIcon(entity.bbs.game?.getIcon(), entity.bbs.game?.iconSubscript) + } + forumNameTv.setOnClickListener { MtaHelper.onEvent(getEventId(entrance), getKey(entrance), if (entity.bbs.name.isEmpty()) entity.community.name else entity.bbs.name) itemView.context.startActivity(ForumDetailActivity.getIntent(itemView.context, entity.community.id, entrance)) diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt index 0990c02e77..331897d10d 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt @@ -73,6 +73,7 @@ data class ArticleEntity( answer.vote = count.vote answer.active = active answer.commentCount = count.comment + answer.answerCount = count.answer answer.orderTag = orderTag answer.read = read answer.me = me diff --git a/app/src/main/java/com/gh/gamecenter/room/AppDatabase.java b/app/src/main/java/com/gh/gamecenter/room/AppDatabase.java index 1a9f35e779..fe59c96bc7 100644 --- a/app/src/main/java/com/gh/gamecenter/room/AppDatabase.java +++ b/app/src/main/java/com/gh/gamecenter/room/AppDatabase.java @@ -199,7 +199,7 @@ public abstract class AppDatabase extends RoomDatabase { static final Migration MIGRATION_18_19 = new Migration(18, 19) { @Override public void migrate(@NonNull SupportSQLiteDatabase database) { - database.execSQL("CREATE TABLE ForumEntity (id TEXT NOT NULL PRIMARY KEY, game TEXT NOT NULL, name TEXT NOT NULL, icon TEXT NOT NULL, isFollow INTEGER NOT NULL, isRecommend INTEGER NOT NULL, orderTag INTEGER NOT NULL, unread INTEGER NOT NULL)"); + database.execSQL("CREATE TABLE ForumEntity (id TEXT NOT NULL PRIMARY KEY, game TEXT NOT NULL, name TEXT NOT NULL, icon TEXT NOT NULL, isFollow INTEGER NOT NULL, isRecommend INTEGER NOT NULL, orderTag INTEGER NOT NULL, unread INTEGER NOT NULL, type TEXT NOT NULL)"); database.execSQL("Alter TABLE AnswerEntity add des TEXT NOT NULL DEFAULT ''"); database.execSQL("Alter TABLE AnswerEntity add url TEXT NOT NULL DEFAULT ''"); database.execSQL("Alter TABLE AnswerEntity add videoInfo TEXT NOT NULL DEFAULT ''"); diff --git a/app/src/main/res/layout/community_answer_item.xml b/app/src/main/res/layout/community_answer_item.xml index f3365632d0..5eb69753f6 100644 --- a/app/src/main/res/layout/community_answer_item.xml +++ b/app/src/main/res/layout/community_answer_item.xml @@ -335,11 +335,11 @@ android:background="@drawable/bg_shape_f5_radius_999"> + style="@style/frescoCircleStyle" /> - Date: Thu, 10 Jun 2021 15:45:50 +0800 Subject: [PATCH 58/61] =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E7=82=B9=E8=B5=9E=E3=80=81=E8=AF=84=E8=AE=BA=E3=80=81=E5=9B=9E?= =?UTF-8?q?=E7=AD=94=E3=80=81=E6=94=B6=E8=97=8F=E6=95=B0=E6=8D=AE=E5=AD=97?= =?UTF-8?q?=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gh/gamecenter/entity/ForumVideoEntity.kt | 6 ++-- .../detail/ForumArticleAskListAdapter.kt | 2 +- .../search/ForumContentSearchListAdapter.kt | 2 +- .../personalhome/home/UserHistoryFragment.kt | 4 +-- .../BaseAnswerOrArticleItemViewHolder.kt | 30 +++++++++---------- .../gh/gamecenter/qa/entity/AnswerEntity.kt | 3 +- .../gh/gamecenter/qa/entity/ArticleEntity.kt | 4 ++- .../video/detail/ForumVideoDetailFragment.kt | 4 +-- .../detail/comment/VideoCommentFragment.kt | 12 ++++---- .../detail/comment/VideoCommentViewModel.kt | 2 +- .../qa/video/detail/desc/VideoDescAdapter.kt | 4 +-- .../detail/desc/VideoDescTopViewHolder.kt | 4 +-- .../video/detail/desc/VideoDescViewModel.kt | 8 ++--- app/src/main/res/layout/item_forum_video.xml | 2 +- 14 files changed, 44 insertions(+), 43 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 c7d2cd153e..dd4bb6a4c5 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/ForumVideoEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/ForumVideoEntity.kt @@ -1,6 +1,7 @@ package com.gh.gamecenter.entity import android.os.Parcelable +import com.gh.gamecenter.qa.entity.Count import com.google.gson.annotations.SerializedName import kotlinx.android.parcel.IgnoredOnParcel import kotlinx.android.parcel.Parcelize @@ -30,10 +31,6 @@ open class ForumVideoEntity( @SerializedName("game_id") var gameId: String = "", var type: String = "", - var vote: Int = 0, - @SerializedName("comment_count") - var commentCount: Int = 0, - var favorite: Int = 0, var share: Int = 0, var time: Time = Time(), @SerializedName("video_info") @@ -41,6 +38,7 @@ open class ForumVideoEntity( @SerializedName("is_jx") var isHighlighted: Boolean = true, var bbs: CommunityEntity? = null, + var count: Count = Count(), @IgnoredOnParcel var videoIsMuted: Boolean = false //是否静音标记 ) : Parcelable 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 d9c2ea7337..291c7c8bfd 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 @@ -56,7 +56,7 @@ class ForumArticleAskListAdapter(context: Context, val bbsId: String, val mEntra questions.id = answer.id ?: "" questions.title = answer.articleTitle questions.description = answer.description - questions.answerCount = if (path == "全部") answer.count.answer else answer.answerCount + questions.answerCount = answer.count.answer answer.questions = questions if (path == "精华") answer.type = "community_article" if (path == "问答") answer.type = "question" 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 db23647611..cace5649a3 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 @@ -73,7 +73,7 @@ class ForumContentSearchListAdapter(context: Context, val mListViewModel: ForumC val questions = Questions() questions.id = answer.id ?: "" questions.title = answer.articleTitle - questions.answerCount = answer.answerCount + questions.answerCount = answer.count.answer answer.questions = questions if (mEntrance == "论坛首页+(搜索)") { 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 f7167737d2..6ad503ba5a 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 @@ -221,8 +221,8 @@ class UserHistoryFragment : ListFragment { val resultData = data.getParcelableExtra(ForumVideoEntity::class.java.simpleName) historyEntity?.apply { - count.vote = resultData?.vote ?: 0 - count.comment = resultData?.commentCount ?: 0 + count.vote = resultData?.count?.vote ?: 0 + count.comment = resultData?.count?.comment ?: 0 des = HtmlUtils.stripHtmlCode(resultData?.des ?: "") title = resultData?.title ?: "" me.isVoted = resultData?.me?.isVoted ?: false 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 1e68813f1c..aa9c43317f 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 @@ -160,11 +160,11 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH fun binNormalView(entity: AnswerEntity) { setVoteAndCommentStyle(entity) if (entity.type == "question") { - commentCount.text = if (entity.answerCount > 0) entity.answerCount.toString() else "回答" + commentCount.text = if (entity.count.answer > 0) entity.count.answer.toString() else "回答" voteCount.text = "邀请回答" } else { - commentCount.text = if (entity.commentCount > 0) entity.commentCount.toString() else "评论" - voteCount.text = if (entity.vote > 0) entity.vote.toString() else "赞同" + commentCount.text = if (entity.count.comment > 0) entity.count.comment.toString() else "评论" + voteCount.text = if (entity.count.vote > 0) entity.count.vote.toString() else "赞同" } } @@ -201,8 +201,8 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH @SuppressLint("CheckResult") fun voteAnswer(entity: AnswerEntity) { - entity.vote = entity.vote + 1 - voteCount.text = if (entity.vote > 0) entity.vote.toString() else "赞同" + entity.count.vote = entity.count.vote + 1 + voteCount.text = if (entity.count.vote > 0) entity.count.vote.toString() else "赞同" playVoteAnimation() if (entity.type == "video") { @@ -217,9 +217,9 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH override fun onFailure(exception: Exception) { super.onFailure(exception) - entity.vote = entity.vote - 1 + entity.count.vote = entity.count.vote - 1 entity.me.isVoted = false - voteCount.text = if (entity.vote > 0) entity.vote.toString() else "赞同" + voteCount.text = if (entity.count.vote > 0) entity.count.vote.toString() else "赞同" setVoteAndCommentStyle(entity) } }) @@ -262,13 +262,13 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH setVoteAndCommentStyle(entity) true } else { - entity.vote = entity.vote - 1 + entity.count.vote = entity.count.vote - 1 if (entity.type == "community_article") { entity.me.isCommunityArticleVote = true } else { entity.me.isAnswerVoted = true } - voteCount.text = if (entity.vote > 0) entity.vote.toString() else "赞同" + voteCount.text = if (entity.count.vote > 0) entity.count.vote.toString() else "赞同" setVoteAndCommentStyle(entity) false } @@ -280,11 +280,11 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH @SuppressLint("CheckResult") fun cancelAnswerVote(entity: AnswerEntity) { - entity.vote = entity.vote - 1 + entity.count.vote = entity.count.vote - 1 voteIcon.isChecked = false voteCount.setTextColor(R.color.text_999999.toColor()) - voteCount.text = if (entity.vote > 0) entity.vote.toString() else "赞同" + voteCount.text = if (entity.count.vote > 0) entity.count.vote.toString() else "赞同" if (entity.type == "video") { RetrofitManager.getInstance(itemView.context) @@ -297,9 +297,9 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH override fun onFailure(exception: Exception) { super.onFailure(exception) - entity.vote = entity.vote + 1 + entity.count.vote = entity.count.vote + 1 entity.me.isVoted = true - voteCount.text = if (entity.vote > 0) entity.vote.toString() else "赞同" + voteCount.text = if (entity.count.vote > 0) entity.count.vote.toString() else "赞同" setVoteAndCommentStyle(entity) } }) @@ -339,13 +339,13 @@ open class BaseAnswerOrArticleItemViewHolder(itemView: View) : BaseRecyclerViewH setVoteAndCommentStyle(entity) true } else { - entity.vote = entity.vote + 1 + entity.count.vote = entity.count.vote + 1 if (entity.type == "community_article") { entity.me.isCommunityArticleVote = true } else { entity.me.isAnswerVoted = true } - voteCount.text = if (entity.vote > 0) entity.vote.toString() else "赞同" + voteCount.text = if (entity.count.vote > 0) entity.count.vote.toString() else "赞同" setVoteAndCommentStyle(entity) false } diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt index 3f7bd8d7d8..e36943a721 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt @@ -219,7 +219,7 @@ class AnswerEntity() : Parcelable { articleEntity.videos = videos articleEntity.user = user articleEntity.time = TimeEntity(time ?: 0) - articleEntity.count = Count(commentCount, vote, answerCount) + articleEntity.count = count articleEntity.active = active articleEntity.orderTag = orderTag articleEntity.read = read @@ -234,6 +234,7 @@ class AnswerEntity() : Parcelable { articleEntity.poster = poster articleEntity.length = length articleEntity.type = type + articleEntity.count = count return articleEntity } diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt index 0990c02e77..ce8fbe64e1 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt @@ -87,6 +87,7 @@ data class ArticleEntity( answer.videoInfo = videoInfo answer.poster = poster answer.length = length + answer.count = count return answer } @@ -121,7 +122,8 @@ data class Count( @SyncPage(syncNames = [SyncFieldConstants.ARTICLE_VOTE_COUNT, SyncFieldConstants.ANSWER_VOTE_COUNT]) var vote: Int = 0, @SyncPage(syncNames = [SyncFieldConstants.ANSWER_COUNT]) - var answer: Int = 0) : Parcelable + var answer: Int = 0, + var favorite: Int = 0) : Parcelable @Parcelize data class TimeEntity(var create: Long = 0, 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 1cd82fd80a..6fa8f5ae80 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 @@ -140,7 +140,7 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { if (it.status == Status.SUCCESS) { val entity = it.data as ForumVideoEntity mForumVideoEntity = entity - mCommentCountTv?.text = entity.commentCount.toString() + mCommentCountTv?.text = entity.count.comment.toString() mBinding.topVideoView.setForumVideoEntity(mForumVideoEntity) updateVideoParams() setUpTopVideo(entity.url, entity.poster) @@ -166,7 +166,7 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { }) mViewModel.updateDetailLiveData.observeNonNull(this) { mForumVideoEntity = it - mCommentCountTv?.text = it.commentCount.toString() + mCommentCountTv?.text = it.count.comment.toString() setGameInfo(it) } } 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 e03869329e..204dcd0ce3 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 @@ -77,16 +77,16 @@ class VideoCommentFragment : LazyListFragment Date: Thu, 10 Jun 2021 16:26:35 +0800 Subject: [PATCH 59/61] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B8=B8=E6=88=8F?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B6=E9=83=A8=E9=9D=99=E9=9F=B3=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gh/gamecenter/MainActivity.java | 2 -- .../gh/gamecenter/gamedetail/video/TopVideoView.kt | 12 +++++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index 1aa01cf578..1cf5af2258 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -303,8 +303,6 @@ public class MainActivity extends BaseActivity { } }); - //恢复顶部视频默认静音状态 - SPUtils.setBoolean(Constants.SP_TOP_VIDEO_VOICE, true); //恢复视频流非Wifi提醒 SPUtils.setBoolean(Constants.SP_NON_WIFI_TIPS, true); //重置首页视频播放进度 diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt index fb771ee667..87a1d582a1 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt @@ -54,6 +54,8 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS get() = StringUtils.combineTwoString(video?.title, video?.videoId) init { + SPUtils.setBoolean(getMuteKey(), SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true)) + post { gestureDetector = GestureDetector(getContext().applicationContext, object : GestureDetector.SimpleOnGestureListener() { override fun onSingleTapConfirmed(e: MotionEvent): Boolean { @@ -173,7 +175,7 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS } fun updateMuteStatus() { - val topVideoVoiceStatus = SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true) + val topVideoVoiceStatus = SPUtils.getBoolean(getMuteKey(), true) viewModel?.videoIsMuted = topVideoVoiceStatus if (viewModel?.videoIsMuted == true) { mute() @@ -186,7 +188,7 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS viewModel?.videoIsMuted = true volume.setImageResource(R.drawable.ic_game_detail_volume_off) CustomManager.getCustomManager(getKey()).isNeedMute = true - SPUtils.setBoolean(Constants.SP_TOP_VIDEO_VOICE, true) + SPUtils.setBoolean(getMuteKey(), true) if (isManual) { Utils.toast(context, "当前处于静音状态") uploadVideoStreamingPlaying("点击静音") @@ -198,7 +200,7 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS viewModel?.videoIsMuted = false volume.setImageResource(R.drawable.ic_game_detail_volume_on) CustomManager.getCustomManager(getKey()).isNeedMute = false - SPUtils.setBoolean(Constants.SP_TOP_VIDEO_VOICE, false) + SPUtils.setBoolean(getMuteKey(), false) if (isManual) { uploadVideoStreamingPlaying("取消静音") MtaHelper.onEvent("游戏详情_顶部视频", "${getMtaKeyPrefix()}-解除静音", combinedTitleAndId) @@ -468,4 +470,8 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS else -> "" } } + + fun getMuteKey(): String { + return Constants.SP_VIDEO_PLAY_MUTE + uuid + } } \ No newline at end of file From b1f6c7d55c623b5acdf6e0219bc6a376bc75dcab Mon Sep 17 00:00:00 2001 From: lyr <15622190878@163.com> Date: Thu, 10 Jun 2021 18:06:55 +0800 Subject: [PATCH 60/61] =?UTF-8?q?1.=E4=BC=98=E5=8C=96=E6=B8=B8=E6=88=8F?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=A1=B6=E9=83=A8=E8=A7=86=E9=A2=91=E5=92=8C?= =?UTF-8?q?=E8=AE=BA=E5=9D=9B=E4=BF=A1=E6=81=AF=E6=B5=81=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E7=9A=84=E9=9D=99=E9=9F=B3=E8=AE=BE=E7=BD=AE=202.=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=B8=AA=E4=BA=BA=E4=B8=BB=E9=A1=B5=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E7=9A=84=E7=B1=BB=E5=9E=8B=E3=80=81=E7=82=B9?= =?UTF-8?q?=E8=B5=9E=E3=80=81=E8=AF=84=E8=AE=BA=E3=80=81=E5=9B=9E=E7=AD=94?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=AD=97=E6=AE=B5=E8=BD=AC=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/PersonalHistoryEntity.kt | 26 +++++++++---------- .../forum/home/ArticleItemVideoView.kt | 10 ------- .../home/ForumArticleAskItemViewHolder.kt | 5 ++-- .../gamedetail/GameDetailViewModel.kt | 2 +- .../gamedetail/video/TopVideoView.kt | 10 ------- .../personalhome/home/UserHistoryAdapter.kt | 5 ++-- .../gh/gamecenter/qa/entity/AnswerEntity.kt | 4 +++ .../gh/gamecenter/qa/entity/ArticleEntity.kt | 4 +++ 8 files changed, 28 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/com/gh/gamecenter/entity/PersonalHistoryEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/PersonalHistoryEntity.kt index c72da67917..6ba18307ab 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/PersonalHistoryEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/PersonalHistoryEntity.kt @@ -3,10 +3,7 @@ package com.gh.gamecenter.entity import android.os.Parcelable import com.gh.common.annotation.SyncPage import com.gh.common.syncpage.SyncFieldConstants -import com.gh.gamecenter.qa.entity.AnswerEntity -import com.gh.gamecenter.qa.entity.CommunityVideoEntity -import com.gh.gamecenter.qa.entity.ImageInfo -import com.gh.gamecenter.qa.entity.Questions +import com.gh.gamecenter.qa.entity.* import com.google.gson.annotations.SerializedName import kotlinx.android.parcel.IgnoredOnParcel import kotlinx.android.parcel.Parcelize @@ -66,7 +63,16 @@ data class PersonalHistoryEntity( var vote: Int = -1, @SyncPage(syncNames = [SyncFieldConstants.ANSWER_COUNT]) var answer: Int = -1, - var reply: Int = -1) : Parcelable + var reply: Int = -1) : Parcelable { + + fun transformForumCount(): com.gh.gamecenter.qa.entity.Count { + val count = com.gh.gamecenter.qa.entity.Count() + count.comment = comment + count.vote = vote + count.answer = answer + return count + } + } @Parcelize data class Comment( @@ -122,17 +128,11 @@ data class PersonalHistoryEntity( answer.images = images answer.videos = videos answer.time = time - answer.vote = count.vote - answer.commentCount = count.comment + answer.count = count.transformForumCount() answer.me = me answer.commentable = commentable answer.articleCommunityId = community.id - if (type.contains("article")) { - answer.type = "community_article" - } - if (type.contains("video")) { - answer.type = "video" - } + answer.type = type return answer } diff --git a/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt b/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt index bb103dfae7..826479818d 100644 --- a/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt +++ b/app/src/main/java/com/gh/gamecenter/forum/home/ArticleItemVideoView.kt @@ -10,7 +10,6 @@ import android.widget.SeekBar import android.widget.TextView import androidx.core.content.ContextCompat import com.facebook.drawee.view.SimpleDraweeView -import com.gh.common.constant.Constants import com.gh.common.util.* import com.gh.gamecenter.R import com.gh.gamecenter.entity.ForumVideoEntity @@ -44,8 +43,6 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At } init { - SPUtils.setBoolean(getMuteKey(), SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true)) - post { volume.setOnClickListener { toggleMute() } } @@ -270,7 +267,6 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At } fun updateMuteStatus() { - mVideoEntity?.videoIsMuted = SPUtils.getBoolean(getMuteKey(), true) if (mVideoEntity?.videoIsMuted == true) { mute() } else { @@ -280,7 +276,6 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At fun mute(isManual: Boolean = false) { mVideoEntity?.videoIsMuted = true - SPUtils.setBoolean(getMuteKey(), true) volume.setImageResource(R.drawable.ic_article_video_volume_off) CustomManager.getCustomManager(getKey()).isNeedMute = true if (isManual) { @@ -291,7 +286,6 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At fun unMute(isManual: Boolean = false) { mVideoEntity?.videoIsMuted = false - SPUtils.setBoolean(getMuteKey(), false) volume.setImageResource(R.drawable.ic_article_video_volume_on) CustomManager.getCustomManager(getKey()).isNeedMute = false if (isManual) { @@ -352,10 +346,6 @@ class ArticleItemVideoView @JvmOverloads constructor(context: Context, attrs: At return uuid } - fun getMuteKey(): String { - return Constants.SP_VIDEO_PLAY_MUTE + uuid - } - fun getCurrentPosition(): Long { return mCurrentPosition } 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 46c1be43e3..958cdac5a1 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 @@ -207,7 +207,8 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B }) .build(visibleView) visibleView.run { - updateVideoData(entity.transformForumVideoEntity()) + val forumVideoEntity = entity.transformForumVideoEntity() + updateVideoData(forumVideoEntity) updateThumb(video.poster) updateDurationTv(video.duration) @@ -219,7 +220,7 @@ class ForumArticleAskItemViewHolder(val binding: CommunityAnswerItemBinding) : B } orientationUtils.resolveByClick() horizontalVideoView.uuid = uuid - horizontalVideoView.updateVideoData(entity.transformForumVideoEntity()) + horizontalVideoView.updateVideoData(forumVideoEntity) horizontalVideoView.updateThumb(video.poster) horizontalVideoView.violenceUpdateMuteStatus() horizontalVideoView.setFullViewStatus() diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt index 105fa9ec46..60a0855635 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt @@ -51,7 +51,7 @@ class GameDetailViewModel(application: Application, // 供被包裹 fragment (如 FuliFragment) 用的合并用户数据后的游戏数据 liveData val unifiedGameDetailWithUserRelatedInfoForChildLiveData = MutableLiveData() - var videoIsMuted = true + var videoIsMuted = SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true) var displayTopVideo: Boolean = false fun loadData() { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt index 87a1d582a1..667e49fe40 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/video/TopVideoView.kt @@ -54,8 +54,6 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS get() = StringUtils.combineTwoString(video?.title, video?.videoId) init { - SPUtils.setBoolean(getMuteKey(), SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true)) - post { gestureDetector = GestureDetector(getContext().applicationContext, object : GestureDetector.SimpleOnGestureListener() { override fun onSingleTapConfirmed(e: MotionEvent): Boolean { @@ -175,8 +173,6 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS } fun updateMuteStatus() { - val topVideoVoiceStatus = SPUtils.getBoolean(getMuteKey(), true) - viewModel?.videoIsMuted = topVideoVoiceStatus if (viewModel?.videoIsMuted == true) { mute() } else { @@ -188,7 +184,6 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS viewModel?.videoIsMuted = true volume.setImageResource(R.drawable.ic_game_detail_volume_off) CustomManager.getCustomManager(getKey()).isNeedMute = true - SPUtils.setBoolean(getMuteKey(), true) if (isManual) { Utils.toast(context, "当前处于静音状态") uploadVideoStreamingPlaying("点击静音") @@ -200,7 +195,6 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS viewModel?.videoIsMuted = false volume.setImageResource(R.drawable.ic_game_detail_volume_on) CustomManager.getCustomManager(getKey()).isNeedMute = false - SPUtils.setBoolean(getMuteKey(), false) if (isManual) { uploadVideoStreamingPlaying("取消静音") MtaHelper.onEvent("游戏详情_顶部视频", "${getMtaKeyPrefix()}-解除静音", combinedTitleAndId) @@ -470,8 +464,4 @@ class TopVideoView @JvmOverloads constructor(context: Context, attrs: AttributeS else -> "" } } - - fun getMuteKey(): String { - return Constants.SP_VIDEO_PLAY_MUTE + uuid - } } \ No newline at end of file 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 d7bb13e082..08486ac404 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 @@ -232,7 +232,8 @@ class UserHistoryAdapter(context: Context, }) .build(visibleView) visibleView.run { - updateVideoData(entity.transformForumVideoEntity()) + val forumVideoEntity = entity.transformForumVideoEntity() + updateVideoData(forumVideoEntity) updateThumb(video.poster) updateDurationTv(video.duration) @@ -244,7 +245,7 @@ class UserHistoryAdapter(context: Context, } orientationUtils.resolveByClick() horizontalVideoView.uuid = uuid - horizontalVideoView.updateVideoData(entity.transformForumVideoEntity()) + horizontalVideoView.updateVideoData(forumVideoEntity) horizontalVideoView.updateThumb(video.poster) horizontalVideoView.violenceUpdateMuteStatus() horizontalVideoView.setFullViewStatus() diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt index e36943a721..7c3fa19d73 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/AnswerEntity.kt @@ -9,7 +9,9 @@ import androidx.room.PrimaryKey import androidx.room.TypeConverters import com.gh.common.annotation.SyncIgnore import com.gh.common.annotation.SyncPage +import com.gh.common.constant.Constants import com.gh.common.syncpage.SyncFieldConstants +import com.gh.common.util.SPUtils import com.gh.gamecenter.entity.* import com.gh.gamecenter.room.converter.* import com.google.gson.annotations.SerializedName @@ -197,9 +199,11 @@ class AnswerEntity() : Parcelable { forumVideoEntity.poster = poster forumVideoEntity.length = length forumVideoEntity.videoInfo = videoInfo + forumVideoEntity.videoIsMuted = SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true) } else { forumVideoEntity.title = questions.title ?: "" forumVideoEntity.des = brief ?: "" + forumVideoEntity.videoIsMuted = SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true) if (getPassVideos().isNotEmpty()) { forumVideoEntity.id = getPassVideos()[0].id forumVideoEntity.url = getPassVideos()[0].url diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt index e461cfdeae..fa82bb486c 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt @@ -6,7 +6,9 @@ import androidx.room.Ignore import androidx.room.PrimaryKey import androidx.room.TypeConverters import com.gh.common.annotation.SyncPage +import com.gh.common.constant.Constants import com.gh.common.syncpage.SyncFieldConstants +import com.gh.common.util.SPUtils import com.gh.gamecenter.entity.* import com.gh.gamecenter.room.converter.* import com.google.gson.annotations.SerializedName @@ -102,6 +104,7 @@ data class ArticleEntity( forumVideoEntity.poster = poster forumVideoEntity.length = length forumVideoEntity.videoInfo = videoInfo + forumVideoEntity.videoIsMuted = SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true) } else { forumVideoEntity.title = title ?: "" forumVideoEntity.des = brief ?: "" @@ -110,6 +113,7 @@ data class ArticleEntity( forumVideoEntity.url = getPassVideos()[0].url forumVideoEntity.poster = getPassVideos()[0].poster forumVideoEntity.videoInfo = VideoInfo(width = getPassVideos()[0].width, height = getPassVideos()[0].height) + forumVideoEntity.videoIsMuted = SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true) } } return forumVideoEntity From 4a8e91bbffe2bff75329f65ef910787f9b8dc851 Mon Sep 17 00:00:00 2001 From: jack <1484288157@qq.com> Date: Fri, 11 Jun 2021 10:09:13 +0800 Subject: [PATCH 61/61] =?UTF-8?q?=E5=AF=B9=E6=8E=A5=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E5=B8=96=E5=8A=A0=E7=B2=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gh/gamecenter/entity/MeEntity.kt | 5 +- .../article/detail/ArticleDetailFragment.kt | 2 +- .../qa/video/detail/ForumTopVideoView.kt | 2 - .../video/detail/ForumVideoDetailFragment.kt | 48 ++++++++++++++++--- .../video/detail/ForumVideoDetailViewModel.kt | 22 ++++++++- .../retrofit/service/ApiService.java | 6 +++ 6 files changed, 74 insertions(+), 11 deletions(-) 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 1305149118..9726c7979b 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/MeEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/MeEntity.kt @@ -163,8 +163,11 @@ data class Permissions( var topCommunityArticleComment: Int = GUEST, // 置顶文章评论 @SerializedName("hide-community-article-comment") - var hideCommunityArticleComment: Int = GUEST // 隐藏文章评论 + var hideCommunityArticleComment: Int = GUEST, // 隐藏文章评论 + //视频相关 + @SerializedName("choiceness-video") + var highlightVideo: Int = GUEST // 加精视频帖 ) : Parcelable { companion object { // -1 为无权限,0 为初级权限,1 为高级权限 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 e528f74d0e..0c65e71510 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 @@ -403,7 +403,7 @@ class ArticleDetailFragment : BaseCommentFragment + if (isHighlighted) { + if (mForumVideoEntity!!.me.moderatorPermissions.highlightVideo == Permissions.REPORTER) { + toast("提交成功") + } else { + toast("操作成功") + requireActivity().finish() + } + } else { + toast("权限错误,请刷新后重试") + } + } } private fun setGameInfo(entity: ForumVideoEntity) { @@ -406,11 +420,11 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { if (mForumVideoEntity?.user?.id != UserManager.getInstance().userId) { entities.add(MenuItemEntity("投诉", R.drawable.icon_gamedetail_copyright)) } -// if (mForumVideoEntity?.me!!.isModerator) { -// val isEnable = mForumVideoEntity?.isHighlighted == true || mForumVideoEntity?.user?.id == UserManager.getInstance().userId -// entities.add(MenuItemEntity("加精", if (isEnable) -// R.drawable.icon_more_panel_essence_unenable else R.drawable.icon_more_panel_essence, isEnable = !isEnable)) -// } + 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)) + } if (mForumVideoEntity?.me!!.isModerator || mForumVideoEntity?.user?.id == UserManager.getInstance().userId) { entities.add(MenuItemEntity("删除", R.drawable.icon_more_panel_delete)) } @@ -444,7 +458,7 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { "视频投诉(" + mForumVideoEntity?.id + "):") } "加精" -> { -// addEssenceForum(mViewModel.detailEntity!!) + addEssenceForum() } "删除" -> { DialogUtils.showNewAlertDialog(requireContext(), "提示", "删除视频后,其中的所有评论及回复都将被删除", "取消", "删除", {}, { @@ -456,6 +470,28 @@ class ForumVideoDetailFragment : BaseFragment_TabLayout() { } } + private fun addEssenceForum() { + if (mForumVideoEntity == null) return + var highlightDialogHintContent = "" + val permissions = mForumVideoEntity?.me?.moderatorPermissions ?: Permissions() + if (permissions.highlightVideo > Permissions.GUEST) { + highlightDialogHintContent = if (permissions.highlightVideo == Permissions.REPORTER) { + "你的操作将提交给小编审核,确定提交吗?" + } else { + "你的操作将立即生效,确定提交吗?(你的管理权限为:高级)" + } + } + if (mForumVideoEntity?.isHighlighted == true) { + toast("帖子已经加精") + } else { + DialogUtils.showAlertDialog(requireContext(), "加精视频", highlightDialogHintContent, + "确定", "取消", + { + mViewModel.doHighlightThisVideo(mForumVideoEntity?.bbsId ?: "", mVideoId) + }, null) + } + } + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (data == null || resultCode != Activity.RESULT_OK) return 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 0f983f3472..10a372f759 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,8 +5,10 @@ import android.app.Application import android.net.Uri import android.text.TextUtils import androidx.lifecycle.* +import com.gh.common.constant.Constants import com.gh.common.util.ErrorHelper import com.gh.common.util.NewLogUtils +import com.gh.common.util.SPUtils import com.gh.common.util.observableToMain import com.gh.gamecenter.entity.ForumVideoEntity import com.gh.gamecenter.mvvm.Resource @@ -23,11 +25,12 @@ import tv.danmaku.ijk.media.exo2.ExoSourceManager class ForumVideoDetailViewModel(application: Application, val videoId: String) : AndroidViewModel(application) { private val mApi = RetrofitManager.getInstance(getApplication()).api - var videoIsMuted = true + var videoIsMuted = SPUtils.getBoolean(Constants.SP_VIDEO_PLAY_MUTE, true) val detailLiveData = MediatorLiveData>() val updateDetailLiveData = MediatorLiveData() var needToUpdateShareCount = MutableLiveData() var deleteLiveData = MutableLiveData() + val highlight = MutableLiveData() var currentToolbarStatus = true init { @@ -88,6 +91,23 @@ class ForumVideoDetailViewModel(application: Application, val videoId: 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) + } + + override fun onFailure(e: HttpException?) { + super.onFailure(e) + highlight.postValue(false) + } + }) + } + 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/retrofit/service/ApiService.java b/app/src/main/java/com/gh/gamecenter/retrofit/service/ApiService.java index 92fc3bbb7f..8bd733e610 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 @@ -3168,4 +3168,10 @@ public interface ApiService { */ @GET("videos/{video_id}/comments/{comment_id}/replies") Single> getVideoCommentReply(@Path("video_id") String videoId, @Path("comment_id") String commentId, @Query("sort") String sort, @Query("page") int page); + + /** + * 加精视频贴 + */ + @POST("bbses/{bbs_id}/videos/{video_id}:choiceness") + Observable highlightCommunityVideo(@Path("bbs_id") String bbsId, @Path("video_id") String videoId); } \ No newline at end of file