diff --git a/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsRecommendsFragment.java b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsRecommendsFragment.java index eb444f3cfb..9be99e56ff 100644 --- a/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsRecommendsFragment.java +++ b/app/src/main/java/com/gh/gamecenter/ask/AskQuestionsRecommendsFragment.java @@ -19,11 +19,17 @@ import com.gh.gamecenter.ask.entity.Questions; import com.gh.gamecenter.baselist.ListFragment; import com.gh.gamecenter.baselist.LoadStatus; import com.gh.gamecenter.baselist.LoadType; +import com.gh.gamecenter.eventbus.EBReuse; + +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; import butterknife.BindView; import butterknife.OnClick; import static com.gh.gamecenter.ask.AskFragment.COMMUNITIES_SELECT_REQUEST; +import static com.gh.gamecenter.personal.PersonalFragment.LOGIN_TAG; +import static com.gh.gamecenter.personal.PersonalFragment.LOGOUT_TAG; /** * Created by khy on 2/12/17. @@ -42,7 +48,7 @@ public class AskQuestionsRecommendsFragment extends ListFragment> mSubjectLiveData = new MediatorLiveData<>(); private MutableLiveData mLoadStatusLiveData = new MutableLiveData<>(); + private AnswerDao mAnswerDao; + public AskQuestionsRecommendsViewModel(@NonNull Application application) { super(application); - loadAskSubjectColumn(); + mAnswerDao = AppDatabase.getInstance(application).answerDao(); } void loadAskSubjectColumn() { @@ -57,58 +63,86 @@ public class AskQuestionsRecommendsViewModel extends ListViewModel response) { super.onResponse(response); mSubjectLiveData.postValue(response); - loadData(false, null); } @Override public void onFailure(HttpException e) { super.onFailure(e); mSubjectLiveData.postValue(null); - loadData(false, null); } }); } void loadData(boolean isUp, String sequenceId) { - Observable> askHot; + String filter; String communityId = UserManager.getInstance().getCommunityId(getApplication()); if (TextUtils.isEmpty(sequenceId)) { - askHot = RetrofitManager.getInstance(getApplication()).getApi().getAskRecommends(communityId, ""); + filter = ""; } else if (isUp) { - askHot = RetrofitManager.getInstance(getApplication()).getApi().getAskRecommends(communityId, - UrlFilterUtils.getFilterQuery("action", "up", "sequence_id", sequenceId)); + filter = UrlFilterUtils.getFilterQuery("action", "up", "sequence_id", sequenceId); } else { - askHot = RetrofitManager.getInstance(getApplication()).getApi().getAskRecommends(communityId, - UrlFilterUtils.getFilterQuery("action", "down", "sequence_id", sequenceId)); + filter = UrlFilterUtils.getFilterQuery("action", "down", "sequence_id", sequenceId); } - askHot - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Response>() { + RetrofitManager.getInstance(getApplication()) + .getApi().getAskRecommends(communityId, filter) + .enqueue(new Callback>() { @Override - public void onResponse(List response) { - loadStatusControl(response.size(), sequenceId, isUp); -// if (response.size() == 0) return; // 不需要添加 页面由LoadStatus控制刷新 - - List previousData = mLiveData.getValue(); - if (previousData == null || TextUtils.isEmpty(sequenceId)) { - previousData = new ArrayList<>(); + public void onResponse(Call> call, retrofit2.Response> response) { + if (TextUtils.isEmpty(response.headers().get("Feed-Clean"))) { + deleteDB(); } - if (isUp) { - previousData.addAll(0, response); + if (response.code() == 200) { + List body = response.body(); + loadStatusControl(body.size(), sequenceId, isUp); + + if ((TextUtils.isEmpty(sequenceId) || isUp) && body.size() > 0) { + insertDB(body); + } + List previousData = mLiveData.getValue(); + if (previousData == null || TextUtils.isEmpty(sequenceId)) { + previousData = new ArrayList<>(); + } + + if (isUp) { + previousData.addAll(0, body); + } else { + previousData.addAll(body); + } + mLiveData.postValue(previousData); } else { - previousData.addAll(response); + loadStatusControl(-1, sequenceId, isUp); } - mLiveData.postValue(previousData); + } @Override - public void onFailure(HttpException e) { + public void onFailure(Call> call, Throwable t) { loadStatusControl(-1, sequenceId, isUp); } }); + + } + + private void deleteDB() { + mAnswerDao.deleteData(UserManager.getInstance().getCommunityId(getApplication()) + UserManager.getInstance().getUserId()); + } + + private void insertDB(List entityList) { + String communityId = UserManager.getInstance().getCommunityId(getApplication()); + String userId = UserManager.getInstance().getUserId(); + long orderTag = System.currentTimeMillis(); + if (!TextUtils.isEmpty(communityId)) { + for (AnswerEntity answerEntity : entityList) { + answerEntity.setAnswerKey(answerEntity.getId() + userId); + answerEntity.setCommunityId(communityId + userId); + answerEntity.setOrderTag(orderTag); + } + if (mAnswerDao.updateAnswerEntity(entityList) <= 0) { + mAnswerDao.addAnswerEntity(entityList); + } + } } private void loadStatusControl(int size, String sequenceId, boolean isUp) { @@ -143,6 +177,15 @@ public class AskQuestionsRecommendsViewModel extends ListViewModel dbData = mAnswerDao.getAnswerEntityById(communityId + UserManager.getInstance().getUserId()); + if (dbData != null && dbData.size() > 0) { + mLiveData.postValue(dbData); + mLoadStatusLiveData.postValue(LoadStatus.INIT_LOADED); + loadData(true, dbData.get(0).getSequenceId()); + } else { + loadData(false, null); + } } } 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 8197a47cbb..5b8862916c 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 @@ -1,15 +1,31 @@ package com.gh.gamecenter.ask.entity +import android.arch.persistence.room.Entity +import android.arch.persistence.room.PrimaryKey +import android.arch.persistence.room.TypeConverters import android.os.Parcel import android.os.Parcelable +import android.support.annotation.NonNull import com.gh.gamecenter.entity.UserEntity +import com.gh.gamecenter.room.converter.AnswerUserConverter +import com.gh.gamecenter.room.converter.ListStringConverter +import com.gh.gamecenter.room.converter.QuestionsConverter import com.google.gson.annotations.SerializedName /** * Created by khy on 12/12/17. */ +@Entity class AnswerEntity() : Parcelable { + @NonNull + @PrimaryKey + var answerKey: String = "" // db key + + var communityId: String? = null + + var orderTag: Long = 0 + @SerializedName("_id") var id: String? = null @@ -18,12 +34,15 @@ class AnswerEntity() : Parcelable { var brief: String? = null + @TypeConverters(ListStringConverter::class) var images: List = ArrayList() var vote: Int = 0 + @TypeConverters(AnswerUserConverter::class) var user: UserEntity = UserEntity() + @TypeConverters(QuestionsConverter::class) @SerializedName("question") var questions: Questions = Questions() @@ -31,6 +50,9 @@ class AnswerEntity() : Parcelable { var communityName: String? = null constructor(parcel: Parcel) : this() { + answerKey = parcel.readString() + communityId = parcel.readString() + orderTag = parcel.readLong() id = parcel.readString() brief = parcel.readString() questions = parcel.readParcelable(Questions::class.java.classLoader) @@ -41,6 +63,9 @@ class AnswerEntity() : Parcelable { } override fun writeToParcel(parcel: Parcel, flags: Int) { + parcel.writeString(answerKey) + parcel.writeString(communityId) + parcel.writeLong(orderTag) parcel.writeString(id) parcel.writeString(brief) parcel.writeParcelable(questions, flags) diff --git a/app/src/main/java/com/gh/gamecenter/entity/SignEntity.java b/app/src/main/java/com/gh/gamecenter/entity/SignEntity.java index 8e87b750f4..baa6c47fbe 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/SignEntity.java +++ b/app/src/main/java/com/gh/gamecenter/entity/SignEntity.java @@ -5,7 +5,7 @@ import android.arch.persistence.room.PrimaryKey; import android.arch.persistence.room.TypeConverters; import android.support.annotation.NonNull; -import com.gh.gamecenter.room.SignDataConverter; +import com.gh.gamecenter.room.converter.SignDataConverter; import com.google.gson.annotations.SerializedName; /** 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 a36dc08cec..66c5ad571b 100644 --- a/app/src/main/java/com/gh/gamecenter/login/AppDatabase.java +++ b/app/src/main/java/com/gh/gamecenter/login/AppDatabase.java @@ -5,17 +5,21 @@ import android.arch.persistence.room.Room; import android.arch.persistence.room.RoomDatabase; import android.content.Context; +import com.gh.gamecenter.ask.entity.AnswerEntity; import com.gh.gamecenter.entity.LoginTokenEntity; import com.gh.gamecenter.entity.SignEntity; import com.gh.gamecenter.entity.UserInfoEntity; -import com.gh.gamecenter.room.SignDao; +import com.gh.gamecenter.room.dao.AnswerDao; +import com.gh.gamecenter.room.dao.SignDao; /** * Created by khy on 28/11/17. */ -@Database(entities = {LoginTokenEntity.class, UserInfoEntity.class, SignEntity.class}, version = 3, exportSchema = false) +@Database(entities = {LoginTokenEntity.class, UserInfoEntity.class, SignEntity.class, AnswerEntity.class}, version = 4, exportSchema = false) public abstract class AppDatabase extends RoomDatabase { + public abstract AnswerDao answerDao(); + public abstract SignDao signDao(); public abstract UserInfoDao userInfoDao(); 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 618a474b86..8c3883f23a 100644 --- a/app/src/main/java/com/gh/gamecenter/manager/UserManager.java +++ b/app/src/main/java/com/gh/gamecenter/manager/UserManager.java @@ -58,10 +58,11 @@ public class UserManager { } public String getUserId() { + String userId = null; if (mUserInfoEntity != null) { - return mUserInfoEntity.getUserId(); + userId = mUserInfoEntity.getUserId(); } - return ""; + return userId == null ? "" : userId; } public void setCommunityId(Context context, String communityId, String communityName) { diff --git a/app/src/main/java/com/gh/gamecenter/message/MessageUnreadViewModel.java b/app/src/main/java/com/gh/gamecenter/message/MessageUnreadViewModel.java index fb3694becf..fb8aa28499 100644 --- a/app/src/main/java/com/gh/gamecenter/message/MessageUnreadViewModel.java +++ b/app/src/main/java/com/gh/gamecenter/message/MessageUnreadViewModel.java @@ -39,6 +39,10 @@ public class MessageUnreadViewModel extends AndroidViewModel { mRepository.loadMessageUnreadData(); } + public void clean() { + liveData.postValue(null); + } + public void markRead(ReadType readType) { MessageUnreadEntity cacheUnreadData = mRepository.getCacheUnreadData(); if (cacheUnreadData == null) return; 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 596537afd0..3b145be840 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java +++ b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java @@ -440,9 +440,9 @@ public class PersonalFragment extends BaseFragment implements Observer postPackage(@Path("user_id") String user_id, @Path("package_name") String package_name); + Observable postPackage(@Path("user_id") String user_id, @Path("package_name") String package_name); // todo /** * 删除已安装游戏 */ @DELETE("users/{user_id}/packages/{package_name}") - Observable deletePackage(@Path("user_id") String user_id, @Path("package_name") String package_name); + Observable deletePackage(@Path("user_id") String user_id, @Path("package_name") String package_name); // todo /** * 整体更新设备已安装游戏 @@ -660,11 +661,12 @@ public interface ApiService { @POST("communities") Observable postCommunities(@Body RequestBody body); + /** * 获取社区首页精选 */ @GET("communities/{community_id}/recommends") - Observable> getAskRecommends(@Path("community_id") String communityId, @Query("filter") String filter); + Call> getAskRecommends(@Path("community_id") String communityId, @Query("filter") String filter); /** * 获取社区首页-问题列表 diff --git a/app/src/main/java/com/gh/gamecenter/room/converter/AnswerUserConverter.java b/app/src/main/java/com/gh/gamecenter/room/converter/AnswerUserConverter.java new file mode 100644 index 0000000000..a16f16fb36 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/room/converter/AnswerUserConverter.java @@ -0,0 +1,22 @@ +package com.gh.gamecenter.room.converter; + +import android.arch.persistence.room.TypeConverter; + +import com.gh.gamecenter.entity.UserEntity; +import com.google.gson.Gson; + +/** + * Created by khy on 18/04/18. + */ + +public class AnswerUserConverter { + @TypeConverter + public static String toUserEntityString(UserEntity data) { + return new Gson().toJson(data); + } + + @TypeConverter + public static UserEntity toUserEntity(String token) { + return new Gson().fromJson(token, UserEntity.class); + } +} diff --git a/app/src/main/java/com/gh/gamecenter/room/converter/ListStringConverter.java b/app/src/main/java/com/gh/gamecenter/room/converter/ListStringConverter.java new file mode 100644 index 0000000000..2450f7a289 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/room/converter/ListStringConverter.java @@ -0,0 +1,24 @@ +package com.gh.gamecenter.room.converter; + +import android.arch.persistence.room.TypeConverter; + +import com.google.gson.Gson; + +import java.util.ArrayList; +import java.util.List; + +/** + * Created by khy on 18/04/18. + */ + +public class ListStringConverter { + @TypeConverter + public static String toListString(List data) { + return new Gson().toJson(data); + } + + @TypeConverter + public static List toList(String token) { + return new Gson().fromJson(token, ArrayList.class); + } +} diff --git a/app/src/main/java/com/gh/gamecenter/room/converter/QuestionsConverter.java b/app/src/main/java/com/gh/gamecenter/room/converter/QuestionsConverter.java new file mode 100644 index 0000000000..dca44e1e82 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/room/converter/QuestionsConverter.java @@ -0,0 +1,22 @@ +package com.gh.gamecenter.room.converter; + +import android.arch.persistence.room.TypeConverter; + +import com.gh.gamecenter.ask.entity.Questions; +import com.google.gson.Gson; + +/** + * Created by khy on 18/04/18. + */ + +public class QuestionsConverter { + @TypeConverter + public static String toQuestionsString(Questions data) { + return new Gson().toJson(data); + } + + @TypeConverter + public static Questions toQuestions(String token) { + return new Gson().fromJson(token, Questions.class); + } +} diff --git a/app/src/main/java/com/gh/gamecenter/room/SignDataConverter.java b/app/src/main/java/com/gh/gamecenter/room/converter/SignDataConverter.java similarity index 92% rename from app/src/main/java/com/gh/gamecenter/room/SignDataConverter.java rename to app/src/main/java/com/gh/gamecenter/room/converter/SignDataConverter.java index 744d9dafa6..082bc8651d 100644 --- a/app/src/main/java/com/gh/gamecenter/room/SignDataConverter.java +++ b/app/src/main/java/com/gh/gamecenter/room/converter/SignDataConverter.java @@ -1,4 +1,4 @@ -package com.gh.gamecenter.room; +package com.gh.gamecenter.room.converter; import android.arch.persistence.room.TypeConverter; diff --git a/app/src/main/java/com/gh/gamecenter/room/dao/AnswerDao.java b/app/src/main/java/com/gh/gamecenter/room/dao/AnswerDao.java new file mode 100644 index 0000000000..657679770b --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/room/dao/AnswerDao.java @@ -0,0 +1,30 @@ +package com.gh.gamecenter.room.dao; + +import android.arch.persistence.room.Dao; +import android.arch.persistence.room.Insert; +import android.arch.persistence.room.OnConflictStrategy; +import android.arch.persistence.room.Query; +import android.arch.persistence.room.Update; + +import com.gh.gamecenter.ask.entity.AnswerEntity; + +import java.util.List; + +/** + * Created by khy on 18/04/18. + */ +@Dao +public interface AnswerDao { + + @Query("select * from AnswerEntity where communityId = :communityId order by orderTag DESC") + List getAnswerEntityById(String communityId); + + @Insert(onConflict = OnConflictStrategy.REPLACE) + void addAnswerEntity(List signEntity); + + @Update(onConflict = OnConflictStrategy.REPLACE) + int updateAnswerEntity(List signEntity); + + @Query("delete from AnswerEntity where communityId = :communityId") + void deleteData(String communityId); +} diff --git a/app/src/main/java/com/gh/gamecenter/room/SignDao.java b/app/src/main/java/com/gh/gamecenter/room/dao/SignDao.java similarity index 94% rename from app/src/main/java/com/gh/gamecenter/room/SignDao.java rename to app/src/main/java/com/gh/gamecenter/room/dao/SignDao.java index b345fdc6d2..876c86c1cb 100644 --- a/app/src/main/java/com/gh/gamecenter/room/SignDao.java +++ b/app/src/main/java/com/gh/gamecenter/room/dao/SignDao.java @@ -1,4 +1,4 @@ -package com.gh.gamecenter.room; +package com.gh.gamecenter.room.dao; import android.arch.persistence.room.Dao; import android.arch.persistence.room.Insert;