mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-11-09 03:37:03 +01:00
Garmin: Persist distance and calories
This commit is contained in:
parent
c700d49bf0
commit
9c67a30835
@ -46,7 +46,7 @@ public class GBDaoGenerator {
|
|||||||
|
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) throws Exception {
|
||||||
final Schema schema = new Schema(79, MAIN_PACKAGE + ".entities");
|
final Schema schema = new Schema(80, MAIN_PACKAGE + ".entities");
|
||||||
|
|
||||||
Entity userAttributes = addUserAttributes(schema);
|
Entity userAttributes = addUserAttributes(schema);
|
||||||
Entity user = addUserInfo(schema, userAttributes);
|
Entity user = addUserInfo(schema, userAttributes);
|
||||||
@ -753,6 +753,8 @@ public class GBDaoGenerator {
|
|||||||
activitySample.addIntProperty(SAMPLE_STEPS).notNull().codeBeforeGetterAndSetter(OVERRIDE);
|
activitySample.addIntProperty(SAMPLE_STEPS).notNull().codeBeforeGetterAndSetter(OVERRIDE);
|
||||||
activitySample.addIntProperty(SAMPLE_RAW_KIND).notNull().codeBeforeGetterAndSetter(OVERRIDE);
|
activitySample.addIntProperty(SAMPLE_RAW_KIND).notNull().codeBeforeGetterAndSetter(OVERRIDE);
|
||||||
addHeartRateProperties(activitySample);
|
addHeartRateProperties(activitySample);
|
||||||
|
activitySample.addIntProperty("distanceCm").notNull().codeBeforeGetterAndSetter(OVERRIDE);
|
||||||
|
activitySample.addIntProperty("activeCalories").notNull().codeBeforeGetterAndSetter(OVERRIDE);
|
||||||
return activitySample;
|
return activitySample;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,44 @@
|
|||||||
|
/* Copyright (C) 2024 José Rebelo
|
||||||
|
|
||||||
|
This file is part of Gadgetbridge.
|
||||||
|
|
||||||
|
Gadgetbridge is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published
|
||||||
|
by the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Gadgetbridge is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <https://www.gnu.org/licenses/>. */
|
||||||
|
package nodomain.freeyourgadget.gadgetbridge.database.schema;
|
||||||
|
|
||||||
|
import android.database.sqlite.SQLiteDatabase;
|
||||||
|
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.database.DBHelper;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.database.DBUpdateScript;
|
||||||
|
import nodomain.freeyourgadget.gadgetbridge.entities.GarminActivitySampleDao;
|
||||||
|
|
||||||
|
public class GadgetbridgeUpdate_80 implements DBUpdateScript {
|
||||||
|
@Override
|
||||||
|
public void upgradeSchema(final SQLiteDatabase db) {
|
||||||
|
if (!DBHelper.existsColumn(GarminActivitySampleDao.TABLENAME, GarminActivitySampleDao.Properties.DistanceCm.columnName, db)) {
|
||||||
|
final String statement = "ALTER TABLE " + GarminActivitySampleDao.TABLENAME + " ADD COLUMN \""
|
||||||
|
+ GarminActivitySampleDao.Properties.DistanceCm.columnName + "\" INTEGER NOT NULL DEFAULT -1";
|
||||||
|
db.execSQL(statement);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!DBHelper.existsColumn(GarminActivitySampleDao.TABLENAME, GarminActivitySampleDao.Properties.ActiveCalories.columnName, db)) {
|
||||||
|
final String statement = "ALTER TABLE " + GarminActivitySampleDao.TABLENAME + " ADD COLUMN \""
|
||||||
|
+ GarminActivitySampleDao.Properties.ActiveCalories.columnName + "\" INTEGER NOT NULL DEFAULT -1";
|
||||||
|
db.execSQL(statement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void downgradeSchema(final SQLiteDatabase db) {
|
||||||
|
}
|
||||||
|
}
|
@ -356,9 +356,11 @@ public class FitImporter {
|
|||||||
|
|
||||||
final List<GarminActivitySample> activitySamples = new ArrayList<>(activitySamplesPerTimestamp.size());
|
final List<GarminActivitySample> activitySamples = new ArrayList<>(activitySamplesPerTimestamp.size());
|
||||||
|
|
||||||
// Garmin reports the cumulative steps per activity, but not always, so we need to keep
|
// Garmin reports the cumulative data per activity, but not always, so we need to keep
|
||||||
// track of the number of steps for each activity, and set the sum of all on the sample
|
// track of the amounts for each activity, and set the sum of all on the sample
|
||||||
final Map<Integer, Long> stepsPerActivity = new HashMap<>();
|
final Map<Integer, Long> stepsPerActivity = new HashMap<>();
|
||||||
|
final Map<Integer, Long> distancePerActivity = new HashMap<>();
|
||||||
|
final Map<Integer, Integer> caloriesPerActivity = new HashMap<>();
|
||||||
|
|
||||||
final int THRESHOLD_NOT_WORN = 10 * 60; // 10 min gap between samples = not-worn
|
final int THRESHOLD_NOT_WORN = 10 * 60; // 10 min gap between samples = not-worn
|
||||||
int prevActivityKind = ActivityKind.UNKNOWN.getCode();
|
int prevActivityKind = ActivityKind.UNKNOWN.getCode();
|
||||||
@ -374,6 +376,9 @@ public class FitImporter {
|
|||||||
sample.setRawKind(ts - prevTs > THRESHOLD_NOT_WORN ? ActivityKind.NOT_WORN.getCode() : prevActivityKind);
|
sample.setRawKind(ts - prevTs > THRESHOLD_NOT_WORN ? ActivityKind.NOT_WORN.getCode() : prevActivityKind);
|
||||||
sample.setRawIntensity(ActivitySample.NOT_MEASURED);
|
sample.setRawIntensity(ActivitySample.NOT_MEASURED);
|
||||||
sample.setSteps(ActivitySample.NOT_MEASURED);
|
sample.setSteps(ActivitySample.NOT_MEASURED);
|
||||||
|
sample.setHeartRate(ActivitySample.NOT_MEASURED);
|
||||||
|
sample.setDistanceCm(ActivitySample.NOT_MEASURED);
|
||||||
|
sample.setActiveCalories(ActivitySample.NOT_MEASURED);
|
||||||
activitySamples.add(sample);
|
activitySamples.add(sample);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -386,8 +391,12 @@ public class FitImporter {
|
|||||||
sample.setRawIntensity(ActivitySample.NOT_MEASURED);
|
sample.setRawIntensity(ActivitySample.NOT_MEASURED);
|
||||||
sample.setSteps(ActivitySample.NOT_MEASURED);
|
sample.setSteps(ActivitySample.NOT_MEASURED);
|
||||||
sample.setHeartRate(ActivitySample.NOT_MEASURED);
|
sample.setHeartRate(ActivitySample.NOT_MEASURED);
|
||||||
|
sample.setDistanceCm(ActivitySample.NOT_MEASURED);
|
||||||
|
sample.setActiveCalories(ActivitySample.NOT_MEASURED);
|
||||||
|
|
||||||
boolean hasSteps = false;
|
boolean hasSteps = false;
|
||||||
|
boolean hasDistance = false;
|
||||||
|
boolean hasCalories = false;
|
||||||
for (final FitMonitoring record : Objects.requireNonNull(records)) {
|
for (final FitMonitoring record : Objects.requireNonNull(records)) {
|
||||||
final Integer activityType = record.getComputedActivityType().orElse(ActivitySample.NOT_MEASURED);
|
final Integer activityType = record.getComputedActivityType().orElse(ActivitySample.NOT_MEASURED);
|
||||||
|
|
||||||
@ -402,6 +411,18 @@ public class FitImporter {
|
|||||||
hasSteps = true;
|
hasSteps = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final Long distance = record.getDistance();
|
||||||
|
if (distance != null) {
|
||||||
|
distancePerActivity.put(activityType, distance);
|
||||||
|
hasDistance = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Integer calories = record.getActiveCalories();
|
||||||
|
if (calories != null) {
|
||||||
|
caloriesPerActivity.put(activityType, calories);
|
||||||
|
hasCalories = true;
|
||||||
|
}
|
||||||
|
|
||||||
final Integer intensity = record.getComputedIntensity();
|
final Integer intensity = record.getComputedIntensity();
|
||||||
if (intensity != null) {
|
if (intensity != null) {
|
||||||
sample.setRawIntensity(intensity);
|
sample.setRawIntensity(intensity);
|
||||||
@ -414,6 +435,20 @@ public class FitImporter {
|
|||||||
}
|
}
|
||||||
sample.setSteps(sumSteps);
|
sample.setSteps(sumSteps);
|
||||||
}
|
}
|
||||||
|
if (hasDistance) {
|
||||||
|
int sumDistance = 0;
|
||||||
|
for (final Long distance : distancePerActivity.values()) {
|
||||||
|
sumDistance += distance;
|
||||||
|
}
|
||||||
|
sample.setDistanceCm(sumDistance);
|
||||||
|
}
|
||||||
|
if (hasCalories) {
|
||||||
|
int sumCalories = 0;
|
||||||
|
for (final Integer calories : caloriesPerActivity.values()) {
|
||||||
|
sumCalories += calories;
|
||||||
|
}
|
||||||
|
sample.setActiveCalories(sumCalories);
|
||||||
|
}
|
||||||
|
|
||||||
activitySamples.add(sample);
|
activitySamples.add(sample);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user