From d20a824f516feebb2bb049af50920e2b9b5da50a Mon Sep 17 00:00:00 2001 From: OliE Date: Sun, 13 May 2018 14:56:22 +0200 Subject: [PATCH] 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 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 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