forked from kimtaesu/FlickrAndroid
-
Notifications
You must be signed in to change notification settings - Fork 0
/
PhotoRepository.kt
86 lines (76 loc) · 3.37 KB
/
PhotoRepository.kt
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
package com.hucet.flickr.repository
import androidx.lifecycle.LiveData
import androidx.lifecycle.Transformations
import com.hucet.flickr.OpenForTesting
import com.hucet.flickr.api.ApiResponse
import com.hucet.flickr.api.FlickrApi
import com.hucet.flickr.db.FlickrDatabase
import com.hucet.flickr.db.dao.FlickrDao
import com.hucet.flickr.utils.AbsentLiveData
import com.hucet.flickr.utils.AppExecutors
import com.hucet.flickr.vo.Photo
import com.hucet.flickr.vo.PhotoResponse
import com.hucet.flickr.vo.PhotoSearchResult
import com.hucet.flickr.vo.Resource
import javax.inject.Inject
import javax.inject.Singleton
interface PhotoRepository {
fun searchPhotos(keyword: String): LiveData<Resource<List<Photo>>>
fun searchNextPhotos(keyword: String): LiveData<Resource<Boolean>>
@Singleton
@OpenForTesting
class Impl @Inject constructor(
private val remoteApi: FlickrApi,
private val db: FlickrDatabase,
private val appExecutors: AppExecutors
) : PhotoRepository {
private val dao: FlickrDao = db.flickrDao()
override fun searchPhotos(keyword: String): LiveData<Resource<List<Photo>>> {
return object : NetworkBoundResource<List<Photo>, PhotoResponse>(appExecutors) {
override fun saveCallResult(item: PhotoResponse) {
val photoIds = item.metaPhotos.photos.map { it.id }
val photoSearchResult = PhotoSearchResult(
keyword = keyword,
photoIds = photoIds,
next = item.metaPhotos.page + 1
)
savePhotosSearchResult(item.metaPhotos.photos, photoSearchResult)
}
override fun loadFromDb(): LiveData<List<Photo>> {
return Transformations.switchMap(dao.searchResult(keyword)) { searchData ->
if (searchData == null) {
AbsentLiveData.create()
} else {
dao.searchPhotosByIds(searchData.photoIds)
}
}
}
override fun createCall(): LiveData<ApiResponse<PhotoResponse>> =
remoteApi.searchPhotos(keyword, 1)
}.asLiveData()
}
override fun searchNextPhotos(keyword: String): LiveData<Resource<Boolean>> {
return object : FetchNextSearchPageTask(appExecutors) {
override fun savePhotosSearchResult(items: List<Photo>, searchResult: PhotoSearchResult) {
this@Impl.savePhotosSearchResult(items, searchResult)
}
override fun searchResultFromDb(): LiveData<PhotoSearchResult> {
return dao.searchResult(keyword)
}
override fun createCall(page: Int): LiveData<ApiResponse<PhotoResponse>> {
return remoteApi.searchPhotos(keyword, page)
}
}.asLiveData()
}
private fun savePhotosSearchResult(photos: List<Photo>, photoSearchResult: PhotoSearchResult) {
db.beginTransaction()
try {
dao.insertPhotos(photos)
dao.insertSearchResult(photoSearchResult)
db.setTransactionSuccessful()
} finally {
db.endTransaction()
}
}
}
}