fix: tighten chat selection state invariants
This commit is contained in:
@@ -2,6 +2,7 @@ package com.hyzq.boss;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
|
||||
@@ -12,9 +13,10 @@ public final class ProjectChatUiState {
|
||||
public final boolean multiSelecting;
|
||||
public final Set<String> selectedMessageIds;
|
||||
|
||||
public SelectionState(boolean multiSelecting, Set<String> selectedMessageIds) {
|
||||
this.multiSelecting = multiSelecting;
|
||||
this.selectedMessageIds = new LinkedHashSet<>(selectedMessageIds);
|
||||
private SelectionState(Set<String> selectedMessageIds) {
|
||||
LinkedHashSet<String> normalizedIds = new LinkedHashSet<>(selectedMessageIds);
|
||||
this.multiSelecting = !normalizedIds.isEmpty();
|
||||
this.selectedMessageIds = Collections.unmodifiableSet(normalizedIds);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,21 +29,24 @@ public final class ProjectChatUiState {
|
||||
}
|
||||
|
||||
public static SelectionState emptySelection() {
|
||||
return new SelectionState(false, new LinkedHashSet<>());
|
||||
return new SelectionState(new LinkedHashSet<>());
|
||||
}
|
||||
|
||||
public static SelectionState toggleSelection(@Nullable SelectionState current, String messageId) {
|
||||
if (messageId == null || messageId.trim().isEmpty()) {
|
||||
throw new IllegalArgumentException("messageId must not be blank");
|
||||
}
|
||||
SelectionState state = current == null ? emptySelection() : current;
|
||||
LinkedHashSet<String> selectedMessageIds = new LinkedHashSet<>(state.selectedMessageIds);
|
||||
if (selectedMessageIds.contains(messageId)) {
|
||||
selectedMessageIds.remove(messageId);
|
||||
return new SelectionState(!selectedMessageIds.isEmpty(), selectedMessageIds);
|
||||
return new SelectionState(selectedMessageIds);
|
||||
}
|
||||
selectedMessageIds.add(messageId);
|
||||
return new SelectionState(true, selectedMessageIds);
|
||||
return new SelectionState(selectedMessageIds);
|
||||
}
|
||||
|
||||
public static boolean canForwardSelection(@Nullable SelectionState state) {
|
||||
return state != null && state.selectedMessageIds.size() >= 2;
|
||||
return state != null && state.multiSelecting && state.selectedMessageIds.size() >= 2;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user