mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2025-02-10 00:46:47 +01:00
Work in progress #45
Comparison between Light Sleep and Deep Sleep. (Currently wrong, needs more analysis)
This commit is contained in:
parent
b1e2671bec
commit
d498bd976a
@ -33,6 +33,9 @@ public class GBActivitySample {
|
|||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Timestamp of the sample, resolution is seconds!
|
||||||
|
*/
|
||||||
public int getTimestamp() {
|
public int getTimestamp() {
|
||||||
return timestamp;
|
return timestamp;
|
||||||
}
|
}
|
||||||
|
@ -133,14 +133,11 @@ public abstract class AbstractChartFragment extends Fragment {
|
|||||||
chart.setDrawGridBackground(false);
|
chart.setDrawGridBackground(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void refresh(GBDevice mGBDevice, BarLineChartBase chart) {
|
protected void refresh(GBDevice gbDevice, BarLineChartBase chart, List<GBActivitySample> samples) {
|
||||||
if (mGBDevice == null) {
|
if (gbDevice == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ArrayList<GBActivitySample> samples = getTestSamples(mGBDevice, -1, -1);
|
|
||||||
List<GBActivitySample> samples = getSamples(mGBDevice, -1, -1);
|
|
||||||
|
|
||||||
Calendar cal = GregorianCalendar.getInstance();
|
Calendar cal = GregorianCalendar.getInstance();
|
||||||
cal.clear();
|
cal.clear();
|
||||||
Date date;
|
Date date;
|
||||||
@ -152,7 +149,7 @@ public abstract class AbstractChartFragment extends Fragment {
|
|||||||
float movement_divisor;
|
float movement_divisor;
|
||||||
boolean annotate = true;
|
boolean annotate = true;
|
||||||
boolean use_steps_as_movement;
|
boolean use_steps_as_movement;
|
||||||
switch (getProvider(mGBDevice)) {
|
switch (getProvider(gbDevice)) {
|
||||||
case GBActivitySample.PROVIDER_MIBAND:
|
case GBActivitySample.PROVIDER_MIBAND:
|
||||||
// maybe this should be configurable 256 seems way off, though.
|
// maybe this should be configurable 256 seems way off, though.
|
||||||
movement_divisor = 180.0f; //256.0f;
|
movement_divisor = 180.0f; //256.0f;
|
||||||
@ -278,7 +275,7 @@ public abstract class AbstractChartFragment extends Fragment {
|
|||||||
|
|
||||||
protected abstract List<GBActivitySample> getSamples(GBDevice device, int tsFrom, int tsTo);
|
protected abstract List<GBActivitySample> getSamples(GBDevice device, int tsFrom, int tsTo);
|
||||||
|
|
||||||
protected abstract void setupLegend(BarLineChartBase chart);
|
protected abstract void setupLegend(Chart chart);
|
||||||
|
|
||||||
protected BarEntry createBarEntry(float value, int index) {
|
protected BarEntry createBarEntry(float value, int index) {
|
||||||
return new BarEntry(value, index);
|
return new BarEntry(value, index);
|
||||||
|
@ -11,6 +11,7 @@ import android.view.View;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
import com.github.mikephil.charting.charts.BarLineChartBase;
|
import com.github.mikephil.charting.charts.BarLineChartBase;
|
||||||
|
import com.github.mikephil.charting.charts.Chart;
|
||||||
import com.github.mikephil.charting.components.XAxis;
|
import com.github.mikephil.charting.components.XAxis;
|
||||||
import com.github.mikephil.charting.components.YAxis;
|
import com.github.mikephil.charting.components.YAxis;
|
||||||
|
|
||||||
@ -47,7 +48,8 @@ public class ActivitySleepChartFragment extends AbstractChartFragment {
|
|||||||
mSmartAlarmTo = intent.getIntExtra("smartalarm_to", -1);
|
mSmartAlarmTo = intent.getIntExtra("smartalarm_to", -1);
|
||||||
mTimestampFrom = intent.getIntExtra("recording_base_timestamp", -1);
|
mTimestampFrom = intent.getIntExtra("recording_base_timestamp", -1);
|
||||||
mSmartAlarmGoneOff = intent.getIntExtra("alarm_gone_off", -1);
|
mSmartAlarmGoneOff = intent.getIntExtra("alarm_gone_off", -1);
|
||||||
refresh(mGBDevice, mChart);
|
List<GBActivitySample> samples = getSamples(mGBDevice, -1, -1);
|
||||||
|
refresh(mGBDevice, mChart, samples);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -68,7 +70,7 @@ public class ActivitySleepChartFragment extends AbstractChartFragment {
|
|||||||
|
|
||||||
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver, filter);
|
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver, filter);
|
||||||
|
|
||||||
mChart = (BarLineChartBase) rootView.findViewById(R.id.sleepchart);
|
mChart = (BarLineChartBase) rootView.findViewById(R.id.activitysleepchart);
|
||||||
|
|
||||||
setupChart();
|
setupChart();
|
||||||
|
|
||||||
@ -106,7 +108,8 @@ public class ActivitySleepChartFragment extends AbstractChartFragment {
|
|||||||
yAxisRight.setDrawTopYLabelEntry(false);
|
yAxisRight.setDrawTopYLabelEntry(false);
|
||||||
yAxisRight.setTextColor(CHART_TEXT_COLOR);
|
yAxisRight.setTextColor(CHART_TEXT_COLOR);
|
||||||
|
|
||||||
refresh(mGBDevice, mChart);
|
List<GBActivitySample> samples = getSamples(mGBDevice, -1, -1);
|
||||||
|
refresh(mGBDevice, mChart, samples);
|
||||||
|
|
||||||
mChart.getLegend().setTextColor(LEGEND_TEXT_COLOR);
|
mChart.getLegend().setTextColor(LEGEND_TEXT_COLOR);
|
||||||
// mChart.getLegend().setEnabled(false);
|
// mChart.getLegend().setEnabled(false);
|
||||||
@ -123,7 +126,7 @@ public class ActivitySleepChartFragment extends AbstractChartFragment {
|
|||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setupLegend(BarLineChartBase chart) {
|
protected void setupLegend(Chart chart) {
|
||||||
List<Integer> legendColors = new ArrayList<>(3);
|
List<Integer> legendColors = new ArrayList<>(3);
|
||||||
List<String> legendLabels = new ArrayList<>(3);
|
List<String> legendLabels = new ArrayList<>(3);
|
||||||
legendColors.add(akActivity.color);
|
legendColors.add(akActivity.color);
|
||||||
|
@ -11,8 +11,13 @@ import android.view.View;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
import com.github.mikephil.charting.charts.BarLineChartBase;
|
import com.github.mikephil.charting.charts.BarLineChartBase;
|
||||||
|
import com.github.mikephil.charting.charts.Chart;
|
||||||
|
import com.github.mikephil.charting.charts.PieChart;
|
||||||
import com.github.mikephil.charting.components.XAxis;
|
import com.github.mikephil.charting.components.XAxis;
|
||||||
import com.github.mikephil.charting.components.YAxis;
|
import com.github.mikephil.charting.components.YAxis;
|
||||||
|
import com.github.mikephil.charting.data.Entry;
|
||||||
|
import com.github.mikephil.charting.data.PieData;
|
||||||
|
import com.github.mikephil.charting.data.PieDataSet;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@ -24,12 +29,16 @@ import nodomain.freeyourgadget.gadgetbridge.ControlCenter;
|
|||||||
import nodomain.freeyourgadget.gadgetbridge.GBActivitySample;
|
import nodomain.freeyourgadget.gadgetbridge.GBActivitySample;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBDevice;
|
import nodomain.freeyourgadget.gadgetbridge.GBDevice;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.charts.ActivityAmount;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.charts.ActivityAmounts;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.charts.ActivityAnalysis;
|
||||||
|
|
||||||
|
|
||||||
public class SleepChartFragment extends AbstractChartFragment {
|
public class SleepChartFragment extends AbstractChartFragment {
|
||||||
protected static final Logger LOG = LoggerFactory.getLogger(ActivitySleepChartFragment.class);
|
protected static final Logger LOG = LoggerFactory.getLogger(ActivitySleepChartFragment.class);
|
||||||
|
|
||||||
private BarLineChartBase mChart;
|
private BarLineChartBase mActivityChart;
|
||||||
|
private PieChart mSleepAmountChart;
|
||||||
|
|
||||||
private int mSmartAlarmFrom = -1;
|
private int mSmartAlarmFrom = -1;
|
||||||
private int mSmartAlarmTo = -1;
|
private int mSmartAlarmTo = -1;
|
||||||
@ -47,15 +56,62 @@ public class SleepChartFragment extends AbstractChartFragment {
|
|||||||
mSmartAlarmTo = intent.getIntExtra("smartalarm_to", -1);
|
mSmartAlarmTo = intent.getIntExtra("smartalarm_to", -1);
|
||||||
mTimestampFrom = intent.getIntExtra("recording_base_timestamp", -1);
|
mTimestampFrom = intent.getIntExtra("recording_base_timestamp", -1);
|
||||||
mSmartAlarmGoneOff = intent.getIntExtra("alarm_gone_off", -1);
|
mSmartAlarmGoneOff = intent.getIntExtra("alarm_gone_off", -1);
|
||||||
refresh(mGBDevice, mChart);
|
refresh();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private void refresh() {
|
||||||
|
List<GBActivitySample> samples = getSamples();
|
||||||
|
refresh(mGBDevice, mActivityChart, getSamples());
|
||||||
|
refreshSleepAmounts(mGBDevice, mSleepAmountChart, samples);
|
||||||
|
|
||||||
|
mActivityChart.invalidate();
|
||||||
|
mSleepAmountChart.invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<GBActivitySample> getSamples() {
|
||||||
|
return getSamples(mGBDevice, -1, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void refreshSleepAmounts(GBDevice mGBDevice, PieChart pieChart, List<GBActivitySample> samples) {
|
||||||
|
ActivityAnalysis analysis = new ActivityAnalysis();
|
||||||
|
ActivityAmounts amounts = analysis.calculateActivityAmounts(samples);
|
||||||
|
float hoursOfSleep = amounts.getTotalSeconds() / (float) (60 * 60);
|
||||||
|
pieChart.setCenterText((int)hoursOfSleep + "h"); // FIXME
|
||||||
|
PieData data = new PieData();
|
||||||
|
List<Entry> entries = new ArrayList<>();
|
||||||
|
List<Integer> colors = new ArrayList<>();
|
||||||
|
int index = 0;
|
||||||
|
for (ActivityAmount amount : amounts.getAmounts()) {
|
||||||
|
entries.add(new Entry(amount.getTotalSeconds(), index++));
|
||||||
|
colors.add(getColorFor(amount.getActivityKind()));
|
||||||
|
data.addXValue(amount.getName(getActivity()));
|
||||||
|
}
|
||||||
|
PieDataSet set = new PieDataSet(entries, "Sleep comparison");
|
||||||
|
set.setColors(colors);
|
||||||
|
data.setDataSet(set);
|
||||||
|
pieChart.setData(data);
|
||||||
|
|
||||||
|
setupLegend(pieChart);
|
||||||
|
|
||||||
|
pieChart.invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Integer getColorFor(int activityKind) {
|
||||||
|
switch (activityKind) {
|
||||||
|
case nodomain.freeyourgadget.gadgetbridge.charts.ActivityKind.TYPE_DEEP_SLEEP:
|
||||||
|
return akDeepSleep.color;
|
||||||
|
case nodomain.freeyourgadget.gadgetbridge.charts.ActivityKind.TYPE_LIGHT_SLEEP:
|
||||||
|
return akLightSleep.color;
|
||||||
|
}
|
||||||
|
return akActivity.color;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
public View onCreateView(LayoutInflater inflater, ViewGroup container,
|
||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
View rootView = inflater.inflate(R.layout.fragment_charts, container, false);
|
View rootView = inflater.inflate(R.layout.fragment_sleepchart, container, false);
|
||||||
|
|
||||||
Bundle extras = getActivity().getIntent().getExtras();
|
Bundle extras = getActivity().getIntent().getExtras();
|
||||||
if (extras != null) {
|
if (extras != null) {
|
||||||
@ -68,32 +124,42 @@ public class SleepChartFragment extends AbstractChartFragment {
|
|||||||
|
|
||||||
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver, filter);
|
LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver, filter);
|
||||||
|
|
||||||
mChart = (BarLineChartBase) rootView.findViewById(R.id.sleepchart);
|
mActivityChart = (BarLineChartBase) rootView.findViewById(R.id.sleepchart);
|
||||||
|
mSleepAmountChart = (PieChart) rootView.findViewById(R.id.sleepchart_pie_light_deep);
|
||||||
|
|
||||||
setupChart();
|
setupActivityChart();
|
||||||
|
setupSleepAmountChart();
|
||||||
|
|
||||||
|
refresh();
|
||||||
|
|
||||||
return rootView;
|
return rootView;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setupSleepAmountChart() {
|
||||||
|
mSleepAmountChart.setBackgroundColor(BACKGROUND_COLOR);
|
||||||
|
mSleepAmountChart.setDescriptionColor(DESCRIPTION_COLOR);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mReceiver);
|
LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mReceiver);
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupChart() {
|
|
||||||
mChart.setBackgroundColor(BACKGROUND_COLOR);
|
|
||||||
mChart.setDescriptionColor(DESCRIPTION_COLOR);
|
|
||||||
configureBarLineChartDefaults(mChart);
|
|
||||||
|
|
||||||
XAxis x = mChart.getXAxis();
|
private void setupActivityChart() {
|
||||||
|
mActivityChart.setBackgroundColor(BACKGROUND_COLOR);
|
||||||
|
mActivityChart.setDescriptionColor(DESCRIPTION_COLOR);
|
||||||
|
configureBarLineChartDefaults(mActivityChart);
|
||||||
|
|
||||||
|
XAxis x = mActivityChart.getXAxis();
|
||||||
x.setDrawLabels(true);
|
x.setDrawLabels(true);
|
||||||
x.setDrawGridLines(false);
|
x.setDrawGridLines(false);
|
||||||
x.setEnabled(true);
|
x.setEnabled(true);
|
||||||
x.setTextColor(CHART_TEXT_COLOR);
|
x.setTextColor(CHART_TEXT_COLOR);
|
||||||
x.setDrawLimitLinesBehindData(true);
|
x.setDrawLimitLinesBehindData(true);
|
||||||
|
|
||||||
YAxis y = mChart.getAxisLeft();
|
YAxis y = mActivityChart.getAxisLeft();
|
||||||
y.setDrawGridLines(false);
|
y.setDrawGridLines(false);
|
||||||
// y.setDrawLabels(false);
|
// y.setDrawLabels(false);
|
||||||
// TODO: make fixed max value optional
|
// TODO: make fixed max value optional
|
||||||
@ -104,33 +170,31 @@ public class SleepChartFragment extends AbstractChartFragment {
|
|||||||
// y.setLabelCount(5);
|
// y.setLabelCount(5);
|
||||||
y.setEnabled(true);
|
y.setEnabled(true);
|
||||||
|
|
||||||
YAxis yAxisRight = mChart.getAxisRight();
|
YAxis yAxisRight = mActivityChart.getAxisRight();
|
||||||
yAxisRight.setDrawGridLines(false);
|
yAxisRight.setDrawGridLines(false);
|
||||||
yAxisRight.setEnabled(false);
|
yAxisRight.setEnabled(false);
|
||||||
yAxisRight.setDrawLabels(false);
|
yAxisRight.setDrawLabels(false);
|
||||||
yAxisRight.setDrawTopYLabelEntry(false);
|
yAxisRight.setDrawTopYLabelEntry(false);
|
||||||
yAxisRight.setTextColor(CHART_TEXT_COLOR);
|
yAxisRight.setTextColor(CHART_TEXT_COLOR);
|
||||||
|
|
||||||
refresh(mGBDevice, mChart);
|
// mActivityChart.getLegend().setEnabled(false);
|
||||||
|
|
||||||
mChart.getLegend().setTextColor(LEGEND_TEXT_COLOR);
|
|
||||||
// mChart.getLegend().setEnabled(false);
|
|
||||||
//
|
//
|
||||||
// mChart.animateXY(2000, 2000);
|
// mActivityChart.animateXY(2000, 2000);
|
||||||
|
|
||||||
// don't forget to refresh the drawing
|
// don't forget to refresh the drawing
|
||||||
mChart.invalidate();
|
// mActivityChart.invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void setupLegend(BarLineChartBase chart) {
|
protected void setupLegend(Chart chart) {
|
||||||
List<Integer> legendColors = new ArrayList<>(3);
|
List<Integer> legendColors = new ArrayList<>(2);
|
||||||
List<String> legendLabels = new ArrayList<>(3);
|
List<String> legendLabels = new ArrayList<>(2);
|
||||||
legendColors.add(akLightSleep.color);
|
legendColors.add(akLightSleep.color);
|
||||||
legendLabels.add(akLightSleep.label);
|
legendLabels.add(akLightSleep.label);
|
||||||
legendColors.add(akDeepSleep.color);
|
legendColors.add(akDeepSleep.color);
|
||||||
legendLabels.add(akDeepSleep.label);
|
legendLabels.add(akDeepSleep.label);
|
||||||
chart.getLegend().setColors(legendColors);
|
chart.getLegend().setColors(legendColors);
|
||||||
chart.getLegend().setLabels(legendLabels);
|
chart.getLegend().setLabels(legendLabels);
|
||||||
|
chart.getLegend().setTextColor(LEGEND_TEXT_COLOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -0,0 +1,43 @@
|
|||||||
|
package nodomain.freeyourgadget.gadgetbridge.charts;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
|
||||||
|
public class ActivityAmount {
|
||||||
|
private int activityKind;
|
||||||
|
private short percent;
|
||||||
|
private long totalSeconds;
|
||||||
|
|
||||||
|
public ActivityAmount(int activityKind) {
|
||||||
|
this.activityKind = activityKind;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addSeconds(long seconds) {
|
||||||
|
totalSeconds += seconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getTotalSeconds() {
|
||||||
|
return totalSeconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getActivityKind() {
|
||||||
|
return activityKind;
|
||||||
|
}
|
||||||
|
|
||||||
|
public short getPercent() {
|
||||||
|
return percent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPercent(short percent) {
|
||||||
|
this.percent = percent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName(Context context) {
|
||||||
|
switch (activityKind) {
|
||||||
|
case ActivityKind.TYPE_DEEP_SLEEP:
|
||||||
|
return "Deep Sleep";
|
||||||
|
case ActivityKind.TYPE_LIGHT_SLEEP:
|
||||||
|
return "Light Sleep";
|
||||||
|
}
|
||||||
|
return "Activity";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package nodomain.freeyourgadget.gadgetbridge.charts;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class ActivityAmounts {
|
||||||
|
private List<ActivityAmount> amounts = new ArrayList<>(4);
|
||||||
|
private long totalSeconds;
|
||||||
|
|
||||||
|
public void addAmount(ActivityAmount amount) {
|
||||||
|
amounts.add(amount);
|
||||||
|
totalSeconds += amount.getTotalSeconds();
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ActivityAmount> getAmounts() {
|
||||||
|
return amounts;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getTotalSeconds() {
|
||||||
|
return totalSeconds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void calculatePercentages() {
|
||||||
|
for (ActivityAmount amount : amounts) {
|
||||||
|
float fraction = amount.getTotalSeconds() / (float) totalSeconds;
|
||||||
|
amount.setPercent((short) (fraction * 100));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
package nodomain.freeyourgadget.gadgetbridge.charts;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.GBActivitySample;
|
||||||
|
|
||||||
|
public class ActivityAnalysis {
|
||||||
|
public ActivityAmounts calculateActivityAmounts(List<GBActivitySample> samples) {
|
||||||
|
ActivityAmount deepSleep = new ActivityAmount(ActivityKind.TYPE_DEEP_SLEEP);
|
||||||
|
ActivityAmount lightSleep = new ActivityAmount(ActivityKind.TYPE_LIGHT_SLEEP);
|
||||||
|
ActivityAmount activity = new ActivityAmount(ActivityKind.TYPE_ACTIVITY);
|
||||||
|
|
||||||
|
ActivityAmount previousAmount = null;
|
||||||
|
GBActivitySample previousSample = null;
|
||||||
|
for(GBActivitySample sample : samples) {
|
||||||
|
ActivityAmount amount = null;
|
||||||
|
switch (sample.getType()) {
|
||||||
|
case GBActivitySample.TYPE_DEEP_SLEEP:
|
||||||
|
amount = deepSleep;
|
||||||
|
break;
|
||||||
|
case GBActivitySample.TYPE_LIGHT_SLEEP:
|
||||||
|
amount = lightSleep;
|
||||||
|
break;
|
||||||
|
case GBActivitySample.TYPE_UNKNOWN:
|
||||||
|
default:
|
||||||
|
amount = activity;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (previousSample != null) {
|
||||||
|
long timeDifference = sample.getTimestamp() - previousSample.getTimestamp();
|
||||||
|
if (previousSample.getType() == sample.getType()) {
|
||||||
|
amount.addSeconds(timeDifference);
|
||||||
|
} else {
|
||||||
|
long sharedTimeDifference = (long) (timeDifference / 2.0f);
|
||||||
|
previousAmount.addSeconds(sharedTimeDifference);
|
||||||
|
amount.addSeconds(sharedTimeDifference);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// nothing to do, we can only calculate when we have the next sample
|
||||||
|
}
|
||||||
|
|
||||||
|
previousAmount = amount;
|
||||||
|
previousSample = sample;
|
||||||
|
}
|
||||||
|
|
||||||
|
ActivityAmounts result = new ActivityAmounts();
|
||||||
|
if (deepSleep.getTotalSeconds() > 0) {
|
||||||
|
result.addAmount(deepSleep);
|
||||||
|
}
|
||||||
|
if (lightSleep.getTotalSeconds() > 0) {
|
||||||
|
result.addAmount(lightSleep);
|
||||||
|
}
|
||||||
|
if (activity.getTotalSeconds() > 0) {
|
||||||
|
result.addAmount(activity);
|
||||||
|
}
|
||||||
|
result.calculatePercentages();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,29 @@
|
|||||||
|
package nodomain.freeyourgadget.gadgetbridge.charts;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.GBActivitySample;
|
||||||
|
|
||||||
|
public class ActivityKind {
|
||||||
|
public static final int TYPE_ACTIVITY = 1;
|
||||||
|
public static final int TYPE_LIGHT_SLEEP = 2;
|
||||||
|
public static final int TYPE_DEEP_SLEEP = 4;
|
||||||
|
public static final int TYPE_SLEEP = TYPE_LIGHT_SLEEP | TYPE_DEEP_SLEEP;
|
||||||
|
public static final int TYPE_ALL = TYPE_ACTIVITY | TYPE_SLEEP;
|
||||||
|
|
||||||
|
public static byte[] mapToDBActivityTypes(int types) {
|
||||||
|
byte[] result = new byte[3];
|
||||||
|
int i = 0;
|
||||||
|
if ((types & ActivityKind.TYPE_ACTIVITY) != 0) {
|
||||||
|
result[i++] = GBActivitySample.TYPE_UNKNOWN;
|
||||||
|
}
|
||||||
|
if ((types & ActivityKind.TYPE_DEEP_SLEEP) != 0) {
|
||||||
|
result[i++] = GBActivitySample.TYPE_DEEP_SLEEP;
|
||||||
|
}
|
||||||
|
if ((types & ActivityKind.TYPE_LIGHT_SLEEP) != 0) {
|
||||||
|
result[i++] = GBActivitySample.TYPE_LIGHT_SLEEP;
|
||||||
|
}
|
||||||
|
return Arrays.copyOf(result, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -15,6 +15,7 @@ import java.util.Arrays;
|
|||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GB;
|
import nodomain.freeyourgadget.gadgetbridge.GB;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBActivitySample;
|
import nodomain.freeyourgadget.gadgetbridge.GBActivitySample;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.charts.ActivityKind;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.database.schema.ActivityDBCreationScript;
|
import nodomain.freeyourgadget.gadgetbridge.database.schema.ActivityDBCreationScript;
|
||||||
|
|
||||||
import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.DATABASE_NAME;
|
import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.DATABASE_NAME;
|
||||||
@ -27,13 +28,6 @@ import static nodomain.freeyourgadget.gadgetbridge.database.DBConstants.TABLE_GB
|
|||||||
|
|
||||||
public class ActivityDatabaseHandler extends SQLiteOpenHelper {
|
public class ActivityDatabaseHandler extends SQLiteOpenHelper {
|
||||||
|
|
||||||
private static final int TYPE_ACTIVITY = 1;
|
|
||||||
private static final int TYPE_LIGHT_SLEEP = 2;
|
|
||||||
private static final int TYPE_DEEP_SLEEP = 4;
|
|
||||||
private static final int TYPE_SLEEP = TYPE_LIGHT_SLEEP | TYPE_DEEP_SLEEP;
|
|
||||||
private static final int TYPE_ALL = TYPE_ACTIVITY | TYPE_SLEEP;
|
|
||||||
|
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(ActivityDatabaseHandler.class);
|
private static final Logger LOG = LoggerFactory.getLogger(ActivityDatabaseHandler.class);
|
||||||
|
|
||||||
private static final int DATABASE_VERSION = 5;
|
private static final int DATABASE_VERSION = 5;
|
||||||
@ -124,15 +118,15 @@ public class ActivityDatabaseHandler extends SQLiteOpenHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<GBActivitySample> getSleepSamples(int timestamp_from, int timestamp_to, byte provider) {
|
public ArrayList<GBActivitySample> getSleepSamples(int timestamp_from, int timestamp_to, byte provider) {
|
||||||
return getGBActivitySamples(timestamp_from, timestamp_to, TYPE_SLEEP, provider);
|
return getGBActivitySamples(timestamp_from, timestamp_to, ActivityKind.TYPE_SLEEP, provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<GBActivitySample> getActivitySamples(int timestamp_from, int timestamp_to, byte provider) {
|
public ArrayList<GBActivitySample> getActivitySamples(int timestamp_from, int timestamp_to, byte provider) {
|
||||||
return getGBActivitySamples(timestamp_from, timestamp_to, TYPE_ACTIVITY, provider);
|
return getGBActivitySamples(timestamp_from, timestamp_to, ActivityKind.TYPE_ACTIVITY, provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<GBActivitySample> getAllActivitySamples(int timestamp_from, int timestamp_to, byte provider) {
|
public ArrayList<GBActivitySample> getAllActivitySamples(int timestamp_from, int timestamp_to, byte provider) {
|
||||||
return getGBActivitySamples(timestamp_from, timestamp_to, TYPE_ALL, provider);
|
return getGBActivitySamples(timestamp_from, timestamp_to, ActivityKind.TYPE_ALL, provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -171,12 +165,12 @@ public class ActivityDatabaseHandler extends SQLiteOpenHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private String getWhereClauseFor(int activityTypes) {
|
private String getWhereClauseFor(int activityTypes) {
|
||||||
if (activityTypes == TYPE_ALL) {
|
if (activityTypes == ActivityKind.TYPE_ALL) {
|
||||||
return ""; // no further restriction
|
return ""; // no further restriction
|
||||||
}
|
}
|
||||||
|
|
||||||
StringBuilder builder = new StringBuilder(" and (");
|
StringBuilder builder = new StringBuilder(" and (");
|
||||||
byte[] dbActivityTypes = mapToDBActivityTypes(activityTypes);
|
byte[] dbActivityTypes = ActivityKind.mapToDBActivityTypes(activityTypes);
|
||||||
for (int i = 0; i < dbActivityTypes.length; i++) {
|
for (int i = 0; i < dbActivityTypes.length; i++) {
|
||||||
builder.append(" type=").append(dbActivityTypes[i]);
|
builder.append(" type=").append(dbActivityTypes[i]);
|
||||||
if (i + 1 < dbActivityTypes.length) {
|
if (i + 1 < dbActivityTypes.length) {
|
||||||
@ -186,19 +180,4 @@ public class ActivityDatabaseHandler extends SQLiteOpenHelper {
|
|||||||
builder.append(')');
|
builder.append(')');
|
||||||
return builder.toString();
|
return builder.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] mapToDBActivityTypes(int types) {
|
|
||||||
byte[] result = new byte[3];
|
|
||||||
int i = 0;
|
|
||||||
if ((types & TYPE_ACTIVITY) != 0) {
|
|
||||||
result[i++] = GBActivitySample.TYPE_UNKNOWN;
|
|
||||||
}
|
|
||||||
if ((types & TYPE_DEEP_SLEEP) != 0) {
|
|
||||||
result[i++] = GBActivitySample.TYPE_DEEP_SLEEP;
|
|
||||||
}
|
|
||||||
if ((types & TYPE_LIGHT_SLEEP) != 0) {
|
|
||||||
result[i++] = GBActivitySample.TYPE_LIGHT_SLEEP;
|
|
||||||
}
|
|
||||||
return Arrays.copyOf(result, i);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
tools:context="nodomain.freeyourgadget.gadgetbridge.activities.ChartsActivity$PlaceholderFragment">
|
tools:context="nodomain.freeyourgadget.gadgetbridge.activities.ChartsActivity$PlaceholderFragment">
|
||||||
|
|
||||||
<nodomain.freeyourgadget.gadgetbridge.charts.CustomBarChart
|
<nodomain.freeyourgadget.gadgetbridge.charts.CustomBarChart
|
||||||
android:id="@+id/sleepchart"
|
android:id="@+id/activitysleepchart"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
/>
|
/>
|
||||||
|
27
app/src/main/res/layout/fragment_sleepchart.xml
Normal file
27
app/src/main/res/layout/fragment_sleepchart.xml
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
tools:context="nodomain.freeyourgadget.gadgetbridge.activities.ChartsActivity$PlaceholderFragment"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<nodomain.freeyourgadget.gadgetbridge.charts.CustomBarChart
|
||||||
|
android:id="@+id/sleepchart"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
|
||||||
|
android:layout_weight="20" />
|
||||||
|
|
||||||
|
<com.github.mikephil.charting.charts.PieChart
|
||||||
|
android:id="@+id/sleepchart_pie_light_deep"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:layout_weight="20">
|
||||||
|
</com.github.mikephil.charting.charts.PieChart>
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:text="Test"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
|
android:layout_height="fill_parent"
|
||||||
|
android:layout_weight="20" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
Loading…
x
Reference in New Issue
Block a user