diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/SeekBarPreference.java b/app/src/main/java/de/apps4ics/mountainnavigation/SeekBarPreference.java new file mode 100644 index 0000000..916666e --- /dev/null +++ b/app/src/main/java/de/apps4ics/mountainnavigation/SeekBarPreference.java @@ -0,0 +1,134 @@ +package de.apps4ics.mountainnavigation; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.View; +import android.preference.DialogPreference; +import android.widget.SeekBar; +import android.widget.TextView; +import android.widget.LinearLayout; + +/** + * This file is part of MountainNavigation. + * + * MountainNavigation 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. + * + * MountainNavigation 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 MountainNavigation. If not, see . + * + * @copyright Copyright (c) 2016 Vinzenz Rosenkanz + * + * @author Vinzenz Rosenkranz + */ +public class SeekBarPreference extends DialogPreference implements SeekBar.OnSeekBarChangeListener { + private Context context; + private int maxValue; + private int minValue; + private int currentValue; + private int defaultStart; + private String title; + private String text; + + private SeekBar seekBar; + private TextView infoText; + + private final static int DEFAULT_MAX_VALUE = 100; + private final static int DEFAULT_MIN_VALUE = 0; + private final static String TEXT = "text"; + private final static String MAX = "max"; + private final static String MIN = "min"; + private final static String DEFAULT_VALUE = "defaultValue"; + private final static String DIALOG_MESSAGE = "dialogMessage"; + private static final String AND_NAMESPACE = "http://schemas.android.com/apk/res/android"; + + public SeekBarPreference(Context context) { + super(context, null); + } + + public SeekBarPreference(Context context, AttributeSet attrs) { + super(context, attrs); + this.context = context; + this.defaultStart = attrs.getAttributeIntValue(AND_NAMESPACE, DEFAULT_VALUE, DEFAULT_MIN_VALUE); + init(attrs); + } + + private void init(AttributeSet attrs) { + TypedArray ta = getContext().obtainStyledAttributes(attrs, R.styleable.MinSeekBar); + this.text = ta.getString(R.styleable.MinSeekBar_android_text); + this.maxValue = ta.getInt(R.styleable.MinSeekBar_android_max, DEFAULT_MAX_VALUE); + this.minValue = ta.getInt(R.styleable.MinSeekBar_min, DEFAULT_MIN_VALUE); + } + + @Override + protected View onCreateDialogView() { + LinearLayout layout = new LinearLayout(context); + layout.setOrientation(LinearLayout.VERTICAL); + layout.setPadding(15, 15, 15, 15); + + infoText = new TextView(context); + if(text != null) { + infoText.setText(String.format(text, defaultStart + minValue)); + } + infoText.setGravity(Gravity.CENTER_HORIZONTAL); + infoText.setTextSize(32); + LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, + LinearLayout.LayoutParams.WRAP_CONTENT); + layout.addView(infoText, params); + + seekBar = new SeekBar(context); + if(shouldPersist()) currentValue = getPersistedInt(defaultStart); + seekBar.setMax(maxValue); + seekBar.setProgress(currentValue + minValue); + seekBar.setOnSeekBarChangeListener(this); + layout.addView(seekBar, params); + return layout; + } + + @Override + protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) { + super.onSetInitialValue(restorePersistedValue, defaultValue); + if(restorePersistedValue) { + if(shouldPersist()) { + currentValue = getPersistedInt(defaultStart); + } else { + currentValue = 0; + } + } else { + currentValue = (int) defaultValue; + } + } + + @Override + protected void onBindDialogView(View v) { + super.onBindDialogView(v); + seekBar.setMax(maxValue); + seekBar.setProgress(currentValue); + infoText.setText(String.format(text, currentValue + minValue)); + } + + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + infoText.setText(String.format(text, progress + minValue)); + if(shouldPersist()) persistInt(progress); + callChangeListener(progress); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + } +} \ No newline at end of file diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/SettingsActivity.java b/app/src/main/java/de/apps4ics/mountainnavigation/SettingsActivity.java index f8c6c30..1323251 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/SettingsActivity.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/SettingsActivity.java @@ -4,6 +4,7 @@ import android.app.FragmentManager; import android.app.FragmentTransaction; import android.content.SharedPreferences; +import android.content.res.Resources; import android.os.Bundle; import android.preference.Preference; import android.preference.PreferenceCategory; @@ -41,6 +42,26 @@ mFragmentTransaction.commit(); } + + public static int getMaxColdFromPrefs(int defaultValue) { + return getIntWithMinFromPrefs(R.string.preferences_maximal_cold_temp_min, R.string.settings_hint_max_cold_temp_key, defaultValue); + } + + public static int getMinHotFromPrefs(int defaultValue) { + return getIntWithMinFromPrefs(R.string.preferences_minimal_hot_temp_min, R.string.settings_hint_min_hot_temp_key, defaultValue); + } + + public static int getDaysForecastFromPrefs(int defaultValue) { + return getIntWithMinFromPrefs(R.string.preferences_days_of_forecast_min, R.string.settings_weather_days_forecast_key, defaultValue); + } + + private static int getIntWithMinFromPrefs(int minId, int resId, int defaultValue) { + Resources res = MainActivity.getRes(); + SharedPreferences sharedPrefs = MainActivity.getSharedPrefs(); + int min = Integer.parseInt(res.getString(minId)); + return sharedPrefs.getInt(res.getString(resId), (defaultValue-min)) + min; + } + public static class PrefsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener { @Override public void onCreate(Bundle savedInstanceState) { @@ -60,6 +81,7 @@ } } } + @Override public void onResume() { super.onResume(); diff --git a/app/src/main/java/de/apps4ics/mountainnavigation/handlers/WeatherHandler.java b/app/src/main/java/de/apps4ics/mountainnavigation/handlers/WeatherHandler.java index b7879f4..fdbf177 100644 --- a/app/src/main/java/de/apps4ics/mountainnavigation/handlers/WeatherHandler.java +++ b/app/src/main/java/de/apps4ics/mountainnavigation/handlers/WeatherHandler.java @@ -32,6 +32,7 @@ import de.apps4ics.mountainnavigation.OnSingleWeatherRetrieved; import de.apps4ics.mountainnavigation.OnWeatherRetrieved; import de.apps4ics.mountainnavigation.R; +import de.apps4ics.mountainnavigation.SettingsActivity; import de.apps4ics.mountainnavigation.WeatherDatabase; import de.apps4ics.mountainnavigation.adapters.WarningListAdapter; @@ -64,11 +65,11 @@ private HistoricalWeather histWeather; private DayForecast[] forecasts; private Weather[] weathers; - private final static float MIN_HOT_TEMP_DEFAULT = 30.0f; - private final static float MAX_COLD_TEMP_DEFAULT = 10.0f; + private final static int MIN_HOT_TEMP_DEFAULT = 30; + private final static int MAX_COLD_TEMP_DEFAULT = 10; private final static int MAX_DAYS_FORECAST_DEFAULT = 3; - private static float MIN_HOT_TEMP; - private static float MAX_COLD_TEMP; + private static int MIN_HOT_TEMP; + private static int MAX_COLD_TEMP; private static int MAX_DAYS_FORECAST; private static float MIN_WINDY_SPEED; @@ -88,10 +89,7 @@ } Resources res = MainActivity.getRes(); - SharedPreferences sharedPrefs = MainActivity.getSharedPrefs(); - MAX_DAYS_FORECAST = Integer.parseInt(MainActivity.getSharedPrefs().getString( - res.getString(R.string.settings_weather_days_forecast), - String.valueOf(MAX_DAYS_FORECAST_DEFAULT))); + MAX_DAYS_FORECAST = SettingsActivity.getDaysForecastFromPrefs(MAX_DAYS_FORECAST_DEFAULT); WeatherClient.ClientBuilder weatherBuilder = new WeatherClient.ClientBuilder(); weatherConfig = new WeatherConfig(); weatherConfig.unitSystem = WeatherConfig.UNIT_SYSTEM.M; @@ -99,13 +97,13 @@ weatherConfig.lang = res.getString(R.string.lang_identifier); weatherConfig.numDays = MAX_DAYS_FORECAST; - MIN_HOT_TEMP = Float.parseFloat(sharedPrefs.getString(res.getString(R.string.settings_hint_min_hot_temp_key), String.valueOf(MIN_HOT_TEMP_DEFAULT))); - MAX_COLD_TEMP = Float.parseFloat(sharedPrefs.getString(res.getString(R.string.settings_hint_max_cold_temp_key), String.valueOf(MAX_COLD_TEMP_DEFAULT))); + MIN_HOT_TEMP = SettingsActivity.getMinHotFromPrefs(MIN_HOT_TEMP_DEFAULT); + MAX_COLD_TEMP = SettingsActivity.getMaxColdFromPrefs(MAX_COLD_TEMP_DEFAULT); MIN_WINDY_SPEED = 8; //http://www.wettergefahren-fruehwarnung.de/Artikel/beaufort.html if(weatherConfig.unitSystem.equals(WeatherConfig.UNIT_SYSTEM.I)){ - MIN_HOT_TEMP = celsiusToFahrenheit(MIN_HOT_TEMP); - MAX_COLD_TEMP = celsiusToFahrenheit(MAX_COLD_TEMP); + MIN_HOT_TEMP = (int) celsiusToFahrenheit(MIN_HOT_TEMP); + MAX_COLD_TEMP = (int) celsiusToFahrenheit(MAX_COLD_TEMP); } weatherClient = null; diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml index 54603e9..4bab231 100644 --- a/app/src/main/res/values-de-rDE/strings.xml +++ b/app/src/main/res/values-de-rDE/strings.xml @@ -72,6 +72,8 @@ Welche Wetterart möchtest du herunterladen? Spezieller Ort Ort... + %1$s Tage + %1$s°C © OpenStreetMap-Mitwirkende diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml new file mode 100644 index 0000000..b8a43e1 --- /dev/null +++ b/app/src/main/res/values/attrs.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index be7aacd..823f4f9 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -74,6 +74,8 @@ What kind of weather do you want to download? Custom location Location... + %1$s days + %1$s°C © OpenStreetMap contributors @@ -90,13 +92,20 @@ maxHotTemp minColdTemp useModernMarkers - daysOfForecast + daysOfForecast username password forecast current day + 5 + 20 + 1 + 15 + 20 + 23 + Fountain Path diff --git a/app/src/main/res/xml/preferences.xml b/app/src/main/res/xml/preferences.xml index 255e125..731a2c1 100644 --- a/app/src/main/res/xml/preferences.xml +++ b/app/src/main/res/xml/preferences.xml @@ -1,5 +1,6 @@ - + @@ -8,26 +9,24 @@ android:key="@string/settings_hint_enable_key" android:defaultValue="true"> - - - + + - + android:summary="@string/maximal_cold_temp_summary" + android:defaultValue="2" + android:text="@string/preferences_n_degree" + app:min="@string/preferences_maximal_cold_temp_min" + android:max="@string/preferences_maximal_cold_temp_max"> + @@ -39,16 +38,15 @@ - - + android:text="@string/preferences_n_days" + app:min="@string/preferences_days_of_forecast_min" + android:max="@string/preferences_days_of_forecast_max"> +