#3468 Switch from RvRenderer to AdapterDelegates - replace UploadDepictsRenderer

This commit is contained in:
Sean Mac Gillicuddy 2020-05-13 12:34:24 +01:00
parent 8a39fddde8
commit 456b86454e
5 changed files with 50 additions and 149 deletions

View file

@ -1,31 +0,0 @@
package fr.free.nrw.commons.upload;
import com.pedrogomez.renderers.ListAdapteeCollection;
import com.pedrogomez.renderers.RVRendererAdapter;
import com.pedrogomez.renderers.RendererBuilder;
import java.util.Collections;
import java.util.List;
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem;
import fr.free.nrw.commons.upload.structure.depictions.UploadDepictsCallback;
/**
* Adapter Factory for DepictsClicked Listener
*/
public class UploadDepictsAdapterFactory {
private final UploadDepictsCallback listener;
public UploadDepictsAdapterFactory(UploadDepictsCallback listener) {
this.listener = listener;
}
public RVRendererAdapter<DepictedItem> create(List<DepictedItem> itemList) {
RendererBuilder<DepictedItem> builder = new RendererBuilder<DepictedItem>()
.bind(DepictedItem.class, new UploadDepictsRenderer(listener));
ListAdapteeCollection<DepictedItem> collection = new ListAdapteeCollection<>(
itemList != null ? itemList : Collections.emptyList());
return new RVRendererAdapter<>(builder, collection);
}
}

View file

@ -1,87 +0,0 @@
package fr.free.nrw.commons.upload;
import android.net.Uri;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;
import butterknife.BindView;
import butterknife.ButterKnife;
import com.facebook.common.util.UriUtil;
import com.facebook.drawee.view.SimpleDraweeView;
import com.pedrogomez.renderers.Renderer;
import fr.free.nrw.commons.R;
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem;
import fr.free.nrw.commons.upload.structure.depictions.UploadDepictsCallback;
/**
* Depicts Renderer for setting up inflating layout,
* and setting views for the layout of each depicted Item
*/
public class UploadDepictsRenderer extends Renderer<DepictedItem> {
private final UploadDepictsCallback listener;
@BindView(R.id.depict_checkbox)
CheckBox checkedView;
@BindView(R.id.depicts_label)
TextView depictsLabel;
@BindView(R.id.description) TextView description;
@BindView(R.id.depicted_image)
SimpleDraweeView imageView;
public UploadDepictsRenderer(UploadDepictsCallback listener) {
this.listener = listener;
}
@Override
protected void setUpView(View rootView) {
ButterKnife.bind(this, rootView);
}
/**
* Setup OnClicklisteners on the views
*/
@Override
protected void hookListeners(View rootView) {
rootView.setOnClickListener(v -> {
DepictedItem item = getContent();
item.setSelected(!item.isSelected());
checkedView.setChecked(item.isSelected());
if (listener != null) {
listener.depictsClicked(item);
}
});
checkedView.setOnClickListener(v -> {
DepictedItem item = getContent();
item.setSelected(!item.isSelected());
checkedView.setChecked(item.isSelected());
if (listener != null) {
listener.depictsClicked(item);
}
});
}
@Override
protected View inflate(LayoutInflater inflater, ViewGroup parent) {
return inflater.inflate(R.layout.layout_upload_depicts_item, parent, false);
}
/**
* initialise views for every item in the adapter
*/
@Override
public void render() {
DepictedItem item = getContent();
checkedView.setChecked(item.isSelected());
depictsLabel.setText(item.getName());
description.setText(item.getDescription());
final String imageUrl = item.getImageUrl();
if (TextUtils.isEmpty(imageUrl)) {
imageView.setImageURI(UriUtil.getUriForResourceId(R.drawable.ic_wikidata_logo_24dp));
} else {
imageView.setImageURI(Uri.parse(imageUrl));
}
}
}

View file

@ -1,7 +1,6 @@
package fr.free.nrw.commons.upload.depicts; package fr.free.nrw.commons.upload.depicts;
import android.os.Bundle; import android.os.Bundle;
import android.util.Pair;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
@ -18,27 +17,23 @@ import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout; import com.google.android.material.textfield.TextInputLayout;
import com.jakewharton.rxbinding2.view.RxView; import com.jakewharton.rxbinding2.view.RxView;
import com.jakewharton.rxbinding2.widget.RxTextView; import com.jakewharton.rxbinding2.widget.RxTextView;
import com.pedrogomez.renderers.RVRendererAdapter;
import fr.free.nrw.commons.R; import fr.free.nrw.commons.R;
import fr.free.nrw.commons.upload.UploadBaseFragment; import fr.free.nrw.commons.upload.UploadBaseFragment;
import fr.free.nrw.commons.upload.UploadDepictsAdapterFactory;
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem; import fr.free.nrw.commons.upload.structure.depictions.DepictedItem;
import fr.free.nrw.commons.upload.structure.depictions.UploadDepictsCallback;
import fr.free.nrw.commons.utils.DialogUtil; import fr.free.nrw.commons.utils.DialogUtil;
import io.reactivex.android.schedulers.AndroidSchedulers; import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable; import io.reactivex.disposables.Disposable;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.inject.Inject; import javax.inject.Inject;
import org.jetbrains.annotations.NotNull; import kotlin.Unit;
import timber.log.Timber; import timber.log.Timber;
/** /**
* Fragment for showing depicted items list in Upload activity after media details * Fragment for showing depicted items list in Upload activity after media details
*/ */
public class DepictsFragment extends UploadBaseFragment implements DepictsContract.View, UploadDepictsCallback { public class DepictsFragment extends UploadBaseFragment implements DepictsContract.View {
@BindView(R.id.depicts_title) @BindView(R.id.depicts_title)
TextView depictsTitle; TextView depictsTitle;
@ -53,7 +48,7 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra
@Inject @Inject
DepictsContract.UserActionListener presenter; DepictsContract.UserActionListener presenter;
private RVRendererAdapter<DepictedItem> adapter; private UploadDepictsAdapter adapter;
private Disposable subscribe; private Disposable subscribe;
@Nullable @Nullable
@ -86,8 +81,10 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra
* Initialise recyclerView and set adapter * Initialise recyclerView and set adapter
*/ */
private void initRecyclerView() { private void initRecyclerView() {
adapter = new UploadDepictsAdapterFactory(this) adapter = new UploadDepictsAdapter(item -> {
.create(new ArrayList<>()); presenter.onDepictItemClicked(item);
return Unit.INSTANCE;
});
depictsRecyclerView.setLayoutManager(new LinearLayoutManager(getContext())); depictsRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
depictsRecyclerView.setAdapter(adapter); depictsRecyclerView.setAdapter(adapter);
} }
@ -137,22 +134,7 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra
@Override @Override
public void setDepictsList(List<DepictedItem> depictedItemList) { public void setDepictsList(List<DepictedItem> depictedItemList) {
adapter.clear(); adapter.setItems(depictedItemList);
if (depictedItemList != null) {
adapter.addAll(depictedItemList);
adapter.notifyDataSetChanged();
}
}
@Nullable
private Pair<DepictedItem,Integer> returnItemAndPosition(@NotNull DepictedItem depictedItem) {
for (int i = 0; i < adapter.getItemCount(); i++) {
final DepictedItem item = adapter.getItem(i);
if(item.getId().equals(depictedItem.getId())){
return new Pair<>(item, i);
}
}
return null;
} }
@OnClick(R.id.depicts_next) @OnClick(R.id.depicts_next)
@ -165,11 +147,6 @@ public class DepictsFragment extends UploadBaseFragment implements DepictsContra
callback.onPreviousButtonClicked(callback.getIndexInViewFlipper(this)); callback.onPreviousButtonClicked(callback.getIndexInViewFlipper(this));
} }
@Override
public void depictsClicked(DepictedItem item) {
presenter.onDepictItemClicked(item);
}
/** /**
* Text change listener for the edit text view of depicts * Text change listener for the edit text view of depicts
*/ */

View file

@ -0,0 +1,10 @@
package fr.free.nrw.commons.upload.depicts
import fr.free.nrw.commons.upload.categories.BaseDelegateAdapter
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
class UploadDepictsAdapter(onDepictsClicked: (DepictedItem) -> Unit) :
BaseDelegateAdapter<DepictedItem>(
uploadDepictsDelegate(onDepictsClicked),
areItemsTheSame = { oldItem, newItem -> oldItem.id == newItem.id }
)

View file

@ -0,0 +1,32 @@
package fr.free.nrw.commons.upload.depicts
import android.net.Uri
import android.text.TextUtils
import android.view.View
import com.hannesdorfmann.adapterdelegates4.dsl.adapterDelegateLayoutContainer
import fr.free.nrw.commons.R
import fr.free.nrw.commons.upload.structure.depictions.DepictedItem
import kotlinx.android.synthetic.main.layout_upload_depicts_item.*
fun uploadDepictsDelegate(onDepictClicked: (DepictedItem) -> Unit) =
adapterDelegateLayoutContainer<DepictedItem, DepictedItem>(R.layout.layout_upload_depicts_item) {
val onClickListener = { _: View? ->
item.isSelected = !item.isSelected
depict_checkbox.isChecked = item.isSelected
onDepictClicked(item)
}
containerView.setOnClickListener(onClickListener)
depict_checkbox.setOnClickListener(onClickListener)
bind {
depict_checkbox.isChecked = item.isSelected
depicts_label.text = item.name
description.text = item.description
val imageUrl = item.imageUrl
if (TextUtils.isEmpty(imageUrl)) {
depicted_image.setActualImageResource(R.drawable.ic_wikidata_logo_24dp)
} else {
depicted_image.setImageURI(Uri.parse(imageUrl))
}
}
}