diff --git a/app/proguard-rules.txt b/app/proguard-rules.txt index 5853f0f704..f7ce72c812 100644 --- a/app/proguard-rules.txt +++ b/app/proguard-rules.txt @@ -140,6 +140,7 @@ -keep class com.gh.common.view.** {*;} -keep class com.gh.gamecenter.db.info.** {*;} -keep class com.gh.gamecenter.entity.** {*;} +-keep class com.gh.gamecenter.ask.entity.** {*;} -keep class com.gh.gamecenter.retrofit.** {*;} -keep class com.gh.gamecenter.eventbus.** {*;} -keep class * extends rx.Subscriber diff --git a/app/src/main/java/com/gh/common/util/CollectionUtils.kt b/app/src/main/java/com/gh/common/util/CollectionUtils.kt index f087833ebb..77a8c4d63b 100644 --- a/app/src/main/java/com/gh/common/util/CollectionUtils.kt +++ b/app/src/main/java/com/gh/common/util/CollectionUtils.kt @@ -20,7 +20,7 @@ import rx.schedulers.Schedulers object CollectionUtils { enum class CollectionType { - toolkit, article + toolkit, article, answer } fun postCollection(context: Context, content: String, type: CollectionType, listener: OnCollectionListener) { @@ -29,6 +29,7 @@ object CollectionUtils { val postCollection = when (type) { CollectionType.article -> RetrofitManager.getInstance(context).getApi().postCollectionArticle(body) CollectionType.toolkit -> RetrofitManager.getInstance(context).getApi().postCollectionTools(body) + CollectionType.answer -> RetrofitManager.getInstance(context).getApi().postCollectionAnswer(content) } postCollection .subscribeOn(Schedulers.io()) @@ -37,6 +38,7 @@ object CollectionUtils { override fun onResponse(response: ResponseBody?) { super.onResponse(response) listener.onSuccess() + if(type != CollectionType.answer) EventBus.getDefault().post(EBCollectionChanged(JSONObject(content).getString("_id"), true, type)) } @@ -65,6 +67,7 @@ object CollectionUtils { when (type) { CollectionType.article -> postCollection = RetrofitManager.getInstance(context).getApi().deletaCollectionArticle(id) CollectionType.toolkit -> postCollection = RetrofitManager.getInstance(context).getApi().deleteCollectionTools(id) + CollectionType.answer -> postCollection = RetrofitManager.getInstance(context).getApi().deleteCollectionAnswer(id) } postCollection .subscribeOn(Schedulers.io()) @@ -73,6 +76,7 @@ object CollectionUtils { override fun onResponse(response: ResponseBody?) { super.onResponse(response) listener.onSuccess() + if(type != CollectionType.answer) EventBus.getDefault().post(EBCollectionChanged(id, false, type)) } @@ -87,6 +91,9 @@ object CollectionUtils { val postCollection = when (type) { CollectionType.article -> RetrofitManager.getInstance(context).getApi().patchCollectionArticle(id) CollectionType.toolkit -> RetrofitManager.getInstance(context).getApi().patchCollectionTools(id) + else -> { + return + } } postCollection .subscribeOn(Schedulers.io()) diff --git a/app/src/main/java/com/gh/common/util/ConcernUtils.kt b/app/src/main/java/com/gh/common/util/ConcernUtils.kt index 9aad21a401..9a100ba5d3 100644 --- a/app/src/main/java/com/gh/common/util/ConcernUtils.kt +++ b/app/src/main/java/com/gh/common/util/ConcernUtils.kt @@ -27,7 +27,7 @@ object ConcernUtils { .postConcern(body) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Response(){ + .subscribe(object : Response() { override fun onResponse(response: ResponseBody?) { super.onResponse(response) listener?.onSuccess() @@ -46,7 +46,7 @@ object ConcernUtils { .deleteConcern(gameId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) - .subscribe(object : Response(){ + .subscribe(object : Response() { override fun onResponse(response: ResponseBody?) { super.onResponse(response) listener?.onSuccess() @@ -75,6 +75,42 @@ object ConcernUtils { }) } + fun deleteConcernQuestions(context: Context, questionsId: String, listener: onConcernListener?) { + RetrofitManager.getInstance(context).getApi() + .deleteConcernQuestions(questionsId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + listener?.onSuccess() + } + + override fun onFailure(e: HttpException?) { + super.onFailure(e) + listener?.onError() + } + }) + } + + fun postConcernQuestions(context: Context, questionsId: String, listener: onConcernListener?) { + RetrofitManager.getInstance(context).getApi() + .postConcernQuestions(questionsId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(object : Response() { + override fun onResponse(response: ResponseBody?) { + super.onResponse(response) + listener?.onSuccess() + } + + override fun onFailure(e: HttpException?) { + super.onFailure(e) + listener?.onError() + } + }) + } + interface onConcernListener { fun onSuccess() 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 04accff0b5..8efcf23430 100644 --- a/app/src/main/java/com/gh/common/util/EntranceUtils.java +++ b/app/src/main/java/com/gh/common/util/EntranceUtils.java @@ -56,7 +56,11 @@ public class EntranceUtils { public static final String KEY_PROLIST = "provinceList"; public static final String KEY_ORDER = "order"; public static final String KEY_TAGTYPE = "tagType"; + public static final String KEY_ANSWER_ID = "answerId"; + public static final String KEY_ANSWER_CONTENT = "answerContent"; public static final String KEY_QUESTIONS_ID = "questionsId"; + public static final String KEY_QUESTIONS_TITLE = "questionsTitle"; + public static final String KEY_QUESTIONS_PATCH = "questionsPatch"; public static void jumpActivity(Context context, Bundle bundle) { diff --git a/app/src/main/java/com/gh/gamecenter/AskQuestionsDetailActivity.java b/app/src/main/java/com/gh/gamecenter/AskQuestionsDetailActivity.java index b145e83ec8..a2a6ab1a70 100644 --- a/app/src/main/java/com/gh/gamecenter/AskQuestionsDetailActivity.java +++ b/app/src/main/java/com/gh/gamecenter/AskQuestionsDetailActivity.java @@ -9,7 +9,6 @@ import android.view.View; import android.widget.RelativeLayout; import com.gh.base.BaseActivity; -import com.gh.common.util.DisplayUtils; import com.gh.common.util.EntranceUtils; import com.gh.gamecenter.ask.questionsdetail.AnswerEditFragment; import com.gh.gamecenter.ask.questionsdetail.AnswerFoldFragment; @@ -28,10 +27,10 @@ public class AskQuestionsDetailActivity extends BaseActivity implements Fragment public static final String QUESTIONS_DETAIL = "questions_detail"; private QuestionsDetailFragment mQuestionsDetailFragment; - private AnswerEditFragment mAnswerEditFragment; +// private AnswerEditFragment mAnswerEditFragment; private View mShareIv; - private View mAnswerPost; +// private View mAnswerPost; private String mQuestionsId; @@ -54,26 +53,24 @@ public class AskQuestionsDetailActivity extends BaseActivity implements Fragment getSupportFragmentManager().addOnBackStackChangedListener(this); show(QUESTIONS_DETAIL); - findViewById(R.id.actionbar_rl_back) - .setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View view) { - if (mQuestionsDetailFragment.isVisible()) { - finish(); - } else { - getSupportFragmentManager().popBackStack(); - } - } - }); } + @Override + public boolean onHandleBackPressed() { + if (mQuestionsDetailFragment.isVisible()) { + finish(); + } else { + getSupportFragmentManager().popBackStack(); + } + return false; + } @Override public void onClick(View view) { - if (view == mAnswerPost) { - mAnswerEditFragment.postAnswer(); - } else if (view == mShareIv) { +// if (view == mAnswerPost) { +// mAnswerEditFragment.postAnswer(); +// } else + if (view == mShareIv) { } } @@ -88,16 +85,16 @@ public class AskQuestionsDetailActivity extends BaseActivity implements Fragment mShareIv.setOnClickListener(this); } - private void addAnswerPostView() { - RelativeLayout reuse_actionbar = mContentView.findViewById(R.id.reuse_actionbar); - mAnswerPost = LayoutInflater.from(this).inflate(R.layout.menu_action_post, reuse_actionbar, false); - RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( - DisplayUtils.dip2px(this, 48), DisplayUtils.dip2px(this, 24)); - params.addRule(RelativeLayout.CENTER_VERTICAL); - params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); - reuse_actionbar.addView(mAnswerPost, params); - mAnswerPost.setOnClickListener(this); - } +// private void addAnswerPostView() { +// RelativeLayout reuse_actionbar = mContentView.findViewById(R.id.reuse_actionbar); +// mAnswerPost = LayoutInflater.from(this).inflate(R.layout.menu_action_post, reuse_actionbar, false); +// RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( +// DisplayUtils.dip2px(this, 48), DisplayUtils.dip2px(this, 24)); +// params.addRule(RelativeLayout.CENTER_VERTICAL); +// params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); +// reuse_actionbar.addView(mAnswerPost, params); +// mAnswerPost.setOnClickListener(this); +// } public void show(String type) { showMenu(type); @@ -144,26 +141,31 @@ public class AskQuestionsDetailActivity extends BaseActivity implements Fragment } private void showAnswerEdit(String type) { - mAnswerEditFragment = new AnswerEditFragment(); - getSupportFragmentManager() - .beginTransaction() - .addToBackStack(type) - .replace(R.id.layout_fragment_content, mAnswerEditFragment) - .commitAllowingStateLoss(); +// mAnswerEditFragment = AnswerEditFragment.getInstance(mQuestionsId, mQuestionsDetailFragment.getQuestionsTitle()); +// getSupportFragmentManager() +// .beginTransaction() +// .addToBackStack(type) +// .replace(R.id.layout_fragment_content, mAnswerEditFragment) +// .commitAllowingStateLoss(); + + Bundle bundle = new Bundle(); + bundle.putString(EntranceUtils.KEY_QUESTIONS_ID, mQuestionsId); + bundle.putString(EntranceUtils.KEY_QUESTIONS_TITLE, mQuestionsDetailFragment.getQuestionsTitle()); + NormalActivity.startFragment(this, AnswerEditFragment.class, bundle); } private void showMenu(String type) { switch (type) { - case QUESTIONS_DETAIL_ANSWER: - setNavigationTitle("编辑答案"); - if (mAnswerPost == null) { - addAnswerPostView(); - } else { - mAnswerPost.setVisibility(View.VISIBLE); - } - if (mShareIv != null && mShareIv.getVisibility() == View.VISIBLE) - mShareIv.setVisibility(View.GONE); - break; +// case QUESTIONS_DETAIL_ANSWER: +// setNavigationTitle("编辑答案"); +// if (mAnswerPost == null) { +// addAnswerPostView(); +// } else { +// mAnswerPost.setVisibility(View.VISIBLE); +// } +// if (mShareIv != null && mShareIv.getVisibility() == View.VISIBLE) +// mShareIv.setVisibility(View.GONE); +// break; case QUESTIONS_DETAIL: setNavigationTitle("问题详情"); if (mShareIv == null) { @@ -171,22 +173,22 @@ public class AskQuestionsDetailActivity extends BaseActivity implements Fragment } else { mShareIv.setVisibility(View.VISIBLE); } - if (mAnswerPost != null && mAnswerPost.getVisibility() == View.VISIBLE) - mAnswerPost.setVisibility(View.GONE); +// if (mAnswerPost != null && mAnswerPost.getVisibility() == View.VISIBLE) +// mAnswerPost.setVisibility(View.GONE); break; case QUESTIONS_DETAIL_INVITE: setNavigationTitle("达人推荐"); if (mShareIv != null && mShareIv.getVisibility() == View.VISIBLE) mShareIv.setVisibility(View.GONE); - if (mAnswerPost != null && mAnswerPost.getVisibility() == View.VISIBLE) - mAnswerPost.setVisibility(View.GONE); +// if (mAnswerPost != null && mAnswerPost.getVisibility() == View.VISIBLE) +// mAnswerPost.setVisibility(View.GONE); break; case QUESTIONS_DETAIL_FOLD: setNavigationTitle("折叠答案"); if (mShareIv != null && mShareIv.getVisibility() == View.VISIBLE) mShareIv.setVisibility(View.GONE); - if (mAnswerPost != null && mAnswerPost.getVisibility() == View.VISIBLE) - mAnswerPost.setVisibility(View.GONE); +// if (mAnswerPost != null && mAnswerPost.getVisibility() == View.VISIBLE) +// mAnswerPost.setVisibility(View.GONE); break; } } diff --git a/app/src/main/java/com/gh/gamecenter/AskTabOrderActivity.java b/app/src/main/java/com/gh/gamecenter/AskTabOrderActivity.java index 7e35cf66d8..33ff1b062d 100644 --- a/app/src/main/java/com/gh/gamecenter/AskTabOrderActivity.java +++ b/app/src/main/java/com/gh/gamecenter/AskTabOrderActivity.java @@ -139,6 +139,7 @@ public class AskTabOrderActivity extends BaseActivity { int fromPosition = viewHolder.getAdapterPosition();//得到拖动ViewHolder的position int toPosition = target.getAdapterPosition();//得到目标ViewHolder的position + if (toPosition == 0) return false; if (fromPosition < toPosition) { for (int i = fromPosition; i < toPosition; i++) { Collections.swap(mTagList, i, i + 1); diff --git a/app/src/main/java/com/gh/gamecenter/NormalActivity.java b/app/src/main/java/com/gh/gamecenter/NormalActivity.java index 8e213ed078..56392016ae 100644 --- a/app/src/main/java/com/gh/gamecenter/NormalActivity.java +++ b/app/src/main/java/com/gh/gamecenter/NormalActivity.java @@ -128,11 +128,10 @@ public class NormalActivity extends BaseActivity implements ToolbarController, T } @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - List fragments = getSupportFragmentManager().getFragments(); - for (Fragment fragment : fragments) { - fragment.onActivityResult(requestCode, resultCode, data); + public void onBackPressed() { + if (mTargetFragment instanceof NormalFragment && !((NormalFragment) mTargetFragment).onBackPressed()) { + super.onBackPressed(); } } + } diff --git a/app/src/main/java/com/gh/gamecenter/ask/AskAnswerDetailFragment.java b/app/src/main/java/com/gh/gamecenter/ask/AskAnswerDetailFragment.java index 28c755beca..c04f417ca4 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/AskAnswerDetailFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/AskAnswerDetailFragment.java @@ -1,24 +1,36 @@ package com.gh.gamecenter.ask; +import android.app.Activity; +import android.content.Intent; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import com.facebook.drawee.view.SimpleDraweeView; +import com.gh.common.util.CheckLoginUtils; +import com.gh.common.util.CollectionUtils; +import com.gh.common.util.EntranceUtils; import com.gh.common.util.ImageUtils; import com.gh.common.view.RichEditor; +import com.gh.gamecenter.NormalActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.ask.entity.AnswerDetailEntity; import com.gh.gamecenter.ask.entity.AnswerEntity; import com.gh.gamecenter.ask.entity.MeEntity; +import com.gh.gamecenter.ask.questionsdetail.AnswerEditFragment; import com.gh.gamecenter.entity.UserEntity; import com.gh.gamecenter.normal.NormalFragment; import com.gh.gamecenter.retrofit.Response; import com.gh.gamecenter.retrofit.RetrofitManager; +import com.lightgame.config.CommonDebug; import butterknife.BindView; +import butterknife.OnClick; +import okhttp3.ResponseBody; import retrofit2.HttpException; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; @@ -31,8 +43,8 @@ public class AskAnswerDetailFragment extends NormalFragment { @BindView(R.id.answer_detail_title) TextView mTitle; - @BindView(R.id.answer_detail_content) - RichEditor mContent; + @BindView(R.id.answer_detail_Rd) + RichEditor mRichEditor; @BindView(R.id.answer_detail_time) TextView mTime; @BindView(R.id.answer_detail_edit) @@ -45,11 +57,18 @@ public class AskAnswerDetailFragment extends NormalFragment { SimpleDraweeView mUsericon; @BindView(R.id.answer_detail_username) TextView mUsername; + @BindView(R.id.reuse_no_connection) + View mNoConn; + @BindView(R.id.answer_detail_loading) + View mLoading; + @BindView(R.id.answer_detail_content) + View mContent; + private static final int ANSWER_PATCH_REQUEST = 100; private AnswerEntity mAnswerEntity; + private AnswerDetailEntity mDetailEntity; - // todo 逐步完善 public static AskAnswerDetailFragment getInstance(AnswerEntity entity) { AskAnswerDetailFragment fragment = new AskAnswerDetailFragment(); Bundle args = new Bundle(); @@ -63,6 +82,15 @@ public class AskAnswerDetailFragment extends NormalFragment { return R.layout.fragment_answer_detail; } + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == Activity.RESULT_OK && requestCode == ANSWER_PATCH_REQUEST) { + mDetailEntity.setContent(data.getStringExtra(EntranceUtils.KEY_ANSWER_CONTENT)); + initView(); + } + } + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -72,6 +100,73 @@ public class AskAnswerDetailFragment extends NormalFragment { } } + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + setNavigationTitle(getString(R.string.answer_detail_title)); + initMenu(R.menu.menu_web); + } + + @Override + public void onMenuItemClick(MenuItem menuItem) { + switch (menuItem.getItemId()) { + case R.id.menu_share: + toast(R.string.share); + break; + case R.id.menu_collect: + if (!mDetailEntity.getMe().isAnswerFavorite()) { + CollectionUtils.INSTANCE.postCollection(getContext(), mAnswerEntity.getId() + , CollectionUtils.CollectionType.answer, new CollectionUtils.OnCollectionListener() { + @Override + public void onSuccess() { + toast(R.string.collection_success); + MeEntity me = mDetailEntity.getMe(); + me.setAnswerFavorite(true); + mDetailEntity.setMe(me); + } + + @Override + public void onError() { + toast(R.string.collection_failure); + } + }); + } else { + CollectionUtils.INSTANCE.deleteCollection(getContext(), mAnswerEntity.getId() + , CollectionUtils.CollectionType.answer, new CollectionUtils.OnCollectionListener() { + @Override + public void onSuccess() { + MeEntity me = mDetailEntity.getMe(); + me.setAnswerFavorite(false); + mDetailEntity.setMe(me); + if (CommonDebug.IS_DEBUG) + toast("取消收藏成功"); + } + + @Override + public void onError() { + toast(R.string.collection_cancel_failure); + } + }); + } + break; + } + } + + @OnClick({R.id.answer_detail_edit, R.id.answer_detail_vote}) + public void onClick(View view) { + switch (view.getId()) { + case R.id.answer_detail_edit: + Bundle bundle = new Bundle(); + bundle.putString(EntranceUtils.KEY_ANSWER_ID, mAnswerEntity.getId()); + bundle.putString(EntranceUtils.KEY_QUESTIONS_TITLE, mAnswerEntity.getQuestions().getTitle()); + bundle.putString(EntranceUtils.KEY_ANSWER_CONTENT, mDetailEntity.getContent()); + NormalActivity.startFragmentForResult(getContext(), AnswerEditFragment.class, bundle, ANSWER_PATCH_REQUEST); + break; + case R.id.answer_detail_vote: + CheckLoginUtils.checkLogin(getContext(), this::postVote); + break; + } + } + private void initData() { RetrofitManager.getInstance(getContext()).getApi() .getAnswerDetail(mAnswerEntity.getId()) @@ -81,7 +176,70 @@ public class AskAnswerDetailFragment extends NormalFragment { @Override public void onResponse(AnswerDetailEntity response) { super.onResponse(response); - initView(response); + mDetailEntity = response; + initView(); + } + + @Override + public void onFailure(HttpException e) { + super.onFailure(e); + mNoConn.setVisibility(View.VISIBLE); + mLoading.setVisibility(View.GONE); + mContent.setVisibility(View.GONE); + } + }); + } + + private void initView() { + UserEntity user = mDetailEntity.getUser(); + if (user != null) { + ImageUtils.Companion.display(mUsericon, user.getIcon()); + mUsername.setText(user.getName()); + } + + if (mDetailEntity.getMe().isAnswerOwn()) { + mEditBtn.setVisibility(View.VISIBLE); + } else { + mEditBtn.setVisibility(View.GONE); + } + + mTitle.setText(mAnswerEntity.getQuestions().getTitle()); + + mRichEditor.setHtml(mDetailEntity.getContent()); + mRichEditor.setInputEnabled(false); + + mNoConn.setVisibility(View.GONE); + mLoading.setVisibility(View.GONE); + mContent.setVisibility(View.VISIBLE); + + initVote(); + } + + private void initVote() { + mVoteCount.setText(getString(R.string.ask_vote_count, mAnswerEntity.getVote())); + + if (mDetailEntity.getMe().isAnswerVoted()) { + mVote.setImageResource(R.drawable.answer_detail_vote); + } else { + mVote.setImageResource(R.drawable.answer_detail_unvote); + } + } + + private void postVote() { + RetrofitManager.getInstance(getContext()).getApi() + .postAnswerVote(mAnswerEntity.getId()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { + @Override + public void onResponse(ResponseBody response) { + super.onResponse(response); + MeEntity me = mDetailEntity.getMe(); + me.setAnswerVoted(true); + mDetailEntity.setMe(me); + int vote = mAnswerEntity.getVote() + 1; + mAnswerEntity.setVote(vote); + initVote(); } @Override @@ -90,22 +248,4 @@ public class AskAnswerDetailFragment extends NormalFragment { } }); } - - private void initView(AnswerDetailEntity entity) { - UserEntity user = entity.getUser(); - if (user != null) { - ImageUtils.Companion.display(mUsericon, user.getIcon()); - mUsername.setText(user.getName()); - } - - MeEntity me = entity.getMe(); - if (me != null && me.isCommunityVoted()) { - mEditBtn.setVisibility(View.VISIBLE); - } - - mTitle.setText(""); - mVoteCount.setText(getString(R.string.ask_vote_count, entity.getVote())); - mContent.setHtml(entity.getContent()); - mContent.setInputEnabled(false); - } } diff --git a/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotFragment.java b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotFragment.java index 9ad927943b..7c76102749 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotFragment.java @@ -37,6 +37,7 @@ public class AskQuestionsHotFragment extends ListFragment { @Override public void onListClick(View view, int position, Object data) { + List questionsList; switch (view.getId()) { case R.id.footerview_item: if (mAdapter.isNetworkError()) { @@ -45,9 +46,19 @@ public class AskQuestionsHotFragment extends ListFragment { } break; case R.id.ask_item_constraintlayout: - List questionsList = (List) data; + break; + case R.id.ask_item_title: + questionsList = (List) data; startActivity(AskQuestionsDetailActivity.getIntent(getContext(), questionsList.get(position).getQuestion().getId())); break; + case R.id.ask_item_content: + questionsList = (List) data; + + +// Bundle bundle = new Bundle(); +// bundle.putParcelable(AnswerEntity.TAG, entityList.get(position)); +// NormalActivity.startFragment(getContext(), AskAnswerDetailFragment.class, bundle); + break; } } diff --git a/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotViewHolder.java b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotViewHolder.java index 833f016337..adb293c385 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsHotViewHolder.java @@ -29,7 +29,7 @@ public class AskQuestionsHotViewHolder extends BaseRecyclerViewHolder { @BindView(R.id.ask_item_username) TextView mAskUsername; @BindView(R.id.ask_item_title) - public TextView mAskTitle; + TextView mAskTitle; @BindView(R.id.ask_item_content) TextView mAskContent; @BindView(R.id.ask_item_img) @@ -40,6 +40,8 @@ public class AskQuestionsHotViewHolder extends BaseRecyclerViewHolder { public AskQuestionsHotViewHolder(View itemView, Object data, OnListClickListener listClickListener) { super(itemView, data, listClickListener); itemView.setOnClickListener(this); + mAskTitle.setOnClickListener(this); + mAskContent.setOnClickListener(this); } public void initQuestionsHotViewHolder(Context context, QuestionsEntity entity) { @@ -56,7 +58,10 @@ public class AskQuestionsHotViewHolder extends BaseRecyclerViewHolder { } List images = entity.getImages(); if (images != null && images.size() > 0) { + mAskImg.setVisibility(View.VISIBLE); ImageUtils.Companion.display(mAskImg, images.get(0)); + } else { + mAskImg.setVisibility(View.GONE); } } diff --git a/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsNewBodyAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsNewBodyAdapter.java index 334364e16a..e294418c3c 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsNewBodyAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsNewBodyAdapter.java @@ -9,7 +9,6 @@ import com.gh.base.OnListClickListener; import com.gh.common.constant.ItemViewType; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; -import com.gh.gamecenter.ask.entity.QuestionsEntity; import com.gh.gamecenter.ask.entity.Questions; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.LoadStatus; @@ -24,7 +23,7 @@ public class AskQuestionsNewBodyAdapter extends ListAdapter { private OnListClickListener mListClickListener; - private List mEntityList; + private List mEntityList; public AskQuestionsNewBodyAdapter(Context context, OnListClickListener listClickListener) { @@ -34,7 +33,7 @@ public class AskQuestionsNewBodyAdapter extends ListAdapter { @Override protected void provideListData(List listData) { - mEntityList = (List) listData; + mEntityList = (List) listData; notifyDataSetChanged(); } @@ -69,7 +68,7 @@ public class AskQuestionsNewBodyAdapter extends ListAdapter { return new FooterViewHolder(view, null, mListClickListener); case ItemViewType.ITEM_BODY: view = mLayoutInflater.inflate(R.layout.ask_questions_new_item, parent, false); - return new AskQuestionsNewViewHolder(view, null, mListClickListener); + return new AskQuestionsNewViewHolder(view, mEntityList, mListClickListener); default: return null; } @@ -79,13 +78,7 @@ public class AskQuestionsNewBodyAdapter extends ListAdapter { public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { switch (getItemViewType(position)) { case ItemViewType.ITEM_BODY: - QuestionsEntity askEntity = mEntityList.get(position); - AskQuestionsNewViewHolder askHolder = (AskQuestionsNewViewHolder) holder; - askHolder.mAnswerCount.setText(mContext.getString(R.string.ask_answer_count, askEntity.getAnswers())); - Questions question = askEntity.getQuestion(); - if (question != null) { - askHolder.mTitle.setText(question.getTitle()); - } + ((AskQuestionsNewViewHolder) holder).initAskQuestionsNewViewHolder(mEntityList.get(position)); break; case ItemViewType.ITEM_FOOTER: FooterViewHolder footerViewHolder = (FooterViewHolder) holder; diff --git a/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsNewBodyFragment.java b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsNewBodyFragment.java index c25b52eee3..ff1633399b 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsNewBodyFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsNewBodyFragment.java @@ -4,8 +4,9 @@ import android.os.Bundle; import android.support.annotation.Nullable; import android.view.View; +import com.gh.gamecenter.AskQuestionsDetailActivity; import com.gh.gamecenter.R; -import com.gh.gamecenter.ask.entity.QuestionsEntity; +import com.gh.gamecenter.ask.entity.Questions; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; import com.gh.gamecenter.baselist.LoadStatus; @@ -26,13 +27,11 @@ public class AskQuestionsNewBodyFragment extends ListFragment { private AskQuestionsNewBodyAdapter mAdapter; - private String mCommunityId; private String mType; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mCommunityId = UserManager.getInstance().getCommunityId(getContext()); mType = getArguments().getString(AskQuestionsNewFragment.ASK_QUESTIONS_TYPE); } @@ -43,8 +42,9 @@ public class AskQuestionsNewBodyFragment extends ListFragment { @SuppressWarnings("unchecked") @Override - public Observable> provideDataObservable() { - return RetrofitManager.getInstance(getContext()).getApi().getAskQuestions(mCommunityId, mType, getListOffset()); + public Observable> provideDataObservable() { + return RetrofitManager.getInstance(getContext()).getApi() + .getAskQuestions(UserManager.getInstance().getCommunityId(getContext()), mType, getListOffset()); } @Override @@ -56,6 +56,10 @@ public class AskQuestionsNewBodyFragment extends ListFragment { mListViewModel.load(LoadType.RETRY); } break; + case R.id.ask_questions_new_item: + List questionsList = (List) data; + startActivity(AskQuestionsDetailActivity.getIntent(getContext(), questionsList.get(position).getId())); + break; } } diff --git a/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsNewViewHolder.java b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsNewViewHolder.java index 474e425bd6..0a8c2d58bc 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsNewViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsNewViewHolder.java @@ -6,6 +6,7 @@ import android.widget.TextView; import com.gh.base.BaseRecyclerViewHolder; import com.gh.base.OnListClickListener; import com.gh.gamecenter.R; +import com.gh.gamecenter.ask.entity.Questions; import butterknife.BindView; @@ -22,5 +23,11 @@ public class AskQuestionsNewViewHolder extends BaseRecyclerViewHolder { public AskQuestionsNewViewHolder(View itemView, Object data, OnListClickListener listClickListener) { super(itemView, data, listClickListener); + itemView.setOnClickListener(this); + } + + public void initAskQuestionsNewViewHolder(Questions questions) { + mAnswerCount.setText(itemView.getContext().getString(R.string.ask_answer_count, questions.getAnswerCount())); + mTitle.setText(questions.getTitle()); } } diff --git a/app/src/main/java/com/gh/gamecenter/ask/QuestionsEditFragment.java b/app/src/main/java/com/gh/gamecenter/ask/QuestionsEditFragment.java index a8e981d985..05fff94869 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/QuestionsEditFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/QuestionsEditFragment.java @@ -9,6 +9,7 @@ import android.os.Bundle; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.content.ContextCompat; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; @@ -22,19 +23,37 @@ import android.view.inputmethod.EditorInfo; import android.widget.EditText; import android.widget.TextView; +import com.gh.base.fragment.WaitingDialogFragment; +import com.gh.common.util.CheckLoginUtils; import com.gh.common.util.DisplayUtils; +import com.gh.common.util.GsonUtils; +import com.gh.common.util.ImageUtils; import com.gh.gamecenter.R; +import com.gh.gamecenter.ask.entity.QuestionsDetailEntity; +import com.gh.gamecenter.manager.UserManager; import com.gh.gamecenter.normal.NormalFragment; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import com.gh.gamecenter.suggest.SuggestPicAdapter; import com.google.android.flexbox.FlexboxLayout; import com.lightgame.utils.Util_System_Keyboard; import com.lightgame.utils.Utils; +import org.jetbrains.annotations.NotNull; + import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import butterknife.BindView; import butterknife.OnClick; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import retrofit2.HttpException; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; import static com.gh.gamecenter.SuggestionActivity.MEDIA_STORE_REQUEST; @@ -57,6 +76,10 @@ public class QuestionsEditFragment extends NormalFragment { private SuggestPicAdapter mAdapter; + private WaitingDialogFragment mPostDialog; + + private List mTagList = new ArrayList<>(); + @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); @@ -98,10 +121,16 @@ public class QuestionsEditFragment extends NormalFragment { return R.layout.fragment_questions_edit; } + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getCommunitiesTags(); + } + @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - setNavigationTitle(""); + setNavigationTitle("社区对应的游戏名字"); mPicRv.setLayoutManager(new LinearLayoutManager(getContext(), RecyclerView.HORIZONTAL, false)); // 意见反馈上传图片列表 @@ -115,24 +144,132 @@ public class QuestionsEditFragment extends NormalFragment { mPicRv.setAdapter(mAdapter); } - @OnClick({R.id.questionsedit_tag_add}) + @OnClick({R.id.questionsedit_tag_add, R.id.questionsedit_post}) public void onClick(View v) { - if (v.getId() == R.id.questionsedit_tag_add) { - showAddTagDialog(); + switch (v.getId()) { + case R.id.questionsedit_tag_add: + showAddTagDialog(); + break; + case R.id.questionsedit_post: + mPostDialog = WaitingDialogFragment.newInstance(getString(R.string.vote_post)); + mPostDialog.show(getChildFragmentManager(), null); + + CheckLoginUtils.checkLogin(getContext(), () -> { + ImageUtils.Companion.postImageArr(getContext(), mAdapter.getFileList(), new ImageUtils.OnPostImageListener() { + @Override + public void postError() { + mPostDialog.dismissAllowingStateLoss(); + } + + @Override + public void postSuccess(@NotNull HashMap imgMap) { + List imgs = new ArrayList<>(); + for (String s : imgMap.keySet()) { + imgs.add(imgMap.get(s)); + } + postQuestions(imgs); + } + + }); + }); + break; } + } + + private void getCommunitiesTags() { + + RetrofitManager.getInstance(getContext()).getApi() + .getCommunitiesTags(UserManager.getInstance().getCommunityId(getContext())) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { + @Override + public void onResponse(List response) { + for (String s : response) { + addTag(s, true); + } + } + + @Override + public void onFailure(HttpException e) { + Utils.log("QuestionsEdit-> getCommunitiesTags: onFailure"); + } + }); } - private void addTag(String tag) { + private void postQuestions(List imgs) { + String title = mTitle.getText().toString(); + if (TextUtils.isEmpty(title)) { + toast("标题不能为空"); + mPostDialog.dismissAllowingStateLoss(); + return; + } + String content = mContent.getText().toString(); + if (TextUtils.isEmpty(content)) { + toast("内容不能为空"); + mPostDialog.dismissAllowingStateLoss(); + return; + } + + QuestionsDetailEntity entity = new QuestionsDetailEntity(); + entity.setTitle(title); + entity.setTags(mTagList); + entity.setImages(imgs); + entity.setDescription(content); + String jsonBody = GsonUtils.Companion.getInstance().toJson(entity); + Utils.log("postQuestions->Body:" + jsonBody); + RequestBody body = RequestBody.create(MediaType.parse("application/json"), jsonBody); + RetrofitManager.getInstance(getContext()).getApi() + .postQuestions(body, UserManager.getInstance().getCommunityId(getContext())) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { + @Override + public void onResponse(ResponseBody response) { + super.onResponse(response); + mPostDialog.dismissAllowingStateLoss(); + toast("提交成功"); + if (getActivity() != null) getActivity().finish(); + } + + @Override + public void onFailure(HttpException e) { + super.onFailure(e); + mPostDialog.dismissAllowingStateLoss(); + toast("提交失败"); + } + }); + } + + private void addTag(String tag, boolean isDefault) { View view = LayoutInflater.from(getContext()).inflate(R.layout.questionsdedit_tag_item, null); TextView tagTv = (TextView) view; tagTv.setText(tag); + if (!isDefault) { + tagTv.setBackgroundResource(R.drawable.comment_border_bg); + tagTv.setTextColor(ContextCompat.getColor(getContext(), R.color.theme)); + } FlexboxLayout.LayoutParams params = new FlexboxLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); params.setMargins(0, DisplayUtils.dip2px(getContext(), 5), DisplayUtils.dip2px(getContext(), 15), DisplayUtils.dip2px(getContext(), 5)); tagTv.setLayoutParams(params); mTagFl.addView(view, 0); + mTagList.add(tag); } + @Override + public void onListClick(View view, int position, Object data) { + super.onListClick(view, position, data); + List picList = (List) data; + if (position == mAdapter.getItemCount() - 1 && picList.size() < 5) { + Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + startActivityForResult(intent, MEDIA_STORE_REQUEST); + } + + } + + + // todo 重构 private void showAddTagDialog() { final Dialog dialog = new Dialog(getContext()); @@ -154,7 +291,7 @@ public class QuestionsEditFragment extends NormalFragment { Utils.toast(getContext(), getString(R.string.vote_empty_hint)); return true; } - addTag(nickname); + addTag(nickname, false); dialog.dismiss(); return true; } @@ -181,7 +318,7 @@ public class QuestionsEditFragment extends NormalFragment { Utils.toast(getContext(), getString(R.string.vote_empty_hint)); return; } - addTag(nickname); + addTag(nickname, false); dialog.dismiss(); } }); @@ -205,15 +342,5 @@ public class QuestionsEditFragment extends NormalFragment { }, 300); } - @Override - public void onListClick(View view, int position, Object data) { - super.onListClick(view, position, data); - List picList = (List) data; - if (position == mAdapter.getItemCount() - 1 && picList.size() < 5) { - Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); - startActivityForResult(intent, MEDIA_STORE_REQUEST); - } - - } } diff --git a/app/src/main/java/com/gh/gamecenter/ask/SelectGameFragment.java b/app/src/main/java/com/gh/gamecenter/ask/SelectGameFragment.java index bc1b9ec0c6..df62e520b2 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/SelectGameFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/SelectGameFragment.java @@ -13,6 +13,7 @@ import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.AskSelectGameAdapter; import com.gh.gamecenter.ask.entity.AskGameSelectEntity; +import com.gh.gamecenter.ask.entity.MeEntity; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; import com.gh.gamecenter.manager.UserManager; @@ -115,7 +116,10 @@ public class SelectGameFragment extends ListFragment { case R.id.ask_selectgame_item_votebtn: CheckLoginUtils.checkLogin(getContext(), () -> { List mEntityList = (List) data; - vote(mEntityList.get(position).getId()); + AskGameSelectEntity askGameSelectEntity = mEntityList.get(position); + MeEntity me = askGameSelectEntity.getMe(); + if (me == null || !me.isCommunityVoted()) + vote(askGameSelectEntity.getId()); }); break; @@ -135,10 +139,11 @@ public class SelectGameFragment extends ListFragment { String string = response.string(); JSONObject object = new JSONObject(string); int vote = object.getInt("vote"); - if (vote == 200) { // todo 测试不通过 - toast(R.string.vote_success); - mAdapter.voteSuccess(communityId); + if (vote == 200) { + } + toast(R.string.vote_success); + mAdapter.voteSuccess(communityId); } catch (Exception e) { e.printStackTrace(); } diff --git a/app/src/main/java/com/gh/gamecenter/ask/entity/AnswerDetailEntity.kt b/app/src/main/java/com/gh/gamecenter/ask/entity/AnswerDetailEntity.kt index 352f26b1c2..565e5a09f4 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/entity/AnswerDetailEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/ask/entity/AnswerDetailEntity.kt @@ -11,9 +11,9 @@ class AnswerDetailEntity() : Parcelable { var content: String? = null - var time: Long? = null + var time: AskTimeEntity? = null - var me: MeEntity? = null + var me: MeEntity = MeEntity() var user: UserEntity? = null @@ -21,14 +21,14 @@ class AnswerDetailEntity() : Parcelable { constructor(parcel: Parcel) : this() { content = parcel.readString() - time = parcel.readValue(Long::class.java.classLoader) as? Long + time = parcel.readParcelable(AskTimeEntity::class.java.classLoader) user = parcel.readParcelable(UserEntity::class.java.classLoader) vote = parcel.readInt() } override fun writeToParcel(parcel: Parcel, flags: Int) { parcel.writeString(content) - parcel.writeValue(time) + parcel.writeParcelable(time, flags) parcel.writeParcelable(user, flags) parcel.writeInt(vote) } diff --git a/app/src/main/java/com/gh/gamecenter/ask/entity/AnswerEntity.kt b/app/src/main/java/com/gh/gamecenter/ask/entity/AnswerEntity.kt index 9de9feb583..efc36cbaaa 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/entity/AnswerEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/ask/entity/AnswerEntity.kt @@ -21,9 +21,13 @@ class AnswerEntity() : Parcelable { var user: UserEntity? = null + @SerializedName("question") + var questions: Questions = Questions() + constructor(parcel: Parcel) : this() { id = parcel.readString() brief = parcel.readString() + questions = parcel.readParcelable(Questions::class.java.classLoader) images = parcel.createStringArrayList() vote = parcel.readInt() user = parcel.readParcelable(UserEntity::class.java.classLoader) @@ -32,6 +36,7 @@ class AnswerEntity() : Parcelable { override fun writeToParcel(parcel: Parcel, flags: Int) { parcel.writeString(id) parcel.writeString(brief) + parcel.writeParcelable(questions, flags) parcel.writeStringList(images) parcel.writeInt(vote) parcel.writeParcelable(user, flags) diff --git a/app/src/main/java/com/gh/gamecenter/ask/entity/AskOpenEntity.kt b/app/src/main/java/com/gh/gamecenter/ask/entity/AskOpenEntity.kt index 5327cd224b..404d8146c3 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/entity/AskOpenEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/ask/entity/AskOpenEntity.kt @@ -7,6 +7,7 @@ import com.google.gson.annotations.SerializedName * Created by khy on 11/12/17. */ class AskOpenEntity { + @SerializedName("_id") var id: String? = null diff --git a/app/src/main/java/com/gh/gamecenter/ask/entity/AskTimeEntity.kt b/app/src/main/java/com/gh/gamecenter/ask/entity/AskTimeEntity.kt index 622e43e6f1..efee1fe919 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/entity/AskTimeEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/ask/entity/AskTimeEntity.kt @@ -1,13 +1,45 @@ package com.gh.gamecenter.ask.entity +import android.os.Parcel +import android.os.Parcelable + /** * Created by khy on 11/12/17. */ -class AskTimeEntity { +class AskTimeEntity() : Parcelable { var create: Long? = null var update: Long? = null var open: Long? = null + + constructor(parcel: Parcel) : this() { + create = parcel.readValue(Long::class.java.classLoader) as? Long + update = parcel.readValue(Long::class.java.classLoader) as? Long + open = parcel.readValue(Long::class.java.classLoader) as? Long + } + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeValue(create) + parcel.writeValue(update) + parcel.writeValue(open) + } + + override fun describeContents(): Int { + return 0 + } + + companion object { + @JvmField + val CREATOR: Parcelable.Creator = object : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): AskTimeEntity { + return AskTimeEntity(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/ask/entity/MeEntity.kt b/app/src/main/java/com/gh/gamecenter/ask/entity/MeEntity.kt index 6955d41cc1..39ab6a763e 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/entity/MeEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/ask/entity/MeEntity.kt @@ -12,4 +12,16 @@ class MeEntity { @SerializedName("is_expert_invited") var isExpertInvited: Boolean = false + + @SerializedName("is_answer_voted") + var isAnswerVoted: Boolean = false + + @SerializedName("is_answer_own") + var isAnswerOwn: Boolean = false + + @SerializedName("is_answer_favorite") + var isAnswerFavorite: Boolean = false + + @SerializedName("is_question_followed") + var isQuestionFollowed: Boolean = false } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/ask/entity/Questions.kt b/app/src/main/java/com/gh/gamecenter/ask/entity/Questions.kt index 45b3733adc..1fc896e5f3 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/entity/Questions.kt +++ b/app/src/main/java/com/gh/gamecenter/ask/entity/Questions.kt @@ -1,19 +1,45 @@ package com.gh.gamecenter.ask.entity +import android.os.Parcel +import android.os.Parcelable import com.google.gson.annotations.SerializedName /** * Created by khy on 11/12/17. */ -class Questions { +class Questions() : Parcelable { @SerializedName("_id") var id: String? = null var title: String? = null - var answers: String? = null - @SerializedName("answer_count") - var answersCount: Int = 0 + var answerCount: Int = 0 + + constructor(parcel: Parcel) : this() { + id = parcel.readString() + title = parcel.readString() + answerCount = parcel.readInt() + } + + override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(id) + parcel.writeString(title) + parcel.writeInt(answerCount) + } + + override fun describeContents(): Int { + return 0 + } + + companion object CREATOR : Parcelable.Creator { + override fun createFromParcel(parcel: Parcel): Questions { + return Questions(parcel) + } + + override fun newArray(size: Int): Array { + return arrayOfNulls(size) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailEntity.kt b/app/src/main/java/com/gh/gamecenter/ask/entity/QuestionsDetailEntity.kt similarity index 77% rename from app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailEntity.kt rename to app/src/main/java/com/gh/gamecenter/ask/entity/QuestionsDetailEntity.kt index 4ac3f63810..e6f4e3f1d6 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/ask/entity/QuestionsDetailEntity.kt @@ -1,4 +1,4 @@ -package com.gh.gamecenter.ask.questionsdetail +package com.gh.gamecenter.ask.entity /** * Created by khy on 18/12/17. @@ -14,4 +14,6 @@ class QuestionsDetailEntity { var images: List = ArrayList() var answers: Int = 0 + + var me: MeEntity = MeEntity() } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/ask/myask/ConcernQuestionsAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/myask/ConcernQuestionsAdapter.java new file mode 100644 index 0000000000..514c862fed --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/myask/ConcernQuestionsAdapter.java @@ -0,0 +1,97 @@ +package com.gh.gamecenter.ask.myask; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import com.gh.base.OnListClickListener; +import com.gh.common.constant.ItemViewType; +import com.gh.gamecenter.R; +import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; +import com.gh.gamecenter.ask.AskQuestionsNewViewHolder; +import com.gh.gamecenter.ask.entity.Questions; +import com.gh.gamecenter.baselist.ListAdapter; +import com.gh.gamecenter.baselist.LoadStatus; + +import java.util.List; + +/** + * Created by khy on 20/12/17. + */ + +class ConcernQuestionsAdapter extends ListAdapter { + + private OnListClickListener mListClickListener; + + private List mEntityList; + + + public ConcernQuestionsAdapter(Context context, OnListClickListener listClickListener) { + super(context); + mListClickListener = listClickListener; + } + + @Override + protected void provideListData(List listData) { + mEntityList = (List) listData; + notifyDataSetChanged(); + } + + @Override + protected void loadChange(LoadStatus status) { + switch (status) { + case OVER: + mIsOver = true; + break; + case ERROR: + mIsNetworkError = true; + break; + case RETRY: + mIsNetworkError = false; + break; + } + notifyItemChanged(getItemCount() - 1); + } + + @Override + public int getItemViewType(int position) { + if (position == getItemCount() - 1) return ItemViewType.ITEM_FOOTER; + return ItemViewType.ITEM_BODY; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view; + switch (viewType) { + case ItemViewType.ITEM_FOOTER: + view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false); + return new FooterViewHolder(view, null, mListClickListener); + case ItemViewType.ITEM_BODY: + view = mLayoutInflater.inflate(R.layout.ask_questions_new_item, parent, false); + return new AskQuestionsNewViewHolder(view, mEntityList, mListClickListener); + default: + return null; + } + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + switch (getItemViewType(position)) { + case ItemViewType.ITEM_BODY: + ((AskQuestionsNewViewHolder) holder).initAskQuestionsNewViewHolder(mEntityList.get(position)); + + break; + case ItemViewType.ITEM_FOOTER: + FooterViewHolder footerViewHolder = (FooterViewHolder) holder; + footerViewHolder.initItemPadding(); + footerViewHolder.initFooterViewHolder(mIsNetworkError, mIsOver, R.string.ask_loadover_hint); + break; + } + } + + @Override + public int getItemCount() { + return mEntityList == null || mEntityList.isEmpty() ? 0 : mEntityList.size() + FOOTER_ITEM_COUNT; + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/myask/ConcernQuestionsFragment.java b/app/src/main/java/com/gh/gamecenter/ask/myask/ConcernQuestionsFragment.java new file mode 100644 index 0000000000..09a70e9651 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/myask/ConcernQuestionsFragment.java @@ -0,0 +1,42 @@ +package com.gh.gamecenter.ask.myask; + +import android.view.View; + +import com.gh.gamecenter.AskQuestionsDetailActivity; +import com.gh.gamecenter.R; +import com.gh.gamecenter.ask.entity.Questions; +import com.gh.gamecenter.baselist.ListAdapter; +import com.gh.gamecenter.baselist.ListFragment; +import com.gh.gamecenter.retrofit.RetrofitManager; + +import java.util.List; + +import rx.Observable; + +/** + * Created by khy on 20/12/17. + */ + +public class ConcernQuestionsFragment extends ListFragment { + + private ConcernQuestionsAdapter mAdapter; + + @Override + protected ListAdapter provideListAdapter() { + return mAdapter == null ? mAdapter = new ConcernQuestionsAdapter(getContext(), this) : mAdapter; + } + + + @Override + public Observable> provideDataObservable() { + return RetrofitManager.getInstance(getContext()).getApi().getConcernQuestions(getListOffset()); + } + + @Override + public void onListClick(View view, int position, Object data) { + if (view.getId() == R.id.ask_questions_new_item) { + List questionsList = (List) data; + startActivity(AskQuestionsDetailActivity.getIntent(getContext(), questionsList.get(position).getId())); + } + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/myask/MyAnswerAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/myask/MyAnswerAdapter.java new file mode 100644 index 0000000000..1a4c848081 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/myask/MyAnswerAdapter.java @@ -0,0 +1,95 @@ +package com.gh.gamecenter.ask.myask; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import com.gh.base.OnListClickListener; +import com.gh.common.constant.ItemViewType; +import com.gh.gamecenter.R; +import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; +import com.gh.gamecenter.ask.entity.AnswerEntity; +import com.gh.gamecenter.ask.questionsdetail.AnswerViewHolder; +import com.gh.gamecenter.baselist.ListAdapter; +import com.gh.gamecenter.baselist.LoadStatus; + +import java.util.List; + +/** + * Created by khy on 20/12/17. + */ + +class MyAnswerAdapter extends ListAdapter { + + private OnListClickListener mListClickListener; + + private List mEntityList; + + MyAnswerAdapter(Context context, OnListClickListener listClickListener) { + super(context); + mListClickListener = listClickListener; + } + + @Override + protected void provideListData(List listData) { + mEntityList = (List) listData; + notifyDataSetChanged(); + } + + @Override + protected void loadChange(LoadStatus status) { + switch (status) { + case OVER: + mIsOver = true; + break; + case ERROR: + mIsNetworkError = true; + break; + case RETRY: + mIsNetworkError = false; + break; + } + notifyItemChanged(getItemCount() - 1); + } + + @Override + public int getItemViewType(int position) { + if (position == getItemCount() - 1) return ItemViewType.ITEM_FOOTER; + return ItemViewType.ITEM_BODY; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view; + switch (viewType) { + case ItemViewType.ITEM_FOOTER: + view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false); + return new FooterViewHolder(view, null, mListClickListener); + case ItemViewType.ITEM_BODY: + view = mLayoutInflater.inflate(R.layout.ask_answer_item, parent, false); + return new AnswerViewHolder(view, mEntityList, mListClickListener); + default: + return null; + } + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + switch (getItemViewType(position)) { + case ItemViewType.ITEM_BODY: + ((AnswerViewHolder) holder).initMyAnswerViewHolder(mEntityList.get(position)); + break; + case ItemViewType.ITEM_FOOTER: + FooterViewHolder footerViewHolder = (FooterViewHolder) holder; + footerViewHolder.initItemPadding(); + footerViewHolder.initFooterViewHolder(mIsNetworkError, mIsOver, R.string.ask_loadover_hint); + break; + } + } + + @Override + public int getItemCount() { + return mEntityList == null || mEntityList.isEmpty() ? 0 : mEntityList.size() + FOOTER_ITEM_COUNT; + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/myask/MyAnswerFragment.java b/app/src/main/java/com/gh/gamecenter/ask/myask/MyAnswerFragment.java new file mode 100644 index 0000000000..6136cacc87 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/myask/MyAnswerFragment.java @@ -0,0 +1,46 @@ +package com.gh.gamecenter.ask.myask; + +import android.os.Bundle; +import android.view.View; + +import com.gh.gamecenter.NormalActivity; +import com.gh.gamecenter.R; +import com.gh.gamecenter.ask.AskAnswerDetailFragment; +import com.gh.gamecenter.ask.entity.AnswerEntity; +import com.gh.gamecenter.baselist.ListAdapter; +import com.gh.gamecenter.baselist.ListFragment; +import com.gh.gamecenter.manager.UserManager; +import com.gh.gamecenter.retrofit.RetrofitManager; + +import java.util.List; + +import rx.Observable; + +/** + * Created by khy on 20/12/17. + */ + +public class MyAnswerFragment extends ListFragment { + + private MyAnswerAdapter mAdapter; + + @Override + protected ListAdapter provideListAdapter() { + return mAdapter == null ? mAdapter = new MyAnswerAdapter(getContext(), this) : mAdapter; + } + + @Override + public Observable> provideDataObservable() { + return RetrofitManager.getInstance(getContext()).getApi().getMyAnswers(UserManager.getInstance().getUserId(), getListOffset()); + } + + @Override + public void onListClick(View view, int position, Object data) { + if (view.getId() == R.id.ask_answer_item_constraintlayout) { + List entityList = (List) data; + Bundle bundle = new Bundle(); + bundle.putParcelable(AnswerEntity.TAG, entityList.get(position)); + NormalActivity.startFragment(getContext(), AskAnswerDetailFragment.class, bundle); + } + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/myask/MyAskFragment.java b/app/src/main/java/com/gh/gamecenter/ask/myask/MyAskFragment.java new file mode 100644 index 0000000000..948f905cd4 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/myask/MyAskFragment.java @@ -0,0 +1,27 @@ +package com.gh.gamecenter.ask.myask; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.View; + +import com.gh.gamecenter.R; +import com.gh.gamecenter.normal.NormalFragment; + +/** + * Created by khy on 20/12/17. + */ + +public class MyAskFragment extends NormalFragment { + @Override + protected int getLayoutId() { + return R.layout.fragment_myask; + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + setNavigationTitle(R.string.myask); + getChildFragmentManager().beginTransaction() + .replace(R.id.layout_fragment_content, new MyAskWrapperFragment()).commitAllowingStateLoss(); + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/myask/MyAskWrapperFragment.java b/app/src/main/java/com/gh/gamecenter/ask/myask/MyAskWrapperFragment.java new file mode 100644 index 0000000000..1fe65cac28 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/myask/MyAskWrapperFragment.java @@ -0,0 +1,79 @@ +package com.gh.gamecenter.ask.myask; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.util.DisplayMetrics; +import android.view.View; +import android.widget.LinearLayout; + +import com.gh.base.fragment.BaseFragment_ViewPager_Checkable; +import com.gh.common.util.DisplayUtils; +import com.gh.common.util.RandomUtils; +import com.gh.gamecenter.R; + +import java.util.List; + +import butterknife.BindView; + +/** + * Created by khy on 20/12/17. + */ + +public class MyAskWrapperFragment extends BaseFragment_ViewPager_Checkable { + + @BindView(R.id.myask_slide_line) + View mSlideLine; + + private int mWindowWidth; + private LinearLayout.LayoutParams mLayoutParams; + + @Override + protected boolean getSmoothScroll() { + return true; + } + + @Override + protected int getCheckableGroupId() { + return R.id.lightgame_tab_container; + } + + @Override + protected int getLayoutId() { + return R.layout.fragment_wrapper_myask; + } + + @Override + protected int getViewPagerId() { + return R.id.lightgame_tab_viewpager; + } + + @Override + protected void initFragmentList(List fragments) { + fragments.add(new ConcernQuestionsFragment()); + fragments.add(new MyQuestionsFragment()); + fragments.add(new MyAnswerFragment()); + fragments.add(new MyDraftFragment()); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + DisplayMetrics outMetrics = new DisplayMetrics(); + getActivity().getWindowManager().getDefaultDisplay().getMetrics(outMetrics); + mWindowWidth = outMetrics.widthPixels / 4; + mLayoutParams = new LinearLayout.LayoutParams(mWindowWidth / 2, DisplayUtils.dip2px(getActivity(), 2)); + mLayoutParams.leftMargin = RandomUtils.getInt(mWindowWidth * (mCheckedIndex + 0.25f)); + mSlideLine.setLayoutParams(mLayoutParams); + } + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + super.onPageScrolled(position, positionOffset, positionOffsetPixels); + if (positionOffset != 0) { + mLayoutParams.leftMargin = RandomUtils.getInt(mWindowWidth * (position + positionOffset + 0.25f)); + mSlideLine.setLayoutParams(mLayoutParams); + } + } + +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/myask/MyDraftAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/myask/MyDraftAdapter.java new file mode 100644 index 0000000000..b04145da04 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/myask/MyDraftAdapter.java @@ -0,0 +1,95 @@ +package com.gh.gamecenter.ask.myask; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import com.gh.base.OnListClickListener; +import com.gh.common.constant.ItemViewType; +import com.gh.gamecenter.R; +import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; +import com.gh.gamecenter.ask.entity.AnswerEntity; +import com.gh.gamecenter.ask.questionsdetail.AnswerViewHolder; +import com.gh.gamecenter.baselist.ListAdapter; +import com.gh.gamecenter.baselist.LoadStatus; + +import java.util.List; + +/** + * Created by khy on 20/12/17. + */ + +class MyDraftAdapter extends ListAdapter { + + private OnListClickListener mListClickListener; + + private List mEntityList; + + MyDraftAdapter(Context context, OnListClickListener listClickListener) { + super(context); + mListClickListener = listClickListener; + } + + @Override + protected void provideListData(List listData) { + mEntityList = (List) listData; + notifyDataSetChanged(); + } + + @Override + protected void loadChange(LoadStatus status) { + switch (status) { + case OVER: + mIsOver = true; + break; + case ERROR: + mIsNetworkError = true; + break; + case RETRY: + mIsNetworkError = false; + break; + } + notifyItemChanged(getItemCount() - 1); + } + + @Override + public int getItemViewType(int position) { + if (position == getItemCount() - 1) return ItemViewType.ITEM_FOOTER; + return ItemViewType.ITEM_BODY; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view; + switch (viewType) { + case ItemViewType.ITEM_FOOTER: + view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false); + return new FooterViewHolder(view, null, mListClickListener); + case ItemViewType.ITEM_BODY: + view = mLayoutInflater.inflate(R.layout.ask_answer_item, parent, false); + return new AnswerViewHolder(view, mEntityList, mListClickListener); + default: + return null; + } + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + switch (getItemViewType(position)) { + case ItemViewType.ITEM_BODY: + ((AnswerViewHolder) holder).initAnswerViewHolder(mContext, mEntityList.get(position)); + break; + case ItemViewType.ITEM_FOOTER: + FooterViewHolder footerViewHolder = (FooterViewHolder) holder; + footerViewHolder.initItemPadding(); + footerViewHolder.initFooterViewHolder(mIsNetworkError, mIsOver, R.string.ask_loadover_hint); + break; + } + } + + @Override + public int getItemCount() { + return mEntityList == null || mEntityList.isEmpty() ? 0 : mEntityList.size() + FOOTER_ITEM_COUNT; + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/myask/MyDraftFragment.java b/app/src/main/java/com/gh/gamecenter/ask/myask/MyDraftFragment.java new file mode 100644 index 0000000000..56afe89584 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/myask/MyDraftFragment.java @@ -0,0 +1,37 @@ +package com.gh.gamecenter.ask.myask; + +import android.support.annotation.Nullable; + +import com.gh.gamecenter.ask.entity.AnswerEntity; +import com.gh.gamecenter.baselist.ListAdapter; +import com.gh.gamecenter.baselist.ListFragment; +import com.gh.gamecenter.manager.UserManager; +import com.gh.gamecenter.retrofit.RetrofitManager; + +import java.util.List; + +import rx.Observable; + +/** + * Created by khy on 20/12/17. + */ + +public class MyDraftFragment extends ListFragment { + + private MyDraftAdapter mAdapter; + + @Override + protected ListAdapter provideListAdapter() { + return mAdapter == null ? mAdapter = new MyDraftAdapter(getContext(), this) : mAdapter; + } + + @Override + public void onChanged(@Nullable Object o) { + + } + + @Override + public Observable> provideDataObservable() { + return RetrofitManager.getInstance(getContext()).getApi().getMyAnswerDrafts(UserManager.getInstance().getUserId(), getListOffset()); + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/myask/MyQuestionsAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/myask/MyQuestionsAdapter.java new file mode 100644 index 0000000000..35b865d146 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/myask/MyQuestionsAdapter.java @@ -0,0 +1,97 @@ +package com.gh.gamecenter.ask.myask; + +import android.content.Context; +import android.support.v7.widget.RecyclerView; +import android.view.View; +import android.view.ViewGroup; + +import com.gh.base.OnListClickListener; +import com.gh.common.constant.ItemViewType; +import com.gh.gamecenter.R; +import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; +import com.gh.gamecenter.ask.AskQuestionsNewViewHolder; +import com.gh.gamecenter.ask.entity.Questions; +import com.gh.gamecenter.baselist.ListAdapter; +import com.gh.gamecenter.baselist.LoadStatus; + +import java.util.List; + +/** + * Created by khy on 20/12/17. + */ + +public class MyQuestionsAdapter extends ListAdapter { + + private OnListClickListener mListClickListener; + + private List mEntityList; + + + public MyQuestionsAdapter(Context context, OnListClickListener listClickListener) { + super(context); + mListClickListener = listClickListener; + } + + @Override + protected void provideListData(List listData) { + mEntityList = (List) listData; + notifyDataSetChanged(); + } + + @Override + protected void loadChange(LoadStatus status) { + switch (status) { + case OVER: + mIsOver = true; + break; + case ERROR: + mIsNetworkError = true; + break; + case RETRY: + mIsNetworkError = false; + break; + } + notifyItemChanged(getItemCount() - 1); + } + + @Override + public int getItemViewType(int position) { + if (position == getItemCount() - 1) return ItemViewType.ITEM_FOOTER; + return ItemViewType.ITEM_BODY; + } + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view; + switch (viewType) { + case ItemViewType.ITEM_FOOTER: + view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false); + return new FooterViewHolder(view, null, mListClickListener); + case ItemViewType.ITEM_BODY: + view = mLayoutInflater.inflate(R.layout.ask_questions_new_item, parent, false); + return new AskQuestionsNewViewHolder(view, mEntityList, mListClickListener); + default: + return null; + } + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + switch (getItemViewType(position)) { + case ItemViewType.ITEM_BODY: + ((AskQuestionsNewViewHolder) holder).initAskQuestionsNewViewHolder(mEntityList.get(position)); + + break; + case ItemViewType.ITEM_FOOTER: + FooterViewHolder footerViewHolder = (FooterViewHolder) holder; + footerViewHolder.initItemPadding(); + footerViewHolder.initFooterViewHolder(mIsNetworkError, mIsOver, R.string.ask_loadover_hint); + break; + } + } + + @Override + public int getItemCount() { + return mEntityList == null || mEntityList.isEmpty() ? 0 : mEntityList.size() + FOOTER_ITEM_COUNT; + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/myask/MyQuestionsFragment.java b/app/src/main/java/com/gh/gamecenter/ask/myask/MyQuestionsFragment.java new file mode 100644 index 0000000000..b645d7f557 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/myask/MyQuestionsFragment.java @@ -0,0 +1,42 @@ +package com.gh.gamecenter.ask.myask; + +import android.view.View; + +import com.gh.gamecenter.AskQuestionsDetailActivity; +import com.gh.gamecenter.R; +import com.gh.gamecenter.ask.entity.Questions; +import com.gh.gamecenter.baselist.ListAdapter; +import com.gh.gamecenter.baselist.ListFragment; +import com.gh.gamecenter.manager.UserManager; +import com.gh.gamecenter.retrofit.RetrofitManager; + +import java.util.List; + +import rx.Observable; + +/** + * Created by khy on 20/12/17. + */ + +public class MyQuestionsFragment extends ListFragment { + + private MyQuestionsAdapter mAdapter; + + @Override + protected ListAdapter provideListAdapter() { + return mAdapter == null ? mAdapter = new MyQuestionsAdapter(getContext(), this) : mAdapter; + } + + @Override + public Observable> provideDataObservable() { + return RetrofitManager.getInstance(getContext()).getApi().getMyQuestions(UserManager.getInstance().getUserId(), getListOffset()); + } + + @Override + public void onListClick(View view, int position, Object data) { + if (view.getId() == R.id.ask_questions_new_item) { + List questionsList = (List) data; + startActivity(AskQuestionsDetailActivity.getIntent(getContext(), questionsList.get(position).getId())); + } + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerEditFragment.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerEditFragment.java index 71c5272e10..22da8a4f8a 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerEditFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerEditFragment.java @@ -1,5 +1,6 @@ package com.gh.gamecenter.ask.questionsdetail; +import android.app.Activity; import android.content.Intent; import android.database.Cursor; import android.net.Uri; @@ -7,21 +8,29 @@ import android.os.Bundle; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.text.TextUtils; +import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import android.widget.TextView; -import com.gh.base.fragment.BaseFragment; +import com.gh.base.fragment.WaitingDialogFragment; import com.gh.common.util.CheckLoginUtils; +import com.gh.common.util.DialogUtils; +import com.gh.common.util.EntranceUtils; import com.gh.common.util.ImageUtils; import com.gh.common.view.RichEditor; import com.gh.gamecenter.R; -import com.gh.base.fragment.WaitingDialogFragment; +import com.gh.gamecenter.normal.NormalFragment; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; import com.halo.assistant.fragment.user.SelectPortraitFragment; import com.lightgame.config.CommonDebug; import com.lightgame.utils.Utils; import org.jetbrains.annotations.NotNull; +import org.json.JSONException; +import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; @@ -29,12 +38,19 @@ import java.util.List; import butterknife.BindView; import butterknife.OnClick; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import retrofit2.HttpException; +import rx.Observable; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; /** * Created by khy on 7/12/17. */ -public class AnswerEditFragment extends BaseFragment { +public class AnswerEditFragment extends NormalFragment { @BindView(R.id.answer_edit_title) TextView mTitle; @BindView(R.id.answer_edit_content) @@ -48,6 +64,32 @@ public class AnswerEditFragment extends BaseFragment { private WaitingDialogFragment postDialog; + private String mAnswerId; + private String mAnswerContent; + + private String mQuestionsId; + private String mQuestionsTitle; + +// public static AnswerEditFragment getInstance(String questionsId, String questionsTitle) { +// AnswerEditFragment fragment = new AnswerEditFragment(); +// Bundle args = new Bundle(); +// args.putString(EntranceUtils.KEY_QUESTIONS_ID, questionsId); +// args.putString(EntranceUtils.KEY_QUESTIONS_TITLE, questionsTitle); +// fragment.setArguments(args); +// return fragment; +// } + +// public static AnswerEditFragment getInstanceByPatch(String mAnswerId, String questionsTitle, String content) { +// AnswerEditFragment fragment = new AnswerEditFragment(); +// Bundle args = new Bundle(); +// args.putString(EntranceUtils.KEY_ANSWER_ID, mAnswerId); +// args.putString(EntranceUtils.KEY_QUESTIONS_TITLE, questionsTitle); +// args.putString(EntranceUtils.KEY_ANSWER_CONTENT, content); +// fragment.setArguments(args); +// return fragment; +// } + + @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); @@ -74,6 +116,18 @@ public class AnswerEditFragment extends BaseFragment { } } + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + Bundle arguments = getArguments(); + if (arguments != null) { + mAnswerId = arguments.getString(EntranceUtils.KEY_ANSWER_ID); + mAnswerContent = arguments.getString(EntranceUtils.KEY_ANSWER_CONTENT); + mQuestionsId = arguments.getString(EntranceUtils.KEY_QUESTIONS_ID); + mQuestionsTitle = arguments.getString(EntranceUtils.KEY_QUESTIONS_TITLE); + } + } + @Override protected int getLayoutId() { return R.layout.fragment_answer_edit; @@ -82,7 +136,22 @@ public class AnswerEditFragment extends BaseFragment { @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); + setNavigationTitle(R.string.answer_detail_title); + initMenu(R.menu.menu_concern); + + mTitle.setText(mQuestionsTitle); mEditContent.setPadding(20, 15, 20, 15); + + if (!TextUtils.isEmpty(mAnswerId)) { + mEditContent.setHtml(mAnswerContent); + } + } + + @Override + public void onMenuItemClick(MenuItem menuItem) { + if (menuItem.getItemId() == R.id.menu_concern) { + postAnswer(); + } } public void postAnswer() { @@ -98,10 +167,10 @@ public class AnswerEditFragment extends BaseFragment { } String answerContent = mEditContent.getHtml(); for (String s : imgMap.keySet()) { - answerContent = answerContent.replace(FILE_HOST + s, imgMap.get(s)); // todo 需要测试 + answerContent = answerContent.replace(FILE_HOST + s, imgMap.get(s)); } - postDialog.dismissAllowingStateLoss(); + post(answerContent); if (CommonDebug.IS_DEBUG) Utils.log("answerEditHtml:" + answerContent); } @@ -114,6 +183,102 @@ public class AnswerEditFragment extends BaseFragment { }); } + private void post(String editContent) { + JSONObject content = new JSONObject(); + try { + content.put("content", editContent); + } catch (JSONException e) { + e.printStackTrace(); + } + RequestBody body = RequestBody.create(MediaType.parse("application/json"), content.toString()); + Observable observable; + if (!TextUtils.isEmpty(mAnswerId)) { + observable = RetrofitManager.getInstance(getContext()).getApi().patchQuestionAnswer(body, mAnswerId); + } else { + observable = RetrofitManager.getInstance(getContext()).getApi().postQuestionAnswer(body, mQuestionsId); + } + observable + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { + @Override + public void onResponse(ResponseBody response) { + super.onResponse(response); + postDialog.dismissAllowingStateLoss(); + toast("提交成功"); + if (getActivity() != null) { + if (!TextUtils.isEmpty(mAnswerId)) { + Intent data = new Intent(); + data.putExtra(EntranceUtils.KEY_ANSWER_CONTENT, editContent); + getActivity().setResult(Activity.RESULT_OK, data); + } + getActivity().finish(); + } + } + + @Override + public void onFailure(HttpException e) { + super.onFailure(e); + postDialog.dismissAllowingStateLoss(); + toast("提交失败"); + } + }); + } + + + @Override + public boolean onBackPressed() { + if (TextUtils.isEmpty(mEditContent.getHtml())) { + return false; + } else { + showBackDialog(); + return true; + } + } + + private void showBackDialog() { + DialogUtils.showAlertDialog(getActivity(), "提示", "确定要退出吗?退出后答案将保存到草稿箱" + , "继续写", " 退出", null, new DialogUtils.CancelListener() { + @Override + public void onCancel() { + saveAnswerDrafts(); + } + }); + } + + private void saveAnswerDrafts() { + String editContent = mEditContent.getHtml(); + if (TextUtils.isEmpty(editContent)) { + getActivity().finish(); + return; + } + JSONObject content = new JSONObject(); + try { + content.put("content", editContent); + } catch (JSONException e) { + e.printStackTrace(); + } + RequestBody body = RequestBody.create(MediaType.parse("application/json"), content.toString()); + RetrofitManager.getInstance(getContext()).getApi() + .postAnswerDrafts(body, mQuestionsId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { + @Override + public void onResponse(ResponseBody response) { + super.onResponse(response); + toast("已保存到草稿箱"); + if (getActivity() != null) getActivity().finish(); + } + + @Override + public void onFailure(HttpException e) { + super.onFailure(e); + toast("保存失败"); + } + }); + } + @OnClick({R.id.answer_edit_img_icon}) public void onClick(View view) { if (view.getId() == R.id.answer_edit_img_icon) { diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldAdapter.java index bb81b21622..6a171e47e3 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldAdapter.java @@ -9,8 +9,7 @@ import com.gh.base.OnListClickListener; import com.gh.common.constant.ItemViewType; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; -import com.gh.gamecenter.ask.AskQuestionsHotViewHolder; -import com.gh.gamecenter.ask.entity.QuestionsEntity; +import com.gh.gamecenter.ask.entity.AnswerEntity; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.LoadStatus; @@ -24,7 +23,7 @@ public class AnswerFoldAdapter extends ListAdapter { private OnListClickListener mListClickListener; - private List mEntityList; + private List mEntityList; public AnswerFoldAdapter(Context context, OnListClickListener listClickListener) { super(context); @@ -33,13 +32,24 @@ public class AnswerFoldAdapter extends ListAdapter { @Override protected void provideListData(List listData) { - mEntityList = (List) listData; + mEntityList = (List) listData; notifyDataSetChanged(); } @Override protected void loadChange(LoadStatus status) { - + switch (status) { + case OVER: + mIsOver = true; + break; + case ERROR: + mIsNetworkError = true; + break; + case RETRY: + mIsNetworkError = false; + break; + } + notifyItemChanged(getItemCount() - 1); } @Override @@ -56,8 +66,8 @@ public class AnswerFoldAdapter extends ListAdapter { view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false); return new FooterViewHolder(view, null, mListClickListener); case ItemViewType.ITEM_BODY: - view = mLayoutInflater.inflate(R.layout.ask_questions_hot_item, parent, false); - return new AskQuestionsHotViewHolder(view, mEntityList, mListClickListener); + view = mLayoutInflater.inflate(R.layout.ask_answer_item, parent, false); + return new AnswerViewHolder(view, mEntityList, mListClickListener); default: return null; } @@ -67,7 +77,7 @@ public class AnswerFoldAdapter extends ListAdapter { public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { switch (getItemViewType(position)) { case ItemViewType.ITEM_BODY: - ((AskQuestionsHotViewHolder) holder).initQuestionsHotViewHolder(mContext, mEntityList.get(position)); + ((AnswerViewHolder) holder).initAnswerViewHolder(mContext, mEntityList.get(position)); break; case ItemViewType.ITEM_FOOTER: FooterViewHolder footerViewHolder = (FooterViewHolder) holder; @@ -79,6 +89,6 @@ public class AnswerFoldAdapter extends ListAdapter { @Override public int getItemCount() { - return 0; + return mEntityList == null || mEntityList.isEmpty() ? 0 : mEntityList.size() + FOOTER_ITEM_COUNT; } } diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldFragment.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldFragment.java index 8ea619cd3c..93b50729e0 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerFoldFragment.java @@ -4,7 +4,7 @@ import android.os.Bundle; import android.support.annotation.Nullable; import com.gh.common.util.EntranceUtils; -import com.gh.gamecenter.ask.entity.QuestionsEntity; +import com.gh.gamecenter.ask.entity.AnswerEntity; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; import com.gh.gamecenter.retrofit.RetrofitManager; @@ -39,7 +39,7 @@ public class AnswerFoldFragment extends ListFragment { } @Override - public Observable> provideDataObservable() { + public Observable> provideDataObservable() { return RetrofitManager.getInstance(getContext()).getApi().getQuestionsAnswer(mQuestionsId, true); } diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerViewHolder.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerViewHolder.java new file mode 100644 index 0000000000..0d3b006582 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/AnswerViewHolder.java @@ -0,0 +1,75 @@ +package com.gh.gamecenter.ask.questionsdetail; + +import android.content.Context; +import android.view.View; +import android.widget.TextView; + +import com.facebook.drawee.view.SimpleDraweeView; +import com.gh.base.BaseRecyclerViewHolder; +import com.gh.base.OnListClickListener; +import com.gh.common.util.ImageUtils; +import com.gh.gamecenter.R; +import com.gh.gamecenter.ask.entity.AnswerEntity; +import com.gh.gamecenter.entity.UserEntity; + +import java.util.List; + +import butterknife.BindView; + +/** + * Created by khy on 19/12/17. + */ + +public class AnswerViewHolder extends BaseRecyclerViewHolder { + + @BindView(R.id.ask_answer_item_usericon) + SimpleDraweeView mUsericon; + @BindView(R.id.ask_answer_item_username) + TextView mUsername; + @BindView(R.id.ask_answer_item_content) + TextView mContent; + @BindView(R.id.ask_answer_item_img) + SimpleDraweeView mImg; + @BindView(R.id.ask_answer_item_votecount) + TextView mVotecount; + @BindView(R.id.ask_answer_item_title) + TextView mQuestionTitle; + + public AnswerViewHolder(View itemView, Object data, OnListClickListener listClickListener) { + super(itemView, data, listClickListener); + itemView.setOnClickListener(this); + } + + public void initAnswerViewHolder(Context context, AnswerEntity entity) { + mContent.setText(entity.getBrief()); + mVotecount.setText(context.getString(R.string.ask_vote_count, entity.getVote())); + UserEntity user = entity.getUser(); + if (user != null) { + mUsername.setText(user.getName()); + ImageUtils.Companion.display(mUsericon, user.getIcon()); + } + List images = entity.getImages(); + if (images != null && images.size() > 0) { + mImg.setVisibility(View.VISIBLE); + ImageUtils.Companion.display(mImg, images.get(0)); + } else { + mImg.setVisibility(View.GONE); + } + } + + public void initMyAnswerViewHolder(AnswerEntity entity) { + mUsername.setVisibility(View.GONE); + mUsericon.setVisibility(View.GONE); + mQuestionTitle.setVisibility(View.VISIBLE); + mQuestionTitle.setText(entity.getQuestions().getTitle()); + mContent.setText(entity.getBrief()); + mVotecount.setText(itemView.getContext().getString(R.string.ask_vote_count, entity.getVote())); + List images = entity.getImages(); + if (images != null && images.size() > 0) { + mImg.setVisibility(View.VISIBLE); + ImageUtils.Companion.display(mImg, images.get(0)); + } else { + mImg.setVisibility(View.GONE); + } + } +} diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailAdapter.java index e6bc89e676..3ad3599e4e 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailAdapter.java @@ -1,6 +1,7 @@ package com.gh.gamecenter.ask.questionsdetail; import android.content.Context; +import android.support.v4.content.ContextCompat; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; @@ -13,11 +14,13 @@ import com.gh.common.util.DisplayUtils; import com.gh.common.util.ImageUtils; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.viewholder.ReuseViewHolder; -import com.gh.gamecenter.ask.AskQuestionsHotViewHolder; -import com.gh.gamecenter.ask.entity.QuestionsEntity; +import com.gh.gamecenter.ask.entity.AnswerEntity; +import com.gh.gamecenter.ask.entity.MeEntity; +import com.gh.gamecenter.ask.entity.QuestionsDetailEntity; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.LoadStatus; import com.google.android.flexbox.FlexboxLayout; +import com.lightgame.utils.Utils; import java.util.List; @@ -29,11 +32,11 @@ public class QuestionsDetailAdapter extends ListAdapter { private OnListClickListener mListClickListener; - private List mEntityList; + private List mEntityList; private QuestionsDetailEntity mQuestionsDetailEntity; - public QuestionsDetailAdapter(Context context, OnListClickListener listClickListener) { + QuestionsDetailAdapter(Context context, OnListClickListener listClickListener) { super(context); mListClickListener = listClickListener; } @@ -43,9 +46,13 @@ public class QuestionsDetailAdapter extends ListAdapter { notifyDataSetChanged(); } + public String getQuestionsTitle() { + return mQuestionsDetailEntity != null ? mQuestionsDetailEntity.getTitle() : ""; + } + @Override protected void provideListData(List listData) { - mEntityList = (List) listData; + mEntityList = (List) listData; notifyDataSetChanged(); } @@ -76,8 +83,8 @@ public class QuestionsDetailAdapter extends ListAdapter { view = mLayoutInflater.inflate(R.layout.questionsdetail_footer_item, parent, false); return new ReuseViewHolder(view, null, mListClickListener); case ItemViewType.ITEM_BODY: - view = mLayoutInflater.inflate(R.layout.ask_questions_hot_item, parent, false); - return new AskQuestionsHotViewHolder(view, mEntityList, mListClickListener); + view = mLayoutInflater.inflate(R.layout.ask_answer_item, parent, false); + return new AnswerViewHolder(view, mEntityList, mListClickListener); default: return null; } @@ -92,9 +99,8 @@ public class QuestionsDetailAdapter extends ListAdapter { break; case ItemViewType.ITEM_FOOTER: break; - case ItemViewType.ITEM_BODY: //todo 还是把答案Item和问题ITEM分开写吧 虽然都一样 - ((AskQuestionsHotViewHolder) holder).initQuestionsHotViewHolder(mContext, mEntityList.get(position - 1)); - ((AskQuestionsHotViewHolder) holder).mAskTitle.setVisibility(View.GONE); + case ItemViewType.ITEM_BODY: + ((AnswerViewHolder) holder).initAnswerViewHolder(mContext, mEntityList.get(position - ListAdapter.TOP_ITEM_COUNT)); break; } } @@ -121,6 +127,8 @@ public class QuestionsDetailAdapter extends ListAdapter { View view = LayoutInflater.from(mContext).inflate(R.layout.questionsdedit_tag_item, null); TextView tagTv = (TextView) view; tagTv.setText(tag); + tagTv.setBackgroundResource(R.drawable.comment_border_bg); + tagTv.setTextColor(ContextCompat.getColor(mContext, R.color.theme)); FlexboxLayout.LayoutParams params = new FlexboxLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); params.setMargins(0, DisplayUtils.dip2px(mContext, 5), DisplayUtils.dip2px(mContext, 15), @@ -129,6 +137,12 @@ public class QuestionsDetailAdapter extends ListAdapter { holder.mTagRl.addView(view, 0); } + if (mQuestionsDetailEntity.getMe().isQuestionFollowed()) { + holder.mConcern.setText(R.string.concerned); + } else { + holder.mConcern.setText(R.string.concern_questions); + } + holder.mTitle.setText(mQuestionsDetailEntity.getTitle()); holder.mDes.setText(mQuestionsDetailEntity.getDescription()); holder.mAnswercount.setText(mContext.getString(R.string.ask_answer_count, mQuestionsDetailEntity.getAnswers())); @@ -143,10 +157,20 @@ public class QuestionsDetailAdapter extends ListAdapter { if (mEntityList != null) { index += mEntityList.size(); } - if (mQuestionsDetailEntity != null || mEntityList != null) { index++; } return index; } + + void onConcern(boolean isSuccess) { + MeEntity me = mQuestionsDetailEntity.getMe(); + me.setQuestionFollowed(isSuccess); + mQuestionsDetailEntity.setMe(me); + notifyItemChanged(0); + } + + boolean isConcernQuestions() { + return mQuestionsDetailEntity.getMe().isQuestionFollowed(); + } } diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailFragment.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailFragment.java index 584cda191b..4e860b59ec 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsDetailFragment.java @@ -6,13 +6,15 @@ import android.support.annotation.Nullable; import android.view.View; import android.widget.RelativeLayout; +import com.gh.common.util.ConcernUtils; import com.gh.common.util.EntranceUtils; import com.gh.gamecenter.AskQuestionsDetailActivity; import com.gh.gamecenter.NormalActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.ask.AskAnswerDetailFragment; import com.gh.gamecenter.ask.entity.AnswerEntity; -import com.gh.gamecenter.ask.entity.QuestionsEntity; +import com.gh.gamecenter.ask.entity.Questions; +import com.gh.gamecenter.ask.entity.QuestionsDetailEntity; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; import com.gh.gamecenter.baselist.LoadType; @@ -74,6 +76,12 @@ public class QuestionsDetailFragment extends ListFragment { getQuestionsDetail(); } + // 列表数据为空也要正常显示(有列表头) + @Override + public void onLoadEmpty() { + onLoadDone(); + } + @OnClick({R.id.questionsdetail_answer, R.id.questionsdetail_invite}) public void onClick(View v) { switch (v.getId()) { @@ -89,7 +97,7 @@ public class QuestionsDetailFragment extends ListFragment { } @Override - public Observable> provideDataObservable() { + public Observable> provideDataObservable() { return RetrofitManager.getInstance(getContext()).getApi().getQuestionsAnswer(mQuestionsId, false); } @@ -101,18 +109,54 @@ public class QuestionsDetailFragment extends ListFragment { if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) ((AskQuestionsDetailActivity) getActivity()).show(AskQuestionsDetailActivity.QUESTIONS_DETAIL_FOLD); break; - case R.id.ask_item_constraintlayout: - List entityList = (List) data; - QuestionsEntity questionsEntity = entityList.get(position - 1); + case R.id.ask_answer_item_constraintlayout: + List entityList = (List) data; + AnswerEntity entity = entityList.get(position - ListAdapter.TOP_ITEM_COUNT); + Questions questions = entity.getQuestions(); + questions.setTitle(mAdapter.getQuestionsTitle()); + entity.setQuestions(questions); Bundle bundle = new Bundle(); - AnswerEntity value = new AnswerEntity(); - value.setId(questionsEntity.getId()); - bundle.putParcelable(AnswerEntity.TAG, value); + bundle.putParcelable(AnswerEntity.TAG, entity); NormalActivity.startFragment(getContext(), AskAnswerDetailFragment.class, bundle); break; + + case R.id.questionsdetail_item_concern: + + if (!mAdapter.isConcernQuestions()) { + ConcernUtils.INSTANCE.postConcernQuestions(getContext(), mQuestionsId + , new ConcernUtils.onConcernListener() { + @Override + public void onSuccess() { + mAdapter.onConcern(true); + } + + @Override + public void onError() { + + } + }); + } else { + ConcernUtils.INSTANCE.deleteConcernQuestions(getContext(), mQuestionsId + , new ConcernUtils.onConcernListener() { + @Override + public void onSuccess() { + mAdapter.onConcern(false); + } + + @Override + public void onError() { + + } + }); + } + break; } } + public String getQuestionsTitle() { + return mAdapter.getQuestionsTitle(); + } + public void getQuestionsDetail() { RetrofitManager.getInstance(getContext()).getApi() .getQuestionsById(mQuestionsId) diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsInviteAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsInviteAdapter.java index cc1406f301..bcb9792427 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsInviteAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsInviteAdapter.java @@ -10,6 +10,7 @@ import com.gh.common.constant.ItemViewType; import com.gh.gamecenter.R; import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; import com.gh.gamecenter.ask.entity.InviteEntity; +import com.gh.gamecenter.ask.entity.MeEntity; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.LoadStatus; @@ -36,6 +37,7 @@ public class QuestionsInviteAdapter extends ListAdapter { notifyDataSetChanged(); } + // todo 这里逻辑其实都一个的 整理到 ListAdapter @Override protected void loadChange(LoadStatus status) { switch (status) { @@ -72,10 +74,10 @@ public class QuestionsInviteAdapter extends ListAdapter { return new QuestionsInviteTopItemViewHolder(view, null, mListClickListener); case ItemViewType.ITEM_FOOTER: view = mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false); - return new FooterViewHolder(view, mEntityList, mListClickListener); + return new FooterViewHolder(view, null, mListClickListener); case ItemViewType.ITEM_BODY: view = mLayoutInflater.inflate(R.layout.questionsinvite_item, parent, false); - return new QuestionsInviteViewHolder(view, null, mListClickListener); + return new QuestionsInviteViewHolder(view, mEntityList, mListClickListener); default: return null; } @@ -97,6 +99,19 @@ public class QuestionsInviteAdapter extends ListAdapter { @Override public int getItemCount() { - return mEntityList != null ? mEntityList.size() + 2 : 2; + return mEntityList != null ? mEntityList.size() + TOP_ITEM_COUNT + FOOTER_ITEM_COUNT : TOP_ITEM_COUNT + FOOTER_ITEM_COUNT; + } + + public void inviteSucces(String id) { + for (InviteEntity inviteEntity : mEntityList) { + if (id.equals(inviteEntity.getId())) { + MeEntity me = inviteEntity.getMe(); + if (me == null) me = new MeEntity(); + me.setExpertInvited(true); + inviteEntity.setMe(me); + notifyDataSetChanged(); + break; + } + } } } diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsInviteFragment.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsInviteFragment.java index ee04873c38..9b7b1b5924 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsInviteFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsInviteFragment.java @@ -5,14 +5,26 @@ import android.support.annotation.Nullable; import android.view.View; import com.gh.common.util.EntranceUtils; +import com.gh.gamecenter.R; import com.gh.gamecenter.ask.entity.InviteEntity; +import com.gh.gamecenter.ask.entity.MeEntity; import com.gh.gamecenter.baselist.ListAdapter; import com.gh.gamecenter.baselist.ListFragment; +import com.gh.gamecenter.retrofit.Response; import com.gh.gamecenter.retrofit.RetrofitManager; +import org.json.JSONException; +import org.json.JSONObject; + import java.util.List; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import retrofit2.HttpException; import rx.Observable; +import rx.android.schedulers.AndroidSchedulers; +import rx.schedulers.Schedulers; /** * Created by khy on 7/12/17. @@ -39,6 +51,11 @@ public class QuestionsInviteFragment extends ListFragment { super.onCreate(savedInstanceState); } + @Override + public void loadEmpty() { + loadDone(); + } + @Override public Observable> provideDataObservable() { return RetrofitManager.getInstance(getContext()).getApi().getInviteExperts(mQuestionsId, getListOffset()); @@ -51,7 +68,46 @@ public class QuestionsInviteFragment extends ListFragment { @Override public void onListClick(View view, int position, Object data) { - super.onListClick(view, position, data); + switch (view.getId()) { + case R.id.questionsinvite_item_invite: + List mEntityList = (List) data; + InviteEntity inviteEntity = mEntityList.get(position - ListAdapter.TOP_ITEM_COUNT); + MeEntity me = inviteEntity.getMe(); + if (me == null || !me.isExpertInvited()) + postInvite(inviteEntity.getId()); + break; + case R.id.questionsinvite_top_item_invite: + // 第三方邀请(QQ/微信/微博) + break; + } + } + + private void postInvite(String expertId) { + JSONObject object = new JSONObject(); + try { + object.put("expert_id", expertId); + } catch (JSONException e) { + e.printStackTrace(); + } + RequestBody body = RequestBody.create(MediaType.parse("application/json"), object.toString()); + RetrofitManager.getInstance(getContext()).getApi() + .postInvite(body, mQuestionsId) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { + @Override + public void onResponse(ResponseBody response) { + super.onResponse(response); + mAdapter.inviteSucces(expertId); + toast(R.string.invite_success); + } + + @Override + public void onFailure(HttpException e) { + super.onFailure(e); + toast(R.string.invite_failure); + } + }); } } diff --git a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsInviteViewHolder.java b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsInviteViewHolder.java index 94aa86ce9e..efab27fcba 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsInviteViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/ask/questionsdetail/QuestionsInviteViewHolder.java @@ -56,7 +56,7 @@ public class QuestionsInviteViewHolder extends BaseRecyclerViewHolder { mInvite.setBackgroundResource(R.drawable.comment_border_bg); } -// mAnswercount.setText(entity.getAnswerCount()); // todo 提示View找不到 -// mVotecount.setText(entity.getVote()); + mAnswercount.setText(context.getString(R.string.ask_answer_count, entity.getAnswerCount())); + mVotecount.setText(context.getString(R.string.ask_vote_count, entity.getVote())); } } diff --git a/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchAdapter.java b/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchAdapter.java index 8a09cae3c8..e3b29754f2 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchAdapter.java @@ -85,7 +85,7 @@ public class AskSearchAdapter extends ListAdapter { Questions question = searchEntity.getQuestion(); if (question != null) { askHolder.mTitle.setText(Html.fromHtml(question.getTitle())); - askHolder.mAnswercount.setText(mContext.getString(R.string.ask_answer_count, question.getAnswersCount())); + askHolder.mAnswercount.setText(mContext.getString(R.string.ask_answer_count, question.getAnswerCount())); } askHolder.mContent.setText(Html.fromHtml(searchEntity.getBrief())); break; diff --git a/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchFragment.java b/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchFragment.java index d27179a9ad..e6f0fd4ba2 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchFragment.java @@ -3,6 +3,7 @@ package com.gh.gamecenter.ask.search; import android.text.TextUtils; import android.view.View; +import com.gh.gamecenter.AskQuestionsDetailActivity; import com.gh.gamecenter.NormalActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.ask.QuestionsEditFragment; @@ -56,7 +57,8 @@ public class AskSearchFragment extends ListFragment { break; case R.id.ask_search_item: List list = (List) data; - + String id = list.get(position).getQuestion().getId(); + startActivity(AskQuestionsDetailActivity.getIntent(getContext(), id)); break; } diff --git a/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchItemViewHolder.java b/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchItemViewHolder.java index 3d889225ab..fd19607610 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchItemViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/ask/search/AskSearchItemViewHolder.java @@ -24,5 +24,6 @@ public class AskSearchItemViewHolder extends BaseRecyclerViewHolder { public AskSearchItemViewHolder(View itemView, Object data, OnListClickListener listClickListener) { super(itemView, data, listClickListener); + itemView.setOnClickListener(this); } } diff --git a/app/src/main/java/com/gh/gamecenter/baselist/ListAdapter.java b/app/src/main/java/com/gh/gamecenter/baselist/ListAdapter.java index 39001ad837..0a8d712fa1 100644 --- a/app/src/main/java/com/gh/gamecenter/baselist/ListAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/baselist/ListAdapter.java @@ -12,7 +12,8 @@ import java.util.List; public abstract class ListAdapter extends BaseRecyclerAdapter { - protected static final int FOOTER_ITEM_COUNT = 1; + public static final int FOOTER_ITEM_COUNT = 1; + public static final int TOP_ITEM_COUNT = 1; protected boolean mIsOver; diff --git a/app/src/main/java/com/gh/gamecenter/entity/UserInfoEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/UserInfoEntity.kt index 84e7ad0f12..e41f5c2a59 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/UserInfoEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/UserInfoEntity.kt @@ -3,6 +3,7 @@ package com.gh.gamecenter.entity import android.arch.persistence.room.Entity import android.arch.persistence.room.PrimaryKey import android.support.annotation.NonNull +import com.google.gson.annotations.SerializedName /** * Created by khy on 17/07/17. @@ -14,6 +15,9 @@ class UserInfoEntity { @NonNull var id: String? = null + @SerializedName("_id") + var userId: String? = null + var name: String? = null var icon: String? = null diff --git a/app/src/main/java/com/gh/gamecenter/login/AppDatabase.java b/app/src/main/java/com/gh/gamecenter/login/AppDatabase.java index e0264fe345..869a879f13 100644 --- a/app/src/main/java/com/gh/gamecenter/login/AppDatabase.java +++ b/app/src/main/java/com/gh/gamecenter/login/AppDatabase.java @@ -11,7 +11,7 @@ import com.gh.gamecenter.entity.UserInfoEntity; /** * Created by khy on 28/11/17. */ -@Database(entities = {LoginTokenEntity.class, UserInfoEntity.class}, version = 1, exportSchema = false) +@Database(entities = {LoginTokenEntity.class, UserInfoEntity.class}, version = 2, exportSchema = false) public abstract class AppDatabase extends RoomDatabase { public abstract UserInfoDao userInfoDao(); @@ -36,7 +36,12 @@ public abstract class AppDatabase extends RoomDatabase { } private static AppDatabase buildDatabase(Context context) { - return Room.databaseBuilder(context, AppDatabase.class, DATABASE_NAME).allowMainThreadQueries().build(); + return Room.databaseBuilder(context, AppDatabase.class, DATABASE_NAME) + //TODO 不允许主线程查询 + .allowMainThreadQueries() + //TODO 提供db升级的策略而不是强行销毁 + .fallbackToDestructiveMigration() + .build(); } } diff --git a/app/src/main/java/com/gh/gamecenter/manager/UserManager.java b/app/src/main/java/com/gh/gamecenter/manager/UserManager.java index d5d70a1313..70bedee85d 100644 --- a/app/src/main/java/com/gh/gamecenter/manager/UserManager.java +++ b/app/src/main/java/com/gh/gamecenter/manager/UserManager.java @@ -54,6 +54,13 @@ public class UserManager { return null; } + public String getUserId() { + if (mUserInfoEntity != null) { + return mUserInfoEntity.getUserId(); + } + return ""; + } + public void setCommunityId(Context context, String communityId) { if (!mCommunityId.equals(communityId)) { PreferenceManager.getDefaultSharedPreferences(context).edit().putString(COMMUNITY_ID, communityId).apply(); diff --git a/app/src/main/java/com/gh/gamecenter/normal/NormalFragment.java b/app/src/main/java/com/gh/gamecenter/normal/NormalFragment.java index 876351bc9f..cc2ec6b5bb 100644 --- a/app/src/main/java/com/gh/gamecenter/normal/NormalFragment.java +++ b/app/src/main/java/com/gh/gamecenter/normal/NormalFragment.java @@ -27,4 +27,8 @@ public abstract class NormalFragment extends BaseFragment { public void onMenuItemClick(MenuItem menuItem) { } + + public boolean onBackPressed () { + return false; + } } diff --git a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java index 834fd5e2dc..bcd87a7122 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java +++ b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java @@ -25,11 +25,13 @@ import com.gh.gamecenter.InstallActivity; import com.gh.gamecenter.LibaoActivity; import com.gh.gamecenter.LoginActivity; import com.gh.gamecenter.MessageActivity; +import com.gh.gamecenter.NormalActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.ShareGhActivity; import com.gh.gamecenter.SuggestSelectActivity; import com.gh.gamecenter.SuggestionActivity; import com.gh.gamecenter.UserInfoActivity; +import com.gh.gamecenter.ask.myask.MyAskFragment; import com.gh.gamecenter.entity.AppEntity; import com.gh.gamecenter.entity.LoginTokenEntity; import com.gh.gamecenter.entity.MessageUnreadEntity; @@ -108,6 +110,8 @@ public class PersonalFragment extends BaseFragment implements Observer> getAskQuestions(@Path("community_id") String communityId, @Query("type_group") String type, @Query("offset") int offset); + @GET("communities/{community_id}/questions?view=digest") + Observable> getAskQuestions(@Path("community_id") String communityId, @Query("type_group") String type, @Query("offset") int offset); /** * 获取社区首页栏目 @@ -723,7 +725,7 @@ public interface ApiService { * 社区问题的答案列表 */ @GET("questions/{questions_id}/answers?view=digest") - Observable> getQuestionsAnswer(@Path("questions_id") String questionsId, @Query("fold") boolean isFold); + Observable> getQuestionsAnswer(@Path("questions_id") String questionsId, @Query("fold") boolean isFold); /** * 获取社区达人列表 @@ -731,6 +733,12 @@ public interface ApiService { @GET("questions/{questions_id}/experts") Observable> getInviteExperts(@Path("questions_id") String questionsId, @Query("offset") int offset); + /** + * 邀请达人回答社区问题 + */ + @POST("questions/{questions_id}:invite") + Observable postInvite(@Body RequestBody body, @Path("questions_id") String questionsId); + /** * 搜索社区问题 */ @@ -746,12 +754,91 @@ public interface ApiService { /** * 对社区问题进行回答 */ - @POST("/questions/{question_id}/answers") - Observable postQuestionAnswer(@Path("community_id") String questionsId); + @POST("questions/{question_id}/answers") + Observable postQuestionAnswer(@Body RequestBody body, @Path("question_id") String questionsId); + + /** + * 对社区问题进行回答 + */ + @PATCH("answers/{answer_id}") + Observable patchQuestionAnswer(@Body RequestBody body, @Path("answer_id") String answerId); /** * 答案详情 */ - @GET("answers/{answer_id}") + @GET("answers/{answer_id}?view=detail") Observable getAnswerDetail(@Path("answer_id") String answerId); + + /** + * 获取社区问题标签 + */ + @GET("communities/{community_id}/tags") + Observable> getCommunitiesTags(@Path("community_id") String communityId); + + /** + * 添加社区问题 + */ + @POST("communities/{community_id}/questions") + Observable postQuestions(@Body RequestBody body, @Path("community_id") String communityId); + + /** + * 对社区答案点赞 + */ + @POST("answers/{answer_id}:vote") + Observable postAnswerVote(@Path("answer_id") String answerId); + + /** + * 获取用户的问题列表 + */ + @GET("users/{user_id}/questions") + Observable> getMyQuestions(@Path("user_id") String userId, @Query("offset") int offset); + + /** + * 获取用户的答案列表 + */ + @GET("users/{user_id}/answers") + Observable> getMyAnswers(@Path("user_id") String userId, @Query("offset") int offset); + + /** + * 获取用户的草稿列表 + */ + @GET("users/{user_id}/answer_drafts") + Observable> getMyAnswerDrafts(@Path("user_id") String userId, @Query("offset") int offset); + + /** + * 获取用户的关注问题列表 + */ + @GET("questions/concern") + Observable> getConcernQuestions(@Query("offset") int offset); + + /** + * 收藏答案 + */ + @POST("favorite/answers/{answer_id}") + Observable postCollectionAnswer(@Path("answer_id") String answerId); + + /** + * 取消收藏答案 + */ + @DELETE("favorite/answers/{answer_id}") + Observable deleteCollectionAnswer(@Path("answer_id") String answerId); + + /** + * 关注问题 + */ + @POST("questions/{question_id}:follow") + Observable postConcernQuestions(@Path("question_id") String questionsId); + + /** + * 取消关注问题 + */ + @POST("questions/{question_id}:unfollow") + Observable deleteConcernQuestions(@Path("question_id") String questionsId); + + + /** + * 保存用户答案的草稿 + */ + @POST("questions/{question_id}:follow") + Observable postAnswerDrafts(@Body RequestBody body, @Path("question_id") String questionsId); } \ No newline at end of file diff --git a/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java b/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java index b3b9c687ca..3242e7ac0f 100644 --- a/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java +++ b/app/src/main/java/com/halo/assistant/fragment/SettingsFragment.java @@ -318,7 +318,8 @@ public class SettingsFragment extends BaseFragment { .setNegativeButton("确认", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - checkSizeIndex = radioGroup.getCheckedRadioButtonId() % 4; + int checkedRadioButtonId = radioGroup.getCheckedRadioButtonId(); + checkSizeIndex = checkedRadioButtonId % 4; if (checkSizeIndex == 0) { checkSizeIndex = 4; diff --git a/app/src/main/res/drawable-xxhdpi/personal_ask_icon.png b/app/src/main/res/drawable-xxhdpi/personal_ask_icon.png new file mode 100644 index 0000000000..75392c2615 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/personal_ask_icon.png differ diff --git a/app/src/main/res/layout/ask_answer_item.xml b/app/src/main/res/layout/ask_answer_item.xml new file mode 100644 index 0000000000..5d9228bf8a --- /dev/null +++ b/app/src/main/res/layout/ask_answer_item.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/ask_questions_new_item.xml b/app/src/main/res/layout/ask_questions_new_item.xml index b921f585a3..e5a70d796e 100644 --- a/app/src/main/res/layout/ask_questions_new_item.xml +++ b/app/src/main/res/layout/ask_questions_new_item.xml @@ -1,5 +1,6 @@ - + android:layout_height = "match_parent" > - + android:layout_height = "match_parent" + android:layout_marginTop = "8dp" + android:background = "@android:color/white" + android:visibility = "gone" > - - - - - - - - + android:paddingLeft = "20dp" + android:paddingRight = "20dp" + android:paddingBottom="20dp"> - + - + + + + + + + + + + + - + - + - - \ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_myask.xml b/app/src/main/res/layout/fragment_myask.xml new file mode 100644 index 0000000000..5edb365cb1 --- /dev/null +++ b/app/src/main/res/layout/fragment_myask.xml @@ -0,0 +1,5 @@ + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_personal.xml b/app/src/main/res/layout/fragment_personal.xml index bbfc578be2..69be4a1f01 100644 --- a/app/src/main/res/layout/fragment_personal.xml +++ b/app/src/main/res/layout/fragment_personal.xml @@ -245,6 +245,37 @@ + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_questions_edit.xml b/app/src/main/res/layout/fragment_questions_edit.xml index a0ca5b60b2..1576e50e58 100644 --- a/app/src/main/res/layout/fragment_questions_edit.xml +++ b/app/src/main/res/layout/fragment_questions_edit.xml @@ -96,6 +96,7 @@ android:lineSpacingMultiplier = "1.2" android:minLines = "2" android:padding = "20dp" + android:maxLength="30" android:textColorHint = "@color/content" android:textCursorDrawable = "@drawable/cursor_color" android:textSize = "13sp" /> diff --git a/app/src/main/res/layout/fragment_wrapper_myask.xml b/app/src/main/res/layout/fragment_wrapper_myask.xml new file mode 100644 index 0000000000..2900eeacef --- /dev/null +++ b/app/src/main/res/layout/fragment_wrapper_myask.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/questionsinvite_item.xml b/app/src/main/res/layout/questionsinvite_item.xml index 878a044bc6..5da1dc0b72 100644 --- a/app/src/main/res/layout/questionsinvite_item.xml +++ b/app/src/main/res/layout/questionsinvite_item.xml @@ -37,7 +37,6 @@ app:layout_constraintLeft_toRightOf = "@id/questionsinvite_item_icon" app:layout_constraintTop_toBottomOf = "@id/questionsinvite_item_name" > - 点我提问 查看折叠答案 没有我的游戏?点击提交 - - %1$d 回答 - %1$d 赞同 + + %1$d 回答 + %1$d 赞同 已投 投票 礼包中心 @@ -475,5 +475,12 @@ 收藏 关注 操作说明 + 答案详情 + 邀请成功 + 邀请失败 + + 我的问答 + 我的问答 + 已关注 diff --git a/dependencies.gradle b/dependencies.gradle index 973972ba85..0f02e55968 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -7,8 +7,8 @@ ext { targetSdkVersion = 22 // application info - versionCode = 21 - versionName = "3.0" + versionCode = 22 + versionName = "3.1" applicationId = "com.gh.gamecenter" //Libraries diff --git a/gradle.properties b/gradle.properties index b4b00ceb11..af70defd7f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -21,7 +21,7 @@ org.gradle.parallel=true channel_file=channel.txt # tinker patch version_name -PATCH_VERSION_NAME=3.0.2 +PATCH_VERSION_NAME=3.1 # Third-party keys DEBUG_UMENG_APPKEY=58e5b0b9c62dca35a00005e6 diff --git a/libraries/LGLibrary b/libraries/LGLibrary index c20470d8f7..85db236c8d 160000 --- a/libraries/LGLibrary +++ b/libraries/LGLibrary @@ -1 +1 @@ -Subproject commit c20470d8f7e25b90b361e3165babdd7ebab14277 +Subproject commit 85db236c8da55cf56f141adbddee4ff67efe362c