Skip to content

Commit

Permalink
Announcements: added current time.
Browse files Browse the repository at this point in the history
Fixes #1683.
  • Loading branch information
dennisguse committed Dec 28, 2024
1 parent a2a9132 commit 8118319
Show file tree
Hide file tree
Showing 9 changed files with 144 additions and 42 deletions.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,13 @@ public ZoneOffset getZoneOffset() {
}

public OffsetDateTime getStartTime() {
return trackStatistics.getStartTime().atOffset(zoneOffset);
return trackStatistics
.getStartTime().atOffset(zoneOffset);
}

public OffsetDateTime getStopTime() {
return trackStatistics
.getStopTime().atOffset(zoneOffset);
}

@NonNull
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@
import android.media.MediaPlayer;
import android.speech.tts.TextToSpeech;
import android.speech.tts.UtteranceProgressListener;
import android.text.Spannable;
import android.util.Log;

import androidx.annotation.NonNull;
Expand Down Expand Up @@ -118,7 +117,7 @@ public void start() {
}
}

public void announce(@NonNull Spannable announcement) {
public void speak(@NonNull CharSequence announcement) {
synchronized (this) {
if (!ttsReady) {
ttsReady = ttsInitStatus == TextToSpeech.SUCCESS;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ public void announceIdle() {
return;
}

voiceAnnouncement.announce(VoiceAnnouncementUtils.createIdle(context));
voiceAnnouncement.speak(VoiceAnnouncementUtils.createIdle(context));
}

public void announceStatisticsIfNeeded(@NonNull Track track) {
Expand All @@ -135,7 +135,7 @@ public void announceStatisticsIfNeeded(@NonNull Track track) {
}

if (announce) {
voiceAnnouncement.announce(createAnnouncement(track));
voiceAnnouncement.speak(createAnnouncement(track));
}
}

Expand All @@ -155,7 +155,7 @@ private Spannable createAnnouncement(Track track) {
sensorStatistics = contentProviderUtils.getSensorStats(track.getId());
}

return VoiceAnnouncementUtils.createStatistics(context, track.getTrackStatistics(), PreferencesUtils.getUnitSystem(), PreferencesUtils.isReportSpeed(track), lastInterval, sensorStatistics);
return VoiceAnnouncementUtils.createStatistics(context, track, PreferencesUtils.getUnitSystem(), PreferencesUtils.isReportSpeed(track), lastInterval, sensorStatistics);
}

public void stop() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,25 +7,30 @@
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceLapPower;
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceLapSpeedPace;
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceMovingTime;
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceTime;
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceTotalDistance;
import static de.dennisguse.opentracks.settings.PreferencesUtils.shouldVoiceAnnounceUnit;

import android.content.Context;
import android.icu.text.MessageFormat;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.style.TtsSpan;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.time.Duration;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.util.Map;

import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.models.Distance;
import de.dennisguse.opentracks.data.models.Power;
import de.dennisguse.opentracks.data.models.Speed;
import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.settings.UnitSystem;
import de.dennisguse.opentracks.stats.SensorStatistics;
import de.dennisguse.opentracks.stats.TrackStatistics;
Expand All @@ -42,8 +47,15 @@ static Spannable createIdle(Context context) {
.append(context.getString(R.string.voiceIdle));
}

static Spannable createStatistics(Context context, TrackStatistics trackStatistics, UnitSystem unitSystem, boolean isReportSpeed, @Nullable IntervalStatistics.Interval currentInterval, @Nullable SensorStatistics sensorStatistics) {
static Spannable createStatistics(Context context, Track track, UnitSystem unitSystem, boolean isReportSpeed, @Nullable IntervalStatistics.Interval currentInterval, @Nullable SensorStatistics sensorStatistics) {
TrackStatistics trackStatistics = track.getTrackStatistics();

SpannableStringBuilder builder = new SpannableStringBuilder();

if (shouldVoiceAnnounceTime()) {
appendTime(builder, track.getStopTime());
}

Distance totalDistance = trackStatistics.getTotalDistance();
Speed averageMovingSpeed = trackStatistics.getAverageMovingSpeed();
Speed currentDistancePerTime = currentInterval != null ? currentInterval.getSpeed() : null;
Expand Down Expand Up @@ -177,6 +189,7 @@ static Spannable createStatistics(Context context, TrackStatistics trackStatisti
return builder;
}

//TODO TtsSpan.TimeBuilder?
private static void appendDuration(@NonNull Context context, @NonNull SpannableStringBuilder builder, @NonNull Duration duration) {
int hours = (int) (duration.toHours());
int minutes = (int) (duration.toMinutes() % 60);
Expand All @@ -196,6 +209,20 @@ private static void appendDuration(@NonNull Context context, @NonNull SpannableS
}
}

private static void appendTime(@NonNull SpannableStringBuilder builder, OffsetDateTime now) {
TtsSpan.TimeBuilder ttsSpan = new TtsSpan.TimeBuilder();
ttsSpan.setHours(now.getHour());
ttsSpan.setMinutes(now.getMinute());

String formattedTime = DateTimeFormatter.ofLocalizedTime(FormatStyle.SHORT)
.format(now);

Spannable spannable = new SpannableString(formattedTime + ".");
spannable.setSpan(ttsSpan.build(), 0, spannable.length(), SPAN_INCLUSIVE_EXCLUSIVE);
builder.append(spannable);
builder.append(" ");
}

/**
* Speaks as: 98.14 [UNIT] - ninety eight point one four [UNIT with correct plural form]
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -332,6 +332,10 @@ public static boolean shouldVoiceAnnouncementIdle() {
return getBoolean(R.string.voice_announce_idle_key, true);
}

public static boolean shouldVoiceAnnounceTime() {
return getBoolean(R.string.voice_announce_unit_key, true);
}

public static boolean shouldVoiceAnnounceUnit() {
return getBoolean(R.string.voice_announce_unit_key, true);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@ public class TrackStatistics {
private final ExtremityMonitor altitudeExtremities = new ExtremityMonitor();

// The track start time.
private Instant startTime;
private Instant startTime; //TODO Should never be null!
// The track stop time.
private Instant stopTime;
private Instant stopTime; //TODO Should never be null!

private Distance totalDistance;
// Updated when new points are received, may be stale.
Expand Down
2 changes: 2 additions & 0 deletions src/main/res/values/settings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,8 @@
<bool name="voice_announce_average_speed_pace_default" translatable="false">true</bool>
<string name="voice_announce_lap_speed_pace_key" translatable="false">voiceAnnounceLapSpeedPace</string>
<bool name="voice_announce_lap_speed_pace_default" translatable="false">true</bool>
<string name="voice_announce_time_key" translatable="false">voiceAnnounceTime</string>
<bool name="voice_announce_time_default" translatable="false">true</bool>
<string name="voice_announce_unit_key" translatable="false">voiceAnnounceUnit</string>
<bool name="voice_announce_unit_default" translatable="false">true</bool>

Expand Down
5 changes: 5 additions & 0 deletions src/main/res/xml/settings_announcements.xml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@
android:title="@string/settings_announcements_totaltime_frequency"
app:useSimpleSummaryProvider="true" />

<SwitchPreferenceCompat
android:defaultValue="@bool/voice_announce_time_default"
android:key="@string/voice_announce_time_key"
android:title="@string/description_time" />

<SwitchPreferenceCompat
android:defaultValue="@bool/voice_announce_total_distance_default"
android:key="@string/voice_announce_total_distance_key"
Expand Down

0 comments on commit 8118319

Please sign in to comment.