import org.jetbrains.annotations.NotNull;
-import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
.setValue(savedInstanceState.getString(STATE_ACC_FILTER, null));
}
- mainModel.lastUpdateDate.observe(this, this::updateLastUpdateDisplay);
-
findViewById(R.id.btn_no_profiles_add).setOnClickListener(
v -> startEditProfileActivity(null));
mainModel.clearUpdateError();
});
}
- private void scheduleDataRetrievalIfStale(Date lastUpdate) {
+ private void scheduleDataRetrievalIfStale(long lastUpdate) {
long now = new Date().getTime();
- if ((lastUpdate == null) || (now > (lastUpdate.getTime() + (24 * 3600 * 1000)))) {
- if (lastUpdate == null)
+ if ((lastUpdate == 0) || (now > (lastUpdate + (24 * 3600 * 1000)))) {
+ if (lastUpdate == 0)
Logger.debug("db::", "WEB data never fetched. scheduling a fetch");
else
Logger.debug("db", String.format(Locale.ENGLISH,
"WEB data last fetched at %1.3f and now is %1.3f. re-fetching",
- lastUpdate.getTime() / 1000f, now / 1000f));
+ lastUpdate / 1000f, now / 1000f));
mainModel.scheduleTransactionListRetrieval();
}
updateLastUpdateTextFromDB();
}
- private void updateLastUpdateDisplay(Date newValue) {
- LinearLayout l = findViewById(R.id.transactions_last_update_layout);
- TextView v = findViewById(R.id.transactions_last_update);
- if (newValue == null) {
- l.setVisibility(View.INVISIBLE);
- Logger.debug("main", "no last update date :(");
- }
- else {
- final String text = DateFormat.getDateTimeInstance()
- .format(newValue);
- v.setText(text);
- l.setVisibility(View.VISIBLE);
- Logger.debug("main", String.format("Date formatted: %s", text));
- }
-
- scheduleDataRetrievalIfStale(newValue);
- }
private void profileThemeChanged() {
storeThemeIdInPrefs(profile.getThemeHue());
// un-hook all observed LiveData
Data.removeProfileObservers(this);
Data.profiles.removeObservers(this);
- mainModel.lastUpdateDate.removeObservers(this);
+ Data.lastUpdateLiveData.removeObservers(this);
recreate();
}
if (profile == null)
return;
- long last_update = profile.getLongOption(MLDB.OPT_LAST_SCRAPE, 0L);
+ long lastUpdate = profile.getLongOption(MLDB.OPT_LAST_SCRAPE, 0L);
- Logger.debug("transactions",
- String.format(Locale.ENGLISH, "Last update = %d", last_update));
- if (last_update == 0) {
- mainModel.lastUpdateDate.postValue(null);
+ Logger.debug("transactions", String.format(Locale.ENGLISH, "Last update = %d", lastUpdate));
+ if (lastUpdate == 0) {
+ Data.lastUpdateLiveData.postValue(null);
}
else {
- mainModel.lastUpdateDate.postValue(new Date(last_update));
+ Data.lastUpdateLiveData.postValue(new Date(lastUpdate));
}
+
+ // this is unfortunate, but it appears we need a two-stage rocket to make
+ // a value reach a recycler view item holder. first stage is a regular
+ // LiveData that can be observed by an activity (this).
+ // the second stage forwards the changes, in the UI thread, to the
+ // observable value, observed by the view holders.
+ // view holders can't observe the LiveData because they don't have
+ // access to lifecycle owners. oh, also the value is updated by a thread
+ // so it must be tunnelled by an activity for it to reach the view
+ // holders in the UI thread
+ Data.lastUpdateLiveData.observe(this, date -> runOnUiThread(
+ () -> Data.lastUpdate.set((date == null) ? 0 : date.getTime())));
+ scheduleDataRetrievalIfStale(lastUpdate);
+
}
public void onStopTransactionRefreshClick(View view) {
Logger.debug("interactive", "Cancelling transactions refresh");