TrackRecordingServices: managers register for sharedPreference changes.

This commit is contained in:
Dennis Guse
2022-01-22 19:21:16 +01:00
parent f4c07463b3
commit 708245bd50
7 changed files with 58 additions and 45 deletions
@@ -30,7 +30,6 @@ public class TrackRecordingServiceTestUtils {
service.getTrackPointCreator().setRemoteSensorManager(new BluetoothRemoteSensorManager(context, service.getTrackPointCreator()));
service.getTrackPointCreator().setClock(Clock.systemUTC());
service.endCurrentTrack();
service.sharedPreferenceChangeListener.onSharedPreferenceChanged(null, null);
}
static void sendGPSLocation(TrackPointCreator trackPointCreator, String time, double latitude, double longitude, float accuracy, long speed) {
@@ -2,6 +2,7 @@ package de.dennisguse.opentracks.services;
import android.content.ContentUris;
import android.content.Context;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteException;
import android.net.Uri;
import android.util.Log;
@@ -25,7 +26,7 @@ import de.dennisguse.opentracks.stats.TrackStatisticsUpdater;
import de.dennisguse.opentracks.util.TrackIconUtils;
import de.dennisguse.opentracks.util.TrackNameUtils;
class TrackRecordingManager {
class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChangeListener {
private static final String TAG = TrackRecordingManager.class.getSimpleName();
@@ -47,7 +48,15 @@ class TrackRecordingManager {
contentProviderUtils = new ContentProviderUtils(context);
}
Track.Id start(TrackPoint segmentStartTrackPoint, ZoneOffset zoneOffset) {
public void start() {
PreferencesUtils.registerOnSharedPreferenceChangeListener(this);
}
public void stop() {
PreferencesUtils.unregisterOnSharedPreferenceChangeListener(this);
}
Track.Id startNewTrack(TrackPoint segmentStartTrackPoint, ZoneOffset zoneOffset) {
// Create new track
Track track = new Track(zoneOffset);
trackId = contentProviderUtils.insertTrack(track);
@@ -69,7 +78,7 @@ class TrackRecordingManager {
}
//TODO Handle non-existing trackId? Start a new track or exception?
void resume(@NonNull Track.Id resumeTrackId, @NonNull TrackPoint segmentStartTrackPoint) {
void resumeExistingTrack(@NonNull Track.Id resumeTrackId, @NonNull TrackPoint segmentStartTrackPoint) {
trackId = resumeTrackId;
Track track = contentProviderUtils.getTrack(trackId);
if (track == null) {
@@ -242,7 +251,8 @@ class TrackRecordingManager {
}
}
public void onSharedPreferenceChanged(String key) {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (PreferencesUtils.isKey(R.string.recording_distance_interval_key, key)) {
recordingDistanceInterval = PreferencesUtils.getRecordingDistanceInterval();
}
@@ -18,8 +18,6 @@ package de.dennisguse.opentracks.services;
import android.app.Service;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.os.Bundle;
import android.os.Handler;
import android.os.PowerManager.WakeLock;
@@ -47,7 +45,6 @@ import de.dennisguse.opentracks.services.announcement.VoiceAnnouncementManager;
import de.dennisguse.opentracks.services.handlers.EGM2008CorrectionManager;
import de.dennisguse.opentracks.services.handlers.GpsStatusValue;
import de.dennisguse.opentracks.services.handlers.TrackPointCreator;
import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.settings.SettingsActivity;
import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.util.ExportUtils;
@@ -95,28 +92,6 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
}
};
@Deprecated
//TODO Workaround as service is not stopped on API23; thus sharedpreferences are not reset between tests.
@VisibleForTesting
final OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (PreferencesUtils.isKey(R.string.stats_units_key, key)) {
boolean metricUnits = PreferencesUtils.isMetricUnits();
notificationManager.setMetricUnits(metricUnits);
}
if (PreferencesUtils.isKey(R.string.voice_announcement_frequency_key, key)) {
voiceAnnouncementManager.setFrequency(PreferencesUtils.getVoiceAnnouncementFrequency());
}
if (PreferencesUtils.isKey(new int[]{R.string.voice_announcement_distance_key, R.string.stats_units_key}, key)) {
voiceAnnouncementManager.setFrequency(PreferencesUtils.getVoiceAnnouncementDistance());
}
trackPointCreator.onSharedPreferenceChanged(key);
trackRecordingManager.onSharedPreferenceChanged(key);
}
};
// The following variables are set when recording:
private WakeLock wakeLock;
@@ -139,13 +114,12 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
recordingDataObservable = new MutableLiveData<>(NOT_RECORDING);
trackRecordingManager = new TrackRecordingManager(this);
trackRecordingManager.start();
trackPointCreator = new TrackPointCreator(this);
voiceAnnouncementManager = new VoiceAnnouncementManager(this);
notificationManager = new TrackRecordingServiceNotificationManager(this);
PreferencesUtils.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
}
@Override
@@ -153,14 +127,14 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
handler.removeCallbacksAndMessages(null); //Some tests do not finish the recording completely
handler = null;
PreferencesUtils.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
trackPointCreator.stop();
trackPointCreator = null;
trackRecordingManager.stop();
trackRecordingManager = null;
// Reverse order from onCreate
showNotification(false); //TODO Why?
notificationManager.stop();
notificationManager = null;
try {
@@ -220,7 +194,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
// Set recording status
TrackPoint segmentStartManual = trackPointCreator.createSegmentStartManual();
ZoneOffset zoneOffset = ZoneOffset.systemDefault().getRules().getOffset(segmentStartManual.getTime());
Track.Id trackId = trackRecordingManager.start(segmentStartManual, zoneOffset);
Track.Id trackId = trackRecordingManager.startNewTrack(segmentStartManual, zoneOffset);
updateRecordingStatus(RecordingStatus.record(trackId));
startRecording();
@@ -235,7 +209,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
*/
public void resumeTrack(Track.Id trackId) {
trackPointCreator.reset();
trackRecordingManager.resume(trackId, trackPointCreator.createSegmentStartManual());
trackRecordingManager.resumeExistingTrack(trackId, trackPointCreator.createSegmentStartManual());
// Set recording status
updateRecordingStatus(RecordingStatus.record(trackId));
@@ -6,6 +6,7 @@ import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import androidx.annotation.VisibleForTesting;
@@ -17,6 +18,7 @@ import de.dennisguse.opentracks.TrackListActivity;
import de.dennisguse.opentracks.TrackRecordingActivity;
import de.dennisguse.opentracks.data.models.Distance;
import de.dennisguse.opentracks.data.models.TrackPoint;
import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.stats.TrackStatistics;
import de.dennisguse.opentracks.util.IntentUtils;
import de.dennisguse.opentracks.util.StringUtils;
@@ -24,7 +26,7 @@ import de.dennisguse.opentracks.util.StringUtils;
/**
* Manages the content of the notification shown by {@link TrackRecordingService}.
*/
class TrackRecordingServiceNotificationManager {
class TrackRecordingServiceNotificationManager implements SharedPreferences.OnSharedPreferenceChangeListener {
static final int NOTIFICATION_ID = 123;
@@ -39,6 +41,7 @@ class TrackRecordingServiceNotificationManager {
private Boolean metricUnits = null;
TrackRecordingServiceNotificationManager(Context context) {
PreferencesUtils.registerOnSharedPreferenceChangeListener(this);
notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel notificationChannel = new NotificationChannel(CHANNEL_ID, context.getString(R.string.app_name), NotificationManager.IMPORTANCE_HIGH);
@@ -59,6 +62,10 @@ class TrackRecordingServiceNotificationManager {
.setSmallIcon(R.drawable.ic_logo_color_24dp);
}
void stop() {
PreferencesUtils.unregisterOnSharedPreferenceChangeListener(this);
}
@VisibleForTesting
TrackRecordingServiceNotificationManager(NotificationManager notificationManager, NotificationCompat.Builder notificationBuilder) {
this.notificationManager = notificationManager;
@@ -144,4 +151,11 @@ class TrackRecordingServiceNotificationManager {
private Notification getNotification() {
return notificationBuilder.build();
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (PreferencesUtils.isKey(R.string.stats_units_key, key)) {
setMetricUnits(PreferencesUtils.isMetricUnits());
}
}
}
@@ -15,6 +15,7 @@
*/
package de.dennisguse.opentracks.services.announcement;
import android.content.SharedPreferences;
import android.util.Log;
import androidx.annotation.NonNull;
@@ -23,9 +24,11 @@ import androidx.annotation.VisibleForTesting;
import java.time.Duration;
import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.models.Distance;
import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.services.TrackRecordingService;
import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.stats.TrackStatistics;
/**
@@ -33,7 +36,7 @@ import de.dennisguse.opentracks.stats.TrackStatistics;
*
* @author Sandor Dornbush
*/
public class VoiceAnnouncementManager {
public class VoiceAnnouncementManager implements SharedPreferences.OnSharedPreferenceChangeListener {
private static final String TAG = VoiceAnnouncementManager.class.getSimpleName();
@@ -55,6 +58,7 @@ public class VoiceAnnouncementManager {
public VoiceAnnouncementManager(@NonNull TrackRecordingService trackRecordingService) {
this.trackRecordingService = trackRecordingService;
PreferencesUtils.registerOnSharedPreferenceChangeListener(this);
}
public void restore(@Nullable TrackStatistics trackStatistics) {
@@ -89,6 +93,7 @@ public class VoiceAnnouncementManager {
}
public void shutdown() {
PreferencesUtils.unregisterOnSharedPreferenceChangeListener(this);
if (voiceAnnouncement != null) {
voiceAnnouncement.shutdown();
voiceAnnouncement = null;
@@ -141,4 +146,15 @@ public class VoiceAnnouncementManager {
public Distance getNextTotalDistance() {
return nextTotalDistance;
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (PreferencesUtils.isKey(R.string.voice_announcement_frequency_key, key)) {
setFrequency(PreferencesUtils.getVoiceAnnouncementFrequency());
}
if (PreferencesUtils.isKey(new int[]{R.string.voice_announcement_distance_key, R.string.stats_units_key}, key)) {
setFrequency(PreferencesUtils.getVoiceAnnouncementDistance());
}
}
}
@@ -1,6 +1,7 @@
package de.dennisguse.opentracks.services.handlers;
import android.content.Context;
import android.content.SharedPreferences;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
@@ -19,7 +20,7 @@ import de.dennisguse.opentracks.settings.PreferencesUtils;
import de.dennisguse.opentracks.util.LocationUtils;
@VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
public class GPSHandler implements LocationListener, GpsStatus.GpsStatusListener {
public class GPSHandler implements LocationListener, GpsStatus.GpsStatusListener, SharedPreferences.OnSharedPreferenceChangeListener {
private final String TAG = GPSHandler.class.getSimpleName();
@@ -35,7 +36,7 @@ public class GPSHandler implements LocationListener, GpsStatus.GpsStatusListener
}
public void onStart(@NonNull Context context) {
onSharedPreferenceChanged(null);
PreferencesUtils.registerOnSharedPreferenceChangeListener(this);
gpsStatus = new GpsStatus(context, this);
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
registerLocationListener();
@@ -59,9 +60,11 @@ public class GPSHandler implements LocationListener, GpsStatus.GpsStatusListener
gpsStatus.stop();
gpsStatus = null;
}
PreferencesUtils.unregisterOnSharedPreferenceChangeListener(this);
}
public void onSharedPreferenceChanged(String key) {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
boolean registerListener = false;
if (PreferencesUtils.isKey(R.string.min_recording_interval_key, key)) {
@@ -57,6 +57,7 @@ public class TrackPointCreator implements BluetoothRemoteSensorManager.SensorDat
remoteSensorManager.start();
altitudeSumManager.start(context);
}
private boolean isStarted() {
@@ -107,10 +108,6 @@ public class TrackPointCreator implements BluetoothRemoteSensorManager.SensorDat
this.context = null;
}
public void onSharedPreferenceChanged(String key) {
gpsHandler.onSharedPreferenceChanged(key);
}
/**
* Got a new TrackPoint from Bluetooth only; contains no GPS location.
*/