From 85e8ffb7c31c61c48369653b94a3a7dafd4cf7b5 Mon Sep 17 00:00:00 2001 From: vanous Date: Sun, 31 Jul 2022 16:59:53 +0200 Subject: [PATCH] Steps streaks: retain data during screen rotation --- .../charts/StepStreaksDashboard.java | 29 +++++++++++++++---- .../res/layout/steps_streaks_dashboard.xml | 2 +- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/StepStreaksDashboard.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/StepStreaksDashboard.java index 6ad5cf924..9b6535dcb 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/StepStreaksDashboard.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/StepStreaksDashboard.java @@ -19,6 +19,7 @@ import androidx.fragment.app.FragmentActivity; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.Serializable; import java.util.Calendar; import java.util.Date; @@ -38,8 +39,9 @@ public class StepStreaksDashboard extends DialogFragment { boolean cancelTasks = false; boolean backgroundTaskFinished = false; private View fragmentView; - private final StepsStreaks stepsStreaks = new StepsStreaks(); + private StepsStreaks stepsStreaks = new StepsStreaks(); private static final String GOAL = "goal"; + private static final String STREAKS = "streaks"; private static final String PERIOD_CURRENT = "current"; private static final String PERIOD_TOTALS = "totals"; private static final int MAX_YEAR = 2015; @@ -52,7 +54,6 @@ public class StepStreaksDashboard extends DialogFragment { //without interruption (day with steps less then goal) //Possible improvements/nice to haves: //- cache values until new activity fetch is performed - //- create a parcel to allow screen rotation without recalculation //- read the goals from the USER_ATTRIBUTES table. But, this would also require to be able //to edit/add values there... @@ -84,6 +85,14 @@ public class StepStreaksDashboard extends DialogFragment { } + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (backgroundTaskFinished) { + outState.putSerializable(STREAKS, stepsStreaks); + } + } + @Override public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); @@ -94,11 +103,21 @@ public class StepStreaksDashboard extends DialogFragment { if (gbDevice == null) { throw new IllegalArgumentException("Must provide a device when invoking this activity"); } + + if (savedInstanceState != null) { + StepsStreaks streaks = (StepsStreaks) savedInstanceState.getSerializable(STREAKS); + if (streaks != null) { + stepsStreaks = streaks; + backgroundTaskFinished = true; + cancelTasks = true; + indicate_progress(false); + populateData(); + } + } createTaskCalculateLatestStepsStreak("Visualizing data current", getActivity(), PERIOD_CURRENT).execute(); createTaskCalculateLatestStepsStreak("Visualizing data maximum", getActivity(), PERIOD_TOTALS).execute(); } - void indicate_progress(boolean inProgress) { ProgressBar step_streak_dashboard_loading_circle = fragmentView.findViewById(R.id.step_streak_dashboard_loading_circle); if (inProgress) { @@ -303,14 +322,14 @@ public class StepStreaksDashboard extends DialogFragment { } } - private static class StepsStreak { + private static class StepsStreak implements Serializable { private int days = 0; private int steps = 0; private int timestamp; private int total_days = 0; } - private class StepsStreaks { + private class StepsStreaks implements Serializable { private StepsStreak current = new StepsStreak(); private StepsStreak maximum = new StepsStreak(); private StepsStreak total = new StepsStreak(); diff --git a/app/src/main/res/layout/steps_streaks_dashboard.xml b/app/src/main/res/layout/steps_streaks_dashboard.xml index 3a5348e56..fbc2b7bda 100644 --- a/app/src/main/res/layout/steps_streaks_dashboard.xml +++ b/app/src/main/res/layout/steps_streaks_dashboard.xml @@ -1,6 +1,6 @@