From bbd46579462f6423c25a4b0193b35d8772e15a50 Mon Sep 17 00:00:00 2001 From: Mateusz Lubecki Date: Thu, 25 Nov 2021 21:13:27 +0100 Subject: [PATCH] updating favourites list in background --- .../pogodacc/activity/FavouritesActivity.java | 13 ++ .../FavouritesStationDetailsUpdater.java | 114 ++++++++++++++++++ .../WeatherStationRecyclerViewAdapter.java | 91 ++++++++++---- 3 files changed, 194 insertions(+), 24 deletions(-) create mode 100644 app/src/main/java/cc/pogoda/mobile/pogodacc/activity/updater/FavouritesStationDetailsUpdater.java diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/FavouritesActivity.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/FavouritesActivity.java index dceedc7..90c7e67 100644 --- a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/FavouritesActivity.java +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/FavouritesActivity.java @@ -61,6 +61,8 @@ public class FavouritesActivity extends AppCompatActivity { if (recyclerViewFavourites != null) { adapter = new WeatherStationRecyclerViewAdapter(sortedFavourites.getList(), this, callReason.getReason()); + adapter.createAndStartUpdater(); + recyclerViewFavourites.setAdapter(adapter); } @@ -71,6 +73,8 @@ public class FavouritesActivity extends AppCompatActivity { if (recyclerViewFavourites != null) { adapter = new WeatherStationRecyclerViewAdapter(favourites.getList(), this, callReason.getReason()); + adapter.createAndStartUpdater(); + recyclerViewFavourites.setAdapter(adapter); } @@ -105,10 +109,19 @@ public class FavouritesActivity extends AppCompatActivity { if (recyclerViewFavourites != null) { adapter = new WeatherStationRecyclerViewAdapter(favourites.getList(), this, callReason.getReason()); + adapter.createAndStartUpdater(); + recyclerViewFavourites.setAdapter(adapter); recyclerViewFavourites.setLayoutManager(new LinearLayoutManager(this)); } } } + + @Override + protected void onDestroy() { + super.onDestroy(); + + adapter.stopUpdater(); + } } diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/updater/FavouritesStationDetailsUpdater.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/updater/FavouritesStationDetailsUpdater.java new file mode 100644 index 0000000..b055d2a --- /dev/null +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/activity/updater/FavouritesStationDetailsUpdater.java @@ -0,0 +1,114 @@ +package cc.pogoda.mobile.pogodacc.activity.updater; + +import android.os.Handler; +import android.widget.TextView; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.Vector; + +import cc.pogoda.mobile.pogodacc.dao.SummaryDao; +import cc.pogoda.mobile.pogodacc.type.web.QualityFactor; +import cc.pogoda.mobile.pogodacc.type.web.Summary; + +/** + * This class is used to update entries on Favourites list + */ +public class FavouritesStationDetailsUpdater implements Runnable { + + /** + * Handler is used by Android to put a Runnable into MessageQueue handler by the Looper. This + * runnable can be scheduled to be serviced at certain point of time + */ + private Handler handler; + + /** + * A collection which holds + */ + private HashMap stationsToUpdate; + + /** + * Used to get data from web service + */ + private SummaryDao dao = null; + + /** + * Not sure if this is really required but just to be sure that updater won't be started + * after the activity had been torn down. + */ + private boolean enabled; + + public FavouritesStationDetailsUpdater(Handler _handler) { + handler = _handler; + dao = new SummaryDao(); + stationsToUpdate = new HashMap<>(); + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public void addNewStation(String _station_system_name, TextView _tv) { + stationsToUpdate.put(_station_system_name, _tv); + } + + @Override + public void run() { + + if (enabled && stationsToUpdate != null && stationsToUpdate.size() > 0) { + + // get a set of all elements stored in the map + Set> entries = stationsToUpdate.entrySet(); + + // create something iterable from the set. the set itself doesn't guarantee the same order than + // objects were put in, but in this case it isn't a problem. + Vector> vectorOfEntries = new Vector<>(entries); + + for (Map.Entry e : vectorOfEntries) { + + // extract data from pair + String stationSystemName = e.getKey(); + TextView toUpdate = e.getValue(); + + // query web service for station data + Summary summary = dao.getStationSummary(stationSystemName); + + // if data has been collected + if (summary != null) { + String str; + + // check if this station transmits wind information + if (summary.wind_qf_native.equals(QualityFactor.FULL) || summary.wind_qf_native.equals(QualityFactor.DEGRADED)) { + + // check if station transmits humidity + if (summary.humidity_qf_native.equals(QualityFactor.FULL) || summary.humidity_qf_native.equals(QualityFactor.DEGRADED)) { + str = String.format("%d°C %d%% %s %3.1f m/s max %3.1f m/s", Math.round(summary.avg_temperature), summary.humidity, summary.getWindDirStr(), summary.average_speed, summary.gusts); + } + else { + str = String.format("%d°C %s %3.1f m/s max %3.1f m/s", Math.round(summary.avg_temperature), summary.getWindDirStr(), summary.average_speed, summary.gusts); + } + } + else { + if (summary.humidity_qf_native.equals(QualityFactor.FULL) || summary.humidity_qf_native.equals(QualityFactor.DEGRADED)) { + str = String.format("%d°C %d%%", Math.round(summary.avg_temperature), summary.humidity); + } + else { + str = String.format("%d°C", Math.round(summary.avg_temperature)); + + } + } + + // update text view on the favourites list + toUpdate.setText(str); + } + } + + handler.postDelayed(this, 30000); + } + } +} diff --git a/app/src/main/java/cc/pogoda/mobile/pogodacc/adapter/WeatherStationRecyclerViewAdapter.java b/app/src/main/java/cc/pogoda/mobile/pogodacc/adapter/WeatherStationRecyclerViewAdapter.java index 70f89ac..8ef4337 100644 --- a/app/src/main/java/cc/pogoda/mobile/pogodacc/adapter/WeatherStationRecyclerViewAdapter.java +++ b/app/src/main/java/cc/pogoda/mobile/pogodacc/adapter/WeatherStationRecyclerViewAdapter.java @@ -1,6 +1,7 @@ package cc.pogoda.mobile.pogodacc.adapter; import android.content.Context; +import android.os.Handler; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -15,6 +16,7 @@ import java.util.List; import cc.pogoda.mobile.pogodacc.R; import cc.pogoda.mobile.pogodacc.activity.handler.AllStationsActRecyclerViewButtonClickEvent; +import cc.pogoda.mobile.pogodacc.activity.updater.FavouritesStationDetailsUpdater; import cc.pogoda.mobile.pogodacc.activity.view.AllStationsActRecyclerViewHolder; import cc.pogoda.mobile.pogodacc.dao.SummaryDao; import cc.pogoda.mobile.pogodacc.type.ParceableFavsCallReason; @@ -32,11 +34,41 @@ public class WeatherStationRecyclerViewAdapter extends RecyclerView.Adapter stations, AppCompatActivity parentActivity, ParceableFavsCallReason.Reason callReason) { this.stations = stations; this.activity = parentActivity; this.reason = callReason; this.summaryDao = new SummaryDao(); + + + } + + public void createAndStartUpdater() { + + if (reason.equals(ParceableFavsCallReason.Reason.FAVOURITES)) { + + // check if there is previous instance of updater + if (favsUpdater != null && favsUpdater.isEnabled()) { + stopUpdater(); + } + + handler = new Handler(); + favsUpdater = new FavouritesStationDetailsUpdater(handler); + + handler.postDelayed(favsUpdater, 3000); + favsUpdater.setEnabled(true); + } + } + + public void stopUpdater() { + if (reason.equals(ParceableFavsCallReason.Reason.FAVOURITES)) { + handler.removeCallbacks(favsUpdater); + favsUpdater.setEnabled(false); + } } @NonNull @@ -64,10 +96,16 @@ public class WeatherStationRecyclerViewAdapter extends RecyclerView.Adapter