Replace selection interfaces w/ abstract classes.

Decouple selection tests from DocumentsUI package.

Bug: 64847011
Test: Passing.
Change-Id: Ic3ae145921aecbd0bca2bb673e9a522409e6fdbe
diff --git a/tests/unit/com/android/documentsui/DocsSelectionHelperTest.java b/tests/unit/com/android/documentsui/DocsSelectionHelperTest.java
index a1d8778..845a5da 100644
--- a/tests/unit/com/android/documentsui/DocsSelectionHelperTest.java
+++ b/tests/unit/com/android/documentsui/DocsSelectionHelperTest.java
@@ -104,7 +104,7 @@
         assertEquals(count, mCreated.size());
     }
 
-    private static final class TestSelectionManager implements SelectionHelper {
+    private static final class TestSelectionManager extends SelectionHelper {
 
         private boolean mCleared;
         private Map<String, Boolean> mSelected = new HashMap<>();
diff --git a/tests/unit/com/android/documentsui/dirlist/DragScrollListenerTest.java b/tests/unit/com/android/documentsui/dirlist/DragScrollListenerTest.java
index 01a24b5..b8b8a4b 100644
--- a/tests/unit/com/android/documentsui/dirlist/DragScrollListenerTest.java
+++ b/tests/unit/com/android/documentsui/dirlist/DragScrollListenerTest.java
@@ -24,17 +24,14 @@
 import android.view.View;
 
 import com.android.documentsui.ItemDragListener;
-import com.android.documentsui.selection.addons.ViewAutoScroller.Callbacks;
+import com.android.documentsui.selection.addons.ViewAutoScroller.ScrollerCallbacks;
 import com.android.documentsui.testing.DragEvents;
-import com.android.documentsui.testing.TestTimer;
 import com.android.documentsui.testing.Views;
 
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import java.util.Timer;
-
 @RunWith(AndroidJUnit4.class)
 @SmallTest
 public class DragScrollListenerTest {
@@ -204,7 +201,7 @@
         public void onDragEnded() {}
     }
 
-    private class TestScrollActionDelegate implements Callbacks {
+    private class TestScrollActionDelegate extends ScrollerCallbacks {
 
         private int mDy;
 
diff --git a/tests/unit/com/android/documentsui/selection/DefaultSelectionHelperTest.java b/tests/unit/com/android/documentsui/selection/DefaultSelectionHelperTest.java
index 5726135..301d9c9 100644
--- a/tests/unit/com/android/documentsui/selection/DefaultSelectionHelperTest.java
+++ b/tests/unit/com/android/documentsui/selection/DefaultSelectionHelperTest.java
@@ -21,8 +21,6 @@
 import android.support.test.runner.AndroidJUnit4;
 import android.util.SparseBooleanArray;
 
-import com.android.documentsui.dirlist.TestData;
-import com.android.documentsui.dirlist.TestDocumentsAdapter;
 import com.android.documentsui.selection.SelectionHelper.SelectionPredicate;
 
 import org.junit.Before;
@@ -38,18 +36,21 @@
 @SmallTest
 public class DefaultSelectionHelperTest {
 
-    private static final List<String> ITEMS = TestData.create(100);
-
-    private final Set<String> mIgnored = new HashSet<>();
-    private TestDocumentsAdapter mAdapter;
-    private DefaultSelectionHelper mManager;
+    private List<String> mItems;
+    private Set<String> mIgnored;
+    private TestAdapter mAdapter;
+    private DefaultSelectionHelper mHelper;
     private TestSelectionObserver mListener;
     private SelectionProbe mSelection;
 
     @Before
     public void setUp() throws Exception {
+        mIgnored = new HashSet<>();
+        mItems = TestAdapter.createItemList(100);
         mListener = new TestSelectionObserver();
-        mAdapter = new TestDocumentsAdapter(ITEMS);
+        mAdapter = new TestAdapter();
+        mAdapter.updateTestModelIds(mItems);
+
         SelectionPredicate canSelect = new SelectionPredicate() {
 
             @Override
@@ -62,34 +63,38 @@
                 throw new UnsupportedOperationException("Not implemented.");
             }
         };
-        mManager = new DefaultSelectionHelper(
-                DefaultSelectionHelper.MODE_MULTIPLE, mAdapter, mAdapter, canSelect);
-        mManager.addObserver(mListener);
+        mHelper = new DefaultSelectionHelper(
+                DefaultSelectionHelper.MODE_MULTIPLE,
+                mAdapter,
+                new TestStableIdProvider(mAdapter),
+                canSelect);
 
-        mSelection = new SelectionProbe(mManager, mListener);
+        mHelper.addObserver(mListener);
+
+        mSelection = new SelectionProbe(mHelper, mListener);
 
         mIgnored.clear();
     }
 
     @Test
     public void testSelect() {
-        mManager.select(ITEMS.get(7));
+        mHelper.select(mItems.get(7));
 
         mSelection.assertSelection(7);
     }
 
     @Test
     public void testDeselect() {
-        mManager.select(ITEMS.get(7));
-        mManager.deselect(ITEMS.get(7));
+        mHelper.select(mItems.get(7));
+        mHelper.deselect(mItems.get(7));
 
         mSelection.assertNoSelection();
     }
 
     @Test
     public void testSelection_DoNothingOnUnselectableItem() {
-        mIgnored.add(ITEMS.get(7));
-        boolean selected = mManager.select(ITEMS.get(7));
+        mIgnored.add(mItems.get(7));
+        boolean selected = mHelper.select(mItems.get(7));
 
         assertFalse(selected);
         mSelection.assertNoSelection();
@@ -97,7 +102,7 @@
 
     @Test
     public void testSelect_NotifiesListenersOfChange() {
-        mManager.select(ITEMS.get(7));
+        mHelper.select(mItems.get(7));
 
         mListener.assertSelectionChanged();
     }
@@ -105,57 +110,57 @@
 
     @Test
     public void testSelect_NotifiesAdapterOfSelect() {
-        mManager.select(ITEMS.get(7));
+        mHelper.select(mItems.get(7));
 
-        mAdapter.assertSelectionChanged(7);
+        mAdapter.assertNotifiedOfSelectionChange(7);
     }
 
     @Test
     public void testSelect_NotifiesAdapterOfDeselect() {
-        mManager.select(ITEMS.get(7));
-        mAdapter.resetSelectionChanged();
-        mManager.deselect(ITEMS.get(7));
-        mAdapter.assertSelectionChanged(7);
+        mHelper.select(mItems.get(7));
+        mAdapter.resetSelectionNotifications();
+        mHelper.deselect(mItems.get(7));
+        mAdapter.assertNotifiedOfSelectionChange(7);
     }
 
     @Test
     public void testDeselect_NotifiesSelectionChanged() {
-        mManager.select(ITEMS.get(7));
-        mManager.deselect(ITEMS.get(7));
+        mHelper.select(mItems.get(7));
+        mHelper.deselect(mItems.get(7));
 
         mListener.assertSelectionChanged();
     }
 
     @Test
     public void testSelection_PersistsOnUpdate() {
-        mManager.select(ITEMS.get(7));
-        mAdapter.updateTestModelIds(ITEMS);
+        mHelper.select(mItems.get(7));
+        mAdapter.updateTestModelIds(mItems);
 
         mSelection.assertSelection(7);
     }
 
     @Test
     public void testSelection_IntersectsWithNewDataSet() {
-        mManager.select(ITEMS.get(99));
-        mManager.select(ITEMS.get(7));
+        mHelper.select(mItems.get(99));
+        mHelper.select(mItems.get(7));
 
-        mAdapter.updateTestModelIds(TestData.create(50));
+        mAdapter.updateTestModelIds(TestAdapter.createItemList(50));
 
         mSelection.assertSelection(7);
     }
 
     @Test
     public void testSetItemsSelected() {
-        mManager.setItemsSelected(getStringIds(6, 7, 8), true);
+        mHelper.setItemsSelected(getStringIds(6, 7, 8), true);
 
         mSelection.assertRangeSelected(6, 8);
     }
 
     @Test
     public void testSetItemsSelected_SkipUnselectableItem() {
-        mIgnored.add(ITEMS.get(7));
+        mIgnored.add(mItems.get(7));
 
-        mManager.setItemsSelected(getStringIds(6, 7, 8), true);
+        mHelper.setItemsSelected(getStringIds(6, 7, 8), true);
 
         mSelection.assertSelected(6);
         mSelection.assertNotSelected(7);
@@ -164,17 +169,17 @@
 
     @Test
     public void testRangeSelection() {
-        mManager.startRange(15);
-        mManager.extendRange(19);
+        mHelper.startRange(15);
+        mHelper.extendRange(19);
         mSelection.assertRangeSelection(15, 19);
     }
 
     @Test
     public void testRangeSelection_SkipUnselectableItem() {
-        mIgnored.add(ITEMS.get(17));
+        mIgnored.add(mItems.get(17));
 
-        mManager.startRange(15);
-        mManager.extendRange(19);
+        mHelper.startRange(15);
+        mHelper.extendRange(19);
 
         mSelection.assertRangeSelected(15, 16);
         mSelection.assertNotSelected(17);
@@ -183,35 +188,35 @@
 
     @Test
     public void testRangeSelection_snapExpand() {
-        mManager.startRange(15);
-        mManager.extendRange(19);
-        mManager.extendRange(27);
+        mHelper.startRange(15);
+        mHelper.extendRange(19);
+        mHelper.extendRange(27);
         mSelection.assertRangeSelection(15, 27);
     }
 
     @Test
     public void testRangeSelection_snapContract() {
-        mManager.startRange(15);
-        mManager.extendRange(27);
-        mManager.extendRange(19);
+        mHelper.startRange(15);
+        mHelper.extendRange(27);
+        mHelper.extendRange(19);
         mSelection.assertRangeSelection(15, 19);
     }
 
     @Test
     public void testRangeSelection_snapInvert() {
-        mManager.startRange(15);
-        mManager.extendRange(27);
-        mManager.extendRange(3);
+        mHelper.startRange(15);
+        mHelper.extendRange(27);
+        mHelper.extendRange(3);
         mSelection.assertRangeSelection(3, 15);
     }
 
     @Test
     public void testRangeSelection_multiple() {
-        mManager.startRange(15);
-        mManager.extendRange(27);
-        mManager.endRange();
-        mManager.startRange(42);
-        mManager.extendRange(57);
+        mHelper.startRange(15);
+        mHelper.extendRange(27);
+        mHelper.endRange();
+        mHelper.startRange(42);
+        mHelper.extendRange(57);
         mSelection.assertSelectionSize(29);
         mSelection.assertRangeSelected(15, 27);
         mSelection.assertRangeSelected(42, 57);
@@ -219,21 +224,21 @@
 
     @Test
     public void testProvisionalRangeSelection() {
-        mManager.startRange(13);
-        mManager.extendProvisionalRange(15);
+        mHelper.startRange(13);
+        mHelper.extendProvisionalRange(15);
         mSelection.assertRangeSelection(13, 15);
-        mManager.getSelection().mergeProvisionalSelection();
-        mManager.endRange();
+        mHelper.getSelection().mergeProvisionalSelection();
+        mHelper.endRange();
         mSelection.assertSelectionSize(3);
     }
 
     @Test
     public void testProvisionalRangeSelection_endEarly() {
-        mManager.startRange(13);
-        mManager.extendProvisionalRange(15);
+        mHelper.startRange(13);
+        mHelper.extendProvisionalRange(15);
         mSelection.assertRangeSelection(13, 15);
 
-        mManager.endRange();
+        mHelper.endRange();
         // If we end range selection prematurely for provision selection, nothing should be selected
         // except the first item
         mSelection.assertSelectionSize(1);
@@ -241,24 +246,24 @@
 
     @Test
     public void testProvisionalRangeSelection_snapExpand() {
-        mManager.startRange(13);
-        mManager.extendProvisionalRange(15);
+        mHelper.startRange(13);
+        mHelper.extendProvisionalRange(15);
         mSelection.assertRangeSelection(13, 15);
-        mManager.getSelection().mergeProvisionalSelection();
-        mManager.extendRange(18);
+        mHelper.getSelection().mergeProvisionalSelection();
+        mHelper.extendRange(18);
         mSelection.assertRangeSelection(13, 18);
     }
 
     @Test
     public void testCombinationRangeSelection_IntersectsOldSelection() {
-        mManager.startRange(13);
-        mManager.extendRange(15);
+        mHelper.startRange(13);
+        mHelper.extendRange(15);
         mSelection.assertRangeSelection(13, 15);
 
-        mManager.startRange(11);
-        mManager.extendProvisionalRange(18);
+        mHelper.startRange(11);
+        mHelper.extendProvisionalRange(18);
         mSelection.assertRangeSelected(11, 18);
-        mManager.endRange();
+        mHelper.endRange();
         mSelection.assertRangeSelected(13, 15);
         mSelection.assertRangeSelected(11, 11);
         mSelection.assertSelectionSize(4);
@@ -266,12 +271,12 @@
 
     @Test
     public void testProvisionalSelection() {
-        Selection s = mManager.getSelection();
+        Selection s = mHelper.getSelection();
         mSelection.assertNoSelection();
 
         // Mimicking band selection case -- BandController notifies item callback by itself.
-        mListener.onItemStateChanged(ITEMS.get(1), true);
-        mListener.onItemStateChanged(ITEMS.get(2), true);
+        mListener.onItemStateChanged(mItems.get(1), true);
+        mListener.onItemStateChanged(mItems.get(2), true);
 
         SparseBooleanArray provisional = new SparseBooleanArray();
         provisional.append(1, true);
@@ -282,22 +287,22 @@
 
     @Test
     public void testProvisionalSelection_Replace() {
-        Selection s = mManager.getSelection();
+        Selection s = mHelper.getSelection();
 
         // Mimicking band selection case -- BandController notifies item callback by itself.
-        mListener.onItemStateChanged(ITEMS.get(1), true);
-        mListener.onItemStateChanged(ITEMS.get(2), true);
+        mListener.onItemStateChanged(mItems.get(1), true);
+        mListener.onItemStateChanged(mItems.get(2), true);
         SparseBooleanArray provisional = new SparseBooleanArray();
         provisional.append(1, true);
         provisional.append(2, true);
         s.setProvisionalSelection(getItemIds(provisional));
 
-        mListener.onItemStateChanged(ITEMS.get(1), false);
-        mListener.onItemStateChanged(ITEMS.get(2), false);
+        mListener.onItemStateChanged(mItems.get(1), false);
+        mListener.onItemStateChanged(mItems.get(2), false);
         provisional.clear();
 
-        mListener.onItemStateChanged(ITEMS.get(3), true);
-        mListener.onItemStateChanged(ITEMS.get(4), true);
+        mListener.onItemStateChanged(mItems.get(3), true);
+        mListener.onItemStateChanged(mItems.get(4), true);
         provisional.append(3, true);
         provisional.append(4, true);
         s.setProvisionalSelection(getItemIds(provisional));
@@ -306,21 +311,21 @@
 
     @Test
     public void testProvisionalSelection_IntersectsExistingProvisionalSelection() {
-        Selection s = mManager.getSelection();
+        Selection s = mHelper.getSelection();
 
         // Mimicking band selection case -- BandController notifies item callback by itself.
-        mListener.onItemStateChanged(ITEMS.get(1), true);
-        mListener.onItemStateChanged(ITEMS.get(2), true);
+        mListener.onItemStateChanged(mItems.get(1), true);
+        mListener.onItemStateChanged(mItems.get(2), true);
         SparseBooleanArray provisional = new SparseBooleanArray();
         provisional.append(1, true);
         provisional.append(2, true);
         s.setProvisionalSelection(getItemIds(provisional));
 
-        mListener.onItemStateChanged(ITEMS.get(1), false);
-        mListener.onItemStateChanged(ITEMS.get(2), false);
+        mListener.onItemStateChanged(mItems.get(1), false);
+        mListener.onItemStateChanged(mItems.get(2), false);
         provisional.clear();
 
-        mListener.onItemStateChanged(ITEMS.get(1), true);
+        mListener.onItemStateChanged(mItems.get(1), true);
         provisional.append(1, true);
         s.setProvisionalSelection(getItemIds(provisional));
         mSelection.assertSelection(1);
@@ -328,11 +333,11 @@
 
     @Test
     public void testProvisionalSelection_Apply() {
-        Selection s = mManager.getSelection();
+        Selection s = mHelper.getSelection();
 
         // Mimicking band selection case -- BandController notifies item callback by itself.
-        mListener.onItemStateChanged(ITEMS.get(1), true);
-        mListener.onItemStateChanged(ITEMS.get(2), true);
+        mListener.onItemStateChanged(mItems.get(1), true);
+        mListener.onItemStateChanged(mItems.get(2), true);
         SparseBooleanArray provisional = new SparseBooleanArray();
         provisional.append(1, true);
         provisional.append(2, true);
@@ -344,9 +349,9 @@
 
     @Test
     public void testProvisionalSelection_Cancel() {
-        mManager.select(ITEMS.get(1));
-        mManager.select(ITEMS.get(2));
-        Selection s = mManager.getSelection();
+        mHelper.select(mItems.get(1));
+        mHelper.select(mItems.get(2));
+        Selection s = mHelper.getSelection();
 
         SparseBooleanArray provisional = new SparseBooleanArray();
         provisional.append(3, true);
@@ -360,12 +365,12 @@
 
     @Test
     public void testProvisionalSelection_IntersectsAppliedSelection() {
-        mManager.select(ITEMS.get(1));
-        mManager.select(ITEMS.get(2));
-        Selection s = mManager.getSelection();
+        mHelper.select(mItems.get(1));
+        mHelper.select(mItems.get(2));
+        Selection s = mHelper.getSelection();
 
         // Mimicking band selection case -- BandController notifies item callback by itself.
-        mListener.onItemStateChanged(ITEMS.get(3), true);
+        mListener.onItemStateChanged(mItems.get(3), true);
         SparseBooleanArray provisional = new SparseBooleanArray();
         provisional.append(2, true);
         provisional.append(3, true);
@@ -373,21 +378,21 @@
         mSelection.assertSelection(1, 2, 3);
     }
 
-    private static Set<String> getItemIds(SparseBooleanArray selection) {
+    private Set<String> getItemIds(SparseBooleanArray selection) {
         Set<String> ids = new HashSet<>();
 
         int count = selection.size();
         for (int i = 0; i < count; ++i) {
-            ids.add(ITEMS.get(selection.keyAt(i)));
+            ids.add(mItems.get(selection.keyAt(i)));
         }
 
         return ids;
     }
 
-    private static Iterable<String> getStringIds(int... ids) {
+    private Iterable<String> getStringIds(int... ids) {
         List<String> stringIds = new ArrayList<>(ids.length);
         for (int id : ids) {
-            stringIds.add(ITEMS.get(id));
+            stringIds.add(mItems.get(id));
         }
         return stringIds;
     }
diff --git a/tests/unit/com/android/documentsui/selection/DefaultSelectionHelper_SingleSelectTest.java b/tests/unit/com/android/documentsui/selection/DefaultSelectionHelper_SingleSelectTest.java
index f1a1062..7f19ff4 100644
--- a/tests/unit/com/android/documentsui/selection/DefaultSelectionHelper_SingleSelectTest.java
+++ b/tests/unit/com/android/documentsui/selection/DefaultSelectionHelper_SingleSelectTest.java
@@ -21,9 +21,6 @@
 import android.support.test.filters.SmallTest;
 import android.support.test.runner.AndroidJUnit4;
 
-import com.android.documentsui.dirlist.TestData;
-import com.android.documentsui.testing.SelectionHelpers;
-
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -34,36 +31,44 @@
 @SmallTest
 public class DefaultSelectionHelper_SingleSelectTest {
 
-    private static final List<String> ITEMS = TestData.create(100);
-
-    private SelectionHelper mManager;
+    private List<String> mItems;
+    private SelectionHelper mHelper;
     private TestSelectionObserver mListener;
     private SelectionProbe mSelection;
 
     @Before
     public void setUp() throws Exception {
+        mItems = TestAdapter.createItemList(100);
         mListener = new TestSelectionObserver();
-        mManager = SelectionHelpers.createTestInstance(ITEMS, DefaultSelectionHelper.MODE_SINGLE);
-        mManager.addObserver(mListener);
+        TestAdapter adapter = new TestAdapter();
+        adapter.updateTestModelIds(mItems);
 
-        mSelection = new SelectionProbe(mManager);
+        mHelper = new DefaultSelectionHelper(
+                DefaultSelectionHelper.MODE_SINGLE,
+                adapter,
+                new TestStableIdProvider(adapter),
+                SelectionPredicates.CAN_SET_ANYTHING);
+
+        mHelper.addObserver(mListener);
+
+        mSelection = new SelectionProbe(mHelper);
     }
 
     @Test
     public void testSimpleSelect() {
-        mManager.select(ITEMS.get(3));
-        mManager.select(ITEMS.get(4));
+        mHelper.select(mItems.get(3));
+        mHelper.select(mItems.get(4));
         mListener.assertSelectionChanged();
         mSelection.assertSelection(4);
     }
 
     @Test
     public void testRangeSelectionNotEstablished() {
-        mManager.select(ITEMS.get(3));
+        mHelper.select(mItems.get(3));
         mListener.reset();
 
         try {
-            mManager.extendRange(10);
+            mHelper.extendRange(10);
             fail("Should have thrown.");
         } catch (Exception expected) {}
 
diff --git a/tests/unit/com/android/documentsui/selection/addons/BandSelectionHelperTest.java b/tests/unit/com/android/documentsui/selection/addons/BandSelectionHelperTest.java
index 25d2bf9..b15f657 100644
--- a/tests/unit/com/android/documentsui/selection/addons/BandSelectionHelperTest.java
+++ b/tests/unit/com/android/documentsui/selection/addons/BandSelectionHelperTest.java
@@ -26,11 +26,12 @@
 import android.support.v7.widget.RecyclerView.OnScrollListener;
 import android.view.MotionEvent;
 
-import com.android.documentsui.dirlist.TestData;
-import com.android.documentsui.dirlist.TestDocumentsAdapter;
-import com.android.documentsui.selection.addons.BandSelectionHelper;
-import com.android.documentsui.selection.addons.ContentLock;
-import com.android.documentsui.testing.SelectionHelpers;
+import com.android.documentsui.selection.DefaultSelectionHelper;
+import com.android.documentsui.selection.SelectionHelper;
+import com.android.documentsui.selection.SelectionPredicates;
+import com.android.documentsui.selection.TestAdapter;
+import com.android.documentsui.selection.TestStableIdProvider;
+import com.android.documentsui.selection.addons.BandSelectionHelper.BandHost;
 import com.android.documentsui.testing.TestEvents.Builder;
 
 import org.junit.Before;
@@ -44,32 +45,41 @@
 @SmallTest
 public class BandSelectionHelperTest {
 
-    private static final List<String> ITEMS = TestData.create(10);
+    private List<String> mItems;
     private BandSelectionHelper mBandController;
     private boolean mIsActive;
     private Builder mStartBuilder;
     private Builder mStopBuilder;
     private MotionEvent mStartEvent;
     private MotionEvent mStopEvent;
-    private TestSelectionHost mSelectionHost;
+    private TestBandHost mBandHost;
 
     @Before
     public void setup() throws Exception {
+        mItems = TestAdapter.createItemList(10);
         mIsActive = false;
-        TestDocumentsAdapter adapter = new TestDocumentsAdapter(ITEMS);
-        mSelectionHost = new TestSelectionHost();
+        TestAdapter adapter = new TestAdapter();
+        adapter.updateTestModelIds(mItems);
+        mBandHost = new TestBandHost();
+
+        SelectionHelper helper = new DefaultSelectionHelper(
+                DefaultSelectionHelper.MODE_SINGLE,
+                adapter,
+                new TestStableIdProvider(adapter),
+                SelectionPredicates.CAN_SET_ANYTHING);
+
         mBandController = new BandSelectionHelper(
-                mSelectionHost,
-                adapter,  // adapter
-                adapter,  // stableIds
-                SelectionHelpers.createTestInstance(ITEMS),
-                SelectionHelpers.CAN_SET_ANYTHING,
+                mBandHost,
+                adapter,
+                new TestStableIdProvider(adapter),
+                helper,
+                SelectionPredicates.CAN_SET_ANYTHING,
                 new ContentLock()) {
-          @Override
-          public boolean isActive() {
-              return mIsActive;
-          }
-        };
+                    @Override
+                    public boolean isActive() {
+                        return mIsActive;
+                    }
+                };
 
         mStartBuilder = new Builder().mouse().primary().action(MotionEvent.ACTION_MOVE);
         mStopBuilder = new Builder().mouse().action(MotionEvent.ACTION_UP);
@@ -108,7 +118,7 @@
 
     @Test
     public void testBadStart_RespectsCanInitiateBand() {
-        mSelectionHost.mCanInitiateBand = false;
+        mBandHost.mCanInitiateBand = false;
         assertFalse(mBandController.shouldStart(mStartEvent));
     }
 
@@ -138,13 +148,21 @@
 
     @Test
     public void testBadStart_NoItems() {
-        TestDocumentsAdapter emptyAdapter = new TestDocumentsAdapter(Collections.EMPTY_LIST);
+        TestAdapter emptyAdapter = new TestAdapter();
+        emptyAdapter.updateTestModelIds(Collections.EMPTY_LIST);
+
+        SelectionHelper helper = new DefaultSelectionHelper(
+                DefaultSelectionHelper.MODE_SINGLE,
+                emptyAdapter,
+                new TestStableIdProvider(emptyAdapter),
+                SelectionPredicates.CAN_SET_ANYTHING);
+
         mBandController = new BandSelectionHelper(
-                new TestSelectionHost(),
+                new TestBandHost(),
                 emptyAdapter,
-                emptyAdapter,
-                SelectionHelpers.createTestInstance(ITEMS),
-                SelectionHelpers.CAN_SET_ANYTHING,
+                new TestStableIdProvider(emptyAdapter),
+                helper,
+                SelectionPredicates.CAN_SET_ANYTHING,
                 new ContentLock());
 
         assertFalse(mBandController.shouldStart(mStartEvent));
@@ -201,7 +219,7 @@
                 mStopBuilder.action(MotionEvent.ACTION_DOWN).touch().build()));
     }
 
-    private final class TestSelectionHost implements BandSelectionHelper.SelectionHost {
+    private final class TestBandHost extends BandHost {
 
         private boolean mCanInitiateBand = true;
 
diff --git a/tests/unit/com/android/documentsui/selection/addons/GridModelTest.java b/tests/unit/com/android/documentsui/selection/addons/GridModelTest.java
index 239ea4d..93576a0 100644
--- a/tests/unit/com/android/documentsui/selection/addons/GridModelTest.java
+++ b/tests/unit/com/android/documentsui/selection/addons/GridModelTest.java
@@ -28,10 +28,10 @@
 import android.support.v7.widget.RecyclerView.OnScrollListener;
 import android.view.MotionEvent;
 
-import com.android.documentsui.dirlist.TestDocumentsAdapter;
-import com.android.documentsui.selection.SelectionHelper.SelectionPredicate;
-import com.android.documentsui.selection.addons.BandSelectionHelper;
-import com.android.documentsui.selection.addons.GridModel;
+import com.android.documentsui.selection.SelectionPredicates;
+import com.android.documentsui.selection.TestAdapter;
+import com.android.documentsui.selection.TestStableIdProvider;
+import com.android.documentsui.selection.addons.BandSelectionHelper.BandHost;
 
 import org.junit.After;
 import org.junit.Test;
@@ -50,21 +50,10 @@
     private static final int VIEW_PADDING_PX = 5;
     private static final int CHILD_VIEW_EDGE_PX = 100;
     private static final int VIEWPORT_HEIGHT = 500;
-    private static final SelectionPredicate CAN_SET_ANYTHING = new SelectionPredicate() {
-        @Override
-        public boolean canSetStateForId(String id, boolean nextState) {
-            return true;
-        }
-
-        @Override
-        public boolean canSetStateAtPosition(int position, boolean nextState) {
-            return true;
-        }
-    };
 
     private GridModel mModel;
     private TestHost mHost;
-    private TestDocumentsAdapter mAdapter;
+    private TestAdapter mAdapter;
     private Set<String> mLastSelection;
     private int mViewWidth;
 
@@ -234,7 +223,7 @@
 
     private void initData(final int numChildren, int numColumns) {
         mHost = new TestHost(numChildren, numColumns);
-        mAdapter = new TestDocumentsAdapter(new ArrayList<String>()) {
+        mAdapter = new TestAdapter() {
             @Override
             public String getStableId(int position) {
                 return Integer.toString(position);
@@ -248,9 +237,13 @@
 
         mViewWidth = VIEW_PADDING_PX + numColumns * (VIEW_PADDING_PX + CHILD_VIEW_EDGE_PX);
 
-        mModel = new GridModel(mHost, mAdapter, CAN_SET_ANYTHING);
+        mModel = new GridModel(
+                mHost,
+                new TestStableIdProvider(mAdapter),
+                SelectionPredicates.CAN_SET_ANYTHING);
+
         mModel.addOnSelectionChangedListener(
-                new GridModel.OnSelectionChangedListener() {
+                new GridModel.SelectionObserver() {
                     @Override
                     public void onSelectionChanged(Set<String> updatedSelection) {
                         mLastSelection = updatedSelection;
@@ -309,7 +302,7 @@
         mHost.mScrollListener.onScrolled(null, 0, dy);
     }
 
-    private static final class TestHost implements BandSelectionHelper.SelectionHost {
+    private static final class TestHost extends BandHost {
 
         private final int mNumColumns;
         private final int mNumRows;
diff --git a/tests/unit/com/android/documentsui/selection/addons/ViewAutoScrollerTest.java b/tests/unit/com/android/documentsui/selection/addons/ViewAutoScrollerTest.java
index 723c979..5bbcd9b 100644
--- a/tests/unit/com/android/documentsui/selection/addons/ViewAutoScrollerTest.java
+++ b/tests/unit/com/android/documentsui/selection/addons/ViewAutoScrollerTest.java
@@ -24,7 +24,7 @@
 import android.support.test.runner.AndroidJUnit4;
 
 import com.android.documentsui.selection.addons.ViewAutoScroller;
-import com.android.documentsui.selection.addons.ViewAutoScroller.Callbacks;
+import com.android.documentsui.selection.addons.ViewAutoScroller.ScrollerCallbacks;
 import com.android.documentsui.selection.addons.ViewAutoScroller.ScrollHost;
 
 import org.junit.Before;
@@ -49,7 +49,7 @@
     private Point mPoint;
     private boolean mActive;
     private ScrollHost mHost;
-    private Callbacks mCallbacks;
+    private ScrollerCallbacks mCallbacks;
     private IntConsumer mScrollAssert;
 
     @Before
@@ -74,7 +74,7 @@
             }
         };
 
-        mCallbacks = new Callbacks() {
+        mCallbacks = new ScrollerCallbacks() {
             @Override
             public void scrollBy(int dy) {
                 mScrollAssert.accept(dy);