diff --git a/app/src/main/java/com/gh/common/util/DialogUtils.java b/app/src/main/java/com/gh/common/util/DialogUtils.java index f07907af33..e4a213ab34 100644 --- a/app/src/main/java/com/gh/common/util/DialogUtils.java +++ b/app/src/main/java/com/gh/common/util/DialogUtils.java @@ -927,6 +927,53 @@ public class DialogUtils { dialog.show(); } + + /** + * 特殊:目前只在提交问题错误返回时弹出 + */ + public static Dialog showCommunityDialog(Context context, + String title, + String contentTitle, + String contentDes, + String negative, + String positive, + final CancelListener clListener, + final ConfirmListener cmListener) { + + final Dialog dialog = new Dialog(context, R.style.GhAlertDialog); + + View contentView = LayoutInflater.from(context).inflate(R.layout.dialog_community, null); + TextView titleTv = contentView.findViewById(R.id.title); + TextView contentTitleTv = contentView.findViewById(R.id.content_title); + TextView contentDesTv = contentView.findViewById(R.id.content_des); + TextView negativeTv = contentView.findViewById(R.id.negative); + TextView positiveTv = contentView.findViewById(R.id.positive); + titleTv.setText(title); + negativeTv.setText(negative); + positiveTv.setText(positive); + contentTitleTv.setText(contentTitle); + contentDesTv.setText(contentDes); + + negativeTv.setOnClickListener(view -> { + if (clListener != null) { + clListener.onCancel(); + } + dialog.dismiss(); + }); + + positiveTv.setOnClickListener(view -> { + if (cmListener != null) { + cmListener.onConfirm(); + } + dialog.dismiss(); + }); + + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + dialog.setContentView(contentView); + dialog.show(); + return dialog; + } + public interface ConfirmListener { void onConfirm(); } diff --git a/app/src/main/java/com/gh/gamecenter/entity/ErrorEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/ErrorEntity.kt index 9574261e06..6ff0827c8a 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/ErrorEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/ErrorEntity.kt @@ -6,10 +6,22 @@ data class ErrorEntity(var code: Int? = 0, var detail: String? = "", var toast: String? = "", var data: Data? = null) { - data class Data(@SerializedName("always_block") - var alwaysBlock: Boolean? = false, - @SerializedName("game_id") - var gameId: String = "", - @SerializedName("game_name") - var gameName: String = "") + data class Data( + @SerializedName("always_block") + var alwaysBlock: Boolean? = false, + @SerializedName("game_id") + var gameId: String = "", + @SerializedName("game_name") + var gameName: String = "", + + // post question + @SerializedName("question_id") + var questionId: String = "", + @SerializedName("question_name") + var questionName: String = "", + @SerializedName("answer_count") + var answerCount: Int = 0, + @SerializedName("follow_count") + var followCount: Int = 0 + ) } \ No newline at end of file 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 f23fcbfddf..b6f1b41522 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 @@ -210,7 +210,7 @@ class QuestionEditViewModel(application: Application) : AndroidViewModel(applica picList.postValue(pics) } - fun uploadPicAndPostQuestion() { + fun uploadPicAndPostQuestion(isForce: Boolean) { // 先将已上传的图片归类到 successfullyUploadedPicList 里去 picList.value?.let { for (imageUri in it) { @@ -222,10 +222,10 @@ class QuestionEditViewModel(application: Application) : AndroidViewModel(applica val picToUpload = findPicToUpload() if (picToUpload == null) { - postQuestion() + postQuestion(isForce) } else { processDialog.postValue(WaitingDialogFragment.WaitingDialogData("正在准备上传图片...", true)) - uploadPic(picToUpload) { postQuestion() } + uploadPic(picToUpload) { postQuestion(isForce) } } } @@ -316,14 +316,13 @@ class QuestionEditViewModel(application: Application) : AndroidViewModel(applica /** * 提交问题 */ - fun postQuestion() { + private fun postQuestion(isForce: Boolean) { val entity = QuestionsDetailEntity() entity.title = title entity.description = content entity.tags = selectedTags entity.images = successfullyUploadedPicList - val body = RequestBody.create(MediaType.parse("application/json"), GsonUtils.toJson(entity)) val observable = if (questionEntity != null) { if (!isModeratorPatch) { questionEntity?.images = entity.images @@ -331,8 +330,15 @@ class QuestionEditViewModel(application: Application) : AndroidViewModel(applica questionEntity?.description = entity.description questionEntity?.tags = entity.tags } + val body = RequestBody.create(MediaType.parse("application/json"), GsonUtils.toJson(entity)) mApiService.patchQuestions(body, questionEntity?.id) // patch } else { + val postContent = GsonUtils.toJson(entity) + if (isForce) { // 标题重复提示后强制提交 + val bodyJson = JSONObject(postContent) + bodyJson.put("again", true) + } + val body = RequestBody.create(MediaType.parse("application/json"), postContent) mApiService.postQuestions(body, communityId) // add } 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 4a36c89608..1fda258de1 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 @@ -16,11 +16,9 @@ import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders import com.gh.base.fragment.BaseDialogWrapperFragment import com.gh.base.fragment.BaseFragment -import com.gh.common.util.DialogUtils -import com.gh.common.util.DisplayUtils -import com.gh.common.util.EntranceUtils -import com.gh.common.util.ErrorHelper +import com.gh.common.util.* import com.gh.gamecenter.R +import com.gh.gamecenter.entity.ErrorEntity import com.gh.gamecenter.entity.Permissions import com.gh.gamecenter.mvvm.Status import com.gh.gamecenter.qa.entity.QuestionsDetailEntity @@ -128,7 +126,37 @@ class TagsSelectFragment : BaseFragment() { toast("发布成功") activity?.finish() } else { - ErrorHelper.handleError(context!!, it?.exception?.response()?.errorBody()?.string(), showHighPriorityHint = true) + val errorString = it?.exception?.response()?.errorBody()?.string() + val errorEntity = errorString?.toObject() + val data = errorEntity?.data + when { + errorEntity?.code == 403066 -> { + DialogUtils.showCommunityDialog(context, + "已有相似问题,/n去看看?", + data?.questionName, + data?.followCount.toString() + " 关注 · " + data?.answerCount + " 回答", + "继续提交", "去看看", + { + mViewModel?.uploadPicAndPostQuestion(true) + }, + { + QuestionsDetailActivity.getIntent(context, data?.questionId, mEntrance, "相似问题") + }) + } + errorEntity?.code == 403067 -> { + DialogUtils.showCommunityDialog(context, + "已有重复问题,/n无法提问", + data?.questionName, + data?.followCount.toString() + " 关注 · " + data?.answerCount + " 回答", + null, "去看看", null, + { + QuestionsDetailActivity.getIntent(context, data?.questionId, mEntrance, "重复问题") + }) + } + else -> { + ErrorHelper.handleError(context!!, errorString, showHighPriorityHint = true) + } + } } }) } @@ -171,7 +199,7 @@ class TagsSelectFragment : BaseFragment() { }, null) } } else { - mViewModel?.uploadPicAndPostQuestion() + mViewModel?.uploadPicAndPostQuestion(false) } } } diff --git a/app/src/main/res/drawable-xhdpi/dialog_community_content_corner.png b/app/src/main/res/drawable-xhdpi/dialog_community_content_corner.png new file mode 100644 index 0000000000..2de0931703 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/dialog_community_content_corner.png differ diff --git a/app/src/main/res/drawable/dialog_community_content_bg.xml b/app/src/main/res/drawable/dialog_community_content_bg.xml new file mode 100644 index 0000000000..5145dfc577 --- /dev/null +++ b/app/src/main/res/drawable/dialog_community_content_bg.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/dialog_community_negative.xml b/app/src/main/res/drawable/dialog_community_negative.xml new file mode 100644 index 0000000000..349dd350f0 --- /dev/null +++ b/app/src/main/res/drawable/dialog_community_negative.xml @@ -0,0 +1,8 @@ + + + + + + diff --git a/app/src/main/res/drawable/dialog_community_positive.xml b/app/src/main/res/drawable/dialog_community_positive.xml new file mode 100644 index 0000000000..98cfe65f3b --- /dev/null +++ b/app/src/main/res/drawable/dialog_community_positive.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_community.xml b/app/src/main/res/layout/dialog_community.xml new file mode 100644 index 0000000000..d73ce2ea28 --- /dev/null +++ b/app/src/main/res/layout/dialog_community.xml @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file