From ed60b2478da33c30217613e5ea02019d859c18a6 Mon Sep 17 00:00:00 2001 From: oliexdev Date: Sun, 6 Jan 2019 18:00:48 +0100 Subject: [PATCH] added TDEE and calories measurement and change BMR to Harris-Benedict equation --- .../3.json | 13 +- .../4.json | 262 ++++++++++++++++++ .../com/health/openscale/core/OpenScale.java | 2 +- .../openscale/core/database/AppDatabase.java | 60 +++- .../core/datatypes/ScaleMeasurement.java | 45 +-- .../gui/views/CaloriesMeasurementView.java | 73 +++++ .../openscale/gui/views/MeasurementView.java | 4 +- .../gui/views/MeasurementViewSettings.java | 1 + .../gui/views/TDEEMeasurementView.java | 78 ++++++ .../main/res/drawable-hdpi/ic_calories.png | Bin 0 -> 983 bytes .../src/main/res/drawable-hdpi/ic_tdee.png | Bin 0 -> 911 bytes .../main/res/drawable-ldpi/ic_calories.png | Bin 0 -> 440 bytes .../src/main/res/drawable-ldpi/ic_tdee.png | Bin 0 -> 434 bytes .../main/res/drawable-mdpi/ic_calories.png | Bin 0 -> 605 bytes .../src/main/res/drawable-mdpi/ic_tdee.png | Bin 0 -> 612 bytes .../main/res/drawable-xhdpi/ic_calories.png | Bin 0 -> 1397 bytes .../src/main/res/drawable-xhdpi/ic_tdee.png | Bin 0 -> 1255 bytes .../main/res/drawable-xxhdpi/ic_calories.png | Bin 0 -> 2217 bytes .../src/main/res/drawable-xxhdpi/ic_tdee.png | Bin 0 -> 1894 bytes .../main/res/drawable-xxxhdpi/ic_calories.png | Bin 0 -> 2998 bytes .../src/main/res/drawable-xxxhdpi/ic_tdee.png | Bin 0 -> 2522 bytes .../app/src/main/res/values-de/strings.xml | 4 +- .../app/src/main/res/values/strings.xml | 2 + 23 files changed, 514 insertions(+), 30 deletions(-) create mode 100644 android_app/app/schemas/com.health.openscale.core.database.AppDatabase/4.json create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/views/CaloriesMeasurementView.java create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/views/TDEEMeasurementView.java create mode 100644 android_app/app/src/main/res/drawable-hdpi/ic_calories.png create mode 100644 android_app/app/src/main/res/drawable-hdpi/ic_tdee.png create mode 100644 android_app/app/src/main/res/drawable-ldpi/ic_calories.png create mode 100644 android_app/app/src/main/res/drawable-ldpi/ic_tdee.png create mode 100644 android_app/app/src/main/res/drawable-mdpi/ic_calories.png create mode 100644 android_app/app/src/main/res/drawable-mdpi/ic_tdee.png create mode 100644 android_app/app/src/main/res/drawable-xhdpi/ic_calories.png create mode 100644 android_app/app/src/main/res/drawable-xhdpi/ic_tdee.png create mode 100644 android_app/app/src/main/res/drawable-xxhdpi/ic_calories.png create mode 100644 android_app/app/src/main/res/drawable-xxhdpi/ic_tdee.png create mode 100644 android_app/app/src/main/res/drawable-xxxhdpi/ic_calories.png create mode 100644 android_app/app/src/main/res/drawable-xxxhdpi/ic_tdee.png diff --git a/android_app/app/schemas/com.health.openscale.core.database.AppDatabase/3.json b/android_app/app/schemas/com.health.openscale.core.database.AppDatabase/3.json index 2b7e3e0d..f3858d57 100644 --- a/android_app/app/schemas/com.health.openscale.core.database.AppDatabase/3.json +++ b/android_app/app/schemas/com.health.openscale.core.database.AppDatabase/3.json @@ -2,11 +2,11 @@ "formatVersion": 1, "database": { "version": 3, - "identityHash": "974ad0a810bf389300cf67b40862bb75", + "identityHash": "2db259b9e244ebad0c664f2c9fb36068", "entities": [ { "tableName": "scaleMeasurements", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `userId` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `datetime` INTEGER, `weight` REAL NOT NULL, `fat` REAL NOT NULL, `water` REAL NOT NULL, `muscle` REAL NOT NULL, `visceralFat` REAL NOT NULL, `lbm` REAL NOT NULL, `waist` REAL NOT NULL, `hip` REAL NOT NULL, `bone` REAL NOT NULL, `chest` REAL NOT NULL, `thigh` REAL NOT NULL, `biceps` REAL NOT NULL, `neck` REAL NOT NULL, `caliper1` REAL NOT NULL, `caliper2` REAL NOT NULL, `caliper3` REAL NOT NULL, `comment` TEXT, FOREIGN KEY(`userId`) REFERENCES `scaleUsers`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `userId` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `datetime` INTEGER, `weight` REAL NOT NULL, `fat` REAL NOT NULL, `water` REAL NOT NULL, `muscle` REAL NOT NULL, `visceralFat` REAL NOT NULL, `lbm` REAL NOT NULL, `waist` REAL NOT NULL, `hip` REAL NOT NULL, `bone` REAL NOT NULL, `chest` REAL NOT NULL, `thigh` REAL NOT NULL, `biceps` REAL NOT NULL, `neck` REAL NOT NULL, `caliper1` REAL NOT NULL, `caliper2` REAL NOT NULL, `caliper3` REAL NOT NULL, `calories` REAL NOT NULL, `comment` TEXT, FOREIGN KEY(`userId`) REFERENCES `scaleUsers`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", "fields": [ { "fieldPath": "id", @@ -128,6 +128,12 @@ "affinity": "REAL", "notNull": true }, + { + "fieldPath": "calories", + "columnName": "calories", + "affinity": "REAL", + "notNull": true + }, { "fieldPath": "comment", "columnName": "comment", @@ -247,9 +253,10 @@ "foreignKeys": [] } ], + "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"974ad0a810bf389300cf67b40862bb75\")" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"2db259b9e244ebad0c664f2c9fb36068\")" ] } } \ No newline at end of file diff --git a/android_app/app/schemas/com.health.openscale.core.database.AppDatabase/4.json b/android_app/app/schemas/com.health.openscale.core.database.AppDatabase/4.json new file mode 100644 index 00000000..3c1e634e --- /dev/null +++ b/android_app/app/schemas/com.health.openscale.core.database.AppDatabase/4.json @@ -0,0 +1,262 @@ +{ + "formatVersion": 1, + "database": { + "version": 4, + "identityHash": "2db259b9e244ebad0c664f2c9fb36068", + "entities": [ + { + "tableName": "scaleMeasurements", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `userId` INTEGER NOT NULL, `enabled` INTEGER NOT NULL, `datetime` INTEGER, `weight` REAL NOT NULL, `fat` REAL NOT NULL, `water` REAL NOT NULL, `muscle` REAL NOT NULL, `visceralFat` REAL NOT NULL, `lbm` REAL NOT NULL, `waist` REAL NOT NULL, `hip` REAL NOT NULL, `bone` REAL NOT NULL, `chest` REAL NOT NULL, `thigh` REAL NOT NULL, `biceps` REAL NOT NULL, `neck` REAL NOT NULL, `caliper1` REAL NOT NULL, `caliper2` REAL NOT NULL, `caliper3` REAL NOT NULL, `calories` REAL NOT NULL, `comment` TEXT, FOREIGN KEY(`userId`) REFERENCES `scaleUsers`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userId", + "columnName": "userId", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "enabled", + "columnName": "enabled", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "dateTime", + "columnName": "datetime", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "weight", + "columnName": "weight", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "fat", + "columnName": "fat", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "water", + "columnName": "water", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "muscle", + "columnName": "muscle", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "visceralFat", + "columnName": "visceralFat", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "lbm", + "columnName": "lbm", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "waist", + "columnName": "waist", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "hip", + "columnName": "hip", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "bone", + "columnName": "bone", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "chest", + "columnName": "chest", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "thigh", + "columnName": "thigh", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "biceps", + "columnName": "biceps", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "neck", + "columnName": "neck", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "caliper1", + "columnName": "caliper1", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "caliper2", + "columnName": "caliper2", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "caliper3", + "columnName": "caliper3", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "calories", + "columnName": "calories", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "comment", + "columnName": "comment", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [ + { + "name": "index_scaleMeasurements_userId_datetime", + "unique": true, + "columnNames": [ + "userId", + "datetime" + ], + "createSql": "CREATE UNIQUE INDEX `index_scaleMeasurements_userId_datetime` ON `${TABLE_NAME}` (`userId`, `datetime`)" + } + ], + "foreignKeys": [ + { + "table": "scaleUsers", + "onDelete": "CASCADE", + "onUpdate": "NO ACTION", + "columns": [ + "userId" + ], + "referencedColumns": [ + "id" + ] + } + ] + }, + { + "tableName": "scaleUsers", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `username` TEXT NOT NULL, `birthday` INTEGER NOT NULL, `bodyHeight` REAL NOT NULL, `scaleUnit` INTEGER NOT NULL, `gender` INTEGER NOT NULL, `initialWeight` REAL NOT NULL, `goalWeight` REAL NOT NULL, `goalDate` INTEGER, `measureUnit` INTEGER NOT NULL, `activityLevel` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "username", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "birthday", + "columnName": "birthday", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "bodyHeight", + "columnName": "bodyHeight", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "scaleUnit", + "columnName": "scaleUnit", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "gender", + "columnName": "gender", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "initialWeight", + "columnName": "initialWeight", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "goalWeight", + "columnName": "goalWeight", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "goalDate", + "columnName": "goalDate", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "measureUnit", + "columnName": "measureUnit", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "activityLevel", + "columnName": "activityLevel", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"2db259b9e244ebad0c664f2c9fb36068\")" + ] + } +} \ No newline at end of file diff --git a/android_app/app/src/main/java/com/health/openscale/core/OpenScale.java b/android_app/app/src/main/java/com/health/openscale/core/OpenScale.java index 68569833..51604234 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/OpenScale.java +++ b/android_app/app/src/main/java/com/health/openscale/core/OpenScale.java @@ -135,7 +135,7 @@ public class OpenScale { db.setForeignKeyConstraintsEnabled(true); } }) - .addMigrations(AppDatabase.MIGRATION_1_2, AppDatabase.MIGRATION_2_3) + .addMigrations(AppDatabase.MIGRATION_1_2, AppDatabase.MIGRATION_2_3, AppDatabase.MIGRATION_3_4) .build(); measurementDAO = appDB.measurementDAO(); userDAO = appDB.userDAO(); diff --git a/android_app/app/src/main/java/com/health/openscale/core/database/AppDatabase.java b/android_app/app/src/main/java/com/health/openscale/core/database/AppDatabase.java index 3d6a9c8a..268419c4 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/database/AppDatabase.java +++ b/android_app/app/src/main/java/com/health/openscale/core/database/AppDatabase.java @@ -16,17 +16,17 @@ package com.health.openscale.core.database; -import androidx.sqlite.db.SupportSQLiteDatabase; -import androidx.room.Database; -import androidx.room.RoomDatabase; -import androidx.room.TypeConverters; -import androidx.room.migration.Migration; - import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.datatypes.ScaleUser; import com.health.openscale.core.utils.Converters; -@Database(entities = {ScaleMeasurement.class, ScaleUser.class}, version = 3) +import androidx.room.Database; +import androidx.room.RoomDatabase; +import androidx.room.TypeConverters; +import androidx.room.migration.Migration; +import androidx.sqlite.db.SupportSQLiteDatabase; + +@Database(entities = {ScaleMeasurement.class, ScaleUser.class}, version = 4) @TypeConverters({Converters.class}) public abstract class AppDatabase extends RoomDatabase { public abstract ScaleMeasurementDAO measurementDAO(); @@ -130,4 +130,50 @@ public abstract class AppDatabase extends RoomDatabase { } } }; + + public static final Migration MIGRATION_3_4 = new Migration(3, 4) { + @Override + public void migrate(SupportSQLiteDatabase database) { + database.beginTransaction(); + try { + // Drop old index + database.execSQL("DROP INDEX index_scaleMeasurements_userId_datetime"); + + // Rename old table + database.execSQL("ALTER TABLE scaleMeasurements RENAME TO scaleMeasurementsOld"); + + // Create new table with foreign key + database.execSQL("CREATE TABLE scaleMeasurements" + + " (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + + " userId INTEGER NOT NULL, enabled INTEGER NOT NULL," + + " datetime INTEGER, weight REAL NOT NULL, fat REAL NOT NULL," + + " water REAL NOT NULL, muscle REAL NOT NULL, visceralFat REAL NOT NULL," + + " lbm REAL NOT NULL, waist REAL NOT NULL, hip REAL NOT NULL," + + " bone REAL NOT NULL, chest REAL NOT NULL, thigh REAL NOT NULL," + + " biceps REAL NOT NULL, neck REAL NOT NULL, caliper1 REAL NOT NULL," + + " caliper2 REAL NOT NULL, caliper3 REAL NOT NULL, calories REAL NOT NULL, comment TEXT," + + " FOREIGN KEY(userId) REFERENCES scaleUsers(id)" + + " ON UPDATE NO ACTION ON DELETE CASCADE)"); + + // Create new index on datetime + userId + database.execSQL("CREATE UNIQUE INDEX index_scaleMeasurements_userId_datetime" + + " ON scaleMeasurements (userId, datetime)"); + + // Copy data from the old table + database.execSQL("INSERT INTO scaleMeasurements" + + " SELECT id, userId, enabled, datetime, weight, fat, water, muscle," + + " visceralFat, lbm, waist, hip, bone, chest," + + " thigh, biceps, neck, caliper1," + + " caliper2, caliper3, 0 as calories, comment FROM scaleMeasurementsOld"); + + // Delete old table + database.execSQL("DROP TABLE scaleMeasurementsOld"); + + database.setTransactionSuccessful(); + } + finally { + database.endTransaction(); + } + } + }; } diff --git a/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleMeasurement.java b/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleMeasurement.java index d8a56c36..38adee04 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleMeasurement.java +++ b/android_app/app/src/main/java/com/health/openscale/core/datatypes/ScaleMeasurement.java @@ -16,17 +16,16 @@ package com.health.openscale.core.datatypes; -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.ForeignKey; -import androidx.room.Index; -import androidx.room.PrimaryKey; - import com.j256.simplecsv.common.CsvColumn; import java.lang.reflect.Field; import java.util.Date; +import androidx.room.ColumnInfo; +import androidx.room.Entity; +import androidx.room.ForeignKey; +import androidx.room.Index; +import androidx.room.PrimaryKey; import timber.log.Timber; @Entity(tableName = "scaleMeasurements", @@ -97,6 +96,9 @@ public class ScaleMeasurement implements Cloneable { @ColumnInfo(name = "caliper3") private float caliper3; @CsvColumn(mustBeSupplied = false) + @ColumnInfo(name = "calories") + private float calories; + @CsvColumn(mustBeSupplied = false) @ColumnInfo(name = "comment") private String comment; @@ -346,6 +348,10 @@ public class ScaleMeasurement implements Cloneable { this.caliper3 = caliper3; } + public float getCalories() { return calories; } + + public void setCalories(float calories) { this.calories = calories; } + public String getComment() { return comment; } @@ -365,6 +371,18 @@ public class ScaleMeasurement implements Cloneable { public float getBMR(ScaleUser scaleUser) { float bmr; + + // BMR Harris-Benedict equation + if (scaleUser.getGender().isMale()) { + bmr = 66.4730f + (13.7516f * weight) + (5.0033f * scaleUser.getBodyHeight()) - (6.7550f * scaleUser.getAge(dateTime)); + } else { + bmr = 655.0955f + (9.5634f * weight) + (1.8496f * scaleUser.getBodyHeight()) - (4.6756f * scaleUser.getAge(dateTime)); + } + + return bmr; // kCal / day + } + + public float getTDEE(ScaleUser scaleUser) { float factor = 1.0f; switch (scaleUser.getActivityLevel()) { @@ -372,27 +390,20 @@ public class ScaleMeasurement implements Cloneable { factor = 1.2f; break; case MILD: - factor = 1.3f; + factor = 1.375f; break; case MODERATE: - factor = 1.5f; + factor = 1.55f; break; case HEAVY: - factor = 1.7f; + factor = 1.725f; break; case EXTREME: factor = 1.9f; break; } - // BMR formula by Mifflin, St Jeor et al: A new predictive equation for resting energy expenditure in healthy individuals - if (scaleUser.getGender().isMale()) { - bmr = 10.0f * weight + 6.25f * scaleUser.getBodyHeight() - 5.0f * scaleUser.getAge(dateTime) + 5.0f; - } else { - bmr = 10.0f * weight + 6.25f * scaleUser.getBodyHeight() - 5.0f * scaleUser.getAge(dateTime) - 161.0f; - } - - return bmr * factor; // kCal / day + return factor * getBMR(scaleUser); } public float getWHtR(float body_height) { diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/CaloriesMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/CaloriesMeasurementView.java new file mode 100644 index 00000000..9c7d8316 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/CaloriesMeasurementView.java @@ -0,0 +1,73 @@ +/* Copyright (C) 2019 olie.xdev +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program 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 General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see +*/ +package com.health.openscale.gui.views; + +import android.content.Context; +import android.graphics.Color; + +import com.health.openscale.R; +import com.health.openscale.core.datatypes.ScaleMeasurement; +import com.health.openscale.core.evaluation.EvaluationResult; +import com.health.openscale.core.evaluation.EvaluationSheet; + +public class CaloriesMeasurementView extends FloatMeasurementView { + // Don't change key value, it may be stored persistent in preferences + public static final String KEY = "calories"; + + public CaloriesMeasurementView(Context context) { + super(context, R.string.label_calories, R.drawable.ic_calories); + } + + @Override + public String getKey() { + return KEY; + } + + @Override + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getCalories(); + } + + @Override + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + measurement.setCalories(value); + } + + @Override + public String getUnit() { + return "kCal"; + } + + @Override + protected float getMaxValue() { + return 100000; + } + + @Override + protected int getDecimalPlaces() { + return 0; + } + + @Override + public int getColor() { + return Color.parseColor("#e533ff"); + } + + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return null; + } +} diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementView.java index 0e90acbb..e1f2e01e 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementView.java @@ -25,7 +25,6 @@ import android.graphics.drawable.Drawable; import android.os.Bundle; import android.preference.PreferenceManager; import android.preference.PreferenceScreen; -import androidx.core.content.ContextCompat; import android.text.SpannableStringBuilder; import android.text.TextUtils; import android.util.TypedValue; @@ -50,6 +49,7 @@ import com.health.openscale.core.evaluation.EvaluationResult; import java.util.ArrayList; import java.util.List; +import androidx.core.content.ContextCompat; import lecho.lib.hellocharts.util.ChartUtils; import static com.health.openscale.gui.views.MeasurementView.MeasurementViewMode.ADD; @@ -126,6 +126,8 @@ public abstract class MeasurementView extends TableLayout { unsorted.add(new Caliper2MeasurementView(context)); unsorted.add(new Caliper3MeasurementView(context)); unsorted.add(new BMRMeasurementView(context)); + unsorted.add(new TDEEMeasurementView(context)); + unsorted.add(new CaloriesMeasurementView(context)); unsorted.add(new CommentMeasurementView(context)); // Get sort order diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementViewSettings.java b/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementViewSettings.java index b209f52b..8e33cd6b 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementViewSettings.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementViewSettings.java @@ -64,6 +64,7 @@ public class MeasurementViewSettings { case Caliper1MeasurementView.KEY: case Caliper2MeasurementView.KEY: case Caliper3MeasurementView.KEY: + case CaloriesMeasurementView.KEY: defaultValue = false; break; default: diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/TDEEMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/TDEEMeasurementView.java new file mode 100644 index 00000000..38b0970f --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/TDEEMeasurementView.java @@ -0,0 +1,78 @@ +/* Copyright (C) 2019 olie.xdev +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program 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 General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see +*/ +package com.health.openscale.gui.views; + +import android.content.Context; +import android.graphics.Color; + +import com.health.openscale.R; +import com.health.openscale.core.datatypes.ScaleMeasurement; +import com.health.openscale.core.evaluation.EvaluationResult; +import com.health.openscale.core.evaluation.EvaluationSheet; + +public class TDEEMeasurementView extends FloatMeasurementView { + // Don't change key value, it may be stored persistent in preferences + public static final String KEY = "tdee"; + + public TDEEMeasurementView(Context context) { + super(context, R.string.label_tdee, R.drawable.ic_tdee); + } + + @Override + public String getKey() { + return KEY; + } + + @Override + public boolean isEditable() { + return false; + } + + @Override + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getTDEE(getScaleUser()); + } + + @Override + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + // Empty + } + + @Override + public String getUnit() { + return "kCal"; + } + + @Override + protected float getMaxValue() { + return 10000; + } + + @Override + protected int getDecimalPlaces() { + return 0; + } + + @Override + public int getColor() { + return Color.parseColor("#6ea626"); + } + + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return null; + } +} diff --git a/android_app/app/src/main/res/drawable-hdpi/ic_calories.png b/android_app/app/src/main/res/drawable-hdpi/ic_calories.png new file mode 100644 index 0000000000000000000000000000000000000000..4b6a734d019f609233b57c6eb30ea619aede8d3a GIT binary patch literal 983 zcmV;|11S87P)lRA!+(S zt+B)s(=S4OP}K^t2H}H{n53bWHc}dbE*eW>Z75-MVnnHy8BA+r+VSBz*W8Xf?R$o# ziOfHl+sdyiM;$e&{XtxhEu>^B-2*GE#8l$lk{rCijC30KPg_ASw-h;MWG9{di z=P@6vuoAPd2kuV$d*McWT+r_BLg91qW-cK(6$_G)3bx^MA^UUKUnsc=?}->03Jo|D z?_j!6JPViNbv%ag>9SK2!PhVck7FTrD`@jze1{piWS|>&h|KB{>hxe4u21XDn38FC zfnmf@S!B-yq0}wHjZcf%IuIS$Q@AS!8-@F_30;Nb@c|A=`xOz4*BPel!$k!fa5^p$ zg|Huo;tf#_I?~xC=*_Tw5I!6Zp~WH_Hi|T#fp>*+^F+466ZkR1_IcPhmymSHIq9!c zDD<1CMNMhlk0UefwhC3VP!{R_h)C1vY5y7#Lr)DdItnjgJ)Xt+Sd%_i;d_x7{|Y5h zjkn+{p~g2NUfM*aR26C#jrI&to3@Iw(2dzbm5yY0D22x3L`CJI-#izfazv&ja!eFOeT56r_WLZvzQY0#xdh_R%#4xtt?jkcw8+r$9ai2c$X zYjB)!^9C$0)iKnEWAJ5KmlL7YA`^?EQ6x-fx@>1?Fc5$LAk7j43QVm7Zu1viNoZmDj-K4K0o85sO0)jYUbWZ}_RZpUND0m4mti%GK?58`%Q zf>%YLj}iY5HsS#>8JtkfvMG2}1n{oJ%3XZ_2uASV<1Zsq&G>%X_oIkzS>$K|*aTX7w(zeMF-^g<~qf%<%@|A?j{c?RvGCQ!G;%pvZGpADO)f__a;b}aD zbq&aD?;-O&)(o-TrP}E8bq0&-YsrHx$mIIHquNiamiJkl#4+)N?H7;eObarj)G5)$ zQu4Vs!#)fBWSXc7FDIXa{}-8DbxK?*_R$J9jhjqUbxM4ed>?}HPym- z2i_f!__U}mi|I2LGq_LOqzU8_8>CGCbpeM(9lJCm?#-(1;FuU8E*aspC6i45^=C>r z3|A-Hr8S~Obi^e1!w{zee`~%+)@IoJESmcn_%$WVX{6JlQ7FBmx7)6L^4<}Sg?P{604)=>ARw0J6Z9T+>Vp^qCAx;O~iy(5D z>V#3?1Mv!{BaZJ6=LG49LtMGhm&8EcgxEDHM!8>>MT;6ZG330CnaAt6A^k4!IX=dh zLhj$h-kKJ#V>aUs|D7O?h^Oml=FJSnq&PPn)a-@TKVo_A%1xA`P(L<_yWfgy#S*Sp lRr*Eoa_Vp*bGk|Je*r?jR5V~0$_W4f002ovPDHLkV1i1ks4oBj literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-ldpi/ic_calories.png b/android_app/app/src/main/res/drawable-ldpi/ic_calories.png new file mode 100644 index 0000000000000000000000000000000000000000..7cb8b0e0892db3bc098f9a789a21934471a73db5 GIT binary patch literal 440 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 literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-xxhdpi/ic_tdee.png b/android_app/app/src/main/res/drawable-xxhdpi/ic_tdee.png new file mode 100644 index 0000000000000000000000000000000000000000..a3fc8482cc35a1785c0fd64db1aa37bbce0f2a5f GIT binary patch literal 1894 zcmV-s2buVZP)K#*WMGl#Ux&c7vplg2+zgS@l-qw6L=iQ z@NYbX2m0-9+=H_n+ubVG;Qjasj-WSY`zN;Jb6D5meI&>0a0^ZupOmupKkUSNvAmnx z8V}3xF&xkyDP`>tK9BQK-q1usSy$s5VtiQ$Cj^NHa6e{oy#Kd{)&2G?T#Ai-xf@21 zeHb(NktH%#U4lDQKi$*#HNGTnw&{b}B*vZ{7Vf(Hu(_e0WcVcJlpFaluE&Kf=zb=) zV1I@F)3{M|{Z8==F*ueP_FG)rkzo^}d+({R=U2EWrP3?$Va2b}OK`BnkiX+2(vEF) z@Gd-3V%wv5c?u;T5`)`7==#iWufk&m%Fp84BG6lGtj0|^W7y6)Ts5wO+jBy%>wo_S z{HH+aQM`3rr7hr%;sNLFJtg9%#@L$^cs-`gzk;)EkC-YfRcyd+#UwTMq&z`C5MGj3 zavN4Qx4jWo;xbItxMr2&7s{M?@U@XAsHknjQ30c8X|C?e#8qVLY(PBA}f17+m&#AI|FyvcB!w8w}6 z?kIzFw(T0z*dkPsGmiIU@y!C+*HvE8M^PWGYIi0uHj659Qh3h*s|`;}{)!a~UHGjE z;8)3)~vke{b*>p*8A>X6fg_YClb zoZf$krSeWumz=J=hsZPK^^ZJ1OM$xNbm=|B+bo}={b*M%G%fNjRY718?o%&&I1YNa zH}~DfE)+NMoNW6SekuaGwzHVu&*|RYvc9p&>6)y3JaqTqhvm{|3R9EQ1z8`=>39g< zBPOM%@wG&XHYrY%w$&bxX1sWNPVP}62Qv8LES{4xmvj>>K z3lb<=4D=GncsM8LF^0#9wE3+fZg9#(RDU`6%NC!UDcq`@oZ18t?pT!d`DU$AM9|5cI3&Zvw#SbMQh=^>9wqftqU^`KVxLCZkie3&^ip_#a z2qLyI7LoL**!!^5@D9bb0gsDgGl;DR+23v-SLs!X_sO3TdmmCo+~Z&kzGr@8a{ggv z!;1Ch$JjHXcwuZzD_^epiztRz3{2t^%1@a2Bc4}q-8!)aKIth98&n@hu}_qxbg_Sa zN*up)SA{*d3eV~k%f#M^e8in?_lWAzwIwpf!FsVRv+N*&o=Ba1yanC0aE0n)A$lU6 zdz*-;FKei0aC+4ZV%A-Ba6q>0Qrx9#AypTc5dD8Eo;||3u62U{11Cp4AWa|ndH?_b07*qoM6N<$f-cjm-2eap literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-xxxhdpi/ic_calories.png b/android_app/app/src/main/res/drawable-xxxhdpi/ic_calories.png new file mode 100644 index 0000000000000000000000000000000000000000..d8f79e8ecf05c15e11be5296ffa0c8b7a7df449a GIT binary patch literal 2998 zcmV;n3rX~eP)u zm0+n^RMrYfO4EGwUOilqrb1<;R0@TX3zZQH+yE!p1t?Xg@Ay7fPjF2fPjF2fPjF2fPjF2iXc_t_tgRK z1>OO4so;CtfR};41BWX3-l9+s3`U*PErI4(;9QbBZvZe1ILwpxAz(F-u3~BeuAuS* zFE1`fBP42QEASZbS)fOTW+-qVlYf&@b}VoQ`Z%-v-H0IoA4emvnw@W^TTAb%&P58i z1h^#!%@#Cj4g&XPo;?Ii&y+hiN7=stQ-QT)XH_%M2<$Jp)y1O$iN4;(vkQScE7*oa ztR*`#UIjMeAFWRse{aAZ@lpCOu+e$;i1GI-va_Pn=n4GEXv_0eYDWx_SV;qeGSB(~ zR|4B9Y)an)oJdx-E=-^sSN5;TjU&;59JQx!b(BN?drGIbzBs(cXv;w~ zSgMZxz%FcA?=qn$lKUnDKH;hB3ZUJfnGMV_e!l`tLQJhB>VPrWv;EH%ZbMF-kKMVO zfHNJMSw{W_Y+br9FyE=;G1Sq$h%eYJXu+;jYIfe=iq@=}!WXbdZyITE4f0a@8UXqP{u za6Mv#j{zS+3vQCkodbLjd*+x-tt9Hv%!}G`O_kaa!&34uUK>z@qu-CBQJ$~dA#C;Z z%N6>jBup~evcAe~c@3tHJQMgR+CZ5`x_oIr@GE3?{xEWUM0uuadvt}qDGA-k+P>QH z`z%z6U!55dzR}Xioi?M&VT@H4dM5m{EU;(zH;~>&Fx)K;rFnXd* zm`|15g1wVXBX8Lr5B+Xryo11iyfDK{_M(l|Ea01DHI{l{pr>pf&$DH~#mKSaLvLh_ ztR`}qOlk&wfVsePjPHaTlk%<)c=zodA7%&8x!e=8l=vcJ> zFfk4Vh<(aa{@q9`n}eb|MkTxlYLEdvu@}oNNS!oMha#QL&OF(nX+UA$Ce4N9XTase z*ORCnSCQQiKAU;ohGIPHP~d=114{$H#($2X<`@7{7hA|SY#;D7Y=_0gM*ee7`IE5y zzG-COb2nlx1CA%zbZyR}Q?ZqWGf?1HzV&IA=UZ!%0iZ?Kb-wICp02B~oh&<%i}FU` zDdHb~59<7U3@}C8vzafJXBbWOQc^3D z!;$>X$AFuSyzdy#8_>a#d_iJu$aHR+#?LVFpYnWTO)~(XJ6gz0$4b7`hU`IZ)LA|T zOgHj26Zg>`g&k09rrl`Px-cWTf8oh5l>t3a0D~{~bUW~aBI+s#^}u*^P~&^Z0~R%W zEegoG4lT4v2OaV;;Bf3iAoGb^EBg}HrdokhJnx(7(2e%cl*)iJ@ec$uy{(A)ER04n zbTg8_E0K5@Y0&s=K_I>V610O}hn)ORq6P3Uax(zr_%~@55T6NWIW#vr`6)DOO?%dF z6TY=nf4~t=SvQp&?tU76H84s`P>iL^fG$W=$|a{4IKPwj0l#tR)&S>`oeg!^<_$Bn zd=zm<(hJCn>qAEzGWAF-4s}w=QFbY0|H&6C-;AOsre}Vy&O9sj%vX2(=IJg-+j7Ik zUqSniuE<#wVHFCjIu32ZOf;g{q^5*6tRrjT&1H^$C-8pH^ERYiZO{B3jx8x79Lmt` zNT~lcnEL;CWY<3%iKKiwdXzRIk#h{%9sf0fE|)1Hg*IibidkrC2Y!aum0T!f1`NZt zk@>#23u01B4!RA*cl0rsmd^=J-buudCYh-X#g4kZ-lTZZLTo{Ufge-&IfWLa`Q$P` zm?(q+r{sBOE83w?EPyWOfJmXKe^KW5u9Y1?yZnV2y4i?fKDs;b2fJA~ z7W-iK?Zl_eQE2yTa(Aw$t_j$SZz%yhzM6>chvpFBO%P=r`yqJ zj*tQ_MK+{}W)srkYn=hz&?sH+N$Ze^B|~?24!Ua%x?J^n!{Y0RpK{!bw)ta`^>Mb5 z_ac(j!;q2AwMf2-L{`3ySTQIU15DFJQhGbmtn$(IDv-{rBG)13OQD)iQd)zwA$WZ- zpbzn#wwWGAGrTXk%`+=9bVs5MZ4%u>7||%Ey}TXx3KBm*BCcQOLksXzB+m8~S+<(k zfpmG_W~z;Br#B(B(-)-HPPWsxXXujZi|Byli;L>e&i8yIg8Ctm6xn?CAr0ps8u3fe z;=R?Wrz^D`7qp>@@7{^uUy+C;TTm|4dSqO+)AH9voa7rA?UlSZ53~qZJ2=0|SJ~ROax=(PT~BZNS5Cb_PWH zct7A{6?orFva0`bpy|!dfThOYvnlUwzJq|z7{BKgTR|!NfG*g2Z};5f6@lsBI2Ah< z>dG>{caia)7b(C|fWkJSazl!JX(uCv-QoSwdAR6zGx9-nHfCTC#7U)8QYr(? z=<8{vytorF%4o}OWO8Z1zLa(c#oNJh;XG`A%luL+DwP4|Eh{Uj?#0>Wf%M-Q&qrX- z)NR=J9hHhpv3?6}TqT^BY5+tluM@M!Fd1rMRYlh4WT!$9JPRMyi$ z5nL(*K#rZLY�-?UA!Y=b;`QJTV8s;sn}pC=|x*xNYd3qe8AZ9*#m3P0wH&ojCR0 znO%%HI0r?)ft(7(Own%WmaXx|vzO5*SxtFvQtyUD%T(+`CmYddPm0$WfC9xPI?vnD zdiDr%4mBYyuRrpcpN{`3 literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-xxxhdpi/ic_tdee.png b/android_app/app/src/main/res/drawable-xxxhdpi/ic_tdee.png new file mode 100644 index 0000000000000000000000000000000000000000..ca90b922ddf3515bcd5f4ab0a2a8ecf90e35cfcd GIT binary patch literal 2522 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 literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/values-de/strings.xml b/android_app/app/src/main/res/values-de/strings.xml index f3683c5a..ed28cd18 100644 --- a/android_app/app/src/main/res/values-de/strings.xml +++ b/android_app/app/src/main/res/values-de/strings.xml @@ -226,5 +226,7 @@ Die Kopplung ist erfolgreich! \n \nWieder verbinden, um Messdaten abzurufen. + Gesamtenergieumsatz (TDEE) + Kalorien - + diff --git a/android_app/app/src/main/res/values/strings.xml b/android_app/app/src/main/res/values/strings.xml index 6a5b0f37..c402320d 100644 --- a/android_app/app/src/main/res/values/strings.xml +++ b/android_app/app/src/main/res/values/strings.xml @@ -28,6 +28,7 @@ Weight Body mass index (BMI) Basal metabolic rate (BMR) + Total Daily Energy Expenditure (TDEE) Body fat Body water Muscle @@ -230,6 +231,7 @@ Thigh circumference Biceps circumference Neck circumference + Calories Body fat caliper Chest skinfold Abdominal skinfold