From a0a1f44ef9fef7dcf2c3207cf3b3f32c7c2a6842 Mon Sep 17 00:00:00 2001 From: Ruslan Sokolovski Date: Wed, 1 Jan 2020 22:26:20 -0800 Subject: [PATCH 1/8] give vocal updates --- app/build.gradle | 6 +++ .../activity/RecordWorkoutActivity.java | 42 ++++++++++++++++--- .../fitness/recording/WorkoutRecorder.java | 2 +- app/src/main/res/values/strings.xml | 2 +- build.gradle | 2 +- 5 files changed, 45 insertions(+), 9 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1e9a076..b7864d0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -49,6 +49,12 @@ android { sourceCompatibility = '1.8' targetCompatibility = '1.8' } + lintOptions { + checkReleaseBuilds false + // Or, if you prefer, you can continue to check for errors in release builds, + // but continue the build even when errors are found: +// abortOnError false + } } dependencies { 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 84b7993..12a56f7 100644 --- a/app/src/main/java/de/tadris/fitness/activity/RecordWorkoutActivity.java +++ b/app/src/main/java/de/tadris/fitness/activity/RecordWorkoutActivity.java @@ -38,6 +38,8 @@ import android.view.ViewGroup; import android.widget.EditText; import android.widget.TextView; +import android.speech.tts.TextToSpeech; + import androidx.core.app.ActivityCompat; import org.mapsforge.core.graphics.Paint; @@ -171,6 +173,7 @@ public class RecordWorkoutActivity extends FitoTrackActivity implements Location if(isResumed){ mHandler.post(this::updateDescription); } + mHandler.post(this::speechUpdate); } }catch (InterruptedException e){ e.printStackTrace(); @@ -178,14 +181,41 @@ public class RecordWorkoutActivity extends FitoTrackActivity implements Location }).start(); } - int i= 0; + private void speechUpdate() { + long duration = recorder.getDuration(); + if (duration / interval == lastSpeechUpdate / interval) + return; - private void updateDescription(){ - i++; - timeView.setText(UnitUtils.getHourMinuteSecondTime(recorder.getDuration())); - infoViews[0].setText(getString(R.string.workoutDistance), UnitUtils.getDistance(recorder.getDistance())); + 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())); + + tts = new TextToSpeech(this, (int status) -> { + if (status != TextToSpeech.SUCCESS) return; + final String text = distanceCaption + ": " + distance + ". " + + avgSpeedCaption + ": " + avgSpeed; + tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, "updateDescription" + duration); + }); + + lastSpeechUpdate = duration; + } + + TextToSpeech tts; + long lastSpeechUpdate = 0; + final long interval = 60 * 1000; + + 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(getString(R.string.workoutAvgSpeed), UnitUtils.getSpeed(Math.min(100d, recorder.getAvgSpeed()))); + infoViews[2].setText(avgSpeedCaption, avgSpeed); infoViews[3].setText(getString(R.string.workoutPauseDuration), UnitUtils.getHourMinuteSecondTime(recorder.getPauseDuration())); } diff --git a/app/src/main/java/de/tadris/fitness/recording/WorkoutRecorder.java b/app/src/main/java/de/tadris/fitness/recording/WorkoutRecorder.java index 1346033..db2acfc 100644 --- a/app/src/main/java/de/tadris/fitness/recording/WorkoutRecorder.java +++ b/app/src/main/java/de/tadris/fitness/recording/WorkoutRecorder.java @@ -48,7 +48,7 @@ public class WorkoutRecorder implements LocationListener.LocationChangeListener } } - private static final int PAUSE_TIME= 10000; + private static final int PAUSE_TIME= 1000*1000; /** * Time after which the workout is stopped and saved automatically because there is no activity anymore diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bd74019..224ef85 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -57,7 +57,7 @@ Pace Route Speed - Avg. Speed + Average Speed Top Speed Burned Energy Total Energy diff --git a/build.gradle b/build.gradle index 795a6ec..75828ac 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.5.2' + classpath 'com.android.tools.build:gradle:3.4.2' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From b9e16bda257aca89a26bf838c0bec27999ac599a Mon Sep 17 00:00:00 2001 From: Ruslan Sokolovski Date: Thu, 2 Jan 2020 00:59:23 -0800 Subject: [PATCH 2/8] allow to select the frequency of spoken updates --- .../activity/RecordWorkoutActivity.java | 14 ++++---- .../fitness/activity/SettingsActivity.java | 32 +++++++++++++++++-- .../tadris/fitness/data/UserPreferences.java | 4 +++ .../layout/dialog_spoken_updates_picker.xml | 14 ++++++++ app/src/main/res/xml/preferences_main.xml | 9 +++++- 5 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 app/src/main/res/layout/dialog_spoken_updates_picker.xml 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 12a56f7..ca361a0 100644 --- a/app/src/main/java/de/tadris/fitness/activity/RecordWorkoutActivity.java +++ b/app/src/main/java/de/tadris/fitness/activity/RecordWorkoutActivity.java @@ -173,7 +173,7 @@ public class RecordWorkoutActivity extends FitoTrackActivity implements Location if(isResumed){ mHandler.post(this::updateDescription); } - mHandler.post(this::speechUpdate); + mHandler.post(this::spokenUpdate); } }catch (InterruptedException e){ e.printStackTrace(); @@ -181,9 +181,12 @@ public class RecordWorkoutActivity extends FitoTrackActivity implements Location }).start(); } - private void speechUpdate() { + private void spokenUpdate() { + final long interval = 60 * 1000 * Instance.getInstance(this).userPreferences.getSpokenUpdatePeriod(); + if (interval == 0) + return; long duration = recorder.getDuration(); - if (duration / interval == lastSpeechUpdate / interval) + if (duration / interval == lastSpokenUpdate / interval) return; timeView.setText(UnitUtils.getHourMinuteSecondTime(duration)); @@ -199,12 +202,11 @@ public class RecordWorkoutActivity extends FitoTrackActivity implements Location tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, "updateDescription" + duration); }); - lastSpeechUpdate = duration; + lastSpokenUpdate = duration; } TextToSpeech tts; - long lastSpeechUpdate = 0; - final long interval = 60 * 1000; + long lastSpokenUpdate = 0; private void updateDescription() { long duration = recorder.getDuration(); 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 1537f5f..ea16c97 100644 --- a/app/src/main/java/de/tadris/fitness/activity/SettingsActivity.java +++ b/app/src/main/java/de/tadris/fitness/activity/SettingsActivity.java @@ -160,6 +160,7 @@ public class SettingsActivity extends PreferenceActivity { bindPreferenceSummaryToValue(findPreference("mapStyle")); findPreference("weight").setOnPreferenceClickListener(preference -> showWeightPicker()); + findPreference("spokenUpdatePeriod").setOnPreferenceClickListener(preference -> showSpokenUdatePeriodPicker()); findPreference("import").setOnPreferenceClickListener(preference -> showImportDialog()); findPreference("export").setOnPreferenceClickListener(preference -> showExportDialog()); @@ -280,7 +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()); - np.setValue((int)Math.round(UnitUtils.CHOSEN_SYSTEM.getWeightFromKilogram(preferences.getInt("weight", 80)))); + final String preferenceKey = "weight"; + np.setValue((int)Math.round(UnitUtils.CHOSEN_SYSTEM.getWeightFromKilogram(preferences.getInt(preferenceKey, 80)))); np.setWrapSelectorWheel(false); d.setView(v); @@ -289,7 +291,33 @@ 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("weight", kilograms).apply(); + preferences.edit().putInt(preferenceKey, kilograms).apply(); + }); + + d.create().show(); + + return true; + } + + private boolean showSpokenUdatePeriodPicker() { + final String preferenceKey = "spokenUpdatePeriod"; + 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"); + 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); + + d.setView(v); + + d.setNegativeButton(R.string.cancel, null); + d.setPositiveButton(R.string.okay, (dialog, which) -> { + preferences.edit().putInt(preferenceKey, np.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 385be76..53ea898 100644 --- a/app/src/main/java/de/tadris/fitness/data/UserPreferences.java +++ b/app/src/main/java/de/tadris/fitness/data/UserPreferences.java @@ -35,6 +35,10 @@ public class UserPreferences { return preferences.getInt("weight", 80); } + public int getSpokenUpdatePeriod(){ + return preferences.getInt("spokenUpdatePeriod", 5); + } + public String getMapStyle(){ return preferences.getString("mapStyle", "osm.mapnik"); } diff --git a/app/src/main/res/layout/dialog_spoken_updates_picker.xml b/app/src/main/res/layout/dialog_spoken_updates_picker.xml new file mode 100644 index 0000000..f9e481d --- /dev/null +++ b/app/src/main/res/layout/dialog_spoken_updates_picker.xml @@ -0,0 +1,14 @@ + + + + + + diff --git a/app/src/main/res/xml/preferences_main.xml b/app/src/main/res/xml/preferences_main.xml index dd24e5a..cea1d6c 100644 --- a/app/src/main/res/xml/preferences_main.xml +++ b/app/src/main/res/xml/preferences_main.xml @@ -41,6 +41,13 @@ android:key="mapStyle" android:title="@string/mapStyle" /> + + @@ -55,4 +62,4 @@ - \ No newline at end of file + From ac3dfe4a7fbc8c3045e908e5b2bdbe1bb5eacbf9 Mon Sep 17 00:00:00 2001 From: Ruslan Sokolovski Date: Fri, 3 Jan 2020 15:02:17 -0800 Subject: [PATCH 3/8] allow to set the distance for speech updates --- .gitignore | 19 +++++++ .../activity/RecordWorkoutActivity.java | 56 +++++++++---------- .../fitness/activity/SettingsActivity.java | 44 ++++++++++----- .../tadris/fitness/data/UserPreferences.java | 8 ++- .../layout/dialog_spoken_updates_picker.xml | 16 ++++-- app/src/main/res/values-de/strings.xml | 7 ++- app/src/main/res/values/strings.xml | 2 + app/src/main/res/xml/preferences_main.xml | 6 +- 8 files changed, 103 insertions(+), 55 deletions(-) create mode 100644 .gitignore 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" /> From 7da68b6fc71891094bea349a6bed0a44daebd511 Mon Sep 17 00:00:00 2001 From: Ruslan Sokolovski Date: Fri, 3 Jan 2020 23:09:06 -0800 Subject: [PATCH 4/8] create the engine only once --- .../activity/RecordWorkoutActivity.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) 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 6faef2c..d734e4c 100644 --- a/app/src/main/java/de/tadris/fitness/activity/RecordWorkoutActivity.java +++ b/app/src/main/java/de/tadris/fitness/activity/RecordWorkoutActivity.java @@ -52,6 +52,7 @@ import org.mapsforge.map.layer.overlay.Polyline; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import de.tadris.fitness.Instance; import de.tadris.fitness.R; @@ -84,6 +85,8 @@ public class RecordWorkoutActivity extends FitoTrackActivity implements Location Intent locationListener; Intent pressureService; private boolean saved= false; + TextToSpeech tts; + boolean ttsReady = false; @Override protected void onCreate(Bundle savedInstanceState) { @@ -104,6 +107,9 @@ public class RecordWorkoutActivity extends FitoTrackActivity implements Location recorder= new WorkoutRecorder(this, ACTIVITY, this); recorder.start(); + tts = new TextToSpeech(this, (int status) -> { + ttsReady = status == TextToSpeech.SUCCESS && tts.setLanguage(Locale.getDefault())>=0; + }); infoViews[0]= new InfoViewHolder(findViewById(R.id.recordInfo1Title), findViewById(R.id.recordInfo1Value)); infoViews[1]= new InfoViewHolder(findViewById(R.id.recordInfo2Title), findViewById(R.id.recordInfo2Value)); infoViews[2]= new InfoViewHolder(findViewById(R.id.recordInfo3Title), findViewById(R.id.recordInfo3Value)); @@ -179,7 +185,6 @@ public class RecordWorkoutActivity extends FitoTrackActivity implements Location }).start(); } - TextToSpeech tts; long lastSpokenUpdateTime = 0; int lastSpokenUpdateDistance = 0; @@ -198,20 +203,17 @@ public class RecordWorkoutActivity extends FitoTrackActivity implements Location infoViews[3].setText(getString(R.string.workoutPauseDuration), UnitUtils.getHourMinuteSecondTime(recorder.getPauseDuration())); } - final UserPreferences prefs=Instance.getInstance(this).userPreferences; + 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 ( + final int intervalInMeters = (int) (1000.0 / UnitUtils.CHOSEN_SYSTEM.getDistanceFromKilometers(1) * prefs.getSpokenUpdateDistancePeriod()); + if (!ttsReady || (intervalT == 0 || duration / intervalT == lastSpokenUpdateTime / intervalT) && (intervalInMeters == 0 || distanceInMeters / intervalInMeters == lastSpokenUpdateDistance / intervalInMeters) ) return; - tts = new TextToSpeech(this, (int status) -> { - if (status != TextToSpeech.SUCCESS) return; - final String text = distanceCaption + ": " + distance + ". " - + avgSpeedCaption + ": " + avgSpeed; - tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, "updateDescription" + duration); - }); + final String text = distanceCaption + ": " + distance + ". " + + avgSpeedCaption + ": " + avgSpeed; + tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, "updateDescription" + duration); lastSpokenUpdateTime = duration; lastSpokenUpdateDistance = distanceInMeters; From a9ce6b2fdbdfad1142900608c3dbbd860e5ea5f1 Mon Sep 17 00:00:00 2001 From: Ruslan Sokolovski Date: Sat, 4 Jan 2020 18:47:47 -0800 Subject: [PATCH 5/8] false center slows down the map download --- app/src/main/java/de/tadris/fitness/map/MapManager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/de/tadris/fitness/map/MapManager.java b/app/src/main/java/de/tadris/fitness/map/MapManager.java index caa54c7..23efa99 100644 --- a/app/src/main/java/de/tadris/fitness/map/MapManager.java +++ b/app/src/main/java/de/tadris/fitness/map/MapManager.java @@ -62,7 +62,6 @@ public class MapManager { mapView.getLayerManager().redrawLayers(); mapView.setZoomLevel((byte) 18); - mapView.setCenter(new LatLong(52, 13)); return downloadLayer; } From 2b1a0057aa32b0a7ccf36a9bf1357e83b2a15795 Mon Sep 17 00:00:00 2001 From: Ruslan Sokolovski Date: Sat, 4 Jan 2020 18:48:07 -0800 Subject: [PATCH 6/8] higher zoom is achievable --- .../java/de/tadris/fitness/map/tilesource/MapnikTileSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/de/tadris/fitness/map/tilesource/MapnikTileSource.java b/app/src/main/java/de/tadris/fitness/map/tilesource/MapnikTileSource.java index 9ae1709..0d2396e 100644 --- a/app/src/main/java/de/tadris/fitness/map/tilesource/MapnikTileSource.java +++ b/app/src/main/java/de/tadris/fitness/map/tilesource/MapnikTileSource.java @@ -30,7 +30,7 @@ public class MapnikTileSource extends FitoTrackTileSource { "a.tile.openstreetmap.org", "b.tile.openstreetmap.org", "c.tile.openstreetmap.org"}, 443); private static final int PARALLEL_REQUESTS_LIMIT = 8; private static final String PROTOCOL = "https"; - private static final int ZOOM_LEVEL_MAX = 18; + private static final int ZOOM_LEVEL_MAX = 19; private static final int ZOOM_LEVEL_MIN = 0; private static final String NAME = "OSM Mapnik"; From 6b224bf264c2f6af0c08b9ea7a4048feb597c5a0 Mon Sep 17 00:00:00 2001 From: Ruslan Sokolovski Date: Sat, 4 Jan 2020 18:53:42 -0800 Subject: [PATCH 7/8] apparently GPL requires copyright --- .../layout/dialog_spoken_updates_picker.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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 6a6f613..3df099f 100644 --- a/app/src/main/res/layout/dialog_spoken_updates_picker.xml +++ b/app/src/main/res/layout/dialog_spoken_updates_picker.xml @@ -1,4 +1,22 @@ + From 819eb937dbe734a810ae97e510ebc7442ec79d34 Mon Sep 17 00:00:00 2001 From: Ruslan Sokolovski Date: Sat, 4 Jan 2020 18:56:14 -0800 Subject: [PATCH 8/8] is available at F-Droid --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index d64e0a3..0bf14b7 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ FitoTrack is a mobile app for logging and viewing your workouts. Whether you're running, cycling or hiking, FitoTrack will show you the most important information, with detailed charts and statistics. It is open-source and completely ad-free. -*(not downloadable on F-Droid yet)* -

Get it on Google Play Get it on F-Droid