summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Steve McKay <smckay@google.com> 2018-04-30 14:09:14 -0700
committer android-build-merger <android-build-merger@google.com> 2018-04-30 14:09:14 -0700
commit5d4b97d2ed5ba37b638d56861e49cff6ae542fdd (patch)
treee6ae933ad0614eec07b48900545bfd6338ffb226
parent354ebd16a80694052fdb6d7f326cdc2aa290384e (diff)
parentd08ebaca6624a990be548172121c5ac0bfc25267 (diff)
Guard against NPEs in pre-init selection helper. am: 7bd7f0d153
am: d08ebaca66 Change-Id: Ic3a8dfe5bd541a91769cf437d82084b3816bc655
-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 815a48e21..c788119a7 100644
--- a/src/com/android/documentsui/DocsSelectionHelper.java
+++ b/src/com/android/documentsui/DocsSelectionHelper.java
@@ -21,6 +21,7 @@ import androidx.recyclerview.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 ea73a5530..f30464788 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.