Skip to content

Commit 310c29c

Browse files
committed
#3810 Convert DepictedImagesFragment to use Pagination - rename base classes to better reflect usage
1 parent 181a63a commit 310c29c

25 files changed

+104
-103
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package fr.free.nrw.commons.depictions.Media
22

33
import fr.free.nrw.commons.Media
4-
import fr.free.nrw.commons.explore.SearchFragmentContract
4+
import fr.free.nrw.commons.explore.PagingContract
55

66
/**
77
* Contract with which DepictedImagesFragment and its presenter will talk to each other
88
*/
99
interface DepictedImagesContract {
10-
interface View : SearchFragmentContract.View<Media>
11-
interface Presenter : SearchFragmentContract.Presenter<Media>
10+
interface View : PagingContract.View<Media>
11+
interface Presenter : PagingContract.Presenter<Media>
1212
}

app/src/main/java/fr/free/nrw/commons/depictions/Media/DepictedImagesFragment.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ class DepictedImagesFragment : PageableMediaFragment(), DepictedImagesContract.V
1010
@Inject
1111
lateinit var presenter: DepictedImagesContract.Presenter
1212

13-
override val injectedPresenter: DepictedImagesContract.Presenter
13+
override val injectedPresenter
1414
get() = presenter
1515

1616
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
1717
super.onViewCreated(view, savedInstanceState)
18-
injectedPresenter.onQueryUpdated(arguments!!.getString("entityId")!!)
18+
onQueryUpdated(arguments!!.getString("entityId")!!)
1919
}
2020

2121
override fun onItemClicked(position: Int) {

app/src/main/java/fr/free/nrw/commons/depictions/Media/DepictedImagesPresenter.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package fr.free.nrw.commons.depictions.Media
22

33
import fr.free.nrw.commons.Media
44
import fr.free.nrw.commons.di.CommonsApplicationModule
5-
import fr.free.nrw.commons.explore.BaseSearchPresenter
5+
import fr.free.nrw.commons.explore.BasePagingPresenter
66
import io.reactivex.Scheduler
77
import javax.inject.Inject
88
import javax.inject.Named
@@ -13,5 +13,5 @@ import javax.inject.Named
1313
class DepictedImagesPresenter @Inject constructor(
1414
@Named(CommonsApplicationModule.MAIN_THREAD) mainThreadScheduler: Scheduler,
1515
dataSourceFactory: PageableDepictedMediaDataSource
16-
) : BaseSearchPresenter<Media>(mainThreadScheduler, dataSourceFactory),
16+
) : BasePagingPresenter<Media>(mainThreadScheduler, dataSourceFactory),
1717
DepictedImagesContract.Presenter

app/src/main/java/fr/free/nrw/commons/depictions/Media/PageableDepictedMediaDataSource.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ package fr.free.nrw.commons.depictions.Media
22

33
import fr.free.nrw.commons.Media
44
import fr.free.nrw.commons.explore.LiveDataConverter
5-
import fr.free.nrw.commons.explore.PageableDataSource
5+
import fr.free.nrw.commons.explore.PageableBaseDataSource
66
import fr.free.nrw.commons.explore.depictions.LoadFunction
77
import fr.free.nrw.commons.media.MediaClient
88
import javax.inject.Inject
99

1010
class PageableDepictedMediaDataSource @Inject constructor(
1111
liveDataConverter: LiveDataConverter,
1212
private val mediaClient: MediaClient
13-
) : PageableDataSource<Media>(liveDataConverter) {
13+
) : PageableBaseDataSource<Media>(liveDataConverter) {
1414
override val loadFunction: LoadFunction<Media> = { loadSize: Int, startPosition: Int ->
1515
mediaClient.fetchImagesForDepictedItem(query, loadSize, startPosition).blockingGet()
1616
}

app/src/main/java/fr/free/nrw/commons/explore/BaseSearchFragment.kt renamed to app/src/main/java/fr/free/nrw/commons/explore/BasePagingFragment.kt

+7-6
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ import fr.free.nrw.commons.utils.ViewUtil
1919
import kotlinx.android.synthetic.main.fragment_search_paginated.*
2020

2121

22-
abstract class BaseSearchFragment<T> : CommonsDaggerSupportFragment(),
23-
SearchFragmentContract.View<T> {
22+
abstract class BasePagingFragment<T> : CommonsDaggerSupportFragment(),
23+
PagingContract.View<T> {
2424

2525
abstract val pagedListAdapter: PagedListAdapter<T, *>
26-
abstract val injectedPresenter: SearchFragmentContract.Presenter<T>
26+
abstract val injectedPresenter: PagingContract.Presenter<T>
2727
abstract val errorTextId: Int
2828
private val loadingAdapter by lazy { FooterAdapter { injectedPresenter.retryFailedRequest() } }
2929
private val mergeAdapter by lazy { MergeAdapter(pagedListAdapter, loadingAdapter) }
@@ -47,11 +47,12 @@ abstract class BaseSearchFragment<T> : CommonsDaggerSupportFragment(),
4747
)
4848
}
4949

50-
override fun observeSearchResults(searchResults: LiveData<PagedList<T>>) {
50+
override fun observePagingResults(searchResults: LiveData<PagedList<T>>) {
5151
this.searchResults?.removeObservers(viewLifecycleOwner)
5252
this.searchResults = searchResults
5353
searchResults.observe(viewLifecycleOwner, Observer {
54-
pagedListAdapter.submitList(it) })
54+
pagedListAdapter.submitList(it)
55+
})
5556
}
5657

5758
override fun onAttach(context: Context) {
@@ -85,7 +86,7 @@ abstract class BaseSearchFragment<T> : CommonsDaggerSupportFragment(),
8586
contentNotFound.visibility = View.VISIBLE
8687
}
8788

88-
abstract fun getEmptyText(query: String):String
89+
abstract fun getEmptyText(query: String): String
8990

9091
override fun hideEmptyText() {
9192
contentNotFound.visibility = View.GONE

app/src/main/java/fr/free/nrw/commons/explore/BaseSearchPresenter.kt renamed to app/src/main/java/fr/free/nrw/commons/explore/BasePagingPresenter.kt

+11-11
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,25 @@ import io.reactivex.disposables.CompositeDisposable
77
import timber.log.Timber
88

99

10-
abstract class BaseSearchPresenter<T>(
10+
abstract class BasePagingPresenter<T>(
1111
val mainThreadScheduler: Scheduler,
12-
val pageableDataSource: PageableDataSource<T>
13-
) : SearchFragmentContract.Presenter<T> {
12+
val pageableBaseDataSource: PageableBaseDataSource<T>
13+
) : PagingContract.Presenter<T> {
1414

15-
private val DUMMY: SearchFragmentContract.View<T> = proxy()
16-
private var view: SearchFragmentContract.View<T> = DUMMY
15+
private val DUMMY: PagingContract.View<T> = proxy()
16+
private var view: PagingContract.View<T> = DUMMY
1717

1818
private val compositeDisposable = CompositeDisposable()
1919
override val listFooterData = MutableLiveData<List<FooterItem>>().apply { value = emptyList() }
2020

21-
override fun onAttachView(view: SearchFragmentContract.View<T>) {
21+
override fun onAttachView(view: PagingContract.View<T>) {
2222
this.view = view
2323
compositeDisposable.addAll(
24-
pageableDataSource.searchResults.subscribe(view::observeSearchResults),
25-
pageableDataSource.loadingStates
24+
pageableBaseDataSource.pagingResults.subscribe(view::observePagingResults),
25+
pageableBaseDataSource.loadingStates
2626
.observeOn(mainThreadScheduler)
2727
.subscribe(::onLoadingState, Timber::e),
28-
pageableDataSource.noItemsLoadedQueries.subscribe(view::showEmptyText)
28+
pageableBaseDataSource.noItemsLoadedQueries.subscribe(view::showEmptyText)
2929
)
3030
}
3131

@@ -50,7 +50,7 @@ abstract class BaseSearchPresenter<T>(
5050
}
5151

5252
override fun retryFailedRequest() {
53-
pageableDataSource.retryFailedRequest()
53+
pageableBaseDataSource.retryFailedRequest()
5454
}
5555

5656
override fun onDetachView() {
@@ -59,7 +59,7 @@ abstract class BaseSearchPresenter<T>(
5959
}
6060

6161
override fun onQueryUpdated(query: String) {
62-
pageableDataSource.onQueryUpdated(query)
62+
pageableBaseDataSource.onQueryUpdated(query)
6363
}
6464

6565
}

app/src/main/java/fr/free/nrw/commons/explore/SearchFragmentContract.kt renamed to app/src/main/java/fr/free/nrw/commons/explore/PagingContract.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import androidx.lifecycle.LiveData
44
import androidx.paging.PagedList
55
import fr.free.nrw.commons.BasePresenter
66

7-
interface SearchFragmentContract {
7+
interface PagingContract {
88
interface View<T> {
99
fun showSnackbar()
10-
fun observeSearchResults(searchResults: LiveData<PagedList<T>>)
10+
fun observePagingResults(searchResults: LiveData<PagedList<T>>)
1111
fun showInitialLoadInProgress()
1212
fun hideInitialLoadProgress()
1313
fun showEmptyText(query: String)

app/src/main/java/fr/free/nrw/commons/explore/SearchDataSourceFactory.kt renamed to app/src/main/java/fr/free/nrw/commons/explore/PagingDataSourceFactory.kt

+9-9
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,25 @@ import javax.inject.Inject
1414
private const val PAGE_SIZE = 50
1515
private const val INITIAL_LOAD_SIZE = 50
1616

17-
abstract class PageableDataSource<T>(private val liveDataConverter: LiveDataConverter) {
17+
abstract class PageableBaseDataSource<T>(private val liveDataConverter: LiveDataConverter) {
1818

1919
lateinit var query: String
20-
private val dataSourceFactoryFactory: () -> SearchDataSourceFactory<T> = {
20+
private val dataSourceFactoryFactory: () -> PagingDataSourceFactory<T> = {
2121
dataSourceFactory(_loadingStates, loadFunction)
2222
}
2323
private val _loadingStates = PublishProcessor.create<LoadingState>()
2424
val loadingStates: Flowable<LoadingState> = _loadingStates
25-
private val _searchResults = PublishProcessor.create<LiveData<PagedList<T>>>()
26-
val searchResults: Flowable<LiveData<PagedList<T>>> = _searchResults
25+
private val _pagingResults = PublishProcessor.create<LiveData<PagedList<T>>>()
26+
val pagingResults: Flowable<LiveData<PagedList<T>>> = _pagingResults
2727
private val _noItemsLoadedEvent = PublishProcessor.create<String>()
2828
val noItemsLoadedQueries: Flowable<String> = _noItemsLoadedEvent
29-
private var currentFactory: SearchDataSourceFactory<T>? = null
29+
private var currentFactory: PagingDataSourceFactory<T>? = null
3030

3131
abstract val loadFunction: LoadFunction<T>
3232

3333
fun onQueryUpdated(query: String) {
3434
this.query = query
35-
_searchResults.offer(
35+
_pagingResults.offer(
3636
liveDataConverter.convert(dataSourceFactoryFactory().also { currentFactory = it }) {
3737
_noItemsLoadedEvent.offer(query)
3838
}
@@ -46,7 +46,7 @@ abstract class PageableDataSource<T>(private val liveDataConverter: LiveDataConv
4646

4747
class LiveDataConverter @Inject constructor() {
4848
fun <T> convert(
49-
dataSourceFactory: SearchDataSourceFactory<T>,
49+
dataSourceFactory: PagingDataSourceFactory<T>,
5050
zeroItemsLoadedFunction: () -> Unit
5151
): LiveData<PagedList<T>> {
5252
return dataSourceFactory.toLiveData(
@@ -65,7 +65,7 @@ class LiveDataConverter @Inject constructor() {
6565

6666
}
6767

68-
abstract class SearchDataSourceFactory<T>(val loadingStates: LoadingStates) :
68+
abstract class PagingDataSourceFactory<T>(val loadingStates: LoadingStates) :
6969
DataSource.Factory<Int, T>() {
7070
private var currentDataSource: SearchDataSource<T>? = null
7171
abstract val loadFunction: LoadFunction<T>
@@ -80,7 +80,7 @@ abstract class SearchDataSourceFactory<T>(val loadingStates: LoadingStates) :
8080
}
8181

8282
fun <T> dataSourceFactory(loadingStates: LoadingStates, loadFunction: LoadFunction<T>) =
83-
object : SearchDataSourceFactory<T>(loadingStates) {
83+
object : PagingDataSourceFactory<T>(loadingStates) {
8484
override val loadFunction: LoadFunction<T> = loadFunction
8585
}
8686

app/src/main/java/fr/free/nrw/commons/explore/SearchCategoriesFragmentPresenter.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ import javax.inject.Named
1010
class SearchCategoriesFragmentPresenter @Inject constructor(
1111
@Named(CommonsApplicationModule.MAIN_THREAD) mainThreadScheduler: Scheduler,
1212
dataSourceFactory: PageableCategoriesDataSource
13-
) : BaseSearchPresenter<String>(mainThreadScheduler, dataSourceFactory),
13+
) : BasePagingPresenter<String>(mainThreadScheduler, dataSourceFactory),
1414
SearchCategoriesFragmentContract.Presenter

app/src/main/java/fr/free/nrw/commons/explore/categories/PageableCategoriesDataSource.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ package fr.free.nrw.commons.explore.categories
22

33
import fr.free.nrw.commons.category.CategoryClient
44
import fr.free.nrw.commons.explore.LiveDataConverter
5-
import fr.free.nrw.commons.explore.PageableDataSource
5+
import fr.free.nrw.commons.explore.PageableBaseDataSource
66
import javax.inject.Inject
77

88
class PageableCategoriesDataSource @Inject constructor(
99
liveDataConverter: LiveDataConverter,
1010
val categoryClient: CategoryClient
11-
) : PageableDataSource<String>(liveDataConverter) {
11+
) : PageableBaseDataSource<String>(liveDataConverter) {
1212

1313
override val loadFunction = { loadSize: Int, startPosition: Int ->
1414
categoryClient.searchCategories(query, loadSize, startPosition).blockingFirst()
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package fr.free.nrw.commons.explore.categories
22

3-
import fr.free.nrw.commons.explore.SearchFragmentContract
3+
import fr.free.nrw.commons.explore.PagingContract
44

55
interface SearchCategoriesFragmentContract {
6-
interface View : SearchFragmentContract.View<String>
7-
interface Presenter : SearchFragmentContract.Presenter<String>
6+
interface View : PagingContract.View<String>
7+
interface Presenter : PagingContract.Presenter<String>
88
}

app/src/main/java/fr/free/nrw/commons/explore/categories/SearchCategoryFragment.kt

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,20 @@ package fr.free.nrw.commons.explore.categories
22

33
import fr.free.nrw.commons.R
44
import fr.free.nrw.commons.category.CategoryDetailsActivity
5-
import fr.free.nrw.commons.explore.BaseSearchFragment
6-
import fr.free.nrw.commons.explore.SearchFragmentContract
5+
import fr.free.nrw.commons.explore.BasePagingFragment
6+
import fr.free.nrw.commons.explore.PagingContract
77
import javax.inject.Inject
88

99
/**
1010
* Displays the category search screen.
1111
*/
12-
class SearchCategoryFragment : BaseSearchFragment<String>() {
12+
class SearchCategoryFragment : BasePagingFragment<String>() {
1313
@Inject
1414
lateinit var presenter: SearchCategoriesFragmentContract.Presenter
1515

1616
override val errorTextId: Int = R.string.error_loading_categories
1717

18-
override val injectedPresenter: SearchFragmentContract.Presenter<String>
18+
override val injectedPresenter
1919
get() = presenter
2020

2121
override val pagedListAdapter by lazy {

app/src/main/java/fr/free/nrw/commons/explore/depictions/PageableDepictionsDataSource.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package fr.free.nrw.commons.explore.depictions
22

33
import fr.free.nrw.commons.explore.LiveDataConverter
44
import fr.free.nrw.commons.explore.LoadingState
5-
import fr.free.nrw.commons.explore.PageableDataSource
5+
import fr.free.nrw.commons.explore.PageableBaseDataSource
66
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
77
import io.reactivex.processors.PublishProcessor
88
import javax.inject.Inject
@@ -13,7 +13,7 @@ typealias LoadingStates = PublishProcessor<LoadingState>
1313
class PageableDepictionsDataSource @Inject constructor(
1414
liveDataConverter: LiveDataConverter,
1515
val depictsClient: DepictsClient
16-
) : PageableDataSource<DepictedItem>(liveDataConverter) {
16+
) : PageableBaseDataSource<DepictedItem>(liveDataConverter) {
1717

1818
override val loadFunction = { loadSize: Int, startPosition: Int ->
1919
depictsClient.searchForDepictions(query, loadSize, startPosition).blockingGet()

app/src/main/java/fr/free/nrw/commons/explore/depictions/SearchDepictionsFragment.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,21 @@ package fr.free.nrw.commons.explore.depictions
22

33
import fr.free.nrw.commons.R
44
import fr.free.nrw.commons.depictions.WikidataItemDetailsActivity
5-
import fr.free.nrw.commons.explore.BaseSearchFragment
5+
import fr.free.nrw.commons.explore.BasePagingFragment
66
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
77
import javax.inject.Inject
88

99
/**
1010
* Display depictions in search fragment
1111
*/
12-
class SearchDepictionsFragment : BaseSearchFragment<DepictedItem>(),
12+
class SearchDepictionsFragment : BasePagingFragment<DepictedItem>(),
1313
SearchDepictionsFragmentContract.View {
1414
@Inject
1515
lateinit var presenter: SearchDepictionsFragmentContract.Presenter
1616

1717
override val errorTextId: Int = R.string.error_loading_depictions
1818

19-
override val injectedPresenter: SearchDepictionsFragmentContract.Presenter
19+
override val injectedPresenter
2020
get() = presenter
2121

2222
override val pagedListAdapter by lazy {
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package fr.free.nrw.commons.explore.depictions
22

3-
import fr.free.nrw.commons.explore.SearchFragmentContract
3+
import fr.free.nrw.commons.explore.PagingContract
44
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
55

66
/**
77
* The contract with with SearchDepictionsFragment and its presenter would talk to each other
88
*/
99
interface SearchDepictionsFragmentContract {
10-
interface View : SearchFragmentContract.View<DepictedItem>
11-
interface Presenter : SearchFragmentContract.Presenter<DepictedItem>
10+
interface View : PagingContract.View<DepictedItem>
11+
interface Presenter : PagingContract.Presenter<DepictedItem>
1212
}

app/src/main/java/fr/free/nrw/commons/explore/depictions/SearchDepictionsFragmentPresenter.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package fr.free.nrw.commons.explore.depictions
22

33
import fr.free.nrw.commons.di.CommonsApplicationModule
4-
import fr.free.nrw.commons.explore.BaseSearchPresenter
4+
import fr.free.nrw.commons.explore.BasePagingPresenter
55
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
66
import io.reactivex.Scheduler
77
import javax.inject.Inject
@@ -13,5 +13,5 @@ import javax.inject.Named
1313
class SearchDepictionsFragmentPresenter @Inject constructor(
1414
@Named(CommonsApplicationModule.MAIN_THREAD) mainThreadScheduler: Scheduler,
1515
dataSourceFactory: PageableDepictionsDataSource
16-
) : BaseSearchPresenter<DepictedItem>(mainThreadScheduler, dataSourceFactory),
16+
) : BasePagingPresenter<DepictedItem>(mainThreadScheduler, dataSourceFactory),
1717
SearchDepictionsFragmentContract.Presenter

app/src/main/java/fr/free/nrw/commons/explore/media/PageableMediaDataSource.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@ package fr.free.nrw.commons.explore.media
22

33
import fr.free.nrw.commons.Media
44
import fr.free.nrw.commons.explore.LiveDataConverter
5-
import fr.free.nrw.commons.explore.PageableDataSource
5+
import fr.free.nrw.commons.explore.PageableBaseDataSource
66
import fr.free.nrw.commons.explore.depictions.LoadFunction
77
import fr.free.nrw.commons.media.MediaClient
88
import javax.inject.Inject
99

1010
class PageableMediaDataSource @Inject constructor(
1111
liveDataConverter: LiveDataConverter,
1212
private val mediaClient: MediaClient
13-
) : PageableDataSource<Media>(liveDataConverter) {
13+
) : PageableBaseDataSource<Media>(liveDataConverter) {
1414
override val loadFunction: LoadFunction<Media> = { loadSize: Int, startPosition: Int ->
1515
mediaClient.getMediaListFromSearch(query, loadSize, startPosition).blockingGet()
1616
}

app/src/main/java/fr/free/nrw/commons/explore/media/PageableMediaFragment.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ import android.os.Bundle
44
import android.view.View
55
import fr.free.nrw.commons.Media
66
import fr.free.nrw.commons.R
7-
import fr.free.nrw.commons.explore.BaseSearchFragment
7+
import fr.free.nrw.commons.explore.BasePagingFragment
88
import kotlinx.android.synthetic.main.fragment_search_paginated.*
99

1010

11-
abstract class PageableMediaFragment : BaseSearchFragment<Media>() {
11+
abstract class PageableMediaFragment : BasePagingFragment<Media>() {
1212
override val pagedListAdapter by lazy { PagedMediaAdapter(::onItemClicked) }
1313

1414
override val errorTextId: Int = R.string.error_loading_images

0 commit comments

Comments
 (0)