Merge pull request #1498 from michaelschattgen/feature/single-tap-group

Change group filter to a single selection
pull/1503/head
Alexander Bakker 5 months ago committed by GitHub
commit 8e3279bb7e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -178,7 +178,7 @@ public class OverallTest extends AegisTest {
private void changeGroupFilter(String text) { private void changeGroupFilter(String text) {
if (text == null) { if (text == null) {
onView(allOf(withText(R.string.all), isDescendantOfA(withId(R.id.groupChipGroup)))).perform(click()); onView(allOf(withText(R.string.no_group), isDescendantOfA(withId(R.id.groupChipGroup)))).perform(click());
} else { } else {
onView(allOf(withText(text), isDescendantOfA(withId(R.id.groupChipGroup)))).perform(click()); onView(allOf(withText(text), isDescendantOfA(withId(R.id.groupChipGroup)))).perform(click());
} }

@ -0,0 +1,17 @@
package com.beemdevelopment.aegis;
public enum GroupPlaceholderType {
ALL,
NO_GROUP;
public int getStringRes() {
switch (this) {
case ALL:
return R.string.all;
case NO_GROUP:
return R.string.no_group;
default:
throw new IllegalArgumentException("Unexpected placeholder type: " + this);
}
}
}

@ -40,6 +40,7 @@ import androidx.appcompat.widget.SearchView;
import androidx.core.view.ViewCompat; import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat; import androidx.core.view.WindowInsetsCompat;
import com.beemdevelopment.aegis.GroupPlaceholderType;
import com.beemdevelopment.aegis.Preferences; import com.beemdevelopment.aegis.Preferences;
import com.beemdevelopment.aegis.R; import com.beemdevelopment.aegis.R;
import com.beemdevelopment.aegis.SortCategory; import com.beemdevelopment.aegis.SortCategory;
@ -271,12 +272,12 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene
private void initializeGroups() { private void initializeGroups() {
_groupChip.removeAllViews(); _groupChip.removeAllViews();
addChipTo(_groupChip, new VaultGroupModel(getString(R.string.all)));
for (VaultGroup group : _groups) { for (VaultGroup group : _groups) {
addChipTo(_groupChip, new VaultGroupModel(group)); addChipTo(_groupChip, new VaultGroupModel(group));
} }
GroupPlaceholderType placeholderType = GroupPlaceholderType.NO_GROUP;
addChipTo(_groupChip, new VaultGroupModel(this, placeholderType));
addSaveChip(_groupChip); addSaveChip(_groupChip);
} }
@ -296,51 +297,40 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene
chip.setChecked(_groupFilter != null && _groupFilter.contains(group.getUUID())); chip.setChecked(_groupFilter != null && _groupFilter.contains(group.getUUID()));
if (group.isPlaceholder()) { if (group.isPlaceholder()) {
chip.setId(0); GroupPlaceholderType groupPlaceholderType = group.getPlaceholderType();
chip.setTag(null); chip.setTag(groupPlaceholderType);
chip.setChecked(_groupFilter == null);
chip.setOnClickListener(v -> {
setSaveChipVisibility(true);
Chip checkedChip = (Chip) chipGroup.getChildAt(0);
boolean checkedState = checkedChip.isChecked();
chipGroup.clearCheck();
Set<UUID> groupFilter = getGroupFilter(chipGroup);
if (!checkedState) {
groupFilter = new HashSet<>();
groupFilter.add(null);
checkedChip.setChecked(false);
} else {
checkedChip.setChecked(true);
}
_groupFilter = groupFilter;
_entryListView.setGroupFilter(groupFilter, true);
});
chipGroup.addView(chip); if (groupPlaceholderType == GroupPlaceholderType.ALL) {
return; chip.setChecked(_groupFilter == null);
} else if (groupPlaceholderType == GroupPlaceholderType.NO_GROUP) {
chip.setChecked(_groupFilter != null && _groupFilter.contains(null));
}
} else {
chip.setTag(group);
} }
chip.setOnCheckedChangeListener((group1, isChecked) -> {
chip.setOnCheckedChangeListener((group1, checkedId) -> { Set<UUID> groupFilter = new HashSet<>();
setSaveChipVisibility(true); setSaveChipVisibility(true);
Set<UUID> groupFilter = getGroupFilter(chipGroup);
if (groupFilter.isEmpty()) { if (!isChecked) {
group1.setChecked(false);
_groupFilter = groupFilter;
_entryListView.setGroupFilter(groupFilter, false);
return;
}
Object chipTag = group1.getTag();
if (chipTag == GroupPlaceholderType.NO_GROUP) {
groupFilter.add(null); groupFilter.add(null);
} else { } else {
Chip allGroupsChip = (Chip) chipGroup.getChildAt(0); groupFilter = getGroupFilter(chipGroup);
allGroupsChip.setChecked(false);
} }
_groupFilter = groupFilter; _groupFilter = groupFilter;
_entryListView.setGroupFilter(groupFilter, true); _entryListView.setGroupFilter(groupFilter, false);
}); });
chip.setTag(group);
chipGroup.addView(chip); chipGroup.addView(chip);
} }
@ -373,7 +363,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene
return chipGroup.getCheckedChipIds().stream() return chipGroup.getCheckedChipIds().stream()
.map(i -> { .map(i -> {
Chip chip = chipGroup.findViewById(i); Chip chip = chipGroup.findViewById(i);
if (chip.getTag() != null) { if (chip.getTag() instanceof VaultGroupModel) {
VaultGroupModel group = (VaultGroupModel) chip.getTag(); VaultGroupModel group = (VaultGroupModel) chip.getTag();
return group.getUUID(); return group.getUUID();
} }

@ -22,6 +22,7 @@ import androidx.core.content.FileProvider;
import androidx.preference.Preference; import androidx.preference.Preference;
import com.beemdevelopment.aegis.BuildConfig; import com.beemdevelopment.aegis.BuildConfig;
import com.beemdevelopment.aegis.GroupPlaceholderType;
import com.beemdevelopment.aegis.R; import com.beemdevelopment.aegis.R;
import com.beemdevelopment.aegis.helpers.DropdownHelper; import com.beemdevelopment.aegis.helpers.DropdownHelper;
import com.beemdevelopment.aegis.importers.DatabaseImporter; import com.beemdevelopment.aegis.importers.DatabaseImporter;
@ -190,7 +191,7 @@ public class ImportExportPreferencesFragment extends PreferencesFragment {
checkBoxExportAllGroups.setVisibility(View.VISIBLE); checkBoxExportAllGroups.setVisibility(View.VISIBLE);
ArrayList<VaultGroupModel> groupsArray = new ArrayList<>(); ArrayList<VaultGroupModel> groupsArray = new ArrayList<>();
groupsArray.add(new VaultGroupModel(getString(R.string.no_group))); groupsArray.add(new VaultGroupModel(requireContext(), GroupPlaceholderType.NO_GROUP));
groupsArray.addAll(groups.stream().map(VaultGroupModel::new).collect(Collectors.toList())); groupsArray.addAll(groups.stream().map(VaultGroupModel::new).collect(Collectors.toList()));
groupsSelection.setCheckedItemsCountTextRes(R.plurals.export_groups_selected_count); groupsSelection.setCheckedItemsCountTextRes(R.plurals.export_groups_selected_count);

@ -1,23 +1,31 @@
package com.beemdevelopment.aegis.ui.models; package com.beemdevelopment.aegis.ui.models;
import android.content.Context;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.beemdevelopment.aegis.GroupPlaceholderType;
import com.beemdevelopment.aegis.vault.VaultGroup; import com.beemdevelopment.aegis.vault.VaultGroup;
import java.io.Serializable; import java.io.Serializable;
import java.util.UUID; import java.util.UUID;
public class VaultGroupModel implements Serializable { public class VaultGroupModel implements Serializable {
private final VaultGroup _group; private final VaultGroup _group;
private final String _placeholderName; private final GroupPlaceholderType _placeholderType;
private final String _placeholderText;
public VaultGroupModel(VaultGroup group) { public VaultGroupModel(VaultGroup group) {
_group = group; _group = group;
_placeholderName = null; _placeholderText = null;
_placeholderType = null;
} }
public VaultGroupModel(String placeholderName) { public VaultGroupModel(Context context, GroupPlaceholderType placeholderType) {
_group = null; _group = null;
_placeholderName = placeholderName; _placeholderType = placeholderType;
_placeholderText = context.getString(placeholderType.getStringRes());
} }
public VaultGroup getGroup() { public VaultGroup getGroup() {
@ -25,11 +33,15 @@ public class VaultGroupModel implements Serializable {
} }
public String getName() { public String getName() {
return _group != null ? _group.getName() : _placeholderName; return _group != null ? _group.getName() : _placeholderText;
}
public GroupPlaceholderType getPlaceholderType() {
return _placeholderType;
} }
public boolean isPlaceholder() { public boolean isPlaceholder() {
return _group == null; return _placeholderType != null;
} }
@Nullable @Nullable

@ -38,7 +38,9 @@
<com.google.android.material.chip.ChipGroup <com.google.android.material.chip.ChipGroup
android:id="@+id/groupChipGroup" android:id="@+id/groupChipGroup"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"></com.google.android.material.chip.ChipGroup> android:layout_height="wrap_content"
app:selectionRequired="true"
app:singleSelection="true"/>
</LinearLayout> </LinearLayout>
</HorizontalScrollView> </HorizontalScrollView>
</com.google.android.material.appbar.AppBarLayout> </com.google.android.material.appbar.AppBarLayout>

Loading…
Cancel
Save