1
+ package st.slex.csplashscreen.data.search
2
+
3
+ import androidx.paging.PagingSource
4
+ import androidx.paging.PagingState
5
+ import dagger.assisted.Assisted
6
+ import dagger.assisted.AssistedFactory
7
+ import dagger.assisted.AssistedInject
8
+ import retrofit2.HttpException
9
+ import st.slex.csplashscreen.data.core.toImageModel
10
+ import st.slex.csplashscreen.data.model.ui.image.ImageModel
11
+ import st.slex.csplashscreen.utiles.API_KEY
12
+
13
+ class SearchPagingSource @AssistedInject constructor(
14
+ private val service : SearchService ,
15
+ @Assisted val query : QuerySearch
16
+ ) : PagingSource<Int, ImageModel>() {
17
+
18
+ override fun getRefreshKey (state : PagingState <Int , ImageModel >): Int? {
19
+ val anchorPosition = state.anchorPosition ? : return null
20
+ val anchorPage = state.closestPageToPosition(anchorPosition) ? : return null
21
+ return anchorPage.prevKey?.plus(1 ) ? : anchorPage.nextKey?.minus(1 )
22
+ }
23
+
24
+ override suspend fun load (params : LoadParams <Int >): LoadResult <Int , ImageModel > {
25
+ try {
26
+ val pageNumber = params.key ? : INITIAL_PAGE_NUMBER
27
+ val pageSize = params.loadSize
28
+
29
+ val response = when (query) {
30
+ is QuerySearch .SearchPhotos ->
31
+ service.searchPhoto(query.text, pageNumber, pageSize, API_KEY )
32
+ is QuerySearch .EmptyQuery -> null
33
+ }
34
+
35
+ return if (response?.body() != null && response.isSuccessful) {
36
+
37
+ val photos = response.body()!! .results.map {
38
+ it.toImageModel()
39
+ }
40
+
41
+ val nextPageNumber = if (photos.isEmpty()) null else pageNumber + 1
42
+ val prevPageNumber = if (pageNumber > 1 ) pageNumber - 1 else null
43
+ LoadResult .Page (photos, prevPageNumber, nextPageNumber)
44
+ } else {
45
+ LoadResult .Error (HttpException (response))
46
+ }
47
+ } catch (e: HttpException ) {
48
+ return LoadResult .Error (e)
49
+ } catch (e: Exception ) {
50
+ return LoadResult .Error (e)
51
+ }
52
+ }
53
+
54
+ @AssistedFactory
55
+ interface Factory {
56
+ fun create (@Assisted query : QuerySearch ): SearchPagingSource
57
+ }
58
+
59
+ companion object {
60
+ const val INITIAL_PAGE_NUMBER = 1
61
+ }
62
+ }
0 commit comments