From 8d742fbfd20d78bd7dff4bae1d36012e6746037f Mon Sep 17 00:00:00 2001 From: voodoo Date: Tue, 8 Feb 2022 22:23:15 +0800 Subject: [PATCH] added feature that clearing current selection if max selectable is 1 #808 --- .../main/java/com/zhihu/matisse/SelectionCreator.java | 11 +++++++++++ .../zhihu/matisse/internal/entity/SelectionSpec.java | 2 ++ .../internal/model/SelectedItemCollection.java | 10 +++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/matisse/src/main/java/com/zhihu/matisse/SelectionCreator.java b/matisse/src/main/java/com/zhihu/matisse/SelectionCreator.java index c85c3d34d..a6500c9ce 100755 --- a/matisse/src/main/java/com/zhihu/matisse/SelectionCreator.java +++ b/matisse/src/main/java/com/zhihu/matisse/SelectionCreator.java @@ -346,6 +346,17 @@ public SelectionCreator setOnCheckedListener(@Nullable OnCheckedListener listene return this; } + /** + * Set if selection should change on case where maxSelectable is 1 + * + * @param changeSelectionOnSelectingOne + * @return {@link SelectionCreator} for fluent API. + */ + public SelectionCreator setChangeSelectionOnSelectingOne(boolean changeSelectionOnSelectingOne) { + mSelectionSpec.changeSelectionOnSelectingOne = changeSelectionOnSelectingOne; + return this; + } + /** * Start to select media and wait for result. * diff --git a/matisse/src/main/java/com/zhihu/matisse/internal/entity/SelectionSpec.java b/matisse/src/main/java/com/zhihu/matisse/internal/entity/SelectionSpec.java index 70806270c..0dd8f2701 100755 --- a/matisse/src/main/java/com/zhihu/matisse/internal/entity/SelectionSpec.java +++ b/matisse/src/main/java/com/zhihu/matisse/internal/entity/SelectionSpec.java @@ -61,6 +61,7 @@ public final class SelectionSpec { public boolean showPreview; public Drawable audioThumbnail; public Drawable audioPlaceholder; + public boolean changeSelectionOnSelectingOne; private SelectionSpec() { } @@ -100,6 +101,7 @@ private void reset() { showPreview = true; audioThumbnail = null; audioPlaceholder = null; + changeSelectionOnSelectingOne = false; } public boolean singleSelectionModeEnabled() { diff --git a/matisse/src/main/java/com/zhihu/matisse/internal/model/SelectedItemCollection.java b/matisse/src/main/java/com/zhihu/matisse/internal/model/SelectedItemCollection.java index b0abaa6c6..fab2511ec 100755 --- a/matisse/src/main/java/com/zhihu/matisse/internal/model/SelectedItemCollection.java +++ b/matisse/src/main/java/com/zhihu/matisse/internal/model/SelectedItemCollection.java @@ -177,7 +177,10 @@ public boolean isSelected(Item item) { } public IncapableCause isAcceptable(Item item) { - if (maxSelectableReached()) { + if (shouldRemoveSelection()) { + mItems.clear(); + } + else if (maxSelectableReached()) { int maxSelectable = currentMaxSelectable(); String cause; @@ -211,6 +214,11 @@ public boolean maxSelectableReached() { return mItems.size() == currentMaxSelectable(); } + public boolean shouldRemoveSelection() { + SelectionSpec spec = SelectionSpec.getInstance(); + return mItems.size() == 1 && currentMaxSelectable() == 1 && spec.changeSelectionOnSelectingOne; + } + // depends private int currentMaxSelectable() { SelectionSpec spec = SelectionSpec.getInstance();