From 708245bd50063c10b654b2212b765f54cf3ea5fe Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Sat, 22 Jan 2022 19:21:16 +0100 Subject: [PATCH] TrackRecordingServices: managers register for sharedPreference changes. --- .../TrackRecordingServiceTestUtils.java | 1 - .../services/TrackRecordingManager.java | 18 +++++++--- .../services/TrackRecordingService.java | 36 +++---------------- ...ckRecordingServiceNotificationManager.java | 16 ++++++++- .../VoiceAnnouncementManager.java | 18 +++++++++- .../services/handlers/GPSHandler.java | 9 +++-- .../services/handlers/TrackPointCreator.java | 5 +-- 7 files changed, 58 insertions(+), 45 deletions(-) diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestUtils.java b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestUtils.java index 3200da220..66d60e79f 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestUtils.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestUtils.java @@ -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) { diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java index 3729b8a0d..858355aeb 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingManager.java @@ -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(); } diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java index 200fec985..49ee59f5e 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java @@ -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)); diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java index 31c366d3f..f996ed1be 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java @@ -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()); + } + } } diff --git a/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementManager.java b/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementManager.java index b24afe2a2..aa52f5ef3 100644 --- a/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/announcement/VoiceAnnouncementManager.java @@ -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()); + } + } } diff --git a/src/main/java/de/dennisguse/opentracks/services/handlers/GPSHandler.java b/src/main/java/de/dennisguse/opentracks/services/handlers/GPSHandler.java index 49ae180f9..e00939e67 100644 --- a/src/main/java/de/dennisguse/opentracks/services/handlers/GPSHandler.java +++ b/src/main/java/de/dennisguse/opentracks/services/handlers/GPSHandler.java @@ -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)) { diff --git a/src/main/java/de/dennisguse/opentracks/services/handlers/TrackPointCreator.java b/src/main/java/de/dennisguse/opentracks/services/handlers/TrackPointCreator.java index a3098f5f1..860ae0596 100644 --- a/src/main/java/de/dennisguse/opentracks/services/handlers/TrackPointCreator.java +++ b/src/main/java/de/dennisguse/opentracks/services/handlers/TrackPointCreator.java @@ -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. */