diff --git a/app/src/main/java/fr/free/nrw/commons/category/CategoryClient.java b/app/src/main/java/fr/free/nrw/commons/category/CategoryClient.java index 7a4d1718b..597e03ba6 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/CategoryClient.java +++ b/app/src/main/java/fr/free/nrw/commons/category/CategoryClient.java @@ -21,6 +21,7 @@ import timber.log.Timber; @Singleton public class CategoryClient { + public static final String CATEGORY_PREFIX = "Category:"; private final CategoryInterface CategoryInterface; @Inject @@ -120,6 +121,6 @@ public class CategoryClient { }) .map(MwQueryPage::title) .doOnEach(s -> Timber.d("Category returned: %s", s)) - .map(cat -> cat.replace("Category:", "")); + .map(cat -> cat.replace(CATEGORY_PREFIX, "")); } -} \ No newline at end of file +} diff --git a/app/src/main/java/fr/free/nrw/commons/category/SubCategoryListFragment.java b/app/src/main/java/fr/free/nrw/commons/category/SubCategoryListFragment.java index 21587bc12..a7c5e647c 100644 --- a/app/src/main/java/fr/free/nrw/commons/category/SubCategoryListFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/category/SubCategoryListFragment.java @@ -17,10 +17,9 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import butterknife.BindView; import butterknife.ButterKnife; -import com.pedrogomez.renderers.RVRendererAdapter; import fr.free.nrw.commons.R; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; -import fr.free.nrw.commons.explore.categories.SearchCategoriesAdapterFactory; +import fr.free.nrw.commons.explore.categories.SearchCategoriesAdapter; import fr.free.nrw.commons.utils.NetworkUtils; import fr.free.nrw.commons.utils.ViewUtil; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -28,6 +27,7 @@ import io.reactivex.schedulers.Schedulers; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; +import kotlin.Unit; import timber.log.Timber; /** @@ -46,16 +46,9 @@ public class SubCategoryListFragment extends CommonsDaggerSupportFragment { private String categoryName = null; @Inject CategoryClient categoryClient; - private RVRendererAdapter categoriesAdapter; + private SearchCategoriesAdapter categoriesAdapter; private boolean isParentCategory = true; - private final SearchCategoriesAdapterFactory adapterFactory = new SearchCategoriesAdapterFactory(item -> { - // Open SubCategory Details page - Intent intent = new Intent(getContext(), CategoryDetailsActivity.class); - intent.putExtra("categoryName", item); - getContext().startActivity(intent); - - }); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { @@ -70,8 +63,12 @@ public class SubCategoryListFragment extends CommonsDaggerSupportFragment { else{ categoriesRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2)); } - ArrayList items = new ArrayList<>(); - categoriesAdapter = adapterFactory.create(items); + categoriesAdapter = new SearchCategoriesAdapter(item->{ + Intent intent = new Intent(getContext(), CategoryDetailsActivity.class); + intent.putExtra("categoryName", item); + getContext().startActivity(intent); + return Unit.INSTANCE; + }); categoriesRecyclerView.setAdapter(categoriesAdapter); return rootView; } @@ -88,13 +85,15 @@ public class SubCategoryListFragment extends CommonsDaggerSupportFragment { } progressBar.setVisibility(View.VISIBLE); if (isParentCategory) { - compositeDisposable.add(categoryClient.getParentCategoryList("Category:"+categoryName) + compositeDisposable.add(categoryClient.getParentCategoryList( + CategoryClient.CATEGORY_PREFIX +categoryName) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .collect(ArrayList::new, ArrayList::add) .subscribe(this::handleSuccess, this::handleError)); } else { - compositeDisposable.add(categoryClient.getSubCategoryList("Category:"+categoryName) + compositeDisposable.add(categoryClient.getSubCategoryList( + CategoryClient.CATEGORY_PREFIX +categoryName) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .collect(ArrayList::new, ArrayList::add) diff --git a/app/src/main/java/fr/free/nrw/commons/explore/categories/SearchCategoriesAdapter.kt b/app/src/main/java/fr/free/nrw/commons/explore/categories/SearchCategoriesAdapter.kt new file mode 100644 index 000000000..6e7bae236 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/explore/categories/SearchCategoriesAdapter.kt @@ -0,0 +1,9 @@ +package fr.free.nrw.commons.explore.categories + +import fr.free.nrw.commons.upload.categories.BaseDelegateAdapter + + +class SearchCategoriesAdapter(onCateoryClicked: (String) -> Unit) : BaseDelegateAdapter( + searchCategoryDelegate(onCateoryClicked), + areItemsTheSame = { oldItem, newItem -> oldItem == newItem } +) diff --git a/app/src/main/java/fr/free/nrw/commons/explore/categories/SearchCategoriesAdapterDelegates.kt b/app/src/main/java/fr/free/nrw/commons/explore/categories/SearchCategoriesAdapterDelegates.kt new file mode 100644 index 000000000..35713d5b3 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/explore/categories/SearchCategoriesAdapterDelegates.kt @@ -0,0 +1,15 @@ +package fr.free.nrw.commons.explore.categories + +import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateLayoutContainer +import fr.free.nrw.commons.R +import fr.free.nrw.commons.category.CategoryClient +import kotlinx.android.synthetic.main.item_recent_searches.* + + +fun searchCategoryDelegate(onCategoryClicked: (String) -> Unit) = + adapterDelegateLayoutContainer(R.layout.item_recent_searches) { + containerView.setOnClickListener { onCategoryClicked(item) } + bind { + textView1.text = item.substringAfter(CategoryClient.CATEGORY_PREFIX) + } + } diff --git a/app/src/main/java/fr/free/nrw/commons/explore/categories/SearchCategoriesAdapterFactory.java b/app/src/main/java/fr/free/nrw/commons/explore/categories/SearchCategoriesAdapterFactory.java deleted file mode 100644 index 3ac75e07e..000000000 --- a/app/src/main/java/fr/free/nrw/commons/explore/categories/SearchCategoriesAdapterFactory.java +++ /dev/null @@ -1,32 +0,0 @@ -package fr.free.nrw.commons.explore.categories; - -import com.pedrogomez.renderers.ListAdapteeCollection; -import com.pedrogomez.renderers.RVRendererAdapter; -import com.pedrogomez.renderers.RendererBuilder; - -import java.util.Collections; -import java.util.List; - -/** - * This class helps in creating adapter for categoriesRecyclerView in SearchCategoryFragment, - * implementing onClicks on categoriesRecyclerView Items - **/ -public class SearchCategoriesAdapterFactory { - private final SearchCategoriesRenderer.CategoryClickedListener listener; - - public SearchCategoriesAdapterFactory(SearchCategoriesRenderer.CategoryClickedListener listener) { - this.listener = listener; - } - - /** - * This method creates a recyclerViewAdapter for Categories. - * @param searchImageItemList List of category name to be displayed - * @return categoriesAdapter - **/ - public RVRendererAdapter create(List searchImageItemList) { - RendererBuilder builder = new RendererBuilder().bind(String.class, new SearchCategoriesRenderer(listener)); - ListAdapteeCollection collection = new ListAdapteeCollection<>( - searchImageItemList != null ? searchImageItemList : Collections.emptyList()); - return new RVRendererAdapter<>(builder, collection); - } -} diff --git a/app/src/main/java/fr/free/nrw/commons/explore/categories/SearchCategoriesRenderer.java b/app/src/main/java/fr/free/nrw/commons/explore/categories/SearchCategoriesRenderer.java deleted file mode 100644 index 631b7b552..000000000 --- a/app/src/main/java/fr/free/nrw/commons/explore/categories/SearchCategoriesRenderer.java +++ /dev/null @@ -1,56 +0,0 @@ -package fr.free.nrw.commons.explore.categories; - -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; - -import com.pedrogomez.renderers.Renderer; - -import butterknife.BindView; -import butterknife.ButterKnife; -import fr.free.nrw.commons.R; - -/** - * presentation logic of individual category in search is handled here - **/ -class SearchCategoriesRenderer extends Renderer { - @BindView(R.id.textView1) TextView tvCategoryName; - - private final CategoryClickedListener listener; - - SearchCategoriesRenderer(CategoryClickedListener listener) { - this.listener = listener; - } - - @Override - protected View inflate(LayoutInflater layoutInflater, ViewGroup viewGroup) { - return layoutInflater.inflate(R.layout.item_recent_searches, viewGroup, false); - } - - @Override - protected void setUpView(View view) { - ButterKnife.bind(this, view); - } - - @Override - protected void hookListeners(View view) { - view.setOnClickListener(v -> { - String item = getContent(); - if (listener != null) { - listener.categoryClicked(item); - } - }); - } - - @Override - public void render() { - String item = getContent(); - tvCategoryName.setText(item.replaceFirst("^Category:", "")); - } - - public interface CategoryClickedListener { - void categoryClicked(String item); - } - -} diff --git a/app/src/main/java/fr/free/nrw/commons/explore/categories/SearchCategoryFragment.java b/app/src/main/java/fr/free/nrw/commons/explore/categories/SearchCategoryFragment.java index 6b437c254..038ff65e3 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/categories/SearchCategoryFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/explore/categories/SearchCategoryFragment.java @@ -16,7 +16,6 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import butterknife.BindView; import butterknife.ButterKnife; -import com.pedrogomez.renderers.RVRendererAdapter; import fr.free.nrw.commons.R; import fr.free.nrw.commons.category.CategoryClient; import fr.free.nrw.commons.category.CategoryDetailsActivity; @@ -33,6 +32,7 @@ import java.util.Date; import java.util.List; import javax.inject.Inject; import javax.inject.Named; +import kotlin.Unit; import timber.log.Timber; /** @@ -59,16 +59,9 @@ public class SearchCategoryFragment extends CommonsDaggerSupportFragment { @Named("default_preferences") JsonKvStore basicKvStore; - private RVRendererAdapter categoriesAdapter; + private SearchCategoriesAdapter categoriesAdapter; private List queryList = new ArrayList<>(); - private final SearchCategoriesAdapterFactory adapterFactory = new SearchCategoriesAdapterFactory(item -> { - // Called on Click of a individual category Item - // Open Category Details activity - CategoryDetailsActivity.startYourself(getContext(), item); - saveQuery(query); - }); - /** * This method saves Search Query in the Recent Searches Database. * @param query @@ -98,8 +91,11 @@ public class SearchCategoryFragment extends CommonsDaggerSupportFragment { else{ categoriesRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2)); } - ArrayList items = new ArrayList<>(); - categoriesAdapter = adapterFactory.create(items); + categoriesAdapter = new SearchCategoriesAdapter(item -> { + CategoryDetailsActivity.startYourself(getContext(), item); + saveQuery(query); + return Unit.INSTANCE; + }); categoriesRecyclerView.setAdapter(categoriesAdapter); categoriesRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override @@ -142,7 +138,9 @@ public class SearchCategoryFragment extends CommonsDaggerSupportFragment { * Adds 25 more results to existing search results */ public void addCategoriesToList(String query) { - if(isLoadingCategories) return; + if(isLoadingCategories) { + return; + } isLoadingCategories=true; this.query = query; bottomProgressBar.setVisibility(View.VISIBLE); @@ -163,7 +161,6 @@ public class SearchCategoryFragment extends CommonsDaggerSupportFragment { progressBar.setVisibility(View.GONE); bottomProgressBar.setVisibility(GONE); categoriesAdapter.addAll(mediaList); - categoriesAdapter.notifyDataSetChanged(); isLoadingCategories=false; } @@ -183,7 +180,6 @@ public class SearchCategoryFragment extends CommonsDaggerSupportFragment { bottomProgressBar.setVisibility(View.GONE); progressBar.setVisibility(GONE); categoriesAdapter.addAll(mediaList); - categoriesAdapter.notifyDataSetChanged(); } } diff --git a/app/src/main/java/fr/free/nrw/commons/explore/images/SearchImageFragment.java b/app/src/main/java/fr/free/nrw/commons/explore/images/SearchImageFragment.java index 8f328b7dc..d1af331b3 100644 --- a/app/src/main/java/fr/free/nrw/commons/explore/images/SearchImageFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/explore/images/SearchImageFragment.java @@ -17,7 +17,6 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import butterknife.BindView; import butterknife.ButterKnife; -import com.pedrogomez.renderers.RVRendererAdapter; import fr.free.nrw.commons.Media; import fr.free.nrw.commons.R; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java index fd511c176..de0f5dd2b 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailFragment.java @@ -42,6 +42,7 @@ import fr.free.nrw.commons.MediaDataExtractor; import fr.free.nrw.commons.R; import fr.free.nrw.commons.Utils; import fr.free.nrw.commons.auth.AccountUtil; +import fr.free.nrw.commons.category.CategoryClient; import fr.free.nrw.commons.category.CategoryDetailsActivity; import fr.free.nrw.commons.contributions.ContributionsFragment; import fr.free.nrw.commons.delete.DeleteHelper; @@ -619,7 +620,7 @@ public class MediaDetailFragment extends CommonsDaggerSupportFragment { if (categoriesLoaded && categoriesPresent) { textView.setOnClickListener(view -> { // Open Category Details page - String selectedCategoryTitle = "Category:" + catName; + String selectedCategoryTitle = CategoryClient.CATEGORY_PREFIX + catName; Intent intent = new Intent(getContext(), CategoryDetailsActivity.class); intent.putExtra("categoryName", selectedCategoryTitle); getContext().startActivity(intent); diff --git a/app/src/main/java/fr/free/nrw/commons/mwapi/CategoryApi.java b/app/src/main/java/fr/free/nrw/commons/mwapi/CategoryApi.java index 20aeb516f..851f0f294 100644 --- a/app/src/main/java/fr/free/nrw/commons/mwapi/CategoryApi.java +++ b/app/src/main/java/fr/free/nrw/commons/mwapi/CategoryApi.java @@ -2,6 +2,7 @@ package fr.free.nrw.commons.mwapi; import com.google.gson.Gson; +import fr.free.nrw.commons.category.CategoryClient; import org.wikipedia.dataclient.mwapi.MwQueryPage; import org.wikipedia.dataclient.mwapi.MwQueryResponse; @@ -60,7 +61,7 @@ public class CategoryApi { for (MwQueryPage page : apiResponse.query().pages()) { if (page.categories() != null) { for (MwQueryPage.Category category : page.categories()) { - categories.add(category.title().replace("Category:", "")); + categories.add(category.title().replace(CategoryClient.CATEGORY_PREFIX, "")); } } }