mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 20:33:53 +01:00
#3468 Switch from RvRenderer to AdapterDelegates - replace SearchCategoriesRenderer
This commit is contained in:
parent
f083eb653e
commit
1c50591887
10 changed files with 54 additions and 121 deletions
|
|
@ -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, ""));
|
||||
}
|
||||
}
|
||||
|
|
@ -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<String> 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<String> 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<String>::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<String>::new, ArrayList::add)
|
||||
|
|
|
|||
|
|
@ -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<String>(
|
||||
searchCategoryDelegate(onCateoryClicked),
|
||||
areItemsTheSame = { oldItem, newItem -> oldItem == newItem }
|
||||
)
|
||||
|
|
@ -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<String, String>(R.layout.item_recent_searches) {
|
||||
containerView.setOnClickListener { onCategoryClicked(item) }
|
||||
bind {
|
||||
textView1.text = item.substringAfter(CategoryClient.CATEGORY_PREFIX)
|
||||
}
|
||||
}
|
||||
|
|
@ -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<String> create(List<String> searchImageItemList) {
|
||||
RendererBuilder<String> builder = new RendererBuilder<String>().bind(String.class, new SearchCategoriesRenderer(listener));
|
||||
ListAdapteeCollection<String> collection = new ListAdapteeCollection<>(
|
||||
searchImageItemList != null ? searchImageItemList : Collections.<String>emptyList());
|
||||
return new RVRendererAdapter<>(builder, collection);
|
||||
}
|
||||
}
|
||||
|
|
@ -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<String> {
|
||||
@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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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<String> categoriesAdapter;
|
||||
private SearchCategoriesAdapter categoriesAdapter;
|
||||
private List<String> 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<String> 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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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, ""));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue