Fix a crash that would occur while moving an entry during a refresh

This commit is contained in:
Alexander Bakker 2018-06-07 18:39:44 +02:00
parent 476643a81c
commit 7129a16a44
4 changed files with 25 additions and 8 deletions

2
.idea/misc.xml generated
View file

@ -24,7 +24,7 @@
</value> </value>
</option> </option>
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="JDK" project-jdk-type="JavaSDK"> <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" /> <output url="file://$PROJECT_DIR$/build/classes" />
</component> </component>
<component name="ProjectType"> <component name="ProjectType">

View file

@ -327,7 +327,7 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene
updateLockIcon(); updateLockIcon();
// refresh all codes to prevent showing old ones // refresh all codes to prevent showing old ones
_entryListView.refresh(); _entryListView.refresh(true);
} }
private BottomSheetDialog createBottomSheet(final DatabaseEntry entry) { private BottomSheetDialog createBottomSheet(final DatabaseEntry entry) {

View file

@ -23,8 +23,12 @@ public class EntryAdapter extends RecyclerView.Adapter<EntryHolder> implements I
private static Listener _listener; private static Listener _listener;
private boolean _showIssuer; private boolean _showIssuer;
// keeps track of the viewholders that are currently bound
private List<EntryHolder> _holders;
public EntryAdapter(Listener listener) { public EntryAdapter(Listener listener) {
_entries = new ArrayList<>(); _entries = new ArrayList<>();
_holders = new ArrayList<>();
_listener = listener; _listener = listener;
} }
@ -76,6 +80,16 @@ public class EntryAdapter extends RecyclerView.Adapter<EntryHolder> implements I
throw new AssertionError("no entry found with the same id"); 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 @Override
public void onItemDismiss(int position) { public void onItemDismiss(int position) {
@ -105,7 +119,7 @@ public class EntryAdapter extends RecyclerView.Adapter<EntryHolder> implements I
@Override @Override
public void onViewRecycled(EntryHolder holder) { public void onViewRecycled(EntryHolder holder) {
holder.stopRefreshLoop(); holder.stopRefreshLoop();
super.onViewRecycled(holder); _holders.remove(holder);
} }
@Override @Override
@ -149,6 +163,8 @@ public class EntryAdapter extends RecyclerView.Adapter<EntryHolder> implements I
holder.refreshCode(); holder.refreshCode();
} }
}); });
_holders.add(holder);
} }
public int getUniformPeriod() { public int getUniformPeriod() {

View file

@ -53,7 +53,7 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener {
_refresher = new UiRefresher(new UiRefresher.Listener() { _refresher = new UiRefresher(new UiRefresher.Listener() {
@Override @Override
public void onRefresh() { public void onRefresh() {
refresh(); refresh(false);
} }
@Override @Override
@ -65,11 +65,11 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener {
return view; return view;
} }
public void refresh() { public void refresh(boolean hard) {
if (_showProgress) { if (_showProgress) {
_progressBar.refresh(); _progressBar.refresh();
} }
_adapter.notifyDataSetChanged(); _adapter.refresh(hard);
} }
private void checkPeriodUniformity() { private void checkPeriodUniformity() {
@ -90,11 +90,12 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener {
} }
private void startRefreshLoop() { private void startRefreshLoop() {
refresh(true);
_refresher.start(); _refresher.start();
} }
private void stopRefreshLoop() { private void stopRefreshLoop() {
refresh(); refresh(true);
_refresher.stop(); _refresher.stop();
} }
@ -129,7 +130,7 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener {
public void setShowIssuer(boolean showIssuer) { public void setShowIssuer(boolean showIssuer) {
_adapter.setShowIssuer(showIssuer); _adapter.setShowIssuer(showIssuer);
_adapter.notifyDataSetChanged(); _adapter.refresh(true);
} }
public void addEntry(DatabaseEntry entry) { public void addEntry(DatabaseEntry entry) {