From 3cd248a2c5bc0994a2e7fb0fa484bb39287d9d35 Mon Sep 17 00:00:00 2001 From: chenjuntao Date: Sun, 5 May 2019 17:53:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90=E6=88=91?= =?UTF-8?q?=E7=9A=84=E5=85=89=E7=8E=AF=E5=A2=9E=E5=8A=A0=E6=B5=8F=E8=A7=88?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E9=9C=80=E6=B1=82=20https://gitlab.ghzhushou?= =?UTF-8?q?.com/pm/halo-app-issues/issues/500#note=5F20735?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/history/HistoryDatabase.kt | 26 +++- .../com/gh/common/history/HistoryHelper.kt | 40 +++++- .../com/gh/common/util/DownloadItemUtils.java | 7 + .../com/gh/gamecenter/NewsDetailActivity.java | 5 + .../collection/ArticleFragment.java | 40 ++++-- .../collection/ArticleViewModel.java | 14 +- .../collection/CollectionWrapperFragment.java | 4 +- .../collection/CommunityArticleFragment.kt | 30 +++-- .../collection/CommunityArticleViewModel.kt | 13 +- .../com/gh/gamecenter/entity/ColorEntity.kt | 2 +- .../com/gh/gamecenter/entity/GameEntity.kt | 60 ++++++++- .../gh/gamecenter/entity/GameUpdateEntity.kt | 2 +- .../com/gh/gamecenter/entity/NewsEntity.kt | 8 +- .../com/gh/gamecenter/game/GameViewModel.kt | 2 +- .../gamedetail/GameDetailFragment.java | 1 + .../gamedetail/GameDetailViewModel.kt | 4 + .../history/HistoryGameListAdapter.kt | 123 ++++++++++++++++++ .../history/HistoryGameListFragment.kt | 102 +++++++++++++++ .../history/HistoryGameListViewModel.kt | 24 ++++ .../history/HistoryWrapperFragment.kt | 28 ++-- .../article/detail/ArticleDetailActivity.kt | 3 + .../qa/entity/ArticleDetailEntity.kt | 5 +- .../gh/gamecenter/qa/entity/ArticleEntity.kt | 41 +++--- .../room/converter/CommunityConverter.kt | 18 +++ .../room/converter/CountConverter.kt | 18 +++ .../converter/StringArrayListConverter.kt | 20 +++ .../room/converter/TagStyleListConverter.kt | 21 +++ .../room/converter/ThumbnailConverter.kt | 18 +++ .../room/converter/TimeConverter.kt | 18 +++ ...istoryAnswerDao.kt => AnswerHistoryDao.kt} | 2 +- .../gamecenter/room/dao/ArticleHistoryDao.kt | 19 +++ .../com/gh/gamecenter/room/dao/GameDao.kt | 19 +++ .../gh/gamecenter/room/dao/NewsHistoryDao.kt | 19 +++ 33 files changed, 679 insertions(+), 77 deletions(-) create mode 100644 app/src/main/java/com/gh/gamecenter/history/HistoryGameListAdapter.kt create mode 100644 app/src/main/java/com/gh/gamecenter/history/HistoryGameListFragment.kt create mode 100644 app/src/main/java/com/gh/gamecenter/history/HistoryGameListViewModel.kt create mode 100644 app/src/main/java/com/gh/gamecenter/room/converter/CommunityConverter.kt create mode 100644 app/src/main/java/com/gh/gamecenter/room/converter/CountConverter.kt create mode 100644 app/src/main/java/com/gh/gamecenter/room/converter/StringArrayListConverter.kt create mode 100644 app/src/main/java/com/gh/gamecenter/room/converter/TagStyleListConverter.kt create mode 100644 app/src/main/java/com/gh/gamecenter/room/converter/ThumbnailConverter.kt create mode 100644 app/src/main/java/com/gh/gamecenter/room/converter/TimeConverter.kt rename app/src/main/java/com/gh/gamecenter/room/dao/{HistoryAnswerDao.kt => AnswerHistoryDao.kt} (95%) create mode 100644 app/src/main/java/com/gh/gamecenter/room/dao/ArticleHistoryDao.kt create mode 100644 app/src/main/java/com/gh/gamecenter/room/dao/GameDao.kt create mode 100644 app/src/main/java/com/gh/gamecenter/room/dao/NewsHistoryDao.kt diff --git a/app/src/main/java/com/gh/common/history/HistoryDatabase.kt b/app/src/main/java/com/gh/common/history/HistoryDatabase.kt index cc478dfeea..901478b7c1 100644 --- a/app/src/main/java/com/gh/common/history/HistoryDatabase.kt +++ b/app/src/main/java/com/gh/common/history/HistoryDatabase.kt @@ -3,14 +3,34 @@ package com.gh.common.history import android.arch.persistence.room.Database import android.arch.persistence.room.Room import android.arch.persistence.room.RoomDatabase +import android.arch.persistence.room.TypeConverters +import com.gh.gamecenter.entity.GameEntity +import com.gh.gamecenter.entity.NewsEntity import com.gh.gamecenter.qa.entity.AnswerEntity -import com.gh.gamecenter.room.dao.HistoryAnswerDao +import com.gh.gamecenter.qa.entity.ArticleEntity +import com.gh.gamecenter.room.converter.* +import com.gh.gamecenter.room.dao.AnswerHistoryDao +import com.gh.gamecenter.room.dao.ArticleHistoryDao +import com.gh.gamecenter.room.dao.GameDao +import com.gh.gamecenter.room.dao.NewsHistoryDao import com.halo.assistant.HaloApp -@Database(entities = [AnswerEntity::class], version = 1, exportSchema = false) +@Database(entities = [AnswerEntity::class, ArticleEntity::class, NewsEntity::class, GameEntity::class], version = 1, exportSchema = false) +@TypeConverters(*[ + CountConverter::class, + CommunityConverter::class, + TimeConverter::class, + AnswerUserConverter::class, + ThumbnailConverter::class, + TagStyleListConverter::class, + StringArrayListConverter::class]) + abstract class HistoryDatabase : RoomDatabase() { - abstract fun answerDao(): HistoryAnswerDao + abstract fun answerDao(): AnswerHistoryDao + abstract fun articleDao(): ArticleHistoryDao + abstract fun newsDao(): NewsHistoryDao + abstract fun gameDao(): GameDao companion object { val instance by lazy { diff --git a/app/src/main/java/com/gh/common/history/HistoryHelper.kt b/app/src/main/java/com/gh/common/history/HistoryHelper.kt index 54f8e93cb2..b8ad353ec4 100644 --- a/app/src/main/java/com/gh/common/history/HistoryHelper.kt +++ b/app/src/main/java/com/gh/common/history/HistoryHelper.kt @@ -2,17 +2,52 @@ package com.gh.common.history import android.text.Html import com.gh.common.runOnIoThread +import com.gh.gamecenter.entity.GameEntity +import com.gh.gamecenter.entity.NewsEntity import com.gh.gamecenter.qa.entity.AnswerDetailEntity import com.gh.gamecenter.qa.entity.AnswerEntity +import com.gh.gamecenter.qa.entity.ArticleDetailEntity +import com.gh.gamecenter.qa.entity.ArticleEntity object HistoryHelper { fun insertAnswerEntity(answerDetailEntity: AnswerDetailEntity) { - val answerEntity = convertAnswerDetailEntityToAnswerEntity(answerDetailEntity) + val answerEntity = convertAnswerDetailToAnswer(answerDetailEntity) runOnIoThread { HistoryDatabase.instance.answerDao().addAnswer(answerEntity) } } - private fun convertAnswerDetailEntityToAnswerEntity(answerDetailEntity: AnswerDetailEntity): AnswerEntity { + fun insertArticleEntity(articleDetailEntity: ArticleDetailEntity) { + val articleEntity = convertArticleDetailToArticle(articleDetailEntity) + runOnIoThread { HistoryDatabase.instance.articleDao().addArticle(articleEntity) } + } + + fun insertGameEntity(gameEntity: GameEntity) { + gameEntity.orderTag = System.currentTimeMillis() + runOnIoThread { HistoryDatabase.instance.gameDao().addGame(gameEntity) } + } + + @JvmStatic + fun insertNewsEntity(newsEntity: NewsEntity) { + newsEntity.orderTag = System.currentTimeMillis() + runOnIoThread { HistoryDatabase.instance.newsDao().addNews(newsEntity) } + } + + private fun convertArticleDetailToArticle(articleDetailEntity: ArticleDetailEntity): ArticleEntity { + val articleEntity = ArticleEntity() + + articleEntity.id = articleDetailEntity.id + articleEntity.brief = Html.fromHtml(articleDetailEntity.content).toString() + articleEntity.count = articleDetailEntity.count + articleEntity.community = articleDetailEntity.community + articleEntity.time = articleDetailEntity.time + articleEntity.title = articleDetailEntity.title + articleEntity.user = articleDetailEntity.user + articleEntity.orderTag = System.currentTimeMillis() + + return articleEntity + } + + private fun convertAnswerDetailToAnswer(answerDetailEntity: AnswerDetailEntity): AnswerEntity { val answerEntity = AnswerEntity() answerEntity.id = answerDetailEntity.id @@ -24,6 +59,7 @@ object HistoryHelper { answerEntity.orderTag = System.currentTimeMillis() answerEntity.brief = Html.fromHtml(answerDetailEntity.content).toString() answerEntity.time = answerDetailEntity.time + return answerEntity } diff --git a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java index 5a28b407e9..ee3046e0e7 100644 --- a/app/src/main/java/com/gh/common/util/DownloadItemUtils.java +++ b/app/src/main/java/com/gh/common/util/DownloadItemUtils.java @@ -96,6 +96,13 @@ public class DownloadItemUtils { } } + // 下载按钮显示为查看,并且不提供下载功能 + public static void updateItemWithViewOnlyStyle(GameViewHolder holder) { + holder.gameDownloadBtn.setVisibility(View.VISIBLE); + holder.gameDownloadBtn.setText("查看"); + holder.gameDownloadBtn.setClickable(false); + } + public static void updateItem(Context context, GameEntity gameEntity, GameViewHolder holder, boolean isShowPlatform) { updateItem(context, gameEntity, holder, isShowPlatform, PluginLocation.only_game); diff --git a/app/src/main/java/com/gh/gamecenter/NewsDetailActivity.java b/app/src/main/java/com/gh/gamecenter/NewsDetailActivity.java index 38cf4ed727..15f6267993 100644 --- a/app/src/main/java/com/gh/gamecenter/NewsDetailActivity.java +++ b/app/src/main/java/com/gh/gamecenter/NewsDetailActivity.java @@ -24,6 +24,7 @@ import android.widget.TextView; import com.gh.base.BaseActivity; import com.gh.base.OnRequestCallBackListener; +import com.gh.common.history.HistoryHelper; import com.gh.common.util.ApkActiveUtils; import com.gh.common.util.CheckLoginUtils; import com.gh.common.util.ClickUtils; @@ -258,6 +259,8 @@ public class NewsDetailActivity extends BaseActivity implements OnClickListener, if (mNewsEntity.getType() != null) { setNavigationTitle(mNewsEntity.getType()); } + + HistoryHelper.insertNewsEntity(mNewsEntity); adapter.setId(mNewsEntity.getId()); adapter.setType(mNewsEntity.getType()); adapter.setTitle(mNewsEntity.getTitle()); @@ -487,6 +490,8 @@ public class NewsDetailActivity extends BaseActivity implements OnClickListener, mNewsShare.setVisible(true); + HistoryHelper.insertNewsEntity(mNewsEntity); + DataUtils.onMtaEvent(NewsDetailActivity.this, "详情页面", "文章详情", response.getTitle()); } diff --git a/app/src/main/java/com/gh/gamecenter/collection/ArticleFragment.java b/app/src/main/java/com/gh/gamecenter/collection/ArticleFragment.java index 67c6dcb32b..749a46a920 100644 --- a/app/src/main/java/com/gh/gamecenter/collection/ArticleFragment.java +++ b/app/src/main/java/com/gh/gamecenter/collection/ArticleFragment.java @@ -22,8 +22,22 @@ import org.greenrobot.eventbus.ThreadMode; public class ArticleFragment extends ListFragment { + private Type mType; private ArticleAdapter mAdapter; + public static ArticleFragment getInstance(Type type) { + ArticleFragment fragment = new ArticleFragment(); + fragment.mType = type; + return fragment; + } + + @Override + protected ArticleViewModel provideListViewModel() { + ArticleViewModel viewModel = super.provideListViewModel(); + viewModel.type = mType; + return viewModel; + } + @Override protected ListAdapter provideListAdapter() { return mAdapter == null ? mAdapter = new ArticleAdapter(getContext(), this) : mAdapter; @@ -37,20 +51,24 @@ public class ArticleFragment extends ListFragment } } - @Override public void onListClick(View view, int position, Object data) { NewsEntity newsEntity = (NewsEntity) data; - if (!newsEntity.getActive()) { - showDeleteDialog(newsEntity.getId()); - return; + + if (mType == Type.COLLECTION) { + if (!newsEntity.getActive()) { + showDeleteDialog(newsEntity.getId()); + return; + } + + DataCollectionUtils.uploadClick(getContext(), "列表", "收藏-文章", newsEntity.getTitle()); + NewsDetailActivity.startNewsDetailByCollection(getContext(), newsEntity, "(收藏:文章)"); + } else { + DataCollectionUtils.uploadClick(getContext(), "列表", "浏览记录-文章", newsEntity.getTitle()); + NewsDetailActivity.startNewsDetailByCollection(getContext(), newsEntity, "(浏览记录:文章)"); } - DataCollectionUtils.uploadClick(getContext(), "列表", "收藏-文章", newsEntity.getTitle()); - - //统计阅读量 mAdapter.statNewsViews(newsEntity, position); - NewsDetailActivity.startNewsDetailByCollection(getContext(), newsEntity, "(收藏:文章)"); } private void showDeleteDialog(String articleId) { @@ -71,4 +89,10 @@ public class ArticleFragment extends ListFragment } }), null); } + + public enum Type { + COLLECTION, + + HISTORY + } } diff --git a/app/src/main/java/com/gh/gamecenter/collection/ArticleViewModel.java b/app/src/main/java/com/gh/gamecenter/collection/ArticleViewModel.java index c338c9306d..3b712ad52f 100644 --- a/app/src/main/java/com/gh/gamecenter/collection/ArticleViewModel.java +++ b/app/src/main/java/com/gh/gamecenter/collection/ArticleViewModel.java @@ -4,6 +4,7 @@ import android.app.Application; import android.arch.lifecycle.LiveData; import android.support.annotation.NonNull; +import com.gh.common.history.HistoryDatabase; import com.gh.gamecenter.baselist.ListViewModel; import com.gh.gamecenter.entity.NewsEntity; import com.gh.gamecenter.entity.ViewsEntity; @@ -14,6 +15,7 @@ import com.gh.gamecenter.retrofit.RetrofitManager; import java.util.List; import io.reactivex.Observable; +import io.reactivex.Single; /** * Created by khy on 30/03/18. @@ -21,6 +23,7 @@ import io.reactivex.Observable; public class ArticleViewModel extends ListViewModel { + public ArticleFragment.Type type; NewsViewsRepository mNewsViewsRepository = new NewsViewsRepository<>(); @@ -66,8 +69,17 @@ public class ArticleViewModel extends ListViewModel { } + @Override + public Single> provideDataSingle(int page) { + if (type == ArticleFragment.Type.COLLECTION) { + return Single.fromObservable(RetrofitManager.getInstance(getApplication()).getApi().getCollectionArticle(UserManager.getInstance().getUserId(), page)); + } else { + return HistoryDatabase.Companion.getInstance().newsDao().getNewsWithOffset(20, (page - 1) * 20); + } + } + @Override public Observable> provideDataObservable(int page) { - return RetrofitManager.getInstance(getApplication()).getApi().getCollectionArticle(UserManager.getInstance().getUserId(), page); + return null; } } diff --git a/app/src/main/java/com/gh/gamecenter/collection/CollectionWrapperFragment.java b/app/src/main/java/com/gh/gamecenter/collection/CollectionWrapperFragment.java index e22204be45..6104cf1cf2 100644 --- a/app/src/main/java/com/gh/gamecenter/collection/CollectionWrapperFragment.java +++ b/app/src/main/java/com/gh/gamecenter/collection/CollectionWrapperFragment.java @@ -38,9 +38,9 @@ public class CollectionWrapperFragment extends BaseFragment_TabLayout { @Override protected void initFragmentList(List fragments) { fragments.add(AnswerFragment.getInstance(AnswerFragment.Type.COLLECTION)); - fragments.add(new CommunityArticleFragment()); + fragments.add(CommunityArticleFragment.getInstance(CommunityArticleFragment.Type.COLLECTION)); fragments.add(new ToolsFragment()); - fragments.add(new ArticleFragment()); + fragments.add(ArticleFragment.getInstance(ArticleFragment.Type.COLLECTION)); for (Fragment fragment : mFragmentsList) { fragment.setArguments(getArguments()); } diff --git a/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleFragment.kt b/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleFragment.kt index f657161c5a..af018558be 100644 --- a/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleFragment.kt @@ -5,16 +5,14 @@ import com.gh.common.util.CollectionUtils import com.gh.gamecenter.baselist.ListFragment import com.gh.gamecenter.baselist.LoadType import com.gh.gamecenter.eventbus.EBCollectionChanged -import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.qa.entity.ArticleEntity -import com.gh.gamecenter.retrofit.RetrofitManager -import io.reactivex.Observable import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode class CommunityArticleFragment : ListFragment() { - var mAdapter: CommunityArticleAdapter? = null + private var mType = Type.COLLECTION + private var mAdapter: CommunityArticleAdapter? = null override fun provideListAdapter(): CommunityArticleAdapter { if (mAdapter == null) { @@ -24,18 +22,30 @@ class CommunityArticleFragment : ListFragment> { - return RetrofitManager.getInstance(context).api.getCollectionCommunityArticle(UserManager.getInstance().userId, page) + return ViewModelProviders.of(this).get(CommunityArticleViewModel::class.java).apply { type = mType } } // 收藏事件 @Subscribe(threadMode = ThreadMode.MAIN) fun onEventMainThread(changed: EBCollectionChanged) { - if (changed.collectionType == CollectionUtils.CollectionType.communityArticle) { + if (changed.collectionType == CollectionUtils.CollectionType.communityArticle + && mType == Type.COLLECTION) { mListViewModel.load(LoadType.REFRESH) } } + + companion object { + @JvmStatic + fun getInstance(type: Type): CommunityArticleFragment { + val fragment = CommunityArticleFragment() + fragment.mType = type + return fragment + } + } + + enum class Type { + COLLECTION, + + HISTORY + } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleViewModel.kt b/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleViewModel.kt index 16a65189dc..2149913f7e 100644 --- a/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/collection/CommunityArticleViewModel.kt @@ -2,6 +2,7 @@ package com.gh.gamecenter.collection import android.app.Application import anet.channel.util.Utils.context +import com.gh.common.history.HistoryDatabase import com.gh.gamecenter.R import com.gh.gamecenter.baselist.ListViewModel import com.gh.gamecenter.manager.UserManager @@ -10,6 +11,7 @@ import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager import com.lightgame.utils.Utils import io.reactivex.Observable +import io.reactivex.Single import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import okhttp3.ResponseBody @@ -18,9 +20,18 @@ import retrofit2.HttpException class CommunityArticleViewModel(application: Application) : ListViewModel(application) { + var type: CommunityArticleFragment.Type = CommunityArticleFragment.Type.COLLECTION override fun provideDataObservable(page: Int): Observable>? { - return RetrofitManager.getInstance(context).api.getCollectionCommunityArticle(UserManager.getInstance().userId, page) + return null + } + + override fun provideDataSingle(page: Int): Single> { + return if (type == CommunityArticleFragment.Type.COLLECTION) { + Single.fromObservable(RetrofitManager.getInstance(context).api.getCollectionCommunityArticle(UserManager.getInstance().userId, page)) + } else { + HistoryDatabase.instance.articleDao().getArticleWithOffset(20, (page - 1) * 20) + } } override fun mergeResultLiveData() { diff --git a/app/src/main/java/com/gh/gamecenter/entity/ColorEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/ColorEntity.kt index 277d9e3b5e..e27186f341 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/ColorEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/ColorEntity.kt @@ -4,4 +4,4 @@ import android.os.Parcelable import kotlinx.android.parcel.Parcelize @Parcelize -data class ColorEntity(var color: String, var value: String): Parcelable \ No newline at end of file +data class ColorEntity(var color: String = "", var value: String = ""): Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt index 787d311a81..363628f2d5 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/GameEntity.kt @@ -1,5 +1,8 @@ package com.gh.gamecenter.entity +import android.arch.persistence.room.Entity +import android.arch.persistence.room.Ignore +import android.arch.persistence.room.PrimaryKey import android.os.Parcelable import android.support.v4.util.ArrayMap import com.gh.common.constant.Config @@ -10,87 +13,136 @@ import kotlinx.android.parcel.IgnoredOnParcel import kotlinx.android.parcel.Parcelize @Parcelize +@Entity data class GameEntity( @SerializedName("_id") - var id: String? = null, + @PrimaryKey + var id: String = "", var icon: String? = null, var name: String? = null, var brief: String? = null, + private var tag: ArrayList? = null, + + @Ignore private var apk: ArrayList? = null, + + @Ignore @SerializedName("apk_normal") private var apkNormal: ArrayList? = null, + + @Ignore @SerializedName("apk_search") var apkSearch: ArrayList? = null, + + @Ignore @SerializedName("apk_index") var apkIndex: ArrayList? = null, + + @Ignore var collection: ArrayList = ArrayList(), var slide: String? = null, + + @Ignore var test: TestEntity? = null, + @SerializedName("d_button_add_word") var downloadAddWord: String? = null, + var image: String? = null, var type: String? = null, + + @Ignore var isPluggable: Boolean = false, + var link: String? = null, + + @Ignore @SerializedName("apk_link") var apkLink: ArrayList? = null, + @SerializedName("concern_article_exists") var isNewsExists: Boolean = true, + @SerializedName("download_off_text") var downloadOffText: String? = null, + @SerializedName("libao_exists") var isLibaoExists: Boolean = false, + @SerializedName("server_remark") var serverRemark: String? = null, + @SerializedName("server_type") var serverType: String? = null, + + @Ignore @SerializedName("server_label") var serverLabel: ColorEntity? = null, + + @Ignore @SerializedName("server") var serverEntity: KaiFuCalendarEntity? = null, + @SerializedName("server_genre") var serverGenre: String? = null, + var kaifuTimeHint: Long? = null, + + @Ignore var subjectData: GameSubjectData? = null, + @SerializedName("tag_style") - var tagStyle: List = ArrayList(), + var tagStyle: ArrayList = ArrayList(), + + var orderTag: Long = 0, var des: String? = null, // 用来标记在专题中的序号,仅用于曝光记录 var sequence: Int? = -1, // 用来标记平台名称,仅用于曝光记录 var platform: String? = "", + // 用来标记下载的类型,仅用于曝光记录 @SerializedName("download_type") var downloadType: String? = "", + // 用来标记下载完成的类型,仅用于曝光记录 @SerializedName("download_complete_type") var downloadCompleteType: String? = "", + // 用于开服表标记是否为置顶项目 @SerializedName("is_fixed_top") var fixedTop: Boolean? = false, var fixedTopHint: Boolean? = false, + + @Ignore @SerializedName("download_notice") val downloadAd: LinkEntity? = null, + // 社区名字,用于首页替换游戏曝光时使用 var subjectName: String? = null, // 关联应用,供首页替换游戏确定该游戏是否应该被替换使用 + + @Ignore @SerializedName("relation_game_ids") var relatedGameIds: ArrayList? = arrayListOf(), + @SerializedName("is_related") var isRelated: Boolean = false) : Parcelable { + @Ignore @IgnoredOnParcel private var entryMap: ArrayMap? = ArrayMap() + @Ignore @IgnoredOnParcel var gameLocation: GameLocation? = null - constructor(id: String?) : this() { + constructor(id: String) : this() { this.id = id } - constructor(id: String?, name: String?) : this() { + constructor(id: String, name: String?) : this() { this.id = id this.name = name } diff --git a/app/src/main/java/com/gh/gamecenter/entity/GameUpdateEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/GameUpdateEntity.kt index b508de33e6..9894a161a7 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/GameUpdateEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/GameUpdateEntity.kt @@ -32,7 +32,7 @@ data class GameUpdateEntity( fun transformGameEntity(): GameEntity { val gameEntity = GameEntity() - gameEntity.id = id + gameEntity.id = id ?: "" gameEntity.name = name gameEntity.icon = icon gameEntity.setTag(tag) diff --git a/app/src/main/java/com/gh/gamecenter/entity/NewsEntity.kt b/app/src/main/java/com/gh/gamecenter/entity/NewsEntity.kt index a7fd42f36f..d5f3642d25 100644 --- a/app/src/main/java/com/gh/gamecenter/entity/NewsEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/entity/NewsEntity.kt @@ -1,14 +1,18 @@ package com.gh.gamecenter.entity +import android.arch.persistence.room.Entity +import android.arch.persistence.room.PrimaryKey import android.os.Parcel import android.os.Parcelable import com.google.gson.annotations.SerializedName import java.util.* +@Entity class NewsEntity : Parcelable, Cloneable { + @PrimaryKey @SerializedName(value = "_id", alternate = arrayOf("article_id")) - var id: String? = null + var id: String = "" var type: String? = null @@ -36,6 +40,8 @@ class NewsEntity : Parcelable, Cloneable { var active: Boolean = true + var orderTag: Long = 0 + override fun clone(): Any { return super.clone() } diff --git a/app/src/main/java/com/gh/gamecenter/game/GameViewModel.kt b/app/src/main/java/com/gh/gamecenter/game/GameViewModel.kt index 639630b939..d83ac6baa0 100644 --- a/app/src/main/java/com/gh/gamecenter/game/GameViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/game/GameViewModel.kt @@ -384,7 +384,7 @@ class GameViewModel(application: Application, var blockData: SubjectRecommendEnt if (!data[0].image.isNullOrEmpty()) { val itemDataImage = GameItemData() val gameEntity = data[0] - if (gameEntity.id.isNullOrEmpty()) gameEntity.id = gameEntity.link + if (gameEntity.id.isNullOrEmpty()) gameEntity.id = gameEntity.link ?: "" itemDataImage.image = gameEntity itemDataImage.image?.subjectData = GameSubjectData(name = subjectEntity.name, isOrder = false) mItemDataListCache.add(itemDataImage) diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.java b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.java index 7cadd41813..da44d4d786 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.java +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailFragment.java @@ -291,6 +291,7 @@ public class GameDetailFragment extends NormalFragment { mViewModel.getGameLiveData().observe(this, gameResource -> { if (gameResource == null) return; if (gameResource.status == Status.SUCCESS) { + mViewModel.logHistory(gameResource.data); mGameEntity = gameResource.data; setNavigationTitle(mGameEntity != null ? mGameEntity.getName() : ""); } else if (gameResource.status == Status.ERROR) { diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt index c70538d561..ec7a51be73 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/GameDetailViewModel.kt @@ -5,6 +5,7 @@ import android.arch.lifecycle.AndroidViewModel import android.arch.lifecycle.MutableLiveData import android.arch.lifecycle.ViewModel import android.arch.lifecycle.ViewModelProvider +import com.gh.common.history.HistoryHelper import com.gh.common.util.ApkActiveUtils import com.gh.common.util.ConcernUtils import com.gh.common.util.DataUtils @@ -112,6 +113,9 @@ class GameDetailViewModel(application: Application, } } + fun logHistory(data: GameEntity) { + HistoryHelper.insertGameEntity(data) + } class Factory(private val mApplication: Application, private val gameId: String?, diff --git a/app/src/main/java/com/gh/gamecenter/history/HistoryGameListAdapter.kt b/app/src/main/java/com/gh/gamecenter/history/HistoryGameListAdapter.kt new file mode 100644 index 0000000000..b803bf7945 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/history/HistoryGameListAdapter.kt @@ -0,0 +1,123 @@ +package com.gh.gamecenter.history + +import android.content.Context +import android.support.v7.widget.RecyclerView +import android.view.View +import android.view.ViewGroup +import com.gh.common.constant.ItemViewType +import com.gh.common.util.DownloadItemUtils +import com.gh.common.util.StringUtils +import com.gh.gamecenter.GameDetailActivity +import com.gh.gamecenter.R +import com.gh.gamecenter.adapter.viewholder.FooterViewHolder +import com.gh.gamecenter.adapter.viewholder.GameViewHolder +import com.gh.gamecenter.baselist.ListAdapter +import com.gh.gamecenter.baselist.LoadType +import com.gh.gamecenter.databinding.GameItemBinding +import com.gh.gamecenter.entity.GameEntity +import com.gh.gamecenter.eventbus.EBDownloadStatus +import com.gh.gamecenter.game.GameItemViewHolder +import com.lightgame.download.DownloadEntity +import java.util.* + +class HistoryGameListAdapter(context: Context, private val mViewModel: HistoryGameListViewModel) + : ListAdapter(context) { + + private val positionAndPackageMap = HashMap() + + override fun setListData(updateData: MutableList?) { + // 记录游戏位置 + if (updateData != null) { + for (i in 0 until updateData.size) { + var packages = "" + for (apkEntity in updateData[i].getApk()) { + packages += apkEntity.packageName + } + positionAndPackageMap[packages + i] = i + } + } + super.setListData(updateData) + } + + override fun areItemsTheSame(oldItem: GameEntity?, newItem: GameEntity?): Boolean { + return oldItem?.id == newItem?.id + } + + override fun getItemViewType(position: Int): Int { + if (position == itemCount - 1) { + return ItemViewType.ITEM_FOOTER + } + return ItemViewType.GAME_NORMAL + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + return when (viewType) { + ItemViewType.GAME_NORMAL -> { + GameItemViewHolder(GameItemBinding.bind(mLayoutInflater.inflate(R.layout.game_item, parent, false))) + } + else -> { + FooterViewHolder(mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false)) + } + } + } + + override fun getItemCount(): Int { + return if (mEntityList == null || mEntityList.isEmpty()) return 0 else mEntityList.size + 1 + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when (holder) { + is GameItemViewHolder -> { + val gameEntity = mEntityList[position] + + holder.binding.game = gameEntity + holder.initServerType(gameEntity) + holder.binding.executePendingBindings() + + holder.binding.gameOrder.visibility = View.GONE + + holder.itemView.setOnClickListener { + GameDetailActivity.startGameDetailActivity(mContext, gameEntity.id, "(浏览记录:游戏)") + } + DownloadItemUtils.setOnClickListener(mContext, holder.binding.downloadBtn, + gameEntity, position, this, + "(浏览记录:游戏)", + StringUtils.buildString("浏览记录", ":", gameEntity.name)) + DownloadItemUtils.updateItemWithViewOnlyStyle(GameViewHolder(holder.binding)) + } + is FooterViewHolder -> { + holder.initItemPadding() + holder.initFooterViewHolder(mIsLoading, mIsNetworkError, mIsOver, R.string.ask_loadover_hint) + holder.itemView.setOnClickListener { + if (mIsNetworkError) { + mViewModel.load(LoadType.RETRY) + } + } + } + } + } + + fun notifyItemByDownload(download: DownloadEntity) { + for (key in positionAndPackageMap.keys) { + if (key.contains(download.packageName)) { + val position = positionAndPackageMap[key] + if (position != null && mEntityList != null && position < mEntityList.size) { + mEntityList[position].getEntryMap()[download.platform] = download + notifyItemChanged(position) + } + } + } + } + + fun notifyItemAndRemoveDownload(status: EBDownloadStatus) { + for (key in positionAndPackageMap.keys) { + if (key.contains(status.packageName)) { + val position = positionAndPackageMap[key] + if (position != null && mEntityList != null && position < mEntityList.size) { + mEntityList[position].getEntryMap().remove(status.platform) + notifyItemChanged(position) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/history/HistoryGameListFragment.kt b/app/src/main/java/com/gh/gamecenter/history/HistoryGameListFragment.kt new file mode 100644 index 0000000000..fd60d505c8 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/history/HistoryGameListFragment.kt @@ -0,0 +1,102 @@ +package com.gh.gamecenter.history + +import android.os.Bundle +import android.view.View +import com.ethanhua.skeleton.Skeleton +import com.ethanhua.skeleton.ViewSkeletonScreen +import com.gh.common.util.viewModelProvider +import com.gh.download.DownloadManager +import com.gh.gamecenter.R +import com.gh.gamecenter.baselist.ListFragment +import com.gh.gamecenter.entity.GameEntity +import com.gh.gamecenter.eventbus.EBDownloadStatus +import com.gh.gamecenter.eventbus.EBPackage +import com.lightgame.download.DataWatcher +import com.lightgame.download.DownloadEntity +import kotterknife.bindView +import org.greenrobot.eventbus.Subscribe +import org.greenrobot.eventbus.ThreadMode + +open class HistoryGameListFragment : ListFragment() { + + private val mListSkeleton by bindView(R.id.list_skeleton) + + private lateinit var mSkeleton: ViewSkeletonScreen + + private var mAdapter: HistoryGameListAdapter? = null + + private val dataWatcher = object : DataWatcher() { + override fun onDataChanged(downloadEntity: DownloadEntity) { + mAdapter?.notifyItemByDownload(downloadEntity) + } + } + + override fun getLayoutId(): Int { + return R.layout.fragment_list_base_skeleton + } + + override fun provideListAdapter(): HistoryGameListAdapter { + if (mAdapter == null) { + mAdapter = HistoryGameListAdapter(requireContext(), mListViewModel) + } + return mAdapter as HistoryGameListAdapter + } + + override fun provideListViewModel(): HistoryGameListViewModel { + return viewModelProvider() + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + mSkeleton = Skeleton.bind(mListSkeleton).shimmer(false).load(R.layout.fragment_subject_skeleton).show() + } + + override fun onResume() { + if (isEverPause && mAdapter != null) mAdapter?.notifyDataSetChanged() + super.onResume() + DownloadManager.getInstance(context).addObserver(dataWatcher) + } + + override fun onPause() { + super.onPause() + DownloadManager.getInstance(context).removeObserver(dataWatcher) + } + + override fun onLoadDone() { + super.onLoadDone() + mSkeleton.hide() + } + + override fun onLoadEmpty() { + super.onLoadEmpty() + mSkeleton.hide() + } + + override fun onLoadError() { + super.onLoadError() + mSkeleton.hide() + } + + override fun onRefresh() { + mSkeleton.show() + super.onRefresh() + } + + // 下载被删除事件 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEventMainThread(status: EBDownloadStatus) { + if ("delete" == status.status) { + mAdapter?.notifyItemAndRemoveDownload(status) + } + } + + // 安装/卸载 事件 + @Subscribe(threadMode = ThreadMode.MAIN) + fun onEventMainThread(busFour: EBPackage) { + if ("安装" == busFour.type || "卸载" == busFour.type) { + mAdapter?.notifyDataSetChanged() + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/history/HistoryGameListViewModel.kt b/app/src/main/java/com/gh/gamecenter/history/HistoryGameListViewModel.kt new file mode 100644 index 0000000000..15a6f1c43b --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/history/HistoryGameListViewModel.kt @@ -0,0 +1,24 @@ +package com.gh.gamecenter.history + +import android.app.Application +import com.gh.common.history.HistoryDatabase +import com.gh.gamecenter.baselist.ListViewModel +import com.gh.gamecenter.entity.GameEntity +import io.reactivex.Observable +import io.reactivex.Single + +class HistoryGameListViewModel(application: Application) : ListViewModel(application) { + + override fun provideDataObservable(page: Int): Observable>? { + return null + } + + override fun provideDataSingle(page: Int): Single> { + return HistoryDatabase.instance.gameDao().getGamesWithOffset(20, (page - 1) * 20) + } + + override fun mergeResultLiveData() { + mResultLiveData.addSource(mListLiveData) { mResultLiveData.postValue(it) } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/history/HistoryWrapperFragment.kt b/app/src/main/java/com/gh/gamecenter/history/HistoryWrapperFragment.kt index 05153a9382..f37321f6f7 100644 --- a/app/src/main/java/com/gh/gamecenter/history/HistoryWrapperFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/history/HistoryWrapperFragment.kt @@ -4,30 +4,24 @@ import android.os.Bundle import android.support.v4.app.Fragment import com.gh.base.fragment.BaseFragment_TabLayout import com.gh.gamecenter.R -import com.gh.gamecenter.collection.* +import com.gh.gamecenter.collection.AnswerFragment +import com.gh.gamecenter.collection.ArticleFragment +import com.gh.gamecenter.collection.CommunityArticleFragment -class HistoryWrapperFragment: BaseFragment_TabLayout() { - - fun newInstance(checkedIndex: Int): CollectionWrapperFragment { - val fragment = CollectionWrapperFragment() - val args = Bundle(1) - args.putInt(BaseFragment_TabLayout.PAGE_INDEX, checkedIndex) - fragment.arguments = args - return fragment - } +class HistoryWrapperFragment : BaseFragment_TabLayout() { override fun initTabTitleList(tabTitleList: MutableList) { tabTitleList.add(getString(R.string.answer)) tabTitleList.add(getString(R.string.collection_article)) tabTitleList.add(getString(R.string.collection_info)) - tabTitleList.add(getString(R.string.collection_toolkit)) + tabTitleList.add(getString(R.string.main_game)) } override fun initFragmentList(fragments: MutableList) { fragments.add(AnswerFragment.getInstance(AnswerFragment.Type.HISTORY)) - fragments.add(CommunityArticleFragment()) - fragments.add(ArticleFragment()) - fragments.add(ToolsFragment()) + fragments.add(CommunityArticleFragment.getInstance(CommunityArticleFragment.Type.HISTORY)) + fragments.add(ArticleFragment.getInstance(ArticleFragment.Type.HISTORY)) + fragments.add(HistoryGameListFragment()) for (fragment in mFragmentsList) { fragment.arguments = arguments } @@ -38,10 +32,4 @@ class HistoryWrapperFragment: BaseFragment_TabLayout() { setNavigationTitle("浏览记录") } - companion object { - const val INDEX_ANSWER = 0 - const val INDEX_ARTICLE = 1 - const val INDEX_NEWS = 2 - const val INDEX_GAME = 3 - } } \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailActivity.kt b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailActivity.kt index efa81c68a1..95f0a6d32c 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/article/detail/ArticleDetailActivity.kt @@ -28,6 +28,7 @@ import com.facebook.fresco.animation.drawable.BaseAnimationListener import com.gh.base.BaseActivity import com.gh.common.TimeElapsedHelper import com.gh.common.TimeoutCallback +import com.gh.common.history.HistoryHelper import com.gh.common.util.* import com.gh.common.view.RichEditor import com.gh.gamecenter.* @@ -705,6 +706,8 @@ class ArticleDetailActivity : BaseActivity() { override fun onDestroy() { super.onDestroy() if (mViewModel.detailEntity != null) { + HistoryHelper.insertArticleEntity(mViewModel.detailEntity!!) + MtaHelper.onEventWithTime( "文章阅读量_社区加位置", mElapsedHelper?.elapsedTime!!, diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDetailEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDetailEntity.kt index c46c5bf840..ac36f5100a 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDetailEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleDetailEntity.kt @@ -16,11 +16,8 @@ data class ArticleDetailEntity(@SerializedName("_id") val count: Count = Count(), var user: UserEntity = UserEntity(), var me: MeEntity = MeEntity(), - val time: ArticleDetailTime = ArticleDetailTime(), + val time: TimeEntity = TimeEntity(), var community: CommunityEntity = CommunityEntity(), var commentable: Boolean? = true) : Parcelable -@Parcelize -data class ArticleDetailTime(var create: Long = 0, var edit: Long = 0) : Parcelable - diff --git a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt index 808b42cc07..9a578412c4 100644 --- a/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt +++ b/app/src/main/java/com/gh/gamecenter/qa/entity/ArticleEntity.kt @@ -1,31 +1,38 @@ package com.gh.gamecenter.qa.entity +import android.arch.persistence.room.Entity +import android.arch.persistence.room.Ignore +import android.arch.persistence.room.PrimaryKey import android.os.Parcelable import com.gh.gamecenter.entity.CommunityEntity import com.gh.gamecenter.entity.UserEntity import com.google.gson.annotations.SerializedName import kotlinx.android.parcel.Parcelize +@Entity @Parcelize -data class ArticleEntity(@SerializedName("_id") - val id: String = "", - val title: String = "", - val brief: String = "", - val active: Boolean = true, - val images: List = ArrayList(), - val count: Count = Count(), - val community: CommunityEntity = CommunityEntity(), - val time: TimeEntity? = TimeEntity(), - val user: UserEntity = UserEntity()) : Parcelable { - - @Parcelize - data class TimeEntity(var create: Long? = 0, - var update: Long? = 0, - var edit: Long? = 0) : Parcelable -} +data class ArticleEntity( + @PrimaryKey + @SerializedName("_id") + var id: String = "", + var title: String = "", + var brief: String = "", + var active: Boolean = true, + var orderTag: Long = 0, + @Ignore + var images: List = ArrayList(), + var count: Count = Count(), + var community: CommunityEntity = CommunityEntity(), + var time: TimeEntity? = TimeEntity(), + var user: UserEntity = UserEntity()) : Parcelable @Parcelize data class Count( var comment: Int = -1, var vote: Int = -1, - val answer: Int = -1) : Parcelable \ No newline at end of file + var answer: Int = -1) : Parcelable + +@Parcelize +data class TimeEntity(var create: Long = 0, + var update: Long = 0, + var edit: Long = 0) : Parcelable \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/room/converter/CommunityConverter.kt b/app/src/main/java/com/gh/gamecenter/room/converter/CommunityConverter.kt new file mode 100644 index 0000000000..a419aaf8d7 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/room/converter/CommunityConverter.kt @@ -0,0 +1,18 @@ +package com.gh.gamecenter.room.converter + +import android.arch.persistence.room.TypeConverter +import com.gh.common.util.toJson +import com.gh.common.util.toObject +import com.gh.gamecenter.entity.CommunityEntity + +class CommunityConverter { + @TypeConverter + fun toCommunityString(data: CommunityEntity?): String { + return data?.toJson() ?: "" + } + + @TypeConverter + fun toCommunityEntity(token: String?): CommunityEntity { + return token?.toObject() ?: CommunityEntity() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/room/converter/CountConverter.kt b/app/src/main/java/com/gh/gamecenter/room/converter/CountConverter.kt new file mode 100644 index 0000000000..ff8c3b6d78 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/room/converter/CountConverter.kt @@ -0,0 +1,18 @@ +package com.gh.gamecenter.room.converter + +import android.arch.persistence.room.TypeConverter +import com.gh.common.util.toJson +import com.gh.common.util.toObject +import com.gh.gamecenter.qa.entity.Count + +class CountConverter { + @TypeConverter + fun toCountString(data: Count?): String { + return data?.toJson() ?: "" + } + + @TypeConverter + fun toCountEntity(token: String?): Count { + return token?.toObject() ?: Count() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/room/converter/StringArrayListConverter.kt b/app/src/main/java/com/gh/gamecenter/room/converter/StringArrayListConverter.kt new file mode 100644 index 0000000000..772971d4dd --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/room/converter/StringArrayListConverter.kt @@ -0,0 +1,20 @@ +package com.gh.gamecenter.room.converter + +import android.arch.persistence.room.TypeConverter +import com.gh.common.util.toJson +import com.gh.common.util.toObject + +class StringArrayListConverter { + + @TypeConverter + fun listToJson(dataList: ArrayList?): String { + return dataList?.toJson() ?: "" + } + + @TypeConverter + fun jsonToList(value: String?): ArrayList { + val apkArray = value?.toObject() ?: arrayOf() + return ArrayList(apkArray.toList()) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/room/converter/TagStyleListConverter.kt b/app/src/main/java/com/gh/gamecenter/room/converter/TagStyleListConverter.kt new file mode 100644 index 0000000000..7dfade774a --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/room/converter/TagStyleListConverter.kt @@ -0,0 +1,21 @@ +package com.gh.gamecenter.room.converter + +import android.arch.persistence.room.TypeConverter +import com.gh.common.util.toJson +import com.gh.common.util.toObject +import com.gh.gamecenter.entity.TagStyleEntity + +class TagStyleListConverter { + + @TypeConverter + fun listToJson(dataList: ArrayList?): String { + return dataList?.toJson() ?: "" + } + + @TypeConverter + fun jsonToList(value: String?): ArrayList { + val apkArray = value?.toObject() ?: arrayOf() + return ArrayList(apkArray.toList()) + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/room/converter/ThumbnailConverter.kt b/app/src/main/java/com/gh/gamecenter/room/converter/ThumbnailConverter.kt new file mode 100644 index 0000000000..fa8723d3a7 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/room/converter/ThumbnailConverter.kt @@ -0,0 +1,18 @@ +package com.gh.gamecenter.room.converter + +import android.arch.persistence.room.TypeConverter +import com.gh.common.util.toJson +import com.gh.common.util.toObject +import com.gh.gamecenter.entity.ThumbnailEntity + +class ThumbnailConverter { + @TypeConverter + fun toThumbnailString(data: ThumbnailEntity?): String { + return data?.toJson() ?: "" + } + + @TypeConverter + fun toThumbnailEntity(token: String?): ThumbnailEntity { + return token?.toObject() ?: ThumbnailEntity() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/room/converter/TimeConverter.kt b/app/src/main/java/com/gh/gamecenter/room/converter/TimeConverter.kt new file mode 100644 index 0000000000..e36fac1f8f --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/room/converter/TimeConverter.kt @@ -0,0 +1,18 @@ +package com.gh.gamecenter.room.converter + +import android.arch.persistence.room.TypeConverter +import com.gh.common.util.toJson +import com.gh.common.util.toObject +import com.gh.gamecenter.qa.entity.TimeEntity + +class TimeConverter { + @TypeConverter + fun toTimeString(data: TimeEntity?): String { + return data?.toJson() ?: "" + } + + @TypeConverter + fun toTimeEntity(token: String?): TimeEntity { + return token?.toObject() ?: TimeEntity() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/gh/gamecenter/room/dao/HistoryAnswerDao.kt b/app/src/main/java/com/gh/gamecenter/room/dao/AnswerHistoryDao.kt similarity index 95% rename from app/src/main/java/com/gh/gamecenter/room/dao/HistoryAnswerDao.kt rename to app/src/main/java/com/gh/gamecenter/room/dao/AnswerHistoryDao.kt index 7e8dcb98bc..434754d7dc 100644 --- a/app/src/main/java/com/gh/gamecenter/room/dao/HistoryAnswerDao.kt +++ b/app/src/main/java/com/gh/gamecenter/room/dao/AnswerHistoryDao.kt @@ -8,7 +8,7 @@ import com.gh.gamecenter.qa.entity.AnswerEntity import io.reactivex.Single @Dao -interface HistoryAnswerDao { +interface AnswerHistoryDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun addAnswer(answer: AnswerEntity) diff --git a/app/src/main/java/com/gh/gamecenter/room/dao/ArticleHistoryDao.kt b/app/src/main/java/com/gh/gamecenter/room/dao/ArticleHistoryDao.kt new file mode 100644 index 0000000000..ab1cf515a6 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/room/dao/ArticleHistoryDao.kt @@ -0,0 +1,19 @@ +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 com.gh.gamecenter.qa.entity.ArticleEntity +import io.reactivex.Single + +@Dao +interface ArticleHistoryDao { + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun addArticle(answer: ArticleEntity) + + @Query("select * from ArticleEntity order by orderTag desc limit :pageSize offset :offset ") + fun getArticleWithOffset(pageSize: Int, offset: Int): Single> + +} diff --git a/app/src/main/java/com/gh/gamecenter/room/dao/GameDao.kt b/app/src/main/java/com/gh/gamecenter/room/dao/GameDao.kt new file mode 100644 index 0000000000..be3cea3427 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/room/dao/GameDao.kt @@ -0,0 +1,19 @@ +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 com.gh.gamecenter.entity.GameEntity +import io.reactivex.Single + +@Dao +interface GameDao { + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun addGame(game: GameEntity) + + @Query("select * from GameEntity order by orderTag desc limit :pageSize offset :offset ") + fun getGamesWithOffset(pageSize: Int, offset: Int): Single> + +} diff --git a/app/src/main/java/com/gh/gamecenter/room/dao/NewsHistoryDao.kt b/app/src/main/java/com/gh/gamecenter/room/dao/NewsHistoryDao.kt new file mode 100644 index 0000000000..418195f2c7 --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/room/dao/NewsHistoryDao.kt @@ -0,0 +1,19 @@ +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 com.gh.gamecenter.entity.NewsEntity +import io.reactivex.Single + +@Dao +interface NewsHistoryDao { + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun addNews(answer: NewsEntity) + + @Query("select * from NewsEntity order by orderTag desc limit :pageSize offset :offset ") + fun getNewsWithOffset(pageSize: Int, offset: Int): Single> + +}