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 f57a5d5b07..c80f9a8d6f 100644 --- a/app/src/main/java/com/gh/common/util/EntranceUtils.java +++ b/app/src/main/java/com/gh/common/util/EntranceUtils.java @@ -102,6 +102,7 @@ public class EntranceUtils { public static final String KEY_AUTO_DOWNLOAD = "auto_download"; public static final String KEY_AUTO_UPDATE = "auto_update"; public static final String KEY_HIDE_SUGGEST_HINT = "hide_suggest_hint"; + public static final String KEY_COMMUNITY_ARTICLE_ID = "communityArticleId"; public static void jumpActivity(Context context, Bundle bundle) { diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/MyArticleActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/article/MyArticleActivity.kt index 00ed55e4b5..a4f7316744 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/MyArticleActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/MyArticleActivity.kt @@ -36,7 +36,7 @@ class MyArticleActivity : ListActivity Unit) : ListAdapter(context) { +class ArticleDraftAdapter(context: Context + , private val deleteCallback: (ArticleDraftEntity) -> Unit + , private val selectCallback: (ArticleDraftEntity) -> Unit) : ListAdapter(context) { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { val view: View @@ -30,9 +34,16 @@ class ArticleDraftAdapter(context: Context, private val deleteCallback: (Article override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { if (holder is ArticleDraftViewHolder) { val entity = mEntityList[position] - holder.itemView.setOnLongClickListener { - deleteCallback.invoke(entity) - return@setOnLongClickListener true + holder.binding.data = entity + holder.binding.articleDraftTime.text = ("发布于" + NewsUtils.getFormattedTime(entity.time.update)) + holder.binding.articleDraftDelete.setOnClickListener { + DialogUtils.showAlertDialog(mContext, "警告", "确定要删除文章草稿吗?删除之后不可恢复", + "确定", "取消", DialogUtils.ConfirmListener { + deleteCallback.invoke(entity) + }, null) + } + holder.itemView.setOnClickListener { + selectCallback.invoke(entity) } } else if (holder is FooterViewHolder) { holder.initFooterViewHolder(mIsLoading, isNetworkError, mIsOver, R.string.ask_loadover_hint) 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 c693477cde..db0450007d 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 @@ -34,9 +34,11 @@ import com.gh.gamecenter.entity.CommunityEntity import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.qa.article.draft.ArticleDraftActivity import com.gh.gamecenter.qa.article.game.ArticleSelectGameAdapter +import com.gh.gamecenter.qa.entity.ArticleDraftEntity import com.gh.gamecenter.qa.questions.edit.TagsSelectFragment import kotterknife.bindView +// todo 定时保存 class ArticleEditActivity : BaseActivity() { private val mEditContent by bindView(R.id.article_edit_content) @@ -63,6 +65,11 @@ class ArticleEditActivity : BaseActivity() { } else if (requestCode == ArticleEditActivity.ARTICLE_DRAFT_REQUEST_CODE && resultCode == Activity.RESULT_OK) { // 补充 草稿 setNavigationTitle("编辑文章") + val draftEntity = data?.getParcelableExtra(ArticleDraftEntity::class.java.simpleName) + mViewModel?.mSelectCommunityData = draftEntity?.community + mEditTitle.setText(draftEntity?.title) + setGameName() + mViewModel?.getArticleDraftsContent(draftEntity?.id!!) } } @@ -88,6 +95,20 @@ class ArticleEditActivity : BaseActivity() { mEditContent.insertImage(it) }) + // 保存草稿 + mViewModel?.postArticleDrafts?.observe(this, Observer { + if (it!!) { + toast("回答已保存到草稿箱") + finish() + } else { + toast("保存失败") + } + }) + + mViewModel?.articleDraftsContent?.observe(this, Observer { + mEditContent.setHtml(it, false) + }) + mViewModel?.titleTags?.observe(this, Observer> { if (supportFragmentManager.findFragmentByTag(TagsSelectFragment::javaClass.name) == null) { val dialog = BaseDialogWrapperFragment.getInstance(ArticleTagsSelectFragment.getInstance(), false) @@ -95,6 +116,7 @@ class ArticleEditActivity : BaseActivity() { } }) + // Process dialog mViewModel?.processDialog?.observe(this, Observer { it -> if (it?.isShow!!) { @@ -165,7 +187,12 @@ class ArticleEditActivity : BaseActivity() { } else if (mEditContent.html.contains("() val postImage = MediatorLiveData() val postArticle = MediatorLiveData() + val postArticleDrafts = MediatorLiveData() + val articleDraftsContent = MediatorLiveData() var uploadImageSubscription: Disposable? = null @@ -210,12 +213,7 @@ class ArticleEditViewModel(application: Application) : AndroidViewModel(applicat fun postArticle() { processDialog.postValue(WaitingDialogFragment.WaitingDialogData("上传中...", true)) - - val jsonObject = JSONObject() - jsonObject.put("title", title) - jsonObject.put("content", content) // todo 替换图片链接 - jsonObject.put("tags", selectedTags) - val body = RequestBody.create(MediaType.parse("application/json"), jsonObject.toString()) + val body = RequestBody.create(MediaType.parse("application/json"), getArticleBody()) mApi.postCommunityArticle(mSelectCommunityData?.id, body) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) @@ -230,4 +228,58 @@ class ArticleEditViewModel(application: Application) : AndroidViewModel(applicat } }) } + + fun postArticleDrafts() { + val body = RequestBody.create(MediaType.parse("application/json"), getArticleBody()) + mApi.postCommunityArticleDrafts(mSelectCommunityData?.id, body) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + postArticleDrafts.postValue(true) + } + + override fun onFailure(e: HttpException?) { + postArticleDrafts.postValue(false) + } + }) + } + + private fun getArticleBody(): String { + for (s in mapImg.keys) { + content = content?.replace(FILE_HOST + s, mapImg[s].toString()) + } + 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) + return jsonObject.toString() + } + + fun getArticleDraftsContent(draftId: String) { + processDialog.postValue(WaitingDialogFragment.WaitingDialogData("加载中...", true)) + mApi.getArticleDraftsContent(mSelectCommunityData?.id, draftId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + val string = response?.string() + if (string != null) { + val jsonObject = JSONObject(string) + val content = jsonObject.getString("content") + articleDraftsContent.postValue(content) + } + + processDialog.postValue(WaitingDialogFragment.WaitingDialogData("加载中...", false)) + } + + override fun onFailure(e: HttpException?) { + processDialog.postValue(WaitingDialogFragment.WaitingDialogData("加载中...", false)) + } + }) + } } 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 62e8f8cf85..a770f02628 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 @@ -1,5 +1,6 @@ package com.gh.gamecenter.qa.article.edit +import android.app.Activity import android.app.Dialog import android.arch.lifecycle.Observer import android.arch.lifecycle.ViewModelProviders @@ -50,7 +51,8 @@ class ArticleTagsSelectFragment : BaseFragment() { initTags() mViewModel?.postArticle?.observe(this, Observer { - //todo 提交成功 + activity?.setResult(Activity.RESULT_OK) + activity?.finish() }) mCancelBtn.setOnClickListener { 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 a9dae1a9a5..0f5f3c5e99 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 @@ -1,15 +1,19 @@ package com.gh.gamecenter.qa.entity +import android.os.Parcelable import com.gh.gamecenter.entity.CommunityEntity import com.google.gson.annotations.SerializedName +import kotlinx.android.parcel.Parcelize +@Parcelize data class ArticleDraftEntity(@SerializedName("_id") val id: String = "", val title: String = "", val content: String = "", val count: Count = Count(), val time: Time = Time(), - val community: CommunityEntity = CommunityEntity()) + val community: CommunityEntity = CommunityEntity()) : Parcelable +@Parcelize data class Time(val create: Long = 0, - val update: Long = 0) \ No newline at end of file + val update: Long = 0): Parcelable \ No newline at end of file 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 02a56412d9..fe7b5f15d3 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 @@ -1,8 +1,10 @@ package com.gh.gamecenter.qa.entity +import android.os.Parcelable import com.gh.gamecenter.entity.CommunityEntity import com.gh.gamecenter.entity.UserEntity import com.google.gson.annotations.SerializedName +import kotlinx.android.parcel.Parcelize data class ArticleEntity(@SerializedName("_id") val id: String = "", @@ -13,7 +15,10 @@ data class ArticleEntity(@SerializedName("_id") val community: CommunityEntity = CommunityEntity(), val user : UserEntity = UserEntity()) +@Parcelize data class Count( val comment: Int = -1, val vote: Int = -1, - val answer: Int = -1) + val answer: Int = -1) : Parcelable { + +} 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 08036c8016..6a4b3db086 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 @@ -1194,25 +1194,25 @@ public interface ApiService { /** * 保存社区文章的草稿 */ - @POST("communities/{community_id}/articles_drafts") + @POST("communities/{community_id}/article_drafts") Observable postCommunityArticleDrafts(@Path("community_id") String communityId, @Body RequestBody body); /** * 获取社区文章列表 */ - @GET("users/{user_id}/articles") + @GET("users/{user_id}/communities/articles") Observable> getMyArticle(@Path("user_id") String userId, @Query("page") int page); /** - * 获取草稿的内容 + * 获取用户的文章草稿列表 */ - @GET("users/{user_id}/articles_drafts") + @GET("users/{user_id}/communities/article_drafts") Observable> getMyArticleDrafts(@Path("user_id") String userId, @Query("page") int page); /** * 删除社区文章的草稿 */ - @DELETE("communities/{community_id}/articles_drafts/{draft_id}") + @DELETE("communities/{community_id}/article_drafts/{draft_id}") Observable deleteArticleDrafts(@Path("community_id") String communityId, @Path("draft_id") String draftId); /** @@ -1221,6 +1221,13 @@ public interface ApiService { @GET("communities/{community_id}/articles/{article_id}") Observable getCommunityArticleDetail(@Path("community_id") String communityId, @Path("article_id") String articleId); + + /** + * 获取社区文章草稿内容 + */ + @GET("communities/{community_id}/article_drafts/{draft_id}") + Observable getArticleDraftsContent(@Path("community_id") String communityId, @Path("draft_id") String draftId); + /** * 获取收藏的社区文章列表 */ diff --git a/app/src/main/res/layout/community_article_draft_item.xml b/app/src/main/res/layout/community_article_draft_item.xml index b9ae75d102..a9c9e45a6c 100644 --- a/app/src/main/res/layout/community_article_draft_item.xml +++ b/app/src/main/res/layout/community_article_draft_item.xml @@ -1,6 +1,11 @@ + + + + android:textStyle = "bold" + android:text="@{data.title}"/> + android:paddingTop = "10dp" >