mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 20:33:53 +01:00
Description and thumbnail is showing for the categories that are associated with Wikidata (#4803)
* Depiction.commons categories showing with description and thumbnail * Test added * Test added
This commit is contained in:
parent
ecc6b1bf28
commit
15fa93e8d0
5 changed files with 95 additions and 3 deletions
|
|
@ -5,6 +5,7 @@ import fr.free.nrw.commons.upload.GpsCategoryModel
|
||||||
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
|
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
|
||||||
import fr.free.nrw.commons.utils.StringSortingUtils
|
import fr.free.nrw.commons.utils.StringSortingUtils
|
||||||
import io.reactivex.Observable
|
import io.reactivex.Observable
|
||||||
|
import io.reactivex.Single
|
||||||
import io.reactivex.functions.Function4
|
import io.reactivex.functions.Function4
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
@ -96,8 +97,27 @@ class CategoriesModel @Inject constructor(
|
||||||
.toObservable()
|
.toObservable()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun categoriesFromDepiction(selectedDepictions: List<DepictedItem>) =
|
/**
|
||||||
Observable.just(selectedDepictions.map { it.commonsCategories }.flatten())
|
* Fetches details of every category associated with selected depictions, converts them into
|
||||||
|
* CategoryItem and returns them in a list.
|
||||||
|
*
|
||||||
|
* @param selectedDepictions selected DepictItems
|
||||||
|
* @return List of CategoryItem associated with selected depictions
|
||||||
|
*/
|
||||||
|
private fun categoriesFromDepiction(selectedDepictions: List<DepictedItem>):
|
||||||
|
Observable<MutableList<CategoryItem>>? {
|
||||||
|
return Observable.fromIterable(
|
||||||
|
selectedDepictions.map { it.commonsCategories }.flatten())
|
||||||
|
.map { categoryItem ->
|
||||||
|
categoryClient.getCategoriesByName(categoryItem.name,
|
||||||
|
categoryItem.name, SEARCH_CATS_LIMIT).map {
|
||||||
|
|
||||||
|
CategoryItem(it[0].name, it[0].description,
|
||||||
|
it[0].thumbnail, it[0].isSelected)
|
||||||
|
|
||||||
|
}.blockingGet()
|
||||||
|
}.toList().toObservable()
|
||||||
|
}
|
||||||
|
|
||||||
private fun combine(
|
private fun combine(
|
||||||
depictionCategories: List<CategoryItem>,
|
depictionCategories: List<CategoryItem>,
|
||||||
|
|
|
||||||
|
|
@ -48,6 +48,24 @@ class CategoryClient @Inject constructor(private val categoryInterface: Category
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetches categories starting and ending with a specified name.
|
||||||
|
*
|
||||||
|
* @param startingCategoryName Name of the category to start
|
||||||
|
* @param endingCategoryName Name of the category to end
|
||||||
|
* @param itemLimit How many categories to return
|
||||||
|
* @param offset offset
|
||||||
|
* @return MwQueryResponse
|
||||||
|
*/
|
||||||
|
@JvmOverloads
|
||||||
|
fun getCategoriesByName(startingCategoryName: String?, endingCategoryName: String?,
|
||||||
|
itemLimit: Int, offset: Int = 0): Single<List<CategoryItem>> {
|
||||||
|
return responseMapper(
|
||||||
|
categoryInterface.getCategoriesByName(startingCategoryName, endingCategoryName,
|
||||||
|
itemLimit, offset)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The method takes categoryName as input and returns a List of Subcategories
|
* The method takes categoryName as input and returns a List of Subcategories
|
||||||
* It uses the generator query API to get the subcategories in a category, 500 at a time.
|
* It uses the generator query API to get the subcategories in a category, 500 at a time.
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,23 @@ public interface CategoryInterface {
|
||||||
@Query("gaclimit") int itemLimit,
|
@Query("gaclimit") int itemLimit,
|
||||||
@Query("gacoffset") int offset);
|
@Query("gacoffset") int offset);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetches categories starting and ending with a specified name.
|
||||||
|
*
|
||||||
|
* @param startingCategory Name of the category to start
|
||||||
|
* @param endingCategory Name of the category to end
|
||||||
|
* @param itemLimit How many categories to return
|
||||||
|
* @param offset offset
|
||||||
|
* @return MwQueryResponse
|
||||||
|
*/
|
||||||
|
@GET("w/api.php?action=query&format=json&formatversion=2"
|
||||||
|
+ "&generator=allcategories&prop=categoryinfo|description|pageimages&piprop=thumbnail"
|
||||||
|
+ "&pithumbsize=70")
|
||||||
|
Single<MwQueryResponse> getCategoriesByName(@Query("gacfrom") String startingCategory,
|
||||||
|
@Query("gacto") String endingCategory,
|
||||||
|
@Query("gaclimit") int itemLimit,
|
||||||
|
@Query("gacoffset") int offset);
|
||||||
|
|
||||||
@GET("w/api.php?action=query&format=json&formatversion=2"
|
@GET("w/api.php?action=query&format=json&formatversion=2"
|
||||||
+ "&generator=categorymembers&gcmtype=subcat"
|
+ "&generator=categorymembers&gcmtype=subcat"
|
||||||
+ "&prop=info&gcmlimit=50")
|
+ "&prop=info&gcmlimit=50")
|
||||||
|
|
|
||||||
|
|
@ -84,13 +84,16 @@ class CategoriesModelTest {
|
||||||
"titleSearch", "", "", false))))
|
"titleSearch", "", "", false))))
|
||||||
whenever(categoryDao.recentCategories(25)).thenReturn(listOf(CategoryItem(
|
whenever(categoryDao.recentCategories(25)).thenReturn(listOf(CategoryItem(
|
||||||
"recentCategories","","", false)))
|
"recentCategories","","", false)))
|
||||||
|
whenever(categoryClient.getCategoriesByName("depictionCategory",
|
||||||
|
"depictionCategory", 25)).thenReturn(Single.just(listOf(CategoryItem(
|
||||||
|
"commonsCategories","","", false))))
|
||||||
val imageTitleList = listOf("Test")
|
val imageTitleList = listOf("Test")
|
||||||
CategoriesModel(categoryClient, categoryDao, gpsCategoryModel)
|
CategoriesModel(categoryClient, categoryDao, gpsCategoryModel)
|
||||||
.searchAll("", imageTitleList, listOf(depictedItem))
|
.searchAll("", imageTitleList, listOf(depictedItem))
|
||||||
.test()
|
.test()
|
||||||
.assertValue(
|
.assertValue(
|
||||||
listOf(
|
listOf(
|
||||||
categoryItem("depictionCategory"),
|
categoryItem("commonsCategories"),
|
||||||
categoryItem("gpsCategory"),
|
categoryItem("gpsCategory"),
|
||||||
categoryItem("titleSearch"),
|
categoryItem("titleSearch"),
|
||||||
categoryItem("recentCategories")
|
categoryItem("recentCategories")
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,40 @@ class CategoryClientTest {
|
||||||
.test()
|
.test()
|
||||||
.assertValues(emptyList())
|
.assertValues(emptyList())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun getCategoriesByNameFound() {
|
||||||
|
val mockResponse = withMockResponse("Category:Test")
|
||||||
|
whenever(categoryInterface.getCategoriesByName(anyString(), anyString(),
|
||||||
|
anyInt(), anyInt()))
|
||||||
|
.thenReturn(Single.just(mockResponse))
|
||||||
|
categoryClient.getCategoriesByName("tes", "tes", 10)
|
||||||
|
.test()
|
||||||
|
.assertValues(listOf(CategoryItem("Test", "",
|
||||||
|
"", false)))
|
||||||
|
categoryClient.getCategoriesByName("tes" , "tes",
|
||||||
|
10, 10)
|
||||||
|
.test()
|
||||||
|
.assertValues(listOf(CategoryItem("Test", "",
|
||||||
|
"", false)))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun getCategoriesByNameNull() {
|
||||||
|
val mockResponse = withNullPages()
|
||||||
|
whenever(categoryInterface.getCategoriesByName(anyString(), anyString(),
|
||||||
|
anyInt(), anyInt()))
|
||||||
|
.thenReturn(Single.just(mockResponse))
|
||||||
|
categoryClient.getCategoriesByName("tes", "tes",
|
||||||
|
10)
|
||||||
|
.test()
|
||||||
|
.assertValues(emptyList())
|
||||||
|
categoryClient.getCategoriesByName("tes", "tes",
|
||||||
|
10, 10)
|
||||||
|
.test()
|
||||||
|
.assertValues(emptyList())
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun getParentCategoryListFound() {
|
fun getParentCategoryListFound() {
|
||||||
val mockResponse = withMockResponse("Category:Test")
|
val mockResponse = withMockResponse("Category:Test")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue