diff --git a/app/src/main/java/fr/free/nrw/commons/explore/depictions/DepictsClient.kt b/app/src/main/java/fr/free/nrw/commons/explore/depictions/DepictsClient.kt index 8bb79f20a..043bf9c41 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/depictions/DepictsClient.kt +++ b/app/src/main/java/fr/free/nrw/commons/explore/depictions/DepictsClient.kt @@ -40,7 +40,7 @@ class DepictsClient @Inject constructor( return depictsInterface.searchForDepicts(query, "$limit", language, language, "$offset") .map { it.search.joinToString("|") { searchItem -> searchItem.id } } .flatMap(::getEntities) - .map { it.entities()?.values?.map(::DepictedItem) ?: emptyList() } + .map { it.entities().values.map(::DepictedItem) } } /** @@ -81,7 +81,7 @@ class DepictsClient @Inject constructor( fun toDepictions(sparqlResponse: Observable): Observable> { return sparqlResponse.map { it.results.bindings.joinToString("|", transform = Binding::id) } .flatMap { getEntities(it).toObservable() } - .map { it.entities()?.values?.map(::DepictedItem) ?: emptyList() } + .map { it.entities().values.map(::DepictedItem) } } companion object { diff --git a/app/src/main/java/fr/free/nrw/commons/upload/structure/depictions/DepictModel.kt b/app/src/main/java/fr/free/nrw/commons/upload/structure/depictions/DepictModel.kt index 4b0488844..f2d48d5d6 100644 --- a/app/src/main/java/fr/free/nrw/commons/upload/structure/depictions/DepictModel.kt +++ b/app/src/main/java/fr/free/nrw/commons/upload/structure/depictions/DepictModel.kt @@ -3,7 +3,9 @@ package fr.free.nrw.commons.upload.structure.depictions import fr.free.nrw.commons.explore.depictions.DepictsClient import fr.free.nrw.commons.nearby.Place import io.reactivex.Flowable +import io.reactivex.Single import io.reactivex.processors.BehaviorProcessor +import timber.log.Timber import javax.inject.Inject import javax.inject.Singleton @@ -15,7 +17,6 @@ class DepictModel @Inject constructor(private val depictsClient: DepictsClient) val nearbyPlaces: BehaviorProcessor> = BehaviorProcessor.createDefault(emptyList()) - companion object { private const val SEARCH_DEPICTS_LIMIT = 25 } @@ -24,23 +25,24 @@ class DepictModel @Inject constructor(private val depictsClient: DepictsClient) * Search for depictions */ fun searchAllEntities(query: String): Flowable> { - if (query.isBlank()) { - return nearbyPlaces.switchMap { places: List -> - depictsClient.getEntities( - places.mapNotNull { it.wikiDataEntityId }.joinToString("|") - ) + return if (query.isBlank()) + nearbyPlaces.switchMap { places: List -> + depictsClient.getEntities(places.toIds()) .map { - it.entities()!!.values.mapIndexed { index, entity -> - DepictedItem(entity, places[index]) - } - }.toFlowable() + it.entities() + .values + .mapIndexed { index, entity -> DepictedItem(entity, places[index]) } + } + .onErrorResumeWithEmptyList() + .toFlowable() } - } - return networkItems(query) + else + networkItems(query) } private fun networkItems(query: String): Flowable> { return depictsClient.searchForDepictions(query, SEARCH_DEPICTS_LIMIT, 0) + .onErrorResumeWithEmptyList() .toFlowable() } @@ -49,3 +51,9 @@ class DepictModel @Inject constructor(private val depictsClient: DepictsClient) } } + +private fun List.toIds() = mapNotNull { it.wikiDataEntityId }.joinToString("|") + +private fun Single>.onErrorResumeWithEmptyList() = onErrorResumeNext { t: Throwable -> + Single.just(emptyList()).also { Timber.e(t) } +} diff --git a/data-client/src/main/java/org/wikipedia/wikidata/Entities.java b/data-client/src/main/java/org/wikipedia/wikidata/Entities.java index 5c8ee3622..a320111fa 100644 --- a/data-client/src/main/java/org/wikipedia/wikidata/Entities.java +++ b/data-client/src/main/java/org/wikipedia/wikidata/Entities.java @@ -7,6 +7,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; +import org.jetbrains.annotations.NotNull; import org.wikipedia.dataclient.mwapi.MwResponse; import org.wikipedia.json.PostProcessingTypeAdapter; @@ -15,8 +16,9 @@ public class Entities extends MwResponse implements PostProcessingTypeAdapter.Po @Nullable private Map entities; private int success; - @Nullable public Map entities() { - return entities; + @NotNull + public Map entities() { + return entities != null ? entities : Collections.emptyMap(); } public int getSuccess() {