From 897161ad2cf2adc1a97238045de03054402a751d Mon Sep 17 00:00:00 2001 From: MinSoo Kim Date: Sun, 23 Aug 2020 20:47:20 +0900 Subject: [PATCH] added feature that clearing current selection if max selectable is 1 --- .../main/java/com/zhihu/matisse/SelectionCreator.java | 11 +++++++++++ .../zhihu/matisse/internal/entity/SelectionSpec.java | 2 ++ .../internal/model/SelectedItemCollection.java | 9 ++++++++- 3 files changed, 21 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 66aeadfe3..643ce7a05 100644 --- a/matisse/src/main/java/com/zhihu/matisse/SelectionCreator.java +++ b/matisse/src/main/java/com/zhihu/matisse/SelectionCreator.java @@ -343,6 +343,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 80b7d1098..e0b244e81 100644 --- a/matisse/src/main/java/com/zhihu/matisse/internal/entity/SelectionSpec.java +++ b/matisse/src/main/java/com/zhihu/matisse/internal/entity/SelectionSpec.java @@ -57,6 +57,7 @@ public final class SelectionSpec { public int originalMaxSize; public OnCheckedListener onCheckedListener; public boolean showPreview; + public boolean changeSelectionOnSelectingOne; private SelectionSpec() { } @@ -93,6 +94,7 @@ private void reset() { autoHideToobar = false; originalMaxSize = Integer.MAX_VALUE; showPreview = true; + 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 7fdf69034..63186b102 100644 --- a/matisse/src/main/java/com/zhihu/matisse/internal/model/SelectedItemCollection.java +++ b/matisse/src/main/java/com/zhihu/matisse/internal/model/SelectedItemCollection.java @@ -167,7 +167,9 @@ public boolean isSelected(Item item) { } public IncapableCause isAcceptable(Item item) { - if (maxSelectableReached()) { + if (shouldRemoveSelection()) { + mItems.clear(); + } else if (maxSelectableReached()) { int maxSelectable = currentMaxSelectable(); String cause; @@ -201,6 +203,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();