Simplified voice announcement interface.

Part of #822.
This commit is contained in:
Dennis Guse
2021-07-17 18:44:27 +02:00
parent bd5bf530f0
commit bb90c53057
5 changed files with 25 additions and 62 deletions
@@ -50,6 +50,7 @@ import de.dennisguse.opentracks.services.handlers.EGM2008CorrectionManager;
import de.dennisguse.opentracks.services.handlers.GpsStatusValue; import de.dennisguse.opentracks.services.handlers.GpsStatusValue;
import de.dennisguse.opentracks.services.handlers.HandlerServer; import de.dennisguse.opentracks.services.handlers.HandlerServer;
import de.dennisguse.opentracks.services.tasks.AnnouncementPeriodicTask; import de.dennisguse.opentracks.services.tasks.AnnouncementPeriodicTask;
import de.dennisguse.opentracks.services.tasks.PeriodicTask;
import de.dennisguse.opentracks.services.tasks.PeriodicTaskExecutor; import de.dennisguse.opentracks.services.tasks.PeriodicTaskExecutor;
import de.dennisguse.opentracks.settings.SettingsActivity; import de.dennisguse.opentracks.settings.SettingsActivity;
import de.dennisguse.opentracks.stats.TrackStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
@@ -200,20 +201,6 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
return recordingStatus.isPaused(); return recordingStatus.isPaused();
} }
@Deprecated //TODO Only used by announcements; pass data instead of reference
public Track.Id getRecordingTrackId() {
return recordingStatus.getTrackId();
}
@Deprecated //TODO Only used by announcements; pass data instead of reference
public TrackStatistics getTrackStatistics() {
if (!isRecording()) {
return null;
}
return trackRecordingManager.getTrackStatistics();
}
public Marker.Id insertMarker(String name, String category, String description, String photoUrl) { public Marker.Id insertMarker(String name, String category, String description, String photoUrl) {
if (!isRecording() || isPaused()) { if (!isRecording() || isPaused()) {
return null; return null;
@@ -222,6 +209,10 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
return trackRecordingManager.insertMarker(name, category, description, photoUrl); return trackRecordingManager.insertMarker(name, category, description, photoUrl);
} }
public void run(@NonNull PeriodicTask periodicTask) {
periodicTask.run(recordingStatus.getTrackId(), trackRecordingManager.getTrackStatistics());
}
/** /**
* Starts a new track. * Starts a new track.
* *
@@ -264,7 +255,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
return; return;
} }
resumeTrack(getRecordingTrackId()); resumeTrack(recordingStatus.getTrackId());
} }
/** /**
@@ -301,7 +292,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
// Need to remember the recordingTrackId before setting it to null // Need to remember the recordingTrackId before setting it to null
boolean wasPause = isPaused(); boolean wasPause = isPaused();
Track.Id trackId = getRecordingTrackId(); Track.Id trackId = recordingStatus.getTrackId();
// Set recording status // Set recording status
updateRecordingStatus(STATUS_DEFAULT); updateRecordingStatus(STATUS_DEFAULT);
@@ -323,7 +314,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
} }
// Set recording status // Set recording status
updateRecordingStatus(new RecordingStatus(getRecordingTrackId(), true)); updateRecordingStatus(new RecordingStatus(recordingStatus.getTrackId(), true));
trackRecordingManager.pause(handlerServer); trackRecordingManager.pause(handlerServer);
@@ -383,7 +374,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
trackRecordingManager.onNewTrackPoint(trackPoint, thresholdHorizontalAccuracy); trackRecordingManager.onNewTrackPoint(trackPoint, thresholdHorizontalAccuracy);
notificationManager.updateTrackPoint(this, trackRecordingManager.getTrackStatistics(), trackPoint, thresholdHorizontalAccuracy); notificationManager.updateTrackPoint(this, trackRecordingManager.getTrackStatistics(), trackPoint, thresholdHorizontalAccuracy);
voiceExecutor.update(); voiceExecutor.update(recordingStatus.getTrackId(), trackRecordingManager.getTrackStatistics());
} }
@Override @Override
@@ -399,7 +390,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
private void showNotification(boolean isGpsStarted) { private void showNotification(boolean isGpsStarted) {
if (isRecording()) { if (isRecording()) {
Intent intent = IntentUtils.newIntent(this, TrackRecordingActivity.class) Intent intent = IntentUtils.newIntent(this, TrackRecordingActivity.class)
.putExtra(TrackRecordingActivity.EXTRA_TRACK_ID, getRecordingTrackId()); .putExtra(TrackRecordingActivity.EXTRA_TRACK_ID, recordingStatus.getTrackId());
PendingIntent pendingIntent = TaskStackBuilder.create(this) PendingIntent pendingIntent = TaskStackBuilder.create(this)
.addParentStack(TrackRecordingActivity.class) .addParentStack(TrackRecordingActivity.class)
.addNextIntent(intent) .addNextIntent(intent)
@@ -425,6 +416,10 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
} }
} }
public Duration getTotalTime() {
return trackRecordingManager.getTrackStatistics().getTotalTime();
}
@Deprecated @Deprecated
@VisibleForTesting @VisibleForTesting
public HandlerServer getHandlerServer() { public HandlerServer getHandlerServer() {
@@ -32,7 +32,6 @@ import de.dennisguse.opentracks.content.data.Distance;
import de.dennisguse.opentracks.content.data.Track; import de.dennisguse.opentracks.content.data.Track;
import de.dennisguse.opentracks.content.provider.ContentProviderUtils; import de.dennisguse.opentracks.content.provider.ContentProviderUtils;
import de.dennisguse.opentracks.content.provider.TrackPointIterator; import de.dennisguse.opentracks.content.provider.TrackPointIterator;
import de.dennisguse.opentracks.services.TrackRecordingService;
import de.dennisguse.opentracks.stats.TrackStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.util.AnnouncementUtils; import de.dennisguse.opentracks.util.AnnouncementUtils;
import de.dennisguse.opentracks.util.PreferencesUtils; import de.dennisguse.opentracks.util.PreferencesUtils;
@@ -130,21 +129,7 @@ public class AnnouncementPeriodicTask implements PeriodicTask {
} }
@Override @Override
public void run(@NonNull TrackRecordingService trackRecordingService) { public void run(@NonNull Track.Id trackId, @NonNull TrackStatistics trackStatistics) {
announce(trackRecordingService.getRecordingTrackId(), trackRecordingService.getTrackStatistics());
}
/**
* Runs this task.
*
* @param trackStatistics the track statistics
*/
private void announce(Track.Id trackId, TrackStatistics trackStatistics) {
if (trackStatistics == null) {
Log.e(TAG, "TrackStatistics is null.");
return;
}
synchronized (this) { synchronized (this) {
if (!ttsReady) { if (!ttsReady) {
ttsReady = ttsInitStatus == TextToSpeech.SUCCESS; ttsReady = ttsInitStatus == TextToSpeech.SUCCESS;
@@ -18,7 +18,8 @@ package de.dennisguse.opentracks.services.tasks;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.content.data.Track;
import de.dennisguse.opentracks.stats.TrackStatistics;
/** /**
* This is interface for a task that will be executed on some schedule. * This is interface for a task that will be executed on some schedule.
@@ -34,12 +35,9 @@ public interface PeriodicTask {
/** /**
* This method will be called periodically. * This method will be called periodically.
*
* @param trackRecordingService the track recording service
*/ */
@Deprecated @Deprecated
//TODO Pass actual data instead of TrackRecordingService void run(@NonNull Track.Id trackId, @NonNull TrackStatistics trackStatistics);
void run(@NonNull TrackRecordingService trackRecordingService);
/** /**
* Shuts down this task and clean up resources. * Shuts down this task and clean up resources.
@@ -24,6 +24,7 @@ import java.time.Duration;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.content.data.Distance; import de.dennisguse.opentracks.content.data.Distance;
import de.dennisguse.opentracks.content.data.Track;
import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.TrackRecordingService;
import de.dennisguse.opentracks.stats.TrackStatistics; import de.dennisguse.opentracks.stats.TrackStatistics;
@@ -55,6 +56,7 @@ public class PeriodicTaskExecutor {
private boolean metricUnits; private boolean metricUnits;
private TrackStatistics trackStatistics;
private Distance nextTaskDistance = Distance.of(Double.MAX_VALUE); private Distance nextTaskDistance = Distance.of(Double.MAX_VALUE);
public PeriodicTaskExecutor(@NonNull TrackRecordingService trackRecordingService, PeriodicTaskFactory periodicTaskFactory) { public PeriodicTaskExecutor(@NonNull TrackRecordingService trackRecordingService, PeriodicTaskFactory periodicTaskFactory) {
@@ -84,12 +86,6 @@ public class PeriodicTaskExecutor {
} }
periodicTask = periodicTaskFactory.create(trackRecordingService); periodicTask = periodicTaskFactory.create(trackRecordingService);
// Returning null is ok
if (periodicTask == null) {
Log.d(TAG, "Periodic task is null.");
return;
}
periodicTask.start(); periodicTask.start();
if (isTimeFrequency()) { if (isTimeFrequency()) {
@@ -120,18 +116,14 @@ public class PeriodicTaskExecutor {
/** /**
* Updates the executor. * Updates the executor.
*/ */
public void update() { public void update(@NonNull Track.Id trackId, @NonNull TrackStatistics trackStatistics) {
if (!isDistanceFrequency() || periodicTask == null) { if (!isDistanceFrequency() || periodicTask == null) {
return; return;
} }
TrackStatistics trackStatistics = trackRecordingService.getTrackStatistics();
if (trackStatistics == null) {
return;
}
if (trackStatistics.getTotalDistance().greaterThan(nextTaskDistance)) { if (trackStatistics.getTotalDistance().greaterThan(nextTaskDistance)) {
periodicTask.run(trackRecordingService); periodicTask.run(trackId, trackStatistics);
this.trackStatistics = trackStatistics;
updateNextTaskDistance(); updateNextTaskDistance();
} }
} }
@@ -157,7 +149,6 @@ public class PeriodicTaskExecutor {
return; return;
} }
TrackStatistics trackStatistics = trackRecordingService.getTrackStatistics();
if (trackStatistics == null) { if (trackStatistics == null) {
return; return;
} }
@@ -22,7 +22,6 @@ import java.util.Timer;
import java.util.TimerTask; import java.util.TimerTask;
import de.dennisguse.opentracks.services.TrackRecordingService; import de.dennisguse.opentracks.services.TrackRecordingService;
import de.dennisguse.opentracks.stats.TrackStatistics;
/** /**
* This class will periodically perform a task. * This class will periodically perform a task.
@@ -50,23 +49,18 @@ class TimerTaskExecutor {
return; return;
} }
TrackStatistics trackStatistics = trackRecordingService.getTrackStatistics();
if (trackStatistics == null) {
return;
}
shutdown(); shutdown();
periodicTask.start(); periodicTask.start();
timerTask = new TimerTask() { timerTask = new TimerTask() {
@Override @Override
public void run() { public void run() {
periodicTask.run(trackRecordingService); trackRecordingService.run(periodicTask);
} }
}; };
timer = new Timer(TimerTaskExecutor.class.getSimpleName()); timer = new Timer(TimerTaskExecutor.class.getSimpleName());
//TODO Simplify: far too complicated for it's purpose //TODO Simplify: far too complicated for it's purpose
long next = System.currentTimeMillis() + interval.toMillis() - (trackStatistics.getTotalTime().toMillis() % interval.toMillis()); long next = System.currentTimeMillis() + interval.toMillis() - (trackRecordingService.getTotalTime().toMillis() % interval.toMillis());
timer.scheduleAtFixedRate(timerTask, new Date(next), interval.toMillis()); timer.scheduleAtFixedRate(timerTask, new Date(next), interval.toMillis());
} }