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..8fbb4184 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 @@ -227,8 +227,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().isOnOverviewGraph() || !(view instanceof FloatMeasurementView)) { continue; } 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 c3874c77..98cb3111 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,75 +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.SwitchPreference; +import android.preference.PreferenceScreen; +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 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) { @@ -92,203 +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(); - - 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().isEnabled()); + preference.setPersistent(true); + preference.setEnabled(!measurement.getIsDisabledByDependency()); - 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); } } @@ -323,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() { @@ -347,46 +168,146 @@ 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(getPersistedBoolean(true)); + measurementSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + persistBoolean(isChecked); + setEnableOnDependants(isChecked); + } + }); + } + + 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; - - onTouchClickListener(MeasurementOrderPreference pref) { - preference = pref; - } - - @Override - public boolean onTouch(View view, MotionEvent event) { - if (event.getActionMasked() == MotionEvent.ACTION_DOWN) { - x = Math.round(event.getX()); - y = Math.round(event.getY()); + private void setEnableOnDependants(boolean enable) { + for (int i = 0; i < getParent().getPreferenceCount(); ++i) { + MeasurementOrderPreference preference = + (MeasurementOrderPreference) getParent().getPreference(i); + for (String dep : preference.measurement.getDependencyKeys()) { + if (dep.equals(measurement.getKey())) { + preference.setEnabled(enable); + break; + } } - return false; } + } - @Override - public boolean onLongClick(View view) { - return view.startDrag(null, new dragShadowBuilder(view), preference, 0); - } + @Override + public boolean onDown(MotionEvent e) { + return isEnabled(); + } - private class dragShadowBuilder extends View.DragShadowBuilder { - public dragShadowBuilder(View view) { - super(view); + @Override + public void onShowPress(MotionEvent e) { + boundView.setPressed(true); + } + + @Override + public boolean onSingleTapUp(MotionEvent e) { + boundView.setPressed(false); + + if (!measurement.hasExtraPreferences()) { + if (measurementSwitch.getVisibility() == View.VISIBLE) { + measurementSwitch.toggle(); } + return true; + } + // Must be enabled to show extra preferences screen + if (!getPersistedBoolean(true)) { + return true; + } + + 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 { @@ -422,9 +343,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)) { @@ -472,6 +390,5 @@ public class MeasurementPreferences extends PreferenceFragment implements Shared return true; } } - } } 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 dd2c02b3..36e50c72 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 @@ -17,9 +17,11 @@ package com.health.openscale.gui.views; import android.content.Context; 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; @@ -79,6 +81,22 @@ public class FatMeasurementView extends FloatMeasurementView { @Override 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 protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { return evalSheet.evaluateBodyFat(value); 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 791c3443..9eeb5833 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; @@ -228,6 +235,7 @@ public abstract class FloatMeasurementView extends MeasurementView { public abstract int getColor(); protected boolean isEstimationSupported() { return false; } + protected void prepareEstimationFormulaPreference(ListPreference preference) {} protected abstract EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value); @@ -406,6 +414,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.isOnOverviewGraph()); + 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/LBWMeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/LBWMeasurementView.java index 83caf79b..ce155e70 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 @@ -17,9 +17,11 @@ package com.health.openscale.gui.views; import android.content.Context; 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; @@ -70,6 +72,22 @@ public class LBWMeasurementView extends FloatMeasurementView { @Override 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 protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { return null; diff --git a/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementView.java b/android_app/app/src/main/java/com/health/openscale/gui/views/MeasurementView.java index 37a21243..a22b3c4e 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.annotation.CallSuper; import android.support.v4.content.ContextCompat; import android.text.SpannableStringBuilder; @@ -411,6 +412,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); 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 27c4e59b..548535e5 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 @@ -17,9 +17,11 @@ package com.health.openscale.gui.views; import android.content.Context; 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; @@ -79,6 +81,22 @@ public class WaterMeasurementView extends FloatMeasurementView { @Override 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 protected EvaluationResult evaluateSheet(EvaluationSheet evalSheet, float value) { return evalSheet.evaluateBodyWater(value); 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 652dde2c..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 @@ - - - - - - - - - - - - - - - - - - - - - - - - + +