diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9130196 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules + +# testing +/coverage + +# production +/build +/app/build +/app/release + +# misc +.* +*.properties +*.iml +!.gitignore + diff --git a/app/src/main/java/de/tadris/fitness/activity/RecordWorkoutActivity.java b/app/src/main/java/de/tadris/fitness/activity/RecordWorkoutActivity.java index ca361a0..6faef2c 100644 --- a/app/src/main/java/de/tadris/fitness/activity/RecordWorkoutActivity.java +++ b/app/src/main/java/de/tadris/fitness/activity/RecordWorkoutActivity.java @@ -55,6 +55,7 @@ import java.util.List; import de.tadris.fitness.Instance; import de.tadris.fitness.R; +import de.tadris.fitness.data.UserPreferences; import de.tadris.fitness.data.Workout; import de.tadris.fitness.map.MapManager; import de.tadris.fitness.map.tilesource.TileSources; @@ -170,10 +171,7 @@ public class RecordWorkoutActivity extends FitoTrackActivity implements Location try{ while (recorder.isActive()){ Thread.sleep(1000); - if(isResumed){ - mHandler.post(this::updateDescription); - } - mHandler.post(this::spokenUpdate); + mHandler.post(this::updateDescription); } }catch (InterruptedException e){ e.printStackTrace(); @@ -181,19 +179,32 @@ public class RecordWorkoutActivity extends FitoTrackActivity implements Location }).start(); } - private void spokenUpdate() { - final long interval = 60 * 1000 * Instance.getInstance(this).userPreferences.getSpokenUpdatePeriod(); - if (interval == 0) - return; - long duration = recorder.getDuration(); - if (duration / interval == lastSpokenUpdate / interval) - return; + TextToSpeech tts; + long lastSpokenUpdateTime = 0; + int lastSpokenUpdateDistance = 0; - timeView.setText(UnitUtils.getHourMinuteSecondTime(duration)); + private void updateDescription() { + long duration = recorder.getDuration(); + int distanceInMeters = recorder.getDistance(); final String distanceCaption = getString(R.string.workoutDistance); - final String distance = UnitUtils.getDistance(recorder.getDistance()); + final String distance = UnitUtils.getDistance(distanceInMeters); final String avgSpeedCaption = getString(R.string.workoutAvgSpeed); final String avgSpeed = UnitUtils.getSpeed(Math.min(100d, recorder.getAvgSpeed())); + if (isResumed) { + timeView.setText(UnitUtils.getHourMinuteSecondTime(duration)); + infoViews[0].setText(distanceCaption, distance); + infoViews[1].setText(getString(R.string.workoutBurnedEnergy), recorder.getCalories() + " kcal"); + infoViews[2].setText(avgSpeedCaption, avgSpeed); + infoViews[3].setText(getString(R.string.workoutPauseDuration), UnitUtils.getHourMinuteSecondTime(recorder.getPauseDuration())); + } + + final UserPreferences prefs=Instance.getInstance(this).userPreferences; + final long intervalT = 60 * 1000 * prefs.getSpokenUpdateTimePeriod(); + final int intervalInMeters = (int)(1000.0/UnitUtils.CHOSEN_SYSTEM.getDistanceFromKilometers(1) * prefs.getSpokenUpdateDistancePeriod()); + if ( + (intervalT == 0 || duration / intervalT == lastSpokenUpdateTime / intervalT) + && (intervalInMeters == 0 || distanceInMeters / intervalInMeters == lastSpokenUpdateDistance / intervalInMeters) + ) return; tts = new TextToSpeech(this, (int status) -> { if (status != TextToSpeech.SUCCESS) return; @@ -202,23 +213,8 @@ public class RecordWorkoutActivity extends FitoTrackActivity implements Location tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, "updateDescription" + duration); }); - lastSpokenUpdate = duration; - } - - TextToSpeech tts; - long lastSpokenUpdate = 0; - - private void updateDescription() { - long duration = recorder.getDuration(); - timeView.setText(UnitUtils.getHourMinuteSecondTime(duration)); - final String distanceCaption = getString(R.string.workoutDistance); - final String distance = UnitUtils.getDistance(recorder.getDistance()); - final String avgSpeedCaption = getString(R.string.workoutAvgSpeed); - final String avgSpeed = UnitUtils.getSpeed(Math.min(100d, recorder.getAvgSpeed())); - infoViews[0].setText(distanceCaption, distance); - infoViews[1].setText(getString(R.string.workoutBurnedEnergy), recorder.getCalories() + " kcal"); - infoViews[2].setText(avgSpeedCaption, avgSpeed); - infoViews[3].setText(getString(R.string.workoutPauseDuration), UnitUtils.getHourMinuteSecondTime(recorder.getPauseDuration())); + lastSpokenUpdateTime = duration; + lastSpokenUpdateDistance = distanceInMeters; } private void stop(){ diff --git a/app/src/main/java/de/tadris/fitness/activity/SettingsActivity.java b/app/src/main/java/de/tadris/fitness/activity/SettingsActivity.java index ea16c97..f6458e4 100644 --- a/app/src/main/java/de/tadris/fitness/activity/SettingsActivity.java +++ b/app/src/main/java/de/tadris/fitness/activity/SettingsActivity.java @@ -160,7 +160,7 @@ public class SettingsActivity extends PreferenceActivity { bindPreferenceSummaryToValue(findPreference("mapStyle")); findPreference("weight").setOnPreferenceClickListener(preference -> showWeightPicker()); - findPreference("spokenUpdatePeriod").setOnPreferenceClickListener(preference -> showSpokenUdatePeriodPicker()); + findPreference("speech").setOnPreferenceClickListener(preference -> showSpeechConfig()); findPreference("import").setOnPreferenceClickListener(preference -> showImportDialog()); findPreference("export").setOnPreferenceClickListener(preference -> showExportDialog()); @@ -281,8 +281,8 @@ public class SettingsActivity extends PreferenceActivity { np.setMaxValue((int) UnitUtils.CHOSEN_SYSTEM.getWeightFromKilogram(150)); np.setMinValue((int) UnitUtils.CHOSEN_SYSTEM.getWeightFromKilogram(20)); np.setFormatter(value -> value + " " + UnitUtils.CHOSEN_SYSTEM.getWeightUnit()); - final String preferenceKey = "weight"; - np.setValue((int)Math.round(UnitUtils.CHOSEN_SYSTEM.getWeightFromKilogram(preferences.getInt(preferenceKey, 80)))); + final String preferenceVariable = "weight"; + np.setValue((int)Math.round(UnitUtils.CHOSEN_SYSTEM.getWeightFromKilogram(preferences.getInt(preferenceVariable, 80)))); np.setWrapSelectorWheel(false); d.setView(v); @@ -291,7 +291,7 @@ public class SettingsActivity extends PreferenceActivity { d.setPositiveButton(R.string.okay, (dialog, which) -> { int unitValue= np.getValue(); int kilograms= (int)Math.round(UnitUtils.CHOSEN_SYSTEM.getKilogramFromUnit(unitValue)); - preferences.edit().putInt(preferenceKey, kilograms).apply(); + preferences.edit().putInt(preferenceVariable, kilograms).apply(); }); d.create().show(); @@ -299,25 +299,39 @@ public class SettingsActivity extends PreferenceActivity { return true; } - private boolean showSpokenUdatePeriodPicker() { - final String preferenceKey = "spokenUpdatePeriod"; + private boolean showSpeechConfig() { + UnitUtils.setUnit(this); // Maybe the user changed unit system + final AlertDialog.Builder d = new AlertDialog.Builder(this); final SharedPreferences preferences= PreferenceManager.getDefaultSharedPreferences(this); - //d.setTitle(getString(R.string.pref_weight)); - d.setTitle("Select period between spoken updates, in minutes"); + d.setTitle(getString(R.string.pref_spoken_updates_summary)); View v= getLayoutInflater().inflate(R.layout.dialog_spoken_updates_picker, null); - NumberPicker np = v.findViewById(R.id.spokenUpdatesPicker); - np.setMaxValue(60); - np.setMinValue(0); - np.setFormatter(value -> value==0 ? "No speech" : value + " min" ); - np.setValue((preferences.getInt(preferenceKey, 0))); - np.setWrapSelectorWheel(false); + + NumberPicker npT = v.findViewById(R.id.spokenUpdatesTimePicker); + npT.setMaxValue(60); + npT.setMinValue(0); + npT.setFormatter(value -> value == 0 ? "No speech" : value + " min"); + final String updateTimeVariable = "spokenUpdateTimePeriod"; + npT.setValue(preferences.getInt(updateTimeVariable, 0)); + npT.setWrapSelectorWheel(false); + + final String distanceUnit = " " + UnitUtils.CHOSEN_SYSTEM.getLongDistanceUnit(); + NumberPicker npD = v.findViewById(R.id.spokenUpdatesDistancePicker); + npD.setMaxValue(10); + npD.setMinValue(0); + npD.setFormatter(value -> value == 0 ? "No speech" : value + distanceUnit); + final String updateDistanceVariable = "spokenUpdateDistancePeriod"; + npD.setValue(preferences.getInt(updateDistanceVariable, 0)); + npD.setWrapSelectorWheel(false); d.setView(v); d.setNegativeButton(R.string.cancel, null); d.setPositiveButton(R.string.okay, (dialog, which) -> { - preferences.edit().putInt(preferenceKey, np.getValue()).apply(); + preferences.edit() + .putInt(updateTimeVariable, npT.getValue()) + .putInt(updateDistanceVariable, npD.getValue()) + .apply(); }); d.create().show(); diff --git a/app/src/main/java/de/tadris/fitness/data/UserPreferences.java b/app/src/main/java/de/tadris/fitness/data/UserPreferences.java index 53ea898..7972d3a 100644 --- a/app/src/main/java/de/tadris/fitness/data/UserPreferences.java +++ b/app/src/main/java/de/tadris/fitness/data/UserPreferences.java @@ -35,8 +35,12 @@ public class UserPreferences { return preferences.getInt("weight", 80); } - public int getSpokenUpdatePeriod(){ - return preferences.getInt("spokenUpdatePeriod", 5); + public int getSpokenUpdateTimePeriod(){ + return preferences.getInt("spokenUpdateTimePeriod", 5); + } + + public int getSpokenUpdateDistancePeriod(){ + return preferences.getInt("spokenUpdateDistancePeriod", 1); } public String getMapStyle(){ diff --git a/app/src/main/res/layout/dialog_spoken_updates_picker.xml b/app/src/main/res/layout/dialog_spoken_updates_picker.xml index f9e481d..6a6f613 100644 --- a/app/src/main/res/layout/dialog_spoken_updates_picker.xml +++ b/app/src/main/res/layout/dialog_spoken_updates_picker.xml @@ -3,12 +3,20 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" > - + android:layout_margin="50dp" + android:layout_alignParentLeft="true"/> + + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 921785d..9595432 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -51,6 +51,11 @@ Bevorzugtes Einheitensystem Dein Gewicht Dein Gewicht ist zur Kalorienberechnung wichtig + + + Spoken Updates + Choose the time and distance between spoken updates + Einstellungen Workout aufzeichnen Wiederherstellen @@ -107,4 +112,4 @@ Warte auf GPS Upload fehlgeschlagen Upload erfolgreich - \ 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 224ef85..e8e18f3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -111,6 +111,8 @@ Export as GPX-File Your Weight Your weight is needed to calculate the burned calories + Spoken Updates + Choose the time and distance between spoken updates Preferred system of units Settings Export Data diff --git a/app/src/main/res/xml/preferences_main.xml b/app/src/main/res/xml/preferences_main.xml index cea1d6c..091a2f3 100644 --- a/app/src/main/res/xml/preferences_main.xml +++ b/app/src/main/res/xml/preferences_main.xml @@ -42,11 +42,11 @@ android:title="@string/mapStyle" /> + android:summary="@string/pref_spoken_updates_summary" + android:title="@string/pref_spoken_updates" />