From ef424a2bb9539173ce0f83bded99f143441fc26b Mon Sep 17 00:00:00 2001 From: vanous Date: Fri, 29 Jul 2022 23:11:44 +0200 Subject: [PATCH] final trigger icon position, clean up, extreact strings... --- .../charts/AbstractWeekChartFragment.java | 20 ++--- .../charts/StepStreaksDashboard.java | 84 ++++++++++++------- .../layout-land/fragment_weeksteps_chart.xml | 22 ++--- .../res/layout/fragment_weeksteps_chart.xml | 21 ++--- .../main/res/layout/steps_streak_average.xml | 9 +- .../steps_streak_current_line_layout.xml | 7 +- app/src/main/res/layout/steps_streak_days.xml | 9 +- .../steps_streak_maximum_line_layout.xml | 7 +- .../main/res/layout/steps_streak_total.xml | 11 ++- .../layout/steps_streak_total_line_layout.xml | 8 +- .../res/layout/steps_streaks_dashboard.xml | 26 +++--- app/src/main/res/values/strings.xml | 18 +++- 12 files changed, 137 insertions(+), 105 deletions(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java index efd260159..c14b34a3d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractWeekChartFragment.java @@ -24,6 +24,7 @@ import android.text.format.DateUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.TextView; import androidx.fragment.app.FragmentManager; @@ -41,7 +42,6 @@ import com.github.mikephil.charting.data.PieData; import com.github.mikephil.charting.data.PieDataSet; import com.github.mikephil.charting.data.PieEntry; import com.github.mikephil.charting.formatter.ValueFormatter; -import com.google.android.material.floatingactionbutton.FloatingActionButton; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -73,7 +73,7 @@ public abstract class AbstractWeekChartFragment extends AbstractChartFragment { private TextView mBalanceView; private int mOffsetHours = getOffsetHours(); - FloatingActionButton stepsStreaksFAB; + ImageView stepsStreaksButton; @Override protected ChartsData refreshInBackground(ChartsHost chartsHost, DBHandler db, GBDevice device) { @@ -107,16 +107,15 @@ public abstract class AbstractWeekChartFragment extends AbstractChartFragment { //disable the streak FAB once we move away from today Calendar day = Calendar.getInstance(); day.setTime(getChartsHost().getEndDate()); - stepsStreaksFAB.setAlpha((float) 1.0); - if (DateUtils.isToday(day.getTimeInMillis()) && enableStepStreaksFAB()){ - stepsStreaksFAB.setVisibility(View.VISIBLE); + if (DateUtils.isToday(day.getTimeInMillis()) && enableStepStreaksButton()){ + stepsStreaksButton.setVisibility(View.VISIBLE); }else { - stepsStreaksFAB.setVisibility(View.GONE); + stepsStreaksButton.setVisibility(View.GONE); } } - private boolean enableStepStreaksFAB(){ + private boolean enableStepStreaksButton(){ return this.getClass().getSimpleName().equals("WeekStepsChartFragment"); } @@ -257,12 +256,11 @@ public abstract class AbstractWeekChartFragment extends AbstractChartFragment { setupWeekChart(); setupTodayPieChart(); - stepsStreaksFAB = rootView.findViewById(R.id.fab_steps_streaks); - if (enableStepStreaksFAB()) { - stepsStreaksFAB.setOnClickListener(new View.OnClickListener() { + stepsStreaksButton = rootView.findViewById(R.id.steps_streaks_button); + if (enableStepStreaksButton()) { + stepsStreaksButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - stepsStreaksFAB.setAlpha((float) 0.5); FragmentManager fm = getActivity().getSupportFragmentManager(); StepStreaksDashboard stepStreaksDashboard = StepStreaksDashboard.newInstance(getGoal(), getChartsHost().getDevice()); stepStreaksDashboard.show(fm, "steps_streaks_dashboard"); 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 396e2d83c..480598743 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 @@ -1,6 +1,7 @@ package nodomain.freeyourgadget.gadgetbridge.activities.charts; import android.content.Context; +import android.os.Build; import android.os.Bundle; import android.text.format.DateUtils; import android.view.LayoutInflater; @@ -33,35 +34,41 @@ import nodomain.freeyourgadget.gadgetbridge.util.GB; public class StepStreaksDashboard extends DialogFragment { protected static final Logger LOG = LoggerFactory.getLogger(StepStreaksDashboard.class); GBDevice gbDevice; - int goal; + int stepsGoal; boolean cancelTasks = false; - boolean backgroundFinished = false; + boolean backgroundTaskFinished = false; private View fragmentView; - private StepsStreaks stepsStreaks = new StepsStreaks(); + private final StepsStreaks stepsStreaks = new StepsStreaks(); + private static final String GOAL = "goal"; + private static final String PERIOD_CURRENT = "current"; + private static final String PERIOD_TOTALS = "totals"; + private static final int MAX_YEAR = 2015; public StepStreaksDashboard() { } + //Calculates some stats for longest streak (daily steps goal being reached for subsequent days + //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... + public static StepStreaksDashboard newInstance(int goal, GBDevice device) { StepStreaksDashboard fragment = new StepStreaksDashboard(); - Bundle args = new Bundle(); - args.putInt("goal", goal); + args.putInt(GOAL, goal); args.putParcelable(GBDevice.EXTRA_DEVICE, device); fragment.setArguments(args); return fragment; - } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - - Bundle savedInstanceState) { - + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.steps_streaks_dashboard, container); - } @Override @@ -81,21 +88,21 @@ public class StepStreaksDashboard extends DialogFragment { public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - goal = getArguments().getInt("goal", 0); + stepsGoal = getArguments().getInt(GOAL, 0); gbDevice = getArguments().getParcelable(GBDevice.EXTRA_DEVICE); fragmentView = view; if (gbDevice == null) { throw new IllegalArgumentException("Must provide a device when invoking this activity"); } - createTaskCalculateLatestStepsStreak("Visualizing data current", getActivity(), "current").execute(); - createTaskCalculateLatestStepsStreak("Visualizing data maximum", getActivity(), "totals").execute(); + 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) { - step_streak_dashboard_loading_circle.setAlpha(0.5f); + step_streak_dashboard_loading_circle.setAlpha(0.4f); //make it a bit softer } else { step_streak_dashboard_loading_circle.setAlpha(0); } @@ -120,6 +127,7 @@ public class StepStreaksDashboard extends DialogFragment { TextView days_total_label = total.findViewById(R.id.step_streak_days_label); TextView total_total = total.findViewById(R.id.step_streak_total_value); TextView date_total_value = total.findViewById(R.id.step_streak_total_date_value); + TextView date_total_label = total.findViewById(R.id.step_streak_total_label); if (stepsStreaks.current.days > 0) { @@ -127,7 +135,10 @@ public class StepStreaksDashboard extends DialogFragment { days_current.setText(Integer.toString(stepsStreaks.current.days)); average_current.setText(Integer.toString(stepsStreaks.current.steps / stepsStreaks.current.days)); total_current.setText(Integer.toString(stepsStreaks.current.steps)); - date_current_value.setText(String.format("From %s", DateTimeUtils.formatDate(new Date(stepsStreaks.current.timestamp * 1000l)))); + + Date startDate = new Date(stepsStreaks.current.timestamp * 1000L); + Date endDate = DateTimeUtils.shiftByDays(startDate, stepsStreaks.current.days - 1); //first day is 1 not 0 + date_current_value.setText(DateTimeUtils.formatDateRange(startDate, endDate)); } if (stepsStreaks.maximum.days > 0) { @@ -136,22 +147,31 @@ public class StepStreaksDashboard extends DialogFragment { average_maximum.setText(Integer.toString(stepsStreaks.maximum.steps / stepsStreaks.maximum.days)); total_maximum.setText(Integer.toString(stepsStreaks.maximum.steps)); - Date startDate = new Date(stepsStreaks.maximum.timestamp * 1000l); + Date startDate = new Date(stepsStreaks.maximum.timestamp * 1000L); Date endDate = DateTimeUtils.shiftByDays(startDate, stepsStreaks.maximum.days - 1); //first day is 1 not 0 - //date_maximum_value.setText(DateTimeUtils.formatDate(new Date(stepsStreaks.maximum.timestamp * 1000l))); date_maximum_value.setText(DateTimeUtils.formatDateRange(startDate, endDate)); - } - if (stepsStreaks.total.steps > 0 || backgroundFinished) { + if (stepsStreaks.total.steps > 0 || backgroundTaskFinished) { total.setVisibility(View.VISIBLE); - days_total_label.setText("Achievement\n rate"); + days_total_label.setText(R.string.steps_streaks_achievement_rate); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + //labels here have diferent meaning, so we must also add proper hint + days_total_label.setTooltipText(getString(R.string.steps_streaks_total_days_hint_totals)); + days_total.setTooltipText(getString(R.string.steps_streaks_total_days_hint_totals)); + date_total_label.setTooltipText(getString(R.string.steps_streaks_total_steps_hint_totals)); + } + days_total.setText(String.format("%.1f%%", 0.0)); if (stepsStreaks.total.total_days > 0) { days_total.setText(String.format("%.1f%%", (float) stepsStreaks.total.days / stepsStreaks.total.total_days * 100)); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + total_total.setTooltipText(String.format(getString(R.string.steps_streaks_total_steps_average_hint), stepsStreaks.total.steps / stepsStreaks.total.total_days)); + } + } if (stepsStreaks.total.timestamp > 0) { date_total_value.setVisibility(View.VISIBLE); - date_total_value.setText(String.format("Since %s", DateTimeUtils.formatDate(new Date(stepsStreaks.total.timestamp * 1000l)))); + date_total_value.setText(String.format(getString(R.string.steps_streaks_since_date), DateTimeUtils.formatDate(new Date(stepsStreaks.total.timestamp * 1000L)))); } else { date_total_value.setVisibility(View.GONE); } @@ -174,12 +194,12 @@ public class StepStreaksDashboard extends DialogFragment { @Override protected void doInBackground(DBHandler db) { switch (period) { - case "current": - calculateStreakData(db, "current", gbDevice, goal); + case PERIOD_CURRENT: + calculateStreakData(db, PERIOD_CURRENT, gbDevice, stepsGoal); break; - case "totals": - calculateStreakData(db, "totals", gbDevice, goal); + case PERIOD_TOTALS: + calculateStreakData(db, PERIOD_TOTALS, gbDevice, stepsGoal); break; } } @@ -194,8 +214,8 @@ public class StepStreaksDashboard extends DialogFragment { super.onPostExecute(o); FragmentActivity activity = getActivity(); if (activity != null && !activity.isFinishing() && !activity.isDestroyed()) { - if (period.equals("totals")) { - backgroundFinished = true; + if (period.equals(PERIOD_TOTALS)) { + backgroundTaskFinished = true; indicate_progress(false); } populateData(); @@ -219,7 +239,7 @@ public class StepStreaksDashboard extends DialogFragment { DailyTotals dailyTotals = new DailyTotals(); ActivitySample firstSample = dailyTotals.getFirstSample(db, device); Calendar firstDate = Calendar.getInstance(); - firstDate.setTime(DateTimeUtils.shiftByDays(new Date(firstSample.getTimestamp() * 1000l), -1)); + firstDate.setTime(DateTimeUtils.shiftByDays(new Date(firstSample.getTimestamp() * 1000L), -1)); //go one day back, to ensure we are before the first day, to calculate first day data as well while (true) { @@ -250,12 +270,12 @@ public class StepStreaksDashboard extends DialogFragment { Date newDate = DateTimeUtils.shiftByDays(new Date(day.getTimeInMillis()), -1); day.setTime(newDate); } else { - if (period.equals("current")) { + if (period.equals(PERIOD_CURRENT)) { stepsStreaks.current.days = streak_days; stepsStreaks.current.steps = streak_steps; stepsStreaks.current.timestamp = timestamp; return; - } else if (period.equals("totals")) { + } else if (period.equals(PERIOD_TOTALS)) { //reset max if (streak_days > stepsStreaks.maximum.days) { stepsStreaks.maximum.steps = streak_steps; @@ -271,7 +291,7 @@ public class StepStreaksDashboard extends DialogFragment { streak_steps = 0; Date newDate = DateTimeUtils.shiftByDays(new Date(day.getTimeInMillis()), -1); day.setTime(newDate); - if (day.before(firstDate) || day.get(Calendar.YEAR) < 2015) { //avoid rolling back too far, if the data has a timestamp 0 (Fossil...) + if (day.before(firstDate) || day.get(Calendar.YEAR) < MAX_YEAR) { //avoid rolling back too far, if the data has a timestamp 0 (Fossil...) return; } } diff --git a/app/src/main/res/layout-land/fragment_weeksteps_chart.xml b/app/src/main/res/layout-land/fragment_weeksteps_chart.xml index 3179f3375..867d6f99f 100644 --- a/app/src/main/res/layout-land/fragment_weeksteps_chart.xml +++ b/app/src/main/res/layout-land/fragment_weeksteps_chart.xml @@ -43,20 +43,16 @@ - + android:layout_marginStart="5dp" + android:layout_marginEnd="0dp" + android:visibility="visible" + app:srcCompat="@drawable/ic_events" /> diff --git a/app/src/main/res/layout/fragment_weeksteps_chart.xml b/app/src/main/res/layout/fragment_weeksteps_chart.xml index 42529a9ee..8b419c9c8 100644 --- a/app/src/main/res/layout/fragment_weeksteps_chart.xml +++ b/app/src/main/res/layout/fragment_weeksteps_chart.xml @@ -29,19 +29,16 @@ - + android:layout_alignParentTop="true" + android:layout_marginTop="0dp" + android:layout_marginEnd="0dp" + android:visibility="visible" + app:srcCompat="@drawable/ic_events" /> diff --git a/app/src/main/res/layout/steps_streak_average.xml b/app/src/main/res/layout/steps_streak_average.xml index af06bf876..2d37f7c10 100644 --- a/app/src/main/res/layout/steps_streak_average.xml +++ b/app/src/main/res/layout/steps_streak_average.xml @@ -17,11 +17,11 @@ android:gravity="center" android:maxLines="2" android:scrollHorizontally="false" - android:text="Average\n steps" - android:tooltipText="Average steps per day" + android:text="@string/steps_streaks_average_steps" android:textAllCaps="true" android:textColor="@color/accent" - android:textStyle="bold" /> + android:textStyle="bold" + android:tooltipText="@string/step_streak_average_steps_hint" /> + android:textSize="24sp" + android:tooltipText="@string/step_streak_average_steps_hint" /> \ No newline at end of file diff --git a/app/src/main/res/layout/steps_streak_current_line_layout.xml b/app/src/main/res/layout/steps_streak_current_line_layout.xml index 5b2eb8194..71aebe48a 100644 --- a/app/src/main/res/layout/steps_streak_current_line_layout.xml +++ b/app/src/main/res/layout/steps_streak_current_line_layout.xml @@ -4,7 +4,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" - android:layout_marginBottom="20dp" + android:layout_marginBottom="5dp" android:orientation="vertical"> @@ -32,8 +32,7 @@ android:layout_weight="1" android:gravity="center" android:maxLines="2" - android:scrollHorizontally="false" - android:text="date" /> + android:scrollHorizontally="false" /> + android:textStyle="bold" + android:tooltipText="@string/step_streak_days_hint" /> + android:textSize="24sp" + android:tooltipText="@string/step_streak_days_hint" /> \ No newline at end of file diff --git a/app/src/main/res/layout/steps_streak_maximum_line_layout.xml b/app/src/main/res/layout/steps_streak_maximum_line_layout.xml index 8e703dd48..69f8a72f8 100644 --- a/app/src/main/res/layout/steps_streak_maximum_line_layout.xml +++ b/app/src/main/res/layout/steps_streak_maximum_line_layout.xml @@ -4,7 +4,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="5dp" - android:layout_marginBottom="20dp" + android:layout_marginBottom="5dp" android:orientation="vertical"> @@ -32,8 +32,7 @@ android:layout_weight="1" android:gravity="center" android:maxLines="2" - android:scrollHorizontally="false" - android:text="date" /> + android:scrollHorizontally="false" /> + android:textStyle="bold" + android:tooltipText="@string/steps_streaks_total_steps_hint" /> + android:textSize="24sp" + android:tooltipText="@string/steps_streaks_total_steps_hint" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/steps_streak_total_line_layout.xml b/app/src/main/res/layout/steps_streak_total_line_layout.xml index f000767c2..59c1d68c4 100644 --- a/app/src/main/res/layout/steps_streak_total_line_layout.xml +++ b/app/src/main/res/layout/steps_streak_total_line_layout.xml @@ -5,8 +5,7 @@ android:layout_height="wrap_content" android:layout_marginTop="5dp" android:layout_marginBottom="0dp" - android:orientation="vertical" - > + android:orientation="vertical"> @@ -33,8 +32,7 @@ android:layout_weight="1" android:gravity="center" android:maxLines="2" - android:scrollHorizontally="false" - android:text="date" /> + android:scrollHorizontally="false" /> @@ -24,24 +24,29 @@ android:gravity="center" android:maxLines="2" android:scrollHorizontally="false" - android:text="Steps streaks" - android:tooltipText="Series of consecutive days without interruption with steps goal being reached" + android:text="@string/steps_streaks" android:textAllCaps="true" android:textSize="24sp" - android:textStyle="bold" /> + android:textStyle="bold" + android:tooltipText="@string/steps_streaks_hint" /> - + - + - + @@ -57,7 +62,6 @@ android:layout_width="171dp" android:layout_height="171dp" android:indeterminate="true" /> - diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e4918cf14..cabe27c51 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1730,5 +1730,21 @@ Connection over Bluetooth classic Connect on connection from device Establish a connection when connection is initiated by device, like headphones - Calculating steps data + + Since %s + Achievement\n rate + Percentage of days with achieved goal in relation to all days with steps + Total number of steps ever recorded + Total average %d steps per day + Number of consecutive days with steps goal being reached + Total number of steps in the whole streak + Average steps per day of the streak + Ongoing + Longest + Total + Steps streaks + Series of consecutive days without interruption with steps goal being reached + Total\nsteps + Streak\nDays + Average\nsteps