From 69a652ef516ab64efc24ad122086d123856e7cf5 Mon Sep 17 00:00:00 2001 From: OliE Date: Sun, 13 May 2018 19:37:33 +0200 Subject: [PATCH] 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