diff options
Diffstat (limited to 'app/src/main/java/com/wireguard/android/databinding')
3 files changed, 22 insertions, 164 deletions
diff --git a/app/src/main/java/com/wireguard/android/databinding/BindingAdapters.java b/app/src/main/java/com/wireguard/android/databinding/BindingAdapters.java index b7c44116..b3a8ae25 100644 --- a/app/src/main/java/com/wireguard/android/databinding/BindingAdapters.java +++ b/app/src/main/java/com/wireguard/android/databinding/BindingAdapters.java @@ -13,10 +13,10 @@ import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.text.InputFilter; import android.widget.LinearLayout; -import android.widget.ListView; import android.widget.TextView; import com.wireguard.android.R; +import com.wireguard.android.databinding.ObservableKeyedRecyclerViewAdapter.RowConfigurationHandler; import com.wireguard.android.util.ObservableKeyedList; import com.wireguard.android.widget.ToggleSwitch; import com.wireguard.android.widget.ToggleSwitch.OnBeforeCheckedChangeListener; @@ -67,37 +67,11 @@ public final class BindingAdapters { listener.setList(newList); } - @BindingAdapter({"items", "layout"}) - public static <K, E extends Keyed<? extends K>> - void setItems(final ListView view, - final ObservableKeyedList<K, E> oldList, final int oldLayoutId, - final ObservableKeyedList<K, E> newList, final int newLayoutId) { - if (oldList == newList && oldLayoutId == newLayoutId) - return; - // The ListAdapter interface is not generic, so this cannot be checked. - @SuppressWarnings("unchecked") ObservableKeyedListAdapter<K, E> adapter = - (ObservableKeyedListAdapter<K, E>) view.getAdapter(); - // If the layout changes, any existing adapter must be replaced. - if (adapter != null && oldList != null && oldLayoutId != newLayoutId) { - adapter.setList(null); - adapter = null; - } - // Avoid setting an adapter when there is no new list or layout. - if (newList == null || newLayoutId == 0) - return; - if (adapter == null) { - adapter = new ObservableKeyedListAdapter<>(view.getContext(), newLayoutId, newList); - view.setAdapter(adapter); - } - // Either the list changed, or this is an entirely new listener because the layout changed. - adapter.setList(newList); - } - - @BindingAdapter({"items", "layout"}) + @BindingAdapter(requireAll = false, value = {"items", "layout", "configurationHandler"}) public static <K, E extends Keyed<? extends K>> void setItems(final RecyclerView view, - final ObservableKeyedList<K, E> oldList, final int oldLayoutId, - final ObservableKeyedList<K, E> newList, final int newLayoutId) { + final ObservableKeyedList<K, E> oldList, final int oldLayoutId, final RowConfigurationHandler oldRowConfigurationHandler, + final ObservableKeyedList<K, E> newList, final int newLayoutId, final RowConfigurationHandler newRowConfigurationHandler) { if (view.getLayoutManager() == null) view.setLayoutManager(new LinearLayoutManager(view.getContext(), RecyclerView.VERTICAL, false)); @@ -118,6 +92,8 @@ public final class BindingAdapters { adapter = new ObservableKeyedRecyclerViewAdapter<>(view.getContext(), newLayoutId, newList); view.setAdapter(adapter); } + + adapter.setRowConfigurationHandler(newRowConfigurationHandler); // Either the list changed, or this is an entirely new listener because the layout changed. adapter.setList(newList); } diff --git a/app/src/main/java/com/wireguard/android/databinding/ObservableKeyedListAdapter.java b/app/src/main/java/com/wireguard/android/databinding/ObservableKeyedListAdapter.java deleted file mode 100644 index 9cf9490f..00000000 --- a/app/src/main/java/com/wireguard/android/databinding/ObservableKeyedListAdapter.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright © 2018 Samuel Holland <samuel@sholland.org> - * Copyright © 2018 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ - -package com.wireguard.android.databinding; - -import android.content.Context; -import android.databinding.DataBindingUtil; -import android.databinding.ObservableList; -import android.databinding.ViewDataBinding; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; - -import com.wireguard.android.BR; -import com.wireguard.util.Keyed; -import com.wireguard.android.util.ObservableKeyedList; - -import java.lang.ref.WeakReference; - -/** - * A generic {@code ListAdapter} backed by a {@code ObservableKeyedList}. - */ - -class ObservableKeyedListAdapter<K, E extends Keyed<? extends K>> extends BaseAdapter { - private final OnListChangedCallback<E> callback = new OnListChangedCallback<>(this); - private final int layoutId; - private final LayoutInflater layoutInflater; - private ObservableKeyedList<K, E> list; - - ObservableKeyedListAdapter(final Context context, final int layoutId, - final ObservableKeyedList<K, E> list) { - this.layoutId = layoutId; - layoutInflater = LayoutInflater.from(context); - setList(list); - } - - @Override - public int getCount() { - return list != null ? list.size() : 0; - } - - @Override - public E getItem(final int position) { - if (list == null || position < 0 || position >= list.size()) - return null; - return list.get(position); - } - - @Override - public long getItemId(final int position) { - final K key = getKey(position); - return key != null ? key.hashCode() : -1; - } - - private K getKey(final int position) { - final E item = getItem(position); - return item != null ? item.getKey() : null; - } - - @Override - public View getView(final int position, final View convertView, final ViewGroup parent) { - ViewDataBinding binding = DataBindingUtil.getBinding(convertView); - if (binding == null) - binding = DataBindingUtil.inflate(layoutInflater, layoutId, parent, false); - binding.setVariable(BR.collection, list); - binding.setVariable(BR.key, getKey(position)); - binding.setVariable(BR.item, getItem(position)); - binding.executePendingBindings(); - return binding.getRoot(); - } - - @Override - public boolean hasStableIds() { - return true; - } - - void setList(final ObservableKeyedList<K, E> newList) { - if (list != null) - list.removeOnListChangedCallback(callback); - list = newList; - if (list != null) { - list.addOnListChangedCallback(callback); - } - notifyDataSetChanged(); - } - - private static final class OnListChangedCallback<E extends Keyed<?>> - extends ObservableList.OnListChangedCallback<ObservableList<E>> { - - private final WeakReference<ObservableKeyedListAdapter<?, E>> weakAdapter; - - private OnListChangedCallback(final ObservableKeyedListAdapter<?, E> adapter) { - weakAdapter = new WeakReference<>(adapter); - } - - @Override - public void onChanged(final ObservableList<E> sender) { - final ObservableKeyedListAdapter adapter = weakAdapter.get(); - if (adapter != null) - adapter.notifyDataSetChanged(); - else - sender.removeOnListChangedCallback(this); - } - - @Override - public void onItemRangeChanged(final ObservableList<E> sender, final int positionStart, - final int itemCount) { - onChanged(sender); - } - - @Override - public void onItemRangeInserted(final ObservableList<E> sender, final int positionStart, - final int itemCount) { - onChanged(sender); - } - - @Override - public void onItemRangeMoved(final ObservableList<E> sender, final int fromPosition, - final int toPosition, final int itemCount) { - onChanged(sender); - } - - @Override - public void onItemRangeRemoved(final ObservableList<E> sender, final int positionStart, - final int itemCount) { - onChanged(sender); - } - } -} diff --git a/app/src/main/java/com/wireguard/android/databinding/ObservableKeyedRecyclerViewAdapter.java b/app/src/main/java/com/wireguard/android/databinding/ObservableKeyedRecyclerViewAdapter.java index 4a5ac3d2..79168e48 100644 --- a/app/src/main/java/com/wireguard/android/databinding/ObservableKeyedRecyclerViewAdapter.java +++ b/app/src/main/java/com/wireguard/android/databinding/ObservableKeyedRecyclerViewAdapter.java @@ -14,6 +14,7 @@ import android.support.annotation.NonNull; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.Adapter; import android.view.LayoutInflater; +import android.view.View; import android.view.ViewGroup; import com.wireguard.android.BR; @@ -26,12 +27,13 @@ import java.lang.ref.WeakReference; * A generic {@code RecyclerView.Adapter} backed by a {@code ObservableKeyedList}. */ -class ObservableKeyedRecyclerViewAdapter<K, E extends Keyed<? extends K>> extends Adapter<ObservableKeyedRecyclerViewAdapter.ViewHolder> { +public class ObservableKeyedRecyclerViewAdapter<K, E extends Keyed<? extends K>> extends Adapter<ObservableKeyedRecyclerViewAdapter.ViewHolder> { private final OnListChangedCallback<E> callback = new OnListChangedCallback<>(this); private final int layoutId; private final LayoutInflater layoutInflater; private ObservableKeyedList<K, E> list; + private RowConfigurationHandler rowConfigurationHandler; ObservableKeyedRecyclerViewAdapter(final Context context, final int layoutId, final ObservableKeyedList<K, E> list) { @@ -67,12 +69,17 @@ class ObservableKeyedRecyclerViewAdapter<K, E extends Keyed<? extends K>> extend return new ViewHolder(DataBindingUtil.inflate(layoutInflater, layoutId, parent, false)); } + @SuppressWarnings("unchecked") @Override public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) { holder.binding.setVariable(BR.collection, list); holder.binding.setVariable(BR.key, getKey(position)); holder.binding.setVariable(BR.item, getItem(position)); holder.binding.executePendingBindings(); + + if (rowConfigurationHandler != null) { + rowConfigurationHandler.onConfigureRow(holder.binding.getRoot(), getItem(position), position); + } } void setList(final ObservableKeyedList<K, E> newList) { @@ -85,6 +92,10 @@ class ObservableKeyedRecyclerViewAdapter<K, E extends Keyed<? extends K>> extend notifyDataSetChanged(); } + void setRowConfigurationHandler(final RowConfigurationHandler rowConfigurationHandler) { + this.rowConfigurationHandler = rowConfigurationHandler; + } + private static final class OnListChangedCallback<E extends Keyed<?>> extends ObservableList.OnListChangedCallback<ObservableList<E>> { @@ -138,4 +149,8 @@ class ObservableKeyedRecyclerViewAdapter<K, E extends Keyed<? extends K>> extend } } + public interface RowConfigurationHandler<T> { + void onConfigureRow(View view, T item, int position); + } + } |