diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DashboardFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DashboardFragment.java index 59dcaef93..55c07e15c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DashboardFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DashboardFragment.java @@ -35,6 +35,7 @@ import androidx.gridlayout.widget.GridLayout; import com.google.android.material.card.MaterialCardView; +import java.io.Serializable; import java.util.Calendar; import java.util.GregorianCalendar; @@ -49,6 +50,7 @@ import nodomain.freeyourgadget.gadgetbridge.activities.dashboard.DashboardSleepW import nodomain.freeyourgadget.gadgetbridge.activities.dashboard.DashboardStepsWidget; import nodomain.freeyourgadget.gadgetbridge.activities.dashboard.DashboardTodayWidget; import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils; +import nodomain.freeyourgadget.gadgetbridge.util.HealthUtils; import nodomain.freeyourgadget.gadgetbridge.util.Prefs; public class DashboardFragment extends Fragment { @@ -63,6 +65,7 @@ public class DashboardFragment extends Fragment { private DashboardDistanceWidget distanceWidget; private DashboardActiveTimeWidget activeTimeWidget; private DashboardSleepWidget sleepWidget; + private DashboardData dashboardData = new DashboardData(); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -144,8 +147,9 @@ public class DashboardFragment extends Fragment { day.set(Calendar.HOUR_OF_DAY, 23); day.set(Calendar.MINUTE, 59); day.set(Calendar.SECOND, 59); - int timeTo = (int) (day.getTimeInMillis() / 1000); - int timeFrom = DateTimeUtils.shiftDays(timeTo, -1); + dashboardData.clear(); + dashboardData.timeTo = (int) (day.getTimeInMillis() / 1000); + dashboardData.timeFrom = DateTimeUtils.shiftDays(dashboardData.timeTo, -1); Calendar today = GregorianCalendar.getInstance(); if (DateTimeUtils.isSameDay(today, day)) { @@ -161,50 +165,50 @@ public class DashboardFragment extends Fragment { if (prefs.getBoolean("dashboard_widget_today_enabled", true)) { if (todayWidget == null) { - todayWidget = DashboardTodayWidget.newInstance(timeFrom, timeTo); + todayWidget = DashboardTodayWidget.newInstance(dashboardData); createWidget(todayWidget, cardsEnabled, 2); } else { - todayWidget.setTimespan(timeFrom, timeTo); + todayWidget.update(); } } if (prefs.getBoolean("dashboard_widget_goals_enabled", true)) { if (goalsWidget == null) { - goalsWidget = DashboardGoalsWidget.newInstance(timeFrom, timeTo); + goalsWidget = DashboardGoalsWidget.newInstance(dashboardData); createWidget(goalsWidget, cardsEnabled, 2); } else { - goalsWidget.setTimespan(timeFrom, timeTo); + goalsWidget.update(); } } if (prefs.getBoolean("dashboard_widget_steps_enabled", true)) { if (stepsWidget == null) { - stepsWidget = DashboardStepsWidget.newInstance(timeFrom, timeTo); + stepsWidget = DashboardStepsWidget.newInstance(dashboardData); createWidget(stepsWidget, cardsEnabled, 1); } else { - stepsWidget.setTimespan(timeFrom, timeTo); + stepsWidget.update(); } } if (prefs.getBoolean("dashboard_widget_distance_enabled", true)) { if (distanceWidget == null) { - distanceWidget = DashboardDistanceWidget.newInstance(timeFrom, timeTo); + distanceWidget = DashboardDistanceWidget.newInstance(dashboardData); createWidget(distanceWidget, cardsEnabled, 1); } else { - distanceWidget.setTimespan(timeFrom, timeTo); + distanceWidget.update(); } } if (prefs.getBoolean("dashboard_widget_active_time_enabled", true)) { if (activeTimeWidget == null) { - activeTimeWidget = DashboardActiveTimeWidget.newInstance(timeFrom, timeTo); + activeTimeWidget = DashboardActiveTimeWidget.newInstance(dashboardData); createWidget(activeTimeWidget, cardsEnabled, 1); } else { - activeTimeWidget.setTimespan(timeFrom, timeTo); + activeTimeWidget.update(); } } if (prefs.getBoolean("dashboard_widget_sleep_enabled", true)) { if (sleepWidget == null) { - sleepWidget = DashboardSleepWidget.newInstance(timeFrom, timeTo); + sleepWidget = DashboardSleepWidget.newInstance(dashboardData); createWidget(sleepWidget, cardsEnabled, 1); } else { - sleepWidget.setTimespan(timeFrom, timeTo); + sleepWidget.update(); } } } @@ -241,4 +245,82 @@ public class DashboardFragment extends Fragment { gridLayout.addView(fragment); } } + + /** + * This class serves as a data collection object for all data points used by the various + * dashboard widgets. Since retrieving this data can be costly, this class makes sure it will + * only be done once. It will be passed to every widget, making sure they have the necessary + * data available. + */ + public static class DashboardData implements Serializable { + public int timeFrom; + public int timeTo; + private int stepsTotal; + private float stepsGoalFactor; + private long sleepTotalMinutes; + private float sleepGoalFactor; + private float distanceTotalMeters; + private float distanceGoalFactor; + private long activeMinutesTotal; + private float activeMinutesGoalFactor; + + public void clear() { + stepsTotal = 0; + stepsGoalFactor = 0; + sleepTotalMinutes = 0; + sleepGoalFactor = 0; + distanceTotalMeters = 0; + distanceGoalFactor = 0; + activeMinutesTotal = 0; + activeMinutesGoalFactor = 0; + } + + public synchronized int getStepsTotal() { + if (stepsTotal == 0) + stepsTotal = HealthUtils.getStepsTotal(timeTo); + return stepsTotal; + } + + public synchronized float getStepsGoalFactor() { + if (stepsGoalFactor == 0) + stepsGoalFactor = HealthUtils.getStepsGoalFactor(timeTo); + return stepsGoalFactor; + } + + public synchronized float getDistanceTotal() { + if (distanceTotalMeters == 0) + distanceTotalMeters = HealthUtils.getDistanceTotal(timeTo); + return distanceTotalMeters; + } + + public synchronized float getDistanceGoalFactor() { + if (distanceGoalFactor == 0) + distanceGoalFactor = HealthUtils.getDistanceGoalFactor(timeTo); + return distanceGoalFactor; + } + + public synchronized long getActiveMinutesTotal() { + if (activeMinutesTotal == 0) + activeMinutesTotal = HealthUtils.getActiveMinutesTotal(timeFrom, timeTo); + return activeMinutesTotal; + } + + public synchronized float getActiveMinutesGoalFactor() { + if (activeMinutesGoalFactor == 0) + activeMinutesGoalFactor = HealthUtils.getActiveMinutesGoalFactor(timeFrom, timeTo); + return activeMinutesGoalFactor; + } + + public synchronized long getSleepMinutesTotal() { + if (sleepTotalMinutes == 0) + sleepTotalMinutes = HealthUtils.getSleepMinutesTotal(timeTo); + return sleepTotalMinutes; + } + + public synchronized float getSleepMinutesGoalFactor() { + if (sleepGoalFactor == 0) + sleepGoalFactor = HealthUtils.getSleepMinutesGoalFactor(timeTo); + return sleepGoalFactor; + } + } } \ No newline at end of file diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/AbstractDashboardWidget.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/AbstractDashboardWidget.java index 25c55921d..70def2b86 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/AbstractDashboardWidget.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/AbstractDashboardWidget.java @@ -28,14 +28,14 @@ import androidx.fragment.app.Fragment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import nodomain.freeyourgadget.gadgetbridge.activities.DashboardFragment; + public abstract class AbstractDashboardWidget extends Fragment { private static final Logger LOG = LoggerFactory.getLogger(AbstractDashboardWidget.class); - protected static String ARG_TIME_FROM = "dashboard_widget_argument_time_from"; - protected static String ARG_TIME_TO = "dashboard_widget_argument_time_to"; + protected static String ARG_DASHBOARD_DATA = "dashboard_widget_argument_data"; - protected int timeFrom; - protected int timeTo; + protected DashboardFragment.DashboardData dashboardData; protected @ColorInt int color_not_worn = Color.argb(75, 128, 128, 128); protected @ColorInt int color_worn = Color.rgb(128, 128, 128); @@ -49,22 +49,21 @@ public abstract class AbstractDashboardWidget extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { - timeFrom = getArguments().getInt(ARG_TIME_FROM); - timeTo = getArguments().getInt(ARG_TIME_TO); + dashboardData = (DashboardFragment.DashboardData) getArguments().getSerializable(ARG_DASHBOARD_DATA); } } - public void setTimespan(int timeFrom, int timeTo) { - this.timeFrom = timeFrom; - this.timeTo = timeTo; + public void update() { fillData(); } protected abstract void fillData(); /** - * @param width Bitmap width in pixels + * @param width Bitmap width in pixels this.timeFrom = timeFrom; + this.timeTo = timeTo; + * @param barWidth Gauge bar width in pixels * @param filledColor Color of the filled part of the gauge * @param filledFactor Factor between 0 and 1 that determines the amount of the gauge that should be filled diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardActiveTimeWidget.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardActiveTimeWidget.java index 5b75e310f..3281f4918 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardActiveTimeWidget.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardActiveTimeWidget.java @@ -27,7 +27,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import nodomain.freeyourgadget.gadgetbridge.R; -import nodomain.freeyourgadget.gadgetbridge.util.HealthUtils; +import nodomain.freeyourgadget.gadgetbridge.activities.DashboardFragment; /** * A simple {@link AbstractDashboardWidget} subclass. @@ -47,15 +47,13 @@ public class DashboardActiveTimeWidget extends AbstractDashboardWidget { * Use this factory method to create a new instance of * this fragment using the provided parameters. * - * @param timeFrom Start time in seconds since Unix epoch. - * @param timeTo End time in seconds since Unix epoch. + * @param dashboardData An instance of DashboardFragment.DashboardData. * @return A new instance of fragment DashboardActiveTimeWidget. */ - public static DashboardActiveTimeWidget newInstance(int timeFrom, int timeTo) { + public static DashboardActiveTimeWidget newInstance(DashboardFragment.DashboardData dashboardData) { DashboardActiveTimeWidget fragment = new DashboardActiveTimeWidget(); Bundle args = new Bundle(); - args.putInt(ARG_TIME_FROM, timeFrom); - args.putInt(ARG_TIME_TO, timeTo); + args.putSerializable(ARG_DASHBOARD_DATA, dashboardData); fragment.setArguments(args); return fragment; } @@ -80,12 +78,12 @@ public class DashboardActiveTimeWidget extends AbstractDashboardWidget { @Override protected void fillData() { // Update text representation - long totalActiveMinutes = HealthUtils.getActiveMinutesTotal(timeFrom, timeTo); + long totalActiveMinutes = dashboardData.getActiveMinutesTotal(); String activeHours = String.format("%d", (int) Math.floor(totalActiveMinutes / 60f)); String activeMinutes = String.format("%02d", (int) (totalActiveMinutes % 60f)); activeTime.setText(activeHours + ":" + activeMinutes); // Draw gauge - activeTimeGauge.setImageBitmap(drawGauge(200, 15, color_active_time, HealthUtils.getActiveMinutesGoalFactor(timeFrom, timeTo))); + activeTimeGauge.setImageBitmap(drawGauge(200, 15, color_active_time, dashboardData.getActiveMinutesGoalFactor())); } } \ No newline at end of file diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardDistanceWidget.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardDistanceWidget.java index ae135c3ae..2ce2e5096 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardDistanceWidget.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardDistanceWidget.java @@ -27,8 +27,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.activities.DashboardFragment; import nodomain.freeyourgadget.gadgetbridge.util.FormatUtils; -import nodomain.freeyourgadget.gadgetbridge.util.HealthUtils; /** * A simple {@link AbstractDashboardWidget} subclass. @@ -48,15 +48,13 @@ public class DashboardDistanceWidget extends AbstractDashboardWidget { * Use this factory method to create a new instance of * this fragment using the provided parameters. * - * @param timeFrom Start time in seconds since Unix epoch. - * @param timeTo End time in seconds since Unix epoch. + * @param dashboardData An instance of DashboardFragment.DashboardData. * @return A new instance of fragment DashboardDistanceWidget. */ - public static DashboardDistanceWidget newInstance(int timeFrom, int timeTo) { + public static DashboardDistanceWidget newInstance(DashboardFragment.DashboardData dashboardData) { DashboardDistanceWidget fragment = new DashboardDistanceWidget(); Bundle args = new Bundle(); - args.putInt(ARG_TIME_FROM, timeFrom); - args.putInt(ARG_TIME_TO, timeTo); + args.putSerializable(ARG_DASHBOARD_DATA, dashboardData); fragment.setArguments(args); return fragment; } @@ -81,10 +79,10 @@ public class DashboardDistanceWidget extends AbstractDashboardWidget { @Override protected void fillData() { // Update text representation - String distanceFormatted = FormatUtils.getFormattedDistanceLabel(HealthUtils.getDistanceTotal(timeTo)); + String distanceFormatted = FormatUtils.getFormattedDistanceLabel(dashboardData.getDistanceTotal()); distanceText.setText(distanceFormatted); // Draw gauge - distanceGauge.setImageBitmap(drawGauge(200, 15, color_distance, HealthUtils.getDistanceGoalFactor(timeTo))); + distanceGauge.setImageBitmap(drawGauge(200, 15, color_distance, dashboardData.getDistanceGoalFactor())); } } \ No newline at end of file diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardGoalsWidget.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardGoalsWidget.java index 3557800d5..35d5cd13f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardGoalsWidget.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardGoalsWidget.java @@ -35,7 +35,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import nodomain.freeyourgadget.gadgetbridge.R; -import nodomain.freeyourgadget.gadgetbridge.util.HealthUtils; +import nodomain.freeyourgadget.gadgetbridge.activities.DashboardFragment; /** * A simple {@link AbstractDashboardWidget} subclass. @@ -55,15 +55,13 @@ public class DashboardGoalsWidget extends AbstractDashboardWidget { * Use this factory method to create a new instance of * this fragment using the provided parameters. * - * @param timeFrom Start time in seconds since Unix epoch. - * @param timeTo End time in seconds since Unix epoch. + * @param dashboardData An instance of DashboardFragment.DashboardData. * @return A new instance of fragment DashboardGoalsWidget. */ - public static DashboardGoalsWidget newInstance(int timeFrom, int timeTo) { + public static DashboardGoalsWidget newInstance(DashboardFragment.DashboardData dashboardData) { DashboardGoalsWidget fragment = new DashboardGoalsWidget(); Bundle args = new Bundle(); - args.putInt(ARG_TIME_FROM, timeFrom); - args.putInt(ARG_TIME_TO, timeTo); + args.putSerializable(ARG_DASHBOARD_DATA, dashboardData); fragment.setArguments(args); return fragment; } @@ -133,19 +131,19 @@ public class DashboardGoalsWidget extends AbstractDashboardWidget { paint.setStrokeWidth(barWidth); paint.setColor(color_activity); - canvas.drawArc(barMargin, barMargin, width - barMargin, height - barMargin, 270, 360 * HealthUtils.getStepsGoalFactor(timeTo), false, paint); + canvas.drawArc(barMargin, barMargin, width - barMargin, height - barMargin, 270, 360 * dashboardData.getStepsGoalFactor(), false, paint); barMargin += barWidth * 1.5; paint.setColor(color_distance); - canvas.drawArc(barMargin, barMargin, width - barMargin, height - barMargin, 270, 360 * HealthUtils.getDistanceGoalFactor(timeTo), false, paint); + canvas.drawArc(barMargin, barMargin, width - barMargin, height - barMargin, 270, 360 * dashboardData.getDistanceGoalFactor(), false, paint); barMargin += barWidth * 1.5; paint.setColor(color_active_time); - canvas.drawArc(barMargin, barMargin, width - barMargin, height - barMargin, 270, 360 * HealthUtils.getActiveMinutesGoalFactor(timeFrom, timeTo), false, paint); + canvas.drawArc(barMargin, barMargin, width - barMargin, height - barMargin, 270, 360 * dashboardData.getActiveMinutesGoalFactor(), false, paint); barMargin += barWidth * 1.5; paint.setColor(color_light_sleep); - canvas.drawArc(barMargin, barMargin, width - barMargin, height - barMargin, 270, 360 * HealthUtils.getSleepMinutesGoalFactor(timeTo), false, paint); + canvas.drawArc(barMargin, barMargin, width - barMargin, height - barMargin, 270, 360 * dashboardData.getSleepMinutesGoalFactor(), false, paint); return null; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardSleepWidget.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardSleepWidget.java index a7145ca1f..7ff5ba25c 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardSleepWidget.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardSleepWidget.java @@ -27,7 +27,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import nodomain.freeyourgadget.gadgetbridge.R; -import nodomain.freeyourgadget.gadgetbridge.util.HealthUtils; +import nodomain.freeyourgadget.gadgetbridge.activities.DashboardFragment; /** * A simple {@link AbstractDashboardWidget} subclass. @@ -47,15 +47,13 @@ public class DashboardSleepWidget extends AbstractDashboardWidget { * Use this factory method to create a new instance of * this fragment using the provided parameters. * - * @param timeFrom Start time in seconds since Unix epoch. - * @param timeTo End time in seconds since Unix epoch. + * @param dashboardData An instance of DashboardFragment.DashboardData. * @return A new instance of fragment DashboardSleepWidget. */ - public static DashboardSleepWidget newInstance(int timeFrom, int timeTo) { + public static DashboardSleepWidget newInstance(DashboardFragment.DashboardData dashboardData) { DashboardSleepWidget fragment = new DashboardSleepWidget(); Bundle args = new Bundle(); - args.putInt(ARG_TIME_FROM, timeFrom); - args.putInt(ARG_TIME_TO, timeTo); + args.putSerializable(ARG_DASHBOARD_DATA, dashboardData); fragment.setArguments(args); return fragment; } @@ -80,12 +78,12 @@ public class DashboardSleepWidget extends AbstractDashboardWidget { @Override protected void fillData() { // Update text representation - long totalSleepMinutes = HealthUtils.getSleepMinutesTotal(timeTo); + long totalSleepMinutes = dashboardData.getSleepMinutesTotal(); String sleepHours = String.format("%d", (int) Math.floor(totalSleepMinutes / 60f)); String sleepMinutes = String.format("%02d", (int) (totalSleepMinutes % 60f)); sleepAmount.setText(sleepHours + ":" + sleepMinutes); // Draw gauge - sleepGauge.setImageBitmap(drawGauge(200, 15, color_light_sleep, HealthUtils.getSleepMinutesGoalFactor(timeTo))); + sleepGauge.setImageBitmap(drawGauge(200, 15, color_light_sleep, dashboardData.getSleepMinutesGoalFactor())); } } \ No newline at end of file diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardStepsWidget.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardStepsWidget.java index 04a46ac15..fea1b7951 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardStepsWidget.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardStepsWidget.java @@ -27,7 +27,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import nodomain.freeyourgadget.gadgetbridge.R; -import nodomain.freeyourgadget.gadgetbridge.util.HealthUtils; +import nodomain.freeyourgadget.gadgetbridge.activities.DashboardFragment; /** * A simple {@link AbstractDashboardWidget} subclass. @@ -47,15 +47,13 @@ public class DashboardStepsWidget extends AbstractDashboardWidget { * Use this factory method to create a new instance of * this fragment using the provided parameters. * - * @param timeFrom Start time in seconds since Unix epoch. - * @param timeTo End time in seconds since Unix epoch. + * @param dashboardData An instance of DashboardFragment.DashboardData. * @return A new instance of fragment DashboardStepsWidget. */ - public static DashboardStepsWidget newInstance(int timeFrom, int timeTo) { + public static DashboardStepsWidget newInstance(DashboardFragment.DashboardData dashboardData) { DashboardStepsWidget fragment = new DashboardStepsWidget(); Bundle args = new Bundle(); - args.putInt(ARG_TIME_FROM, timeFrom); - args.putInt(ARG_TIME_TO, timeTo); + args.putSerializable(ARG_DASHBOARD_DATA, dashboardData); fragment.setArguments(args); return fragment; } @@ -77,9 +75,9 @@ public class DashboardStepsWidget extends AbstractDashboardWidget { protected void fillData() { // Update text representation - stepsCount.setText(String.valueOf(HealthUtils.getStepsTotal(timeTo))); + stepsCount.setText(String.valueOf(dashboardData.getStepsTotal())); // Draw gauge - stepsGauge.setImageBitmap(drawGauge(200, 15, color_activity, HealthUtils.getStepsGoalFactor(timeTo))); + stepsGauge.setImageBitmap(drawGauge(200, 15, color_activity, dashboardData.getStepsGoalFactor())); } } \ No newline at end of file diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardTodayWidget.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardTodayWidget.java index f59415c9e..e60da7581 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardTodayWidget.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/dashboard/DashboardTodayWidget.java @@ -43,6 +43,7 @@ import java.util.List; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.activities.DashboardFragment; import nodomain.freeyourgadget.gadgetbridge.activities.charts.StepAnalysis; import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; @@ -75,15 +76,13 @@ public class DashboardTodayWidget extends AbstractDashboardWidget { * Use this factory method to create a new instance of * this fragment using the provided parameters. * - * @param timeFrom Start time in seconds since Unix epoch. - * @param timeTo End time in seconds since Unix epoch. + * @param dashboardData An instance of DashboardFragment.DashboardData. * @return A new instance of fragment DashboardTodayWidget. */ - public static DashboardTodayWidget newInstance(int timeFrom, int timeTo) { + public static DashboardTodayWidget newInstance(DashboardFragment.DashboardData dashboardData) { DashboardTodayWidget fragment = new DashboardTodayWidget(); Bundle args = new Bundle(); - args.putInt(ARG_TIME_FROM, timeFrom); - args.putInt(ARG_TIME_TO, timeTo); + args.putSerializable(ARG_DASHBOARD_DATA, dashboardData); fragment.setArguments(args); return fragment; } @@ -209,7 +208,7 @@ public class DashboardTodayWidget extends AbstractDashboardWidget { try (DBHandler dbHandler = GBApplication.acquireDB()) { for (GBDevice dev : devices) { if (dev.getDeviceCoordinator().supportsActivityTracking()) { - List activitySamples = HealthUtils.getAllSamples(dbHandler, dev, timeFrom, timeTo); + List activitySamples = HealthUtils.getAllSamples(dbHandler, dev, dashboardData.timeFrom, dashboardData.timeTo); allActivitySamples.addAll(activitySamples); StepAnalysis stepAnalysis = new StepAnalysis(); stepSessions.addAll(stepAnalysis.calculateStepSessions(activitySamples)); @@ -221,7 +220,7 @@ public class DashboardTodayWidget extends AbstractDashboardWidget { // Integrate and chronologically order various data from multiple devices List generalizedActivities = new ArrayList<>(); - long midDaySecond = timeFrom + (12 * 60 * 60); + long midDaySecond = dashboardData.timeFrom + (12 * 60 * 60); for (ActivitySample sample : allActivitySamples) { // Handle only TYPE_NOT_WORN and TYPE_SLEEP (including variants) here if (sample.getKind() != ActivityKind.TYPE_NOT_WORN && (sample.getKind() == ActivityKind.TYPE_NOT_MEASURED || (sample.getKind() & ActivityKind.TYPE_SLEEP) == 0)) @@ -270,7 +269,7 @@ public class DashboardTodayWidget extends AbstractDashboardWidget { ArrayList colors_0_12 = new ArrayList<>(); ArrayList entries_12_24 = new ArrayList<>(); ArrayList colors_12_24 = new ArrayList<>(); - long secondIndex = timeFrom; + long secondIndex = dashboardData.timeFrom; for (GeneralizedActivity activity : generalizedActivities) { // FIXME: correctly merge parallel activities from multiple devices // Skip earlier sessions @@ -308,7 +307,7 @@ public class DashboardTodayWidget extends AbstractDashboardWidget { } // Fill remaining time until midnight long currentTime = Calendar.getInstance().getTimeInMillis() / 1000; - if (!mode_24h && currentTime > timeFrom && currentTime < midDaySecond) { + if (!mode_24h && currentTime > dashboardData.timeFrom && currentTime < midDaySecond) { // Fill with unknown slice up until current time entries_0_12.add(new PieEntry(currentTime - secondIndex, "Unknown")); colors_0_12.add(color_worn); @@ -316,12 +315,12 @@ public class DashboardTodayWidget extends AbstractDashboardWidget { entries_0_12.add(new PieEntry(midDaySecond - currentTime, "Empty")); colors_0_12.add(Color.TRANSPARENT); } - if ((mode_24h || currentTime >= midDaySecond) && currentTime < timeTo) { + if ((mode_24h || currentTime >= midDaySecond) && currentTime < dashboardData.timeTo) { // Fill with unknown slice up until current time entries_12_24.add(new PieEntry(currentTime - secondIndex, "Unknown")); colors_12_24.add(color_worn); // Draw transparent slice for remaining time until midnight - entries_12_24.add(new PieEntry(timeTo - currentTime, "Empty")); + entries_12_24.add(new PieEntry(dashboardData.timeTo - currentTime, "Empty")); colors_12_24.add(Color.TRANSPARENT); }