diff --git a/CHANGELOG.md b/CHANGELOG.md index 005a1e845..ee3045397 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ### Changelog #### Version NEXT -* Charts: added preference to disable swiping charts left/right +* Charts: added preference to disable swiping charts left/right and some UI changes #### Version 0.22.1 * Mi Band 2: Fix being detected as Amazfit Bip which lead to various problems especially on newly paired devices diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java index a2b0cb8c0..48cdb2793 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/AbstractChartFragment.java @@ -35,16 +35,12 @@ import com.github.mikephil.charting.charts.BarLineChartBase; import com.github.mikephil.charting.charts.Chart; import com.github.mikephil.charting.components.AxisBase; import com.github.mikephil.charting.components.YAxis; -import com.github.mikephil.charting.data.BarData; -import com.github.mikephil.charting.data.BarDataSet; -import com.github.mikephil.charting.data.BarEntry; import com.github.mikephil.charting.data.ChartData; -import com.github.mikephil.charting.data.CombinedData; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.LineData; import com.github.mikephil.charting.data.LineDataSet; import com.github.mikephil.charting.formatter.IAxisValueFormatter; -import com.github.mikephil.charting.interfaces.datasets.IBarDataSet; +import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -419,7 +415,7 @@ public abstract class AbstractChartFragment extends AbstractGBFragment { */ protected abstract void renderCharts(); - protected DefaultChartsData refresh(GBDevice gbDevice, List samples) { + protected DefaultChartsData refresh(GBDevice gbDevice, List samples) { // Calendar cal = GregorianCalendar.getInstance(); // cal.clear(); TimestampTranslation tsTranslation = new TimestampTranslation(); @@ -429,7 +425,7 @@ public abstract class AbstractChartFragment extends AbstractGBFragment { // ArrayList xLabels = null; LOG.info("" + getTitle() + ": number of samples:" + samples.size()); - CombinedData combinedData; + LineData lineData; if (samples.size() > 1) { boolean annotate = true; boolean use_steps_as_movement; @@ -437,10 +433,12 @@ public abstract class AbstractChartFragment extends AbstractGBFragment { int last_type = ActivityKind.TYPE_UNKNOWN; int numEntries = samples.size(); - List activityEntries = new ArrayList<>(numEntries); + List activityEntries = new ArrayList<>(numEntries); + List deepSleepEntries = new ArrayList<>(numEntries); + List lightSleepEntries = new ArrayList<>(numEntries); + List notWornEntries = new ArrayList<>(numEntries); boolean hr = supportsHeartrate(gbDevice); List heartrateEntries = hr ? new ArrayList(numEntries) : null; - List colors = new ArrayList<>(numEntries); // this is kinda inefficient... int lastHrSampleIndex = -1; for (int i = 0; i < numEntries; i++) { @@ -466,15 +464,34 @@ public abstract class AbstractChartFragment extends AbstractGBFragment { float value = movement; switch (type) { case ActivityKind.TYPE_DEEP_SLEEP: - value += SleepUtils.Y_VALUE_DEEP_SLEEP; - colors.add(akDeepSleep.color); + if (last_type != type) { //FIXME: this is ugly but it works (repeated in each case) + deepSleepEntries.add(createLineEntry(0, ts - 1)); + + lightSleepEntries.add(createLineEntry(0, ts)); + notWornEntries.add(createLineEntry(0, ts)); + activityEntries.add(createLineEntry(0, ts)); + } + deepSleepEntries.add(createLineEntry(value + SleepUtils.Y_VALUE_DEEP_SLEEP, ts)); break; case ActivityKind.TYPE_LIGHT_SLEEP: - colors.add(akLightSleep.color); + if (last_type != type) { + lightSleepEntries.add(createLineEntry(0, ts - 1)); + + deepSleepEntries.add(createLineEntry(0, ts)); + notWornEntries.add(createLineEntry(0, ts)); + activityEntries.add(createLineEntry(0, ts)); + } + lightSleepEntries.add(createLineEntry(value, ts)); break; case ActivityKind.TYPE_NOT_WORN: - value = SleepUtils.Y_VALUE_DEEP_SLEEP; //a small value, just to show something on the graphs - colors.add(akNotWorn.color); + if (last_type != type) { + notWornEntries.add(createLineEntry(0, ts - 1)); + + lightSleepEntries.add(createLineEntry(0, ts)); + deepSleepEntries.add(createLineEntry(0, ts)); + activityEntries.add(createLineEntry(0, ts)); + } + notWornEntries.add(createLineEntry(SleepUtils.Y_VALUE_DEEP_SLEEP, ts)); //a small value, just to show something on the graphs break; default: // short steps = sample.getSteps(); @@ -483,9 +500,15 @@ public abstract class AbstractChartFragment extends AbstractGBFragment { // movement = steps; // } // value = ((float) movement) / movement_divisor; - colors.add(akActivity.color); + if (last_type != type) { + activityEntries.add(createLineEntry(0, ts - 1)); + + lightSleepEntries.add(createLineEntry(0, ts)); + notWornEntries.add(createLineEntry(0, ts)); + deepSleepEntries.add(createLineEntry(0, ts)); + } + activityEntries.add(createLineEntry(value, ts)); } - activityEntries.add(createBarEntry(value, ts)); if (hr && isValidHeartRateValue(sample.getHeartRate())) { if (lastHrSampleIndex > -1 && ts - lastHrSampleIndex > 1800*HeartRateUtils.MAX_HR_MEASUREMENTS_GAP_MINUTES) { heartrateEntries.add(createLineEntry(0, lastHrSampleIndex + 1)); @@ -519,35 +542,36 @@ public abstract class AbstractChartFragment extends AbstractGBFragment { // chart.getXAxis().addLimitLine(line); // } // } -// last_type = type; } + last_type = type; } - BarDataSet activitySet = createActivitySet(activityEntries, colors, "Activity"); - // create a data object with the datasets -// combinedData = new CombinedData(xLabels); - combinedData = new CombinedData(); - List list = new ArrayList<>(); - list.add(activitySet); - BarData barData = new BarData(list); - barData.setBarWidth(200f); -// barData.setGroupSpace(0); - combinedData.setData(barData); + + List lineDataSets = new ArrayList<>(); + LineDataSet activitySet = createDataSet(activityEntries, akActivity.color, "Activity"); + lineDataSets.add(activitySet); + LineDataSet deepSleepSet = createDataSet(deepSleepEntries, akDeepSleep.color, "Deep Sleep"); + lineDataSets.add(deepSleepSet); + LineDataSet lightSleepSet = createDataSet(lightSleepEntries, akLightSleep.color, "Light Sleep"); + lineDataSets.add(lightSleepSet); + LineDataSet notWornSet = createDataSet(notWornEntries, akNotWorn.color, "Not worn"); + lineDataSets.add(notWornSet); if (hr && heartrateEntries.size() > 0) { LineDataSet heartrateSet = createHeartrateSet(heartrateEntries, "Heart Rate"); - LineData lineData = new LineData(heartrateSet); - combinedData.setData(lineData); + + lineDataSets.add(heartrateSet); } + lineData = new LineData(lineDataSets); // chart.setDescription(getString(R.string.sleep_activity_date_range, dateStringFrom, dateStringTo)); // chart.setDescriptionPosition(?, ?); } else { - combinedData = new CombinedData(); + lineData = new LineData(); } IAxisValueFormatter xValueFormatter = new SampleXLabelFormatter(tsTranslation); - return new DefaultChartsData(combinedData, xValueFormatter); + return new DefaultChartsData(lineData, xValueFormatter); } protected boolean isValidHeartRateValue(int value) { @@ -567,24 +591,21 @@ public abstract class AbstractChartFragment extends AbstractGBFragment { protected abstract void setupLegend(Chart chart); - protected BarEntry createBarEntry(float value, int xValue) { - return new BarEntry(xValue, value); - } - protected Entry createLineEntry(float value, int xValue) { return new Entry(xValue, value); } - protected BarDataSet createActivitySet(List values, List colors, String label) { - BarDataSet set1 = new BarDataSet(values, label); - set1.setColors(colors); + protected LineDataSet createDataSet(List values, Integer color, String label) { + LineDataSet set1 = new LineDataSet(values, label); + set1.setColor(color); // set1.setDrawCubic(true); // set1.setCubicIntensity(0.2f); -// //set1.setDrawFilled(true); -// set1.setDrawCircles(false); + set1.setDrawFilled(true); + set1.setDrawCircles(false); // set1.setLineWidth(2f); // set1.setCircleSize(5f); -// set1.setFillColor(ColorTemplate.getHoloBlue()); + set1.setFillColor(color); + set1.setFillAlpha(255); set1.setDrawValues(false); // set1.setHighLightColor(Color.rgb(128, 0, 255)); // set1.setColor(Color.rgb(89, 178, 44)); @@ -614,40 +635,6 @@ public abstract class AbstractChartFragment extends AbstractGBFragment { return set1; } - protected BarDataSet createDeepSleepSet(List values, String label) { - BarDataSet set1 = new BarDataSet(values, label); -// set1.setDrawCubic(true); -// set1.setCubicIntensity(0.2f); -// //set1.setDrawFilled(true); -// set1.setDrawCircles(false); -// set1.setLineWidth(2f); -// set1.setCircleSize(5f); -// set1.setFillColor(ColorTemplate.getHoloBlue()); - set1.setDrawValues(false); -// set1.setHighLightColor(Color.rgb(244, 117, 117)); -// set1.setColor(Color.rgb(76, 90, 255)); - set1.setValueTextColor(CHART_TEXT_COLOR); - return set1; - } - - protected BarDataSet createLightSleepSet(List values, String label) { - BarDataSet set1 = new BarDataSet(values, label); - -// set1.setDrawCubic(true); -// set1.setCubicIntensity(0.2f); -// //set1.setDrawFilled(true); -// set1.setDrawCircles(false); -// set1.setLineWidth(2f); -// set1.setCircleSize(5f); -// set1.setFillColor(ColorTemplate.getHoloBlue()); - set1.setDrawValues(false); -// set1.setHighLightColor(Color.rgb(244, 117, 117)); -// set1.setColor(Color.rgb(182, 191, 255)); - set1.setValueTextColor(CHART_TEXT_COLOR); -// set1.setColor(Color.CYAN); - return set1; - } - protected RefreshTask createRefreshTask(String task, Context context) { return new RefreshTask(task, context); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivitySleepChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivitySleepChartFragment.java index 99a59bb05..aaeeb6b9a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivitySleepChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/ActivitySleepChartFragment.java @@ -25,11 +25,12 @@ import android.view.View; import android.view.ViewGroup; import com.github.mikephil.charting.animation.Easing; -import com.github.mikephil.charting.charts.BarLineChartBase; import com.github.mikephil.charting.charts.Chart; +import com.github.mikephil.charting.charts.LineChart; import com.github.mikephil.charting.components.LegendEntry; import com.github.mikephil.charting.components.XAxis; import com.github.mikephil.charting.components.YAxis; +import com.github.mikephil.charting.data.LineData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -47,7 +48,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample; public class ActivitySleepChartFragment extends AbstractChartFragment { protected static final Logger LOG = LoggerFactory.getLogger(ActivitySleepChartFragment.class); - private BarLineChartBase mChart; + private LineChart mChart; private int mSmartAlarmFrom = -1; private int mSmartAlarmTo = -1; @@ -59,7 +60,7 @@ public class ActivitySleepChartFragment extends AbstractChartFragment { Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_charts, container, false); - mChart = (BarLineChartBase) rootView.findViewById(R.id.activitysleepchart); + mChart = (LineChart) rootView.findViewById(R.id.activitysleepchart); setupChart(); @@ -136,7 +137,7 @@ public class ActivitySleepChartFragment extends AbstractChartFragment { mChart.getLegend().setTextColor(LEGEND_TEXT_COLOR); mChart.setData(null); // workaround for https://github.com/PhilJay/MPAndroidChart/issues/2317 mChart.getXAxis().setValueFormatter(dcd.getXValueFormatter()); - mChart.setData(dcd.getData()); + mChart.setData((LineData) dcd.getData()); } @Override diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java index 326f193a8..419150adb 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/charts/SleepChartFragment.java @@ -26,13 +26,13 @@ import android.view.ViewGroup; import com.github.mikephil.charting.animation.Easing; import com.github.mikephil.charting.charts.Chart; -import com.github.mikephil.charting.charts.CombinedChart; +import com.github.mikephil.charting.charts.LineChart; import com.github.mikephil.charting.charts.PieChart; import com.github.mikephil.charting.components.LegendEntry; import com.github.mikephil.charting.components.XAxis; import com.github.mikephil.charting.components.YAxis; -import com.github.mikephil.charting.data.CombinedData; import com.github.mikephil.charting.data.Entry; +import com.github.mikephil.charting.data.LineData; import com.github.mikephil.charting.data.PieData; import com.github.mikephil.charting.data.PieDataSet; import com.github.mikephil.charting.data.PieEntry; @@ -60,7 +60,7 @@ import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils; public class SleepChartFragment extends AbstractChartFragment { protected static final Logger LOG = LoggerFactory.getLogger(ActivitySleepChartFragment.class); - private CombinedChart mActivityChart; + private LineChart mActivityChart; private PieChart mSleepAmountChart; private int mSmartAlarmFrom = -1; @@ -136,7 +136,7 @@ public class SleepChartFragment extends AbstractChartFragment { Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_sleepchart, container, false); - mActivityChart = (CombinedChart) rootView.findViewById(R.id.sleepchart); + mActivityChart = (LineChart) rootView.findViewById(R.id.sleepchart); mSleepAmountChart = (PieChart) rootView.findViewById(R.id.sleepchart_pie_light_deep); setupActivityChart(); @@ -262,10 +262,10 @@ public class SleepChartFragment extends AbstractChartFragment { } private static class MyChartsData extends ChartsData { - private final DefaultChartsData chartsData; + private final DefaultChartsData chartsData; private final MySleepChartsData pieData; - public MyChartsData(MySleepChartsData pieData, DefaultChartsData chartsData) { + public MyChartsData(MySleepChartsData pieData, DefaultChartsData chartsData) { this.pieData = pieData; this.chartsData = chartsData; } @@ -274,7 +274,7 @@ public class SleepChartFragment extends AbstractChartFragment { return pieData; } - public DefaultChartsData getChartsData() { + public DefaultChartsData getChartsData() { return chartsData; } } diff --git a/app/src/main/res/layout-land/fragment_sleepchart.xml b/app/src/main/res/layout-land/fragment_sleepchart.xml index 0761e1b6f..97b877baf 100644 --- a/app/src/main/res/layout-land/fragment_sleepchart.xml +++ b/app/src/main/res/layout-land/fragment_sleepchart.xml @@ -11,7 +11,7 @@ android:layout_weight="40"> - - - - Charts: added preference to disable swiping charts left/right + Charts: added preference to disable swiping charts left/right and some UI changes + Mi Band 2: Fix being detected as Amazfit Bip which lead to various problems especially on newly paired devices