From dbf33d839b69dcc800989db4c92cdd6cc323149a Mon Sep 17 00:00:00 2001 From: OliE Date: Sun, 13 May 2018 12:51:03 +0200 Subject: [PATCH 1/8] added measurements for chest, neck, thigh and arm circumference --- .../2.json | 12 +- .../3.json | 219 ++++++++++++++++++ .../com/health/openscale/core/OpenScale.java | 2 +- .../openscale/core/database/AppDatabase.java | 20 +- .../core/datatypes/ScaleMeasurement.java | 53 ++++- .../gui/views/ArmMeasurementView.java | 68 ++++++ .../gui/views/ChestMeasurementView.java | 68 ++++++ .../openscale/gui/views/MeasurementView.java | 4 + .../gui/views/MeasurementViewSettings.java | 4 + .../gui/views/NeckMeasurementView.java | 68 ++++++ .../gui/views/ThighMeasurementView.java | 68 ++++++ .../app/src/main/res/drawable-hdpi/ic_arm.png | Bin 0 -> 963 bytes .../src/main/res/drawable-hdpi/ic_chest.png | Bin 0 -> 943 bytes .../src/main/res/drawable-hdpi/ic_neck.png | Bin 0 -> 634 bytes .../src/main/res/drawable-hdpi/ic_thigh.png | Bin 0 -> 1039 bytes .../app/src/main/res/drawable-ldpi/ic_arm.png | Bin 0 -> 448 bytes .../src/main/res/drawable-ldpi/ic_chest.png | Bin 0 -> 432 bytes .../src/main/res/drawable-ldpi/ic_neck.png | Bin 0 -> 312 bytes .../src/main/res/drawable-ldpi/ic_thigh.png | Bin 0 -> 467 bytes .../app/src/main/res/drawable-mdpi/ic_arm.png | Bin 0 -> 581 bytes .../src/main/res/drawable-mdpi/ic_chest.png | Bin 0 -> 588 bytes .../src/main/res/drawable-mdpi/ic_neck.png | Bin 0 -> 427 bytes .../src/main/res/drawable-mdpi/ic_thigh.png | Bin 0 -> 625 bytes .../src/main/res/drawable-xhdpi/ic_arm.png | Bin 0 -> 1350 bytes .../src/main/res/drawable-xhdpi/ic_chest.png | Bin 0 -> 1282 bytes .../src/main/res/drawable-xhdpi/ic_neck.png | Bin 0 -> 856 bytes .../src/main/res/drawable-xhdpi/ic_thigh.png | Bin 0 -> 1466 bytes .../src/main/res/drawable-xxhdpi/ic_arm.png | Bin 0 -> 2151 bytes .../src/main/res/drawable-xxhdpi/ic_chest.png | Bin 0 -> 2032 bytes .../src/main/res/drawable-xxhdpi/ic_neck.png | Bin 0 -> 1382 bytes .../src/main/res/drawable-xxhdpi/ic_thigh.png | Bin 0 -> 2379 bytes .../src/main/res/drawable-xxxhdpi/ic_arm.png | Bin 0 -> 2905 bytes .../main/res/drawable-xxxhdpi/ic_chest.png | Bin 0 -> 2840 bytes .../src/main/res/drawable-xxxhdpi/ic_neck.png | Bin 0 -> 1957 bytes .../main/res/drawable-xxxhdpi/ic_thigh.png | Bin 0 -> 3216 bytes .../app/src/main/res/values/strings.xml | 4 + 36 files changed, 583 insertions(+), 7 deletions(-) create mode 100644 android_app/app/schemas/com.health.openscale.core.database.AppDatabase/3.json create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/views/ArmMeasurementView.java create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/views/ChestMeasurementView.java create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/views/NeckMeasurementView.java create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/views/ThighMeasurementView.java create mode 100644 android_app/app/src/main/res/drawable-hdpi/ic_arm.png create mode 100644 android_app/app/src/main/res/drawable-hdpi/ic_chest.png create mode 100644 android_app/app/src/main/res/drawable-hdpi/ic_neck.png create mode 100644 android_app/app/src/main/res/drawable-hdpi/ic_thigh.png create mode 100644 android_app/app/src/main/res/drawable-ldpi/ic_arm.png create mode 100644 android_app/app/src/main/res/drawable-ldpi/ic_chest.png create mode 100644 android_app/app/src/main/res/drawable-ldpi/ic_neck.png create mode 100644 android_app/app/src/main/res/drawable-ldpi/ic_thigh.png create mode 100644 android_app/app/src/main/res/drawable-mdpi/ic_arm.png create mode 100644 android_app/app/src/main/res/drawable-mdpi/ic_chest.png create mode 100644 android_app/app/src/main/res/drawable-mdpi/ic_neck.png create mode 100644 android_app/app/src/main/res/drawable-mdpi/ic_thigh.png create mode 100644 android_app/app/src/main/res/drawable-xhdpi/ic_arm.png create mode 100644 android_app/app/src/main/res/drawable-xhdpi/ic_chest.png create mode 100644 android_app/app/src/main/res/drawable-xhdpi/ic_neck.png create mode 100644 android_app/app/src/main/res/drawable-xhdpi/ic_thigh.png create mode 100644 android_app/app/src/main/res/drawable-xxhdpi/ic_arm.png create mode 100644 android_app/app/src/main/res/drawable-xxhdpi/ic_chest.png create mode 100644 android_app/app/src/main/res/drawable-xxhdpi/ic_neck.png create mode 100644 android_app/app/src/main/res/drawable-xxhdpi/ic_thigh.png create mode 100644 android_app/app/src/main/res/drawable-xxxhdpi/ic_arm.png create mode 100644 android_app/app/src/main/res/drawable-xxxhdpi/ic_chest.png create mode 100644 android_app/app/src/main/res/drawable-xxxhdpi/ic_neck.png create mode 100644 android_app/app/src/main/res/drawable-xxxhdpi/ic_thigh.png diff --git a/android_app/app/schemas/com.health.openscale.core.database.AppDatabase/2.json b/android_app/app/schemas/com.health.openscale.core.database.AppDatabase/2.json index 44f5adba..09425342 100644 --- a/android_app/app/schemas/com.health.openscale.core.database.AppDatabase/2.json +++ b/android_app/app/schemas/com.health.openscale.core.database.AppDatabase/2.json @@ -2,11 +2,11 @@ "formatVersion": 1, "database": { "version": 2, - "identityHash": "29790d4babbe129963d2c9282393c2d2", + "identityHash": "41852b104c8d04f118c09bd1cd32725b", "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, `lbw` REAL NOT NULL, `waist` REAL NOT NULL, `hip` REAL NOT NULL, `bone` 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, `lbw` REAL NOT NULL, `waist` REAL NOT NULL, `hip` REAL NOT NULL, `bone` REAL NOT NULL, `thigh` REAL NOT NULL, `comment` TEXT, FOREIGN KEY(`userId`) REFERENCES `scaleUsers`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", "fields": [ { "fieldPath": "id", @@ -80,6 +80,12 @@ "affinity": "REAL", "notNull": true }, + { + "fieldPath": "thigh", + "columnName": "thigh", + "affinity": "REAL", + "notNull": true + }, { "fieldPath": "comment", "columnName": "comment", @@ -189,7 +195,7 @@ ], "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, \"29790d4babbe129963d2c9282393c2d2\")" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"41852b104c8d04f118c09bd1cd32725b\")" ] } } \ No newline at end of file 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 new file mode 100644 index 00000000..01254966 --- /dev/null +++ b/android_app/app/schemas/com.health.openscale.core.database.AppDatabase/3.json @@ -0,0 +1,219 @@ +{ + "formatVersion": 1, + "database": { + "version": 3, + "identityHash": "8f43c71c1f13451e75ad315064990c9a", + "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, `lbw` REAL NOT NULL, `waist` REAL NOT NULL, `hip` REAL NOT NULL, `bone` REAL NOT NULL, `chest` REAL NOT NULL, `thigh` REAL NOT NULL, `arm` REAL NOT NULL, `neck` 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": "lbm", + "columnName": "lbw", + "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": "arm", + "columnName": "arm", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "neck", + "columnName": "neck", + "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, `birthday` INTEGER, `bodyHeight` INTEGER NOT NULL, `scaleUnit` INTEGER NOT NULL, `gender` INTEGER NOT NULL, `initialWeight` REAL NOT NULL, `goalWeight` REAL NOT NULL, `goalDate` INTEGER)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "userName", + "columnName": "username", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "birthday", + "columnName": "birthday", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "bodyHeight", + "columnName": "bodyHeight", + "affinity": "INTEGER", + "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 + } + ], + "primaryKey": { + "columnNames": [ + "id" + ], + "autoGenerate": true + }, + "indices": [], + "foreignKeys": [] + } + ], + "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, \"8f43c71c1f13451e75ad315064990c9a\")" + ] + } +} \ 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 b0f292dc..485856e0 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 @@ -137,7 +137,7 @@ public class OpenScale { db.setForeignKeyConstraintsEnabled(true); } }) - .addMigrations(AppDatabase.MIGRATION_1_2) + .addMigrations(AppDatabase.MIGRATION_1_2, AppDatabase.MIGRATION_2_3) .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 f4d74e89..d160c8b2 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 @@ -26,7 +26,7 @@ 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 = 2) +@Database(entities = {ScaleMeasurement.class, ScaleUser.class}, version = 3) @TypeConverters({Converters.class}) public abstract class AppDatabase extends RoomDatabase { public abstract ScaleMeasurementDAO measurementDAO(); @@ -75,5 +75,23 @@ public abstract class AppDatabase extends RoomDatabase { } } }; + + public static final Migration MIGRATION_2_3 = new Migration(2, 3) { + @Override + public void migrate(SupportSQLiteDatabase database) { + database.beginTransaction(); + try { + database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN chest REAL NOT NULL DEFAULT 0"); + database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN thigh REAL NOT NULL DEFAULT 0"); + database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN arm REAL NOT NULL DEFAULT 0"); + database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN neck REAL NOT NULL DEFAULT 0"); + + 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 a3ea781e..f8712ac6 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 @@ -74,6 +74,18 @@ public class ScaleMeasurement implements Cloneable { @ColumnInfo(name = "bone") private float bone; @CsvColumn + @ColumnInfo(name = "chest") + private float chest; + @CsvColumn + @ColumnInfo(name = "thigh") + private float thigh; + @CsvColumn + @ColumnInfo(name = "arm") + private float arm; + @CsvColumn + @ColumnInfo(name = "neck") + private float neck; + @CsvColumn @ColumnInfo(name = "comment") private String comment; @@ -90,6 +102,10 @@ public class ScaleMeasurement implements Cloneable { bone = 0.0f; waist = 0.0f; hip = 0.0f; + chest = 0.0f; + thigh = 0.0f; + arm = 0.0f; + neck = 0.0f; comment = ""; } @@ -260,6 +276,38 @@ public class ScaleMeasurement implements Cloneable { public void setBone(float bone) {this.bone = bone; } + public float getChest() { + return chest; + } + + public void setChest(float chest) { + this.chest = chest; + } + + public float getThigh() { + return thigh; + } + + public void setThigh(float thigh) { + this.thigh = thigh; + } + + public float getArm() { + return arm; + } + + public void setArm(float arm) { + this.arm = arm; + } + + public float getNeck() { + return neck; + } + + public void setNeck(float neck) { + this.neck = neck; + } + public String getComment() { return comment; } @@ -302,8 +350,9 @@ public class ScaleMeasurement implements Cloneable { { return String.format( "ID: %d, USER_ID: %d, DATE_TIME: %s, WEIGHT: %.2f, FAT: %.2f, WATER: %.2f, " + - "MUSCLE: %.2f, LBM: %.2f, WAIST: %.2f, HIP: %.2f, BONE: %.2f, COMMENT: %s", + "MUSCLE: %.2f, LBM: %.2f, WAIST: %.2f, HIP: %.2f, BONE: %.2f, CHEST: %.2f, " + + "THIGH: %.2f, ARM: %.2f, NECK: %.2f, COMMENT: %s", id, userId, dateTime.toString(), weight, fat, water, - muscle, lbm, waist, hip, bone, comment); + muscle, lbm, waist, hip, bone, chest, thigh, arm, neck, comment); } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/ArmMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/ArmMeasurementView.java new file mode 100644 index 00000000..c064c8b8 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/ArmMeasurementView.java @@ -0,0 +1,68 @@ +/* Copyright (C) 2018 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 ArmMeasurementView extends FloatMeasurementView { + // Don't change key value, it may be stored persistent in preferences + public static final String KEY = "arm"; + + public ArmMeasurementView(Context context) { + super(context, R.string.label_arm, R.drawable.ic_arm); + } + + @Override + public String getKey() { + return KEY; + } + + @Override + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getArm(); + } + + @Override + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + measurement.setArm(value); + } + + @Override + public String getUnit() { + return "cm"; + } + + @Override + protected float getMaxValue() { + return 500; + } + + @Override + public int getColor() { + return Color.parseColor("#c0ca33"); + } + + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return null; + } +} diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/ChestMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/ChestMeasurementView.java new file mode 100644 index 00000000..db9ba93d --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/ChestMeasurementView.java @@ -0,0 +1,68 @@ +/* Copyright (C) 2018 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 ChestMeasurementView extends FloatMeasurementView { + // Don't change key value, it may be stored persistent in preferences + public static final String KEY = "chest"; + + public ChestMeasurementView(Context context) { + super(context, R.string.label_chest, R.drawable.ic_chest); + } + + @Override + public String getKey() { + return KEY; + } + + @Override + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getChest(); + } + + @Override + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + measurement.setChest(value); + } + + @Override + public String getUnit() { + return "cm"; + } + + @Override + protected float getMaxValue() { + return 500; + } + + @Override + public int getColor() { + return Color.parseColor("#1e88e5"); + } + + @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 49375144..98495572 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 @@ -116,6 +116,10 @@ public abstract class MeasurementView extends TableLayout { unsorted.add(new WHtRMeasurementView(context)); unsorted.add(new HipMeasurementView(context)); unsorted.add(new WHRMeasurementView(context)); + unsorted.add(new ChestMeasurementView(context)); + unsorted.add(new ThighMeasurementView(context)); + unsorted.add(new ArmMeasurementView(context)); + unsorted.add(new NeckMeasurementView(context)); unsorted.add(new BMRMeasurementView(context)); unsorted.add(new CommentMeasurementView(context)); 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 98d94dda..8e7b0694 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 @@ -56,6 +56,10 @@ public class MeasurementViewSettings { case BoneMeasurementView.KEY: case WaistMeasurementView.KEY: case HipMeasurementView.KEY: + case ChestMeasurementView.KEY: + case ArmMeasurementView.KEY: + case ThighMeasurementView.KEY: + case NeckMeasurementView.KEY: defaultValue = false; break; default: diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/NeckMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/NeckMeasurementView.java new file mode 100644 index 00000000..e334995c --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/NeckMeasurementView.java @@ -0,0 +1,68 @@ +/* Copyright (C) 2018 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 NeckMeasurementView extends FloatMeasurementView { + // Don't change key value, it may be stored persistent in preferences + public static final String KEY = "neck"; + + public NeckMeasurementView(Context context) { + super(context, R.string.label_neck, R.drawable.ic_neck); + } + + @Override + public String getKey() { + return KEY; + } + + @Override + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getNeck(); + } + + @Override + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + measurement.setNeck(value); + } + + @Override + public String getUnit() { + return "cm"; + } + + @Override + protected float getMaxValue() { + return 500; + } + + @Override + public int getColor() { + return Color.parseColor("#00acc1"); + } + + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return null; + } +} diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/ThighMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/ThighMeasurementView.java new file mode 100644 index 00000000..b99189f5 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/ThighMeasurementView.java @@ -0,0 +1,68 @@ +/* Copyright (C) 2018 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 ThighMeasurementView extends FloatMeasurementView { + // Don't change key value, it may be stored persistent in preferences + public static final String KEY = "thigh"; + + public ThighMeasurementView(Context context) { + super(context, R.string.label_thigh, R.drawable.ic_thigh); + } + + @Override + public String getKey() { + return KEY; + } + + @Override + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getThigh(); + } + + @Override + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + measurement.setThigh(value); + } + + @Override + public String getUnit() { + return "cm"; + } + + @Override + protected float getMaxValue() { + return 500; + } + + @Override + public int getColor() { + return Color.parseColor("#f4511e"); + } + + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return null; + } +} diff --git a/android_app/app/src/main/res/drawable-hdpi/ic_arm.png b/android_app/app/src/main/res/drawable-hdpi/ic_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..a40b2a1afe0db32e852d13e20135843720e0c3a8 GIT binary patch literal 963 zcmV;!13dhRP)K!uz7N+1bW4Goma=M2V*#6 z(i!0y>_k@`yUloL^63PT5Ah~WtzmZ)_Ti{jkUAOfif#E-r2peMrNX8&^RK z;eD)ic&88=vbuodUc4d-Xd@+HNPI{hP7=GYq_S}f?k?!O4TGXC4HO)+48t}0@4$CB zX1rlPt}5t!9K+&x@d(!8RXmNQI6Y%KfG=wJnkF>sHe&BOgnBlD%hGROn(RFhE4K)Z zc@{I0&2Ax%omG4t#A8Cm5dqiCv0xCNVrr(nKatvrSz-kaVL=UFvqh%&5UF>06NF}9 zD`w{Ob>S^h+sfF82kZFTCgRBs+}Z@8dYC0LXrm~++v?b_#@bRcZbbCv6tw#s7vgPv zEcB)pwvY3;6CV|vWIFy3L70u5|B5T|6`{OiIJ4luKA{^QVBQ20>KAnmyrZ#`+)O+t zisu@fRmHAN+}DcW5^-4oi^Wx?npRZ90-^L{*dz+(B3yyxA}+QR^tBjYkH1XCmy%jG zfgYht!$L;(B{GAKJTX>784t+B@-m^Sd3USHLZ?Woy&`^=W;+ky+8Pdyp8yh5L}gfm z5s_IdRJm@i6y+dqmF5X~--^3LAeVCNvgpKoA-?N{SpJR|acOq0w#?uzv3$$%RHkp8 zSfSTNsp%1kuuBx!{fTf#dX7c6IP;9+6A|DW@Upml{0mt^aF6)MqTAs#TqsVC=ZF=8 z6VsRX;DkiBoJf6-Z$;MZ5t=oUN1zDWld~1+eZE-cdz*DQ5x7AF_!6;7Ps(4-mZ2mr lc_ZSW|Gz*t&TjRj{{UQ^$23}1B{l#6002ovPDHLkV1ni5$F2YX literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-hdpi/ic_chest.png b/android_app/app/src/main/res/drawable-hdpi/ic_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..a9fb37b1f7e2c89250ff9565c4a537f074a7b33f GIT binary patch literal 943 zcmV;g15o^lP)JuM}k0iRHXq%wTgeTtpKerLp$mVx}L$FJjVPi>*0R&_9lU@LJBiB@P^M!0y4z zctWhemb^n3*n+)yGL3n6L3a=%RUO|EGdg$$#=FJa#h2XG=Y=P%{h!Eez^`?LjtG}5 z)74=tJ>6nTWQs~c$3?{aL3mveyRg1u;QP~4h7nPSm0=>;tR!>-+k{8llK1>cv2G~QjVGIxgnkoeVaDpceE{$EK&FlN@nDI3 z%t|0GCA1(;ehYgF@_Y4G{I_v9jgezL{-`5#UPRulc&H#B$vbw5c`?ZxO(T^q&Kx=6B7HbBCs|3PNBqVF0p+2zUPtXm>3Y_Qs^zEK_i376hmqu(WJ zp&UPp$uA=(v`J*&&7!Dk<1^eg=zOUn6Ym_0Zr^4KR%C8JF_^w30Q*7JOwje)4cZmD<{$eAs$8~vZp+?uXQ+A~q7X{j(DniqEL4@?G zFCW(?;+^12aZVQSXo>!6@m*mVMM9HeYxd)<8Y81Rzj~iYgsQM;<=et>_!o9sr_L0* R9XkL3002ovPDHLkV1k;W#c%)s literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-hdpi/ic_neck.png b/android_app/app/src/main/res/drawable-hdpi/ic_neck.png new file mode 100644 index 0000000000000000000000000000000000000000..5ea610f1edfcb6e7083def35d82375720df188a8 GIT binary patch literal 634 zcmV-=0)_pFP)vh2#SH)kb2Ik=k%^J~SWS?eqEUyIuLb>eQ!mUgwYsxpMuZT__!-v34gJ(o9s2g~hX&f$Ahv8lYx06^+AMTuw5j0eX!o7~QLs4*+Nm z9wnKEr5x-r4o7fs6D=8FYVabBu_Wbyb=Zf~1=`-=U4i!9K$Ukj$WpnAnOiw;2RF%D0ccgCzT0tb`rY9e1ZhG&@|>yg#rZPf2;KfW#@ z>9(PED1nvx&%>8*mC6qp=IB&}-j-tr&w#xPp1uE5yx1A&%ZB0F1|C z%ohHqjtCFza$$j;!eZ~nfhw>BD}+q^KscWE0`RrMaV^3`;hk!Z`Bq~MKHxU);~BOOsP3bzRqJ0)Fz)ScI_u^0Nz{(7s7Tk)T zac&VopW+w%jW6*A-o=mj3%yvJY|p|o$@Xi!h28iV|KL3w!o}0Qu%U{ex5cRUpaaKa z6bI0k?kh1D-B>7Qaxe|-nEXyhAM6vS*>M3XpvvUe6 z?W*xwjB6Eiwg`-Q@RL}wj-34`VI_`;K$jPf;K};PiF9#)L5`C}&MTaN*NW+GDM}=g z^yfGxFF~`|8MoCz3^a-Gad%#V4fsld5oKVNh}dV&v}2>#RqN|0ri4dD2Oo*G?!!H}OVq_Bw1~q0Sj;bL9~ODysB7mT!eQ-EnO-@9+MH1vXbipF+%tNtMQ$f_VyfNI#S<#V(I%*`wuv! z7D01_)0HqPinFK0dbiF%%rdcCw~GViSlNGva9k~d8cozLcZwqo+>B>MvaMz9Tk)m{ zg14u(ZrqXX$7T3%mY`u1jyfntST5=_vHPYw(={ZUe%w+fW|s+PpO2wwIR3)}c(Ckw zJr3idGNJ>xVH%E2_*R4gsqbN2TV}IW9Kol=>)0=j&Lio*bPc7p(wbkAUT}H_PrLBJ zHR*Y7>N`}yIU;6jKVHic)R{#S9P1aO$ZXvp4;>TsZOdDsoQ3 zL+RyLr03^F;@ps7+aP@N43Q_tL@KHY-NHxOs@N?R+jlHocfa+8++f}o)x`ZWY;(s0i=uP^UczWOZpJ?B2}bDn$ddEc7$ za1YmT3SaQ8NT{_Tatjqq;umh>1U|HB;y-3_tdN_-k^Kst46)8EH-sDe6@t^4!2*V* zmMo*5lj@T7qWxBQ9_vNi%|)j1J>oueVI2>#St9g1)^|9Mf#7>mLLS5tj+gAsWzUDO zh)NyXCFC`9N2QnO#Ya5C78>F958mQZD@RS-kE*1bn#FCL$vEA3T1Q66`=D$Tqg|3YT#Qe{nQ;UHDuOx*}{XqS~U`;Sij_ zh}{$3kdC@iiNw`#u^jPe2(RL2LAVF!q=BqTy?fmhs^S^02k}9;JS$E7mYqxa8f|#5 qS% literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-ldpi/ic_chest.png b/android_app/app/src/main/res/drawable-ldpi/ic_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..fb9e0dd3547a6cc353b1f425431c3c6d2a7ed567 GIT binary patch literal 432 zcmV;h0Z;ykP)A15oZ50M0|+r-cy90bjsbq57W{X{_= z`vYnaO&h0NL2sCYvO>$$277JpR!%p=7Z&SdziXYf&)R!K*ZI+{Fo#2|{)Kcm^j5># z7#7f}(84t=;yro|vnW>ZnUw7+u<)o>@0apVc)=asPQs_ z*Bg=^Vx}RUxi3&x(b0tn&SDzJA@DWyqtLC89^T?v%Pg|@MS(P;HqLB17|(Z!{($0PSdp`ZAHr+71DJ8y$Sn)c_i&^Js< zCw3g4h7{@>Y;{D8J{M|*{oDT?(2JR$r&dcB_rPH685^hkR>3)z{^@@1sK${r$~D|C z67Pg$bnr3k9Wm+L(RAo_>^gZ()*Cu}90l)5ufmsHs3V>5-SCg_r1(HaPkL%r!f)d_ aKKuckAVHnOX literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-ldpi/ic_neck.png b/android_app/app/src/main/res/drawable-ldpi/ic_neck.png new file mode 100644 index 0000000000000000000000000000000000000000..32371264d598123cea1419eb8af4abe6f8426e5a GIT binary patch literal 312 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|wj^(N7l!{JxM1({$v}~}o-U3d z7QIg|?e%hY6kvVezgMbLAi!Yd)?n?oDrUEiC{5j_S;NMC|HQpx*TOdlt`Tw62?_eq zEWml>k>3NUZ&_QeFms=_G;TNEe0smrUvtyRor|7HxJ5sf*t@W|S7>tNp8iR}orj{g zd}vB7xyZe?ldtdMe>Kw^hkcsPZ65S3XlD@#K5x#4|UYu`JmT;>s=+wR! zu^ZhUK@O%}1$_;M+wdEoS^}NHEPnK21Z)27T^SpD=qk7^n%ahaxL6m~8BOB}e)S0S zN<5LBZ3gRbry+O~HsNL)qvLoZ-p~KAAP#1G&I z)#)taLuR^^%(iA3Kk-?tL>HGc$-5@H*Yn07}#u4KjnW9c|AdRJg1OB^c%002ov JPDHLkV1ihr)(!vw literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-mdpi/ic_arm.png b/android_app/app/src/main/res/drawable-mdpi/ic_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..9685d8574496b9cabed696e684dd6521dc671fc3 GIT binary patch literal 581 zcmV-L0=oT)P)(kg2_}V-+!ji;7UP&f8}?wV$()&3C`{3XNYIVWxL#51+!lA0e9hun zBqKEXrPOp5a0TyCir*Bz;vTj)Kv2ZrxPBuH!sWC>N$s(ULOsj4E4!%)USMTPZpSCA zPZU!*!3Eq9CS(bEGsqrbYn5&vo+QF}4ncxxp=>3goMSi?ZC7zTBc>#tqS63CKOUvz z-k4x0+U{h;oD}+NvH=2EUL|)5wI0SqhJPs1LS26d<2{O21iLUY z3qhmUh+9JaPp1uKY_4*?iA(6qNw^3Hg$wyb7@8BpfS8wZ+>7%#66M{vj)yo9cQ%7x zF|G&m@duyrPWb8k&O6=+b_f$wk$O*3=n-Dsj=V(m(1(vP`D{&}GX}A)RmuJXPGwp; T$V0M<00000NkvXXu0mjfyuSSt literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-mdpi/ic_chest.png b/android_app/app/src/main/res/drawable-mdpi/ic_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..ec74ed2ee62629bf3f8d15f17616dda55860ec40 GIT binary patch literal 588 zcmV-S0<-;zP)i=Oh z!+s3m3#M8GbjIheCVOhQfDRn0N2M3t6;5<6N;9lu7Bg7N&?8hZ6gND_WCgMmJ-A)6 zz8CJdk!UzdRXnI;89Ukts)|l5*6|TX6UP9uEhNlhY>s32P{#x=C5|y%+XBH2JWA|g zOl0_m{=_kY?+ud7G$9zrv&7zw+5A*3$5D@aYUqplbdqQd@9`R+;@X** za|0c?izC7%8Nn&lzC{-Ij>K5FhwZr&mf}fo;bDcODOT_{N{)4*J2%SD^(CR2MmP|q z6>4eH9E2-c#Vch>JV2-XulO9@kgTHKg-z;YV| zYXyCyi_(kK5eerL!XjQaAV?3oDrxo9(JxdmSK`ZYB1#eIVWuRrEv=vndxUvJ7+yt8 zm#o3#M4!XXGJ8f=33lPD@Q1Nd2)>B(4H8cZmvP+Yith;b aX#Nj=qgx2rr!!>$00006ZnG3tN?k<8^H@a z7y9)Tmv|HTJ#6AnT7WEzY6TR8srrb~nD7&hn<=s*CqW4Z!qT1L+coY&sQf8@rv=En z!4&$jk-$|Wm(-tJJi`ZJN*-tEhNI?vd^VuH?tKokg0I`C2-X}43s--(6g5>0;T8I@ zU(*+`fI*z&yWn{Z4}?7^;|I3l_ljWOPho@qVKH(~gb`lHE-62$8^Xg|jD3$LaRvN` VGrb8zI^F;P002ovPDHLkV1mrXxPAZt literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-mdpi/ic_thigh.png b/android_app/app/src/main/res/drawable-mdpi/ic_thigh.png new file mode 100644 index 0000000000000000000000000000000000000000..c819bf3e49805fd441ffe03ef33124158b6500e1 GIT binary patch literal 625 zcmV-%0*?KOP)C&%=h*eYDbExb;#HoQY8_Tmnn;wzf46xE6MPb|SXEJQn2 zrxj*ViDl?O3u_hK^^Bfzedqs|QY{!5&w9`0)5iuFHVsx`f^0{YN{A+cpy42k!*DSc-#Pdqw3IFMI(42@zE z^4@`+VnRmKcPXk;?q7GH^rFFWY%=jJs1~zcf%W2|l?q(Lp=|IEI}c=;((_<_00000 LNkvXXu0mjf&FUi# literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-xhdpi/ic_arm.png b/android_app/app/src/main/res/drawable-xhdpi/ic_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..d791e813f2c93399cf564fb201ee7dd4bbb85a8f GIT binary patch literal 1350 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 Ue6bQU_W%F@07*qoM6N<$g67qr@Bjb+ literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-xxhdpi/ic_arm.png b/android_app/app/src/main/res/drawable-xxhdpi/ic_arm.png new file mode 100644 index 0000000000000000000000000000000000000000..c2e0db1d4c0abfeaa55f9f666567d9a31ddd3f4c GIT binary patch literal 2151 zcmV-t2$=VYP)3wgx)$Mlt@ms64&TgN5_C9-`v(LqM zW=-d=z1DC4_S$>>*6;USzZLusPc(>IffVQf3K{6+-w z4h7aLd0#{zFE8*q@<985_7TW?1Y@wedM4 zEmpGD0SzON7dwsyen%dv7U&aF-Yu8`zbvGzyg@IF!QKj-5<*r9COmm7ylVM_Yccky z3K&G@Ht9_zXAjUc67BK?<;aTW7M$)t?8`kslQeS9vHIPcEoI|EAB;bfs%%4SO@W7; zWvcBaBp42ad?m~@ijdHw6S5Nh4IG0EUPr6lN5BANN;=UGn5lk02t1T6W%CUe1FJA! z)AvBL6m9jA|2NS%qV)zxAzz0cq}x-p>yEK$U*J6@|8;1F8KB!d+C6Ty8=eEb@&?D@ zFM4kTti;58z5NKcIovkLvRSPJxFLZM>L3QO&d*J$5%vQ2k=@h}f| zyfPqTH4R!Jds=%fx$}V*5y*B!JL^6{Ic=K~8JVh)O>(!+M8gzl4}59K{v~4h8nz!a zEMVUPjF(*lv~_Frv}&-6=wq`YU_9ml)}>M+1PU?q$O9SlKOJKhX1FzY9}~-D3nMUt zRE2~HQ9>s>Je6Vp=P?_OCpj-_I^cs$weyKrFoRS991ENUT!U;C4+VxGk$M|~8TRE$ z?zV$_M7(srKGjZO7BX<@4E!wBXK4ui^b4#-UeEz-Q5VLC z5bhWDsu85rDE(3~h~unwzC2?WlwoYyDEopYw#Q~DI4FL^a5GmRbG`&2!dfE^>tJ94 zu!7`)+5}wcBGV2Zx`fbek&>~}uGCKA;~@kGL0`8{2x@s%v3$HgwY5mlWyzAiO!f9Y6Hfn8jKnA zo+0$oi4XfwyCCyb#gY(0bB#fm!I%XMM7~PB3OyP^_LY|G^8ubwfBYFjXdKW}!L5YJ z3uI$YPdUd!5H_>M<=Rgn$8xue?>l+)*wbs`$CU}6zs&=n9ubo>QAEg3`A$mRPvRoSP}7!T4MZ@ z1Y$R`MVv*6iHN@Ib;U@`Lxjo6aYHG|#Mut=KhayqcH4A?&Ff|(r|&Re8p$io46?&8 zMuAb7;P(KQsLD#RXDj+5i+~=ay$FAuZ^=y$Bl_*JD{mw-_dh6_A>5O8>JmtdHJ0FC zR0H4)(r-}(#aN6vIDjHdoKq3;4c*WaIUHwCyM0K=GXU=(witPd->ZJFMy%TeQaI1U zEoHk$d{Z|RAPEQhLG4nDa7WXSjfF7?cRUy2lI*rov!Ob-@n`3SBQf+xt}{b>BVR(g z(}s502;4#RhgNhLGvDo^-Ug~gQcH4;BH%(~CHWZH_1ui41+PWotceKK5%s_nBS~2L zCApp*X^SC^az&!WjV1_7X|J#eGrN3(OkH1$x7C_Hj#EF6!#og##IYK;2{<|>5wTcyfs zWGUZ@?DpCTqJ_v}p-XclyX{2vuh&Ad68I2#ISWXgpqerCrd_pCEFC6e-dGRhC3HuO z{m;0+*(l2z;3XusJU-*64uD?P%_pU4dp5=h&Pmax1+slS5}{##BlUkfk*d@oPUBo; zKd&6wf$;MJ1Ho^?)F;3NhAG&?p<$5v3El806jA2%w|NDsjz?oKkF_L_x2WL9@f6OW?XoYdf7pl4vWcumB zsUV(g`@DhPw@x5=hn3dfix9fxKaED1Y!JIlCVJYl-eM?bV0IENVd-Cqh6rKx4sb%u dy8Ms0@eiWg0dzfMc&-2d002ovPDHLkV1h~x<}m;O literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-xxhdpi/ic_chest.png b/android_app/app/src/main/res/drawable-xxhdpi/ic_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..9b1a0a3adb6f647fd36a528244bed48d9cd8306b GIT binary patch literal 2032 zcmVCWsf&|k8-ot--~Xa0NUKF&Q;fQi5%;7W$jXiX+2)W#HGd_FBIFvcUAR3w06 z_2q^9*;8=zsIn*l6se6NfjqPpMF~8$dIBn6j`V4g0=m@3E5PZDik|}?<;p7HG33{4 z%E7gYfcJq4pM4`$*_{Hq)kYnjSeoPHR-n67*_4B8T>$<9I(+t(sj>@TD$onum;jE({S0$*is+a*B- z(u0#wUmQo~WJ3rQh|}~5bc`W^(iz}Ehk?m?GpF#FhG^0!&^};B+VPJGBybK9^H!n{lSD0$4qMbC(}%N|dun}8GyQfBLsVXEx#&hj>d|}s0A7U{D!ozo!EnauOs81VYUiM!%0ejXMq=iNg<4NA&!9AWW?5$z-U9gBE&&f znNC)V1gw`vWnD-bf&24x?PW-aQJ=&gk*O07VsR)&5@K zZ{SnlC8Uv^3yceMv4|L_uHC3?`ApfS?Q9A-u3qgAHO)#QuA9CxkiOz^JFtX{WAf9WOQJBKPWxNuX_r zdzPy0y})&mnN=8+A+v#PK^05_ZC7QjD)%B?;ibe3Rc;TeU=nCQ@@Q#+T99a4QQ#35 zAGJty;$Tn(lR)QzKaoKnz%R(mJIFm9`G^dFpVFTWGT?^cmkbAg8Mds?g19zpScwm z?Z|XtameE;k$VipCeRW32gNeC{a6lsfwz>D3tE6Lfu}|)pio|bN&nxdKhdvUp67v5+v@t!m<8z{rXBaSJ@D=+GxfP2t^$p5xL^v2LVoQ~H!e0IkGM;3 zrthiERLNB!m&L(Zh?{S5s2dks5L;cQL?x=s%7faF=TxgbAL$nTexW*K*xu}5TwLr% zngADp#vu3BZmMJxs0V3Jv_R#+)p&0RrBjP6(w%cKE-t!}sY9);B63e1SkjqYqG+e_ z1kw$(Uo5)@nXl!W14s{LV+@wZ3)}?i#Ot>83WJ|O<;c4a`Q|WUi;Yn@^tNH+uqF>G z!SX!kh<3aN*o4!)yHrZAV-jdIxt)In(TRBtUX#R-q@ZyTXc*GkgZU9Fp)dqGgS!Vs zCXmMDK^I&um;-uod(kE`ff9Hgqy_5rsn>yku z!Z*7#B;~-54)wYS&N%7A_K1x@+7<1xV+o%9HY17X`CJw%Mn=&t^T9S`G;MSen?O2C zBi)071lof{9%};jyRZ<63Jw~Dwjka_vdsp|YO)ik5yLur2B(qeL$#@rO`saQ zH=L75utH z((vk><%f|$VwCS@M2$|!4D)Hn;3y^!sz=1oskseEqEUC?5&35;GCFn*1Xd$$YCY2X z4ZtMOQe-@_4-sk+@Up9=87v|CY>#dDufhfmL;N^}WX>%mq(IYwN05IK0`MF%Lj54b z#nZVH$-Rz}GNO4iXbtj?$Qy+CmmABFHw*Q=Y7^Owa0{6f@@V=dZv77@>zjDL>t_`J O0000^>%acL|0X9VCnqN-CnqN-CnqN-=l{pi7**{c+TaW{RXYf{3>(o< z?LhY9Yur}tAmA`;Msu|TDdKqS#-MTy)s`QNtyqNdDcDMjvG^80muo1E274#kyUhP287p*uu4P$BbpmkX6;237(u^vm(FqT#W!5g>&ecJgPo}#ag zxJnGK-4*gzGACkB2cPX2m~jk8VjC_=%V2$4hVX;v)}P|3HqN)=*A)G=#W+!uy`Qn4 zE^{ZARnh;Ocrs0cX-~@oMeT8)c#@^C2`?)>XVhap8rwKG1Q&^3oC;agEemiV)|Pnv zc3dE4o>I9Mz4!ZVoT#7&i=21Raw+~23A0kvVHIwvpwBK-gB6%kL7(HrLph>?KFi`J zF=YBxz*i6PKpwAvuhgi)2Y96dzGh;%P!$d-PQnh{oS~2A#K*ZA`pA@JqCm_-D;kOx z(R&VA=8Nk2Pn?#b-6k<>Z4qn0%t&*o(H1L218o)M|5$udrp;4?K(|;Fqb+6Ht15Tc z`-EqThPu8CdzWK_sJt6QQF?nh0alx9gm_-y2GK~*2w|&Kdg2k0&!*eE0$3`l>dZ(} z4{D1R`_@8(MNxMSzQ?^dri1%?VKTnMbwcYo4&9RT{Y8E|WEmwY+yX7QSS$^0#TudC zyd)apERoD_#IyK2xqrH-bDG3DtI(+bI5_v@N@k>(X$t%zdO?ADjKLg{(07Pc{f~H6 z4AJ5OaHwdYLJ!)J_{fZ`XR+SmDHqscU+HzHNVJ6=h;E{HZEeS1Ptho?$?;|xufMWx zpuS?56zC!3jrM5m;GE>%29Y~=3oWUm99A}2C+Q|3#TMwH{oYXuh2GdB`CcVsojdCW zI@4YWwqERRlr!rTRLa84xLiv6U)7*aNFG-v$AiV@V!1hEtxyk%8fabOD-*KpL8C=d zU6dRT5kq2gnRb^Zwumk7-u9gt4+-kT7SIz#zdeW9DcF7h9~T`zo%qT+U8Kq^{4R11 zkux?6y}DdZ7UjXvuk@&Evss|~(R~#jj&G*EATPft=5jx19eZ*8eTjZ4OSSUoT{+;+E9Z`$Z zakqE_brU9(aNk5Rg)d3&9qzzI;ke}b&kyifZQqx?)(N3*f}}Ilh$qpU1o19j7y3-G z5|}nMLJV7j4-atdNFiy=>xBIibnPv(1~C+yMNeB;BZk3RQA6zNg3Qj!cz-GZ~y=R07*qoM6N<$f;DfD1poj5 literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-xxhdpi/ic_thigh.png b/android_app/app/src/main/res/drawable-xxhdpi/ic_thigh.png new file mode 100644 index 0000000000000000000000000000000000000000..0a90a5c411af9d3ba3f52dd4fa02770b982a719b GIT binary patch literal 2379 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 D)cb@d literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-xxxhdpi/ic_chest.png b/android_app/app/src/main/res/drawable-xxxhdpi/ic_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..912cb1240800f1423d715baa3e82f0cbe66017ba GIT binary patch literal 2840 zcmV+z3+MESP)y>2rba6Eezt&1ja&qAW@?j z@f9EF7eQlCV@&jei6S4An11tBArK3Z7$TAuNmR5&EmM`YLx)G(X|OY;wuRcxl+JKx z{IK?#yYIc{p0oG4=bU>l_x_Wc)$ZAApLO;+Yd_Xrdv6dt0Q{OJvcfj=o5gWpv^ugh zB*uW309s8#2QXbVaT*WPNS)6rU=EP0nmCPz97PIfT0piaQ9vtA3&;{Vpat>@n5Jm~ zSt5t2?-r9V0n7kTmSH#vd<{63x@dm5&(P0QRf;_30lR>nhhX(R|On5v>&m8 zCep*33@z}6>iE9ihI91@RlqUGE8rzVn+ixD%MC5CfTjYnLueCpVdmmA9<+`N6!4;< zZ_Zqt#>2&i9F3n7w#={yz%US@yWtoZ7cvxp>paOOqdUa;vG#>g5{YSYB zqllBJ&7;r-z}?8OY7qEfTrv2$k#{@-{21};yP^#l{e(I!e~T>6`*=lvVR*)Y zDP;XPD=W%U0sY82?iBK_Gr-S0_}^)G9<&o%i!yCD^d`qb+ksC2hk#|k&4{KyM9EBXRg4Tu1qF0;rbB_G=gjWsi0lJYWl1bbb zu-=1Mz~fOF_n1Q8;#lwxO~Lv*M|MNmESsRq5GB~}dZ#0A4^pRPJ6{`jn8Ls9Sa=(7 zJMah+C>3{AEe^8ogs%kdN8a@|N?VX}_zqI1Uvl50L1(Gi0Ls$>IBOu>t;3>pesXv#Y?|>=y5#lKj5XagK@RNvq8<8((rsy|{w13|R zz6e~8Gy%2PX?7s8U60861EliCD1EQPz=nwOwwSy(hGhz~0DvcuFEgqmUWha|k0W2p zprQ2?syK!Cv-Z>1L5y#|TDiv%GqJ%|O+9u%hl@|Ou#u6M|4=z*b zohDzOmG%wbmw3$V8Vr5N;9zG|Mi&JP8hVwLcE~&+sMBg9UsrpgGP)>0XTx@X3}|B)BMG80nzw4Sf3zU00gD38bzjkyxulupgO->2!Yq(lPHY%h9-KM?9ZS zel%Bq_H#fd`4z8mWZb{bql`vDFXAYCHYy{ySKdKGFR{`NAk*z`XVH?!67#DiXzOUWP#g|0E0@QEy9t|T%MSZIF=r@(ylXUTRh6?Gd$a) zGCCs3Mfn|wY*$uTj_$SYbjj>$0TamC26hvq7U0taealdvh_bApGJUhca#kQ~0Ou<# zrvyX5f35#_BAOly&R&A$$b@bL_r50zNm@WV(rip33s7;;g3Oopx-$5T;g11J$(z=B zq$73>P`w3t$*qW+w$|_(@GE3p;NvmNSd7$9DzQr2kT!C)m9`PM!jb<;!~fOW(}2bAO>%jp{ZDa z78R@9C}>yjf!>(vDvngEv(L=$S&c1z8 z_;j;|lYhKMpetFv8%^ZDN6tq9`n7jPq!mL?h^nVkO?0gztZ5B`eu&OTfBGmOD0tRI0XjQ8>G7;; zLnl(cPC4)OaUTZVj%i2ws#7g2%w4y0#tCn)7S15=>pSPs`V6a&Kn54Yz2Ko8aYNS= zW{{7|H;Ow|1q4|@OA!r1JGJS4j>7CUBOcJWsZ5RNL2y01w%yJOOs;wvG18YA;|k7rdIx*N#%tPEWVbKZp?M*(&d+Izj`uoV$-jM}?pyHZReF-&ng z_ZFmXHYFv{62!@5$9AehoOgmW81^CyQIReQ7Yn!!~6)4HbpA>ez!N0EJJvC)PMJ!i;wD$5b?=V?6r-Vyi;r3d4s{kuIO*@N&l@@JWb z9w-}S0k@g5}~T>D*Q5_Tua1zX*ZOwzK7o|r-`AT8`eP9DAqIXn92aSQr7vUk?L qOJFN9*{G*Q_G(}yQg?TRW%@sK(oe|yVw~3i0000OaOaYK*}sMnS=NL?s>pIm9RdWEBEN2#65^cyP$21Tax9x$oWak6(4BcbT2p?dk5C zh5C|7Z@Opdz3!@h_3FJ>3l4|F;cz${4u`|xa5x+ehr{7;I2;a#!%-(02n?{TLR##`>w#6amB@jQfulfE+lmC`ZDfWz*;XU~2{ecO5T%ePO%T8ga~u@0oG9oGv;}6` zRwNf10K0(&mh}k2IP~^*wyj96Oa@K>t!yh&3lhLqVwk_8HbEdix;}7246?%FGN2vO zJyPOWBozbyqQ%VmEZ^M&JPPcLTB$6I0iFhW0L!Bk)F8^n4f}y_f!k4sAJ6dJ1HhTs z?SKSu2e5&NAAX$Nh9w#>vsZcfIs3;Caw+umyt>2i#3=;o(xCSvA+j0DaNoYfBC?@|IVTeZAVU9_i?SJhWN16^W8g z=qB?qzVaFx95>rmBx)uC(;#--IG%_oYLvYG_KGm@lnSp1}11SRvBa~MU zc+be1isqpe5z5PZrUGlt-*2D?GY2Jc!lpi{hd&#|h1Q`r@3dtcl}*4X^nlh7ZaBCE z_};WV9X)}n0IWZ=&#*SrGTz2@k>NvCxOc&6u&@7zAp zyP?~Gcg?35nW)alz1#}?LgsRoCa6NslXch}3xX&f7PdQ}r8)ZTaFXnv&weylEUtyD z1gX#isH35>2NpZFC*c<6xW{*{kjigFSR6v5-5YeCDY9C#YP$p4BeSsCcP`2f@Y)B> zE#+v!w}$Nw=m~71a=Bs=Df=8IUI!GJ;}JAb2U%l;hRqIW0$hN6bB`iqleb17Z<{%G z^qpG`biv{lB%2-3+sOBqfO{2d8zYeCwdt>ln{9OH6M?+E=W|ZpxbYbBQldyxdT!_k zzH=q!Tx8o&^OaJx`><*e)Yr&XH$LeX;qWUb?@^d-bmN|p2DjqFho%C=4kvb9OH_qJ+< z@^8dbnKl8ry?*(PjZR6UV_n)%n3V+ZAc|rpQK&dw-nSd^Yzb|NDxj-Uh|-fu6jOSD zQ@|u$h2k|yl$DCoyoALNw5c!&EFyhp9_OgH5G!q#Y_8IDqbHG0Mti+hG$col(Zhdu{ij5pOlf6*8@WSAhS} zJ^q9C6IlBvB*nmRU>@@4lW0%v2-2IH-bm@yXyNk~%4l`NZbGC0C3c3RK~siw+yPvf z=KDpckYE|Q=W>**9!3l%wh_v?PC={HBpMOp(boP0b8}EJgoAZ;%{swnPI`1>TJ&0V`n+VZFoeeyWM*3l&k`qyNbI=VI&Cx!w zCy~-?Nxex)6svz9y*as%0IopspUuAZ%Z<#*Mu&drUW3pGmAp(u&&Heo=AmbovE6ij zZad^I4nhy9z%)1){r{g?Xyk`YGxXZ`HJ|P%d$kJv|A^Y8A2Drxh)PnDrk(lbvxu5) zm2D5)NX^#+Ezn+Qe~9H6@}j(F_jlDF6{2#F(P$-FVHDnldUY^xMhz7RlQyVmcQ*1qUSLV>cGsMk&eR6I=Dpn%zo zY+tOxVB`{S&p~!G6uAw9*63{-Kq@D(CV~DbX#uKA-Vl;7M`lVOnLYFS?#Jx;?ce_G--hZ#9qxuDaow`E&)D}((@BVXJ86&PJ+*@2W9{Vu?u}m-v9f6>w%UD%KjLz zF8BN+z`z8boeEZC3S>Ewffg~J)dTo8@E`1gK9>8v4wwrxcl-nA(8hDn% zH|ummAL7&zYNz7{|qU?eafc+uxM&A`jR1$p-l1zz__+XOrZ%maoa zU0D9Nq6N?ixCr?+^hb-wv4jL1luuWAEB_Hj&d{rD}b?x_7ev6zyzc#Y%D|eW?&A|4K7o^UmdA5 z9AG_$?B$3CF$nku@EFpC9L7J>+mU|vE?^XJVwqez1LJ@n0BeDN7m<4i_#5yG;3f(c zh!<4aPnF3jbv%h7drgrvwMgOi1bP8okd~VT>VZ>oa=QX;LfoU3fd1)GO9pc=Wbbjz zB?Q;?!!9ZjXrd8^y!cc6JzBPqevCRR)+|mgRJ?F5{F_*IOQ%q(acg!UW&c{|D z(wgMS3?IT)<>K1tvx06gOB{1a3~Mo&n&_BI5NfdPJ{M;pGz*UctwjvUKwez*MGS)= za|M6QLTDBhuv(p8n1Q^w(A@rnXh5kWiwgLwI`2-hljcc6kJw+zN@x}pup1eSfy~Kv z2}tV_r>XPZSqaUe0-BJyVh?_k@|A$L>U>vLLbGz~dq>o zBr_`Zsq^+lQzeWnDxee4F?Zew?8rc79OxOmzF7&)q5>{a=Nk~Oh)Tpdb$*327AfFy z%;@qi$6SJN0=9$LMQ-UNgARz_jhCrQow6y7Coo)p?3ha;n2E{IYlyw2l5qvLHMA;R z(u<)pqJDZA`hr_Jp`mBPe(#t|Sx7I~ygV#+OD7sWj_rLs)GeLZn1JosQ59o@$KX*6sV5wBNgE@uJ^jvdOGn&Hbl?B3u%QQ_2JsoH80X#D7&6Z~=8_fk z3ZTQlsji6B13ML&(XNO%fcAI2!xf3qio^~oP&ZByV=;N(MHyqBa;%hN)cHbWKJ~qT zTEvUm^Bw94OwXD`Cv4U8Q6wZx#T%<)q8)H0qI&uTAlaEUAwAorj|N~3a2sNVZkIK& zgwPII^*;+4Sn5%5u_M#@<9~!8{J&fGqcPrZp5n2V^nE6yO150;z%EeCY(}R1w&l*ZBd_=lj7N33=!jTqJ0l*@ z-4R#xGl1TNZxHK|Fl@_!RY)cM4zu`hD>2rT#i@X^a%4OVLPCRqI5%C4bU#B7Gew*a zeFO5LYe1ru97XIeN7UbZ)F7?7Lym`c#L>>YH+L=41+B>O$;UL{ySeiwB$`U<3p;Mb zejS^TIpEQdlFq(uiQ6Lr8<$kMC)fPtSZRe1S` z6VWi=L!buf+b>6)ucjl>v6_(pc&o9ODb*le6aA6ypexcvbj$q>8%QZEjv}$-wj*8J zrrhyH?(eIFSD{BBExuU%i}yz*7pDSxs`EFnryYAED(PAzOxYTr`F*} z$cVdj-nn0dttOn$KfO!-KR&4^lPj!!w zTOszY`~ZLlfIE>lL0d>yq)n&>+u`bDb?qc1kgC4kj8s@P25veBI|yMjvbf}C%z6h9 zMZ>$kC2dltDq+Qz@tjRzjOT+?LC8miNfb7uRmit1A8jxn<0g{*eidM_BD6jrT@5f9 z+ohwK$`3bRi*VGO_ak`;QrWkv^!?H#I7$f$6GdtO^0Cz!T0~_=A3P2j-D<8I2^Xqz zmAWUgDjEe7m7uU*Zzmyc-a2E;N%>Wch}OucR&!i|a1R6RK{qan;Hce!UQ2s02wFnJo$R zL0e=LuVcbZLkx2b5uS5EomXT9c(@ZWReKnWjGA36-l#+ReC zUJo;YZ>s-?0Y4-A^*~_Vr-IR zi(okR8nDL*ZiqEVWAV~&^+|KPx_)btWb>hyo%;F8{}5Z1yO-cfXonr-buTe2iV@HY zdyA5n2sS;}0QX_%X@O6=`RaPyZY&gTC_$tSJLGROvfw$Wg`J8$(fw!A`6#!<_G;Ts zu!C(a!d>TOG5%f5k5rnkCP%pt(hF2uSBw2@46Xgd0`bCd3USDO`m;do?Q{ZPdaC>B_vcsYY8oQwb^+ zb|z{i)B%4`X}6HfAgw(z>F+&v4aFy->L}bQu~gv$yrt6jjzTVIM(kYd*)NY^WA46_ zfiDsqfN2>r?dT15CglE3qR{K%81Ok{L!FLD|2!KRL6?Ksm>H{mNH^N(ldcXKkLWIB z6_STf2R#2ojLoP4@eIk|ac>jwmnfvK!)^shA3;le#;bJ42=1#(;X-Vcb87@=;6O{AmGwVoJVeFyOO zfJ~8l#z0KpzXSPDZ3wuhFY;mY<_*41bj|21$m9x`t|5r)naHlJURceh9EVaNEc;`o zW?uvT<&$O?;-ug=h>MI1FtzIEtfX-zwtBgh@E@sL)O~Luo)TekJodJRb3)$N8+&%^ z2*KJ|4fYy|k3`@Y8?CTCAc{GqmQ(m3cKXfg{wNC}w8>-((fs#&V{1)8m2kF7x1S8H zx;h%lG@tAFg};r6>RArgsAn7^obP2<>;@8N3)((}tAyz)%~LVt#KsgQcy-=2zrybm zQ%*~yU-h1KcW`n*Y*b$Qjl`dS4pRwhD6gVpqYK7asR{E@9){iec2fTSi`o(3AmZg* z44shKDKGtJ%9K3-yN^GJ3BS`DGrDfX_L0g2ddKOTa=+=;`WDG-fK!X8qTX|ZcC^!7 z!UmFYff;~3()F}Att6~WKu%;#Py{w1BgvJR!cTJl^~p-sF8pVmT4P7Kx-LQa12L8G z43bx^AdF8?R%o=r-a&gLGAthjoSv|(wn)Kyvff0r8-3`)-$U}tqfW={b38`LdK-t{ z9ooeET#2;h;x;9#)G;?@E_xEl>9)Pyur;1Ek&jR-WZ$rf$V7J<(2>`F zjxjOJzMrge`_ C3Select measurement Select user Configure widget + Chest circumference + Thigh circumference + Arm circumference + Neck circumference From a9f79637e07e5750257267a793be85473f0d4718 Mon Sep 17 00:00:00 2001 From: OliE Date: Sun, 13 May 2018 13:07:58 +0200 Subject: [PATCH 2/8] renamed arm to biceps --- CREDITS | 4 +++- .../3.json | 10 +++++----- .../openscale/core/database/AppDatabase.java | 2 +- .../core/datatypes/ScaleMeasurement.java | 16 ++++++++-------- ...mentView.java => BicepsMeasurementView.java} | 12 ++++++------ .../openscale/gui/views/MeasurementView.java | 2 +- .../gui/views/MeasurementViewSettings.java | 2 +- .../drawable-hdpi/{ic_arm.png => ic_biceps.png} | Bin .../drawable-ldpi/{ic_arm.png => ic_biceps.png} | Bin .../drawable-mdpi/{ic_arm.png => ic_biceps.png} | Bin .../{ic_arm.png => ic_biceps.png} | Bin .../{ic_arm.png => ic_biceps.png} | Bin .../{ic_arm.png => ic_biceps.png} | Bin android_app/app/src/main/res/values/strings.xml | 2 +- 14 files changed, 26 insertions(+), 24 deletions(-) rename android_app/app/src/main/java/com/health/openscale/gui/views/{ArmMeasurementView.java => BicepsMeasurementView.java} (85%) rename android_app/app/src/main/res/drawable-hdpi/{ic_arm.png => ic_biceps.png} (100%) rename android_app/app/src/main/res/drawable-ldpi/{ic_arm.png => ic_biceps.png} (100%) rename android_app/app/src/main/res/drawable-mdpi/{ic_arm.png => ic_biceps.png} (100%) rename android_app/app/src/main/res/drawable-xhdpi/{ic_arm.png => ic_biceps.png} (100%) rename android_app/app/src/main/res/drawable-xxhdpi/{ic_arm.png => ic_biceps.png} (100%) rename android_app/app/src/main/res/drawable-xxxhdpi/{ic_arm.png => ic_biceps.png} (100%) diff --git a/CREDITS b/CREDITS index e271cae9..f515f561 100644 --- a/CREDITS +++ b/CREDITS @@ -60,7 +60,9 @@ License: http://creativecommons.org/licenses/by/3.0/ * Madebyoliver (https://www.flaticon.com/authors/madebyoliver) * Those Icons (https://www.flaticon.com/authors/those-icons) * Smashicons (https://www.flaticon.com/authors/smashicons) -* Swifticons https://www.flaticon.com/authors/swifticons +* Swifticons (https://www.flaticon.com/authors/swifticons) +* Darius Dan (https://www.flaticon.com/authors/darius-dan) +* Pixelmeetup (https://www.flaticon.com/authors/pixelmeetup) Contributors to openScale are listed on: https://github.com/oliexdev/openScale/graphs/contributors 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 01254966..8042a22f 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": "8f43c71c1f13451e75ad315064990c9a", + "identityHash": "dcde328ede1fdeacf08edfb4d8b834ae", "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, `lbw` REAL NOT NULL, `waist` REAL NOT NULL, `hip` REAL NOT NULL, `bone` REAL NOT NULL, `chest` REAL NOT NULL, `thigh` REAL NOT NULL, `arm` REAL NOT NULL, `neck` 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, `lbw` 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, `comment` TEXT, FOREIGN KEY(`userId`) REFERENCES `scaleUsers`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", "fields": [ { "fieldPath": "id", @@ -93,8 +93,8 @@ "notNull": true }, { - "fieldPath": "arm", - "columnName": "arm", + "fieldPath": "biceps", + "columnName": "biceps", "affinity": "REAL", "notNull": true }, @@ -213,7 +213,7 @@ ], "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, \"8f43c71c1f13451e75ad315064990c9a\")" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"dcde328ede1fdeacf08edfb4d8b834ae\")" ] } } \ No newline at end of file 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 d160c8b2..e0e23ad5 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 @@ -83,7 +83,7 @@ public abstract class AppDatabase extends RoomDatabase { try { database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN chest REAL NOT NULL DEFAULT 0"); database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN thigh REAL NOT NULL DEFAULT 0"); - database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN arm REAL NOT NULL DEFAULT 0"); + database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN biceps REAL NOT NULL DEFAULT 0"); database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN neck REAL NOT NULL DEFAULT 0"); database.setTransactionSuccessful(); 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 f8712ac6..a236ab4c 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 @@ -80,8 +80,8 @@ public class ScaleMeasurement implements Cloneable { @ColumnInfo(name = "thigh") private float thigh; @CsvColumn - @ColumnInfo(name = "arm") - private float arm; + @ColumnInfo(name = "biceps") + private float biceps; @CsvColumn @ColumnInfo(name = "neck") private float neck; @@ -104,7 +104,7 @@ public class ScaleMeasurement implements Cloneable { hip = 0.0f; chest = 0.0f; thigh = 0.0f; - arm = 0.0f; + biceps = 0.0f; neck = 0.0f; comment = ""; } @@ -292,12 +292,12 @@ public class ScaleMeasurement implements Cloneable { this.thigh = thigh; } - public float getArm() { - return arm; + public float getBiceps() { + return biceps; } - public void setArm(float arm) { - this.arm = arm; + public void setBiceps(float biceps) { + this.biceps = biceps; } public float getNeck() { @@ -353,6 +353,6 @@ public class ScaleMeasurement implements Cloneable { "MUSCLE: %.2f, LBM: %.2f, WAIST: %.2f, HIP: %.2f, BONE: %.2f, CHEST: %.2f, " + "THIGH: %.2f, ARM: %.2f, NECK: %.2f, COMMENT: %s", id, userId, dateTime.toString(), weight, fat, water, - muscle, lbm, waist, hip, bone, chest, thigh, arm, neck, comment); + muscle, lbm, waist, hip, bone, chest, thigh, biceps, neck, comment); } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/ArmMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/BicepsMeasurementView.java similarity index 85% rename from android_app/app/src/main/java/com/health/openscale/gui/views/ArmMeasurementView.java rename to android_app/app/src/main/java/com/health/openscale/gui/views/BicepsMeasurementView.java index c064c8b8..09cae984 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/ArmMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/BicepsMeasurementView.java @@ -23,12 +23,12 @@ import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; -public class ArmMeasurementView extends FloatMeasurementView { +public class BicepsMeasurementView extends FloatMeasurementView { // Don't change key value, it may be stored persistent in preferences - public static final String KEY = "arm"; + public static final String KEY = "biceps"; - public ArmMeasurementView(Context context) { - super(context, R.string.label_arm, R.drawable.ic_arm); + public BicepsMeasurementView(Context context) { + super(context, R.string.label_biceps, R.drawable.ic_biceps); } @Override @@ -38,12 +38,12 @@ public class ArmMeasurementView extends FloatMeasurementView { @Override protected float getMeasurementValue(ScaleMeasurement measurement) { - return measurement.getArm(); + return measurement.getBiceps(); } @Override protected void setMeasurementValue(float value, ScaleMeasurement measurement) { - measurement.setArm(value); + measurement.setBiceps(value); } @Override 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 98495572..1274926a 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 @@ -118,7 +118,7 @@ public abstract class MeasurementView extends TableLayout { unsorted.add(new WHRMeasurementView(context)); unsorted.add(new ChestMeasurementView(context)); unsorted.add(new ThighMeasurementView(context)); - unsorted.add(new ArmMeasurementView(context)); + unsorted.add(new BicepsMeasurementView(context)); unsorted.add(new NeckMeasurementView(context)); unsorted.add(new BMRMeasurementView(context)); unsorted.add(new CommentMeasurementView(context)); 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 8e7b0694..fe282e56 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 @@ -57,7 +57,7 @@ public class MeasurementViewSettings { case WaistMeasurementView.KEY: case HipMeasurementView.KEY: case ChestMeasurementView.KEY: - case ArmMeasurementView.KEY: + case BicepsMeasurementView.KEY: case ThighMeasurementView.KEY: case NeckMeasurementView.KEY: defaultValue = false; diff --git a/android_app/app/src/main/res/drawable-hdpi/ic_arm.png b/android_app/app/src/main/res/drawable-hdpi/ic_biceps.png similarity index 100% rename from android_app/app/src/main/res/drawable-hdpi/ic_arm.png rename to android_app/app/src/main/res/drawable-hdpi/ic_biceps.png diff --git a/android_app/app/src/main/res/drawable-ldpi/ic_arm.png b/android_app/app/src/main/res/drawable-ldpi/ic_biceps.png similarity index 100% rename from android_app/app/src/main/res/drawable-ldpi/ic_arm.png rename to android_app/app/src/main/res/drawable-ldpi/ic_biceps.png diff --git a/android_app/app/src/main/res/drawable-mdpi/ic_arm.png b/android_app/app/src/main/res/drawable-mdpi/ic_biceps.png similarity index 100% rename from android_app/app/src/main/res/drawable-mdpi/ic_arm.png rename to android_app/app/src/main/res/drawable-mdpi/ic_biceps.png diff --git a/android_app/app/src/main/res/drawable-xhdpi/ic_arm.png b/android_app/app/src/main/res/drawable-xhdpi/ic_biceps.png similarity index 100% rename from android_app/app/src/main/res/drawable-xhdpi/ic_arm.png rename to android_app/app/src/main/res/drawable-xhdpi/ic_biceps.png diff --git a/android_app/app/src/main/res/drawable-xxhdpi/ic_arm.png b/android_app/app/src/main/res/drawable-xxhdpi/ic_biceps.png similarity index 100% rename from android_app/app/src/main/res/drawable-xxhdpi/ic_arm.png rename to android_app/app/src/main/res/drawable-xxhdpi/ic_biceps.png diff --git a/android_app/app/src/main/res/drawable-xxxhdpi/ic_arm.png b/android_app/app/src/main/res/drawable-xxxhdpi/ic_biceps.png similarity index 100% rename from android_app/app/src/main/res/drawable-xxxhdpi/ic_arm.png rename to android_app/app/src/main/res/drawable-xxxhdpi/ic_biceps.png diff --git a/android_app/app/src/main/res/values/strings.xml b/android_app/app/src/main/res/values/strings.xml index b3999072..8354b035 100644 --- a/android_app/app/src/main/res/values/strings.xml +++ b/android_app/app/src/main/res/values/strings.xml @@ -225,6 +225,6 @@ Configure widget Chest circumference Thigh circumference - Arm circumference + Biceps circumference Neck circumference From d20a824f516feebb2bb049af50920e2b9b5da50a Mon Sep 17 00:00:00 2001 From: OliE Date: Sun, 13 May 2018 14:56:22 +0200 Subject: [PATCH 3/8] added fat caliper measurement --- .../3.json | 24 +++++- .../openscale/core/database/AppDatabase.java | 3 + .../core/datatypes/ScaleMeasurement.java | 62 ++++++++++++++- .../gui/views/Caliper1MeasurementView.java | 72 +++++++++++++++++ .../gui/views/Caliper2MeasurementView.java | 72 +++++++++++++++++ .../gui/views/Caliper3MeasurementView.java | 72 +++++++++++++++++ .../gui/views/FatCaliperMeasurementView.java | 73 ++++++++++++++++++ .../gui/views/FloatMeasurementView.java | 9 ++- .../openscale/gui/views/MeasurementView.java | 4 + .../gui/views/MeasurementViewSettings.java | 8 ++ .../main/res/drawable-hdpi/ic_caliper1.png | Bin 0 -> 1043 bytes .../main/res/drawable-hdpi/ic_caliper2.png | Bin 0 -> 1066 bytes .../main/res/drawable-hdpi/ic_caliper3.png | Bin 0 -> 1069 bytes .../main/res/drawable-hdpi/ic_fat_caliper.png | Bin 0 -> 891 bytes .../main/res/drawable-ldpi/ic_caliper1.png | Bin 0 -> 481 bytes .../main/res/drawable-ldpi/ic_caliper2.png | Bin 0 -> 489 bytes .../main/res/drawable-ldpi/ic_caliper3.png | Bin 0 -> 494 bytes .../main/res/drawable-ldpi/ic_fat_caliper.png | Bin 0 -> 431 bytes .../main/res/drawable-mdpi/ic_caliper1.png | Bin 0 -> 661 bytes .../main/res/drawable-mdpi/ic_caliper2.png | Bin 0 -> 674 bytes .../main/res/drawable-mdpi/ic_caliper3.png | Bin 0 -> 693 bytes .../main/res/drawable-mdpi/ic_fat_caliper.png | Bin 0 -> 580 bytes .../main/res/drawable-xhdpi/ic_caliper1.png | Bin 0 -> 1381 bytes .../main/res/drawable-xhdpi/ic_caliper2.png | Bin 0 -> 1435 bytes .../main/res/drawable-xhdpi/ic_caliper3.png | Bin 0 -> 1431 bytes .../res/drawable-xhdpi/ic_fat_caliper.png | Bin 0 -> 1186 bytes .../main/res/drawable-xxhdpi/ic_caliper1.png | Bin 0 -> 2098 bytes .../main/res/drawable-xxhdpi/ic_caliper2.png | Bin 0 -> 2157 bytes .../main/res/drawable-xxhdpi/ic_caliper3.png | Bin 0 -> 2198 bytes .../res/drawable-xxhdpi/ic_fat_caliper.png | Bin 0 -> 1805 bytes .../main/res/drawable-xxxhdpi/ic_caliper1.png | Bin 0 -> 2837 bytes .../main/res/drawable-xxxhdpi/ic_caliper2.png | Bin 0 -> 2960 bytes .../main/res/drawable-xxxhdpi/ic_caliper3.png | Bin 0 -> 2977 bytes .../res/drawable-xxxhdpi/ic_fat_caliper.png | Bin 0 -> 2414 bytes .../app/src/main/res/values/strings.xml | 7 ++ 35 files changed, 400 insertions(+), 6 deletions(-) create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/views/Caliper1MeasurementView.java create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/views/Caliper2MeasurementView.java create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/views/Caliper3MeasurementView.java create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/views/FatCaliperMeasurementView.java create mode 100644 android_app/app/src/main/res/drawable-hdpi/ic_caliper1.png create mode 100644 android_app/app/src/main/res/drawable-hdpi/ic_caliper2.png create mode 100644 android_app/app/src/main/res/drawable-hdpi/ic_caliper3.png create mode 100644 android_app/app/src/main/res/drawable-hdpi/ic_fat_caliper.png create mode 100644 android_app/app/src/main/res/drawable-ldpi/ic_caliper1.png create mode 100644 android_app/app/src/main/res/drawable-ldpi/ic_caliper2.png create mode 100644 android_app/app/src/main/res/drawable-ldpi/ic_caliper3.png create mode 100644 android_app/app/src/main/res/drawable-ldpi/ic_fat_caliper.png create mode 100644 android_app/app/src/main/res/drawable-mdpi/ic_caliper1.png create mode 100644 android_app/app/src/main/res/drawable-mdpi/ic_caliper2.png create mode 100644 android_app/app/src/main/res/drawable-mdpi/ic_caliper3.png create mode 100644 android_app/app/src/main/res/drawable-mdpi/ic_fat_caliper.png create mode 100644 android_app/app/src/main/res/drawable-xhdpi/ic_caliper1.png create mode 100644 android_app/app/src/main/res/drawable-xhdpi/ic_caliper2.png create mode 100644 android_app/app/src/main/res/drawable-xhdpi/ic_caliper3.png create mode 100644 android_app/app/src/main/res/drawable-xhdpi/ic_fat_caliper.png create mode 100644 android_app/app/src/main/res/drawable-xxhdpi/ic_caliper1.png create mode 100644 android_app/app/src/main/res/drawable-xxhdpi/ic_caliper2.png create mode 100644 android_app/app/src/main/res/drawable-xxhdpi/ic_caliper3.png create mode 100644 android_app/app/src/main/res/drawable-xxhdpi/ic_fat_caliper.png create mode 100644 android_app/app/src/main/res/drawable-xxxhdpi/ic_caliper1.png create mode 100644 android_app/app/src/main/res/drawable-xxxhdpi/ic_caliper2.png create mode 100644 android_app/app/src/main/res/drawable-xxxhdpi/ic_caliper3.png create mode 100644 android_app/app/src/main/res/drawable-xxxhdpi/ic_fat_caliper.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 8042a22f..e752986f 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": "dcde328ede1fdeacf08edfb4d8b834ae", + "identityHash": "fd4198e9af667e65ae56be8e9838d1ca", "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, `lbw` 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, `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, `lbw` 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 )", "fields": [ { "fieldPath": "id", @@ -104,6 +104,24 @@ "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": "comment", "columnName": "comment", @@ -213,7 +231,7 @@ ], "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, \"dcde328ede1fdeacf08edfb4d8b834ae\")" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"fd4198e9af667e65ae56be8e9838d1ca\")" ] } } \ No newline at end of file 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 e0e23ad5..f26cd23c 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 @@ -85,6 +85,9 @@ public abstract class AppDatabase extends RoomDatabase { database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN thigh REAL NOT NULL DEFAULT 0"); database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN biceps REAL NOT NULL DEFAULT 0"); database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN neck REAL NOT NULL DEFAULT 0"); + database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN caliper1 REAL NOT NULL DEFAULT 0"); + database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN caliper2 REAL NOT NULL DEFAULT 0"); + database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN caliper3 REAL NOT NULL DEFAULT 0"); database.setTransactionSuccessful(); } 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 a236ab4c..5ba0d08a 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 @@ -86,6 +86,15 @@ public class ScaleMeasurement implements Cloneable { @ColumnInfo(name = "neck") private float neck; @CsvColumn + @ColumnInfo(name = "caliper1") + private float caliper1; + @CsvColumn + @ColumnInfo(name = "caliper2") + private float caliper2; + @CsvColumn + @ColumnInfo(name = "caliper3") + private float caliper3; + @CsvColumn @ColumnInfo(name = "comment") private String comment; @@ -308,6 +317,30 @@ public class ScaleMeasurement implements Cloneable { this.neck = neck; } + public float getCaliper1() { + return caliper1; + } + + public void setCaliper1(float caliper1) { + this.caliper1 = caliper1; + } + + public float getCaliper2() { + return caliper2; + } + + public void setCaliper2(float caliper2) { + this.caliper2 = caliper2; + } + + public float getCaliper3() { + return caliper3; + } + + public void setCaliper3(float caliper3) { + this.caliper3 = caliper3; + } + public String getComment() { return comment; } @@ -345,14 +378,39 @@ public class ScaleMeasurement implements Cloneable { return waist / hip; } + public float getFatCaliper(ScaleUser scaleUser) { + float fat_caliper; + + float k0, k1, k2, ka; + + float s = caliper1 + caliper2 + caliper3; + + if (scaleUser.getGender().isMale()) { + k0 = 1.10938f; + k1 = 0.0008267f; + k2 = 0.0000016f; + ka = 0.0002574f; + } else { + k0 = 1.0994921f; + k1 = 0.0009929f; + k2 = 0.0000023f; + ka = 0.0001392f; + } + + // calipometrie formula by Jackson, Pollock: Generalized equations for predicting body density of women. In: British Journal of Nutrition. Nr.40, Oktober 1978, S.497–504 + fat_caliper = ((4.95f / (k0 - (k1*s) + (k2 * s*s) - (ka*scaleUser.getAge()))) - 4.5f) * 100.0f; + + return fat_caliper; + } + @Override public String toString() { return String.format( "ID: %d, USER_ID: %d, DATE_TIME: %s, WEIGHT: %.2f, FAT: %.2f, WATER: %.2f, " + "MUSCLE: %.2f, LBM: %.2f, WAIST: %.2f, HIP: %.2f, BONE: %.2f, CHEST: %.2f, " + - "THIGH: %.2f, ARM: %.2f, NECK: %.2f, COMMENT: %s", + "THIGH: %.2f, ARM: %.2f, NECK: %.2f, CALIPER1: %2.f, CALIPER2: %2.f, CALIPER3: %2.f, COMMENT: %s", id, userId, dateTime.toString(), weight, fat, water, - muscle, lbm, waist, hip, bone, chest, thigh, biceps, neck, comment); + muscle, lbm, waist, hip, bone, chest, thigh, biceps, neck, caliper1, caliper2, caliper3, comment); } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/Caliper1MeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/Caliper1MeasurementView.java new file mode 100644 index 00000000..4cfc6990 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/Caliper1MeasurementView.java @@ -0,0 +1,72 @@ +/* Copyright (C) 2018 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 Caliper1MeasurementView extends FloatMeasurementView { + // Don't change key value, it may be stored persistent in preferences + public static final String KEY = "caliper1"; + + public Caliper1MeasurementView(Context context) { + super(context, R.string.label_caliper1_female, R.drawable.ic_caliper1); + + if (getScaleUser().getGender().isMale()) { + setNameView(getResources().getText(R.string.label_caliper1_male)); + } + } + + @Override + public String getKey() { + return KEY; + } + + @Override + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getCaliper1(); + } + + @Override + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + measurement.setCaliper1(value); + } + + @Override + public String getUnit() { + return "mm"; + } + + @Override + protected float getMaxValue() { + return 500; + } + + @Override + public int getColor() { + return Color.parseColor("#ba68c8"); + } + + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return null; + } +} diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/Caliper2MeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/Caliper2MeasurementView.java new file mode 100644 index 00000000..479b9f9f --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/Caliper2MeasurementView.java @@ -0,0 +1,72 @@ +/* Copyright (C) 2018 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 Caliper2MeasurementView extends FloatMeasurementView { + // Don't change key value, it may be stored persistent in preferences + public static final String KEY = "caliper2"; + + public Caliper2MeasurementView(Context context) { + super(context, R.string.label_caliper2_female, R.drawable.ic_caliper2); + + if (getScaleUser().getGender().isMale()) { + setNameView(getResources().getText(R.string.label_caliper2_male)); + } + } + + @Override + public String getKey() { + return KEY; + } + + @Override + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getCaliper2(); + } + + @Override + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + measurement.setCaliper2(value); + } + + @Override + public String getUnit() { + return "mm"; + } + + @Override + protected float getMaxValue() { + return 500; + } + + @Override + public int getColor() { + return Color.parseColor("#ce93d8"); + } + + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return null; + } +} diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/Caliper3MeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/Caliper3MeasurementView.java new file mode 100644 index 00000000..a6919389 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/Caliper3MeasurementView.java @@ -0,0 +1,72 @@ +/* Copyright (C) 2018 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 Caliper3MeasurementView extends FloatMeasurementView { + // Don't change key value, it may be stored persistent in preferences + public static final String KEY = "caliper3"; + + public Caliper3MeasurementView(Context context) { + super(context, R.string.label_caliper3_female, R.drawable.ic_caliper3); + + if (getScaleUser().getGender().isMale()) { + setNameView(getResources().getText(R.string.label_caliper3_male)); + } + } + + @Override + public String getKey() { + return KEY; + } + + @Override + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getCaliper3(); + } + + @Override + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + measurement.setCaliper3(value); + } + + @Override + public String getUnit() { + return "mm"; + } + + @Override + protected float getMaxValue() { + return 500; + } + + @Override + public int getColor() { + return Color.parseColor("#e1bee7"); + } + + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return null; + } +} diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/FatCaliperMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/FatCaliperMeasurementView.java new file mode 100644 index 00000000..c0904527 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/FatCaliperMeasurementView.java @@ -0,0 +1,73 @@ +/* Copyright (C) 2018 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 FatCaliperMeasurementView extends FloatMeasurementView { + // Don't change key value, it may be stored persistent in preferences + public static final String KEY = "fat_caliper"; + + public FatCaliperMeasurementView(Context context) { + super(context, R.string.label_fat_caliper, R.drawable.ic_fat_caliper); + } + + @Override + public String getKey() { + return KEY; + } + + @Override + public boolean isEditable() { + return false; + } + + @Override + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getFatCaliper(getScaleUser()); + } + + @Override + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + + } + + @Override + public String getUnit() { + return "%"; + } + + @Override + protected float getMaxValue() { + return 80; + } + + @Override + public int getColor() { + return Color.parseColor("#f3e5f5"); + } + + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return null; + } +} diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/FloatMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/FloatMeasurementView.java index 48396bd2..6b15a15b 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/FloatMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/FloatMeasurementView.java @@ -68,7 +68,7 @@ public abstract class FloatMeasurementView extends MeasurementView { private float userConvertedWeight; private EvaluationResult evaluationResult; - private final String nameText; + private String nameText; private Button incButton; private Button decButton; @@ -465,6 +465,13 @@ public abstract class FloatMeasurementView extends MeasurementView { } } + @Override + protected void setNameView(CharSequence text) { + super.setNameView(text); + + nameText = text.toString(); + } + @Override public void setExpand(boolean state) { final boolean show = state && isVisible() && evaluationResult != 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 1274926a..bca0785f 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 @@ -120,6 +120,10 @@ public abstract class MeasurementView extends TableLayout { unsorted.add(new ThighMeasurementView(context)); unsorted.add(new BicepsMeasurementView(context)); unsorted.add(new NeckMeasurementView(context)); + unsorted.add(new FatCaliperMeasurementView(context)); + unsorted.add(new Caliper1MeasurementView(context)); + unsorted.add(new Caliper2MeasurementView(context)); + unsorted.add(new Caliper3MeasurementView(context)); unsorted.add(new BMRMeasurementView(context)); unsorted.add(new CommentMeasurementView(context)); 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 fe282e56..5db9c5ed 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 @@ -60,6 +60,9 @@ public class MeasurementViewSettings { case BicepsMeasurementView.KEY: case ThighMeasurementView.KEY: case NeckMeasurementView.KEY: + case Caliper1MeasurementView.KEY: + case Caliper2MeasurementView.KEY: + case Caliper3MeasurementView.KEY: defaultValue = false; break; default: @@ -80,6 +83,11 @@ public class MeasurementViewSettings { public boolean areDependenciesEnabled() { switch (key) { + case FatCaliperMeasurementView.KEY: + return isDependencyEnabled(Caliper1MeasurementView.KEY) + && isDependencyEnabled(Caliper2MeasurementView.KEY) + && isDependencyEnabled(Caliper3MeasurementView.KEY); + case BMIMeasurementView.KEY: case BMRMeasurementView.KEY: return isDependencyEnabled(WeightMeasurementView.KEY); diff --git a/android_app/app/src/main/res/drawable-hdpi/ic_caliper1.png b/android_app/app/src/main/res/drawable-hdpi/ic_caliper1.png new file mode 100644 index 0000000000000000000000000000000000000000..475416db93cd3346f39a7c8fa52611c2eed50f26 GIT binary patch literal 1043 zcmV+u1nm2XP)Ias!|3~vaXLOjEsk$-?o^RE5?^Ixit!IF zn+ihrM*_pR7R#|C&JD!#Ny9?ykDIU0<`?4^4B_UoVJ2IHkhxsn{uH>}lg6(=OGfVhrMC%!#B5GF?I( z<+h)ot-}8j{1$C{#zW}YXnX*##bdGA0J<~VW!Q^eA?tEtf8ZlLEY!LjtE0`{Mr6*G zH0Pl>*MUc+0I%UWA;1@4v(Zm!ESY!-CkVaN2XVf)icAZ(Nm+A5X?>26_QfXeVNZ6x z4G-c`IN1qsOS{wG{6#Z?*8agC6z#Wg=;RmC;t zORwaGD%LnwxYL@@#&$NaFECGNb!+$@GpdYxq_pj5;P?qicTUXaZx=FbFs|P@#%DhLr0qs7cHdy_I34Ya$M*k8=$LriT@YH0Gve=VA&slhj9aBZUMzetP6X|O1Q62SJfSAl z1Uaw5G^{XEZHsYr$+k-n&Azz)VLUIl8C`MxFY%^clyqd4`dE(lGXg_`Xck5Eb0f>k zhA~Ljq&S76uwAN$L?Ttfw8ZGjy%A@|^^@^$oPPyP6*rZmCG$Ig*~LO3`?r-Ym@9}| zUi>~5w5N>j%%(?Ub)SuQq*{4>zPKeW^x+&qsMcmgYrtd6hv&92zG%;2x<$ zQDpZI!^1mso|*s5bI$*qd0QMgv|=Gnz#kYpf^#1-mf{OkV*3`$r;5zc_&Os~w108g zR1kU~5*Wj^Sb^QKZz%qrG%Un$T>OQs|5W^hQQSP4gf>SqzhYKtY%x|(CYhTgf4Ocl z7oG@R*ej5EYl^vm=Ow2-d5XDMCOB&a-{WrdOcj|ne6Ct^Muksz)?^d9U(%eX@jeb@ z#Kwg1KXx+6^x&_!@Qbmp4R5GEv7JKLH$oRaz`2J*=xx=Sb8klCNvxAj?01~mV9qVk zcF-Xz`s!@qchMdD+wmqgU|Q_kklF6VDRt&O4SS@BJ-rz+ol65%vk2Q`Hc3Kh2*f|aC3(OZv-3kUUqn>e}6t-OrCVoQFos(i;8=ezB^{{XnuL~Q^ zu~;hb*40|z2I(koY(S=6h>QyE$@*u;zU|l~g?0Y~bF7y>+w}6_Ea}^BX+Q=pjBwxgu>v1u1V#nXERyJ#QhMo}fN;^y$mX1hT~a-?YSJ6^uQ#snQd518!7${`_w$cmTLVcVkzfT42DPwJB)2Fez&&4(=S6-hFz843+ z!#RRbJ)RM*2*=uM0wvAxpj37Y;;Bf!aDzFxRH(0tbTJ}m**KhM{LLY6`-H6DtPHG@ zO43Gc7cQwa(G|j_uP`1KiuSV1H-j0tQ}q?8B82x=!9B|L6~@;eEkgF~5dMG~JPa~r kbO`>^DFn}MK@Mu-e@vHaomkKUhyVZp07*qoM6N<$f}4u_e*gdg literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-hdpi/ic_caliper3.png b/android_app/app/src/main/res/drawable-hdpi/ic_caliper3.png new file mode 100644 index 0000000000000000000000000000000000000000..b90d910729da4350279c509e6413a0fb6d47f0aa GIT binary patch literal 1069 zcmV+|1k(G7P)i_@SnPCx)dzsCYqYAm=y+HNTij~H$+ikl%Z_} zM&v~l6-5yi2|+&(9AQ<2?2 z4CkDg=bib_ywCH0o;l+jJ9J<+PR3stI)-x}G0wtQC}R5_=Z_Yd3HUZ6Q?>zIH5!B- ziUfvmBNkyt?AsTAj~Hg-KwNxn)_*#F!60rMNkZ!*ncp#~GBy`WMv}}elE2(Ek_*>E z4|WM;-Wp{t;6=%4PaS1077ET<;78nx-q9k{i7(Y^&Y&KYS!4@#Qz96rRsjM$J6 z{wItCnO^LV3%?ZmI`M|u6Wc0;eJk`}6D~L!LT{_pocl8p&tRo=Vt-~pAYK)0}t25hOIIYRNXJDrkv1hhJrd!HQWjlm*m=;NuWR?qll-quR ziB0C8hu@-Ye>;SpkH-Jv_4rvXwht>Z+lAPJEke}g#Qwl%cudH3Iqr!zds>lMAZgB{ zv9AZKBnL0BMsV<6Y*c$n^+JC%|F?O3*6p}&;ydTT-?BBydVMj?tjA7l3!IZ7B>jdT0ZkL`kFjrmh?(q zZpIoX3Og-?GImM}`w}ySQn$c1bTu>Xm%_HE#l%lbx-&iNe?d5{0l}f)!?~4b=Sl_M z%0>$;laBJ{7G%Z?kx}5j%Gf4B#n%caPzdr-#VYBwjjaw&lHTox7G&V^XnRm?#h7D3 zwEIs8mK?LB1E@*PYb5WV(*~itB=M_*o!1aU?ko2@E3lxOYB+91+_ zJA}w8@ONCeM3>=0+ARrSwF2lCBJuFrGliT~2y)&GW3bq8wJqEAncaLrGRi0`^=7+T z#a~|C)GLyXOx75S@Nq_9P!P>BiGH0eHXZLqQUih>ty3E)$48Q7K14e9M#3~tZRTE& zv*Y+2A)E`mhH*_cm7_D8cORyf1EuWWS$SZFaNK$F`&`hTDpq7R{aUO0RJ z2XWvBoF@p?QyJ0n-S?@Zq!}KT%8tEwHj*#hU<$4j>Z>wc98yP{E;Rh+khk4J)^Aq^ z7E2{*tF|3iG@9rd;nG(c9}tT6liDPbqYHPdy&@HYgKrevqZ(}(UVn@evhPIU52(FI nL8gj{g1>YN!Lvgsfg9p~f2?W4?xUJ#00000NkvXXu0mjf9VPI& literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-hdpi/ic_fat_caliper.png b/android_app/app/src/main/res/drawable-hdpi/ic_fat_caliper.png new file mode 100644 index 0000000000000000000000000000000000000000..bf247a63ec5adb160cc3c979a7fb739b28fb162e GIT binary patch literal 891 zcmV->1BCpEP)zw0xdha=Z z*l_k*-?zU1`S!Q|-`cxk>@X2GU>c5MbPU(-7_;#`ig@kEt^Fc18T&Fa<@Fa9^@Gr} zk-#YK!EHDk$Nr4>J;O|#iorKzt)B=k`v^BXR!nY#u{dP(L%sb22wW#F@6 zs<5>Syx(UoV7*kd)BDWDJfT<%{Dft=vR`Bd@SS?i`4?MpQ?Cg&2Jme(+>7&T=BMG)jMVn%Q(~@A*ya3-HU2ZON&3SD z9&1MEX-Qk|XkarDZ)6Lui{pc;Ggzwn1R+zag%Zf;9+Dn?9j=lz=bdJ(<05Zni{B?? zY8(E*6WQE)p-#&CV}f){ZV|(9bT}%AS1U}ySJCH)urmj69V)6HU4hehS(}P}f9Ci= zI}Q=E@OSikNyyyYLZRm8>{S{UcpWYhj-CZ}X!1-OU_T_H!Z1u8s3LFq>XF|7R z;5kWi+UdGe1m(`#$ZrWNFR#bfH`4&2Kjrj~9^=J7TaOaf{H$Udf0S_(eE; zRmPhP+^+h~A-_h1uN&vQb2`Oh9L$KE!mB#yIb(&qS5<@^Ge!6Sb)wf~;D0oF9#-fn RfsFtF002ovPDHLkV1m!{t1bWl literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-ldpi/ic_caliper1.png b/android_app/app/src/main/res/drawable-ldpi/ic_caliper1.png new file mode 100644 index 0000000000000000000000000000000000000000..e4ce43eebc97ecc6dd28bd212543386a62021634 GIT binary patch literal 481 zcmV<70UrK|P)i}4=!lkm=rw-I;HP)%eHexr;HXvZSF!Wh~L+}Y?$+zDvF8=S+h zcHtXVR08#Qh7%dFF*z literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-ldpi/ic_caliper2.png b/android_app/app/src/main/res/drawable-ldpi/ic_caliper2.png new file mode 100644 index 0000000000000000000000000000000000000000..ce7d22f565ad752a86604c2781d17559b2f19788 GIT binary patch literal 489 zcmVDLE;X5&WHIhpNG6TsGAxiCqA8nMNhv9k z8lq$&b}U@VLb0JJnm!iHq{K=I(NGo?a>*r(Yc7j(zIx~FD>M8z?{iM){Qu8$E^nQ` zV=Q)JDQ@Fyt)O9pAUcLcNl=I7csGc=0a$=9n2FIig7HHoX~0A58ERq~UFgS*{~?)@ zBzN!w-I)F_M3-;|6Y&~1l6Yk)ZXT|pu@=cX{6+x6py9n1e(3mSWqAB=g14%_@;sa7~Ou z8LRLa)2faJJiy*kU~?)?N_!(N;t`gm?=<#T6Lz7mhU#KGDcIE~pU2ibZ$f1RCX1!) z5N|FfEy1`v|H|({ycO$0G^iiWiJ2*4g(&Vb(UH~Z-z{p=gDt4XJ#2taSeSurxPp&j z$HrhiUZS-mR*w_7i;-|S)w@MukBb2;Vn^QO0uJCX9^)oji2qR&HmCY2+*cbdSSyzJ fgIJ9oQ9FMCaA00Nk}wAw00000NkvXXu0mjf^v=@a literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-ldpi/ic_caliper3.png b/android_app/app/src/main/res/drawable-ldpi/ic_caliper3.png new file mode 100644 index 0000000000000000000000000000000000000000..b90be305f510b1506d7fd9bbcb58e06dd11dcf2b GIT binary patch literal 494 zcmVYn{>>p`j5gi!By#FDY zl_dA@6Wy3Q8lp=$iy3%>n@PN(5VrzXQCEqi4S&#s<=Bkrc#0orDvKSDzKk7$Iy}cg zbY)_@m{cEL;uqfH92R36J`{;g;0CJFZo=#Q%^kF2HkRTjzGt!BV`(k(2I_u!gX zhaxuO3+9v@wRnUBg}|vZKZ zMWZ;%*6g{2Dy+rieE$}=xl;(9UBtzlq9L7RjSmm2y>gAL~!JU(3W-uz4t51;dX&iS0f zQ*f|aF@`~G;%7BeLk*y5loFtTOZZ$v-5&Mh2hQOb9-^aONHgByZoP$h-NHAVJq+Y@ zg1p8rEaKGvfSzL>C-Dg{QNiV$uNUiRs|LA(T|5;bmvI8ysmtz+_bArzEDveJM@(W) zY-|ken7}=}MPsJsD!$}FkFb$3mJ)bMtp7#ob_7K%iwtjMA${WLiaB^s8mWxyn86Ny z;|b1W%}ruM_wy|#-NqY?<11EizMAnSK8W!0I)XcCq)iO%^D$i_)PdalCX9;pzZbdu zQw!o|vKkhnRz#4^2SJFLFQ(@U;x4}90gl%K_^TDX!jjm;EIR7}5dWigTtf>UW2;^W Z`~gksNZeUk_oDy+002ovPDHLkV1j}#zxMzD literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-mdpi/ic_caliper1.png b/android_app/app/src/main/res/drawable-mdpi/ic_caliper1.png new file mode 100644 index 0000000000000000000000000000000000000000..b6662cf51fc01b6fc5ac52d7b3fa78e1fef239b8 GIT binary patch literal 661 zcmV;G0&4wTcPWi ziP`vwm;d1ZN32A9oUdr;&fr7v0Vh$9D`>%#?n-bRpD--$HQ0sT-4T3&RF<{f5iE~^ zc!p;5=&EzYU)VHan$$5Zc!V!qO;idK@EzCiKq}KmY(TI74cZdhyM+EZzk%^$t(a9Rc%kPDL)DC_C`TVW4JK_kgE<(T z@vp%h+%1*hxHPGgu|n#iAJ`sAnxv22o;x=&Pb%p-C00p87;nkQs&F*q_v3jPOE5mp zGTaE=w_vw2AG|-F;I`i@Ir)Vm3F;*lE6PLA6MOLr>q{gUg@;lHb%uL*jxmMZ zvK(Wu6mLs7RY_C*w`dW&Yq(Ue(`UuWQT#4$zj0$;`SoO3^%*U@bggK4GIg$IJ=S!typZON7l)dyG3=brC5-}5`?+!8I9 z>6nQRc=-?Zzm=6}j8%uq)&%c^_c)0P)Sw;{Tg$<5d_=$4_rOkcYz^@FQd-uu23TIY z;Tf)?T}zEi{^HJdOqMF99*^+3rH+cpNPNXL)JkdkfOY8bzu@hpN_m0qn2iR!4o4TI z^yQ^9PGR1k9IOhUs@N~UCG^DR&|N~;oL#pFtN}BMfj8BBQ&U~VB(y~*JPjt_a0at5 zIAh-fcX6+ngX2=Cj=>74ioRoOIH{6;c4Kbc!dxk(=M)(wm2r7f=Bx}ylDOT;bXl5#BFwJ|`Sc z$(=vLo~GHd97C`KZ;Ci5le#)96L3fxf~Rx3dNI5DOZloU0^AFGBFYA-1Yr=~N$*tL$wwQgGnJN z#SSU0`BCu+TVzIgoA?gHG--$(35S1@?ovbc4e*B%`P=NJA2X_`?4%97&Hw-a07*qo IM6N<$g4obEga7~l literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-mdpi/ic_caliper3.png b/android_app/app/src/main/res/drawable-mdpi/ic_caliper3.png new file mode 100644 index 0000000000000000000000000000000000000000..f69a36815c4047a97add8e9630a60c3e20345ecb GIT binary patch literal 693 zcmV;m0!safP)E z?{|LZoZt8Re9w7?8n}IlWq5*n?-Bn-+lan=o@3=;CZCAMIErSRMK@Xot3Vr`Vsfq< zu^S%^M)Ea+md%5atZWUqjSdVOXzbDj6HWTg4^;)!J9DYn+J4Tn{8uDU2SXwK2Me~)W z>c9fjVI*!Pl9xDv<@lr!--xUDt5$(F(W&#WL8#~ze$FC0#mDX|J(sXbQ2M7Dqhw_s z{-Llp21j!L?|h%ZSD2m8*SL_r7m03TIr(V(i!1)$p+f{!efSPDa5Is1;?qR8Joel7$ds6X#4TGknOILuUpQpDT1%# zH4=|UtDvVxNRZ%uK4#&vkY&Z1^86M!ER-;{l(=3{P-&NI z+Gc{kUklDUtQQjOOJuXs_gg}*IReDLqc>3_TDlVx#1FkQ6Q9GPQt-z(rC)7x6KTCr z;lV_CQm6|tCA;;v`*o~KB-N}QzX)2(qoNBxDU9+V`JRczLJhxX!ME91(U6le`Hj5! b!{VXWL072=GmC)W00000NkvXXu0mjfR2NQa literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-mdpi/ic_fat_caliper.png b/android_app/app/src/main/res/drawable-mdpi/ic_fat_caliper.png new file mode 100644 index 0000000000000000000000000000000000000000..c63d10e19c257fd8fd43fcbe0f20a28a4165f9a7 GIT binary patch literal 580 zcmV-K0=xZ*P)7ztEYv6jL5WWk(F8GZwK#KCmc7|*vOiodXU>^_ z=FI(PZj<`49lP)yAEx0yDGuUyJU`IeNb;5Vh8tLm2l$DuMg=Hg6suz0j()T>f_#ru zmLrWIt3)f_;t`tbb#9u%nbX*UPf|HvVyxakdDwsnJjSq8rcoTn+?kR$OGIGCje=B~k+{h( zT&v>Wjv>6r3s90ebu*4iDk|fIB#a&C#HmQ2yTZQ>19C=5Z#W&RaJU}!vte6~r(qii z+dLHGb`v;INxl%T@m%!|Js*U9*d~?nmQ<=D-o$% Snz5z;0000k{5pQ^*!K79JHT8xX z5#oa}-V%L)2ScL7qz2+G;w6e2H8DK&0ZBB1iN+X>mtbO!Xle_BZKV{&qQGgz)`zvn zy=Knd`^;`ndivm>OmfbiwbuM=&&*nDX2btTL3v1GuDY?24co_>Pe5r$8fc2as3K4+D$J#4!=;2}$OGtm<2i?Znr} zUYRt=ViSBULgp%DL+=4jpEzoM_<)dnCr}q7*8*fFh?6%~6OtbRt}HK|bZ9^}rE%bm z^3q9_=cFP^Dy=fCJdess`9a;Y>7pj@ydu z!~ifSEqS-j*KHs0ATTA6t#!z6kI_2_oas6KHI5Unrgb1G=9`uSu6Fe10=-IR2X^@F z1Kt5P0}lb`CvaGU?YuYKnEy1gzPDl5|E3as96RoxgKYdCumeC`+aK7N?(kTsWR9nC zK*#)_foZDm4B$-)&%hnPR3v_{!`{TcZ2-787-t3Wz3ThQH#4pR-c|pvN0xz$i;<m01bAfm5(w%IYKn?%mF&6yyOuSGsp6jIjw>4zE+(0f0x9+-gjFlQY z^bGf!A8yS5mawk(MFn!G->2*x#4mUFZsMuf74d1NL&yBTNv_AEa0_;osN2#Qohsyp zVixeCl5Y#1)ko;uq~vy+hZ)DKEh&gMVVBuD@tNNr#pq@u^xT?9qcR|E`q!I|m(;^P zB;yrB2Km~k>!eZOBy!AaMrP7HUtR(S^ws?_)Lz)HI^wdXK|OL0IutSB4&+M3;Ca<| zl<|F)yd3*1Y<>07)18SiFfC9Tj3E9c(d)bc_(jR}0+)?}d<*t>hdtP*LF=%6o18!lJ7egVIL!hfG6-PFY1A3kY#D~4+HaE!L5!!8*nzVoH{8aK7iaD_}(}# z!+wLt#unu5HX%F)=An>X5&1G-zImFL6%yvG2+@T3eUq9 zRv@1}qm)k~v*dgE6o*RWoZFRxcn-M1cYp=R)b%0ZaW8TnUN}zTE~X&2(@z0kARB!c n*&hdxk0Kj^ODXYn`lQ6asgOrwr5rM100000NkvXXu0mjf4yuPw literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-xhdpi/ic_caliper2.png b/android_app/app/src/main/res/drawable-xhdpi/ic_caliper2.png new file mode 100644 index 0000000000000000000000000000000000000000..ec1296157b00c5cffb7fafa8379a7f06a3474ae1 GIT binary patch literal 1435 zcmV;M1!Ve(P)993 z#0O(UP2>R{4Dk|^8t+D;Mu|pD3`QQbi8mk;V>DiZK~K??76hSEidI126tMMS?af{@ zXZAj`dzzj;_$QN`Gqcv3fA*ernc46^5>W;$0a}4R;2&T$Frk#B(%>b8xZOH|+7j~e zLLJbHdjWmG-@p|mV^;u`z)wVEzXZkscLF)pzYmyNB94hzPDC;X)TpsJn2Y!x@s%Ni z8cc$ZI%KXv9C{0I`ruLX!zV=KTY>5rxq2WoNSwUUNJPFDm{D3f=`aRy%5VX1m6lF= ztRf=67dWl7bkf0&`HKf@;_?BoQ3a4pJOhf2UwJ1z8at-(ESUTRup^SHAQAWQfY>m2K*U}9RY3# z`WFKSmEOOIU-+Otuodcd1DExe{PbY*(AclQJfK3!)B-y(w^bFej{G+<%X8ia%tdqo zXQw4^*ZI0_2Ob251+v2}@*l?N?E%j6od0@j5pSejKvK*PTNb$1(whM6Rx-_);kN^L z7kCzU2)HPL!y?SZd&7?T&m;SL4QBlxR-%t%#{KgU$NvR00K~N&fsIiXk10y#aGC|^ znEx9vQjMJnyiNWYcr7pjiQmgGo!GZ^0rv&-%mrH1*mu5}aUt-Y`hO#`4QyPFY=z0H z?+e6P8!Xw*z(y9SUdw^8z{S99@~hds!MMg6pkVVnlBzvy6u=r zEySm|_jez#*+K9m%!ksLM8Lk=c_syUfUlMAJux!P$T@ljQexkP)K#J0?GBx#YW$

+CnsM3e#d zBh_VE=&QsYPo3$&`arh}$@Fo$IrZCEq#g5@dQNWRI%Q*nhx{C(BJp?N`~vcumHiV{ zs~z)yB&zFuQHE@v?aIy`l5d~MV|(+37vzPdkzDk^uVfw-(0Vl;9O+T)n88M#sk@v<5_ zKyhCsuf{wJ8()3&>(0a&7#S$(R3El)aqsgnNK^^sb^}-SgM2+^ZrXx*8Z-{ucKuO_ zl*O(yY#VSJ$@iU8F^`cwz!Sum7aF617m#fk>hA+4*@CMqf%(9>$aZQapLiE?bKra9 zT!;AtLmMlRr#lV_*;UBCo`?96{kC@@N7g({LTa5PhYB6%Dg2z=Mh4kxh31HB>&QP3 z8<>lH_H-#9N8Xa}+~Us{{YVmWHfU@{$>CG002ovPDHLkV1ikKrn~?E literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-xhdpi/ic_caliper3.png b/android_app/app/src/main/res/drawable-xhdpi/ic_caliper3.png new file mode 100644 index 0000000000000000000000000000000000000000..3d17d86e6971548117f72dcbd55cd3fe970f379c GIT binary patch literal 1431 zcmV;I1!($-P)Y`oHK1U=jLqdkLTXq=bYcU zcjsT40zVOv{Q{T@ECagL^8>(~9C1v86{5MSWZN~54b9~bkbomvMIv>ypdZv z>9L-O{C?n++|o%0JLaz(t&a0Yz(*nQB2g&p4*X6V0pFtn9rNw>C6c^~a>i~DoC6#o zegI)>2JU2xB`h#weiN_+s0A8u59DLuv|;o&5=(vnOEJk+DcLOG5bi;=A(=QW%8<-` z@z5zpI1%_$k=meS7a}BeE%XWIAbNlmDf%k|S_9jIz}#W62VPZVI*>{;#9ZL7Kz0;Z z5IkQA{G;stMfQacDg$4k?IGZjp^~2$bRIhU6<7omD4lX(59YEe0=AI-Ca&@9w+eF* z?ZBC7$=h|lZY{urz_>tnyhZ-K7`uJI8J_*$U=3nj+5sfR{IE3u*IIVdfxSv+GiLa0 z1>OOk10DiqCvaGSIe2f_G5>jFeQ&_5|HDf3am=`XKCvJ7loiY$dv z_3SfbvsPKUZGn#lqq~XKx~AIZ^A-nGbw`B)l$UpR^z+yR#kouVcQ2K}+;C%HSAMp!wnvW!sFI z)IvOpdwqxT{Ul3&66T~VPa}pJ`n}sBpQd~tCFaga-|h4hRg=EBT-k2(v?)TW*j<6$ zL7*f?_c!Ig)E3%zI~)CZ4`7M1f7e6*IOc?H2hK~-->P&g>||0)lmR=C>M||#YwhvS z?*w|)|Jg|HDR!&Vt$rK9!H)T>JUVybI^|<)3cDGYC%2jyz3ob8plY>a{*Od;y)W{R z<?2*~)yuEmA)kO*5uY3ibjl#2;?gDlNXRZi*7YJ}AK7pF59G+2g&9aa9v2bx#(5gQO>QHDEVaS5+)l3rzCt$oF=T)2 lK|YE+iBz>CdYwKd@gIfHXDU>XoiYFb002ovPDHLkV1l+$r!D{h literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-xhdpi/ic_fat_caliper.png b/android_app/app/src/main/res/drawable-xhdpi/ic_fat_caliper.png new file mode 100644 index 0000000000000000000000000000000000000000..52ee878b680defb2b78119e6bfed98a339e20abe GIT binary patch literal 1186 zcmV;T1YP@yP)SrZn&3k@HkS(@ z^beRYbkvGrwJP}@jH+Wd8`t8u@4_$PUomK#@YBs{c<50Ycan=91n?D z^Vj1>Jc@Pl6L|+`w6I<~w){cdBu#E^G&dbPWygb zJfU2UYoU*%ljy^u66HnKZYI;oE% z+ix`P%;w|!$mh$VfHDygG3&#wQuuL7~TPh^*$n)xdtV zuubBH-pBCB<`zLl^G@m*Q?XL*?Z$2_D?*;M=KqD$3-}BZzKwX%M=En;q#sCp=>;1YNqslUmDE~6DrsqwZwZW zb4}eDWi@|!bKDQ&nJCsK;VsM(WH3v7EACQ#Q%xb({LR8vXa%QXZxr)KwZwPfVI1G$ zS~Z$~U8?~rcuoEu-zU7GiS1Y@Ju9K2_ z=T)3_SeVv9yk{3TupKXSV)1`qlCcIC96p-$5$p5hIyR&6pdhVT;%n9Rz(b0-*{LN3n%LldG9}8 z{*j;5EH5h2#&rr)g`2J|f*fuT`r&DvB=w)izhw;cS(RH`4gdfE07*qoM6N<$g0|`~ AO#lD@ literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-xxhdpi/ic_caliper1.png b/android_app/app/src/main/res/drawable-xxhdpi/ic_caliper1.png new file mode 100644 index 0000000000000000000000000000000000000000..b206daf731837a74c1bb775b3aa0b1b96b6d59de GIT binary patch literal 2098 zcmV-22+jA2P)oalaR;mjxZnaoQUXQFQd-*Qhk2FDIdks*dYi&O znGdgT?wmRE?wK=ZW=>%re38pq0SCGP=L5Y9pKE~kfDKtG)K*Xe+yVRxoE*H<~cq~rP>PiLxMWfK=);-R9nJb*v9!C*gs39 z+6saVUDi%#U6py(M=!u&W@q)iRU)fbG~5yU5_H z1b$HX^1!nNavA9hpe&)Dqmj4LD|b1qkWu&udqVFje7(^9&pdYfgbQ%*f}fEr$b7~j zcLnlh7X{;#0e1jLI{3{c_8d}O^`Z}QB+(}GHqbGqt|h?p4!J9V9x>%QaS*WHG2qX@ zO$8nkJqzEzh;1B@rP=6^n+G09pmPcEfVR3;wX8~XA;1R#lUM*8 zsEjd)_y=B-nt)f3Sk1)Iz-EJgby!2VFkeyPLm&Qu?0zFOTE^}eq%-g!(R^E2st0aI z;;o*@5lGt%o=UQfjYS-r7u%5pyr1PeASIrAfv(E;s}Mgk2RJc6hn0vQ`x|lSAi-mA z-~@sl_wR^-G(Gab$pOzhQ4airZSmV8$QXdzKlyF#-vbkYBSMVPA35M^#eyJ85?}Fz zBCwipyM-5Bkz+_0g;yd+k2r6A32-H_HpDm^k)SqigwE;MexV6*rg6{_cgUYdcDdi&+7FFV;73LHoFqb#UwDlocLy*cp==G4(4GJ6q=N5Igsvrd>S2^3 zw-H%V#lp49m`%t|8w-7aZHmxw2^H-G{GrIbA)(wbn5~SvIF6tk@VO%FofMS3Mv*%| z;F$^}%$Nmy32Zf<|1;#+rNB~U{PUtr0N^r3NFCv}+8~%)eIrtd^}|?2pEw2r*<8%$ zBOOw^BWD>?NE!+BDn;(|A)ZUqKwwvX8;}%CC}_2s;WQhzhuH zjPZFP@`JQCwjj>hi{rrGK$DU4k{9cMTT@c11NLEZMM|>cz#O|TxD7M_2?|ZzgjhQb z9H5L}lalN>Fvl(f-9S0yFly$D-v?e!Q6cSM+nA#KsAw=gmx6Af(b#t%>XGzmn%JiN z%`8o~Cd}i~Rt>QAosqsODuUL_fru=Zc+msr|2@(%i!wgnHxh{4duX0 z^lX4h6GO`E=%JC=2J(Kdm6W`=PtjwKV0f~^umSN&Nl=R9U9|kQi+&?`Ne_-7FAsd@ zBdZ)KHktH9VThx?3?mVr*d_J> z3is8_G*F4&8#%*dtTh-GMI7izq$@0_0{SWLLR?R5KafZMUq>;nDwHD!ZgafVDE*J- zG5__DgH$3Z&!E2NWx%;1lq6Jk6H4{z$`?IZgwPJFtIYThY(|?2mMGn1z0m z{zi&*QSv)89I|Q%nZWWv2~zT|bBr;;_23%{^X&>>MRGq9v(y?)tMheONNzh6stEQe8huP~ zi%Jq4hHM&X8m0;PK_l1T2jgzzHE9WOcI4^C$58YJ^{9q3iRz~iv&iY%&dZVON_`6h)gW(8b(}$pgbE~0(GUBk&N`%ftQz^T c_n}z$4*=F2k6_x2y#N3J07*qoM6N<$g7o6oKL7v# literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-xxhdpi/ic_caliper2.png b/android_app/app/src/main/res/drawable-xxhdpi/ic_caliper2.png new file mode 100644 index 0000000000000000000000000000000000000000..bfa069e3211ea8deba4e98c21c22f7a19e01fa83 GIT binary patch literal 2157 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 Y7az-G6F3mCH~;_u07*qoM6N<$g5Sp>cK`qY literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-xxhdpi/ic_fat_caliper.png b/android_app/app/src/main/res/drawable-xxhdpi/ic_fat_caliper.png new file mode 100644 index 0000000000000000000000000000000000000000..72ede5160d3a9f138a46b83678fc712fee741dfb GIT binary patch literal 1805 zcmV+o2lDudP)^RQ5m$D@;l;4GJXEGBm}g zjJ{MvSXxG}4_Q%U_Ry%%tiTj8C3{F2G^IUE(eaUHFRF1WU!$YrsHYF>UOltV+UMMR z&+9VRKdcYVU3U_#%_G0Ty%xt_S*N|J?{I1O7?Npi)5vFdf(fI0m%< zF9WBfW?jn20E_Vk#-z1CZAvz#iaQAoPL8$$XQX3hI_M4jNB#kFfS)L%Aiae*0PBE3 zz@@+f<#Pw92l}L7Z=x81*YQKZg)W{9@RGvU?w_P8U=v=apI3M@z#N7505CKGTT{W4 zcpcsbbh7YgfSE4dCSXYXW~PGyNN!^W=(>P)xgfRc;ADUmc!RSj&-EREOX4xDG;jyr z;OwMK6F?KToadf2jVdL~#T%SDqv3``TZlYa@L1(=6q*=2zmU zc%L!|)Eju6KdAi8Mu&i>kQ1=oVF+-PwhkWw1|v__aK!n|1P5vh@s>0aPf{y^4R{@W zP2sIUYRo}FItn}-gRM6KKOk42#PB#?2me6&U2fE(7tH+V1MKypLNNh2oRyncW%3-L z8LwkE8+bI}QEmnalA#VHEam z$LEAgGT*ky-ITR07K~FA9stg^@S8z;2kEZ5(GR(jXwJMx@$K`9tUgWdW}sJ*a;@kN zG*}dF0PfB5n5YFdBF>t@0eLlBEpi=TMhKfLfcX}=Ul8%^!fcBo^J$ui_r&Od9-J}w z2Pa3PLfBmaylas=I)vOdxC+T}@;!-~klVfAAi@Z|o2ZR;5bl+zK%QVz?vfBPkKrU> zy&^mx+5%i@k=qUU+Td>n#sa@6vKEK*qYCd{*AP-B08{ZA`xh_}c$DBgrxodsX|Gr} zq#T=jJx6B$J_x;KbW2EImKgF5hLlHt^qgm`!FM&VT;X%mhd>uaM^~gpWcJG*Q)JXr z{I%f%V7DP}dy%q^;bX0Q4fh zgN(jtITJ|f<0H$u9Nplfw-UG?nRoP)@j?NQuc?E)ij@X`Cm(({ zX)Wvyz<6X|@mu>Z@Bq-UKwpkwFy5T!2$BmG16vN_AW5Ygvn+fjwE(BO){Vq|G0ssl z@C+d@!Bt4^VhW!XMkw;XYfJejx%jGq?~Kn^Al(sj-8kg*TxF4)qk~9bdWQ4?fQJ+X z4cPaKLQn~OsmR|=+cCR7$VTiSIZ{`oda2oERy0joO4~`cQ0NEjSCov4N&#}a*Dkzs z6~6gMA_=lz>{8a*Xch8wMGEcY_%v!INUhr3#fcBE_)OL4v@dd@H<4rN)?Sac4}eqMnjo4+bNZrTOhhc{h_ z6t60Z>*H1mJgDeh1`GqfQ9g6iA>b7fn4unq-rKr7ZpFydN1@aAhmq^UnF-iO6?#)o z>utq_8H#=zEg<1m^%TX3Mx;EN1iGUSj+?X||GQT#I1jyterp1{yCIqFK1IKqwjw7} z;$I5PAQgRWgNzfE$dMg%%WgnUutG1!kzu@I)IRLJt+2=-Pl9&GbJJcVfLhftG1zjR zsWIsr27IgNb5kqwO`pgcdBs566xR}>He$g*{KxVfB)wRG?1v=*+dR(|5$foNI33hO zTN$z5(6G((%!x>TFZ}DjIa-Gdo0lA>p`R9E>pY#1jdiCY-%WoaO@Na8IzkWh4#T7n zGBZfdv`vxgrv1Rv9Ixw?B&MV90mUX@!-4M=ndZqf8|g`vJj_Pk5sJIh3?#pf!(!n4 z&{ii1vs77E;QGGEAX3oDR7dfhk5plfm@Le5T~FXeg6Ez$0XIf#a zoO))XUptv56Md4II2Pe`Zkoc^5x5I++%GVDfJbOYztS=qJwdq`|%#u3@&00000NkvXXu0mjfl>AGP literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-xxxhdpi/ic_caliper1.png b/android_app/app/src/main/res/drawable-xxxhdpi/ic_caliper1.png new file mode 100644 index 0000000000000000000000000000000000000000..e896cb64a915bf0c68c176fd626d920ea738f924 GIT binary patch literal 2837 zcmV+w3+nWVP)Q`q|FkdyP+V0iSDwy{AS<&IQz1% z56?Nzz0Z4}_g!Az@64ImdG@*YocrUw_uO;NJrC4SLk$N%#saqj{|5SiJkSF?0elr` zuAFGqjRxR$U? z>>=F%?@b;8p5dx3GD^|b=+ zz?TEcShdJun;ULSS+BKU)KG*g&^!NM!0^h6R{gMa{(Zo^D<|5afqT$r|4%9?*CBxq zqj&x$V07g~tA32cKDl08G06@Q%*VE1){r6Ij;{0X0LE8NwCcw&;BV-&|E9``c4**o z^v+*T&19S@+R%0W0&NBsBZjw{78DqZu{%FXeZUf6Dz#9Pk}(bF$8P|N=^0=SaCEr^ zuLdOP{Jy`6`M}}jY{0>eZxW{Si|Iw+v(#LSiFgZoNZ~HvN5E=eyYfyFt-#+`aL6DB zJc8bNUn_cdI1=q}3-FXtCXTv*OR{c^f*eCQ#TR`5UkYPNQX%*9nsY7688o z8q3Jn32n&CjO(a=;QdOuCM1R@?cVS#Ffoe;MKBEbc@f{046#_$CFq^>Go?%u@Q_i? zm9_$Bg>TY+3`5!wjaLEdB1s}POCHe(D$3P7zcDD@U6&lWa<2Q;A&+3w9tqIVHL`31Wq#EAB)5d zS)K8}0og+0Bw#}V-}@+|4J!vcoFGshcmdJ%#~5`rAc3?SusgpHeC4t+uOa-598dBf zTpyUHic1p&iPA2_I(mvyUp+FrH5>>0$CKyXDcfctX%M<8g8{J_`I-B4MuGMr;piuL z@M{CsrsQ`;+C~~k8idSaQx_S`U1=v`ns7N$UY}4`kMY0Vz%_`&=Yxn^+m^cJgLpHd zV#o1JQa(z;R7$h+N2wjRXt+C+@_z>=k$ht&O51?PfbRew1rAHm7hh89-k72;Cp2O& z1y=&+155FT^_tN>P42u=^p)Yrc&1qk2<_CPhprx^x)zS zJQDfo`>fr|fj1cZbHEQ7Y-FfkVU(T(E+Sc_yhbUX$uD3cww-^nQZ5I49Q(8!U6PJh z>Y9Pf`m8!WN{<8YiIHO%q6KP-Nbo%%2mHkl^fre&>VYo+uNn0eXcMnjSDS&~I+V+b z7Bjd_p5 zuhm-W;_wVIdE$N%#ppsbq+m$W`OnddnwUwlNuig)G&M=I1=%0YC*JxR#W*A&_?INd zF8R>aX*$C~u@fRnOG>PJ66p_E1$qMM^irJlBM_@?sr$>l1hxg8g|73zhAbzg;waL& zBRheQ1>j$dI^^X1il;2=5g&Du;n53?*tVC?1?1I$tn;o7UO=`9IgSAyaFF9w#O#oX zfA}VY@oEB(HZlmy4W4;qqfgqrLt-{!yVB%YLHK?EBrAz_(AkY>Jy~FZ!ZVL-l&5FJ z*TN^Ta~NF}nqdz3tHJQr&9p0F!Fv=r&d(s%KT=2NT zcV+$dTM&o8c7C}zg^YFRE5jZFU9+;{ z`LpmY74Wdaa}#3JbHNvtIzkNqh@V;88yBXmb3djl6&KX4V@qYAV6wsYGLL#@8})=5 z0MIkM^imWi>8lzwAyLa3Za|LuS>RL3^9_i7eyHIN#3~%cNF=Wv;6DI!(bup?fxA5G z^MMx4wh&QyeXtdYGrbM*a=o(zxioA>BKqPmBTa>q(LGALfs@lz>WE{|)w>ft>xw%W zw<>ktoKD>R(3FO)c-o|r^7hOxQP3o4`Qp|Fsz0j%XhL_nP6GEOXcqbbrxQ``x5UAD09ud?l>?d`eOHLBT|-B!Z*TC*B}W6@10v5_K+l$Y~JG(y&> zLlSMgV8{`rGXwC=Y5=saee6G+6{r54hJ+Tzp&N67!BzqjPU!YzjzNp|seG~e?J&l`+ zob>>-0WT|Mw-9rBzuS1(HPXOB9WuyC7nh?mdLi*^`&~x4MFHe31@+j$YO!DK&~h7u z$W;3g+;6NG=zjFmBgk3B`as)v1IV2Q_1J;B|3q;^YRQvgPil^MFZN7`qt(Fs9P78D z^72S@S~>HHHe!G8U@u0zs&>qul0uM4_}|f5i-c+Tc34uf*Lx{XnzA;MC)-@Bf=;E7 z&lQ?BWX<;Z!s$!E=Si>P9)^5J#^TXIn3J-GPm+8|;{g&TmzE4^4ar&mMg!l#{eD&+ zIZ4hVOoozH+^)6WL)g^!r()j*Ezl|)G&Ac|ZghpgX_qn388@U`8I&^U?Zg;l! zB6ro!Cfz-;Mnr{m&0Y5>j!WRt*tf~oB1WatkX#K{;g@c>ABhl~kfPD9Xht@1pXF}} zV&9rVywiUS;uF6P(ae0#FU#<}8a2ywyjL5-GpT5@%nE5YHhtn@Z>OAC07!36UKoiMkMDW{@<+C*z;) zE06dK=2BjFr3+dRAA|3GUKe^EiHi!J0dW-Y1KeiM4&>;sMXn7Mj6yEZEyvFa8>K#E zUptRLcYdvhMkU&i}OspXeZ56IRXYgk|%00>eD{wE)Y3 zF9p=GYLUZsH{6txueDy(P=rg-JOAH6-^!_0{jhBQJ;3`br`mym`_bS2A5~DV0|FmK z@BDSZz{;ss{TP6~bDdZ*%?=Pu$M#^>kRjfUZu4&gMpRC<>PH{oZ|HCT&6QK_z`!Nw zo!>#tWt=Hm(QW<$y$sAk9B(x%C@^MWcYc(*fH}ZeYM~}2V;s~%Q z8jxi3`+gPEfwz?N0p9GmoiLqWOfLeTqjtoYh-1-13U>fM1eO9@m3xwC5&mZd2Mlt+ zqv)M?OVPc3k!Xjn0Z$oi;%F0aQPvNmAjf_j@^UeHr>#P_`TJoHoJR8~?;%VMm;wA2 zXegsxC$u7OW?V;g10Pn}H6k%QY1fA5fKgdIPy~H|pBBk|jQuPYbq;zb{X}Wg2rM+( zxzYyUwD6Dg2Kpe+5S6>%1O%UsZu4&d2FJAN3;a@PQ=oOg80^6<&{pKUAvAKp_YAoU zsIWVw0ogQZ3SOeLYXp90w0n`grE_YXzl zhOEx`Uyp7faSX5~LGDA8(T9}-7AGi_2Ua7t{t$y#KO~TL4R+@jg0EZ_<`sm0BS(-t z2sZ?lsbX@1B2n6bct=lA_|+qCw}!)k|9Hxro$}c%Bn`r5%HTk3Mm}?&&M43xBpm%n z4|%P?%9QdhP5Y1rk_I93*wmSZa97%nxF%e7ls6>s+G6}~CvX*V;ByvY*0!d8@?N|h zF|p%hCK(?kVJxNj`J=QPw`jQUDDD3aj3zl_CQ7dZ%YbhK9|sOf(HB=Myw|4S<%9<8 zso*l;JYX(<-p*afTW(npIpEGnyH&_WXorU^jXII3@eGgtI91`b&4Y&*rYQpRh#g$q zfd?a>zR%pf0C<}rKL`AP-iHkJ6-Mbv;6jp3%Bz(2nS24Gu>JhUDeZE=C$V?S(J5)T z!s}e*tp5$}DCVi*z-d>_fN zOFndEn$ECLd zk?p`I0?02$9kO$N)l-)a+r@TMNl58+mps=<$}iz zxsx)I=>sd=@@Juh3`Tdcc9UJ`$43;IdBhBMK@KT@@I}P7UxpmwcOg^A2E@%V8?pa= z7x6munPC@!(yXj_{wz+H3RtYjT!%RIk}$sKURNtBk0gfpF6hUiuZ{P3^4bSy7|L!0 z4l7lFg5wOiQyh6rHFzYEZ*dQ;!b>M5gh@7HA83TM`J?!TB6BtFL9nF^z;0yfazzXJ zS1{Rw&tAC2Q1CBgWb5|eX+^G2#gyU!DENdX0PjLlWIv7g_(LtC+Eo3ZCm%qj0PRF+ zCvbckrj9ri-Ml->gU?jNk24YdtLcLt3fbYQw`MeKz|$v{RJUikr((X)>cy?}#`CYJB(P2ymvc?iW{VXP(m8X?pxR(TmjfmG#!%fI8u^iC+=sN<-IScp= z`%XV?$Zohh1y60^ZUB1#zJeZsybMVrEf>0!>mf_fUyc;>jye(Bkj$P}Qu5Uj$G3n! z03(o}{D{LIIBy}h~w{@VJv1>#rw9Fl0JrPAC9 z{G$Yg(qOZ4z0~B2CZssvIWhlRh#azLgYOE>-d9apD~Gq8?EL(3I2hUFX*=+FCGb81 zsXZFU_in<~B-LCf%!_ZwQ zu@>Y^<>ovRjgU3!kU|@)4LzcCs;7+c#0PP0MPgG!Li@FkH#TR*pV>Ghv@i~v5i21} zoDX~zJ$P5c6eJtn1s4FnApWbFk4#HfC-Arr*#o)YV&(cDqZj&NC$)wAETcF9sj1-l z#z$!z?wKsNl^~};t_%Mu29JGml&>>xeu`|0WDi58JS(0iZjO$-{#{3z^K&Uyxk$?u;fwx= zTiGS+O8*N_deUW*(K5-33bRICnYXN-{^aY zpWE*>+RY50Zz-t94pxgj*w<eG2AoO3-mDdY0)6;A85NPfZl0Pj~%G{Pn2Uw zt$0%GPR$V?#C{XvXesa^NB&k+ULJ`~D`!2?2JGKE*o_gds%`Vr_}WL~pQE)BIiBCUEq#9?b~b2%mf+yLw0@~*Ch>#N zfUM{~DLOlmK&a56i$ihC+1icds+~@{Jh2AEkK|gr?yopbfrnscldnXaN+%(;8m_>v z+;BG%=rl6LL%X6GS;T#&zd4A1YYg!R-+ErucaL%YEgM^MV^G?{TFI1|w$-zWKZ^^a4@^C3pqICL}_@Si~ zJkKe}>Dx%8F5LinpRrJTq7AVEmm_B7lgL6_Lk%?q!T$k&Zb4}TlQ6IV0000Re9KM%{YyFg;N;<5;0A&8k%>7-<$yo^(nrli?u z66y4!jan+9j7e!FW@DB`Wp7ByD4}Uu;6$mU_)<~I?1l&%0-~7U^8T{O(;sIaclr4{ z=XdY#xxeSZhvz$UW|-yPd(M6N-Fxmi=bi_usG^FuKL!Ig0!x8yKpxlvJOfMx8p|hI zWuq5x3$POzbd5FxUjuUG5wkMU04%~D_$b{A)R#lpO2l{Z8~g$-0{WIg-ipHefezA5 zKpuDu=u>j3D+D#j;hJ{v3-o7X8>_+-pGP0m{{j<%;lO0z6{Bn(cn~?rt8m01U=#6! zxd%8QQvPt@1*Lp}9;SLQJL9+L1Nl>>&QM^LQ7;eNk8EvK7&rrc0M`Ns8FiDsgsU@? zx; ztXSl*%?;P3Y}Yz3s_2GG&h;A!;Le|`BxJ1}rD`rxmk zYBJ6g&FDIRfnEV-BZjxC78Dq>u?Ig&+kiR17^-<@6pzChK*n24j%Lkf2RKLHj4+m$j&v=Dz^!2yFD@F@D= z-O#OUPbAvmo4~V1oj7U-F3h?!3UchnAupdpAGGD@I)5+hiPLBvrFFvOfSJG_fw~g% zbwV?;GUEnnFK~)duO5lvNqaWD0F20@LlN`6c2KdSHQ3&y_X+ zr-kp*o9Kb`AVZEQ^zSYl2@tdRE})E)@NGk|g$Z?Qk;fI$ zdTqcFG36UO+q4E_8~S;Z7DIrQ34F`49a%bm9=IIYKP}WDL0E-4Yk{MT@`I7MA!{)H z*C|^_90jaN;Cmk>v|;6dM-l|e1FI2Te~{5uFC>t54ffy{g0EZ-=2pV5$YCT;!Zm?; zs+gQ0NR)OV*3sjX_G*#UtzjVWA5WflrRou z>a!a7C_M$76eC9uL<`guk>F=Q4*07f=(il&s0F?Zyl%8ppmpr4t~LU{cc_;Y&8F*& z_!yEr#43Mf=-b$55zQwKD}ndozV9_5d--_@8m@x*-*-O-L{NWqY#^PjF)H8F`~lfqWI($pl;dgOdKn|SMM6hn}J;5$iF4PEDd9obHbMSs${Bin#a z2H@WvHOS5RHBVVqAwKFP!=o4Kux&4249Ke&vd_DAcqZ8<qdXkgO!yMQ1mn^<;sW3eP-pP>#xouZ2%x z=PpcyzHxD|PGwj5cV9muxXj#x||M$F*8?~!ZJ zcZLoEJ+rdn`LpmY74V3{a~)#Tb3sxTtvGrdzkxd%{cOC$qn%icHw4`X99Ap?1;-eC zFY;(7%>?9;P?v!oe6$QNTPY$;vL4%^5mM)m;yVh@)%XR$rk#L1k|fp@P3T|2WRG_C z!3~CRkCTzE+ll8CzP=e#T9KgHYZ24LDae*_Eb?{Vgl>sl?8!^ps_*q|2aqj5^C<1^ z>_ApH6kWYLG6R026<$j`+tHMU4S3q5lJfS<@D$7!TE4ht8SxvT@bf)D>(O1VBYhgW zNNFUG*!iN{lnkBAozUX?TZ(LV z1zo|i^@zna&P==n_za?e_@b5gK;RMJHUYPE3KoaC$b}_qX!-x!ifs3AYzyUfwP=o?Jotir>C1U=Gza?wkdxvHU)h>vgg+z&i9j$8|?O&vV#%( zkuS8bcZ*eN82T+PE=hLQ(7a$S8FSO%MC5K0<=26KMDw(mcHUIoHBN63f3FmHnOwx$KhaPrD!+sc^UG)RpEKQ zXFHk+Wn5h0{z%-6HUXid3pCUsQ3pwn?KY5|{plfv=LC;74nsGg#72tDQVQpheK>2> zAc;0s8*)VHRFC$5gJ?8Kn1Jr~^tladzxL4@S9qLKIFIQ3X;d&DoQwOruI_ZF2am!t z(l#XC{~RPy;85f|ITKlgdlX(vJ^Qp+Y3KH6!Cu&%pW?~b2gf1iVc&r-&<@;RvLwCZ zO(LJ|=VYUux0oiT7=@oDne;_Xm3CGTu{ZTa53$>W zzuJ|Afru3|PS4h86|zPBLizs=-~$f4UEdybrxwJn?}H1B_TKVyDOS43VvJBxG$5)^4@qU;>X^NOkz6{QnLW@jE%xSh_)GcRgrN$ zF}L@-jKZ#w1{P|NNltpW99_|O5Wlzo+^9DzfV{<^7CTri_E$T!+y)^s)t-sJW^+Hb zx2Qk1WBmsK_FXrqPQWo8QAc&xZ@-2cJ%u3?)stsg`#W zHue4S*snngv-SA!{=iBfUopwbdy4^+F{^lU>kw+8n^dE%y#IHg$ zGoSm*JUl~nrh7E*Lvw-m_y|%28jy1+i+;FL2Qrr4Ch|UrjUtpFEl4z5IWQ61r;!yc zN7V1sI1-7oFGh$Jh|Q+lIsN+~=H?LDQIe<~F=hryQ+zD`>Av!a&vqK6byvDz0Pqd` z-}AcAi%48l@C=B3fgj5$MgYwN(s8E*cYn z57M=|Uqzw@9z?X8_7H-U5DiFwPDVoRha(=bK6Lf5kb7b!q6M}fYUL8-psk{cDuUqu XiZM)K%DuK&wm(rRe9c{$Eh~v$oM(BB5zaL>C6QiMLn0gD3Kem4bqONVRFmH#`3e*Ba0on*x?dz_-zr{|}%eKheq$%jVw!9Fd=B!vnuUfBSFGQLbTulhKvG z3fL__(aMie*eBPo%}xTq^Xev{|{-otGI8tFg4EMU*91up}- zfu+P(ej}{|E}>eUobY3kQGO$>1!hn=>OwIUJ*03Oa4WD7*rGfWMlS$|WHy=>Lk)Ne zU3phDJllapJ6r+0WV8vQtw>C09vgLy0*AbO6J2Rb(QW=t?1|IpQDFB}MiPt~a0~DV z(3K(INC>m}dz5w~knoYXd&3f7N*V+5p$5!m@Z=Y267EA+(j28tH}IIzE-GyVPDo)) z9@>yG`1uwlAb1+O&A%2H8_=c$__fl;qgBAs*putg7UaGmY1Dw54ZeRMXLm{$vJ7Yf zo}sksMm}S$-5U&ETBZYU8qa&1^YMv|OfU`!5VQC`Mvjy414FQAQ`4h)qn*d0@V?3=PV?SQ$r_W3B8W3d@uMa%Er8iIWVG4pRCXfxO)sJ_Nkt$a8+ou~`V4gbl!$6!;FpUceedh_H#c3%Ah2@xbDk{LYR& zN*!U7ka}$DT!VR3>I1GM+OhuPkiIq=ziq)@*5cv-#KaEb`9uo*-p6q?=jZp+-++T7 z@V#DX|5s#hc+TMQBtHM&Z?$0xtkAR~XhAYV+?7oCW;bXyc~`u+vOyz)b_sE@WsV-HAru zuaUf+K11P^$`>#N+t2?IrCkT&C0(Yp_0x;kCTk5DxE6|jx6yY}n`1j-1!{&!;(I_1 zSx2>jT^XT|5y%p?-ss1pRlp}=%4)@*uBQ1M;**i$A(s4!TR~P1?;_kTD8>>kT4FQs zX-7GG*jZIYqjMem^e~NRiR5pSaFB7B%^%kd{6)gQhBfF*n;)M-s;7i0Xer_Dkw#2K zjEbn1-}w%GN5WkOv-_Itdn&dkwT?LE!u&c>mG9BC2(pbw@)cZaSIi?}bN5*EnO}$4 z-_2qVB&*#T*b?9aN_$u3*MXlI^6Um&Mfg(INWH+%nN9D z2=2FC^jFMmBQmf~JnRxBYD%GM=Ar{C3Jf zA8p9n+Z)2Wk+vZD4ygqM9EhCef|$QcdT}`;k(xi+z_&59a7QPD?-M+_8Cj2mvgqr; z9mv7WB_zgkBwFW`rcnd_WC(Fhn#_?k*sA~VcZS9Tbs{Bdyk};!b2Ge3>1T(*BZwX* zn$N0fSn>Re$tD!zVC-A3pgIukz%P-o$VMDv^b>`iB>th$8Do&^JWZJCSqXxD_*+k~ z1=h(>GjJqsjzN!>AZL|KD>4SfzIb$hmVyjmo*~cN2<=B9k=5FM7DR6%nfxP?8%8vI z#t`ZqVDGF28sNE3k*Oa&xvv{3?5bUuXk(l~PH~^z*c)GxHoq$_Fyxx;d$t|;7Lwc% zRq=g@Nx4VL<1jG`UBKr_-sX2fC;EYK6FV=!k3}wMqALD9WLZt)y3z@g(bvfBNL`=2 z@l|w1-bwfY&QA+~Pi8s-1z~l2uFg-iLFmA3S<&cO;HZpcH*q?;u*)b`0o1U_2#a1t z>dzIb$oHPuHveby6D<%EaX-Dj16)W!lfmyn7d*)Gm>0SblhP#+Y{NjC!q$D` z{8D4V%Hdtk&^yvJu`9A!hGn|=jf0CamNPMo#r6!In2{WDOiIsL*3wl|=AsYq!3_A< zkm%%ILk>UnBg>POHPaI4K_BFLB=sjvOvBBjtRow8CikytBh2QXnIi8)aW^Snq{S?o zFkFaj#-&kvX95!P;S$of5(x$R!4#)l zZX`^^C8TdFa2*+>bLNR(5Ip$RBok8C27CkiKVbZ{0||`XHv#^Ihn5nQM5Wr3fPX6e zYxFo$!g$y~OMcJ_Cq=;#xL39+on;dhn$zv*7=2AaG8kQ)Wy^stQ?P5mEU}zm#ki!< z#K{s_LyiGXMS>Qp5hbZEPL{~#fi~4Y84bYtr=qz8PlA^v;^HjZjvTzkr#6xn#Te|M z)Wt{y^5MwldLC}hvO4e^^zt(muuBUxLr;+WNxGC6gDVdFZWeP0-P?PzyVIJgweoH(GO^i)Cb&1!2_IH6%&zrf&~n=^H(G3o@bJ6 gLF@_@DwGcY2LVUev%vK^5dZ)H07*qoM6N<$f<;Aw0{{R3 literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/values/strings.xml b/android_app/app/src/main/res/values/strings.xml index 8354b035..3b113cc3 100644 --- a/android_app/app/src/main/res/values/strings.xml +++ b/android_app/app/src/main/res/values/strings.xml @@ -227,4 +227,11 @@ Thigh circumference Biceps circumference Neck circumference + Body fat caliper + Chest skinfold + Abdominal skinfold + Thigh skinfold + Triceps skinfold + Abdominal skinfold + Hip skinfold From d8c052a63b0533364c3914a3e82d4ad299c11c73 Mon Sep 17 00:00:00 2001 From: OliE Date: Sun, 13 May 2018 15:26:03 +0200 Subject: [PATCH 4/8] enabled evaluation of fat caliper measurement and enabled percent option --- .../gui/views/FatCaliperMeasurementView.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/FatCaliperMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/FatCaliperMeasurementView.java index c0904527..272c9266 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/FatCaliperMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/FatCaliperMeasurementView.java @@ -41,6 +41,11 @@ public class FatCaliperMeasurementView extends FloatMeasurementView { return false; } + @Override + protected boolean supportsPercentageToAbsoluteWeightConversion() { + return true; + } + @Override protected float getMeasurementValue(ScaleMeasurement measurement) { return measurement.getFatCaliper(getScaleUser()); @@ -53,12 +58,16 @@ public class FatCaliperMeasurementView extends FloatMeasurementView { @Override public String getUnit() { + if (shouldConvertPercentageToAbsoluteWeight()) { + return getScaleUser().getScaleUnit().toString(); + } + return "%"; } @Override protected float getMaxValue() { - return 80; + return maybeConvertPercentageToAbsoluteWeight(80); } @Override @@ -68,6 +77,6 @@ public class FatCaliperMeasurementView extends FloatMeasurementView { @Override protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { - return null; + return evalSheet.evaluateBodyFat(value); } } From a3f642d3955a06ea81a9d7298a0d44840cc4e545 Mon Sep 17 00:00:00 2001 From: OliE Date: Sun, 13 May 2018 15:44:05 +0200 Subject: [PATCH 5/8] initialize all caliper values to 0. --- .../com/health/openscale/core/datatypes/ScaleMeasurement.java | 3 +++ 1 file changed, 3 insertions(+) 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 5ba0d08a..2664fec9 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 @@ -115,6 +115,9 @@ public class ScaleMeasurement implements Cloneable { thigh = 0.0f; biceps = 0.0f; neck = 0.0f; + caliper1 = 0.0f; + caliper2 = 0.0f; + caliper3 = 0.0f; comment = ""; } From 69a652ef516ab64efc24ad122086d123856e7cf5 Mon Sep 17 00:00:00 2001 From: OliE Date: Sun, 13 May 2018 19:37:33 +0200 Subject: [PATCH 6/8] added visceral fat measurement and revert AppDatabase version 2 json file --- .../2.json | 12 +-- .../3.json | 12 ++- .../core/bluetooth/BluetoothDigooDGSO38H.java | 8 +- .../bluetooth/BluetoothExcelvanCF369BLE.java | 1 + .../openscale/core/database/AppDatabase.java | 1 + .../core/datatypes/ScaleMeasurement.java | 11 +++ .../openscale/gui/views/MeasurementView.java | 1 + .../gui/views/MeasurementViewSettings.java | 1 + .../gui/views/VisceralFatMeasurementView.java | 77 ++++++++++++++++++ .../res/drawable-hdpi/ic_visceral_fat.png | Bin 0 -> 795 bytes .../res/drawable-ldpi/ic_visceral_fat.png | Bin 0 -> 405 bytes .../res/drawable-mdpi/ic_visceral_fat.png | Bin 0 -> 524 bytes .../res/drawable-xhdpi/ic_visceral_fat.png | Bin 0 -> 1173 bytes .../res/drawable-xxhdpi/ic_visceral_fat.png | Bin 0 -> 1665 bytes .../res/drawable-xxxhdpi/ic_visceral_fat.png | Bin 0 -> 2092 bytes .../app/src/main/res/values/strings.xml | 1 + 16 files changed, 109 insertions(+), 16 deletions(-) create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/views/VisceralFatMeasurementView.java create mode 100644 android_app/app/src/main/res/drawable-hdpi/ic_visceral_fat.png create mode 100644 android_app/app/src/main/res/drawable-ldpi/ic_visceral_fat.png create mode 100644 android_app/app/src/main/res/drawable-mdpi/ic_visceral_fat.png create mode 100644 android_app/app/src/main/res/drawable-xhdpi/ic_visceral_fat.png create mode 100644 android_app/app/src/main/res/drawable-xxhdpi/ic_visceral_fat.png create mode 100644 android_app/app/src/main/res/drawable-xxxhdpi/ic_visceral_fat.png diff --git a/android_app/app/schemas/com.health.openscale.core.database.AppDatabase/2.json b/android_app/app/schemas/com.health.openscale.core.database.AppDatabase/2.json index 09425342..44f5adba 100644 --- a/android_app/app/schemas/com.health.openscale.core.database.AppDatabase/2.json +++ b/android_app/app/schemas/com.health.openscale.core.database.AppDatabase/2.json @@ -2,11 +2,11 @@ "formatVersion": 1, "database": { "version": 2, - "identityHash": "41852b104c8d04f118c09bd1cd32725b", + "identityHash": "29790d4babbe129963d2c9282393c2d2", "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, `lbw` REAL NOT NULL, `waist` REAL NOT NULL, `hip` REAL NOT NULL, `bone` REAL NOT NULL, `thigh` 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, `lbw` REAL NOT NULL, `waist` REAL NOT NULL, `hip` REAL NOT NULL, `bone` REAL NOT NULL, `comment` TEXT, FOREIGN KEY(`userId`) REFERENCES `scaleUsers`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )", "fields": [ { "fieldPath": "id", @@ -80,12 +80,6 @@ "affinity": "REAL", "notNull": true }, - { - "fieldPath": "thigh", - "columnName": "thigh", - "affinity": "REAL", - "notNull": true - }, { "fieldPath": "comment", "columnName": "comment", @@ -195,7 +189,7 @@ ], "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, \"41852b104c8d04f118c09bd1cd32725b\")" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"29790d4babbe129963d2c9282393c2d2\")" ] } } \ No newline at end of file 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 e752986f..b238f019 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": "fd4198e9af667e65ae56be8e9838d1ca", + "identityHash": "d64c7b69a0b7a1a0f93dd154a24b20f2", "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, `lbw` 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, `lbw` 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 )", "fields": [ { "fieldPath": "id", @@ -56,6 +56,12 @@ "affinity": "REAL", "notNull": true }, + { + "fieldPath": "visceralFat", + "columnName": "visceralFat", + "affinity": "REAL", + "notNull": true + }, { "fieldPath": "lbm", "columnName": "lbw", @@ -231,7 +237,7 @@ ], "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, \"fd4198e9af667e65ae56be8e9838d1ca\")" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, \"d64c7b69a0b7a1a0f93dd154a24b20f2\")" ] } } \ No newline at end of file diff --git a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothDigooDGSO38H.java b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothDigooDGSO38H.java index f6d3a17a..e0130cba 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothDigooDGSO38H.java +++ b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothDigooDGSO38H.java @@ -86,8 +86,8 @@ public class BluetoothDigooDGSO38H extends BluetoothCommunication { } private void parseBytes(byte[] weightBytes) { - float weight, fat, water, muscle, boneWeight; - //float subcutaneousFat, visceralFat, metabolicBaseRate, biologicalAge, boneWeight; + float weight, fat, water, muscle, boneWeight, visceralFat; + //float subcutaneousFat, metabolicBaseRate, biologicalAge, boneWeight; final byte ctrlByte = weightBytes[5]; final boolean allValues = isBitSet(ctrlByte, 1); @@ -125,19 +125,19 @@ public class BluetoothDigooDGSO38H extends BluetoothCommunication { "is done, but fat is still zero. Settling for just adding weight."); } else { //subcutaneousFat = (float) (((weightBytes[8] & 0xFF) << 8) | (weightBytes[9] & 0xFF)) / 10.0f; - //visceralFat = (float) (weightBytes[10] & 0xFF) / 10.0f; + visceralFat = (float) (weightBytes[10] & 0xFF) / 10.0f; water = (float) (((weightBytes[11] & 0xFF) << 8) | (weightBytes[12] & 0xFF)) / 10.0f; //metabolicBaseRate = (float) (((weightBytes[13] & 0xFF) << 8) | (weightBytes[14] & 0xFF)); //biologicalAge = (float) (weightBytes[15] & 0xFF) + 1; muscle = (float) (((weightBytes[16] & 0xFF) << 8) | (weightBytes[17] & 0xFF)) / 10.0f; boneWeight = (float) (weightBytes[18] & 0xFF) / 10.0f; - //TODO: Add extra measurements? scaleBtData.setDateTime(new Date()); scaleBtData.setFat(fat); scaleBtData.setMuscle(muscle); scaleBtData.setWater(water); scaleBtData.setBone(boneWeight); + scaleBtData.setVisceralFat(visceralFat); } scaleBtData.setWeight(weight); addScaleData(scaleBtData); diff --git a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothExcelvanCF369BLE.java b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothExcelvanCF369BLE.java index 2a97074d..8ff48172 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothExcelvanCF369BLE.java +++ b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothExcelvanCF369BLE.java @@ -128,6 +128,7 @@ public class BluetoothExcelvanCF369BLE extends BluetoothCommunication { scaleBtData.setMuscle(muscle); scaleBtData.setWater(water); scaleBtData.setBone(bone); + scaleBtData.setVisceralFat(visceralFat); addScaleData(scaleBtData); } 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 f26cd23c..814dfc90 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 @@ -81,6 +81,7 @@ public abstract class AppDatabase extends RoomDatabase { public void migrate(SupportSQLiteDatabase database) { database.beginTransaction(); try { + database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN visceralFat REAL NOT NULL DEFAULT 0"); database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN chest REAL NOT NULL DEFAULT 0"); database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN thigh REAL NOT NULL DEFAULT 0"); database.execSQL("ALTER TABLE scaleMeasurements ADD COLUMN biceps REAL NOT NULL DEFAULT 0"); 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 2664fec9..7f0adc91 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 @@ -62,6 +62,9 @@ public class ScaleMeasurement implements Cloneable { @ColumnInfo(name = "muscle") private float muscle; @CsvColumn + @ColumnInfo(name = "visceralFat") + private float visceralFat; + @CsvColumn @ColumnInfo(name = "lbw") private float lbm; @CsvColumn @@ -260,6 +263,14 @@ public class ScaleMeasurement implements Cloneable { this.muscle = muscle; } + public float getVisceralFat() { + return visceralFat; + } + + public void setVisceralFat(float visceralFat) { + this.visceralFat = visceralFat; + } + public float getLbm() { return lbm; } 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 bca0785f..d61af4f8 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 @@ -112,6 +112,7 @@ public abstract class MeasurementView extends TableLayout { unsorted.add(new LBMMeasurementView(context)); unsorted.add(new FatMeasurementView(context)); unsorted.add(new BoneMeasurementView(context)); + unsorted.add(new VisceralFatMeasurementView(context)); unsorted.add(new WaistMeasurementView(context)); unsorted.add(new WHtRMeasurementView(context)); unsorted.add(new HipMeasurementView(context)); 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 5db9c5ed..b209f52b 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 @@ -52,6 +52,7 @@ public class MeasurementViewSettings { case WeightMeasurementView.KEY: // Weight can't be disabled return true; + case VisceralFatMeasurementView.KEY: case LBMMeasurementView.KEY: case BoneMeasurementView.KEY: case WaistMeasurementView.KEY: diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/VisceralFatMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/VisceralFatMeasurementView.java new file mode 100644 index 00000000..e42d65c3 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/VisceralFatMeasurementView.java @@ -0,0 +1,77 @@ +/* Copyright (C) 2018 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 VisceralFatMeasurementView extends FloatMeasurementView { + // Don't change key value, it may be stored persistent in preferences + public static final String KEY = "visceralFat"; + + public VisceralFatMeasurementView(Context context) { + super(context, R.string.label_visceral_fat, R.drawable.ic_visceral_fat); + } + + @Override + public String getKey() { + return KEY; + } + + @Override + protected boolean supportsPercentageToAbsoluteWeightConversion() { + return true; + } + + @Override + protected float getMeasurementValue(ScaleMeasurement measurement) { + return measurement.getVisceralFat(); + } + + @Override + protected void setMeasurementValue(float value, ScaleMeasurement measurement) { + measurement.setVisceralFat(value); + } + + @Override + public String getUnit() { + if (shouldConvertPercentageToAbsoluteWeight()) { + return getScaleUser().getScaleUnit().toString(); + } + + return "%"; + } + + @Override + protected float getMaxValue() { + return maybeConvertPercentageToAbsoluteWeight(80); + } + + @Override + public int getColor() { + return Color.parseColor("#8d6e63"); + } + + @Override + protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { + return null; + } +} diff --git a/android_app/app/src/main/res/drawable-hdpi/ic_visceral_fat.png b/android_app/app/src/main/res/drawable-hdpi/ic_visceral_fat.png new file mode 100644 index 0000000000000000000000000000000000000000..53727cdb7753249e8b37423eb9295493a5e5fcdc GIT binary patch literal 795 zcmV+$1LXXPP)w7Tvp~6}Lo5)TZ4C5r2fF3&eG3 zrMI^&2~tWdEHtsPuwubZ5D^iUY!DP_rPYdt9Wi6^oF{X7`rgh=XXdw=>3PpN{q(%& z)(n1W0iFU&fft@_7d;z+XQspjhPFsiK49p-CIG0fOlmQii?rLCK3`AE`5L5T0sWSqcs|IR2GJ#(quSx&< zk&wE5=Gl-{wy3Xf6Yw2)&HUFCuyBd%$XpKT=e&7#7RZ`@y|V?GGcLwO^#dnjFfQr? zPymklV739XF&NDtrOA6Gq0i;O7vMK=+XuA-xC{IPI*?I{%3Q>EH;uppU^TE8cm_-W zSAhoLS`tb(x51b?$0?1>kon#hfq8EPDj;C$VYJT}0tL%nP2QkS3Z;%DD)u&-6vQged4&^D5PyM7c0q=lsz=m=<(4~6M zd|s~rlS8gNv&em{?C7=julXFV05bz@t^}hw2pmGTe_xc1DeHQh6ur`>nNK=rCV}PwTH6{#YW7gIKqtTnE{!89mPmCsy+#0w5LA->Z5>u{Q7*jgtAHw21@E z;vDnuh5W==#8q663fsVQZc!CIT%kEEq>DB#V^KZEEzE_p7ADIeUvY%-i05z<-=MqC z;rJGnBG8{m%9nEyu1IILk50fJ@F@?fNVn5OEy`&}d==v#*uoyp@E^-XuBzeSCg*NG z%IRPQ-{OBgfVDE%nSK+F;d?+}7mEY=8LV0a%WkSIHDw1&*opE#6y%?xlAp-R`HgKX z;03?%ShTZr6y2hUDcnnK&?{M-=_8J@UY1b99iEgw+;OS@N+FqMq$}>}_tPNcP-^C( zH7y-zJK_nPV09Eo9`+?5Ywv+%YT%#rz~ATgsxHExr2Y~o17jWB7A1AZCbFjZJ@po{h>@HT$oZb|NB7;Ir?H}K^+oO|Bv%bn1x zelha1JAtnT;CRHR12P?JU1_4S79xKWw}-*kq%U-`u%0U|!n1DSH$LKNmBA+Nm8|E= z%X)qY8@Po1c#kK844MI1EP*fSwIlaD!`E>D5AhD)F)_$wCLr?#c-ASso^ME_+`$*T zkfv_CX=)ZmfoJ7PS0bJpCp>Ff@5gD-b3U>f(j~0?Bk&LPJ!gaeRt8`I O00008FC{TGahZUi;N z=*F11P~#NiuyWX{3kL|nD2{+M^Q53b(ZnG!g2R$PFt&@T;#S{&@AiH7J)75Ga+8-D z&i%fsbI&@%I;|z)q~d&jR7M zFhf}RU8cZJtTdi{!VtFUV-YLyi`L{5h6Fe2I}xiCd65BDa#=M;T5$tsVL|m>QzXb>4?;WZ|%rTbyMObK( zMdWe*O~L2$5P1+wTFje|opH=wfq25Ch1e_ceSFa-%*y%}VPEXq83`xM!6&irD`Dl! zSftp=d?#kL7~2TT6d&xyHij1|++jpm$vWf{78@(#1)RYHy&(TXH2fY0D#k9v9)&yP zMSJTdUY*rmz%9w+X6>gJuqK=51{Pm^2#v;lga&b-a z$!+p)q8y!aJX1k_Dej6k(>HNlry{n;$p_kqXhl9DPgbo&B=UdZhS;_O8-&IC$Jmd0 zqk36?4CV=$b`<-CkeQR;+J<~Wo+t8*{d7kD#!_2)PT~zkh}~msBJ4=Sm(j?+NNRQs z^0|opnTY4(@4qwhGlb}KPWUEn!}Qpf=ZW1KX6$lFP?vl{P9l-NDeJ#IwtrS*e&ezu z7cq*XI*ao!YE7PESE{maE@DLcz)*?#adM|V`JC}SpCi>;S506i7f}`6Dp9WOtLmKT zcrA|o4cD|7vsw}9>R^E)&(zIR<1kl|b=!%Uj@MO_hezX>$2xd_SwvNyYKwA+&5caM zON!cN?YP

Y@(VxXMJCPH2S?$Gd1G|%{CHw~}Ewo_OW$4rgVD%op^hhP?K%9eJ3nuSo{>+uN2uG+;!fNhjlbHh;TD*U4;5~6X|D`Fq}Yk0 zx~wAGU_iKN7!@uami5p!xL4STJZv5kT&i2-D}PK6SH6r#;!8FwGWKo_4dUgeMEM#s2|6zPtu-Z( n@5Gc@`7(y^fp9b(?#9r6Z%Lf_dDn&o00000NkvXXu0mjf3(!AO literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-xxhdpi/ic_visceral_fat.png b/android_app/app/src/main/res/drawable-xxhdpi/ic_visceral_fat.png new file mode 100644 index 0000000000000000000000000000000000000000..ce36fdb681f5ce7e0ec3dc4721f97a5b6694e670 GIT binary patch literal 1665 zcmV-{27dX8P)yeX?!I>)u2RC zf)7xzMR|!zFI53~E7n$gP=y#k160KqD~&G14eEa&8y^^}M$w`@F6It*=69ZRUbpS- zH#rGCXU=bCKFs;eZ+a14aBWfW225zoCtI*&hDGH9(3K|qrEATPVaI_?(N(t?&t6bn{EvG>s zO$0u{hI328cgH*=316h8q=~?%?61nt1{S?aQcC*j50{gz&qG$ ztAp5`cru0E#n^D(08Xnu+f07{3580o%FQ@OM#LK&?5+~;ZU>q~nKh!!^Qn4JppvYu zWU#j}fn5pbMf`BIDvVG_N#JP7U~f}|T?yv}!r^FDNIy~wQ497|eiFDN=ACZrPOJ$i z^9Z)j*+I?c#A&^-uYKMnKre7xLOYo?0XSeZWC*xD;k(jjbQ{kkoL7h+IZ|td{T|?_ z>c9U39&ohhEV(K_0o>?l<8kaxY(Y)a=Dl?p+9-XVc@0zG#=r#ZsXNQ^VKw2Mcp3MR zBeg@={0$q@gBk7nBp04(Mvl~D_~ES0XcOQnV9>DnHE<5f*%vmF-ZqT?1I*09rt~=; z@N7n#(}ClLz3+hYs?VBGe$9lmAY*-}^t)mBKo0hT;OOg_ls2ak4o9mA=%WBg9oU_S zieuvRFgBbX)RdeBQW7{?O(;KSLR#opU!Y{Lmn0&V3WB2@@>9ZocaVVqO#^-=85~gl zbcT3m7`WP@AEC+uDGH93E2N}wCIjrPYc$XYHZ#RcEDauha(Y_7`%nv{O_PHj-RN&iSZW>wVxa zpAhf4fxS`ew5&mGX=OG6(OGxHuW_(|K_t%)UmXHI($hn zonDQDa}lrv_>AyX`4DgzwJOgVcZI1gkot&*(?>8654BUV7nno*440QSQ352H6bplM zA^yDeF;u$b2GllGJtQG5E~1j{M8g4CWITTlxSZlXA6J<>%Y%6vzZ83Ibrd)^pxj}j zOfLE2oHPR!O6a!j&btCL+c!w?+G-NY@p`}yN@$@PJqG1DInx ze=Y9@q?CknkOKYSY}An%UD+P&te^Q)skomkl%cz^LyX;oXDM^joubm6sFBo)O00XR z9o;jEZb*#k0!K^ct$To*jK9Aut05tpMa>s_sM)LZ@Ir12nSrB6@*UQ^H6q|>&BJ!w z^4d~zd*o-eixNMpFv$}i<{2N4^rt>t)s8)K_LDw4nY$KIgESw1sv+z7p*W3bI9k`B z4ie~PMTO{8NnRQiaKa=v50j>Elj}3H^00000 LNkvXXu0mjf1(*-X literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-xxxhdpi/ic_visceral_fat.png b/android_app/app/src/main/res/drawable-xxxhdpi/ic_visceral_fat.png new file mode 100644 index 0000000000000000000000000000000000000000..b6f72e257ec5a80bece019953e7384548cf8c5fb GIT binary patch literal 2092 zcmV+{2-Ek8P)-CbW*KPaEMz@Nakz}S*=>2W*)bVjy+feTB`s0Z;V_2O416o^aw%7g-V z0O+7z@SlNw#%FE7xRP>gTBI}oYv5$y5@0t~PYA|ixW(60CIljh_?pTD&$z_z7qd@g zf+rrw7XKUK#n)6O5>2Y8H8 znc(0_!i%q|OfXo0E&e*-)Ijlu0h@%FZ9r?Fm<`K4*oC!UfYSoS8wPB|7QaWDAc@}z z>;%pa5N|lP_=kaZdY}mp6JO8Y3rz7CZ#1ygh;ab8iXM1RxEK4({}tFn7!gLG=8VlV z|Heq0X~^>lP1h65Io#;e&Uj#l@!dXPYL0m4;6C$Bn!YDU;+rE}mkHA{#B+&%b<93Z zYl3SgODZq;Fd>Whnx-=$jrf{8CY(!l@ik3jf;54?1{j!N-$|&aq3FK5flFid843Jl z>~k2nDMRi_Z_FbJH*U$r0&MYrAes0YmkE~%ZASusV~amKTlzq}2`#|$$3EMiGmdwB zh_8`M*aJ+Av>Amh{t^6$;xb{G5bqWb@p2>0;eLfYfu0oUp3n|l0gM6uF}^zlT$>}F ziF8kpwhrKKk8xA8P)O=~{8Tlip0F3#f_*05>>-|s)Dxtww4NY|@4KWdnNWoI05xER z5c5;ucOj2LO_1hrza-yf$Hm3KE+L-p%TAQuz&k?B_krV3rSrAMcZFS!?h+FF4nNa~ z5<`$n%DaFG0pitwmxXvMfj&lFQcsu@Ag4OojG*fXEB+tYV(4ureod$WF9~r>@uT?_ zZo(QP;67k_fH*_3#Xo|5WAtT0TJbeQDAJk`jyCh|N zX+EQ2dctPovrtvdxKj2ipl{5+OO5tf@@t5mAemr_KPyn|7SvguR{UN@&ijEAGv+V} z*@O^PTqom@O$aT%YmgNuKByaZbf1rN<|6gPhA^R>FjZ7nZD$3^YCF#v`_1=|(`4ia zgYh1YotRea;k)lDYK?s2Lw#N6DE?j?X$TXfwLGqILRxwQZ)1!9ChEGLgt5lHpL@tF ziu820i+~kVi4Z2Z#D9b2;)DI-;6piba?x}qxF*okiVy04=%U9Mo*|zkG>r*9#Xp_; z)qQJI?w^*1Fd@(MW({}+Tl^1!<5T7_nE%&(>TOZVV`O0}_8j+iR86Tcvh;-Bz`NMu zzfQ6c=iZy&5ZtuD4Cd)y`13 zdP1T9ftSRDIPs;zT3=uWYHVPxDRpgI@LL#6N<+Lj7-vE+;8kqF%zAz=)FjC=>^h8V zTaTJtpF;YZw@(_{giq*Ne2~Wj=5`eL0`>m#=%BwQJq>Guxh=;Q{|w}}@jFpf%@wHH zPN@H-@Wpgw6UG#oM4SolAz$$2>H&_!`NC zji{S-jrxUNhk;YdNi#LwLVV4g*!P6rP)pd&5${CDF&c>h*w_3H;K4GJ>I%sOY5BPM z-x7^Rw-jG98+Dn9s}psihVhq|lw%x&P)~E+;+{Ppp{d1>V+{6M)S~YR zu511s1?EsHE)%XOAa;)zUn7}tfUwolN_>MNO{m0oP=pDU_+1dvgi8E`oQ?gaW?mC2 z@l)c{gu%$--|i*TCdOsL%oN8MjJ?pe53b&@ja8qgi8ECjG}83D)9p& znQ#zgLM47dNPoJt4_o{W;J%V_YSelect measurement Select user Configure widget + Visceral fat Chest circumference Thigh circumference Biceps circumference From e969efd7985b9dcf86e8fe2a8b01c5608d42ce03 Mon Sep 17 00:00:00 2001 From: OliE Date: Sun, 13 May 2018 20:06:30 +0200 Subject: [PATCH 7/8] changed colour of visceral fat measurement --- .../health/openscale/gui/views/VisceralFatMeasurementView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/VisceralFatMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/VisceralFatMeasurementView.java index e42d65c3..2c88e46c 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/VisceralFatMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/VisceralFatMeasurementView.java @@ -67,7 +67,7 @@ public class VisceralFatMeasurementView extends FloatMeasurementView { @Override public int getColor() { - return Color.parseColor("#8d6e63"); + return Color.parseColor("#00bfa5"); } @Override From 2da162b2b154c9069cdf945134c1927d7f1ee59c Mon Sep 17 00:00:00 2001 From: Erik Johansson Date: Sun, 13 May 2018 22:35:36 +0200 Subject: [PATCH 8/8] Don't require new fields in CSV file either --- .../core/datatypes/ScaleMeasurement.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) 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 63ef5389..b3622818 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 @@ -61,7 +61,7 @@ public class ScaleMeasurement implements Cloneable { @CsvColumn(mustBeSupplied = false) @ColumnInfo(name = "muscle") private float muscle; - @CsvColumn + @CsvColumn(mustBeSupplied = false) @ColumnInfo(name = "visceralFat") private float visceralFat; @CsvColumn(mustBeSupplied = false) @@ -76,25 +76,25 @@ public class ScaleMeasurement implements Cloneable { @CsvColumn(mustBeSupplied = false) @ColumnInfo(name = "bone") private float bone; - @CsvColumn + @CsvColumn(mustBeSupplied = false) @ColumnInfo(name = "chest") private float chest; - @CsvColumn + @CsvColumn(mustBeSupplied = false) @ColumnInfo(name = "thigh") private float thigh; - @CsvColumn + @CsvColumn(mustBeSupplied = false) @ColumnInfo(name = "biceps") private float biceps; - @CsvColumn + @CsvColumn(mustBeSupplied = false) @ColumnInfo(name = "neck") private float neck; - @CsvColumn + @CsvColumn(mustBeSupplied = false) @ColumnInfo(name = "caliper1") private float caliper1; - @CsvColumn + @CsvColumn(mustBeSupplied = false) @ColumnInfo(name = "caliper2") private float caliper2; - @CsvColumn + @CsvColumn(mustBeSupplied = false) @ColumnInfo(name = "caliper3") private float caliper3; @CsvColumn(mustBeSupplied = false)