From 1150f695f700fc9f996ca1f29a0fb57cf023792c Mon Sep 17 00:00:00 2001 From: oliexdev Date: Sun, 26 May 2019 11:33:10 +0200 Subject: [PATCH] add user measurement view to reassign an user, see issue #457 --- .../gui/activities/DataEntryActivity.java | 9 +- .../openscale/gui/views/MeasurementView.java | 5 +- .../gui/views/UserMeasurementView.java | 119 ++++++++++++++++++ .../src/main/res/drawable-hdpi/ic_user.png | Bin 0 -> 567 bytes .../src/main/res/drawable-ldpi/ic_user.png | Bin 0 -> 314 bytes .../src/main/res/drawable-mdpi/ic_user.png | Bin 0 -> 394 bytes .../src/main/res/drawable-xhdpi/ic_user.png | Bin 0 -> 780 bytes .../src/main/res/drawable-xxhdpi/ic_user.png | Bin 0 -> 1113 bytes .../src/main/res/drawable-xxxhdpi/ic_user.png | Bin 0 -> 1513 bytes 9 files changed, 127 insertions(+), 6 deletions(-) create mode 100644 android_app/app/src/main/java/com/health/openscale/gui/views/UserMeasurementView.java create mode 100644 android_app/app/src/main/res/drawable-hdpi/ic_user.png create mode 100644 android_app/app/src/main/res/drawable-ldpi/ic_user.png create mode 100644 android_app/app/src/main/res/drawable-mdpi/ic_user.png create mode 100644 android_app/app/src/main/res/drawable-xhdpi/ic_user.png create mode 100644 android_app/app/src/main/res/drawable-xxhdpi/ic_user.png create mode 100644 android_app/app/src/main/res/drawable-xxxhdpi/ic_user.png diff --git a/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java b/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java index d026f77e..896c62d1 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/activities/DataEntryActivity.java @@ -33,6 +33,9 @@ import android.widget.TableLayout; import android.widget.TextView; import android.widget.Toast; +import androidx.appcompat.widget.Toolbar; +import androidx.core.graphics.drawable.DrawableCompat; + import com.health.openscale.R; import com.health.openscale.core.OpenScale; import com.health.openscale.core.datatypes.ScaleMeasurement; @@ -40,15 +43,13 @@ import com.health.openscale.gui.views.DateMeasurementView; import com.health.openscale.gui.views.MeasurementView; import com.health.openscale.gui.views.MeasurementViewUpdateListener; import com.health.openscale.gui.views.TimeMeasurementView; +import com.health.openscale.gui.views.UserMeasurementView; import com.health.openscale.gui.views.WeightMeasurementView; import java.text.DateFormat; import java.util.Date; import java.util.List; -import androidx.appcompat.widget.Toolbar; -import androidx.core.graphics.drawable.DrawableCompat; - public class DataEntryActivity extends BaseAppCompatActivity { public static final String EXTRA_ID = "id"; public static final String EXTRA_MODE = "mode"; @@ -373,7 +374,7 @@ public class DataEntryActivity extends BaseAppCompatActivity { } for (MeasurementView measurement : dataEntryMeasurements) { - if (measurement instanceof DateMeasurementView || measurement instanceof TimeMeasurementView) { + if (measurement instanceof DateMeasurementView || measurement instanceof TimeMeasurementView || measurement instanceof UserMeasurementView) { measurement.setVisibility(dateTimeVisibility); } measurement.setEditMode(viewMode); 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 845cd37c..6c340e4d 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 @@ -41,6 +41,8 @@ import android.widget.TableLayout; import android.widget.TableRow; import android.widget.TextView; +import androidx.core.content.ContextCompat; + import com.health.openscale.R; import com.health.openscale.core.OpenScale; import com.health.openscale.core.datatypes.ScaleMeasurement; @@ -51,8 +53,6 @@ import com.health.openscale.gui.utils.ColorUtil; import java.util.ArrayList; import java.util.List; -import androidx.core.content.ContextCompat; - import static com.health.openscale.gui.views.MeasurementView.MeasurementViewMode.ADD; import static com.health.openscale.gui.views.MeasurementView.MeasurementViewMode.EDIT; import static com.health.openscale.gui.views.MeasurementView.MeasurementViewMode.STATISTIC; @@ -131,6 +131,7 @@ public abstract class MeasurementView extends TableLayout { unsorted.add(new TDEEMeasurementView(context)); unsorted.add(new CaloriesMeasurementView(context)); unsorted.add(new CommentMeasurementView(context)); + unsorted.add(new UserMeasurementView(context)); // Get sort order final String[] sortOrder = TextUtils.split( diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/UserMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/UserMeasurementView.java new file mode 100644 index 00000000..b96ea368 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/UserMeasurementView.java @@ -0,0 +1,119 @@ +/* Copyright (C) 2019 olie.xdev + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see + */ +package com.health.openscale.gui.views; + +import android.content.Context; +import android.os.Bundle; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.Spinner; + +import com.health.openscale.R; +import com.health.openscale.core.OpenScale; +import com.health.openscale.core.datatypes.ScaleMeasurement; +import com.health.openscale.core.datatypes.ScaleUser; + +import java.util.ArrayList; + +public class UserMeasurementView extends MeasurementView { + // Don't change key value, it may be stored persistent in preferences + public static final String KEY = "user"; + + private OpenScale openScale = OpenScale.getInstance(); + private int userId; + + public UserMeasurementView(Context context) { + super(context, R.string.label_user_name, R.drawable.ic_user); + userId = -1; + } + + @Override + public String getKey() { + return KEY; + } + + private void setValue(int newUserId, boolean callListener) { + if (newUserId == -1) { + setValueView(openScale.getSelectedScaleUser().getUserName(), callListener); + } else if (userId != newUserId) { + userId = newUserId; + + setValueView(openScale.getScaleUser(userId).getUserName(), callListener); + } + } + + @Override + public void loadFrom(ScaleMeasurement measurement, ScaleMeasurement previousMeasurement) { + setValue(measurement.getUserId(), false); + } + + @Override + public void saveTo(ScaleMeasurement measurement) { + measurement.setUserId(userId); + } + + @Override + public void clearIn(ScaleMeasurement measurement) { + // ignore + } + + @Override + public void restoreState(Bundle state) { + setValue(state.getInt(getKey()), true); + } + + @Override + public void saveState(Bundle state) { + state.putInt(getKey(), userId); + } + + @Override + public String getValueAsString(boolean withUnit) { + return openScale.getScaleUser(userId).getUserName(); + } + + @Override + protected View getInputView() { + Spinner spinScaleUer = new Spinner(getContext()); + ArrayAdapter spinScaleUserAdapter = new ArrayAdapter<>(getContext(), R.layout.support_simple_spinner_dropdown_item, new ArrayList<>()); + + spinScaleUer.setAdapter(spinScaleUserAdapter); + + int spinPos = 0; + + for (ScaleUser scaleUser : openScale.getScaleUserList()) { + spinScaleUserAdapter.add(scaleUser.getUserName()); + + if (scaleUser.getId() == userId) { + spinPos = spinScaleUserAdapter.getCount() - 1; + } + } + + spinScaleUer.setSelection(spinPos); + + return spinScaleUer; + } + + @Override + protected boolean validateAndSetInput(View view) { + Spinner spinScaleUser = (Spinner)view; + + int pos = spinScaleUser.getSelectedItemPosition(); + setValue(openScale.getScaleUserList().get(pos).getId(), true); + + return true; + } +} diff --git a/android_app/app/src/main/res/drawable-hdpi/ic_user.png b/android_app/app/src/main/res/drawable-hdpi/ic_user.png new file mode 100644 index 0000000000000000000000000000000000000000..6656e7d227c0cc16e1ee562868e5cfa55e3970d0 GIT binary patch literal 567 zcmV-70?7S|P)|16+sk$;pcjzL6N9n7bCH-5J4NkkIF(Nb$)?@pnpIV zu@igoC)n61n#x861<`=u2Z%*b(ukH~?$wAvEoN5CWp6Sw$u9W9Y4*KW(m*t4?UF1(AwvgBR+A zwzMEJG}nJ2)Y=Rq@!)w}m}#1>L%oP zbqv^uqd0`UF~)@>@))+pbv=B=cYGA)pgFw2GyGgF(I4f?T&lGLKG*;N002ovPDHLk FV1lG`3G4s> literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-ldpi/ic_user.png b/android_app/app/src/main/res/drawable-ldpi/ic_user.png new file mode 100644 index 0000000000000000000000000000000000000000..0ba453dd51a4e0f3a416d5321ab5ca45c0bfb6f6 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|wj^(N7l!{JxM1({$v~0!o-U3d z7QJ(?oY!&<6gmEpU%0cSM}Unj&Qa;4Z~@!9mh_3g^*-@*zFVaC(B>8+V>&+vwB!E>t)V>#+@EDa?5iaX1`3! z-O6}2#bI-Nx-?~=kVpp_>WxI)kUH KpUXO@geCwT3xY=g literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-mdpi/ic_user.png b/android_app/app/src/main/res/drawable-mdpi/ic_user.png new file mode 100644 index 0000000000000000000000000000000000000000..bb2a33a0b67b8bd8c37bd73f0e2800f87959ee90 GIT binary patch literal 394 zcmV;50d@X~P)p*5ed<##3mAw#U>PcmL+@UjGTRvr#P8+p8w3ebB1gcu!SqUCceZb`XlBC z)q@H?Q+$N(Jb;xzc+<r2~L+2vF?+Ahp?r z4um)T-G|nMc{K~!jg)tOCe6G0e&p9C?QNG+lu)mp{+6~TiC6~vR`rBcz8VnId! zfFM}#=uJHO4=P?oyy~T(;6ZOzT18rmB8^lVto19Yhj&-jb!Ia=GrJofcn@Ln&OYyC zGdnX|!XG8zFmMt$0&D~}1Z@rA127KU2c7`S9?^?cFKWOH>E*+i2C8{WN4biB`9w~p{eBb6pz`;Xi$iXlrfs520S$-T zICHj%E(J_FFqdxu7m5%~;vDio>LkAaoGr+)BU^wwz!Lw8e+9;n>DL=2 zpPfbMMUGeog3r^yV`TKb;-i2a$mXUF+ydr1e19FXm!1HgQoxq7f*fAmMb<;n+hhi~ z1guu%Re{UE+gMH`=xdmar_?pT4d64K|ENvmpld9MN0|M==YgBRdf)QHzLegS7(NL)hkKbksT+y2VEM< zz|o{e9onPBow zDI<$OWrK=Zb}rT^&rfv)6#CvugKCBQUlpLdD|7`^G8C~z>7*+leDB*WEMu`99i=*0>s3x+*S_D1H(b^GdF(6{e{~e&f|JFW^O!DG=o4MlHZ(WJWw!?5GHU~oI!_hL9uKC zcv+k|&3LI;HkmmWe~LHg2v$ZVu{cT?o3SKNzsWFej1rGD=(<4dI_t{DwD`xX8T$(5 zl#Mav%xT7oh(w|uu{A-ut(b@q9VCN7>Wnfd?6up1b0S2e3|bbXTfELFgO&#A7OykP zpwokNTd|-F`ZY+m6-OdOqYOF_q}z&_2+=_@Xm5mQltEtw>9%554R!X!9_6MPUq&Sn zIh%hcP`g-Nkp{gHs6CfA3)Yp5A!*|;`tkY(r$r?Z*@I^BY@mLVr*X7EJs~W|cj9`_ zG|nuRO%OMWGw9ZWd4#f6esf+dnLsq7*eRbm@8OJ+36x+&8n5(f&ij(#1IZ{})x9~d z7{H!0A6s-b71@njYH4YW4B<9R;wS$$<;TX)wlvDt!lJq=o`-SA7yA$3+Zx+a3+GFZ z$%Q>=Of)pk%hIA68NyX~46jLxSnrGPkluW=Z8X1^&I(;Gqggrr2aVuiJfgep-zj_`EqWbneD7?m!_~UmF`dFQ zcmaQO@%!1hOYCH{*O*YRDHxY8XR*-=a;UjQn0E)Rpv|!jVr4Zs%p^M9vafGtgBL}szDPy zG^Agtv@TWEpf%mMqi?Bn&#cN@Y*<<{=%?k`9L!2{vzGh%ReI1WgJ%xut=x9$wu(W6 zybslO1M>fF&`7%iRSaq?vVb{dP#aDe)P^hu)p2vD6m4^>Vo)6yQ%ccxA-{@2e`jb& zzj7>x$e6ULSN9@U?)U;{+zKS>Q%e(BrfkYx!lVbmq?#%w-Hz1Vu2S;8XT1_ z@O>y95#EW><)!)PwlB@pZp+Vr{Q< fo9NRM%4X*ucXm&KgH2{!00000NkvXXu0mjf9z7B- literal 0 HcmV?d00001 diff --git a/android_app/app/src/main/res/drawable-xxxhdpi/ic_user.png b/android_app/app/src/main/res/drawable-xxxhdpi/ic_user.png new file mode 100644 index 0000000000000000000000000000000000000000..14720bba37b4eee7ed9ba6f1c05312603cef93c3 GIT binary patch literal 1513 zcmVAoWoNe1V`=6p^S6Mvd`BW1@+P zf13EGiQRjfp1uXMH68$cK-lu}};#KBJOA`H%)sDh1n$<<^fqH>KBh?mcJb zoPFlbtYoJ@Gqca$d(PbR*k^YU;nN9h1~vh!ftA2=pagV8*Ng*Gz$maE*ar*&gTQgm z?QICo1|9)+0;ho)OPK~f10If^Sx^TL0l#7I^o8VCpx>h%nWG(epY$DHE$>CT3eKPt z7{Y!3_Pi*yPC(f8{nH};0XF}enk#PZORQB(RX^asQegf zeS$VA>5bzS4W(KExL!$b9K9M!wE}RNlHNEj)ljMxfJ>D0#-Y-tMG87wfeCbn!1GZC z76bqIRI1^Gi49knk>7mWav6m-^$_qG)Qm`j^)g+&17l8YV? za(06E9Wspocpc^$GU;2PMgUGK=&YB&eJj)mz+nZQ^)l*Pp~g(Ogv^9BbjOjKneY^F zP(g1k4xsS+q_rflM@erS!x~Dp0KL>A%+7e-c>X z+{(at5xoFx^I%`_v;g1Y-}!q9duiM&tB~WQzMOvoxWbEN8RA~xU)($Y6mX9xn=;2^ z$k|?3&YuPz^=3^*=|^^^(suqN@SsOKGR<|QdszDy;99R1Gyv_u%OsmEPXR9hOFXx| zq38kL0LG}_@ngX2gqZ|9htReK<7ff;fGx=9qz5@+5AYW-g3KpA2fji^I|T*tgm^Hm z3pkJT>-u2>IjN50c> z0y!NYsj#}v354;9k zZD*<(E=NI4NcF3yfSXfz-f7?)B&Fp$;3zWO1XzmvZmb7xj3kZCrXi%7%K*}gGDAP` z6Ykb@e9I5O1F3q*5f=a-q3ZzAhAtuOax)=N!l34aX%7f?J1!uMd}JDc zL~GwU!RWs;nFgRp^RA6iBAICb78_olM~r+_1R#B!_JHCORGXp)DC0B$MGvTr(@#*y zWrst-X%EQVVFn9~${(8s;4H)I^N7()TBMbvkJ0*?X#jR1$w&qBQ$`MTI7PF-Qt0x0 z0>2vZ1b#}(WJRWd=Ms6;g8PAE2^-!B@+VU3NQD)^$2A(*$nqg_EK8j}W`CgbAVZPO z!ErnA361&ta0=<|x25GQmn=up*Y^;ANaeY*_1jy%GGounZtd+tvE6yMMi-^ z;0xeWBn{sg8ufxM2W|qcLGn!3Vv){~62Bvdu)mM~4g>pqHXxLOP3=f^s~)7ROgEBU zuoT(k?n07ZTbW&LEHS(EJIQPrnh7K=