@@ -6,10 +6,12 @@ import fr.free.nrw.commons.di.CommonsApplicationModule
6
6
import fr.free.nrw.commons.explore.depictions.DepictsClient
7
7
import fr.free.nrw.commons.repository.UploadRepository
8
8
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
9
+ import io.reactivex.Flowable
9
10
import io.reactivex.Scheduler
10
11
import io.reactivex.Single
11
12
import io.reactivex.android.schedulers.AndroidSchedulers
12
13
import io.reactivex.disposables.CompositeDisposable
14
+ import io.reactivex.functions.BiFunction
13
15
import io.reactivex.processors.PublishProcessor
14
16
import io.reactivex.schedulers.Schedulers
15
17
import timber.log.Timber
@@ -36,24 +38,23 @@ class DepictsPresenter @Inject constructor(
36
38
private var view = DUMMY
37
39
private val compositeDisposable: CompositeDisposable = CompositeDisposable ()
38
40
private val searchTerm: PublishProcessor <String > = PublishProcessor .create()
39
- val depictedItems: MutableLiveData <List <DepictedItem >> = MutableLiveData ()
41
+ private val depictedItems: MutableLiveData <List <DepictedItem >> = MutableLiveData ()
40
42
private val idsToImageUrls = mutableMapOf<String , String >()
41
43
42
- init {
44
+
45
+ override fun onAttachView (view : DepictsContract .View ) {
46
+ this .view = view
43
47
compositeDisposable.add(
44
48
searchTerm
45
49
.observeOn(mainThreadScheduler)
46
50
.doOnNext { view.showProgress(true ) }
47
- .observeOn(ioScheduler)
48
- .switchMap(repository::searchAllEntities)
49
- .map { it.distinct() }
50
- .map(::addImageUrlsFromCache)
51
+ .switchMap(::searchResultsWithTerm)
51
52
.observeOn(mainThreadScheduler)
52
53
.subscribe(
53
- {
54
+ { (results, term) ->
54
55
view.showProgress(false )
55
- view.showError(it .isEmpty())
56
- depictedItems.value = it
56
+ view.showError(results .isEmpty() && term.isNotEmpty ())
57
+ depictedItems.value = results
57
58
},
58
59
{ t: Throwable ? ->
59
60
view.showProgress(false )
@@ -64,19 +65,36 @@ class DepictsPresenter @Inject constructor(
64
65
)
65
66
}
66
67
68
+ private fun searchResultsWithTerm (it : String ): Flowable <Pair <List <DepictedItem >, String>> {
69
+ return Flowable .zip(
70
+ searchResults(it),
71
+ Flowable .just(it),
72
+ BiFunction { results: List <DepictedItem >, term: String ->
73
+ Pair (results, term)
74
+ }
75
+ )
76
+ }
77
+
78
+ private fun searchResults (it : String ): Flowable <List <DepictedItem >> {
79
+ return repository.searchAllEntities(it)
80
+ .subscribeOn(ioScheduler)
81
+ .map { repository.selectedDepictions + it }
82
+ .map { it.distinctBy(DepictedItem ::id) }
83
+ .map(::addImageUrlsFromCache)
84
+ }
85
+
67
86
private fun addImageUrlsFromCache (depictions : List <DepictedItem >) =
68
87
depictions.map { item ->
69
88
idsToImageUrls.getOrElse(item.id, { null })
70
89
?.let { item.copy(imageUrl = it) }
71
90
? : item
72
91
}
73
92
74
- override fun onAttachView (view : DepictsContract .View ) {
75
- this .view = view
76
- }
77
-
78
93
override fun onDetachView () {
79
94
view = DUMMY
95
+ compositeDisposable.dispose()
96
+ idsToImageUrls.clear()
97
+
80
98
}
81
99
82
100
override fun onPreviousButtonClicked () {
@@ -106,7 +124,7 @@ class DepictsPresenter @Inject constructor(
106
124
override fun verifyDepictions () {
107
125
val selectedDepictions =
108
126
repository.selectedDepictions
109
- if (selectedDepictions != null && ! selectedDepictions.isEmpty ()) {
127
+ if (selectedDepictions != null && selectedDepictions.isNotEmpty ()) {
110
128
view.goToNextScreen()
111
129
} else {
112
130
view.noDepictionSelected()
@@ -122,19 +140,14 @@ class DepictsPresenter @Inject constructor(
122
140
compositeDisposable.add(
123
141
imageUrlFromNetworkOrCache(depictedItem)
124
142
.observeOn(AndroidSchedulers .mainThread())
125
- .subscribe { response: String? ->
126
- if (response != null ) {
127
- depictedItems.value =
128
- depictedItems.value!! .map {
129
- if (it.id == depictedItem.id) it.copy(imageUrl = response)
130
- else it
131
- }
132
- }
133
- }
143
+ .subscribe(
144
+ { view.updateUrlInAdapter(depictedItem, it) },
145
+ { Timber .e(it) }
146
+ )
134
147
)
135
148
}
136
149
137
- private fun imageUrlFromNetworkOrCache (depictedItem : DepictedItem ) =
150
+ private fun imageUrlFromNetworkOrCache (depictedItem : DepictedItem ): Single < String > =
138
151
if (idsToImageUrls.containsKey(depictedItem.imageUrl))
139
152
Single .just(idsToImageUrls[depictedItem.id])
140
153
else
0 commit comments