/
DemoRepository.java
110 lines (95 loc) · 3.17 KB
/
DemoRepository.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
package me.li2.android.architecture.data.repository;
import android.arch.lifecycle.LiveData;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
import java.util.List;
import javax.inject.Inject;
import javax.inject.Singleton;
import architecture_components.utils.ApiResponse;
import architecture_components.utils.NetworkBoundResource;
import architecture_components.utils.Resource;
import me.li2.android.architecture.data.model.Article;
import me.li2.android.architecture.data.source.local.ArticleDao;
import me.li2.android.architecture.data.source.remote.DemoWebService;
import me.li2.android.architecture.utils.AppExecutors;
import me.li2.android.architecture.utils.RateLimiter;
/**
* Handles data operations in this Demo App
*
* Created by weiyi on 16/02/2018.
* https://github.com/li2
*/
@Singleton
public class DemoRepository {
private static final String LOG_TAG = DemoRepository.class.getSimpleName();
@Inject
ArticleDao mArticleDao;
@Inject
DemoWebService mDemoWebService;
@Inject
AppExecutors mExecutors;
@Inject
Context mContext;
@Inject
RateLimiter<String> repoListRateLimit;
@Inject
public DemoRepository(){
}
/**
*
* @return
*/
public LiveData<Resource<List<Article>>> loadArticleList() {
return new NetworkBoundResource<List<Article>, List<Article>>(mExecutors) {
/**
* Called to save the result of the API response into the database
*
* @param articles
*/
@Override
protected void saveCallResult(@NonNull List<Article> articles) {
// Insert new article data into the database
mArticleDao.bulkInsert(articles.toArray(new Article[articles.size()]));
Log.d(LOG_TAG, "new values inserted");
}
/**
* Called with the data in the database to decide whether it should be fetched from the network.
*
* @param data
* @return
*/
@Override
protected boolean shouldFetch(@Nullable List<Article> data) {
return data == null || data.isEmpty() || repoListRateLimit.shouldFetch(LOG_TAG);
}
/**
* Called to get the cached data from the database
*
* @return
*/
@NonNull
@Override
protected LiveData<List<Article>> loadFromDb() {
return mArticleDao.getArticleList();
}
/**
* Called to create the web service API call.
*
*/
@NonNull
@Override
protected LiveData<ApiResponse<List<Article>>> createCall() {
return mDemoWebService.getArticleList();
}
@Override
protected void onFetchFailed() {
repoListRateLimit.reset(LOG_TAG);
}
}.asLiveData();
}
public LiveData<Article> loadArticle(int id) {
return mArticleDao.getArticle(id);
}
}