From 7129a16a441aca767c348fe19547232fe463ba0d Mon Sep 17 00:00:00 2001 From: Alexander Bakker Date: Thu, 7 Jun 2018 18:39:44 +0200 Subject: [PATCH] Fix a crash that would occur while moving an entry during a refresh --- .idea/misc.xml | 2 +- .../java/me/impy/aegis/ui/MainActivity.java | 2 +- .../me/impy/aegis/ui/views/EntryAdapter.java | 18 +++++++++++++++++- .../me/impy/aegis/ui/views/EntryListView.java | 11 ++++++----- 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index 53a3fb16..635999df 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -24,7 +24,7 @@ - + diff --git a/app/src/main/java/me/impy/aegis/ui/MainActivity.java b/app/src/main/java/me/impy/aegis/ui/MainActivity.java index 7bd36484..dba22e3c 100644 --- a/app/src/main/java/me/impy/aegis/ui/MainActivity.java +++ b/app/src/main/java/me/impy/aegis/ui/MainActivity.java @@ -327,7 +327,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene updateLockIcon(); // refresh all codes to prevent showing old ones - _entryListView.refresh(); + _entryListView.refresh(true); } private BottomSheetDialog createBottomSheet(final DatabaseEntry entry) { diff --git a/app/src/main/java/me/impy/aegis/ui/views/EntryAdapter.java b/app/src/main/java/me/impy/aegis/ui/views/EntryAdapter.java index 3cd5dc6e..6268f57b 100644 --- a/app/src/main/java/me/impy/aegis/ui/views/EntryAdapter.java +++ b/app/src/main/java/me/impy/aegis/ui/views/EntryAdapter.java @@ -23,8 +23,12 @@ public class EntryAdapter extends RecyclerView.Adapter implements I private static Listener _listener; private boolean _showIssuer; + // keeps track of the viewholders that are currently bound + private List _holders; + public EntryAdapter(Listener listener) { _entries = new ArrayList<>(); + _holders = new ArrayList<>(); _listener = listener; } @@ -76,6 +80,16 @@ public class EntryAdapter extends RecyclerView.Adapter implements I throw new AssertionError("no entry found with the same id"); } + public void refresh(boolean hard) { + if (hard) { + notifyDataSetChanged(); + } else { + for (EntryHolder holder : _holders) { + holder.refreshCode(); + } + } + } + @Override public void onItemDismiss(int position) { @@ -105,7 +119,7 @@ public class EntryAdapter extends RecyclerView.Adapter implements I @Override public void onViewRecycled(EntryHolder holder) { holder.stopRefreshLoop(); - super.onViewRecycled(holder); + _holders.remove(holder); } @Override @@ -149,6 +163,8 @@ public class EntryAdapter extends RecyclerView.Adapter implements I holder.refreshCode(); } }); + + _holders.add(holder); } public int getUniformPeriod() { diff --git a/app/src/main/java/me/impy/aegis/ui/views/EntryListView.java b/app/src/main/java/me/impy/aegis/ui/views/EntryListView.java index a0597075..c4406f7d 100644 --- a/app/src/main/java/me/impy/aegis/ui/views/EntryListView.java +++ b/app/src/main/java/me/impy/aegis/ui/views/EntryListView.java @@ -53,7 +53,7 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener { _refresher = new UiRefresher(new UiRefresher.Listener() { @Override public void onRefresh() { - refresh(); + refresh(false); } @Override @@ -65,11 +65,11 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener { return view; } - public void refresh() { + public void refresh(boolean hard) { if (_showProgress) { _progressBar.refresh(); } - _adapter.notifyDataSetChanged(); + _adapter.refresh(hard); } private void checkPeriodUniformity() { @@ -90,11 +90,12 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener { } private void startRefreshLoop() { + refresh(true); _refresher.start(); } private void stopRefreshLoop() { - refresh(); + refresh(true); _refresher.stop(); } @@ -129,7 +130,7 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener { public void setShowIssuer(boolean showIssuer) { _adapter.setShowIssuer(showIssuer); - _adapter.notifyDataSetChanged(); + _adapter.refresh(true); } public void addEntry(DatabaseEntry entry) {