mirror of
https://github.com/beemdevelopment/Aegis.git
synced 2025-04-23 07:19:13 +00:00
Merge pull request #1498 from michaelschattgen/feature/single-tap-group
Change group filter to a single selection
This commit is contained in:
commit
8e3279bb7e
6 changed files with 67 additions and 45 deletions
|
@ -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);
|
if (groupPlaceholderType == GroupPlaceholderType.ALL) {
|
||||||
boolean checkedState = checkedChip.isChecked();
|
chip.setChecked(_groupFilter == null);
|
||||||
chipGroup.clearCheck();
|
} else if (groupPlaceholderType == GroupPlaceholderType.NO_GROUP) {
|
||||||
|
chip.setChecked(_groupFilter != null && _groupFilter.contains(null));
|
||||||
Set<UUID> groupFilter = getGroupFilter(chipGroup);
|
}
|
||||||
if (!checkedState) {
|
} else {
|
||||||
groupFilter = new HashSet<>();
|
chip.setTag(group);
|
||||||
groupFilter.add(null);
|
|
||||||
|
|
||||||
checkedChip.setChecked(false);
|
|
||||||
} else {
|
|
||||||
checkedChip.setChecked(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
_groupFilter = groupFilter;
|
|
||||||
_entryListView.setGroupFilter(groupFilter, true);
|
|
||||||
});
|
|
||||||
|
|
||||||
chipGroup.addView(chip);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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…
Add table
Reference in a new issue