From 16ff92230a8cab7c292a08a546fd48505f535e00 Mon Sep 17 00:00:00 2001 From: youtaol Date: Fri, 23 Aug 2013 12:30:24 +0800 Subject: [PATCH] Give an weight input dialog when the weight value is not set yet. Make the weight value/display can be changed by unit setting. --- MyTracks/res/values/strings.xml | 32 +++- MyTracks/res/xml/stats_settings.xml | 4 +- .../settings/StatsSettingsActivity.java | 171 +++++++++++++++--- .../apps/mytracks/util/PreferencesUtils.java | 2 +- .../apps/mytracks/util/UnitConversions.java | 6 + 5 files changed, 172 insertions(+), 43 deletions(-) diff --git a/MyTracks/res/values/strings.xml b/MyTracks/res/values/strings.xml index d447741a2..17aa8f4e6 100644 --- a/MyTracks/res/values/strings.xml +++ b/MyTracks/res/values/strings.xml @@ -2007,6 +2007,12 @@ limitations under the License. Character limit: ~23 (1 line)"> Latitude/Longitude + + Calorie + Grade/Elevation - - Calorie - Weight - - Your weight in kilogram. This value is used to calculate the calorie expenditure and would be private for yourself. + This weight value is only used to calculate the calorie expenditure and would be private for yourself. - Imperial (mi, ft) + Imperial (mi, ft, lb) - Metric (km, m) + Metric (km, m, kg) %1$d km + + %1$d kg + %1$d %% + + %1$d lb + - + android:title="@string/settings_stats_calorie_weight" /> \ No newline at end of file diff --git a/MyTracks/src/com/google/android/apps/mytracks/settings/StatsSettingsActivity.java b/MyTracks/src/com/google/android/apps/mytracks/settings/StatsSettingsActivity.java index cc7fb0ccf..b436050bf 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/settings/StatsSettingsActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/settings/StatsSettingsActivity.java @@ -17,15 +17,21 @@ package com.google.android.apps.mytracks.settings; import com.google.android.apps.mytracks.util.PreferencesUtils; +import com.google.android.apps.mytracks.util.UnitConversions; import com.google.android.maps.mytracks.R; +import android.app.AlertDialog; +import android.content.DialogInterface; import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; +import android.preference.Preference.OnPreferenceClickListener; +import android.text.InputType; import android.util.Log; +import android.widget.EditText; /** * An activity for accessing stats settings. @@ -33,24 +39,22 @@ import android.util.Log; * @author Jimmy Shih */ public class StatsSettingsActivity extends AbstractSettingsActivity { - + private static final String TAG = MapSettingsActivity.class.getSimpleName(); private CheckBoxPreference caloriePreference; private EditTextPreference weightPreference; - @SuppressWarnings("deprecation") @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); addPreferencesFromResource(R.xml.stats_settings); - + caloriePreference = (CheckBoxPreference) findPreference(getString(R.string.stats_show_calorie_key)); weightPreference = (EditTextPreference) findPreference(getString(R.string.stats_weight_key)); - configCaloriePreference(caloriePreference, R.string.stats_show_calorie_key, - PreferencesUtils.STATS_SHOW_CALORIE_DEFAULT); + configCaloriePreference(caloriePreference); configWeightPreference(weightPreference, R.string.stats_weight_key, PreferencesUtils.STATS_WEIGHT_DEFAULT, caloriePreference.isChecked()); /* @@ -65,17 +69,24 @@ public class StatsSettingsActivity extends AbstractSettingsActivity { */ private void configUnitsListPreference() { @SuppressWarnings("deprecation") - ListPreference listPreference = (ListPreference) findPreference( - getString(R.string.stats_units_key)); + ListPreference listPreference = (ListPreference) findPreference(getString(R.string.stats_units_key)); OnPreferenceChangeListener listener = new OnPreferenceChangeListener() { - @Override + @Override public boolean onPreferenceChange(Preference pref, Object newValue) { configRateListPreference(PreferencesUtils.STATS_UNITS_DEFAULT.equals((String) newValue)); + + /* + * It is necessary to change the weight summary as they are in the same + * activity. + */ + updateWeightSummary(weightPreference, R.string.stats_weight_key, + PreferencesUtils.STATS_WEIGHT_DEFAULT, + PreferencesUtils.STATS_UNITS_DEFAULT.equals((String) newValue)); return true; } }; - String value = PreferencesUtils.getString( - this, R.string.stats_units_key, PreferencesUtils.STATS_UNITS_DEFAULT); + String value = PreferencesUtils.getString(this, R.string.stats_units_key, + PreferencesUtils.STATS_UNITS_DEFAULT); String[] values = getResources().getStringArray(R.array.stats_units_values); String[] options = getResources().getStringArray(R.array.stats_units_options); configureListPreference(listPreference, options, options, values, value, listener); @@ -88,16 +99,15 @@ public class StatsSettingsActivity extends AbstractSettingsActivity { */ private void configRateListPreference(boolean metricUnits) { @SuppressWarnings("deprecation") - ListPreference listPreference = (ListPreference) findPreference( - getString(R.string.stats_rate_key)); - String value = PreferencesUtils.getString( - this, R.string.stats_rate_key, PreferencesUtils.STATS_RATE_DEFAULT); + ListPreference listPreference = (ListPreference) findPreference(getString(R.string.stats_rate_key)); + String value = PreferencesUtils.getString(this, R.string.stats_rate_key, + PreferencesUtils.STATS_RATE_DEFAULT); String[] values = getResources().getStringArray(R.array.stats_rate_values); String[] options = getResources().getStringArray( metricUnits ? R.array.stats_rate_metric_options : R.array.stats_rate_imperial_options); configureListPreference(listPreference, options, options, values, value, null); } - + /** * Configures the calorie preference. * @@ -105,8 +115,7 @@ public class StatsSettingsActivity extends AbstractSettingsActivity { * @param key of the preference * @param defaultValue default value of this preference */ - private void configCaloriePreference(CheckBoxPreference preference, int key, boolean defaultValue) { - PreferencesUtils.setBoolean(this, key, PreferencesUtils.getBoolean(this, key, defaultValue)); + private void configCaloriePreference(CheckBoxPreference preference) { preference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @SuppressWarnings("hiding") @Override @@ -114,6 +123,7 @@ public class StatsSettingsActivity extends AbstractSettingsActivity { boolean value = (Boolean) newValue; if (value) { weightPreference.setEnabled(true); + showWeightInputPreferenceDialog(); } else { weightPreference.setEnabled(false); } @@ -122,6 +132,42 @@ public class StatsSettingsActivity extends AbstractSettingsActivity { }); } + /** + * Shows this dialog to input weight value while enable show calorie and the + * value is not set yet. + */ + private void showWeightInputPreferenceDialog() { + int value = PreferencesUtils.getInt(this, R.string.stats_weight_key, -1); + if (value == -1) { + final EditText weightInput = new EditText(this); + weightInput.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL); + weightInput.setText(Integer.toString(PreferencesUtils.STATS_WEIGHT_DEFAULT)); + weightInput.setSelectAllOnFocus(true); + AlertDialog.Builder inputDialogBuilder = new AlertDialog.Builder(this); + inputDialogBuilder + .setTitle(R.string.settings_stats_calorie_weight) + .setMessage(R.string.settings_stats_calorie_weight_description) + .setCancelable(false) + .setView(weightInput) + .setPositiveButton(getString(R.string.generic_ok), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + storeWeightValue(R.string.stats_weight_key, PreferencesUtils.STATS_WEIGHT_DEFAULT, + weightInput.getText().toString()); + updateWeightSummary(weightPreference, R.string.stats_weight_key, + PreferencesUtils.STATS_WEIGHT_DEFAULT); + dialog.cancel(); + } + }) + .setNegativeButton(getString(R.string.generic_cancel), + new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + } + }); + inputDialogBuilder.create().show(); + } + } + /** * Configures the weight preference. * @@ -130,9 +176,9 @@ public class StatsSettingsActivity extends AbstractSettingsActivity { * @param defaultValue default value of this preference * @param isEnable true means enable the weight preference */ - private void configWeightPreference(EditTextPreference preference, int key, int defaultValue, - boolean isEnable) { - PreferencesUtils.setInt(this, key, PreferencesUtils.getInt(this, key, defaultValue)); + private void configWeightPreference(EditTextPreference preference, final int key, + final int defaultValue, boolean isEnable) { + updateWeightSummary(preference, key, defaultValue); if (isEnable) { preference.setEnabled(true); } else { @@ -143,17 +189,84 @@ public class StatsSettingsActivity extends AbstractSettingsActivity { @SuppressWarnings("hiding") @Override public boolean onPreferenceChange(Preference preference, Object newValue) { - String displayValue = (String) newValue; - int value; - try { - value = Integer.parseInt(displayValue); - } catch (NumberFormatException e) { - Log.e(TAG, "invalid value " + displayValue); - value = PreferencesUtils.TRACK_COLOR_MODE_PERCENTAGE_DEFAULT; - } - PreferencesUtils.setInt(StatsSettingsActivity.this, R.string.stats_weight_key, value); + storeWeightValue(key, defaultValue, (String) newValue); + updateWeightSummary(preference, key, defaultValue); + return true; + } + }); + + preference.setOnPreferenceClickListener(new OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference pref) { + int value = getWeightDisplayValue(key, defaultValue, + PreferencesUtils.isMetricUnits(getApplicationContext())); + ((EditTextPreference) pref).getEditText().setText(String.valueOf(value)); return true; } }); } + + /** + * Updates the weight summary. + * + * @param preference the preference + * @param keyId the key id + * @param defaultValue the default value + */ + private void updateWeightSummary(Preference preference, int keyId, int defaultValue) { + boolean metricUnits = PreferencesUtils.isMetricUnits(this); + updateWeightSummary(preference, keyId, defaultValue, metricUnits); + } + + /** + * Updates the weight summary. + * + * @param preference the preference + * @param keyId the key id + * @param defaultValue the default value + * @param metricUnits the status of metric units + */ + private void updateWeightSummary(Preference preference, int keyId, int defaultValue, + boolean metricUnits) { + int displayValue = getWeightDisplayValue(keyId, defaultValue, metricUnits); + preference.setSummary(getString(metricUnits ? R.string.value_integer_kilogram + : R.string.value_integer_pound, displayValue)); + } + + /** + * Gets the weight display value in metric or imperial depending on the + * preferred units. + * + * @param keyId the key id + * @param defaultValue the default value + */ + private int getWeightDisplayValue(int keyId, int defaultValue, boolean metricUnits) { + int value = PreferencesUtils.getInt(this, keyId, defaultValue); + if (!metricUnits) { + value = (int) (value * UnitConversions.KG_TO_LB); + } + return value; + } + + /** + * Stores the weight value, always in metric units. + * + * @param keyId the key id + * @param defaultValue the default value + * @param displayValue the display value + */ + private void storeWeightValue(int keyId, int defaultValue, String displayValue) { + int value; + try { + value = Integer.parseInt(displayValue); + if (!PreferencesUtils.isMetricUnits(this)) { + value = (int) (value * UnitConversions.LB_TO_KG); + } + } catch (NumberFormatException e) { + Log.e(TAG, "invalid value " + displayValue); + value = defaultValue; + } + + PreferencesUtils.setInt(this, keyId, value); + } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/PreferencesUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/PreferencesUtils.java index 7e53cb1e1..080abc81f 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/PreferencesUtils.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/PreferencesUtils.java @@ -106,7 +106,7 @@ public class PreferencesUtils { public static final boolean STATS_SHOW_GRADE_ELEVATION_DEFAULT = false; public static final String STATS_UNITS_DEFAULT = "METRIC"; public static final boolean STATS_SHOW_CALORIE_DEFAULT = false; - public static final int STATS_WEIGHT_DEFAULT = 65; //in kilogram + public static final int STATS_WEIGHT_DEFAULT = 65; // in kilogram // Track color public static final String TRACK_COLOR_MODE_DEFAULT = "SINGLE"; diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/UnitConversions.java b/MyTracks/src/com/google/android/apps/mytracks/util/UnitConversions.java index 3ff534cb7..650554c42 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/UnitConversions.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/UnitConversions.java @@ -45,6 +45,12 @@ public class UnitConversions { // multiplication factor to convert kilometers to miles public static final double KM_TO_MI = 0.621371192; + // multiplication factor to convert kilogram to pounds + public static final double KG_TO_LB = 2.2046; + + // multiplication factor to convert kilogram to pounds + public static final double LB_TO_KG = 1 / KG_TO_LB; + // multiplication factor to convert miles to kilometers public static final double MI_TO_KM = 1 / KM_TO_MI;