#3468 Switch from RvRenderer to AdapterDelegates - replace SearchCategoriesRenderer

This commit is contained in:
Sean Mac Gillicuddy 2020-05-13 11:37:17 +01:00
parent f083eb653e
commit 1c50591887
10 changed files with 54 additions and 121 deletions

View file

@ -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, ""));
}
}
}

View file

@ -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)

View file

@ -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 }
)

View file

@ -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)
}
}

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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();
}
}

View file

@ -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;

View file

@ -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);

View file

@ -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, ""));
}
}
}