mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge.git
synced 2026-07-31 07:44:24 +02:00
Merge branch 'master' into bip-wip
This commit is contained in:
@@ -1,5 +1,9 @@
|
|||||||
### Changelog
|
### Changelog
|
||||||
|
|
||||||
|
#### Version NEXT
|
||||||
|
* Charts: added preference to disable swiping charts left/right and some UI changes
|
||||||
|
* Pebble: Use the configured unit system also for system weather app
|
||||||
|
|
||||||
#### Version 0.22.1
|
#### Version 0.22.1
|
||||||
* Mi Band 2: Fix being detected as Amazfit Bip which lead to various problems especially on newly paired devices
|
* Mi Band 2: Fix being detected as Amazfit Bip which lead to various problems especially on newly paired devices
|
||||||
|
|
||||||
|
|||||||
@@ -659,4 +659,3 @@ specific requirements.
|
|||||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
For more information on this, and how to apply and follow the GNU AGPL, see
|
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||||
<http://www.gnu.org/licenses/>.
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|||||||
+62
-74
@@ -35,16 +35,12 @@ import com.github.mikephil.charting.charts.BarLineChartBase;
|
|||||||
import com.github.mikephil.charting.charts.Chart;
|
import com.github.mikephil.charting.charts.Chart;
|
||||||
import com.github.mikephil.charting.components.AxisBase;
|
import com.github.mikephil.charting.components.AxisBase;
|
||||||
import com.github.mikephil.charting.components.YAxis;
|
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.ChartData;
|
||||||
import com.github.mikephil.charting.data.CombinedData;
|
|
||||||
import com.github.mikephil.charting.data.Entry;
|
import com.github.mikephil.charting.data.Entry;
|
||||||
import com.github.mikephil.charting.data.LineData;
|
import com.github.mikephil.charting.data.LineData;
|
||||||
import com.github.mikephil.charting.data.LineDataSet;
|
import com.github.mikephil.charting.data.LineDataSet;
|
||||||
import com.github.mikephil.charting.formatter.IAxisValueFormatter;
|
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.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@@ -419,7 +415,7 @@ public abstract class AbstractChartFragment extends AbstractGBFragment {
|
|||||||
*/
|
*/
|
||||||
protected abstract void renderCharts();
|
protected abstract void renderCharts();
|
||||||
|
|
||||||
protected DefaultChartsData<CombinedData> refresh(GBDevice gbDevice, List<? extends ActivitySample> samples) {
|
protected DefaultChartsData<LineData> refresh(GBDevice gbDevice, List<? extends ActivitySample> samples) {
|
||||||
// Calendar cal = GregorianCalendar.getInstance();
|
// Calendar cal = GregorianCalendar.getInstance();
|
||||||
// cal.clear();
|
// cal.clear();
|
||||||
TimestampTranslation tsTranslation = new TimestampTranslation();
|
TimestampTranslation tsTranslation = new TimestampTranslation();
|
||||||
@@ -429,7 +425,7 @@ public abstract class AbstractChartFragment extends AbstractGBFragment {
|
|||||||
// ArrayList<String> xLabels = null;
|
// ArrayList<String> xLabels = null;
|
||||||
|
|
||||||
LOG.info("" + getTitle() + ": number of samples:" + samples.size());
|
LOG.info("" + getTitle() + ": number of samples:" + samples.size());
|
||||||
CombinedData combinedData;
|
LineData lineData;
|
||||||
if (samples.size() > 1) {
|
if (samples.size() > 1) {
|
||||||
boolean annotate = true;
|
boolean annotate = true;
|
||||||
boolean use_steps_as_movement;
|
boolean use_steps_as_movement;
|
||||||
@@ -437,7 +433,10 @@ public abstract class AbstractChartFragment extends AbstractGBFragment {
|
|||||||
int last_type = ActivityKind.TYPE_UNKNOWN;
|
int last_type = ActivityKind.TYPE_UNKNOWN;
|
||||||
|
|
||||||
int numEntries = samples.size();
|
int numEntries = samples.size();
|
||||||
List<BarEntry> activityEntries = new ArrayList<>(numEntries);
|
List<Entry> activityEntries = new ArrayList<>(numEntries);
|
||||||
|
List<Entry> deepSleepEntries = new ArrayList<>(numEntries);
|
||||||
|
List<Entry> lightSleepEntries = new ArrayList<>(numEntries);
|
||||||
|
List<Entry> notWornEntries = new ArrayList<>(numEntries);
|
||||||
boolean hr = supportsHeartrate(gbDevice);
|
boolean hr = supportsHeartrate(gbDevice);
|
||||||
List<Entry> heartrateEntries = hr ? new ArrayList<Entry>(numEntries) : null;
|
List<Entry> heartrateEntries = hr ? new ArrayList<Entry>(numEntries) : null;
|
||||||
List<Integer> colors = new ArrayList<>(numEntries); // this is kinda inefficient...
|
List<Integer> colors = new ArrayList<>(numEntries); // this is kinda inefficient...
|
||||||
@@ -466,15 +465,34 @@ public abstract class AbstractChartFragment extends AbstractGBFragment {
|
|||||||
float value = movement;
|
float value = movement;
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ActivityKind.TYPE_DEEP_SLEEP:
|
case ActivityKind.TYPE_DEEP_SLEEP:
|
||||||
value += SleepUtils.Y_VALUE_DEEP_SLEEP;
|
if (last_type != type) { //FIXME: this is ugly but it works (repeated in each case)
|
||||||
colors.add(akDeepSleep.color);
|
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;
|
break;
|
||||||
case ActivityKind.TYPE_LIGHT_SLEEP:
|
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;
|
break;
|
||||||
case ActivityKind.TYPE_NOT_WORN:
|
case ActivityKind.TYPE_NOT_WORN:
|
||||||
value = SleepUtils.Y_VALUE_DEEP_SLEEP; //a small value, just to show something on the graphs
|
if (last_type != type) {
|
||||||
colors.add(akNotWorn.color);
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
// short steps = sample.getSteps();
|
// short steps = sample.getSteps();
|
||||||
@@ -483,9 +501,15 @@ public abstract class AbstractChartFragment extends AbstractGBFragment {
|
|||||||
// movement = steps;
|
// movement = steps;
|
||||||
// }
|
// }
|
||||||
// value = ((float) movement) / movement_divisor;
|
// 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 && HeartRateUtils.isValidHeartRateValue(sample.getHeartRate())) {
|
if (hr && HeartRateUtils.isValidHeartRateValue(sample.getHeartRate())) {
|
||||||
if (lastHrSampleIndex > -1 && ts - lastHrSampleIndex > 1800*HeartRateUtils.MAX_HR_MEASUREMENTS_GAP_MINUTES) {
|
if (lastHrSampleIndex > -1 && ts - lastHrSampleIndex > 1800*HeartRateUtils.MAX_HR_MEASUREMENTS_GAP_MINUTES) {
|
||||||
heartrateEntries.add(createLineEntry(0, lastHrSampleIndex + 1));
|
heartrateEntries.add(createLineEntry(0, lastHrSampleIndex + 1));
|
||||||
@@ -519,35 +543,36 @@ public abstract class AbstractChartFragment extends AbstractGBFragment {
|
|||||||
// chart.getXAxis().addLimitLine(line);
|
// chart.getXAxis().addLimitLine(line);
|
||||||
// }
|
// }
|
||||||
// }
|
// }
|
||||||
// last_type = type;
|
|
||||||
}
|
}
|
||||||
|
last_type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
BarDataSet activitySet = createActivitySet(activityEntries, colors, "Activity");
|
|
||||||
// create a data object with the datasets
|
List<ILineDataSet> lineDataSets = new ArrayList<>();
|
||||||
// combinedData = new CombinedData(xLabels);
|
LineDataSet activitySet = createDataSet(activityEntries, akActivity.color, "Activity");
|
||||||
combinedData = new CombinedData();
|
lineDataSets.add(activitySet);
|
||||||
List<IBarDataSet> list = new ArrayList<>();
|
LineDataSet deepSleepSet = createDataSet(deepSleepEntries, akDeepSleep.color, "Deep Sleep");
|
||||||
list.add(activitySet);
|
lineDataSets.add(deepSleepSet);
|
||||||
BarData barData = new BarData(list);
|
LineDataSet lightSleepSet = createDataSet(lightSleepEntries, akLightSleep.color, "Light Sleep");
|
||||||
barData.setBarWidth(200f);
|
lineDataSets.add(lightSleepSet);
|
||||||
// barData.setGroupSpace(0);
|
LineDataSet notWornSet = createDataSet(notWornEntries, akNotWorn.color, "Not worn");
|
||||||
combinedData.setData(barData);
|
lineDataSets.add(notWornSet);
|
||||||
|
|
||||||
if (hr && heartrateEntries.size() > 0) {
|
if (hr && heartrateEntries.size() > 0) {
|
||||||
LineDataSet heartrateSet = createHeartrateSet(heartrateEntries, "Heart Rate");
|
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.setDescription(getString(R.string.sleep_activity_date_range, dateStringFrom, dateStringTo));
|
||||||
// chart.setDescriptionPosition(?, ?);
|
// chart.setDescriptionPosition(?, ?);
|
||||||
} else {
|
} else {
|
||||||
combinedData = new CombinedData();
|
lineData = new LineData();
|
||||||
}
|
}
|
||||||
|
|
||||||
IAxisValueFormatter xValueFormatter = new SampleXLabelFormatter(tsTranslation);
|
IAxisValueFormatter xValueFormatter = new SampleXLabelFormatter(tsTranslation);
|
||||||
return new DefaultChartsData(combinedData, xValueFormatter);
|
return new DefaultChartsData(lineData, xValueFormatter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -563,24 +588,21 @@ public abstract class AbstractChartFragment extends AbstractGBFragment {
|
|||||||
|
|
||||||
protected abstract void setupLegend(Chart chart);
|
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) {
|
protected Entry createLineEntry(float value, int xValue) {
|
||||||
return new Entry(xValue, value);
|
return new Entry(xValue, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected BarDataSet createActivitySet(List<BarEntry> values, List<Integer> colors, String label) {
|
protected LineDataSet createDataSet(List<Entry> values, Integer color, String label) {
|
||||||
BarDataSet set1 = new BarDataSet(values, label);
|
LineDataSet set1 = new LineDataSet(values, label);
|
||||||
set1.setColors(colors);
|
set1.setColor(color);
|
||||||
// set1.setDrawCubic(true);
|
// set1.setDrawCubic(true);
|
||||||
// set1.setCubicIntensity(0.2f);
|
// set1.setCubicIntensity(0.2f);
|
||||||
// //set1.setDrawFilled(true);
|
set1.setDrawFilled(true);
|
||||||
// set1.setDrawCircles(false);
|
set1.setDrawCircles(false);
|
||||||
// set1.setLineWidth(2f);
|
// set1.setLineWidth(2f);
|
||||||
// set1.setCircleSize(5f);
|
// set1.setCircleSize(5f);
|
||||||
// set1.setFillColor(ColorTemplate.getHoloBlue());
|
set1.setFillColor(color);
|
||||||
|
set1.setFillAlpha(255);
|
||||||
set1.setDrawValues(false);
|
set1.setDrawValues(false);
|
||||||
// set1.setHighLightColor(Color.rgb(128, 0, 255));
|
// set1.setHighLightColor(Color.rgb(128, 0, 255));
|
||||||
// set1.setColor(Color.rgb(89, 178, 44));
|
// set1.setColor(Color.rgb(89, 178, 44));
|
||||||
@@ -610,40 +632,6 @@ public abstract class AbstractChartFragment extends AbstractGBFragment {
|
|||||||
return set1;
|
return set1;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected BarDataSet createDeepSleepSet(List<BarEntry> 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<BarEntry> 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) {
|
protected RefreshTask createRefreshTask(String task, Context context) {
|
||||||
return new RefreshTask(task, context);
|
return new RefreshTask(task, context);
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-4
@@ -25,11 +25,12 @@ import android.view.View;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
import com.github.mikephil.charting.animation.Easing;
|
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.Chart;
|
||||||
|
import com.github.mikephil.charting.charts.LineChart;
|
||||||
import com.github.mikephil.charting.components.LegendEntry;
|
import com.github.mikephil.charting.components.LegendEntry;
|
||||||
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.LineData;
|
||||||
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
@@ -47,7 +48,7 @@ import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample;
|
|||||||
public class ActivitySleepChartFragment extends AbstractChartFragment {
|
public class ActivitySleepChartFragment extends AbstractChartFragment {
|
||||||
protected static final Logger LOG = LoggerFactory.getLogger(ActivitySleepChartFragment.class);
|
protected static final Logger LOG = LoggerFactory.getLogger(ActivitySleepChartFragment.class);
|
||||||
|
|
||||||
private BarLineChartBase mChart;
|
private LineChart mChart;
|
||||||
|
|
||||||
private int mSmartAlarmFrom = -1;
|
private int mSmartAlarmFrom = -1;
|
||||||
private int mSmartAlarmTo = -1;
|
private int mSmartAlarmTo = -1;
|
||||||
@@ -59,7 +60,7 @@ public class ActivitySleepChartFragment extends AbstractChartFragment {
|
|||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
View rootView = inflater.inflate(R.layout.fragment_charts, container, false);
|
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();
|
setupChart();
|
||||||
|
|
||||||
@@ -136,7 +137,7 @@ public class ActivitySleepChartFragment extends AbstractChartFragment {
|
|||||||
mChart.getLegend().setTextColor(LEGEND_TEXT_COLOR);
|
mChart.getLegend().setTextColor(LEGEND_TEXT_COLOR);
|
||||||
mChart.setData(null); // workaround for https://github.com/PhilJay/MPAndroidChart/issues/2317
|
mChart.setData(null); // workaround for https://github.com/PhilJay/MPAndroidChart/issues/2317
|
||||||
mChart.getXAxis().setValueFormatter(dcd.getXValueFormatter());
|
mChart.getXAxis().setValueFormatter(dcd.getXValueFormatter());
|
||||||
mChart.setData(dcd.getData());
|
mChart.setData((LineData) dcd.getData());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+27
-2
@@ -29,8 +29,10 @@ import android.support.v4.app.FragmentStatePagerAdapter;
|
|||||||
import android.support.v4.content.LocalBroadcastManager;
|
import android.support.v4.content.LocalBroadcastManager;
|
||||||
import android.support.v4.view.ViewPager;
|
import android.support.v4.view.ViewPager;
|
||||||
import android.support.v4.widget.SwipeRefreshLayout;
|
import android.support.v4.widget.SwipeRefreshLayout;
|
||||||
|
import android.util.AttributeSet;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
@@ -66,7 +68,7 @@ public class ChartsActivity extends AbstractGBFragmentActivity implements Charts
|
|||||||
private Date mStartDate;
|
private Date mStartDate;
|
||||||
private Date mEndDate;
|
private Date mEndDate;
|
||||||
private SwipeRefreshLayout swipeLayout;
|
private SwipeRefreshLayout swipeLayout;
|
||||||
private ViewPager viewPager;
|
private NonSwipeableViewPager viewPager;
|
||||||
|
|
||||||
LimitedQueue mActivityAmountCache = new LimitedQueue(60);
|
LimitedQueue mActivityAmountCache = new LimitedQueue(60);
|
||||||
|
|
||||||
@@ -153,7 +155,7 @@ public class ChartsActivity extends AbstractGBFragmentActivity implements Charts
|
|||||||
enableSwipeRefresh(true);
|
enableSwipeRefresh(true);
|
||||||
|
|
||||||
// Set up the ViewPager with the sections adapter.
|
// Set up the ViewPager with the sections adapter.
|
||||||
viewPager = (ViewPager) findViewById(R.id.charts_pager);
|
viewPager = (NonSwipeableViewPager) findViewById(R.id.charts_pager);
|
||||||
viewPager.setAdapter(getPagerAdapter());
|
viewPager.setAdapter(getPagerAdapter());
|
||||||
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
|
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
|
||||||
@Override
|
@Override
|
||||||
@@ -365,3 +367,26 @@ public class ChartsActivity extends AbstractGBFragmentActivity implements Charts
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class NonSwipeableViewPager extends ViewPager {
|
||||||
|
|
||||||
|
public NonSwipeableViewPager(Context context, AttributeSet attrs) {
|
||||||
|
super(context, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onInterceptTouchEvent(MotionEvent ev) {
|
||||||
|
if (GBApplication.getPrefs().getBoolean("charts_allow_swipe", true)) {
|
||||||
|
return super.onInterceptTouchEvent(ev);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onTouchEvent(MotionEvent ev) {
|
||||||
|
if (GBApplication.getPrefs().getBoolean("charts_allow_swipe", true)) {
|
||||||
|
return super.onTouchEvent(ev);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+7
-7
@@ -26,13 +26,13 @@ import android.view.ViewGroup;
|
|||||||
|
|
||||||
import com.github.mikephil.charting.animation.Easing;
|
import com.github.mikephil.charting.animation.Easing;
|
||||||
import com.github.mikephil.charting.charts.Chart;
|
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.charts.PieChart;
|
||||||
import com.github.mikephil.charting.components.LegendEntry;
|
import com.github.mikephil.charting.components.LegendEntry;
|
||||||
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.CombinedData;
|
|
||||||
import com.github.mikephil.charting.data.Entry;
|
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.PieData;
|
||||||
import com.github.mikephil.charting.data.PieDataSet;
|
import com.github.mikephil.charting.data.PieDataSet;
|
||||||
import com.github.mikephil.charting.data.PieEntry;
|
import com.github.mikephil.charting.data.PieEntry;
|
||||||
@@ -60,7 +60,7 @@ import nodomain.freeyourgadget.gadgetbridge.util.DateTimeUtils;
|
|||||||
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 CombinedChart mActivityChart;
|
private LineChart mActivityChart;
|
||||||
private PieChart mSleepAmountChart;
|
private PieChart mSleepAmountChart;
|
||||||
|
|
||||||
private int mSmartAlarmFrom = -1;
|
private int mSmartAlarmFrom = -1;
|
||||||
@@ -136,7 +136,7 @@ public class SleepChartFragment extends AbstractChartFragment {
|
|||||||
Bundle savedInstanceState) {
|
Bundle savedInstanceState) {
|
||||||
View rootView = inflater.inflate(R.layout.fragment_sleepchart, container, false);
|
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);
|
mSleepAmountChart = (PieChart) rootView.findViewById(R.id.sleepchart_pie_light_deep);
|
||||||
|
|
||||||
setupActivityChart();
|
setupActivityChart();
|
||||||
@@ -262,10 +262,10 @@ public class SleepChartFragment extends AbstractChartFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static class MyChartsData extends ChartsData {
|
private static class MyChartsData extends ChartsData {
|
||||||
private final DefaultChartsData<CombinedData> chartsData;
|
private final DefaultChartsData<LineData> chartsData;
|
||||||
private final MySleepChartsData pieData;
|
private final MySleepChartsData pieData;
|
||||||
|
|
||||||
public MyChartsData(MySleepChartsData pieData, DefaultChartsData<CombinedData> chartsData) {
|
public MyChartsData(MySleepChartsData pieData, DefaultChartsData<LineData> chartsData) {
|
||||||
this.pieData = pieData;
|
this.pieData = pieData;
|
||||||
this.chartsData = chartsData;
|
this.chartsData = chartsData;
|
||||||
}
|
}
|
||||||
@@ -274,7 +274,7 @@ public class SleepChartFragment extends AbstractChartFragment {
|
|||||||
return pieData;
|
return pieData;
|
||||||
}
|
}
|
||||||
|
|
||||||
public DefaultChartsData<CombinedData> getChartsData() {
|
public DefaultChartsData<LineData> getChartsData() {
|
||||||
return chartsData;
|
return chartsData;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+20
-5
@@ -39,6 +39,7 @@ import java.util.UUID;
|
|||||||
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.R;
|
import nodomain.freeyourgadget.gadgetbridge.R;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.activities.SettingsActivity;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent;
|
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEvent;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventAppInfo;
|
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventAppInfo;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventAppManagement;
|
import nodomain.freeyourgadget.gadgetbridge.deviceevents.GBDeviceEventAppManagement;
|
||||||
@@ -1222,6 +1223,20 @@ public class PebbleProtocol extends GBDeviceProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private byte[] encodeWeatherForecast(WeatherSpec weatherSpec) {
|
private byte[] encodeWeatherForecast(WeatherSpec weatherSpec) {
|
||||||
|
|
||||||
|
short currentTemp = (short) (weatherSpec.currentTemp - 273);
|
||||||
|
short todayMax = (short) (weatherSpec.todayMaxTemp - 273);
|
||||||
|
short todayMin = (short) (weatherSpec.todayMinTemp - 273);
|
||||||
|
short tomorrowMax = (short) (weatherSpec.tomorrowMaxTemp - 273);
|
||||||
|
short tomorrowMin = (short) (weatherSpec.tomorrowMinTemp - 273);
|
||||||
|
String units = GBApplication.getPrefs().getString(SettingsActivity.PREF_MEASUREMENT_SYSTEM, GBApplication.getContext().getString(R.string.p_unit_metric));
|
||||||
|
if (units.equals(GBApplication.getContext().getString(R.string.p_unit_imperial))) {
|
||||||
|
currentTemp = (short) (currentTemp * 1.8f + 32);
|
||||||
|
todayMax = (short) (todayMax * 1.8f + 32);
|
||||||
|
todayMin = (short) (todayMin * 1.8f + 32);
|
||||||
|
tomorrowMax = (short) (tomorrowMax * 1.8f + 32);
|
||||||
|
tomorrowMin = (short) (tomorrowMin * 1.8f + 32);
|
||||||
|
}
|
||||||
final short WEATHER_FORECAST_LENGTH = 20;
|
final short WEATHER_FORECAST_LENGTH = 20;
|
||||||
|
|
||||||
String[] parts = {weatherSpec.location, weatherSpec.currentCondition};
|
String[] parts = {weatherSpec.location, weatherSpec.currentCondition};
|
||||||
@@ -1242,13 +1257,13 @@ public class PebbleProtocol extends GBDeviceProtocol {
|
|||||||
ByteBuffer buf = ByteBuffer.allocate(pin_length);
|
ByteBuffer buf = ByteBuffer.allocate(pin_length);
|
||||||
buf.order(ByteOrder.LITTLE_ENDIAN);
|
buf.order(ByteOrder.LITTLE_ENDIAN);
|
||||||
buf.put((byte) 3); // unknown, always 3?
|
buf.put((byte) 3); // unknown, always 3?
|
||||||
buf.putShort((short) (weatherSpec.currentTemp - 273));
|
buf.putShort(currentTemp);
|
||||||
buf.put(Weather.mapToPebbleCondition(weatherSpec.currentConditionCode));
|
buf.put(Weather.mapToPebbleCondition(weatherSpec.currentConditionCode));
|
||||||
buf.putShort((short) (weatherSpec.todayMaxTemp - 273));
|
buf.putShort(todayMax);
|
||||||
buf.putShort((short) (weatherSpec.todayMinTemp - 273));
|
buf.putShort(todayMin);
|
||||||
buf.put(Weather.mapToPebbleCondition(weatherSpec.tomorrowConditionCode));
|
buf.put(Weather.mapToPebbleCondition(weatherSpec.tomorrowConditionCode));
|
||||||
buf.putShort((short) (weatherSpec.tomorrowMaxTemp - 273));
|
buf.putShort(tomorrowMax);
|
||||||
buf.putShort((short) (weatherSpec.tomorrowMinTemp - 273));
|
buf.putShort(tomorrowMin);
|
||||||
buf.putInt(weatherSpec.timestamp);
|
buf.putInt(weatherSpec.timestamp);
|
||||||
buf.put((byte) 0); // automatic location 0=manual 1=auto
|
buf.put((byte) 0); // automatic location 0=manual 1=auto
|
||||||
buf.putShort(attributes_length);
|
buf.putShort(attributes_length);
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
android:layout_weight="40">
|
android:layout_weight="40">
|
||||||
</com.github.mikephil.charting.charts.PieChart>
|
</com.github.mikephil.charting.charts.PieChart>
|
||||||
|
|
||||||
<com.github.mikephil.charting.charts.CombinedChart
|
<com.github.mikephil.charting.charts.LineChart
|
||||||
android:id="@+id/sleepchart"
|
android:id="@+id/sleepchart"
|
||||||
android:layout_width="fill_parent"
|
android:layout_width="fill_parent"
|
||||||
android:layout_height="fill_parent"
|
android:layout_height="fill_parent"
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
<android.support.v4.view.ViewPager
|
<nodomain.freeyourgadget.gadgetbridge.activities.charts.NonSwipeableViewPager
|
||||||
android:id="@+id/charts_pager"
|
android:id="@+id/charts_pager"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="top"
|
android:layout_gravity="top"
|
||||||
app:tabMode="scrollable" />
|
app:tabMode="scrollable" />
|
||||||
</android.support.v4.view.ViewPager>
|
</nodomain.freeyourgadget.gadgetbridge.activities.charts.NonSwipeableViewPager>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:id="@+id/charts_date_bar"
|
android:id="@+id/charts_date_bar"
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
tools:context="nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity$PlaceholderFragment">
|
tools:context="nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity$PlaceholderFragment">
|
||||||
|
|
||||||
<com.github.mikephil.charting.charts.CombinedChart
|
<com.github.mikephil.charting.charts.LineChart
|
||||||
android:id="@+id/activitysleepchart"
|
android:id="@+id/activitysleepchart"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
android:layout_height="fill_parent"
|
android:layout_height="fill_parent"
|
||||||
android:layout_weight="20"></com.github.mikephil.charting.charts.PieChart>
|
android:layout_weight="20"></com.github.mikephil.charting.charts.PieChart>
|
||||||
|
|
||||||
<com.github.mikephil.charting.charts.CombinedChart
|
<com.github.mikephil.charting.charts.LineChart
|
||||||
android:id="@+id/sleepchart"
|
android:id="@+id/sleepchart"
|
||||||
android:layout_width="fill_parent"
|
android:layout_width="fill_parent"
|
||||||
android:layout_height="fill_parent"
|
android:layout_height="fill_parent"
|
||||||
|
|||||||
@@ -70,6 +70,7 @@
|
|||||||
<string name="pref_title_general_autocreonnect">Reconnect automatically</string>
|
<string name="pref_title_general_autocreonnect">Reconnect automatically</string>
|
||||||
<string name="pref_title_audo_player">Preferred Audioplayer</string>
|
<string name="pref_title_audo_player">Preferred Audioplayer</string>
|
||||||
<string name="pref_default">Default</string>
|
<string name="pref_default">Default</string>
|
||||||
|
<string name="pref_title_charts_swipe">Enable left/right swipe in the charts activity</string>
|
||||||
|
|
||||||
<string name="pref_header_datetime">Date and Time</string>
|
<string name="pref_header_datetime">Date and Time</string>
|
||||||
<string name="pref_title_datetime_syctimeonconnect">Sync time</string>
|
<string name="pref_title_datetime_syctimeonconnect">Sync time</string>
|
||||||
|
|||||||
@@ -1,5 +1,10 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<changelog>
|
<changelog>
|
||||||
|
<release version="next">
|
||||||
|
<change>Charts: added preference to disable swiping charts left/right and some UI changes
|
||||||
|
</change>
|
||||||
|
<change>Pebble: Use the configured unit system also for system weather app</change>
|
||||||
|
</release>
|
||||||
<release version="0.22.1" versioncode="109">
|
<release version="0.22.1" versioncode="109">
|
||||||
<change>Mi Band 2: Fix being detected as Amazfit Bip which lead to various problems especially on newly paired devices</change>
|
<change>Mi Band 2: Fix being detected as Amazfit Bip which lead to various problems especially on newly paired devices</change>
|
||||||
</release>
|
</release>
|
||||||
|
|||||||
@@ -92,6 +92,10 @@
|
|||||||
android:maxLength="2"
|
android:maxLength="2"
|
||||||
android:title="@string/activity_prefs_sleep_duration" />
|
android:title="@string/activity_prefs_sleep_duration" />
|
||||||
</PreferenceScreen>
|
</PreferenceScreen>
|
||||||
|
<CheckBoxPreference
|
||||||
|
android:defaultValue="true"
|
||||||
|
android:key="charts_allow_swipe"
|
||||||
|
android:title="@string/pref_title_charts_swipe" />
|
||||||
</PreferenceCategory>
|
</PreferenceCategory>
|
||||||
<PreferenceCategory
|
<PreferenceCategory
|
||||||
android:key="pref_key_datetime"
|
android:key="pref_key_datetime"
|
||||||
|
|||||||
Reference in New Issue
Block a user