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 f36de6a9..96c1849f 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 @@ -47,6 +47,10 @@ import com.health.openscale.core.datatypes.ScaleUser; import com.health.openscale.core.utils.Converters; import com.health.openscale.core.utils.CsvHelper; import com.health.openscale.gui.fragments.FragmentUpdateListener; +import com.health.openscale.gui.views.FatMeasurementView; +import com.health.openscale.gui.views.LBWMeasurementView; +import com.health.openscale.gui.views.MeasurementViewSettings; +import com.health.openscale.gui.views.WaterMeasurementView; import java.io.BufferedReader; import java.io.IOException; @@ -254,21 +258,24 @@ public class OpenScale { } } - if (prefs.getBoolean("estimateWaterEnable", false)) { - EstimatedWaterMetric waterMetric = EstimatedWaterMetric.getEstimatedMetric(EstimatedWaterMetric.FORMULA.valueOf(prefs.getString("estimateWaterFormula", "TBW_LEESONGKIM"))); - + MeasurementViewSettings settings = new MeasurementViewSettings(prefs, WaterMeasurementView.KEY); + if (settings.isEnabled() && settings.isEstimationEnabled()) { + EstimatedWaterMetric waterMetric = EstimatedWaterMetric.getEstimatedMetric( + EstimatedWaterMetric.FORMULA.valueOf(settings.getEstimationFormula())); scaleMeasurement.setWater(waterMetric.getWater(getScaleUser(scaleMeasurement.getUserId()), scaleMeasurement)); } - if (prefs.getBoolean("estimateLBWEnable", false)) { - EstimatedLBWMetric lbwMetric = EstimatedLBWMetric.getEstimatedMetric(EstimatedLBWMetric.FORMULA.valueOf(prefs.getString("estimateLBWFormula", "LBW_HUME"))); - + settings = new MeasurementViewSettings(prefs, LBWMeasurementView.KEY); + if (settings.isEnabled() && settings.isEstimationEnabled()) { + EstimatedLBWMetric lbwMetric = EstimatedLBWMetric.getEstimatedMetric( + EstimatedLBWMetric.FORMULA.valueOf(settings.getEstimationFormula())); scaleMeasurement.setLbw(lbwMetric.getLBW(getScaleUser(scaleMeasurement.getUserId()), scaleMeasurement)); } - if (prefs.getBoolean("estimateFatEnable", false)) { - EstimatedFatMetric fatMetric = EstimatedFatMetric.getEstimatedMetric(EstimatedFatMetric.FORMULA.valueOf(prefs.getString("estimateFatFormula", "BF_GALLAGHER"))); - + settings = new MeasurementViewSettings(prefs, FatMeasurementView.KEY); + if (settings.isEnabled() && settings.isEstimationEnabled()) { + EstimatedFatMetric fatMetric = EstimatedFatMetric.getEstimatedMetric( + EstimatedFatMetric.FORMULA.valueOf(settings.getEstimationFormula())); scaleMeasurement.setFat(fatMetric.getFat(getScaleUser(scaleMeasurement.getUserId()), scaleMeasurement)); } diff --git a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothIhealthHS3.java b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothIhealthHS3.java index b71417b3..7335c53b 100644 --- a/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothIhealthHS3.java +++ b/android_app/app/src/main/java/com/health/openscale/core/bluetooth/BluetoothIhealthHS3.java @@ -27,12 +27,9 @@ import com.health.openscale.core.datatypes.ScaleMeasurement; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.text.ParseException; -import java.text.SimpleDateFormat; import java.util.Set; import java.util.UUID; import java.util.Date; -import java.util.Calendar; import java.util.Arrays; public class BluetoothIhealthHS3 extends BluetoothCommunication { 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 ddc775d1..5fa221e7 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 @@ -302,6 +302,15 @@ public class DataEntryActivity extends AppCompatActivity { } isDirty = true; + + // Measurements that aren't visible should not store any value. Since we use values from + // the previous measurement there might be values for entries not shown. The loop below + // clears these values. + for (MeasurementView measurement : dataEntryMeasurements) { + if (!measurement.isVisible()) { + measurement.clearIn(scaleMeasurement); + } + } } for (MeasurementView measurement : dataEntryMeasurements) { diff --git a/android_app/app/src/main/java/com/health/openscale/gui/fragments/GraphFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/fragments/GraphFragment.java index 3377e21d..65ca0527 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/fragments/GraphFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/fragments/GraphFragment.java @@ -43,8 +43,10 @@ import com.health.openscale.core.OpenScale; import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.utils.PolynomialFitter; import com.health.openscale.gui.activities.DataEntryActivity; +import com.health.openscale.gui.views.BMRMeasurementView; import com.health.openscale.gui.views.FloatMeasurementView; import com.health.openscale.gui.views.MeasurementView; +import com.health.openscale.gui.views.MeasurementViewSettings; import com.health.openscale.gui.views.WeightMeasurementView; import java.text.SimpleDateFormat; @@ -249,7 +251,7 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { private void addFloatingActionButton(FloatMeasurementView measurementView) { FloatingActionButton actionButton = new FloatingActionButton(getContext()); - actionButton.setTag("actionButton" + measurementView.getName()); + actionButton.setTag(measurementView.getKey()); actionButton.setColorFilter(Color.parseColor("#000000")); actionButton.setImageDrawable(measurementView.getIcon()); actionButton.setClickable(true); @@ -259,11 +261,9 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { actionButton.setLayoutParams(lay); actionButton.setOnClickListener(new onClickListenerDiagramLines()); - if (prefs.getBoolean(String.valueOf("actionButton" + measurementView.getName()), true)) { - actionButton.setBackgroundTintList(ColorStateList.valueOf(measurementView.getColor())); - } else { - actionButton.setBackgroundTintList(ColorStateList.valueOf(Color.parseColor("#d3d3d3"))); - } + int color = measurementView.getSettings().isInGraph() + ? measurementView.getColor() : Color.parseColor("#d3d3d3"); + actionButton.setBackgroundTintList(ColorStateList.valueOf(color)); floatingActionBar.addView(actionButton); } @@ -326,7 +326,7 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { if (view instanceof FloatMeasurementView) { FloatMeasurementView measurementView = (FloatMeasurementView) view; - if (measurementView.getName().equals(getString(R.string.label_bmr))) { + if (measurementView instanceof BMRMeasurementView) { continue; } @@ -385,7 +385,7 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { if (measurementView.isVisible()) { addFloatingActionButton(measurementView); - if (prefs.getBoolean(String.valueOf("actionButton" + measurementView.getName()), true)) { + if (measurementView.getSettings().isInGraph()) { diagramLineList.add(diagramLine); } } @@ -587,11 +587,9 @@ public class GraphFragment extends Fragment implements FragmentUpdateListener { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getContext()); - if (prefs.getBoolean(String.valueOf(actionButton.getTag()), true)) { - prefs.edit().putBoolean(String.valueOf(actionButton.getTag()), false).commit(); - } else { - prefs.edit().putBoolean(String.valueOf(actionButton.getTag()), true).commit(); - } + String key = String.valueOf(actionButton.getTag()); + MeasurementViewSettings settings = new MeasurementViewSettings(prefs, key); + prefs.edit().putBoolean(settings.getInGraphKey(), !settings.isInGraph()).apply(); generateGraphs(); } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/fragments/OverviewFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/fragments/OverviewFragment.java index 0264753f..0c2dbd34 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/fragments/OverviewFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/fragments/OverviewFragment.java @@ -38,6 +38,7 @@ import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.datatypes.ScaleUser; import com.health.openscale.core.utils.Converters; import com.health.openscale.core.utils.DateTimeHelpers; +import com.health.openscale.gui.views.BMRMeasurementView; import com.health.openscale.gui.views.FloatMeasurementView; import com.health.openscale.gui.views.MeasurementView; @@ -227,8 +228,7 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener for (MeasurementView view : measurementViews) { if (!view.isVisible() - || !prefs.getBoolean(String.valueOf("actionButton" + view.getName()), true) - || view.getName().equals(getString(R.string.label_bmr)) + || !view.getSettings().isInOverviewGraph() || !(view instanceof FloatMeasurementView)) { continue; } @@ -277,7 +277,7 @@ public class OverviewFragment extends Fragment implements FragmentUpdateListener if (view instanceof FloatMeasurementView) { FloatMeasurementView measurementView = (FloatMeasurementView) view; - if (measurementView.getName().equals(getString(R.string.label_bmr))) { + if (measurementView instanceof BMRMeasurementView) { continue; } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/fragments/StatisticsFragment.java b/android_app/app/src/main/java/com/health/openscale/gui/fragments/StatisticsFragment.java index 165a42f9..92e794e1 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/fragments/StatisticsFragment.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/fragments/StatisticsFragment.java @@ -16,9 +16,7 @@ package com.health.openscale.gui.fragments; -import android.content.SharedPreferences; import android.os.Bundle; -import android.preference.PreferenceManager; import android.support.v4.app.Fragment; import android.text.Html; import android.view.LayoutInflater; @@ -67,7 +65,6 @@ public class StatisticsFragment extends Fragment implements FragmentUpdateListen private TableLayout tableMonthAveragesLayoutColumnA; private TableLayout tableMonthAveragesLayoutColumnB; - private SharedPreferences prefs; private ScaleUser currentScaleUser; private ScaleMeasurement lastScaleMeasurement; @@ -78,8 +75,6 @@ public class StatisticsFragment extends Fragment implements FragmentUpdateListen public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { statisticsView = inflater.inflate(R.layout.fragment_statistics, container, false); - prefs = PreferenceManager.getDefaultSharedPreferences(statisticsView.getContext()); - txtGoalWeight = (TextView) statisticsView.findViewById(R.id.txtGoalWeight); txtGoalDiff = (TextView) statisticsView.findViewById(R.id.txtGoalDiff); txtGoalDayLeft = (TextView) statisticsView.findViewById(R.id.txtGoalDayLeft); @@ -110,9 +105,9 @@ public class StatisticsFragment extends Fragment implements FragmentUpdateListen for (MeasurementView measurement : viewMeasurementsListWeek) { measurement.setEditMode(STATISTIC); - measurement.updatePreferences(prefs); - if (measurement.isVisible()) { + if (measurement.getSettings().isEnabled()) { + measurement.setVisible(true); measurement.setPadding(-1, -1, -1, paddingBottom); if ((i % 2) == 0) { tableWeekAveragesLayoutColumnA.addView(measurement); @@ -138,9 +133,9 @@ public class StatisticsFragment extends Fragment implements FragmentUpdateListen for (MeasurementView measurement : viewMeasurementsListMonth) { measurement.setEditMode(STATISTIC); - measurement.updatePreferences(prefs); - if (measurement.isVisible()) { + if (measurement.getSettings().isEnabled()) { + measurement.setVisible(true); measurement.setPadding(-1, -1, -1, paddingBottom); if ((i % 2) == 0) { tableMonthAveragesLayoutColumnA.addView(measurement); diff --git a/android_app/app/src/main/java/com/health/openscale/gui/preferences/GeneralPreferences.java b/android_app/app/src/main/java/com/health/openscale/gui/preferences/GeneralPreferences.java index 1875f4a3..309401da 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/preferences/GeneralPreferences.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/preferences/GeneralPreferences.java @@ -23,7 +23,6 @@ import android.preference.MultiSelectListPreference; import android.preference.Preference; import android.preference.PreferenceFragment; import android.preference.PreferenceGroup; -import android.widget.Toast; import com.health.openscale.R; diff --git a/android_app/app/src/main/java/com/health/openscale/gui/preferences/MeasurementPreferences.java b/android_app/app/src/main/java/com/health/openscale/gui/preferences/MeasurementPreferences.java index 572127e6..8c7fb76e 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/preferences/MeasurementPreferences.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/preferences/MeasurementPreferences.java @@ -1,4 +1,5 @@ /* Copyright (C) 2014 olie.xdev +* Copyright (C) 2018 Erik Johansson * * 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 @@ -16,77 +17,46 @@ package com.health.openscale.gui.preferences; import android.app.AlertDialog; +import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; -import android.content.SharedPreferences; +import android.database.DataSetObserver; import android.graphics.Color; import android.graphics.Point; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.preference.CheckBoxPreference; -import android.preference.EditTextPreference; -import android.preference.ListPreference; -import android.preference.MultiSelectListPreference; import android.preference.Preference; import android.preference.PreferenceCategory; import android.preference.PreferenceFragment; import android.preference.PreferenceGroup; import android.preference.PreferenceManager; import android.preference.PreferenceScreen; -import android.preference.SwitchPreference; +import android.util.TypedValue; import android.view.DragEvent; +import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; +import android.widget.CompoundButton; +import android.widget.ListAdapter; +import android.widget.Switch; import android.widget.Toast; import com.health.openscale.R; import com.health.openscale.core.OpenScale; -import com.health.openscale.core.bodymetric.EstimatedFatMetric; -import com.health.openscale.core.bodymetric.EstimatedLBWMetric; -import com.health.openscale.core.bodymetric.EstimatedWaterMetric; import com.health.openscale.gui.views.MeasurementView; +import com.health.openscale.gui.views.WeightMeasurementView; import java.util.ArrayList; import java.util.List; -import java.util.Set; -public class MeasurementPreferences extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { +public class MeasurementPreferences extends PreferenceFragment { public static final String PREFERENCE_KEY_DELETE_ALL = "deleteAll"; - public static final String PREFERENCE_KEY_FAT = "fatEnable"; - public static final String PREFERENCE_KEY_FAT_PERCENTAGE = "fatPercentageEnable"; - public static final String PREFERENCE_KEY_WATER = "waterEnable"; - public static final String PREFERENCE_KEY_WATER_PERCENTAGE = "waterPercentageEnable"; - public static final String PREFERENCE_KEY_MUSCLE = "muscleEnable"; - public static final String PREFERENCE_KEY_MUSCLE_PERCENTAGE = "musclePercentageEnable"; - public static final String PREFERENCE_KEY_ESTIMATE_WATER = "estimateWaterEnable"; - public static final String PREFERENCE_KEY_ESTIMATE_WATER_FORMULA = "estimateWaterFormula"; - public static final String PREFERENCE_KEY_ESTIMATE_LBW = "estimateLBWEnable"; - public static final String PREFERENCE_KEY_ESTIMATE_LBW_FORMULA = "estimateLBWFormula"; - public static final String PREFERENCE_KEY_ESTIMATE_FAT = "estimateFatEnable"; - public static final String PREFERENCE_KEY_ESTIMATE_FAT_FORMULA = "estimateFatFormula"; - public static final String PREFERENCE_KEY_RESET_ORDER = "resetOrder"; - public static final String PREFERENCE_KEY_ORDER_CATEGORY = "orderCategory"; + public static final String PREFERENCE_KEY_MEASUREMENTS = "measurements"; private Preference deleteAll; - - private PreferenceScreen measurementOrderScreen; - private PreferenceCategory measurementOrderCategory; - - private CheckBoxPreference fatEnable; - private SwitchPreference fatPercentageEnable; - private CheckBoxPreference waterEnable; - private SwitchPreference waterPercentageEnable; - private CheckBoxPreference muscleEnable; - private SwitchPreference musclePercentageEnable; - - private CheckBoxPreference estimateWaterEnable; - private ListPreference estimateWaterFormula; - private CheckBoxPreference estimateLBWEnable; - private ListPreference estimateLBWFormula; - private CheckBoxPreference estimateFatEnable; - private ListPreference estimateFatFormula; + private PreferenceCategory measurementCategory; @Override public void onCreate(Bundle savedInstanceState) { @@ -94,204 +64,46 @@ public class MeasurementPreferences extends PreferenceFragment implements Shared addPreferencesFromResource(R.xml.measurement_preferences); - deleteAll = (Preference) findPreference(PREFERENCE_KEY_DELETE_ALL); + deleteAll = findPreference(PREFERENCE_KEY_DELETE_ALL); deleteAll.setOnPreferenceClickListener(new onClickListenerDeleteAll()); - final Context context = getActivity().getBaseContext(); - measurementOrderScreen = (PreferenceScreen) findPreference(MeasurementView.PREF_MEASUREMENT_ORDER); - - measurementOrderCategory = (PreferenceCategory) findPreference(PREFERENCE_KEY_ORDER_CATEGORY); - measurementOrderCategory.setOrderingAsAdded(true); + measurementCategory = (PreferenceCategory) findPreference(PREFERENCE_KEY_MEASUREMENTS); Preference resetOrder = findPreference(PREFERENCE_KEY_RESET_ORDER); resetOrder.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { - PreferenceManager.getDefaultSharedPreferences(context).edit() - .remove(MeasurementView.PREF_MEASUREMENT_ORDER).commit(); - measurementOrderCategory.removeAll(); - updateMeasurementOrderScreen(context, measurementOrderCategory); + PreferenceManager.getDefaultSharedPreferences(getActivity()).edit() + .remove(MeasurementView.PREF_MEASUREMENT_ORDER).apply(); + updateMeasurementPreferences(); return true; } }); - updateMeasurementOrderScreen(context, measurementOrderCategory); - - estimateWaterEnable = (CheckBoxPreference) findPreference(PREFERENCE_KEY_ESTIMATE_WATER); - estimateWaterFormula = (ListPreference) findPreference(PREFERENCE_KEY_ESTIMATE_WATER_FORMULA); - estimateLBWEnable = (CheckBoxPreference) findPreference(PREFERENCE_KEY_ESTIMATE_LBW); - estimateLBWFormula = (ListPreference) findPreference(PREFERENCE_KEY_ESTIMATE_LBW_FORMULA); - estimateFatEnable = (CheckBoxPreference) findPreference(PREFERENCE_KEY_ESTIMATE_FAT); - estimateFatFormula = (ListPreference) findPreference(PREFERENCE_KEY_ESTIMATE_FAT_FORMULA); - - fatEnable = (CheckBoxPreference) findPreference(PREFERENCE_KEY_FAT); - fatPercentageEnable = (SwitchPreference) findPreference(PREFERENCE_KEY_FAT_PERCENTAGE); - waterEnable = (CheckBoxPreference) findPreference(PREFERENCE_KEY_WATER); - waterPercentageEnable = (SwitchPreference) findPreference(PREFERENCE_KEY_WATER_PERCENTAGE); - muscleEnable = (CheckBoxPreference) findPreference(PREFERENCE_KEY_MUSCLE); - musclePercentageEnable = (SwitchPreference) findPreference(PREFERENCE_KEY_MUSCLE_PERCENTAGE); - - updateWaterListPreferences(); - updateLBWListPreferences(); - updateFatListPreferences(); - - initSummary(getPreferenceScreen()); + updateMeasurementPreferences(); } - private void updateMeasurementOrderScreen(Context context, PreferenceCategory category) { + private void updateMeasurementPreferences() { + measurementCategory.removeAll(); + List measurementViews = MeasurementView.getMeasurementList( - context, MeasurementView.DateTimeOrder.NONE); + getActivity(), MeasurementView.DateTimeOrder.NONE); + for (MeasurementView measurement : measurementViews) { - Preference preference = new MeasurementOrderPreference(context, category, measurement); - preference.setShouldDisableView(true); - preference.setEnabled(measurement.isVisible()); - category.addPreference(preference); - } - } + Preference preference = new MeasurementOrderPreference( + getActivity(), measurementCategory, measurement); + preference.setKey(measurement.getSettings().getEnabledKey()); + preference.setDefaultValue(measurement.getSettings().isEnabledIgnoringDependencies()); + preference.setPersistent(true); + preference.setEnabled(measurement.getSettings().areDependenciesEnabled()); - public void updateWaterListPreferences() { - ArrayList listEntries = new ArrayList(); - ArrayList listEntryValues = new ArrayList(); + Drawable icon = measurement.getIcon(); + icon.setColorFilter(measurement.getForegroundColor(), PorterDuff.Mode.SRC_IN); + preference.setIcon(icon); - for (EstimatedWaterMetric.FORMULA formulaWater : EstimatedWaterMetric.FORMULA.values()) { - EstimatedWaterMetric waterMetric = EstimatedWaterMetric.getEstimatedMetric(formulaWater); + preference.setTitle(measurement.getName()); - listEntries.add(waterMetric.getName()); - listEntryValues.add(formulaWater.toString()); - } - - estimateWaterFormula.setEntries(listEntries.toArray(new CharSequence[listEntries.size()])); - estimateWaterFormula.setEntryValues(listEntryValues.toArray(new CharSequence[listEntryValues.size()])); - } - - public void updateLBWListPreferences() { - ArrayList listEntries = new ArrayList(); - ArrayList listEntryValues = new ArrayList(); - - for (EstimatedLBWMetric.FORMULA formulaLBW : EstimatedLBWMetric.FORMULA.values()) { - EstimatedLBWMetric muscleMetric = EstimatedLBWMetric.getEstimatedMetric(formulaLBW); - - listEntries.add(muscleMetric.getName()); - listEntryValues.add(formulaLBW.toString()); - } - - estimateLBWFormula.setEntries(listEntries.toArray(new CharSequence[listEntries.size()])); - estimateLBWFormula.setEntryValues(listEntryValues.toArray(new CharSequence[listEntryValues.size()])); - } - - - public void updateFatListPreferences() { - ArrayList listEntries = new ArrayList(); - ArrayList listEntryValues = new ArrayList(); - - for (EstimatedFatMetric.FORMULA formulaFat : EstimatedFatMetric.FORMULA.values()) { - EstimatedFatMetric fatMetric = EstimatedFatMetric.getEstimatedMetric(formulaFat); - - listEntries.add(fatMetric.getName()); - listEntryValues.add(formulaFat.toString()); - } - - estimateFatFormula.setEntries(listEntries.toArray(new CharSequence[listEntries.size()])); - estimateFatFormula.setEntryValues(listEntryValues.toArray(new CharSequence[listEntryValues.size()])); - } - - - private void initSummary(Preference p) { - if (p instanceof PreferenceGroup) { - PreferenceGroup pGrp = (PreferenceGroup) p; - for (int i = 0; i < pGrp.getPreferenceCount(); i++) { - initSummary(pGrp.getPreference(i)); - } - } else { - updatePrefSummary(p); - } - } - - @Override - public void onResume() { - super.onResume(); - getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); - } - - @Override - public void onPause() { - getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); - super.onPause(); - } - - @Override - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - updatePrefSummary(findPreference(key)); - if (!key.equals(MeasurementView.PREF_MEASUREMENT_ORDER)) { - measurementOrderCategory.removeAll(); - updateMeasurementOrderScreen(getActivity().getApplicationContext(), measurementOrderCategory); - } - } - - private void updatePrefSummary(Preference p) { - if (estimateWaterEnable.isChecked()) { - estimateWaterFormula.setEnabled(true); - } else { - estimateWaterFormula.setEnabled(false); - } - - if (estimateLBWEnable.isChecked()) { - estimateLBWFormula.setEnabled(true); - } else { - estimateLBWFormula.setEnabled(false); - } - - if (estimateFatEnable.isChecked()) { - estimateFatFormula.setEnabled(true); - } else { - estimateFatFormula.setEnabled(false); - } - - if (fatEnable.isChecked()) { - fatPercentageEnable.setEnabled(true); - } else { - fatPercentageEnable.setEnabled(false); - } - - if (waterEnable.isChecked()) { - waterPercentageEnable.setEnabled(true); - } else { - waterPercentageEnable.setEnabled(false); - } - - if (muscleEnable.isChecked()) { - musclePercentageEnable.setEnabled(true); - } else { - musclePercentageEnable.setEnabled(false); - } - - estimateWaterFormula.setSummary(EstimatedWaterMetric.getEstimatedMetric(EstimatedWaterMetric.FORMULA.valueOf(estimateWaterFormula.getValue())).getName()); - estimateLBWFormula.setSummary(EstimatedLBWMetric.getEstimatedMetric(EstimatedLBWMetric.FORMULA.valueOf(estimateLBWFormula.getValue())).getName()); - estimateFatFormula.setSummary(EstimatedFatMetric.getEstimatedMetric(EstimatedFatMetric.FORMULA.valueOf(estimateFatFormula.getValue())).getName()); - - if (p instanceof EditTextPreference) { - EditTextPreference editTextPref = (EditTextPreference) p; - if (p.getTitle().toString().contains("assword")) - { - p.setSummary("******"); - } else { - p.setSummary(editTextPref.getText()); - } - } - - if (p instanceof MultiSelectListPreference) { - MultiSelectListPreference editMultiListPref = (MultiSelectListPreference) p; - - CharSequence[] entries = editMultiListPref.getEntries(); - CharSequence[] entryValues = editMultiListPref.getEntryValues(); - List currentEntries = new ArrayList<>(); - Set currentEntryValues = editMultiListPref.getValues(); - - for (int i = 0; i < entries.length; i++) - if (currentEntryValues.contains(entryValues[i])) - currentEntries.add(entries[i].toString()); - - p.setSummary(currentEntries.toString()); + measurementCategory.addPreference(preference); } } @@ -326,19 +138,25 @@ public class MeasurementPreferences extends PreferenceFragment implements Shared } } - private class MeasurementOrderPreference extends Preference { + private class MeasurementOrderPreference extends Preference + implements GestureDetector.OnGestureListener { PreferenceGroup parentGroup; MeasurementView measurement; + + GestureDetector gestureDetector; + View boundView; + Switch measurementSwitch; MeasurementOrderPreference(Context context, PreferenceGroup parent, MeasurementView measurementView) { super(context); parentGroup = parent; measurement = measurementView; - Drawable icon = measurement.getIcon(); - icon.setColorFilter(measurementView.getForegroundColor(), PorterDuff.Mode.SRC_IN); - setIcon(icon); - setTitle(measurement.getName()); + + gestureDetector = new GestureDetector(getContext(), this); + gestureDetector.setIsLongpressEnabled(true); + + setWidgetLayoutResource(R.layout.measurement_preferences_widget_layout); } public PreferenceGroup getParent() { @@ -350,46 +168,137 @@ public class MeasurementPreferences extends PreferenceFragment implements Shared super.onBindView(view); boundView = view; - onTouchClickListener touchClickListener = new onTouchClickListener(this); - view.setOnTouchListener(touchClickListener); - view.setOnLongClickListener(touchClickListener); + measurementSwitch = view.findViewById(R.id.measurement_switch); + if (measurement instanceof WeightMeasurementView) { + measurementSwitch.setVisibility(View.INVISIBLE); + } + else { + measurementSwitch.setChecked(measurement.getSettings().isEnabledIgnoringDependencies()); + measurementSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + persistBoolean(isChecked); + for (int i = 0; i < getParent().getPreferenceCount(); ++i) { + MeasurementOrderPreference preference = + (MeasurementOrderPreference) getParent().getPreference(i); + preference.setEnabled(preference.measurement.getSettings().areDependenciesEnabled()); + } + } + }); + } + + if (!measurement.hasExtraPreferences()) { + view.findViewById(R.id.measurement_switch_separator).setVisibility(View.GONE); + } + + TypedValue outValue = new TypedValue(); + getActivity().getTheme().resolveAttribute(R.attr.selectableItemBackground, outValue, true); + boundView.setBackgroundResource(outValue.resourceId); + + view.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + return gestureDetector.onTouchEvent(event); + } + }); view.setOnDragListener(new onDragListener()); } - private class onTouchClickListener implements View.OnTouchListener, View.OnLongClickListener { - MeasurementOrderPreference preference; - int x = 0; - int y = 0; + @Override + public boolean onDown(MotionEvent e) { + return isEnabled(); + } - onTouchClickListener(MeasurementOrderPreference pref) { - preference = pref; - } + @Override + public void onShowPress(MotionEvent e) { + boundView.setPressed(true); + } - @Override - public boolean onTouch(View view, MotionEvent event) { - if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { - x = Math.round(event.getX()); - y = Math.round(event.getY()); + @Override + public boolean onSingleTapUp(MotionEvent e) { + boundView.setPressed(false); + + if (!measurement.hasExtraPreferences()) { + if (measurementSwitch.getVisibility() == View.VISIBLE) { + measurementSwitch.toggle(); } - return false; + return true; } - @Override - public boolean onLongClick(View view) { - return view.startDrag(null, new dragShadowBuilder(view), preference, 0); + // Must be enabled to show extra preferences screen + if (!getPersistedBoolean(true)) { + return true; } - private class dragShadowBuilder extends View.DragShadowBuilder { - public dragShadowBuilder(View view) { - super(view); - } + final PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getActivity()); + // Register as an observer so that the loop to getItem() below will find the new + // preference screen added at the end. The add is done on another thread so we must + // wait for it to complete. + final ListAdapter adapter = getPreferenceScreen().getRootAdapter(); + adapter.registerDataSetObserver(new DataSetObserver() { @Override - public void onProvideShadowMetrics(Point outShadowSize, Point outShadowTouchPoint) { - super.onProvideShadowMetrics(outShadowSize, outShadowTouchPoint); - outShadowTouchPoint.set(x, y); + public void onChanged() { + adapter.unregisterDataSetObserver(this); + + // Simulate a click to have the preference screen open + for (int i = adapter.getCount() - 1; i >= 0; --i) { + if (adapter.getItem(i) == screen) { + getPreferenceScreen().onItemClick(null, null, i, 0); + break; + } + } + + // Remove the preference when the dialog is dismissed + Dialog dialog = screen.getDialog(); + dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { + @Override + public void onDismiss(DialogInterface dialog) { + screen.onDismiss(dialog); + getPreferenceScreen().removePreference(screen); + } + }); } + }); + + getPreferenceScreen().addPreference(screen); + measurement.prepareExtraPreferencesScreen(screen); + + return true; + } + + @Override + public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { + return false; + } + + @Override + public void onLongPress(MotionEvent event) { + int x = Math.round(event.getX()); + int y = Math.round(event.getY()); + + boundView.startDrag(null, new dragShadowBuilder(boundView, x, y), this, 0); + } + + private class dragShadowBuilder extends View.DragShadowBuilder { + private int x; + private int y; + public dragShadowBuilder(View view, int x, int y) { + super(view); + this.x = x; + this.y = y; } + + @Override + public void onProvideShadowMetrics(Point outShadowSize, Point outShadowTouchPoint) { + super.onProvideShadowMetrics(outShadowSize, outShadowTouchPoint); + outShadowTouchPoint.set(x, y); + } + } + + @Override + public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { + return false; } private class onDragListener implements View.OnDragListener { @@ -425,9 +334,6 @@ public class MeasurementPreferences extends PreferenceFragment implements Shared public boolean onDrag(View view, DragEvent event) { switch (event.getAction()) { case DragEvent.ACTION_DRAG_STARTED: - if (isDraggedView(view, event)) { - setTemporaryBackgroundColor(view, Color.GRAY); - } break; case DragEvent.ACTION_DRAG_ENTERED: if (!isDraggedView(view, event)) { @@ -475,6 +381,5 @@ public class MeasurementPreferences extends PreferenceFragment implements Shared return true; } } - } } diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/BMIMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/BMIMeasurementView.java index b37de99c..0083bfca 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/BMIMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/BMIMeasurementView.java @@ -16,7 +16,6 @@ package com.health.openscale.gui.views; import android.content.Context; -import android.content.SharedPreferences; import android.graphics.Color; import android.support.v4.content.ContextCompat; @@ -26,6 +25,7 @@ import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; public class BMIMeasurementView extends FloatMeasurementView { + public static final String KEY = "bmi"; public BMIMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_bmi), ContextCompat.getDrawable(context, R.drawable.ic_bmi)); @@ -33,12 +33,7 @@ public class BMIMeasurementView extends FloatMeasurementView { @Override public String getKey() { - return "bmi"; - } - - @Override - public void updatePreferences(SharedPreferences preferences) { - setVisible(preferences.getBoolean("weightEnable", true)); + return KEY; } @Override diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/BMRMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/BMRMeasurementView.java index 8845c832..2528c6f3 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/BMRMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/BMRMeasurementView.java @@ -16,7 +16,6 @@ package com.health.openscale.gui.views; import android.content.Context; -import android.content.SharedPreferences; import android.graphics.Color; import android.support.v4.content.ContextCompat; @@ -28,6 +27,7 @@ import com.health.openscale.core.evaluation.EvaluationSheet; import java.util.Locale; public class BMRMeasurementView extends FloatMeasurementView { + public static final String KEY = "bmr"; public BMRMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_bmr), ContextCompat.getDrawable(context, R.drawable.ic_bmr)); @@ -35,12 +35,7 @@ public class BMRMeasurementView extends FloatMeasurementView { @Override public String getKey() { - return "bmr"; - } - - @Override - public void updatePreferences(SharedPreferences preferences) { - setVisible(preferences.getBoolean("weightEnable", true)); + return KEY; } @Override diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/BoneMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/BoneMeasurementView.java index 24d52744..b9f52d9b 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/BoneMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/BoneMeasurementView.java @@ -16,7 +16,6 @@ package com.health.openscale.gui.views; import android.content.Context; -import android.content.SharedPreferences; import android.graphics.Color; import android.support.v4.content.ContextCompat; @@ -26,6 +25,7 @@ import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; public class BoneMeasurementView extends FloatMeasurementView { + public static final String KEY = "bone"; public BoneMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_bone), ContextCompat.getDrawable(context, R.drawable.ic_bone)); @@ -33,12 +33,7 @@ public class BoneMeasurementView extends FloatMeasurementView { @Override public String getKey() { - return "bone"; - } - - @Override - public void updatePreferences(SharedPreferences preferences) { - setVisible(preferences.getBoolean("boneEnable", false)); + return KEY; } @Override diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/CommentMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/CommentMeasurementView.java index c02ffd76..9bfa08f9 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/CommentMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/CommentMeasurementView.java @@ -16,7 +16,6 @@ package com.health.openscale.gui.views; import android.content.Context; -import android.content.SharedPreferences; import android.os.Bundle; import android.support.v4.content.ContextCompat; import android.text.InputType; @@ -27,6 +26,8 @@ import com.health.openscale.R; import com.health.openscale.core.datatypes.ScaleMeasurement; public class CommentMeasurementView extends MeasurementView { + public static final String KEY = "comment"; + private String comment; public CommentMeasurementView(Context context) { @@ -35,7 +36,7 @@ public class CommentMeasurementView extends MeasurementView { @Override public String getKey() { - return "comment"; + return KEY; } private void setValue(String newComment, boolean callListener) { @@ -55,6 +56,11 @@ public class CommentMeasurementView extends MeasurementView { measurement.setComment(comment); } + @Override + public void clearIn(ScaleMeasurement measurement) { + measurement.setComment(""); + } + @Override public void restoreState(Bundle state) { setValue(state.getString(getKey()), true); @@ -65,11 +71,6 @@ public class CommentMeasurementView extends MeasurementView { state.putString(getKey(), comment); } - @Override - public void updatePreferences(SharedPreferences preferences) { - // Empty - } - @Override public String getValueAsString() { return comment; diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/DateMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/DateMeasurementView.java index 1a32226a..06279188 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/DateMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/DateMeasurementView.java @@ -16,7 +16,6 @@ package com.health.openscale.gui.views; import android.content.Context; -import android.content.SharedPreferences; import android.os.Bundle; import android.support.v4.content.ContextCompat; import android.view.View; @@ -30,6 +29,8 @@ import java.util.Calendar; import java.util.Date; public class DateMeasurementView extends MeasurementView { + public static final String KEY = "date"; + private static DateFormat dateFormat = DateFormat.getDateInstance(); private Date date; @@ -39,10 +40,9 @@ public class DateMeasurementView extends MeasurementView { @Override public String getKey() { - return "date"; + return KEY; } - private void setValue(Date newDate, boolean callListener) { if (!newDate.equals(date)) { date = newDate; @@ -71,6 +71,11 @@ public class DateMeasurementView extends MeasurementView { measurement.setDateTime(target.getTime()); } + @Override + public void clearIn(ScaleMeasurement measurement) { + // Ignore + } + @Override public void restoreState(Bundle state) { setValue(new Date(state.getLong(getKey())), true); @@ -81,11 +86,6 @@ public class DateMeasurementView extends MeasurementView { state.putLong(getKey(), date.getTime()); } - @Override - public void updatePreferences(SharedPreferences preferences) { - // Empty - } - @Override public String getValueAsString() { return dateFormat.format(date); diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/FatMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/FatMeasurementView.java index 3e1d933b..6c1a479d 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/FatMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/FatMeasurementView.java @@ -16,19 +16,18 @@ package com.health.openscale.gui.views; import android.content.Context; -import android.content.SharedPreferences; import android.graphics.Color; +import android.preference.ListPreference; import android.support.v4.content.ContextCompat; import com.health.openscale.R; +import com.health.openscale.core.bodymetric.EstimatedFatMetric; import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; public class FatMeasurementView extends FloatMeasurementView { - - private boolean estimateFatEnable; - private boolean percentageEnable; + public static final String KEY = "fat"; public FatMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_fat), ContextCompat.getDrawable(context, R.drawable.ic_fat)); @@ -36,19 +35,12 @@ public class FatMeasurementView extends FloatMeasurementView { @Override public String getKey() { - return "fat"; + return KEY; } @Override - public void updatePreferences(SharedPreferences preferences) { - setVisible(preferences.getBoolean("fatEnable", true)); - estimateFatEnable = preferences.getBoolean("estimateFatEnable", false); - percentageEnable = preferences.getBoolean("fatPercentageEnable", true); - } - - @Override - protected boolean shouldConvertPercentageToAbsoluteWeight() { - return !percentageEnable; + protected boolean canConvertPercentageToAbsoluteWeight() { + return true; } @Override @@ -63,11 +55,11 @@ public class FatMeasurementView extends FloatMeasurementView { @Override public String getUnit() { - if (percentageEnable) { - return "%"; + if (shouldConvertPercentageToAbsoluteWeight()) { + return getScaleUser().getScaleUnit().toString(); } - return getScaleUser().getScaleUnit().toString(); + return "%"; } @Override @@ -81,8 +73,22 @@ public class FatMeasurementView extends FloatMeasurementView { } @Override - protected boolean isEstimationEnabled() { - return estimateFatEnable; + protected boolean isEstimationSupported() { return true; } + + @Override + protected void prepareEstimationFormulaPreference(ListPreference preference) { + String[] entries = new String[EstimatedFatMetric.FORMULA.values().length]; + String[] values = new String[entries.length]; + + int idx = 0; + for (EstimatedFatMetric.FORMULA formula : EstimatedFatMetric.FORMULA.values()) { + entries[idx] = EstimatedFatMetric.getEstimatedMetric(formula).getName(); + values[idx] = formula.name(); + ++idx; + } + + preference.setEntries(entries); + preference.setEntryValues(values); } @Override 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 81866ac0..2a7b8a32 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 @@ -17,10 +17,16 @@ package com.health.openscale.gui.views; import android.content.Context; +import android.database.DataSetObserver; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.os.Handler; +import android.preference.CheckBoxPreference; +import android.preference.ListPreference; +import android.preference.Preference; +import android.preference.PreferenceScreen; +import android.preference.SwitchPreference; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.style.ForegroundColorSpan; @@ -31,6 +37,7 @@ import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.LinearLayout; +import android.widget.ListAdapter; import android.widget.TableRow; import android.widget.TextView; @@ -227,18 +234,21 @@ public abstract class FloatMeasurementView extends MeasurementView { public abstract int getColor(); - protected boolean isEstimationEnabled() { - return false; - } + protected boolean isEstimationSupported() { return false; } + protected void prepareEstimationFormulaPreference(ListPreference preference) {} protected abstract EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value); private boolean useAutoValue() { - return isEstimationEnabled() && getMeasurementMode() == MeasurementViewMode.ADD; + return isEstimationSupported() + && getSettings().isEstimationEnabled() + && getMeasurementMode() == MeasurementViewMode.ADD; } + protected boolean canConvertPercentageToAbsoluteWeight() { return false; } protected boolean shouldConvertPercentageToAbsoluteWeight() { - return false; + return canConvertPercentageToAbsoluteWeight() + && !getSettings().isPercentageEnabled(); } private float makeAbsoluteWeight(float percentage) { @@ -312,6 +322,11 @@ public abstract class FloatMeasurementView extends MeasurementView { } } + @Override + public void clearIn(ScaleMeasurement measurement) { + setMeasurementValue(0.0f, measurement); + } + @Override public void restoreState(Bundle state) { setValue(state.getFloat(getKey()), previousValue, true); @@ -404,6 +419,70 @@ public abstract class FloatMeasurementView extends MeasurementView { showEvaluatorRow(show); } + @Override + public boolean hasExtraPreferences() { return true; } + + @Override + public void prepareExtraPreferencesScreen(PreferenceScreen screen) { + MeasurementViewSettings settings = getSettings(); + + CheckBoxPreference overview = new CheckBoxPreference(screen.getContext()); + overview.setKey(settings.getInOverviewGraphKey()); + overview.setTitle(R.string.label_include_in_overview_graph); + overview.setPersistent(true); + overview.setDefaultValue(settings.isInOverviewGraph()); + screen.addPreference(overview); + + if (canConvertPercentageToAbsoluteWeight()) { + SwitchPreference percentage = new SwitchPreference(screen.getContext()); + percentage.setKey(settings.getPercentageEnabledKey()); + percentage.setTitle(R.string.label_measurement_in_percent); + percentage.setPersistent(true); + percentage.setDefaultValue(settings.isPercentageEnabled()); + screen.addPreference(percentage); + } + + if (isEstimationSupported()) { + final CheckBoxPreference estimate = new CheckBoxPreference(screen.getContext()); + estimate.setKey(settings.getEstimationEnabledKey()); + estimate.setTitle(R.string.label_estimate_measurement); + estimate.setPersistent(true); + estimate.setDefaultValue(settings.isEstimationEnabled()); + screen.addPreference(estimate); + + final ListPreference formula = new ListPreference(screen.getContext()); + formula.setKey(settings.getEstimationFormulaKey()); + formula.setTitle(R.string.label_estimation_formula); + formula.setPersistent(true); + formula.setDefaultValue(settings.getEstimationFormula()); + prepareEstimationFormulaPreference(formula); + formula.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { + @Override + public boolean onPreferenceChange(Preference preference, Object newValue) { + ListPreference list = (ListPreference) preference; + int idx = list.findIndexOfValue((String) newValue); + if (idx == -1) { + return false; + } + preference.setSummary(list.getEntries()[idx]); + return true; + } + }); + + final ListAdapter adapter = screen.getRootAdapter(); + adapter.registerDataSetObserver(new DataSetObserver() { + @Override + public void onChanged() { + adapter.unregisterDataSetObserver(this); + + formula.setDependency(estimate.getKey()); + formula.setSummary(formula.getEntry()); + } + }); + screen.addPreference(formula); + } + } + private float validateAndGetInput(View view) { EditText editText = view.findViewById(R.id.float_input); String text = editText.getText().toString(); diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/HipMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/HipMeasurementView.java index b2bf2263..09f78e42 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/HipMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/HipMeasurementView.java @@ -16,7 +16,6 @@ package com.health.openscale.gui.views; import android.content.Context; -import android.content.SharedPreferences; import android.graphics.Color; import android.support.v4.content.ContextCompat; @@ -26,6 +25,7 @@ import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; public class HipMeasurementView extends FloatMeasurementView { + public static final String KEY = "hip"; public HipMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_hip), ContextCompat.getDrawable(context, R.drawable.ic_hip)); @@ -33,12 +33,7 @@ public class HipMeasurementView extends FloatMeasurementView { @Override public String getKey() { - return "hip"; - } - - @Override - public void updatePreferences(SharedPreferences preferences) { - setVisible(preferences.getBoolean("hipEnable", false)); + return KEY; } @Override diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/LBWMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/LBWMeasurementView.java index 25eeda0e..6addf07c 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/LBWMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/LBWMeasurementView.java @@ -16,18 +16,18 @@ package com.health.openscale.gui.views; import android.content.Context; -import android.content.SharedPreferences; import android.graphics.Color; +import android.preference.ListPreference; import android.support.v4.content.ContextCompat; import com.health.openscale.R; +import com.health.openscale.core.bodymetric.EstimatedLBWMetric; import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; public class LBWMeasurementView extends FloatMeasurementView { - - private boolean estimateLBWEnable; + public static final String KEY = "lbw"; public LBWMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_lbw), ContextCompat.getDrawable(context, R.drawable.ic_lbw)); @@ -35,13 +35,7 @@ public class LBWMeasurementView extends FloatMeasurementView { @Override public String getKey() { - return "lbw"; - } - - @Override - public void updatePreferences(SharedPreferences preferences) { - setVisible(preferences.getBoolean("lbwEnable", false)); - estimateLBWEnable = preferences.getBoolean("estimateLBWEnable", false); + return KEY; } @Override @@ -70,8 +64,22 @@ public class LBWMeasurementView extends FloatMeasurementView { } @Override - protected boolean isEstimationEnabled() { - return estimateLBWEnable; + protected boolean isEstimationSupported() { return true; } + + @Override + protected void prepareEstimationFormulaPreference(ListPreference preference) { + String[] entries = new String[EstimatedLBWMetric.FORMULA.values().length]; + String[] values = new String[entries.length]; + + int idx = 0; + for (EstimatedLBWMetric.FORMULA formula : EstimatedLBWMetric.FORMULA.values()) { + entries[idx] = EstimatedLBWMetric.getEstimatedMetric(formula).getName(); + values[idx] = formula.name(); + ++idx; + } + + preference.setEntries(entries); + preference.setEntryValues(values); } @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 eaf2b306..2f01024f 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 @@ -23,6 +23,7 @@ import android.graphics.Color; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.preference.PreferenceManager; +import android.preference.PreferenceScreen; import android.support.v4.content.ContextCompat; import android.text.SpannableStringBuilder; import android.text.TextUtils; @@ -30,7 +31,6 @@ import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; -import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.ImageView; @@ -61,6 +61,8 @@ public abstract class MeasurementView extends TableLayout { public static String PREF_MEASUREMENT_ORDER = "measurementOrder"; + private MeasurementViewSettings settings; + private TableRow measurementRow; private ImageView iconView; private TextView nameView; @@ -75,13 +77,11 @@ public abstract class MeasurementView extends TableLayout { private MeasurementViewUpdateListener updateListener = null; private MeasurementViewMode measurementMode = VIEW; - private static SharedPreferences prefs; - private boolean updateViews = true; public MeasurementView(Context context, String text, Drawable icon) { super(context); - prefs = PreferenceManager.getDefaultSharedPreferences(context); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); String app_theme = prefs.getString("app_theme", "Light"); if (app_theme.equals("Dark")) { @@ -96,7 +96,10 @@ public abstract class MeasurementView extends TableLayout { public enum DateTimeOrder { FIRST, LAST, NONE } - public static final List getMeasurementList(Context context, DateTimeOrder dateTimeOrder) { + public static final List getMeasurementList( + Context context, DateTimeOrder dateTimeOrder) { + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + final List sorted = new ArrayList<>(); if (dateTimeOrder == DateTimeOrder.FIRST) { sorted.add(new DateMeasurementView(context)); @@ -145,7 +148,7 @@ public abstract class MeasurementView extends TableLayout { } for (MeasurementView measurement : sorted) { - measurement.updatePreferences(prefs); + measurement.setVisible(measurement.getSettings().isEnabled()); } return sorted; @@ -243,14 +246,21 @@ public abstract class MeasurementView extends TableLayout { public abstract String getKey(); + public MeasurementViewSettings getSettings() { + if (settings == null) { + settings = new MeasurementViewSettings( + PreferenceManager.getDefaultSharedPreferences(getContext()), getKey()); + } + return settings; + } + public abstract void loadFrom(ScaleMeasurement measurement, ScaleMeasurement previousMeasurement); public abstract void saveTo(ScaleMeasurement measurement); + public abstract void clearIn(ScaleMeasurement measurement); public abstract void restoreState(Bundle state); public abstract void saveState(Bundle state); - public abstract void updatePreferences(SharedPreferences preferences); - public CharSequence getName() { return nameView.getText(); } public abstract String getValueAsString(); public void appendDiffValue(SpannableStringBuilder builder) { } @@ -329,7 +339,7 @@ public abstract class MeasurementView extends TableLayout { showEvaluatorRow(false); } - protected void setVisible(boolean isVisible) { + public void setVisible(boolean isVisible) { if (isVisible) { measurementRow.setVisibility(View.VISIBLE); } else { @@ -381,6 +391,9 @@ public abstract class MeasurementView extends TableLayout { return openScale.getSelectedScaleUser(); } + public boolean hasExtraPreferences() { return false; } + public void prepareExtraPreferencesScreen(PreferenceScreen screen) { }; + protected abstract View getInputView(); protected abstract boolean validateAndSetInput(View view); @@ -480,4 +493,3 @@ public abstract class MeasurementView extends TableLayout { } } } - 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 new file mode 100644 index 00000000..22c2af43 --- /dev/null +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementViewSettings.java @@ -0,0 +1,183 @@ +/* Copyright (C) 2018 Erik Johansson +* +* 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.SharedPreferences; + +import com.health.openscale.core.bodymetric.EstimatedFatMetric; +import com.health.openscale.core.bodymetric.EstimatedLBWMetric; +import com.health.openscale.core.bodymetric.EstimatedWaterMetric; + +public class MeasurementViewSettings { + private SharedPreferences preferences; + private String key; + + private static final String PREFERENCE_SUFFIX_ENABLE = "Enable"; + private static final String PREFERENCE_SUFFIX_IN_OVERVIEW_GRAPH = "InOverviewGraph"; + private static final String PREFERENCE_SUFFIX_IN_GRAPH = "InGraph"; + private static final String PREFERENCE_SUFFIX_PERCENTAGE_ENABLE = "PercentageEnable"; + private static final String PREFERENCE_SUFFIX_ESTIMATE_ENABLE = "EstimateEnable"; + private static final String PREFERENCE_SUFFIX_ESTIMATE_FORMULA = "EstimateFormula"; + + public MeasurementViewSettings(SharedPreferences prefs, String key) { + preferences = prefs; + this.key = key; + } + + private String getPreferenceKey(String suffix) { + return key + suffix; + } + + public String getEnabledKey() { + return getPreferenceKey(PREFERENCE_SUFFIX_ENABLE); + } + + public boolean isEnabledIgnoringDependencies() { + boolean defaultValue; + switch (key) { + case WeightMeasurementView.KEY: + // Weight can't be disabled + return true; + case LBWMeasurementView.KEY: + case BoneMeasurementView.KEY: + case WaistMeasurementView.KEY: + case HipMeasurementView.KEY: + defaultValue = false; + break; + default: + defaultValue = true; + break; + } + return preferences.getBoolean(getEnabledKey(), defaultValue); + } + + private boolean isDependencyEnabled(String dependencyKey) { + // Weight can't be disabled + if (dependencyKey.equals(WeightMeasurementView.KEY)) { + return true; + } + + return (new MeasurementViewSettings(preferences, dependencyKey)).isEnabled(); + } + + public boolean areDependenciesEnabled() { + switch (key) { + case BMIMeasurementView.KEY: + case BMRMeasurementView.KEY: + return isDependencyEnabled(WeightMeasurementView.KEY); + + // Requires weight as they are stored as percentage of it + case FatMeasurementView.KEY: + case MuscleMeasurementView.KEY: + case WaterMeasurementView.KEY: + return isDependencyEnabled(WeightMeasurementView.KEY); + + case WHRMeasurementView.KEY: + return isDependencyEnabled(HipMeasurementView.KEY) + && isDependencyEnabled(WaistMeasurementView.KEY); + + case WHtRMeasurementView.KEY: + return isDependencyEnabled(WaistMeasurementView.KEY); + } + return true; + } + + public boolean isEnabled() { + return isEnabledIgnoringDependencies() && areDependenciesEnabled(); + } + + public String getInOverviewGraphKey() { + return getPreferenceKey(PREFERENCE_SUFFIX_IN_OVERVIEW_GRAPH); + } + + public boolean isInOverviewGraph() { + boolean defaultValue; + switch (key) { + case BMRMeasurementView.KEY: + defaultValue = false; + break; + default: + defaultValue = true; + break; + } + return preferences.getBoolean(getInOverviewGraphKey(), defaultValue); + } + + public String getInGraphKey() { + return getPreferenceKey(PREFERENCE_SUFFIX_IN_GRAPH); + } + + public boolean isInGraph() { + return preferences.getBoolean(getInGraphKey(), true); + } + + public String getPercentageEnabledKey() { + return getPreferenceKey(PREFERENCE_SUFFIX_PERCENTAGE_ENABLE); + } + + public boolean isPercentageEnabled() { + return preferences.getBoolean(getPercentageEnabledKey(), true); + } + + public String getEstimationEnabledKey() { + switch (key) { + case FatMeasurementView.KEY: + return "estimateFatEnable"; + case LBWMeasurementView.KEY: + return "estimateLBWEnable"; + case WaterMeasurementView.KEY: + return "estimateWaterEnable"; + } + return getPreferenceKey(PREFERENCE_SUFFIX_ESTIMATE_ENABLE); + } + + public boolean isEstimationEnabled() { + return preferences.getBoolean(getEstimationEnabledKey(), false); + } + + public String getEstimationFormulaKey() { + switch (key) { + case FatMeasurementView.KEY: + return "estimateFatFormula"; + case LBWMeasurementView.KEY: + return "estimateLBWFormula"; + case WaterMeasurementView.KEY: + return "estimateWaterFormula"; + } + return getPreferenceKey(PREFERENCE_SUFFIX_ESTIMATE_FORMULA); + } + + public String getEstimationFormula() { + String defaultValue; + switch (key) { + case FatMeasurementView.KEY: + defaultValue = EstimatedFatMetric.FORMULA.BF_GALLAGHER.name(); + break; + case LBWMeasurementView.KEY: + defaultValue = EstimatedLBWMetric.FORMULA.LBW_HUME.name(); + break; + case WaterMeasurementView.KEY: + defaultValue = EstimatedWaterMetric.FORMULA.TBW_LEESONGKIM.name(); + break; + default: + defaultValue = ""; + break; + } + + return preferences.getString(getEstimationFormulaKey(), defaultValue); + } +} diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/MuscleMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/MuscleMeasurementView.java index b18f47fa..4b2d7cd7 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/MuscleMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/MuscleMeasurementView.java @@ -16,7 +16,6 @@ package com.health.openscale.gui.views; import android.content.Context; -import android.content.SharedPreferences; import android.graphics.Color; import android.support.v4.content.ContextCompat; @@ -26,8 +25,7 @@ import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; public class MuscleMeasurementView extends FloatMeasurementView { - - private boolean percentageEnable; + public static final String KEY = "muscle"; public MuscleMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_muscle), ContextCompat.getDrawable(context, R.drawable.ic_muscle)); @@ -35,18 +33,12 @@ public class MuscleMeasurementView extends FloatMeasurementView { @Override public String getKey() { - return "muscle"; + return KEY; } @Override - public void updatePreferences(SharedPreferences preferences) { - setVisible(preferences.getBoolean("muscleEnable", true)); - percentageEnable = preferences.getBoolean("musclePercentageEnable", true); - } - - @Override - protected boolean shouldConvertPercentageToAbsoluteWeight() { - return !percentageEnable; + protected boolean canConvertPercentageToAbsoluteWeight() { + return true; } @Override @@ -61,11 +53,11 @@ public class MuscleMeasurementView extends FloatMeasurementView { @Override public String getUnit() { - if (percentageEnable) { - return "%"; + if (shouldConvertPercentageToAbsoluteWeight()) { + return getScaleUser().getScaleUnit().toString(); } - return getScaleUser().getScaleUnit().toString(); + return "%"; } @Override diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/TimeMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/TimeMeasurementView.java index bc59c518..15331547 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/TimeMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/TimeMeasurementView.java @@ -16,7 +16,6 @@ package com.health.openscale.gui.views; import android.content.Context; -import android.content.SharedPreferences; import android.os.Bundle; import android.support.v4.content.ContextCompat; import android.view.View; @@ -30,6 +29,8 @@ import java.util.Calendar; import java.util.Date; public class TimeMeasurementView extends MeasurementView { + public static final String KEY = "time"; + private DateFormat timeFormat; private Date time; @@ -40,7 +41,7 @@ public class TimeMeasurementView extends MeasurementView { @Override public String getKey() { - return "time"; + return KEY; } private void setValue(Date newTime, boolean callListener) { @@ -73,6 +74,11 @@ public class TimeMeasurementView extends MeasurementView { measurement.setDateTime(target.getTime()); } + @Override + public void clearIn(ScaleMeasurement measurement) { + // Ignore + } + @Override public void restoreState(Bundle state) { setValue(new Date(state.getLong(getKey())), true); @@ -83,11 +89,6 @@ public class TimeMeasurementView extends MeasurementView { state.putLong(getKey(), time.getTime()); } - @Override - public void updatePreferences(SharedPreferences preferences) { - // Empty - } - @Override public String getValueAsString() { return timeFormat.format(time); diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/WHRMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/WHRMeasurementView.java index 5cdcb904..2c9c5919 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/WHRMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/WHRMeasurementView.java @@ -16,7 +16,6 @@ package com.health.openscale.gui.views; import android.content.Context; -import android.content.SharedPreferences; import android.graphics.Color; import android.support.v4.content.ContextCompat; @@ -26,6 +25,7 @@ import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; public class WHRMeasurementView extends FloatMeasurementView { + public static final String KEY = "whr"; public WHRMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_whr), ContextCompat.getDrawable(context, R.drawable.ic_whr)); @@ -33,13 +33,7 @@ public class WHRMeasurementView extends FloatMeasurementView { @Override public String getKey() { - return "whr"; - } - - @Override - public void updatePreferences(SharedPreferences preferences) { - setVisible(preferences.getBoolean("hipEnable", false) - && preferences.getBoolean("waistEnable", false)); + return KEY; } @Override diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/WHtRMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/WHtRMeasurementView.java index b60c05ac..f9e118e6 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/WHtRMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/WHtRMeasurementView.java @@ -16,7 +16,6 @@ package com.health.openscale.gui.views; import android.content.Context; -import android.content.SharedPreferences; import android.graphics.Color; import android.support.v4.content.ContextCompat; @@ -26,6 +25,7 @@ import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; public class WHtRMeasurementView extends FloatMeasurementView { + public static final String KEY = "whtr"; public WHtRMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_whtr), ContextCompat.getDrawable(context, R.drawable.ic_whtr)); @@ -33,12 +33,7 @@ public class WHtRMeasurementView extends FloatMeasurementView { @Override public String getKey() { - return "whtr"; - } - - @Override - public void updatePreferences(SharedPreferences preferences) { - setVisible(preferences.getBoolean("waistEnable", false)); + return KEY; } @Override diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/WaistMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/WaistMeasurementView.java index 9a776fb0..aaf827f2 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/WaistMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/WaistMeasurementView.java @@ -16,7 +16,6 @@ package com.health.openscale.gui.views; import android.content.Context; -import android.content.SharedPreferences; import android.graphics.Color; import android.support.v4.content.ContextCompat; @@ -26,6 +25,7 @@ import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; public class WaistMeasurementView extends FloatMeasurementView { + public static final String KEY = "waist"; public WaistMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_waist), ContextCompat.getDrawable(context, R.drawable.ic_waist)); @@ -33,12 +33,7 @@ public class WaistMeasurementView extends FloatMeasurementView { @Override public String getKey() { - return "waist"; - } - - @Override - public void updatePreferences(SharedPreferences preferences) { - setVisible(preferences.getBoolean("waistEnable", false)); + return KEY; } @Override diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/WaterMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/WaterMeasurementView.java index 53f419f7..6f091f1b 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/WaterMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/WaterMeasurementView.java @@ -16,19 +16,18 @@ package com.health.openscale.gui.views; import android.content.Context; -import android.content.SharedPreferences; import android.graphics.Color; +import android.preference.ListPreference; import android.support.v4.content.ContextCompat; import com.health.openscale.R; +import com.health.openscale.core.bodymetric.EstimatedWaterMetric; import com.health.openscale.core.datatypes.ScaleMeasurement; import com.health.openscale.core.evaluation.EvaluationResult; import com.health.openscale.core.evaluation.EvaluationSheet; public class WaterMeasurementView extends FloatMeasurementView { - - private boolean estimateWaterEnable; - private boolean percentageEnable; + public static final String KEY = "water"; public WaterMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_water), ContextCompat.getDrawable(context, R.drawable.ic_water)); @@ -36,19 +35,12 @@ public class WaterMeasurementView extends FloatMeasurementView { @Override public String getKey() { - return "water"; + return KEY; } @Override - public void updatePreferences(SharedPreferences preferences) { - setVisible(preferences.getBoolean("waterEnable", true)); - estimateWaterEnable = preferences.getBoolean("estimateWaterEnable", false); - percentageEnable = preferences.getBoolean("waterPercentageEnable", true); - } - - @Override - protected boolean shouldConvertPercentageToAbsoluteWeight() { - return !percentageEnable; + protected boolean canConvertPercentageToAbsoluteWeight() { + return true; } @Override @@ -63,11 +55,11 @@ public class WaterMeasurementView extends FloatMeasurementView { @Override public String getUnit() { - if (percentageEnable) { - return "%"; + if (shouldConvertPercentageToAbsoluteWeight()) { + return getScaleUser().getScaleUnit().toString(); } - return getScaleUser().getScaleUnit().toString(); + return "%"; } @Override @@ -81,8 +73,22 @@ public class WaterMeasurementView extends FloatMeasurementView { } @Override - protected boolean isEstimationEnabled() { - return estimateWaterEnable; + protected boolean isEstimationSupported() { return true; } + + @Override + protected void prepareEstimationFormulaPreference(ListPreference preference) { + String[] entries = new String[EstimatedWaterMetric.FORMULA.values().length]; + String[] values = new String[entries.length]; + + int idx = 0; + for (EstimatedWaterMetric.FORMULA formula : EstimatedWaterMetric.FORMULA.values()) { + entries[idx] = EstimatedWaterMetric.getEstimatedMetric(formula).getName(); + values[idx] = formula.name(); + ++idx; + } + + preference.setEntries(entries); + preference.setEntryValues(values); } @Override diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/WeightMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/WeightMeasurementView.java index b70febcb..f99d8312 100644 --- a/android_app/app/src/main/java/com/health/openscale/gui/views/WeightMeasurementView.java +++ b/android_app/app/src/main/java/com/health/openscale/gui/views/WeightMeasurementView.java @@ -16,7 +16,6 @@ package com.health.openscale.gui.views; import android.content.Context; -import android.content.SharedPreferences; import android.graphics.Color; import android.support.v4.content.ContextCompat; @@ -27,6 +26,7 @@ import com.health.openscale.core.evaluation.EvaluationSheet; import com.health.openscale.core.utils.Converters; public class WeightMeasurementView extends FloatMeasurementView { + public static final String KEY = "weight"; public WeightMeasurementView(Context context) { super(context, context.getResources().getString(R.string.label_weight), ContextCompat.getDrawable(context, R.drawable.ic_weight)); @@ -34,12 +34,7 @@ public class WeightMeasurementView extends FloatMeasurementView { @Override public String getKey() { - return "weight"; - } - - @Override - public void updatePreferences(SharedPreferences preferences) { - setVisible(preferences.getBoolean("weightEnable", true)); + return KEY; } @Override diff --git a/android_app/app/src/main/res/layout/measurement_preferences_widget_layout.xml b/android_app/app/src/main/res/layout/measurement_preferences_widget_layout.xml new file mode 100644 index 00000000..3bef399a --- /dev/null +++ b/android_app/app/src/main/res/layout/measurement_preferences_widget_layout.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/android_app/app/src/main/res/values-ca/strings.xml b/android_app/app/src/main/res/values-ca/strings.xml index 14864e3a..54ea422a 100644 --- a/android_app/app/src/main/res/values-ca/strings.xml +++ b/android_app/app/src/main/res/values-ca/strings.xml @@ -113,21 +113,12 @@ Confirmació d\'eliminació - Estimació d\'aigua corporal - Estimació de massa corporal magra - Estimació de greix corporal - - Mostreu - Estimació de mètriques corporals Base de dades de mesures Responsable Pàgina Web Llicència - Fórmula d\'aigua corporal - Fórmula de massa corporal magra - Fórmula de greix corporal automàtic Recordatori diff --git a/android_app/app/src/main/res/values-cs/strings.xml b/android_app/app/src/main/res/values-cs/strings.xml index c46fdee5..1fae820d 100644 --- a/android_app/app/src/main/res/values-cs/strings.xml +++ b/android_app/app/src/main/res/values-cs/strings.xml @@ -29,10 +29,6 @@ Komentář Chytré přiřazení uživatele - Tělesný tuk v % - Tělesná voda v % - Svalová hmota v % - %d den %d dny @@ -100,10 +96,6 @@ Potvrzení smazání - Odhadnout vodu v těle - Odhadnout tělesný tuk - - Zobrazit Správce Webové stránky Licence diff --git a/android_app/app/src/main/res/values-de/strings.xml b/android_app/app/src/main/res/values-de/strings.xml index 3e5d99f3..08e71600 100644 --- a/android_app/app/src/main/res/values-de/strings.xml +++ b/android_app/app/src/main/res/values-de/strings.xml @@ -122,15 +122,7 @@ Maximale Anzahl gleichzeitiger Benutzer erreicht Bitte steigen Sie barfuß auf die Waage zur Referenzmessung auto - Körpermetriken abschätzen - Anzeige Messwertedatenbank - Körperfettschätzung - Körperfettformel - Körperwasserschätzung - Körperwasserformel - Fettfreie Körpermassenschätzung - Fettfreie Körpermassenformel Fettfreie Körpermasse Lizenz Hauptentwickler @@ -140,9 +132,6 @@ schließen Kein Bluetooth Gerät ausgewählt Messung mit gleichen Datum und Uhrzeit exisitiert bereits - Körperfett in % - Wasseranteil in % - Muskelanteil in % Gefällt Dir openScale? Wie wäre es dann mit einer Bewertung bei GooglePlay oder bei GitHub? Ja! @@ -174,7 +163,6 @@ openScale benötigt die Erlaubnis, auf den ungefähren Standort zuzugreifen, um nach Bluetooth-Geräten suchen zu können. Information Weiter - Messwert Reihenfolge Halten Sie die Taste gedrückt, um die Reihenfolge zu ändern Default Reihenfolge wiederherstellen openScale CSV Datenexport (%s) diff --git a/android_app/app/src/main/res/values-es/strings.xml b/android_app/app/src/main/res/values-es/strings.xml index f9f6b672..b9677d86 100644 --- a/android_app/app/src/main/res/values-es/strings.xml +++ b/android_app/app/src/main/res/values-es/strings.xml @@ -113,21 +113,12 @@ Confirmación de borrado - Estimación de agua corporal - Estimación de masa corporal magra - Estimación de grasa coporal - - Mostrar - Estimación de métricas corporales Base de datos de mediciones Responsable Página Web Licencia - Fórmula de agua corporal - Fórmula de masa corporal magra - Fórmula de grasa corporal automático Recordatorio @@ -169,10 +160,6 @@ Compartir - Grasa corporal en % - Porcentaje de agua en % - Porcentaje muscular en % - Error: el nombre de usuario tiene que tener al menos 3 carácteres "No hay dispositivo Bluetooth seleccionado " Medición con al misma fecha y hora ya existe diff --git a/android_app/app/src/main/res/values-nl/strings.xml b/android_app/app/src/main/res/values-nl/strings.xml index 8950dd40..78fa1300 100644 --- a/android_app/app/src/main/res/values-nl/strings.xml +++ b/android_app/app/src/main/res/values-nl/strings.xml @@ -115,21 +115,12 @@ Bevestiging verwijderen - Geschat vochtmassa - Geschat vetvrije massa - Geschat vetmassa - - Scherm - Schatting Lichaamssamenstelling Metingen database Beheerder Website Licentie - Formule vochtmassa - Formule vetvrije massa - Formule vetmassa auto Herinnering @@ -169,10 +160,6 @@ Delen openScale CSV data exporteren (%s) - Lichaamsvet in % - Lichaamsvocht in % - Spiermassa in % - Fout: Gebruikersnaam dient minimaal 3 karakters lang te zijn Geen Bluetooth apparaat geselecteerd Meting met een zelfde datum en tijd bestaat al @@ -214,7 +201,6 @@ openScale heeft toestemming nodig tot uw locatie om te kunnen zoeken naar Bluetooth apparaten Informatie Volgende - Meting volgorde Indrukken en vasthouden om opnieuw in te delen Stel standaard volgorde in Vorige export \"%s\" overschrijven? diff --git a/android_app/app/src/main/res/values-pl/strings.xml b/android_app/app/src/main/res/values-pl/strings.xml index d7e468ff..6b9db77c 100644 --- a/android_app/app/src/main/res/values-pl/strings.xml +++ b/android_app/app/src/main/res/values-pl/strings.xml @@ -38,11 +38,7 @@ Stosunek obwodu talii do obwodu bioder Masa kostna Inteligente przypisywanie użytkowników - - Tkanka tłusczowa w % - Woda w organizmie w % - Masa mięśniowa w % - + %d dni @@ -126,21 +122,12 @@ Potwierdzenie usnięcia - Wznaczaj procent wody w organizmie - Wyznaczaj beztłuszczową masę ciała - Wyznaczaj procent tkanki tłuszczowej - - Wyświetl - Wyznaczanie wskaźników dla ciała Baza pomiarów Opiekun Strona internetowa Licencja - - Formuła wyznaczania wody w organizmie - Formuła wyznaczania beztłuszczowej masy ciała - Formuła wyznaczania tkanki tłuszczowej + auto Motyw @@ -205,7 +192,6 @@ openScale requires permission to access the coarse location to search for Bluetooth devices Informacje Następny - Kolejność pomiarów Naciśnij i przytrzymaj by zmienić kolejność Ustaw domyślną kolejność Nadpisać poprzedni eksport \"%s\"? diff --git a/android_app/app/src/main/res/values-sk/strings.xml b/android_app/app/src/main/res/values-sk/strings.xml index 7ec932fc..331f25a4 100644 --- a/android_app/app/src/main/res/values-sk/strings.xml +++ b/android_app/app/src/main/res/values-sk/strings.xml @@ -129,20 +129,13 @@ Zdieľať openScale CSV export údajov (%s) - Telesný tuk v % - Voda v tele v % - Svalstvo v % - Chyba: používateľské meno musí obsahovať minimálne 3 znaky Nevybrali ste žiadne bluetooth zariadenie meranie s rovnakým dátumom a časom už existuje Zlúčiť s posledným meraním Hľadanie bluetooth váh sa dokončilo - Odhadnúť vodu v tele - Odhadnúť telesný tuk - Zobraziť Databáza meraní Správca @@ -185,7 +178,6 @@ openScale vyžaduje povolenie prístupu k približnej polohe na vyhľadávanie bluetooth zariadení Informácie Ďalej - Radenie meraní Stlačte a podržte pre zmenu radenia Nastaviť predvolené radenie Prepísať predchádzajúci export \"%s\"? diff --git a/android_app/app/src/main/res/values-sv/strings.xml b/android_app/app/src/main/res/values-sv/strings.xml index 2a9a913f..f5dd1a18 100644 --- a/android_app/app/src/main/res/values-sv/strings.xml +++ b/android_app/app/src/main/res/values-sv/strings.xml @@ -109,16 +109,8 @@ Etikett på datapunkt Punkt på datapunkt Borttagningsbekräftelse - Estimera kroppsvatten - Estimera fettfri kroppsvikt - Estimera kroppsfett - Visa - Uppskatta mätvärden Mätningsdatabas Utvecklare - Formel för kroppsvatten - Formel för fettfri kroppsvikt - Formel för kroppsfett auto Påminnelse Meddelandetext @@ -138,9 +130,6 @@ Mäter vikt: %.2f öppna stäng - Kroppsfett i % - Muskler i % - Kroppsvatten i % Ingen Bluetooth-enhet vald mätning med samma datum och tid existerar redan Allmänt @@ -180,7 +169,6 @@ openScale CSV dataexport (%s) Nästa - Mätordning Tryck och håll för att ändra ordning Ställ in standardordning diff --git a/android_app/app/src/main/res/values-tr/strings.xml b/android_app/app/src/main/res/values-tr/strings.xml index a488c717..b037cacc 100644 --- a/android_app/app/src/main/res/values-tr/strings.xml +++ b/android_app/app/src/main/res/values-tr/strings.xml @@ -111,21 +111,12 @@ Delete confirmation - Tahmini Vücüt suyu oraný - Tahmini Yaðsýz vücüt oraný - Tahmini Vücüt yað oraný - - Display - Vücüt ölçütleri tahmini Ölçüm veritabaný Maintainer Websitesi Lisan - Vücüt oraný hesaplama formulü - Yað oraný hesaplama formulü - Vücut yaðý formülü otomatik Hatýrlatma diff --git a/android_app/app/src/main/res/values/strings.xml b/android_app/app/src/main/res/values/strings.xml index ac8ab77c..9160ad12 100644 --- a/android_app/app/src/main/res/values/strings.xml +++ b/android_app/app/src/main/res/values/strings.xml @@ -40,10 +40,6 @@ Bone mass Smart User assignment - Body fat in % - Body water in % - Muscle in % - %d day %d days @@ -127,21 +123,12 @@ Delete confirmation - Estimate body water - Estimate lean body weight - Estimate body fat - - Display - Body metrics estimation Measurement database Maintainer Website License - Body water formula - Lean body weight formula - Body fat formula auto Theme @@ -206,10 +193,11 @@ openScale requires permission to access the coarse location to search for Bluetooth devices Information Next - Measurement order Press and hold to reorder Set default order Overwrite previous export \"%s\"? - - + Include in overview graph + Measurement in % + Estimate measurement + Estimation formula diff --git a/android_app/app/src/main/res/xml/measurement_preferences.xml b/android_app/app/src/main/res/xml/measurement_preferences.xml index d2ad7288..09e510a3 100644 --- a/android_app/app/src/main/res/xml/measurement_preferences.xml +++ b/android_app/app/src/main/res/xml/measurement_preferences.xml @@ -1,29 +1,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - + +