diff options
author | 2018-04-30 14:09:14 -0700 | |
---|---|---|
committer | 2018-04-30 14:09:14 -0700 | |
commit | 5d4b97d2ed5ba37b638d56861e49cff6ae542fdd (patch) | |
tree | e6ae933ad0614eec07b48900545bfd6338ffb226 | |
parent | 354ebd16a80694052fdb6d7f326cdc2aa290384e (diff) | |
parent | d08ebaca6624a990be548172121c5ac0bfc25267 (diff) |
Guard against NPEs in pre-init selection helper. am: 7bd7f0d153
am: d08ebaca66
Change-Id: Ic3a8dfe5bd541a91769cf437d82084b3816bc655
-rw-r--r-- | src/com/android/documentsui/DocsSelectionHelper.java | 100 | ||||
-rw-r--r-- | tests/unit/com/android/documentsui/DocsSelectionHelperTest.java | 9 |
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. |