diff --git a/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java b/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java
index 632d29984..c613cbcdd 100644
--- a/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java
+++ b/GBDaoGenerator/src/nodomain/freeyourgadget/gadgetbridge/daogen/GBDaoGenerator.java
@@ -43,7 +43,7 @@ public class GBDaoGenerator {
public static void main(String[] args) throws Exception {
- Schema schema = new Schema(32, MAIN_PACKAGE + ".entities");
+ Schema schema = new Schema(33, MAIN_PACKAGE + ".entities");
Entity userAttributes = addUserAttributes(schema);
Entity user = addUserInfo(schema, userAttributes);
@@ -90,7 +90,7 @@ public class GBDaoGenerator {
addNotificationFilterEntry(schema, notificationFilter);
addActivitySummary(schema, user, device);
-
+ addBatteryLevel(schema, device);
new DaoGenerator().generateAll(schema, "app/src/main/java");
}
@@ -604,4 +604,14 @@ public class GBDaoGenerator {
entity.addImport("de.greenrobot.dao.AbstractDao");
return entity;
}
+
+ private static Entity addBatteryLevel(Schema schema, Entity device) {
+ Entity batteryLevel = addEntity(schema, "BatteryLevel");
+ batteryLevel.implementsSerializable();
+ batteryLevel.addIntProperty("timestamp").notNull().primaryKey();
+ Property deviceId = batteryLevel.addLongProperty("deviceId").primaryKey().notNull().getProperty();
+ batteryLevel.addToOne(device, deviceId);
+ batteryLevel.addIntProperty("level").notNull();
+ return batteryLevel;
+ }
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 40cf7aada..034fa4cfb 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -425,6 +425,11 @@
android:label="@string/about_activity_title"
android:parentActivityName=".activities.ControlCenterv2"
android:windowSoftInputMode="stateHidden" />
+
+
. */
+package nodomain.freeyourgadget.gadgetbridge.activities;
+
+import android.os.Bundle;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+
+import com.github.mikephil.charting.charts.Chart;
+import com.github.mikephil.charting.charts.LineChart;
+import com.github.mikephil.charting.components.Legend;
+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.Entry;
+import com.github.mikephil.charting.data.LineData;
+import com.github.mikephil.charting.data.LineDataSet;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import de.greenrobot.dao.query.QueryBuilder;
+import nodomain.freeyourgadget.gadgetbridge.GBApplication;
+import nodomain.freeyourgadget.gadgetbridge.R;
+import nodomain.freeyourgadget.gadgetbridge.activities.charts.AbstractChartFragment;
+import nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsData;
+import nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsHost;
+import nodomain.freeyourgadget.gadgetbridge.database.DBHandler;
+import nodomain.freeyourgadget.gadgetbridge.database.DBHelper;
+import nodomain.freeyourgadget.gadgetbridge.entities.BatteryLevel;
+import nodomain.freeyourgadget.gadgetbridge.entities.BatteryLevelDao;
+import nodomain.freeyourgadget.gadgetbridge.entities.Device;
+import nodomain.freeyourgadget.gadgetbridge.impl.GBDevice;
+import nodomain.freeyourgadget.gadgetbridge.model.ActivitySample;
+
+
+public class BatteryInfoChartFragment extends AbstractChartFragment {
+ private static final Logger LOG = LoggerFactory.getLogger(BatteryInfoChartFragment.class);
+
+ private LineChart mChart;
+ private int startTime;
+ private int endTime;
+ private GBDevice gbDevice;
+
+ public void setDateAndGetData(GBDevice gbDevice, long startTime, long endTime) {
+ this.startTime = (int) startTime;
+ this.endTime = (int) endTime;
+ this.gbDevice = gbDevice;
+ try {
+ setupLegend(mChart);
+ populate_charts_data();
+ } catch (Exception e) {
+ LOG.debug("Unable to fill charts data right now:", e);
+ }
+ }
+
+ private void populate_charts_data() {
+ try (DBHandler handler = GBApplication.acquireDB()) {
+
+ List extends BatteryLevel> samples = getLevels(handler, gbDevice, startTime, endTime);
+ List entries = new ArrayList();
+
+ for (BatteryLevel sample : samples) {
+ entries.add(new Entry(sample.getTimestamp(), sample.getLevel()));
+ }
+
+ LineDataSet dataSet = new LineDataSet(entries, "Battery level");
+ dataSet.setDrawCircles(false);
+ dataSet.setLineWidth(2.2f);
+ dataSet.setMode(LineDataSet.Mode.HORIZONTAL_BEZIER);
+ dataSet.setCubicIntensity(0.1f);
+ dataSet.setDrawCircles(false);
+ dataSet.setDrawValues(false);
+ LineData lineData = new LineData(dataSet);
+
+ try {
+ if (lineData != null) {
+ //mChart.getXAxis().setValueFormatter(null);
+ //mChart.setData(null);
+ mChart.setData((LineData) lineData);
+ mChart.invalidate();
+ }
+ } catch (Exception e) {
+ LOG.error("Unable to get charts data:", e);
+ }
+
+ } catch (Exception e) {
+ LOG.error("Unable to get charts data:", e);
+ }
+
+ }
+
+ @Override
+ public View onCreateView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ init();
+ View rootView = inflater.inflate(R.layout.fragment_charts, container, false);
+ mChart = rootView.findViewById(R.id.activitysleepchart);
+ if (this.gbDevice != null || mChart != null) {
+ setupChart();
+ populate_charts_data();
+ }
+ return rootView;
+ }
+
+ @Override
+ public String getTitle() {
+ return "";
+ }
+
+ 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 yAxisLeft = mChart.getAxisRight();
+ yAxisLeft.setAxisMaximum(100L);
+ yAxisLeft.setAxisMinimum(0);
+ yAxisLeft.setEnabled(true);
+
+
+ YAxis yAxisRight = mChart.getAxisRight();
+ yAxisRight.setDrawGridLines(false);
+ yAxisRight.setDrawLabels(true);
+ yAxisRight.setDrawTopYLabelEntry(true);
+ yAxisRight.setTextColor(CHART_TEXT_COLOR);
+ yAxisRight.setAxisMaximum(100);
+ yAxisRight.setAxisMinimum(0);
+ yAxisRight.setEnabled(false);
+
+ }
+
+ private List extends BatteryLevel> getLevels(DBHandler db, GBDevice device, int tsFrom, int tsTo) {
+ BatteryLevelDao batteryLevelDao = db.getDaoSession().getBatteryLevelDao();
+
+ Device dbDevice = DBHelper.findDevice(device, db.getDaoSession());
+ QueryBuilder qb = batteryLevelDao.queryBuilder();
+
+ qb.where(BatteryLevelDao.Properties.DeviceId.eq(dbDevice.getId())).orderAsc(BatteryLevelDao.Properties.Timestamp);
+ qb.where(BatteryLevelDao.Properties.Timestamp.gt(tsFrom));
+ qb.where(BatteryLevelDao.Properties.Timestamp.lt(tsTo));
+
+ List allLevels = new ArrayList<>();
+ allLevels.addAll(qb.build().list());
+ return allLevels;
+ }
+
+ @Override
+ protected void setupLegend(Chart chart) {
+ chart.getLegend().setHorizontalAlignment(Legend.LegendHorizontalAlignment.CENTER);
+ }
+
+ @Override
+ protected ChartsData refreshInBackground(ChartsHost chartsHost, DBHandler db, GBDevice device) {
+ return null;
+ }
+
+ @Override
+ protected void renderCharts() {
+ }
+
+ @Override
+ protected List extends ActivitySample> getSamples(DBHandler db, GBDevice device, int tsFrom, int tsTo) {
+ return null;
+ }
+
+ protected Entry createLineEntry(float value, int xValue) {
+ return new Entry(xValue, value);
+ }
+
+ @Override
+ protected void updateChartsnUIThread(ChartsData chartsData) {
+ }
+
+}
diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java
index 8fac70a11..e66b638c2 100644
--- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java
+++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/adapter/GBDeviceAdapterv2.java
@@ -57,6 +57,7 @@ import java.util.Locale;
import nodomain.freeyourgadget.gadgetbridge.GBApplication;
import nodomain.freeyourgadget.gadgetbridge.R;
import nodomain.freeyourgadget.gadgetbridge.activities.ActivitySummariesActivity;
+import nodomain.freeyourgadget.gadgetbridge.activities.BatteryInfoActivity;
import nodomain.freeyourgadget.gadgetbridge.activities.ConfigureAlarms;
import nodomain.freeyourgadget.gadgetbridge.activities.VibrationActivity;
import nodomain.freeyourgadget.gadgetbridge.activities.charts.ChartsActivity;
@@ -159,6 +160,19 @@ public class GBDeviceAdapterv2 extends RecyclerView.Adapter
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 2884bdd53..1b3ae860e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -25,6 +25,7 @@
Connecting…
Taking a screenshot of the device
Calibrate Device
+ Battery info
Debug
Really factory reset?