From aac9827e6373b44b2fce5b95036149a6a87820ef Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Sat, 25 Feb 2017 17:58:19 +0100 Subject: [PATCH 1/2] remove OnboardingActivity from manifest (its gone) --- app/src/main/AndroidManifest.xml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b4132de8f..6117c5081 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -272,11 +272,6 @@ android:parentActivityName=".activities.ControlCenter" android:screenOrientation="portrait" android:windowSoftInputMode="stateHidden" /> - Date: Sun, 26 Feb 2017 00:40:50 +0100 Subject: [PATCH 2/2] Speedup for charts by caching aggregated sleep amounts and steps for maximum 32 days --- .../charts/AbstractWeekChartFragment.java | 40 ++++++++++++++----- .../activities/charts/ActivityAnalysis.java | 5 +++ .../activities/charts/ChartsActivity.java | 3 ++ .../charts/WeekSleepChartFragment.java | 8 +--- .../charts/WeekStepsChartFragment.java | 15 ++++--- .../gadgetbridge/model/ActivityAmount.java | 9 +++++ .../gadgetbridge/util/LimitedQueue.java | 6 +-- 7 files changed, 62 insertions(+), 24 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 572036943..a46bd1af6 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 @@ -1,5 +1,6 @@ package nodomain.freeyourgadget.gadgetbridge.activities.charts; +import android.app.Activity; import android.graphics.Color; import android.os.Bundle; import android.view.LayoutInflater; @@ -31,7 +32,9 @@ import java.util.Locale; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.database.DBHandler; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; +import nodomain.freeyourgadget.gadgetbridge.model.ActivityAmounts; import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; +import nodomain.freeyourgadget.gadgetbridge.util.LimitedQueue; public abstract class AbstractWeekChartFragment extends AbstractChartFragment { @@ -75,16 +78,15 @@ public abstract class AbstractWeekChartFragment extends AbstractChartFragment { } private DefaultChartsData refreshWeekBeforeData(DBHandler db, BarChart barChart, Calendar day, GBDevice device) { - - ActivityAnalysis analysis = new ActivityAnalysis(); - day = (Calendar) day.clone(); // do not modify the caller's argument day.add(Calendar.DATE, -7); List entries = new ArrayList<>(); ArrayList labels = new ArrayList(); for (int counter = 0; counter < 7; counter++) { - entries.add(new BarEntry(counter, getTotalForSamples(getSamplesOfDay(db, day, device)))); + ActivityAmounts amounts = getActivityAmountsForDay(db, day, device); + + entries.add(new BarEntry(counter, getTotalForActivityAmounts(amounts))); labels.add(day.getDisplayName(Calendar.DAY_OF_WEEK, Calendar.SHORT, mLocale)); day.add(Calendar.DATE, 1); } @@ -103,10 +105,9 @@ public abstract class AbstractWeekChartFragment extends AbstractChartFragment { return new DefaultChartsData(barData, new PreformattedXIndexLabelFormatter(labels)); } - private DayData refreshDayPie(DBHandler db, Calendar day, GBDevice device) { - - int totalValue = getTotalForSamples(getSamplesOfDay(db, day, device)); + ActivityAmounts amounts = getActivityAmountsForDay(db, day, device); + int totalValue = getTotalForActivityAmounts(amounts); PieData data = new PieData(); List entries = new ArrayList<>(); @@ -261,12 +262,33 @@ public abstract class AbstractWeekChartFragment extends AbstractChartFragment { } } + private ActivityAmounts getActivityAmountsForDay(DBHandler db, Calendar day, GBDevice device) { + + LimitedQueue activityAmountCache = null; + ActivityAmounts amounts = null; + + Activity activity = getActivity(); + if (activity != null) { + activityAmountCache = ((ChartsActivity) activity).mActivityAmountCache; + amounts = (ActivityAmounts) (activityAmountCache.lookup(day.hashCode())); + } + + if (amounts == null) { + ActivityAnalysis analysis = new ActivityAnalysis(); + amounts = analysis.calculateActivityAmounts(getSamplesOfDay(db, day, device)); + if (activityAmountCache != null) { + activityAmountCache.add(day.hashCode(), amounts); + } + } + + return amounts; + } + abstract int getGoal(); - abstract int getTotalForSamples(List activitySamples); + abstract int getTotalForActivityAmounts(ActivityAmounts activityAmounts); abstract IValueFormatter getFormatter(); abstract Integer getMainColor(); } - diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityAnalysis.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityAnalysis.java index 1d3d3669e..0bfce5725 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityAnalysis.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivityAnalysis.java @@ -34,6 +34,11 @@ class ActivityAnalysis { break; } + int steps = sample.getSteps(); + if (steps > 0) { + amount.addSteps(sample.getSteps()); + } + if (previousSample != null) { long timeDifference = sample.getTimestamp() - previousSample.getTimestamp(); if (previousSample.getRawKind() == sample.getRawKind()) { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ChartsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ChartsActivity.java index 2b897d516..02adaeb26 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ChartsActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ChartsActivity.java @@ -37,6 +37,7 @@ import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils; import nodomain.freeyourgadget.gadgetbridge.util.DeviceHelper; import nodomain.freeyourgadget.gadgetbridge.util.GB; +import nodomain.freeyourgadget.gadgetbridge.util.LimitedQueue; public class ChartsActivity extends AbstractGBFragmentActivity implements ChartsHost { @@ -52,6 +53,8 @@ public class ChartsActivity extends AbstractGBFragmentActivity implements Charts private PagerTabStrip mPagerTabStrip; private ViewPager viewPager; + LimitedQueue mActivityAmountCache = new LimitedQueue(32); + private static class ShowDurationDialog extends Dialog { private final String mDuration; private TextView durationLabel; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java index 9e85d1449..21625c5fa 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekSleepChartFragment.java @@ -4,14 +4,12 @@ import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.formatter.IValueFormatter; import com.github.mikephil.charting.utils.ViewPortHandler; -import java.util.List; import java.util.concurrent.TimeUnit; import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.model.ActivityAmount; import nodomain.freeyourgadget.gadgetbridge.model.ActivityAmounts; import nodomain.freeyourgadget.gadgetbridge.model.ActivityKind; -import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils; public class WeekSleepChartFragment extends AbstractWeekChartFragment { @@ -26,11 +24,9 @@ public class WeekSleepChartFragment extends AbstractWeekChartFragment { } @Override - int getTotalForSamples(List activitySamples) { - ActivityAnalysis analysis = new ActivityAnalysis(); - ActivityAmounts amounts = analysis.calculateActivityAmounts(activitySamples); + int getTotalForActivityAmounts(ActivityAmounts activityAmounts) { long totalSeconds = 0; - for (ActivityAmount amount : amounts.getAmounts()) { + for (ActivityAmount amount : activityAmounts.getAmounts()) { if ((amount.getActivityKind() & ActivityKind.TYPE_SLEEP) != 0) { totalSeconds += amount.getTotalSeconds(); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java index 5439f2531..f0cfb5d6d 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/WeekStepsChartFragment.java @@ -2,12 +2,11 @@ package nodomain.freeyourgadget.gadgetbridge.activities.charts; import com.github.mikephil.charting.formatter.IValueFormatter; -import java.util.List; - import nodomain.freeyourgadget.gadgetbridge.R; import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandCoordinator; import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice; -import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; +import nodomain.freeyourgadget.gadgetbridge.model.ActivityAmount; +import nodomain.freeyourgadget.gadgetbridge.model.ActivityAmounts; public class WeekStepsChartFragment extends AbstractWeekChartFragment { @Override @@ -25,9 +24,13 @@ public class WeekStepsChartFragment extends AbstractWeekChartFragment { } @Override - int getTotalForSamples(List activitySamples) { - ActivityAnalysis analysis = new ActivityAnalysis(); - return analysis.calculateTotalSteps(activitySamples); + int getTotalForActivityAmounts(ActivityAmounts activityAmounts) { + int totalSteps = 0; + for (ActivityAmount amount : activityAmounts.getAmounts()) { + totalSteps += amount.getTotalSteps(); + amount.getTotalSteps(); + } + return totalSteps; } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityAmount.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityAmount.java index 17a2873c7..86bda1b01 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityAmount.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/ActivityAmount.java @@ -8,6 +8,7 @@ public class ActivityAmount { private final int activityKind; private short percent; private long totalSeconds; + private long totalSteps; public ActivityAmount(int activityKind) { this.activityKind = activityKind; @@ -17,10 +18,18 @@ public class ActivityAmount { totalSeconds += seconds; } + public void addSteps(long steps) { + totalSteps += steps; + } + public long getTotalSeconds() { return totalSeconds; } + public long getTotalSteps() { + return totalSteps; + } + public int getActivityKind() { return activityKind; } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LimitedQueue.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LimitedQueue.java index eb8ef7aa2..f44cd3fed 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LimitedQueue.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/util/LimitedQueue.java @@ -13,14 +13,14 @@ public class LimitedQueue { this.limit = limit; } - public void add(int id, Object obj) { + synchronized public void add(int id, Object obj) { if (list.size() > limit - 1) { list.removeFirst(); } list.add(new Pair<>(id, obj)); } - public void remove(int id) { + synchronized public void remove(int id) { for (Iterator iter = list.iterator(); iter.hasNext(); ) { Pair pair = iter.next(); if ((Integer) pair.first == id) { @@ -29,7 +29,7 @@ public class LimitedQueue { } } - public Object lookup(int id) { + synchronized public Object lookup(int id) { for (Pair entry : list) { if (id == (Integer) entry.first) { return entry.second;