mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-06-24 22:10:55 +02:00
dee492bc4f
(otherwise we get ArrayIndexOutOfBoundsException when the chart refreshes and the wrong xLabels, potentially with fewer entries are used)
169 lines
6.0 KiB
Java
169 lines
6.0 KiB
Java
package nodomain.freeyourgadget.gadgetbridge.activities.charts;
|
|
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.os.Bundle;
|
|
import android.view.LayoutInflater;
|
|
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.components.LegendEntry;
|
|
import com.github.mikephil.charting.components.XAxis;
|
|
import com.github.mikephil.charting.components.YAxis;
|
|
import com.github.mikephil.charting.data.CombinedData;
|
|
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
|
import nodomain.freeyourgadget.gadgetbridge.activities.HeartRateUtils;
|
|
import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
|
|
import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
|
|
import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample;
|
|
|
|
|
|
public class ActivitySleepChartFragment extends AbstractChartFragment {
|
|
protected static final Logger LOG = LoggerFactory.getLogger(ActivitySleepChartFragment.class);
|
|
|
|
private BarLineChartBase mChart;
|
|
|
|
private int mSmartAlarmFrom = -1;
|
|
private int mSmartAlarmTo = -1;
|
|
private int mTimestampFrom = -1;
|
|
private int mSmartAlarmGoneOff = -1;
|
|
|
|
@Override
|
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
|
Bundle savedInstanceState) {
|
|
View rootView = inflater.inflate(R.layout.fragment_charts, container, false);
|
|
|
|
mChart = (BarLineChartBase) rootView.findViewById(R.id.activitysleepchart);
|
|
|
|
setupChart();
|
|
|
|
return rootView;
|
|
}
|
|
|
|
@Override
|
|
public String getTitle() {
|
|
return getString(R.string.activity_sleepchart_activity_and_sleep);
|
|
}
|
|
|
|
private void setupChart() {
|
|
mChart.setBackgroundColor(BACKGROUND_COLOR);
|
|
mChart.getDescription().setTextColor(DESCRIPTION_COLOR);
|
|
configureBarLineChartDefaults(mChart);
|
|
|
|
|
|
XAxis x = mChart.getXAxis();
|
|
x.setDrawLabels(true);
|
|
x.setDrawGridLines(false);
|
|
x.setEnabled(true);
|
|
x.setTextColor(CHART_TEXT_COLOR);
|
|
x.setDrawLimitLinesBehindData(true);
|
|
|
|
YAxis y = mChart.getAxisLeft();
|
|
y.setDrawGridLines(false);
|
|
// y.setDrawLabels(false);
|
|
// TODO: make fixed max value optional
|
|
y.setAxisMaxValue(1f);
|
|
y.setAxisMinValue(0);
|
|
y.setDrawTopYLabelEntry(false);
|
|
y.setTextColor(CHART_TEXT_COLOR);
|
|
|
|
// y.setLabelCount(5);
|
|
y.setEnabled(true);
|
|
|
|
YAxis yAxisRight = mChart.getAxisRight();
|
|
yAxisRight.setDrawGridLines(false);
|
|
yAxisRight.setEnabled(supportsHeartrate(getChartsHost().getDevice()));
|
|
yAxisRight.setDrawLabels(true);
|
|
yAxisRight.setDrawTopYLabelEntry(true);
|
|
yAxisRight.setTextColor(CHART_TEXT_COLOR);
|
|
yAxisRight.setAxisMaxValue(HeartRateUtils.MAX_HEART_RATE_VALUE);
|
|
yAxisRight.setAxisMinValue(HeartRateUtils.MIN_HEART_RATE_VALUE);
|
|
|
|
// refresh immediately instead of use refreshIfVisible(), for perceived performance
|
|
refresh();
|
|
}
|
|
|
|
@Override
|
|
public void onReceive(Context context, Intent intent) {
|
|
String action = intent.getAction();
|
|
if (action.equals(ChartsHost.REFRESH)) {
|
|
// TODO: use LimitLines to visualize smart alarms?
|
|
mSmartAlarmFrom = intent.getIntExtra("smartalarm_from", -1);
|
|
mSmartAlarmTo = intent.getIntExtra("smartalarm_to", -1);
|
|
mTimestampFrom = intent.getIntExtra("recording_base_timestamp", -1);
|
|
mSmartAlarmGoneOff = intent.getIntExtra("alarm_gone_off", -1);
|
|
refresh();
|
|
} else {
|
|
super.onReceive(context, intent);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected ChartsData refreshInBackground(ChartsHost chartsHost, DBHandler db, GBDevice device) {
|
|
List<? extends ActivitySample> samples = getSamples(db, device);
|
|
return refresh(device, samples);
|
|
}
|
|
|
|
@Override
|
|
protected void updateChartsnUIThread(ChartsData chartsData) {
|
|
DefaultChartsData dcd = (DefaultChartsData) chartsData;
|
|
mChart.getLegend().setTextColor(LEGEND_TEXT_COLOR);
|
|
mChart.setData(null); // workaround for https://github.com/PhilJay/MPAndroidChart/issues/2317
|
|
xIndexFormatter.setxLabels(dcd.getXLabels());
|
|
mChart.setData(dcd.getCombinedData());
|
|
}
|
|
|
|
@Override
|
|
protected void renderCharts() {
|
|
mChart.animateX(ANIM_TIME, Easing.EasingOption.EaseInOutQuart);
|
|
}
|
|
|
|
@Override
|
|
protected void setupLegend(Chart chart) {
|
|
List<LegendEntry> legendEntries = new ArrayList<>(5);
|
|
|
|
LegendEntry activityEntry = new LegendEntry();
|
|
activityEntry.label = akActivity.label;
|
|
activityEntry.formColor = akActivity.color;
|
|
legendEntries.add(activityEntry);
|
|
|
|
LegendEntry lightSleepEntry = new LegendEntry();
|
|
lightSleepEntry.label = akLightSleep.label;
|
|
lightSleepEntry.formColor = akLightSleep.color;
|
|
legendEntries.add(lightSleepEntry);
|
|
|
|
LegendEntry deepSleepEntry = new LegendEntry();
|
|
deepSleepEntry.label = akDeepSleep.label;
|
|
deepSleepEntry.formColor = akDeepSleep.color;
|
|
legendEntries.add(deepSleepEntry);
|
|
|
|
LegendEntry notWornEntry = new LegendEntry();
|
|
notWornEntry.label = akNotWorn.label;
|
|
notWornEntry.formColor = akNotWorn.color;
|
|
legendEntries.add(notWornEntry);
|
|
|
|
if (supportsHeartrate(getChartsHost().getDevice())) {
|
|
LegendEntry hrEntry = new LegendEntry();
|
|
hrEntry.label = HEARTRATE_LABEL;
|
|
hrEntry.formColor = HEARTRATE_COLOR;
|
|
legendEntries.add(hrEntry);
|
|
}
|
|
chart.getLegend().setCustom(legendEntries);
|
|
}
|
|
|
|
@Override
|
|
protected List<? extends ActivitySample> getSamples(DBHandler db, GBDevice device, int tsFrom, int tsTo) {
|
|
return getAllSamples(db, device, tsFrom, tsTo);
|
|
}
|
|
}
|