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>
</option>
</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" />
</component>
<component name="ProjectType">

View file

@ -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) {

View file

@ -23,8 +23,12 @@ public class EntryAdapter extends RecyclerView.Adapter<EntryHolder> implements I
private static Listener _listener;
private boolean _showIssuer;
// keeps track of the viewholders that are currently bound
private List<EntryHolder> _holders;
public EntryAdapter(Listener listener) {
_entries = new ArrayList<>();
_holders = new ArrayList<>();
_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");
}
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<EntryHolder> 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<EntryHolder> implements I
holder.refreshCode();
}
});
_holders.add(holder);
}
public int getUniformPeriod() {

View file

@ -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) {