mirror of
https://github.com/beemdevelopment/Aegis.git
synced 2025-04-20 22:09:12 +00:00
Simplify tracking of draggable entries
This fixes a crash and a case where rebinding a ViewHolder to an entry that is not selected would still show a drag handle
This commit is contained in:
parent
bcbe5f33d4
commit
b98a5c55bc
1 changed files with 21 additions and 30 deletions
|
@ -63,7 +63,6 @@ public class EntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
|
|
||||||
// keeps track of the EntryHolders that are currently bound
|
// keeps track of the EntryHolders that are currently bound
|
||||||
private List<EntryHolder> _holders;
|
private List<EntryHolder> _holders;
|
||||||
private EntryHolder _dragHandleHolder; // holder with enabled drag handle
|
|
||||||
|
|
||||||
public EntryAdapter(EntryListView view) {
|
public EntryAdapter(EntryListView view) {
|
||||||
_entries = new ArrayList<>();
|
_entries = new ArrayList<>();
|
||||||
|
@ -306,6 +305,14 @@ public class EntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
notifyDataSetChanged();
|
notifyDataSetChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isEntryDraggable(VaultEntry entry) {
|
||||||
|
return entry != null
|
||||||
|
&& isDragAndDropAllowed()
|
||||||
|
&& _selectedEntries.size() == 1
|
||||||
|
&& !_selectedEntries.get(0).isFavorite()
|
||||||
|
&& _selectedEntries.get(0) == entry;
|
||||||
|
}
|
||||||
|
|
||||||
private void sortShownEntries() {
|
private void sortShownEntries() {
|
||||||
if (_sortCategory != null) {
|
if (_sortCategory != null) {
|
||||||
Comparator<VaultEntry> comparator = _sortCategory.getComparator();
|
Comparator<VaultEntry> comparator = _sortCategory.getComparator();
|
||||||
|
@ -410,6 +417,7 @@ public class EntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
boolean showProgress = entry.getInfo() instanceof TotpInfo && ((TotpInfo) entry.getInfo()).getPeriod() != getMostFrequentPeriod();
|
boolean showProgress = entry.getInfo() instanceof TotpInfo && ((TotpInfo) entry.getInfo()).getPeriod() != getMostFrequentPeriod();
|
||||||
entryHolder.setData(entry, _codeGroupSize, _showAccountName, _showIcon, showProgress, hidden, paused, dimmed);
|
entryHolder.setData(entry, _codeGroupSize, _showAccountName, _showIcon, showProgress, hidden, paused, dimmed);
|
||||||
entryHolder.setFocused(_selectedEntries.contains(entry));
|
entryHolder.setFocused(_selectedEntries.contains(entry));
|
||||||
|
entryHolder.setShowDragHandle(isEntryDraggable(entry));
|
||||||
|
|
||||||
if (_showIcon) {
|
if (_showIcon) {
|
||||||
entryHolder.loadIcon(_view);
|
entryHolder.loadIcon(_view);
|
||||||
|
@ -470,11 +478,8 @@ public class EntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean returnVal = _view.onLongEntryClick(_shownEntries.get(position));
|
boolean returnVal = _view.onLongEntryClick(_shownEntries.get(position));
|
||||||
|
if (_selectedEntries.size() == 0 || isEntryDraggable(entry)) {
|
||||||
boolean dragEnabled = _selectedEntries.size() == 0
|
_view.startDrag(entryHolder);
|
||||||
|| _selectedEntries.size() == 1 && _selectedEntries.get(0) == entryHolder.getEntry();
|
|
||||||
if (dragEnabled && isDragAndDropAllowed() && !entryHolder.getEntry().isFavorite()) {
|
|
||||||
_view.startDrag(_dragHandleHolder);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return returnVal;
|
return returnVal;
|
||||||
|
@ -485,11 +490,8 @@ public class EntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
public boolean onTouch(View v, MotionEvent event) {
|
public boolean onTouch(View v, MotionEvent event) {
|
||||||
// Start drag if this is the only item selected
|
// Start drag if this is the only item selected
|
||||||
if (event.getActionMasked() == MotionEvent.ACTION_MOVE
|
if (event.getActionMasked() == MotionEvent.ACTION_MOVE
|
||||||
&& _selectedEntries.size() == 1
|
&& isEntryDraggable(entryHolder.getEntry())) {
|
||||||
&& _selectedEntries.get(0) == entryHolder.getEntry()
|
_view.startDrag(entryHolder);
|
||||||
&& isDragAndDropAllowed()
|
|
||||||
&& !entryHolder.getEntry().isFavorite()) {
|
|
||||||
_view.startDrag(_dragHandleHolder);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -629,26 +631,15 @@ public class EntryAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateDraggableStatus() {
|
private void updateDraggableStatus() {
|
||||||
if (!isDragAndDropAllowed()) {
|
for (EntryHolder holder : _holders) {
|
||||||
return;
|
VaultEntry entry = holder.getEntry();
|
||||||
}
|
if (isEntryDraggable(entry)) {
|
||||||
|
holder.setShowDragHandle(true);
|
||||||
if (_selectedEntries.size() == 1 && _dragHandleHolder == null && !_selectedEntries.get(0).isFavorite()) {
|
_view.setSelectedEntry(entry);
|
||||||
// Find and enable dragging for the single selected EntryHolder
|
break;
|
||||||
// Not nice but this is the best method I could find
|
|
||||||
for (int i = 0; i < _holders.size(); i++) {
|
|
||||||
if (_holders.get(i).getEntry() == _selectedEntries.get(0)) {
|
|
||||||
_dragHandleHolder = _holders.get(i);
|
|
||||||
_dragHandleHolder.setShowDragHandle(true);
|
|
||||||
_view.setSelectedEntry(_selectedEntries.get(0));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else if (_dragHandleHolder != null) {
|
|
||||||
// Disable dragging if necessary when more/less than 1 selected entry
|
holder.setShowDragHandle(false);
|
||||||
_dragHandleHolder.setShowDragHandle(false);
|
|
||||||
_dragHandleHolder = null;
|
|
||||||
_view.setSelectedEntry(null);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue