From 3e04778696d5946d7867ccc40ff25841188f9296 Mon Sep 17 00:00:00 2001 From: vanous Date: Sun, 31 Jan 2021 11:10:03 +0100 Subject: [PATCH] initial battery level collector and simple chart --- .../gadgetbridge/daogen/GBDaoGenerator.java | 14 +- app/src/main/AndroidManifest.xml | 5 + .../activities/BatteryInfoActivity.java | 63 ++++++ .../activities/BatteryInfoChartFragment.java | 200 ++++++++++++++++++ .../adapter/GBDeviceAdapterv2.java | 14 ++ .../service/AbstractDeviceSupport.java | 22 ++ .../main/res/layout/activity_battery_info.xml | 75 +++++++ app/src/main/res/values/strings.xml | 1 + 8 files changed, 392 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/BatteryInfoActivity.java create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/BatteryInfoChartFragment.java create mode 100644 app/src/main/res/layout/activity_battery_info.xml 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 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 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 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?