From 74f073519ccd5e1d0c3b887e4ac2f96f55975a38 Mon Sep 17 00:00:00 2001 From: Vairavan Srinivasan Date: Mon, 11 Nov 2019 20:19:21 -0500 Subject: [PATCH] Add EpoxyModelWithLayoutView as a base for models with static layouts. --- .../epoxy/EpoxyModelWithLayoutView.java | 32 +++++++++++++++++++ .../com/airbnb/epoxy/HiddenEpoxyModel.java | 12 +++---- .../com/airbnb/epoxy/SimpleEpoxyModel.java | 16 ++-------- .../epoxy/EpoxyModelWithLayoutViewTest.kt | 20 ++++++++++++ 4 files changed, 58 insertions(+), 22 deletions(-) create mode 100755 epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyModelWithLayoutView.java mode change 100644 => 100755 epoxy-adapter/src/main/java/com/airbnb/epoxy/HiddenEpoxyModel.java create mode 100644 epoxy-adapter/src/test/java/com/airbnb/epoxy/EpoxyModelWithLayoutViewTest.kt diff --git a/epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyModelWithLayoutView.java b/epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyModelWithLayoutView.java new file mode 100755 index 0000000000..eae67c0d7f --- /dev/null +++ b/epoxy-adapter/src/main/java/com/airbnb/epoxy/EpoxyModelWithLayoutView.java @@ -0,0 +1,32 @@ +package com.airbnb.epoxy; + +import android.view.View; + +import androidx.annotation.LayoutRes; + +/** + * An {@link EpoxyModel} extension to abstract setup and usage of layout resource and span size. + * + * @see HiddenEpoxyModel + * @see SimpleEpoxyModel + */ +public class EpoxyModelWithLayoutView extends EpoxyModel { + + @LayoutRes protected final int layoutRes; + protected int spanCount; + + public EpoxyModelWithLayoutView(@LayoutRes int layoutRes, int spanCount) { + this.layoutRes = layoutRes; + this.spanCount = spanCount; + } + + @Override + protected int getDefaultLayout() { + return layoutRes; + } + + @Override + public int getSpanSize(int totalSpanCount, int position, int itemCount) { + return spanCount; + } +} diff --git a/epoxy-adapter/src/main/java/com/airbnb/epoxy/HiddenEpoxyModel.java b/epoxy-adapter/src/main/java/com/airbnb/epoxy/HiddenEpoxyModel.java old mode 100644 new mode 100755 index d584caf4f5..637b2dc86c --- a/epoxy-adapter/src/main/java/com/airbnb/epoxy/HiddenEpoxyModel.java +++ b/epoxy-adapter/src/main/java/com/airbnb/epoxy/HiddenEpoxyModel.java @@ -10,14 +10,10 @@ * Using a zero height and width {@link Space} view, as well as 0 span size, to exclude itself from * view. */ -class HiddenEpoxyModel extends EpoxyModel { - @Override - public int getDefaultLayout() { - return R.layout.view_holder_empty_view; - } +class HiddenEpoxyModel extends EpoxyModelWithLayoutView { - @Override - public int getSpanSize(int spanCount, int position, int itemCount) { - return 0; + HiddenEpoxyModel() { + super(R.layout.view_holder_empty_view, 0 /*spanCount*/); } + } diff --git a/epoxy-adapter/src/main/java/com/airbnb/epoxy/SimpleEpoxyModel.java b/epoxy-adapter/src/main/java/com/airbnb/epoxy/SimpleEpoxyModel.java index 7af62ab667..566c0dc022 100644 --- a/epoxy-adapter/src/main/java/com/airbnb/epoxy/SimpleEpoxyModel.java +++ b/epoxy-adapter/src/main/java/com/airbnb/epoxy/SimpleEpoxyModel.java @@ -12,13 +12,11 @@ * subclass. This is useful for static layouts. You can also specify an onClick listener and the * span size. */ -public class SimpleEpoxyModel extends EpoxyModel { - @LayoutRes private final int layoutRes; +public class SimpleEpoxyModel extends EpoxyModelWithLayoutView { private View.OnClickListener onClickListener; - private int spanCount = 1; public SimpleEpoxyModel(@LayoutRes int layoutRes) { - this.layoutRes = layoutRes; + super(layoutRes, 1 /*spanCount*/); } public SimpleEpoxyModel onClick(View.OnClickListener listener) { @@ -46,16 +44,6 @@ public void unbind(@NonNull View view) { view.setOnClickListener(null); } - @Override - protected int getDefaultLayout() { - return layoutRes; - } - - @Override - public int getSpanSize(int totalSpanCount, int position, int itemCount) { - return spanCount; - } - @Override public boolean equals(Object o) { if (this == o) { diff --git a/epoxy-adapter/src/test/java/com/airbnb/epoxy/EpoxyModelWithLayoutViewTest.kt b/epoxy-adapter/src/test/java/com/airbnb/epoxy/EpoxyModelWithLayoutViewTest.kt new file mode 100644 index 0000000000..ffdbda592b --- /dev/null +++ b/epoxy-adapter/src/test/java/com/airbnb/epoxy/EpoxyModelWithLayoutViewTest.kt @@ -0,0 +1,20 @@ +package com.airbnb.epoxy + +import android.widget.Space +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 + +@RunWith(JUnit4::class) +class EpoxyModelWithLayoutViewTest { + + @Test + fun `EpoxyModelWithLayoutView relays specified values from constructor`() { + val layoutRes = 12 + val spanCount = 4 + val model = EpoxyModelWithLayoutView(layoutRes, spanCount) + + assert(model.defaultLayout == layoutRes) + assert(model.getSpanSize(100, 0, 10) == spanCount) + } +}