summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Steve McKay <smckay@google.com> 2018-04-27 14:24:25 -0700
committer Steve McKay <smckay@google.com> 2018-04-30 12:28:15 -0700
commit7bd7f0d15345d44481db0d3c29787ef29f6b62dd (patch)
tree96b345d07ac9fdc8106736b2b8a06304c46b51fe
parent5eecb743960bc050a3d382997504ae91e68878d9 (diff)
Guard against NPEs in pre-init selection helper.
Some input events may arrive in such an order that DocsSelectionHelper gets called before it's `reset` method. In those cases we're seeing an NPE. BUG: 69306667 Test: Added new basic. Change-Id: I0e6c73861a7cd7b3d65512e2822b7854622e11ab
-rw-r--r--src/com/android/documentsui/DocsSelectionHelper.java100
-rw-r--r--tests/unit/com/android/documentsui/DocsSelectionHelperTest.java9
2 files changed, 108 insertions, 1 deletions
diff --git a/src/com/android/documentsui/DocsSelectionHelper.java b/src/com/android/documentsui/DocsSelectionHelper.java
index 2c6b63b83..ebdfc9b3a 100644
--- a/src/com/android/documentsui/DocsSelectionHelper.java
+++ b/src/com/android/documentsui/DocsSelectionHelper.java
@@ -21,6 +21,7 @@ import android.support.v7.widget.RecyclerView;
import com.android.documentsui.selection.DefaultSelectionHelper;
import com.android.documentsui.selection.DefaultSelectionHelper.SelectionMode;
+import com.android.documentsui.selection.MutableSelection;
import com.android.documentsui.selection.Selection;
import com.android.documentsui.selection.SelectionHelper;
@@ -37,7 +38,10 @@ public final class DocsSelectionHelper extends SelectionHelper {
private final DelegateFactory mFactory;
private final @SelectionMode int mSelectionMode;
- private @Nullable SelectionHelper mDelegate;
+ // initialize to a dummy object incase we get some input
+ // event drive calls before we're properly initialized.
+ // See: b/69306667.
+ private SelectionHelper mDelegate = new DummySelectionHelper();
@VisibleForTesting
DocsSelectionHelper(DelegateFactory factory, @SelectionMode int mode) {
@@ -188,4 +192,98 @@ public final class DocsSelectionHelper extends SelectionHelper {
return new DefaultSelectionHelper(mode, adapter, stableIds, canSetState);
}
}
+
+ /**
+ * A dummy SelectHelper used by DocsSelectionHelper before a real
+ * SelectionHelper has been initialized by DirectoryFragment.
+ */
+ private static final class DummySelectionHelper extends SelectionHelper {
+
+ @Override
+ public void addObserver(SelectionObserver listener) {
+ }
+
+ @Override
+ public boolean hasSelection() {
+ return false;
+ }
+
+ @Override
+ public Selection getSelection() {
+ return new MutableSelection();
+ }
+
+ @Override
+ public void copySelection(Selection dest) {
+ }
+
+ @Override
+ public boolean isSelected(String id) {
+ return false;
+ }
+
+ @VisibleForTesting
+ public void replaceSelection(Iterable<String> ids) {
+ }
+
+ @Override
+ public void restoreSelection(Selection other) {
+ }
+
+ @Override
+ public boolean setItemsSelected(Iterable<String> ids, boolean selected) {
+ return false;
+ }
+
+ @Override
+ public void clearSelection() {
+ }
+
+ @Override
+ public boolean select(String modelId) {
+ return false;
+ }
+
+ @Override
+ public boolean deselect(String modelId) {
+ return false;
+ }
+
+ @Override
+ public void startRange(int pos) {
+ }
+
+ @Override
+ public void extendRange(int pos) {
+ }
+
+ @Override
+ public void extendProvisionalRange(int pos) {
+ }
+
+ @Override
+ public void clearProvisionalSelection() {
+ }
+
+ @Override
+ public void setProvisionalSelection(Set<String> newSelection) {
+ }
+
+ @Override
+ public void mergeProvisionalSelection() {
+ }
+
+ @Override
+ public void endRange() {
+ }
+
+ @Override
+ public boolean isRangeActive() {
+ return false;
+ }
+
+ @Override
+ public void anchorRange(int position) {
+ }
+ }
}
diff --git a/tests/unit/com/android/documentsui/DocsSelectionHelperTest.java b/tests/unit/com/android/documentsui/DocsSelectionHelperTest.java
index 845a5dadb..42f6bb05c 100644
--- a/tests/unit/com/android/documentsui/DocsSelectionHelperTest.java
+++ b/tests/unit/com/android/documentsui/DocsSelectionHelperTest.java
@@ -17,6 +17,8 @@
package com.android.documentsui;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import android.support.test.filters.SmallTest;
@@ -72,6 +74,13 @@ public class DocsSelectionHelperTest {
}
@Test
+ public void testCallableBeforeReset() {
+ mSelectionMgr.hasSelection();
+ assertNotNull(mSelectionMgr.getSelection());
+ assertFalse(mSelectionMgr.isSelected("poodle"));
+ }
+
+ @Test
public void testReset_CreatesNewInstances() {
mSelectionMgr.reset(null, null, null); // nulls are passed to factory. We ignore.
mSelectionMgr.reset(null, null, null); // nulls are passed to factory. We ignore.