From 15fbd90ca4579d696d1e852bf10c4ecea3321736 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Mon, 15 Mar 2021 12:01:32 +0100 Subject: [PATCH] Performance: Keep reference to sharedPreferences. So far, we opened the SharedPreferences very often, which is very slow; also happened in the UI thread a lot. Fixes #642. --- .../io/file/importer/ExportImportTest.java | 6 +- .../services/TrackRecordingServiceTest.java | 14 +- .../TrackRecordingServiceTestLooper.java | 31 +-- .../services/handlers/HandlerServerTest.java | 8 +- .../handlers/LocationHandlerTest.java | 8 +- .../util/AnnouncementUtilsTest.java | 9 +- .../opentracks/util/PreferencesUtilsTest.java | 16 +- .../opentracks/util/TrackNameUtilsTest.java | 9 +- .../opentracks/AbstractListActivity.java | 2 +- .../opentracks/MarkerListActivity.java | 8 +- .../de/dennisguse/opentracks/Startup.java | 13 +- .../opentracks/TrackListActivity.java | 10 +- .../opentracks/TrackRecordedActivity.java | 2 +- .../opentracks/TrackRecordingActivity.java | 12 +- .../adapters/AggregatedStatisticsAdapter.java | 5 +- .../adapters/IntervalStatisticsAdapter.java | 5 +- .../opentracks/content/TrackDataHub.java | 15 +- .../opentracks/fragments/ChartFragment.java | 34 +-- .../fragments/IntervalsFragment.java | 17 +- .../fragments/StatisticsRecordedFragment.java | 2 +- .../importer/AbstractFileTrackImporter.java | 10 +- .../importer/DirectoryChooserActivity.java | 23 +- .../services/TrackRecordingService.java | 35 +-- .../TrackRecordingServiceConnection.java | 6 +- ...ckRecordingServiceNotificationManager.java | 2 +- .../services/handlers/GpsStatus.java | 16 +- .../services/handlers/HandlerServer.java | 15 +- .../services/handlers/LocationHandler.java | 16 +- .../sensors/BluetoothRemoteSensorManager.java | 14 +- .../tasks/AnnouncementPeriodicTask.java | 16 +- .../settings/ActivityTypePreference.java | 19 +- .../opentracks/settings/SettingsActivity.java | 29 ++- .../opentracks/util/ActivityUtils.java | 5 +- .../opentracks/util/AnnouncementUtils.java | 14 +- .../opentracks/util/ExportUtils.java | 8 +- .../opentracks/util/IntentDashboardUtils.java | 9 +- .../opentracks/util/IntentUtils.java | 2 +- .../opentracks/util/PreferencesUtils.java | 231 ++++++------------ .../opentracks/util/TrackNameUtils.java | 3 +- 39 files changed, 355 insertions(+), 344 deletions(-) diff --git a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java index e06e01ee4..8d4e064be 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/io/file/importer/ExportImportTest.java @@ -2,6 +2,7 @@ package de.dennisguse.opentracks.io.file.importer; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.location.Location; import android.os.Looper; import android.util.Log; @@ -69,6 +70,7 @@ public class ExportImportTest { } private final Context context = ApplicationProvider.getApplicationContext(); + private final SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); private final ContentProviderUtils contentProviderUtils = new ContentProviderUtils(context); @@ -212,7 +214,7 @@ public class ExportImportTest { @Test(expected = ImportAlreadyExistsException.class) public void kml_with_trackdetail_and_sensordata_duplicate_trackUUID() { // given - PreferencesUtils.setBoolean(context, R.string.import_prevent_reimport_key, true); + PreferencesUtils.setBoolean(sharedPreferences, context, R.string.import_prevent_reimport_key, true); Track track = contentProviderUtils.getTrack(trackId); TrackExporter trackExporter = TrackFileFormat.KML_WITH_TRACKDETAIL_AND_SENSORDATA.createTrackExporter(context); @@ -314,7 +316,7 @@ public class ExportImportTest { @Test(expected = ImportAlreadyExistsException.class) public void gpx_duplicate_trackUUID() { // given - PreferencesUtils.setBoolean(context, R.string.import_prevent_reimport_key, true); + PreferencesUtils.setBoolean(sharedPreferences, context, R.string.import_prevent_reimport_key, true); Track track = contentProviderUtils.getTrack(trackId); TrackExporter trackExporter = TrackFileFormat.GPX.createTrackExporter(context); diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTest.java b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTest.java index 2bb021b73..cbecfdd5a 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTest.java @@ -84,6 +84,7 @@ public class TrackRecordingServiceTest { private final Context context = ApplicationProvider.getApplicationContext(); + private final SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); private ContentProviderUtils contentProviderUtils; private final Track.Id trackId = new Track.Id(Math.abs(new Random().nextLong())); @@ -302,7 +303,7 @@ public class TrackRecordingServiceTest { // when // Just set recording track to a bogus value. // Make sure that the service will not start recording and will clear the bogus track. - PreferencesUtils.setLong(context, R.string.recording_track_id_key, 123L); + PreferencesUtils.setLong(sharedPreferences, context, R.string.recording_track_id_key, 123L); // then assertFalse(service.isRecording()); @@ -325,7 +326,7 @@ public class TrackRecordingServiceTest { // then assertNull(newTrackId); - assertEquals(trackId, PreferencesUtils.getRecordingTrackId(context)); + assertEquals(trackId, PreferencesUtils.getRecordingTrackId(sharedPreferences, context)); assertEquals(trackId, service.getRecordingTrackId()); } @@ -341,7 +342,7 @@ public class TrackRecordingServiceTest { service.endCurrentTrack(); // then - assertFalse(PreferencesUtils.isRecording(context)); + assertFalse(PreferencesUtils.isRecording(sharedPreferences, context)); assertNull(service.getRecordingTrackId()); } @@ -388,8 +389,8 @@ public class TrackRecordingServiceTest { assertNotNull(track.getId()); contentProviderUtils.insertTrack(track); assertEquals(track.getId(), contentProviderUtils.getTrack(track.getId()).getId()); - PreferencesUtils.setLong(context, R.string.recording_track_id_key, isRecording ? track.getId().getId() : PreferencesUtils.RECORDING_TRACK_ID_DEFAULT); - PreferencesUtils.setBoolean(context, R.string.recording_track_paused_key, !isRecording); + PreferencesUtils.setLong(sharedPreferences, context, R.string.recording_track_id_key, isRecording ? track.getId().getId() : PreferencesUtils.RECORDING_TRACK_ID_DEFAULT); + PreferencesUtils.setBoolean(sharedPreferences, context, R.string.recording_track_paused_key, !isRecording); } // NOTE: Do not use to create a track that is currently recording. @@ -422,7 +423,6 @@ public class TrackRecordingServiceTest { location.setTime(time); location.setBearing(3.0f); TrackPoint trackPoint = new TrackPoint(location); - int prefAccuracy = PreferencesUtils.getRecordingGPSAccuracy(ApplicationProvider.getApplicationContext()); - trackRecordingService.newTrackPoint(trackPoint, prefAccuracy); + trackRecordingService.newTrackPoint(trackPoint, 50); } } diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLooper.java b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLooper.java index 55a81e8c8..9b58ac784 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLooper.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/TrackRecordingServiceTestLooper.java @@ -53,6 +53,7 @@ public class TrackRecordingServiceTestLooper { public final ServiceTestRule mServiceRule = ServiceTestRule.withTimeout(5, TimeUnit.SECONDS); private final Context context = ApplicationProvider.getApplicationContext(); + private final SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); private ContentProviderUtils contentProviderUtils; @@ -99,28 +100,28 @@ public class TrackRecordingServiceTestLooper { @MediumTest @Test public void testWithProperties_minRequiredAccuracy() throws TimeoutException { - PreferencesUtils.setInt(context, R.string.recording_gps_accuracy_key, 500); + PreferencesUtils.setInt(sharedPreferences, context, R.string.recording_gps_accuracy_key, 500); fullRecordingSession(); } @MediumTest @Test public void testWithProperties_voiceFrequencyDefault() throws TimeoutException { - PreferencesUtils.setInt(context, R.string.voice_frequency_key, Integer.parseInt(context.getResources().getString(R.string.voice_frequency_default))); + PreferencesUtils.setInt(sharedPreferences, context, R.string.voice_frequency_key, Integer.parseInt(context.getResources().getString(R.string.voice_frequency_default))); fullRecordingSession(); } @MediumTest @Test public void testWithProperties_voiceFrequencyByDistance() throws TimeoutException { - PreferencesUtils.setInt(context, R.string.voice_frequency_key, -1); + PreferencesUtils.setInt(sharedPreferences, context, R.string.voice_frequency_key, -1); fullRecordingSession(); } @MediumTest @Test public void testWithProperties_voiceFrequencyByTime() throws TimeoutException { - PreferencesUtils.setInt(context, R.string.voice_frequency_key, 1); + PreferencesUtils.setInt(sharedPreferences, context, R.string.voice_frequency_key, 1); fullRecordingSession(); } @@ -128,14 +129,14 @@ public class TrackRecordingServiceTestLooper { @MediumTest @Test public void testWithProperties_maxRecordingDistanceDefault() throws TimeoutException { - PreferencesUtils.setInt(context, R.string.max_recording_distance_key, Integer.parseInt(context.getResources().getString(R.string.max_recording_distance_default))); + PreferencesUtils.setInt(sharedPreferences, context, R.string.max_recording_distance_key, Integer.parseInt(context.getResources().getString(R.string.max_recording_distance_default))); fullRecordingSession(); } @MediumTest @Test public void testWithProperties_maxRecordingDistance() throws TimeoutException { - PreferencesUtils.setInt(context, R.string.max_recording_distance_key, 50); + PreferencesUtils.setInt(sharedPreferences, context, R.string.max_recording_distance_key, 50); fullRecordingSession(); } @@ -143,42 +144,42 @@ public class TrackRecordingServiceTestLooper { @Test public void testWithProperties_minRecordingDistanceDefault() throws TimeoutException { int minRecordingIntervalDefault = Integer.parseInt(context.getResources().getString(R.string.min_recording_interval_default)); - PreferencesUtils.setInt(context, R.string.recording_distance_interval_key, minRecordingIntervalDefault); + PreferencesUtils.setInt(sharedPreferences, context, R.string.recording_distance_interval_key, minRecordingIntervalDefault); fullRecordingSession(); } @MediumTest @Test public void testWithProperties_minRecordingDistance() throws TimeoutException { - PreferencesUtils.setInt(context, R.string.recording_distance_interval_key, 2); + PreferencesUtils.setInt(sharedPreferences, context, R.string.recording_distance_interval_key, 2); fullRecordingSession(); } @MediumTest @Test public void testWithProperties_metricUnitsDefault() throws TimeoutException { - PreferencesUtils.setString(context, R.string.stats_units_key, context.getString(R.string.stats_units_default)); + PreferencesUtils.setString(sharedPreferences, context, R.string.stats_units_key, context.getString(R.string.stats_units_default)); fullRecordingSession(); } @MediumTest @Test public void testWithProperties_metricUnitsDisabled() throws TimeoutException { - PreferencesUtils.setString(context, R.string.stats_units_key, context.getString(R.string.stats_units_imperial)); + PreferencesUtils.setString(sharedPreferences, context, R.string.stats_units_key, context.getString(R.string.stats_units_imperial)); fullRecordingSession(); } @MediumTest @Test public void testWithProperties_minRecordingIntervalDefault() throws TimeoutException { - PreferencesUtils.setInt(context, R.string.min_recording_interval_key, Integer.parseInt(context.getResources().getString(R.string.min_recording_interval_default))); + PreferencesUtils.setInt(sharedPreferences, context, R.string.min_recording_interval_key, Integer.parseInt(context.getResources().getString(R.string.min_recording_interval_default))); fullRecordingSession(); } @MediumTest @Test public void testWithProperties_minRecordingInterval() throws TimeoutException { - PreferencesUtils.setInt(context, R.string.min_recording_interval_key, 2); + PreferencesUtils.setInt(sharedPreferences, context, R.string.min_recording_interval_key, 2); fullRecordingSession(); } @@ -186,7 +187,7 @@ public class TrackRecordingServiceTestLooper { @Test public void testWithProperties_minRequiredAccuracyDefault() throws TimeoutException { int recordingGPSAccuracyDefault = Integer.parseInt(context.getResources().getString(R.string.recording_gps_accuracy_default)); - PreferencesUtils.setInt(context, R.string.recording_gps_accuracy_key, recordingGPSAccuracyDefault); + PreferencesUtils.setInt(sharedPreferences, context, R.string.recording_gps_accuracy_key, recordingGPSAccuracyDefault); fullRecordingSession(); } @@ -209,7 +210,7 @@ public class TrackRecordingServiceTestLooper { Track track = contentProviderUtils.getTrack(trackId); assertNotNull(track); assertEquals(trackId, track.getId()); - assertEquals(trackId, PreferencesUtils.getRecordingTrackId(context)); + assertEquals(trackId, PreferencesUtils.getRecordingTrackId(sharedPreferences, context)); assertEquals(trackId, service.getRecordingTrackId()); // Insert a few points, markers and statistics. @@ -223,7 +224,7 @@ public class TrackRecordingServiceTestLooper { location.setTime(startTime + i * 10000); location.setBearing(3.0f); TrackPoint trackPoint = new TrackPoint(location); - int prefAccuracy = PreferencesUtils.getRecordingGPSAccuracy(context); + int prefAccuracy = PreferencesUtils.getRecordingGPSAccuracy(sharedPreferences, context); service.newTrackPoint(trackPoint, prefAccuracy); if (i % 7 == 0) { diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/handlers/HandlerServerTest.java b/src/androidTest/java/de/dennisguse/opentracks/services/handlers/HandlerServerTest.java index a449e1325..3dd8281f5 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/handlers/HandlerServerTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/handlers/HandlerServerTest.java @@ -1,6 +1,7 @@ package de.dennisguse.opentracks.services.handlers; import android.content.Context; +import android.content.SharedPreferences; import org.junit.After; import org.junit.Before; @@ -25,6 +26,9 @@ public class HandlerServerTest { @Mock private LocationHandler locationHandler; + @Mock + private SharedPreferences sharedPreferences; + private HandlerServer subject; @Before @@ -41,10 +45,10 @@ public class HandlerServerTest { @Test public void onSharedPreferenceChanged() { // when - subject.onSharedPreferenceChanged(null, null, null); + subject.onSharedPreferenceChanged(context, sharedPreferences, null); // then - verify(locationHandler).onSharedPreferenceChanged(null, null, null); + verify(locationHandler).onSharedPreferenceChanged(context, sharedPreferences, null); } @Test diff --git a/src/androidTest/java/de/dennisguse/opentracks/services/handlers/LocationHandlerTest.java b/src/androidTest/java/de/dennisguse/opentracks/services/handlers/LocationHandlerTest.java index b5e6f98a7..0ca9a5584 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/services/handlers/LocationHandlerTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/services/handlers/LocationHandlerTest.java @@ -27,6 +27,7 @@ import static org.mockito.Mockito.verify; public class LocationHandlerTest { private final Context context = ApplicationProvider.getApplicationContext(); + private final SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); @Mock private HandlerServer handlerServer; @@ -43,11 +44,10 @@ public class LocationHandlerTest { @Before public void setUp() { // Let's use default values. - SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); sharedPreferences.edit().clear().commit(); - locationHandler.onSharedPreferenceChanged(context, PreferencesUtils.getSharedPreferences(context), context.getString(R.string.recording_gps_accuracy_key)); - locationHandler.onSharedPreferenceChanged(context, PreferencesUtils.getSharedPreferences(context), context.getString(R.string.min_recording_interval_key)); + locationHandler.onSharedPreferenceChanged(context, sharedPreferences, context.getString(R.string.recording_gps_accuracy_key)); + locationHandler.onSharedPreferenceChanged(context, sharedPreferences, context.getString(R.string.min_recording_interval_key)); locationHandler.onStart(context); } @@ -85,7 +85,7 @@ public class LocationHandlerTest { @Test public void testOnLocationChanged_poorAccuracy() { // given - int prefAccuracy = PreferencesUtils.getRecordingGPSAccuracy(context); + int prefAccuracy = PreferencesUtils.getRecordingGPSAccuracy(sharedPreferences, context); // when locationHandler.onLocationChanged(createLocation(45f, 35f, prefAccuracy + 1, 5, System.currentTimeMillis())); diff --git a/src/androidTest/java/de/dennisguse/opentracks/util/AnnouncementUtilsTest.java b/src/androidTest/java/de/dennisguse/opentracks/util/AnnouncementUtilsTest.java index 684a1119a..3fc42ecc1 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/util/AnnouncementUtilsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/util/AnnouncementUtilsTest.java @@ -11,7 +11,6 @@ import org.junit.runner.RunWith; import java.time.Duration; import java.util.List; -import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.content.data.TestDataUtil; import de.dennisguse.opentracks.content.data.Track; import de.dennisguse.opentracks.content.data.TrackPoint; @@ -27,8 +26,6 @@ public class AnnouncementUtilsTest { @Test public void getAnnouncement_metric() { - PreferencesUtils.setString(context, R.string.stats_units_key, context.getString(R.string.stats_units_metric)); - TrackStatistics stats = new TrackStatistics(); stats.setTotalDistance(20000); stats.setTotalTime(Duration.ofMillis(600000)); @@ -37,7 +34,7 @@ public class AnnouncementUtilsTest { stats.setTotalElevationGain(6000f); // when - String announcement = AnnouncementUtils.getAnnouncement(context, stats, "airplane", null); + String announcement = AnnouncementUtils.getAnnouncement(context, stats, true, true, null); // then assertEquals("OpenTracks total distance 20.00 kilometers in 5 minutes 0 seconds at 240.0 kilometers per hour", announcement); @@ -45,8 +42,6 @@ public class AnnouncementUtilsTest { @Test public void getAnnouncement_withInterval_metric() { - PreferencesUtils.setString(context, R.string.stats_units_key, context.getString(R.string.stats_units_metric)); - TrackStatistics stats = new TrackStatistics(); stats.setTotalDistance(20000); stats.setTotalTime(Duration.ofMillis(600000)); @@ -61,7 +56,7 @@ public class AnnouncementUtilsTest { String expected = "OpenTracks total distance 20.00 kilometers in 5 minutes 0 seconds at 240.0 kilometers per hour Lap speed of 51.2 kilometers per hour"; // when - String announcement = AnnouncementUtils.getAnnouncement(context, stats, "airplane", lastInterval); + String announcement = AnnouncementUtils.getAnnouncement(context, stats, true, true, lastInterval); // then assertEquals(expected, announcement); diff --git a/src/androidTest/java/de/dennisguse/opentracks/util/PreferencesUtilsTest.java b/src/androidTest/java/de/dennisguse/opentracks/util/PreferencesUtilsTest.java index 32ce97004..d3e8e03eb 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/util/PreferencesUtilsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/util/PreferencesUtilsTest.java @@ -22,12 +22,14 @@ public class PreferencesUtilsTest { @Test public void ExportTrackFileFormat_ok() { // given - SharedPreferences.Editor editor = PreferencesUtils.getSharedPreferences(context).edit(); + SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putString(context.getString(R.string.export_trackfileformat_key), TrackFileFormat.KMZ_WITH_TRACKDETAIL.name()); editor.commit(); // when - TrackFileFormat trackFileFormat = PreferencesUtils.getExportTrackFileFormat(context); + TrackFileFormat trackFileFormat = PreferencesUtils.getExportTrackFileFormat(sharedPreferences, context); // then assertEquals(TrackFileFormat.KMZ_WITH_TRACKDETAIL, trackFileFormat); @@ -36,12 +38,13 @@ public class PreferencesUtilsTest { @Test public void ExportTrackFileFormat_invalid() { // given - SharedPreferences.Editor editor = PreferencesUtils.getSharedPreferences(context).edit(); + SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); + SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString(context.getString(R.string.export_trackfileformat_key), "invalid"); editor.commit(); // when - TrackFileFormat trackFileFormat = PreferencesUtils.getExportTrackFileFormat(context); + TrackFileFormat trackFileFormat = PreferencesUtils.getExportTrackFileFormat(sharedPreferences, context); // then assertEquals(TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA, trackFileFormat); @@ -50,12 +53,13 @@ public class PreferencesUtilsTest { @Test public void ExportTrackFileFormat_noValue() { // given - SharedPreferences.Editor editor = PreferencesUtils.getSharedPreferences(context).edit(); + SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); + SharedPreferences.Editor editor = sharedPreferences.edit(); editor.clear(); editor.commit(); // when - TrackFileFormat trackFileFormat = PreferencesUtils.getExportTrackFileFormat(context); + TrackFileFormat trackFileFormat = PreferencesUtils.getExportTrackFileFormat(sharedPreferences, context); // then assertEquals(TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA, trackFileFormat); diff --git a/src/androidTest/java/de/dennisguse/opentracks/util/TrackNameUtilsTest.java b/src/androidTest/java/de/dennisguse/opentracks/util/TrackNameUtilsTest.java index a51bc4c7b..27d322722 100644 --- a/src/androidTest/java/de/dennisguse/opentracks/util/TrackNameUtilsTest.java +++ b/src/androidTest/java/de/dennisguse/opentracks/util/TrackNameUtilsTest.java @@ -17,6 +17,7 @@ package de.dennisguse.opentracks.util; import android.content.Context; +import android.content.SharedPreferences; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -46,12 +47,14 @@ public class TrackNameUtilsTest { private static final Context CONTEXT = ApplicationProvider.getApplicationContext(); + private static final SharedPreferences SHARED_PREFERENCES = PreferencesUtils.getSharedPreferences(CONTEXT); + /** * Tests when the track_name_key is settings_recording_track_name_date_local_value. */ @Test public void testTrackName_date_local() { - PreferencesUtils.setString(CONTEXT, R.string.track_name_key, CONTEXT.getString(R.string.settings_recording_track_name_date_local_value)); + PreferencesUtils.setString(SHARED_PREFERENCES, CONTEXT, R.string.track_name_key, CONTEXT.getString(R.string.settings_recording_track_name_date_local_value)); assertEquals(StringUtils.formatDateTime(CONTEXT, START_TIME), TrackNameUtils.getTrackName(CONTEXT, TRACK_ID, START_TIME)); } @@ -60,7 +63,7 @@ public class TrackNameUtilsTest { */ @Test public void testTrackName_date_iso_8601() { - PreferencesUtils.setString(CONTEXT, R.string.track_name_key, CONTEXT.getString(R.string.settings_recording_track_name_date_iso_8601_value)); + PreferencesUtils.setString(SHARED_PREFERENCES, CONTEXT, R.string.track_name_key, CONTEXT.getString(R.string.settings_recording_track_name_date_iso_8601_value)); SimpleDateFormat simpleDateFormat = new SimpleDateFormat(TrackNameUtils.ISO_8601_FORMAT, Locale.US); assertEquals(simpleDateFormat.format(START_TIME.toEpochMilli()), TrackNameUtils.getTrackName(CONTEXT, TRACK_ID, START_TIME)); } @@ -70,7 +73,7 @@ public class TrackNameUtilsTest { */ @Test public void testTrackName_number() { - PreferencesUtils.setString(CONTEXT, R.string.track_name_key, CONTEXT.getString(R.string.settings_recording_track_name_number_value)); + PreferencesUtils.setString(SHARED_PREFERENCES, CONTEXT, R.string.track_name_key, CONTEXT.getString(R.string.settings_recording_track_name_number_value)); assertEquals("Track " + TRACK_ID.getId(), TrackNameUtils.getTrackName(CONTEXT, TRACK_ID, START_TIME)); } } diff --git a/src/main/java/de/dennisguse/opentracks/AbstractListActivity.java b/src/main/java/de/dennisguse/opentracks/AbstractListActivity.java index 468172161..e63be345b 100644 --- a/src/main/java/de/dennisguse/opentracks/AbstractListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/AbstractListActivity.java @@ -66,7 +66,7 @@ public abstract class AbstractListActivity extends AbstractActivity implements C public void onConfirmDeleteDone(Track.Id... trackIds) { boolean stopRecording = false; - Track.Id recordingTrackId = PreferencesUtils.getRecordingTrackId(this); + Track.Id recordingTrackId = PreferencesUtils.getRecordingTrackId(PreferencesUtils.getSharedPreferences(this), this); for (Track.Id trackId : trackIds) { if (trackId.equals(recordingTrackId)) { stopRecording = true; diff --git a/src/main/java/de/dennisguse/opentracks/MarkerListActivity.java b/src/main/java/de/dennisguse/opentracks/MarkerListActivity.java index 50d1c956c..71d706074 100644 --- a/src/main/java/de/dennisguse/opentracks/MarkerListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/MarkerListActivity.java @@ -66,12 +66,12 @@ public class MarkerListActivity extends AbstractActivity implements DeleteMarker private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() { @Override - public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (PreferencesUtils.isKey(MarkerListActivity.this, R.string.recording_track_id_key, key)) { - recordingTrackId = PreferencesUtils.getRecordingTrackId(MarkerListActivity.this); + recordingTrackId = PreferencesUtils.getRecordingTrackId(sharedPreferences, MarkerListActivity.this); } if (PreferencesUtils.isKey(MarkerListActivity.this, R.string.recording_track_paused_key, key)) { - recordingTrackPaused = PreferencesUtils.isRecordingTrackPaused(MarkerListActivity.this); + recordingTrackPaused = PreferencesUtils.isRecordingTrackPaused(sharedPreferences, MarkerListActivity.this); } if (key != null) { runOnUiThread(MarkerListActivity.this::invalidateOptionsMenu); @@ -138,7 +138,7 @@ public class MarkerListActivity extends AbstractActivity implements DeleteMarker protected void onStart() { super.onStart(); sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); - sharedPreferenceChangeListener.onSharedPreferenceChanged(null, null); + sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, null); } @Override diff --git a/src/main/java/de/dennisguse/opentracks/Startup.java b/src/main/java/de/dennisguse/opentracks/Startup.java index 3da2705a3..4f7c41f8b 100644 --- a/src/main/java/de/dennisguse/opentracks/Startup.java +++ b/src/main/java/de/dennisguse/opentracks/Startup.java @@ -1,6 +1,7 @@ package de.dennisguse.opentracks; import android.app.Application; +import android.content.SharedPreferences; import android.os.StrictMode; import android.util.Log; @@ -27,18 +28,18 @@ public class Startup extends Application { Log.i(TAG, BuildConfig.APPLICATION_ID + "; BuildType: " + BuildConfig.BUILD_TYPE + "; VersionName: " + BuildConfig.VERSION_NAME + "/" + BuildConfig.VERSION_NAME_FULL + " VersionCode: " + BuildConfig.VERSION_CODE); //Set default values of preferences on first start. - PreferencesUtils.resetPreferences(this, false); - if (PreferencesUtils.getString(this, R.string.stats_units_key, "").equals("")) { + SharedPreferences sharedPreferences = PreferencesUtils.resetPreferences(this, false); + if (PreferencesUtils.getString(sharedPreferences, this, R.string.stats_units_key, "").equals("")) { String statsUnits = getString(Locale.US.equals(Locale.getDefault()) ? R.string.stats_units_imperial : R.string.stats_units_metric); - PreferencesUtils.setString(this, R.string.stats_units_key, statsUnits); + PreferencesUtils.setString(sharedPreferences, this, R.string.stats_units_key, statsUnits); } - ActivityUtils.applyNightMode(this); + ActivityUtils.applyNightMode(sharedPreferences, this); //TODO Workaround to reset recordingTrackId on app startup as the TrackRecordingService (likely) crashed. - if (PreferencesUtils.isRecording(this)) { + if (PreferencesUtils.isRecording(sharedPreferences, this)) { Log.e(TAG, "Reset recordingTrackId; likely the TrackRecordingService crashed."); - PreferencesUtils.setLong(this, R.string.recording_track_id_key, PreferencesUtils.RECORDING_TRACK_ID_DEFAULT); + PreferencesUtils.setLong(sharedPreferences, this, R.string.recording_track_id_key, PreferencesUtils.RECORDING_TRACK_ID_DEFAULT); } //In debug builds: show thread and VM warnings. diff --git a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java index 111551c97..96e1a3789 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java @@ -109,18 +109,18 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() { @Override - public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (PreferencesUtils.isKey(TrackListActivity.this, R.string.stats_units_key, key)) { - metricUnits = PreferencesUtils.isMetricUnits(TrackListActivity.this); + metricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, TrackListActivity.this); } if (PreferencesUtils.isKey(TrackListActivity.this, R.string.recording_track_id_key, key)) { - recordingTrackId = PreferencesUtils.getRecordingTrackId(TrackListActivity.this); + recordingTrackId = PreferencesUtils.getRecordingTrackId(sharedPreferences, TrackListActivity.this); if (key != null && PreferencesUtils.isRecording(recordingTrackId)) { trackRecordingServiceConnection.startAndBind(TrackListActivity.this); } } if (PreferencesUtils.isKey(TrackListActivity.this, R.string.recording_track_paused_key, key)) { - recordingTrackPaused = PreferencesUtils.isRecordingTrackPaused(TrackListActivity.this); + recordingTrackPaused = PreferencesUtils.isRecordingTrackPaused(sharedPreferences, TrackListActivity.this); } if (key != null) { runOnUiThread(() -> { @@ -262,7 +262,7 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe super.onStart(); sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); - sharedPreferenceChangeListener.onSharedPreferenceChanged(null, null); + sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, null); trackRecordingServiceConnection.startConnection(this); } diff --git a/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java b/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java index 970649cc7..f5f7f4b88 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java @@ -143,7 +143,7 @@ public class TrackRecordedActivity extends AbstractListActivity implements Confi @Override public boolean onPrepareOptionsMenu(Menu menu) { menu.findItem(R.id.track_detail_markers).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); - menu.findItem(R.id.track_detail_resume_track).setVisible(!PreferencesUtils.isRecording(this)); + menu.findItem(R.id.track_detail_resume_track).setVisible(!PreferencesUtils.isRecording(PreferencesUtils.getSharedPreferences(this), this)); Track track = contentProviderUtils.getTrack(trackId); setTitle(track != null ? track.getName() : ""); return super.onPrepareOptionsMenu(menu); diff --git a/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java b/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java index 5deffa4a6..f7e8b3651 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackRecordingActivity.java @@ -97,9 +97,9 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() { @Override - public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (PreferencesUtils.isKey(TrackRecordingActivity.this, R.string.recording_track_paused_key, key)) { - recordingTrackPaused = PreferencesUtils.isRecordingTrackPaused(TrackRecordingActivity.this); + recordingTrackPaused = PreferencesUtils.isRecordingTrackPaused(sharedPreferences, TrackRecordingActivity.this); setLockscreenPolicy(); setScreenOnPolicy(); } @@ -170,7 +170,7 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc } private void setLockscreenPolicy() { - boolean showOnLockScreen = PreferencesUtils.shouldShowStatsOnLockscreen(TrackRecordingActivity.this); + boolean showOnLockScreen = PreferencesUtils.shouldShowStatsOnLockscreen(sharedPreferences, TrackRecordingActivity.this); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { setShowWhenLocked(showOnLockScreen); @@ -182,7 +182,7 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc } private void setScreenOnPolicy() { - boolean keepScreenOn = PreferencesUtils.shouldKeepScreenOn(TrackRecordingActivity.this); + boolean keepScreenOn = PreferencesUtils.shouldKeepScreenOn(sharedPreferences, TrackRecordingActivity.this); if (keepScreenOn) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); @@ -192,7 +192,7 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc } private void setFullscreenPolicy() { - boolean keepScreenOn = PreferencesUtils.shouldUseFullscreen(TrackRecordingActivity.this); + boolean keepScreenOn = PreferencesUtils.shouldUseFullscreen(sharedPreferences, TrackRecordingActivity.this); if (keepScreenOn) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); @@ -206,7 +206,7 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc super.onStart(); sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); - sharedPreferenceChangeListener.onSharedPreferenceChanged(null, null); + sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, null); trackRecordingServiceConnection.startConnection(this); trackDataHub.start(); diff --git a/src/main/java/de/dennisguse/opentracks/adapters/AggregatedStatisticsAdapter.java b/src/main/java/de/dennisguse/opentracks/adapters/AggregatedStatisticsAdapter.java index 62d2a5fd2..8f13a81a4 100644 --- a/src/main/java/de/dennisguse/opentracks/adapters/AggregatedStatisticsAdapter.java +++ b/src/main/java/de/dennisguse/opentracks/adapters/AggregatedStatisticsAdapter.java @@ -134,11 +134,12 @@ public class AggregatedStatisticsAdapter extends BaseAdapter { } } + //TODO Check preference handling. private void setCommonValues(AggregatedStatistics.AggregatedStatistic aggregatedStatistic) { String category = aggregatedStatistic.getCategory(); - reportSpeed = PreferencesUtils.isReportSpeed(context, category); - metricsUnits = PreferencesUtils.isMetricUnits(context); + reportSpeed = PreferencesUtils.isReportSpeed(PreferencesUtils.getSharedPreferences(context), context, category); + metricsUnits = PreferencesUtils.isMetricUnits(PreferencesUtils.getSharedPreferences(context), context); sportIcon.setImageResource(getIcon(aggregatedStatistic)); typeLabel.setText(category); diff --git a/src/main/java/de/dennisguse/opentracks/adapters/IntervalStatisticsAdapter.java b/src/main/java/de/dennisguse/opentracks/adapters/IntervalStatisticsAdapter.java index af2477384..3c38b4ac4 100644 --- a/src/main/java/de/dennisguse/opentracks/adapters/IntervalStatisticsAdapter.java +++ b/src/main/java/de/dennisguse/opentracks/adapters/IntervalStatisticsAdapter.java @@ -25,11 +25,12 @@ public class IntervalStatisticsAdapter extends ArrayAdapter intervalList, String category, StackMode stackMode) { super(context, R.layout.interval_stats_list_item, intervalList); - metricUnits = PreferencesUtils.isMetricUnits(context); + metricUnits = PreferencesUtils.isMetricUnits(PreferencesUtils.getSharedPreferences(context), context); this.category = category; this.stackMode = stackMode; } + //TODO Check preference handling! Should not be accessed in getView() @NonNull @Override public View getView(int position, @Nullable View intervalView, @NonNull ViewGroup parent) { @@ -60,7 +61,7 @@ public class IntervalStatisticsAdapter extends ArrayAdapter { if (started) { loadDataForAll(); @@ -155,7 +159,8 @@ public class TrackDataHub implements SharedPreferences.OnSharedPreferenceChangeL return; } - PreferencesUtils.unregister(context, this); + sharedPreferences.unregisterOnSharedPreferenceChangeListener(this); + sharedPreferences = null; started = false; @@ -224,10 +229,10 @@ public class TrackDataHub implements SharedPreferences.OnSharedPreferenceChangeL public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, final String key) { handler.post(() -> { if (PreferencesUtils.isKey(context, R.string.recording_track_id_key, key)) { - recordingTrackId = PreferencesUtils.getRecordingTrackId(context); + recordingTrackId = PreferencesUtils.getRecordingTrackId(sharedPreferences, context); } if (PreferencesUtils.isKey(context, R.string.recording_track_paused_key, key)) { - recordingTrackPaused = PreferencesUtils.isRecordingTrackPaused(context); + recordingTrackPaused = PreferencesUtils.isRecordingTrackPaused(sharedPreferences, context); } }); } diff --git a/src/main/java/de/dennisguse/opentracks/fragments/ChartFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/ChartFragment.java index a7788528f..019d261a1 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/ChartFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/ChartFragment.java @@ -65,31 +65,28 @@ public class ChartFragment extends Fragment implements TrackDataListener { return chartFragment; } - private final List pendingPoints = new ArrayList<>(); + private SharedPreferences sharedPreferences; + private int recordingDistanceInterval; private TrackDataHub trackDataHub; // Stats gathered from the received data private TrackStatisticsUpdater trackStatisticsUpdater = new TrackStatisticsUpdater(); - - private ChartBinding viewBinding; - - //TODO REMOVE: Used to restore the TrackStatistics via TrackStatisticsUpdater; for the diagrams we should consider not this setting and just use all data that is in the database - @Deprecated - private int recordingDistanceInterval; + private final List pendingPoints = new ArrayList<>(); private String category = ""; // Modes of operation private boolean chartByDistance; + private ChartBinding viewBinding; // UI elements private ChartView chartView; private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override - public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (PreferencesUtils.isKey(getContext(), R.string.stats_units_key, key)) { - boolean metricUnits = PreferencesUtils.isMetricUnits(getContext()); + boolean metricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, getContext()); if (metricUnits != chartView.getMetricUnits()) { chartView.setMetricUnits(metricUnits); runOnUiThread(() -> { @@ -100,7 +97,7 @@ public class ChartFragment extends Fragment implements TrackDataListener { } } if (PreferencesUtils.isKey(getContext(), R.string.stats_rate_key, key)) { - boolean reportSpeed = PreferencesUtils.isReportSpeed(getContext(), category); + boolean reportSpeed = PreferencesUtils.isReportSpeed(sharedPreferences, getContext(), category); if (reportSpeed != chartView.getReportSpeed()) { chartView.setReportSpeed(reportSpeed); chartView.applyReportSpeed(); @@ -114,7 +111,7 @@ public class ChartFragment extends Fragment implements TrackDataListener { } if (PreferencesUtils.isKey(getContext(), R.string.recording_distance_interval_key, key)) { - recordingDistanceInterval = PreferencesUtils.getRecordingDistanceInterval(getContext()); + recordingDistanceInterval = PreferencesUtils.getRecordingDistanceInterval(sharedPreferences, getContext()); } } }; @@ -165,8 +162,9 @@ public class ChartFragment extends Fragment implements TrackDataListener { public void onResume() { super.onResume(); resumeTrackDataHub(); - PreferencesUtils.register(getContext(), sharedPreferenceChangeListener); - sharedPreferenceChangeListener.onSharedPreferenceChanged(null, null); + sharedPreferences = PreferencesUtils.getSharedPreferences(getContext()); + sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); + sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, null); checkChartSettings(); getActivity().runOnUiThread(updateChart); @@ -176,7 +174,7 @@ public class ChartFragment extends Fragment implements TrackDataListener { public void onPause() { super.onPause(); pauseTrackDataHub(); - PreferencesUtils.unregister(getContext(), sharedPreferenceChangeListener); + sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); } @Override @@ -192,6 +190,12 @@ public class ChartFragment extends Fragment implements TrackDataListener { viewBinding = null; } + @Override + public void onDestroy() { + super.onDestroy(); + sharedPreferences = null; + } + @Override public void onTrackUpdated(Track track) { if (isResumed()) { @@ -201,7 +205,7 @@ public class ChartFragment extends Fragment implements TrackDataListener { } category = track.getCategory(); - boolean reportSpeed = PreferencesUtils.isReportSpeed(getContext(), category); + boolean reportSpeed = PreferencesUtils.isReportSpeed(PreferencesUtils.getSharedPreferences(getContext()), getContext(), category); if (reportSpeed != chartView.getReportSpeed()) { chartView.setReportSpeed(reportSpeed); chartView.applyReportSpeed(); diff --git a/src/main/java/de/dennisguse/opentracks/fragments/IntervalsFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/IntervalsFragment.java index be415d71e..3d02b6002 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/IntervalsFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/IntervalsFragment.java @@ -44,14 +44,16 @@ public class IntervalsFragment extends Fragment implements TrackDataListener { private IntervalStatisticsAdapter adapter; private ArrayAdapter spinnerAdapter; + private SharedPreferences sharedPreferences; + private TrackDataHub trackDataHub; private String category; private IntervalListViewBinding viewBinding; - protected final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = (preferences, key) -> { + protected final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = (sharedPreferences, key) -> { if (PreferencesUtils.isKey(getContext(), R.string.stats_units_key, key) || PreferencesUtils.isKey(getContext(), R.string.stats_rate_key, key)) { - metricUnits = PreferencesUtils.isMetricUnits(getContext()); + metricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, getContext()); if (adapter != null) { adapter.notifyDataSetChanged(); spinnerAdapter.notifyDataSetChanged(); @@ -73,8 +75,9 @@ public class IntervalsFragment extends Fragment implements TrackDataListener { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - PreferencesUtils.register(getContext(), sharedPreferenceChangeListener); - metricUnits = PreferencesUtils.isMetricUnits(getContext()); + sharedPreferences = PreferencesUtils.getSharedPreferences(getContext()); + sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); + sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, null); viewBinding.intervalList.setEmptyView(viewBinding.intervalListEmptyView); @@ -125,6 +128,8 @@ public class IntervalsFragment extends Fragment implements TrackDataListener { public void onPause() { super.onPause(); pauseTrackDataHub(); + + sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); } @Override @@ -137,7 +142,7 @@ public class IntervalsFragment extends Fragment implements TrackDataListener { public void onDestroy() { super.onDestroy(); - PreferencesUtils.unregister(getContext(), sharedPreferenceChangeListener); + sharedPreferences = null; adapter = null; viewModel = null; @@ -183,7 +188,7 @@ public class IntervalsFragment extends Fragment implements TrackDataListener { category = track != null ? track.getCategory() : ""; // Set rate label. - boolean reportSpeed = PreferencesUtils.isReportSpeed(getContext(), category); + boolean reportSpeed = PreferencesUtils.isReportSpeed(sharedPreferences, getContext(), category); //TODO Handle sharedPreferenceChangeListener viewBinding.intervalRate.setText(reportSpeed ? R.string.stats_speed : R.string.stats_pace); } }); diff --git a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java index 9c82f74e1..5e4254f10 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java @@ -234,7 +234,7 @@ public class StatisticsRecordedFragment extends Fragment { // Set elevation gain and loss { // Make elevation visible? - boolean showElevation = PreferencesUtils.isShowStatsElevation(getContext()); + boolean showElevation = PreferencesUtils.isShowStatsElevation(sharedPreferences, getContext()); viewBinding.statsElevationGroup.setVisibility(showElevation ? View.VISIBLE : View.GONE); Float elevationGain_m = trackStatistics.getTotalElevationGain(); diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java index 7fc9dfb17..1b6443f95 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java @@ -17,6 +17,7 @@ package de.dennisguse.opentracks.io.file.importer; import android.content.Context; +import android.content.SharedPreferences; import android.database.sqlite.SQLiteConstraintException; import android.net.Uri; import android.util.Log; @@ -97,10 +98,13 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track // The SAX locator to get the current line information private Locator locator; + private final SharedPreferences sharedPreferences; + AbstractFileTrackImporter(Context context, ContentProviderUtils contentProviderUtils) { this.context = context; this.contentProviderUtils = contentProviderUtils; - this.recordingDistanceInterval = PreferencesUtils.getRecordingDistanceInterval(context); + sharedPreferences = PreferencesUtils.getSharedPreferences(context); + this.recordingDistanceInterval = PreferencesUtils.getRecordingDistanceInterval(sharedPreferences, context); } @Override @@ -262,7 +266,7 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track Track track = contentProviderUtils.getTrack(trackData.track.getUuid()); if (track != null) { - if (PreferencesUtils.getPreventReimportTracks(context)) { + if (PreferencesUtils.getPreventReimportTracks(sharedPreferences, context)) { throw new ImportAlreadyExistsException(context.getString(R.string.import_prevent_reimport)); } @@ -380,7 +384,7 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track if (trackPoint.hasLocation() && trackData.lastLocationInCurrentSegment.hasLocation()) { trackPoint.setBearing(trackData.lastLocationInCurrentSegment.bearingTo(trackPoint)); - long maxRecordingDistance = PreferencesUtils.getMaxRecordingDistance(context); + long maxRecordingDistance = PreferencesUtils.getMaxRecordingDistance(sharedPreferences, context); //TODO Should only be read once! double distanceToLastTrackLocation = trackPoint.distanceTo(trackData.lastLocationInCurrentSegment); if (distanceToLastTrackLocation > maxRecordingDistance) { trackPoint.setType(TrackPoint.Type.SEGMENT_START_AUTOMATIC); diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/DirectoryChooserActivity.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/DirectoryChooserActivity.java index 4ae6b4665..117d139b5 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/DirectoryChooserActivity.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/DirectoryChooserActivity.java @@ -2,6 +2,7 @@ package de.dennisguse.opentracks.io.file.importer; import android.app.Activity; import android.content.Intent; +import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.provider.DocumentsContract; @@ -18,10 +19,14 @@ public abstract class DirectoryChooserActivity extends AppCompatActivity { private static final int DIRECTORY_PICKER_REQUEST_CODE = 6; + protected SharedPreferences sharedPreferences; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + sharedPreferences = PreferencesUtils.getSharedPreferences(this); + Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); DocumentFile directoryUri = configureDirectoryChooserIntent(intent); if (directoryUri == null) { @@ -38,6 +43,12 @@ public abstract class DirectoryChooserActivity extends AppCompatActivity { onActivityResultCustom(requestCode, resultCode, resultData); } + @Override + protected void onDestroy() { + super.onDestroy(); + sharedPreferences = null; + } + protected void onActivityResultCustom(int requestCode, int resultCode, @Nullable Intent resultData) { if (requestCode == DIRECTORY_PICKER_REQUEST_CODE) { if (resultCode == Activity.RESULT_OK) { @@ -80,14 +91,14 @@ public abstract class DirectoryChooserActivity extends AppCompatActivity { super.configureDirectoryChooserIntent(intent); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); - return PreferencesUtils.getDefaultExportDirectoryUri(this); + return PreferencesUtils.getDefaultExportDirectoryUri(sharedPreferences, this); } @Override protected Intent createNextActivityIntent(Uri directoryUri) { Intent intent = IntentUtils.newIntent(this, ExportActivity.class); intent.putExtra(ExportActivity.EXTRA_DIRECTORY_URI_KEY, directoryUri); - intent.putExtra(ExportActivity.EXTRA_TRACKFILEFORMAT_KEY, PreferencesUtils.getExportTrackFileFormat(this)); + intent.putExtra(ExportActivity.EXTRA_TRACKFILEFORMAT_KEY, PreferencesUtils.getExportTrackFileFormat(sharedPreferences, this)); return intent; } } @@ -101,11 +112,11 @@ public abstract class DirectoryChooserActivity extends AppCompatActivity { case RESULT_OK: Uri directoryUri = resultData.getData(); - PreferencesUtils.setDefaultExportDirectoryUri(this, directoryUri); + PreferencesUtils.setDefaultExportDirectoryUri(sharedPreferences, this, directoryUri); IntentUtils.persistDirectoryAccessPermission(getApplicationContext(), resultData, directoryUri); break; case RESULT_CANCELED: - PreferencesUtils.setDefaultExportDirectoryUri(this, null); + PreferencesUtils.setDefaultExportDirectoryUri(sharedPreferences, this, null); //TODO Remove stored permission contentResolver.releasePersistableUriPermission break; } @@ -118,8 +129,8 @@ public abstract class DirectoryChooserActivity extends AppCompatActivity { protected DocumentFile configureDirectoryChooserIntent(Intent intent) { super.configureDirectoryChooserIntent(intent); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); - if (PreferencesUtils.isDefaultExportDirectoryUri(this)) { - intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, PreferencesUtils.getDefaultExportDirectoryUri(this).getUri()); + if (PreferencesUtils.isDefaultExportDirectoryUri(sharedPreferences, this)) { + intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, PreferencesUtils.getDefaultExportDirectoryUri(sharedPreferences, this).getUri()); } return null; } diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java index 00271f52b..3d58063b6 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingService.java @@ -82,39 +82,39 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand private PeriodicTaskExecutor voiceExecutor; private TrackRecordingServiceNotificationManager notificationManager; + private SharedPreferences sharedPreferences; private Track.Id recordingTrackId; private boolean recordingTrackPaused; private int recordingDistanceInterval; private int maxRecordingDistance; - private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() { @Override - public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { Context context = TrackRecordingService.this; if (PreferencesUtils.isKey(TrackRecordingService.this, R.string.recording_track_id_key, key)) { // Only through the TrackRecordingService can one stop a recording and set the recordingTrackId to -1L. - if (PreferencesUtils.isRecording(TrackRecordingService.this)) { - recordingTrackId = PreferencesUtils.getRecordingTrackId(TrackRecordingService.this); + if (PreferencesUtils.isRecording(sharedPreferences, TrackRecordingService.this)) { + recordingTrackId = PreferencesUtils.getRecordingTrackId(sharedPreferences, TrackRecordingService.this); } } if (PreferencesUtils.isKey(context, R.string.recording_track_paused_key, key)) { - recordingTrackPaused = PreferencesUtils.isRecordingTrackPaused(context); + recordingTrackPaused = PreferencesUtils.isRecordingTrackPaused(sharedPreferences, context); } if (PreferencesUtils.isKey(context, R.string.stats_units_key, key)) { - boolean metricUnits = PreferencesUtils.isMetricUnits(context); + boolean metricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, context); voiceExecutor.setMetricUnits(metricUnits); } if (PreferencesUtils.isKey(context, R.string.voice_frequency_key, key)) { - voiceExecutor.setTaskFrequency(PreferencesUtils.getVoiceFrequency(context)); + voiceExecutor.setTaskFrequency(PreferencesUtils.getVoiceFrequency(sharedPreferences, context)); } if (PreferencesUtils.isKey(context, R.string.recording_distance_interval_key, key)) { - recordingDistanceInterval = PreferencesUtils.getRecordingDistanceInterval(context); + recordingDistanceInterval = PreferencesUtils.getRecordingDistanceInterval(sharedPreferences, context); } if (PreferencesUtils.isKey(context, R.string.max_recording_distance_key, key)) { - maxRecordingDistance = PreferencesUtils.getMaxRecordingDistance(context); + maxRecordingDistance = PreferencesUtils.getMaxRecordingDistance(sharedPreferences, context); } - handlerServer.onSharedPreferenceChanged(context, preferences, key); + handlerServer.onSharedPreferenceChanged(context, sharedPreferences, key); } }; @@ -147,8 +147,9 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand // onSharedPreferenceChanged might not set recordingTrackId. recordingTrackId = null; - PreferencesUtils.register(this, sharedPreferenceChangeListener); - sharedPreferenceChangeListener.onSharedPreferenceChanged(null, null); + sharedPreferences = PreferencesUtils.getSharedPreferences(this); + sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); + sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, null); restartTrackAfterServiceRestart(); } @@ -189,8 +190,8 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand // Reverse order from onCreate showNotification(false); //TODO Why? - PreferencesUtils.unregister(this, sharedPreferenceChangeListener); - + sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); + sharedPreferences = null; try { voiceExecutor.shutdown(); @@ -305,7 +306,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand //TODO Pass TrackPoint track.setName(TrackNameUtils.getTrackName(this, trackId, segmentStartTrackPoint.getTime())); - String category = PreferencesUtils.getDefaultActivity(this); + String category = PreferencesUtils.getDefaultActivity(sharedPreferences, this); track.setCategory(category); track.setIcon(TrackIconUtils.getIconValue(this, category)); track.setTrackStatistics(trackStatisticsUpdater.getTrackStatistics()); @@ -536,9 +537,9 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand private void updateRecordingState(Track.Id trackId, boolean paused) { recordingTrackId = trackId; long currentTrackId = trackId != null ? trackId.getId() : PreferencesUtils.RECORDING_TRACK_ID_DEFAULT; - PreferencesUtils.setLong(this, R.string.recording_track_id_key, currentTrackId); + PreferencesUtils.setLong(sharedPreferences, this, R.string.recording_track_id_key, currentTrackId); recordingTrackPaused = paused; - PreferencesUtils.setBoolean(this, R.string.recording_track_paused_key, recordingTrackPaused); + PreferencesUtils.setBoolean(sharedPreferences, this, R.string.recording_track_paused_key, recordingTrackPaused); } @Override diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceConnection.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceConnection.java index e46a33b16..bfa67c665 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceConnection.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceConnection.java @@ -20,6 +20,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.content.SharedPreferences; import android.os.IBinder; import android.os.IBinder.DeathRecipient; import android.os.RemoteException; @@ -209,9 +210,10 @@ public class TrackRecordingServiceConnection implements ServiceConnection, Death try { if (showEditor) { // Need to remember the recordingTrackId before calling endCurrentTrack() as endCurrentTrack() sets the value to -1L. - Track.Id recordingTrackId = PreferencesUtils.getRecordingTrackId(context); + SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); + Track.Id recordingTrackId = PreferencesUtils.getRecordingTrackId(sharedPreferences, context); trackRecordingService.endCurrentTrack(); - if (PreferencesUtils.isRecording(context)) { + if (PreferencesUtils.isRecording(sharedPreferences, context)) { Intent intent = IntentUtils.newIntent(context, TrackEditActivity.class) .putExtra(TrackEditActivity.EXTRA_TRACK_ID, recordingTrackId) .putExtra(TrackEditActivity.EXTRA_NEW_TRACK, true); diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java index 2ca789775..f48bf75ae 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java @@ -66,7 +66,7 @@ class TrackRecordingServiceNotificationManager { void updateTrackPoint(Context context, TrackPoint trackPoint, int recordingGpsAccuracy) { String formattedAccuracy = context.getString(R.string.value_none); if (trackPoint.hasAccuracy()) { - formattedAccuracy = StringUtils.formatDistance(context, trackPoint.getAccuracy(), PreferencesUtils.isMetricUnits(context)); + formattedAccuracy = StringUtils.formatDistance(context, trackPoint.getAccuracy(), PreferencesUtils.isMetricUnits(PreferencesUtils.getSharedPreferences(context), context)); boolean currentLocationWasAccurate = trackPoint.getAccuracy() < recordingGpsAccuracy; boolean shouldAlert = !currentLocationWasAccurate && previousLocationWasAccurate; diff --git a/src/main/java/de/dennisguse/opentracks/services/handlers/GpsStatus.java b/src/main/java/de/dennisguse/opentracks/services/handlers/GpsStatus.java index 28b6cd7c9..55efbf716 100644 --- a/src/main/java/de/dennisguse/opentracks/services/handlers/GpsStatus.java +++ b/src/main/java/de/dennisguse/opentracks/services/handlers/GpsStatus.java @@ -1,6 +1,7 @@ package de.dennisguse.opentracks.services.handlers; import android.content.Context; +import android.content.SharedPreferences; import android.location.LocationManager; import android.os.Handler; @@ -15,6 +16,7 @@ import de.dennisguse.opentracks.util.PreferencesUtils; /** * This class handle GPS status according to received locations and some thresholds. */ +//TODO should handle sharedpreference changes class GpsStatus { private static final String TAG = GpsStatus.class.getSimpleName(); @@ -60,16 +62,16 @@ class GpsStatus { private final Handler gpsStatusHandler; private GpsStatusRunner gpsStatusRunner = null; - /** - * @param context The context object. - * @param client The client. - * @param minRecordingInterval Value of min recording interval preference. - */ - public GpsStatus(Context context, GpsStatusListener client, Duration minRecordingInterval) { + public GpsStatus(Context context, GpsStatusListener client) { this.client = client; this.context = context; - signalBadThreshold = PreferencesUtils.getRecordingDistanceInterval(context); + + SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); + signalBadThreshold = PreferencesUtils.getRecordingDistanceInterval(sharedPreferences, context); + + Duration minRecordingInterval = Duration.ofSeconds(PreferencesUtils.getMinRecordingInterval(sharedPreferences, context)); signalLostThreshold = !minRecordingInterval.isNegative() ? SIGNAL_LOST_THRESHOLD.plus(minRecordingInterval) : SIGNAL_LOST_THRESHOLD; + gpsStatusHandler = new Handler(); } diff --git a/src/main/java/de/dennisguse/opentracks/services/handlers/HandlerServer.java b/src/main/java/de/dennisguse/opentracks/services/handlers/HandlerServer.java index 1d3c15f0c..709180cfb 100644 --- a/src/main/java/de/dennisguse/opentracks/services/handlers/HandlerServer.java +++ b/src/main/java/de/dennisguse/opentracks/services/handlers/HandlerServer.java @@ -3,12 +3,14 @@ package de.dennisguse.opentracks.services.handlers; import android.content.Context; import android.content.SharedPreferences; +import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import de.dennisguse.opentracks.content.data.TrackPoint; +import de.dennisguse.opentracks.util.PreferencesUtils; public class HandlerServer { @@ -32,8 +34,9 @@ public class HandlerServer { public void start(Context context) { serviceExecutor = Executors.newSingleThreadExecutor(); + SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); locationHandler.onStart(context); - locationHandler.onSharedPreferenceChanged(context, null, null); + locationHandler.onSharedPreferenceChanged(context, sharedPreferences, null); } public void stop(Context context) { @@ -45,7 +48,7 @@ public class HandlerServer { serviceExecutor = null; } - public void onSharedPreferenceChanged(Context context, SharedPreferences preferences, String key) { + public void onSharedPreferenceChanged(@NonNull Context context, @NonNull SharedPreferences preferences, String key) { locationHandler.onSharedPreferenceChanged(context, preferences, key); } @@ -70,8 +73,10 @@ public class HandlerServer { } public interface Handler { - void onStart(Context context); - void onStop(Context context); - void onSharedPreferenceChanged(Context context, SharedPreferences preferences, String key); + void onStart(@NonNull Context context); + + void onStop(@NonNull Context context); + + void onSharedPreferenceChanged(@NonNull Context context, @NonNull SharedPreferences preferences, String key); } } diff --git a/src/main/java/de/dennisguse/opentracks/services/handlers/LocationHandler.java b/src/main/java/de/dennisguse/opentracks/services/handlers/LocationHandler.java index 4efd699e8..b2bbcf5f5 100644 --- a/src/main/java/de/dennisguse/opentracks/services/handlers/LocationHandler.java +++ b/src/main/java/de/dennisguse/opentracks/services/handlers/LocationHandler.java @@ -34,14 +34,14 @@ class LocationHandler implements HandlerServer.Handler, LocationListener, GpsSta } @Override - public void onStart(Context context) { - gpsStatus = new GpsStatus(context, this, Duration.ofSeconds(PreferencesUtils.getMinRecordingInterval(context))); + public void onStart(@NonNull Context context) { + gpsStatus = new GpsStatus(context, this); locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); registerLocationListener(); } @Override - public void onStop(Context context) { + public void onStop(@NonNull Context context) { unregisterLocationListener(); locationManager = null; if (gpsStatus != null) { @@ -51,9 +51,9 @@ class LocationHandler implements HandlerServer.Handler, LocationListener, GpsSta } @Override - public void onSharedPreferenceChanged(Context context, SharedPreferences preferences, String key) { + public void onSharedPreferenceChanged(@NonNull Context context, @NonNull SharedPreferences sharedPreferences, String key) { if (PreferencesUtils.isKey(context, R.string.min_recording_interval_key, key)) { - int minRecordingInterval = PreferencesUtils.getMinRecordingInterval(context); + int minRecordingInterval = PreferencesUtils.getMinRecordingInterval(sharedPreferences, context); if (minRecordingInterval == PreferencesUtils.getMinRecordingIntervalAdaptBatteryLife(context)) { // Choose battery life over moving time accuracy. locationListenerPolicy = new AdaptiveLocationListenerPolicy(Duration.ofSeconds(30), Duration.ofSeconds(5), 5); @@ -69,16 +69,16 @@ class LocationHandler implements HandlerServer.Handler, LocationListener, GpsSta } } if (PreferencesUtils.isKey(context, R.string.recording_gps_accuracy_key, key)) { - recordingGpsAccuracy = PreferencesUtils.getRecordingGPSAccuracy(context); + recordingGpsAccuracy = PreferencesUtils.getRecordingGPSAccuracy(sharedPreferences, context); } if (PreferencesUtils.isKey(context, R.string.min_recording_interval_key, key)) { if (gpsStatus != null) { - gpsStatus.onMinRecordingIntervalChanged(PreferencesUtils.getMinRecordingInterval(context)); + gpsStatus.onMinRecordingIntervalChanged(PreferencesUtils.getMinRecordingInterval(sharedPreferences, context)); } } if (PreferencesUtils.isKey(context, R.string.recording_distance_interval_key, key)) { if (gpsStatus != null) { - gpsStatus.onRecordingDistanceChanged(PreferencesUtils.getRecordingDistanceInterval(context)); + gpsStatus.onRecordingDistanceChanged(PreferencesUtils.getRecordingDistanceInterval(sharedPreferences, context)); } } } diff --git a/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothRemoteSensorManager.java b/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothRemoteSensorManager.java index 1efc6cef1..0af815b6b 100644 --- a/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothRemoteSensorManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/sensors/BluetoothRemoteSensorManager.java @@ -66,27 +66,27 @@ public class BluetoothRemoteSensorManager implements BluetoothConnectionManager. private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override - public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (!started) return; if (PreferencesUtils.isKey(context, R.string.settings_sensor_bluetooth_heart_rate_key, key)) { - String address = PreferencesUtils.getBluetoothHeartRateSensorAddress(context); + String address = PreferencesUtils.getBluetoothHeartRateSensorAddress(sharedPreferences, context); connect(heartRate, address); } if (PreferencesUtils.isKey(context, R.string.settings_sensor_bluetooth_cycling_cadence_key, key)) { - String address = PreferencesUtils.getBluetoothCyclingCadenceSensorAddress(context); + String address = PreferencesUtils.getBluetoothCyclingCadenceSensorAddress(sharedPreferences, context); connect(cyclingCadence, address); } if (PreferencesUtils.isKey(context, R.string.settings_sensor_bluetooth_cycling_cadence_key, key)) { - String address = PreferencesUtils.getBluetoothCyclingSpeedSensorAddress(context); + String address = PreferencesUtils.getBluetoothCyclingSpeedSensorAddress(sharedPreferences, context); connect(cyclingSpeed, address); } if (PreferencesUtils.isKey(context, R.string.settings_sensor_bluetooth_cycling_power_key, key)) { - String address = PreferencesUtils.getBluetoothCyclingPowerSensorAddress(context); + String address = PreferencesUtils.getBluetoothCyclingPowerSensorAddress(sharedPreferences, context); connect(cyclingPower, address); } @@ -104,7 +104,7 @@ public class BluetoothRemoteSensorManager implements BluetoothConnectionManager. sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); //Trigger connection startup - sharedPreferenceChangeListener.onSharedPreferenceChanged(null, null); + sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, null); } public synchronized void stop() { @@ -174,7 +174,7 @@ public class BluetoothRemoteSensorManager implements BluetoothConnectionManager. Log.d(TAG, "onChanged: speed data repeated."); return; } - ((SensorDataCycling.Speed) sensorData).compute(previous, PreferencesUtils.getWheelCircumference(context)); + ((SensorDataCycling.Speed) sensorData).compute(previous, PreferencesUtils.getWheelCircumference(sharedPreferences, context)); } sensorDataSet.set(sensorData); diff --git a/src/main/java/de/dennisguse/opentracks/services/tasks/AnnouncementPeriodicTask.java b/src/main/java/de/dennisguse/opentracks/services/tasks/AnnouncementPeriodicTask.java index c7617bda0..c6f16dae6 100644 --- a/src/main/java/de/dennisguse/opentracks/services/tasks/AnnouncementPeriodicTask.java +++ b/src/main/java/de/dennisguse/opentracks/services/tasks/AnnouncementPeriodicTask.java @@ -17,6 +17,7 @@ package de.dennisguse.opentracks.services.tasks; import android.content.Context; +import android.content.SharedPreferences; import android.media.AudioManager; import android.speech.tts.TextToSpeech; import android.speech.tts.UtteranceProgressListener; @@ -102,6 +103,8 @@ public class AnnouncementPeriodicTask implements PeriodicTask { } }; + private SharedPreferences sharedPreferences; + private TextToSpeech tts; // Response from TTS after its initialization private int ttsInitStatus = TextToSpeech.ERROR; @@ -112,6 +115,8 @@ public class AnnouncementPeriodicTask implements PeriodicTask { this.context = context; audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); contentProviderUtils = new ContentProviderUtils(context); + + sharedPreferences = PreferencesUtils.getSharedPreferences(context); } @Override @@ -164,14 +169,17 @@ public class AnnouncementPeriodicTask implements PeriodicTask { return; } - Track track = contentProviderUtils.getTrack(PreferencesUtils.getRecordingTrackId(context)); + Track track = contentProviderUtils.getTrack(PreferencesUtils.getRecordingTrackId(sharedPreferences, context)); String category = track != null ? track.getCategory() : ""; List trackPoints = contentProviderUtils.getTrackPoints(track.getId()); - IntervalStatistics intervalStatistics = new IntervalStatistics(trackPoints, (float) (PreferencesUtils.isMetricUnits(context) ? 1d * UnitConversions.KM_TO_M : 1d * UnitConversions.MI_TO_M)); + boolean isMetricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, context); + boolean isReportSpeed = PreferencesUtils.isReportSpeed(sharedPreferences, context, category); + + IntervalStatistics intervalStatistics = new IntervalStatistics(trackPoints, (float) (isMetricUnits ? 1d * UnitConversions.KM_TO_M : 1d * UnitConversions.MI_TO_M)); IntervalStatistics.Interval lastInterval = intervalStatistics.getLastInterval(); - String announcement = AnnouncementUtils.getAnnouncement(context, trackStatistics, category, lastInterval); + String announcement = AnnouncementUtils.getAnnouncement(context, trackStatistics, isMetricUnits, isReportSpeed, lastInterval); speakAnnouncement(announcement); } @@ -181,6 +189,8 @@ public class AnnouncementPeriodicTask implements PeriodicTask { tts.shutdown(); tts = null; } + + sharedPreferences = null; } private void onTtsReady() { diff --git a/src/main/java/de/dennisguse/opentracks/settings/ActivityTypePreference.java b/src/main/java/de/dennisguse/opentracks/settings/ActivityTypePreference.java index cadfaa511..e350362f0 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/ActivityTypePreference.java +++ b/src/main/java/de/dennisguse/opentracks/settings/ActivityTypePreference.java @@ -17,6 +17,7 @@ package de.dennisguse.opentracks.settings; import android.content.Context; +import android.content.SharedPreferences; import android.os.Bundle; import android.util.AttributeSet; import android.view.View; @@ -48,7 +49,7 @@ public class ActivityTypePreference extends DialogPreference { setDialogIcon(null); setPersistent(true); - SummaryProvider summaryProvider = preference -> PreferencesUtils.getDefaultActivity(ActivityTypePreference.this.getContext()); + SummaryProvider summaryProvider = preference -> PreferencesUtils.getDefaultActivity(PreferencesUtils.getSharedPreferences(context), ActivityTypePreference.this.getContext()); setSummaryProvider(summaryProvider); } @@ -60,6 +61,8 @@ public class ActivityTypePreference extends DialogPreference { public static class ActivityPreferenceDialog extends PreferenceDialogFragmentCompat { + private SharedPreferences sharedPreferences; + private AutoCompleteTextView textView; private ImageView iconView; @@ -77,9 +80,11 @@ public class ActivityTypePreference extends DialogPreference { super.onBindDialogView(view); final Context context = getActivity(); + sharedPreferences = PreferencesUtils.getSharedPreferences(context); + textView = view.findViewById(R.id.activity_type_preference_text_view); - String category = PreferencesUtils.getDefaultActivity(context); + String category = PreferencesUtils.getDefaultActivity(sharedPreferences, context); textView.setText(category); ArrayAdapter adapter = ArrayAdapter.createFromResource(context, R.array.activity_types, android.R.layout.simple_dropdown_item_1line); textView.setAdapter(adapter); @@ -100,8 +105,14 @@ public class ActivityTypePreference extends DialogPreference { updateIcon(TrackIconUtils.getIconValue(context, category)); } + @Override + public void onDestroy() { + super.onDestroy(); + sharedPreferences = null; + } + private void showIconSelectDialog() { - String category = PreferencesUtils.getDefaultActivity(getActivity()); + String category = PreferencesUtils.getDefaultActivity(sharedPreferences, getActivity()); ChooseActivityTypeDialogFragment.showDialog(getActivity().getSupportFragmentManager(), category); } @@ -110,7 +121,7 @@ public class ActivityTypePreference extends DialogPreference { if (positiveResult) { String newDefaultActivity = textView.getText().toString(); if (getPreference().callChangeListener(newDefaultActivity)) { - PreferencesUtils.setDefaultActivity(getActivity(), newDefaultActivity); + PreferencesUtils.setDefaultActivity(sharedPreferences, getActivity(), newDefaultActivity); HackUtils.invalidatePreference(getPreference()); } } diff --git a/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java b/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java index 377afe8d1..aab08c047 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java +++ b/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java @@ -91,7 +91,9 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity public static class PrefsFragment extends PreferenceFragmentCompat { - private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = (preferences, key) -> { + private SharedPreferences sharedPreferences; + + private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = (sharedPreferences, key) -> { if (PreferencesUtils.isKey(getActivity(), R.string.recording_track_id_key, key)) { getActivity().runOnUiThread(this::updateReset); } @@ -99,7 +101,7 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity getActivity().runOnUiThread(this::updateUnits); } if (PreferencesUtils.isKey(getActivity(), R.string.night_mode_key, key)) { - getActivity().runOnUiThread(() -> ActivityUtils.applyNightMode(getContext())); + getActivity().runOnUiThread(() -> ActivityUtils.applyNightMode(sharedPreferences, getContext())); } }; @@ -108,6 +110,8 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { + sharedPreferences = PreferencesUtils.getSharedPreferences(getContext()); + try { setPreferencesFromResource(R.xml.settings, rootKey); } catch (ClassCastException e) { @@ -123,7 +127,7 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity Preference instantExportDirectoryPreference = findPreference(getString(R.string.settings_default_export_directory_key)); instantExportDirectoryPreference.setSummaryProvider(preference -> { - DocumentFile directory = PreferencesUtils.getDefaultExportDirectoryUri(getContext()); + DocumentFile directory = PreferencesUtils.getDefaultExportDirectoryUri(sharedPreferences, getContext()); //Use same value for not set as Androidx ListPreference and EditTextPreference return directory != null ? directory.getName() : getString(R.string.not_set); }); @@ -132,7 +136,10 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity @Override public void onResume() { super.onResume(); - PreferencesUtils.getSharedPreferences(getActivity()).registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); + + sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); + sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, null); + updateUnits(); updateReset(); updateBluetooth(); @@ -142,13 +149,13 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity private void updatePostWorkoutExport() { Preference instantExportEnabledPreference = findPreference(getString(R.string.post_workout_export_enabled_key)); - instantExportEnabledPreference.setEnabled(PreferencesUtils.isDefaultExportDirectoryUri(getContext())); + instantExportEnabledPreference.setEnabled(PreferencesUtils.isDefaultExportDirectoryUri(sharedPreferences, getContext())); } @Override public void onPause() { super.onPause(); - PreferencesUtils.getSharedPreferences(getActivity()).unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); + sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); } @Override @@ -176,6 +183,12 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity super.onDisplayPreferenceDialog(preference); } + @Override + public void onDestroy() { + super.onDestroy(); + sharedPreferences = null; + } + public void setDefaultActivity(String iconValue) { if (activityPreferenceDialog != null) { activityPreferenceDialog.updateUI(iconValue); @@ -183,7 +196,7 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity } private void updateReset() { - final boolean isRecording = PreferencesUtils.isRecording(getActivity()); + final boolean isRecording = PreferencesUtils.isRecording(sharedPreferences, getActivity()); Preference resetPreference = findPreference(getString(R.string.settings_reset_key)); resetPreference.setSummary(isRecording ? getString(R.string.settings_not_while_recording) : ""); resetPreference.setEnabled(!isRecording); @@ -196,7 +209,7 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity } private void updateUnits() { - boolean metricUnits = PreferencesUtils.isMetricUnits(getActivity()); + boolean metricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, getActivity()); ListPreference voiceFrequency = findPreference(getString(R.string.voice_frequency_key)); voiceFrequency.setEntries(StringUtils.getFrequencyOptions(getActivity(), metricUnits)); diff --git a/src/main/java/de/dennisguse/opentracks/util/ActivityUtils.java b/src/main/java/de/dennisguse/opentracks/util/ActivityUtils.java index 2455e8827..d30b98fb9 100644 --- a/src/main/java/de/dennisguse/opentracks/util/ActivityUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/ActivityUtils.java @@ -3,6 +3,7 @@ package de.dennisguse.opentracks.util; import android.app.Activity; import android.app.SearchManager; import android.content.Context; +import android.content.SharedPreferences; import android.os.Build; import android.os.VibrationEffect; import android.os.Vibrator; @@ -150,7 +151,7 @@ public class ActivityUtils { toast.show(); } - public static void applyNightMode(Context context) { - AppCompatDelegate.setDefaultNightMode(PreferencesUtils.getDefaultNightMode(context)); + public static void applyNightMode(SharedPreferences sharedPreferences, Context context) { + AppCompatDelegate.setDefaultNightMode(PreferencesUtils.getDefaultNightMode(sharedPreferences, context)); } } diff --git a/src/main/java/de/dennisguse/opentracks/util/AnnouncementUtils.java b/src/main/java/de/dennisguse/opentracks/util/AnnouncementUtils.java index 7f0c19527..bcd3b1ca9 100644 --- a/src/main/java/de/dennisguse/opentracks/util/AnnouncementUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/AnnouncementUtils.java @@ -15,9 +15,7 @@ public class AnnouncementUtils { private AnnouncementUtils() { } - public static String getAnnouncement(Context context, TrackStatistics trackStatistics, String category, @Nullable IntervalStatistics.Interval currentInterval) { - boolean metricUnits = PreferencesUtils.isMetricUnits(context); - boolean reportSpeed = PreferencesUtils.isReportSpeed(context, category); + public static String getAnnouncement(Context context, TrackStatistics trackStatistics, boolean isMetricUnits, boolean isReportSpeed, @Nullable IntervalStatistics.Interval currentInterval) { double distance = trackStatistics.getTotalDistance() * UnitConversions.M_TO_KM; double distancePerTime = trackStatistics.getAverageMovingSpeed() * UnitConversions.MPS_TO_KMH; double currentDistancePerTime = currentInterval != null ? currentInterval.getSpeed_ms() * UnitConversions.MPS_TO_KMH : 0; @@ -26,7 +24,7 @@ public class AnnouncementUtils { return context.getString(R.string.voice_total_distance_zero); } - if (!metricUnits) { + if (!isMetricUnits) { distance *= UnitConversions.KM_TO_MI; distancePerTime *= UnitConversions.KM_TO_MI; currentDistancePerTime *= UnitConversions.KM_TO_MI; @@ -35,15 +33,15 @@ public class AnnouncementUtils { String rate; String currentRate; String currentRateMsg; - if (reportSpeed) { - int speedId = metricUnits ? R.plurals.voiceSpeedKilometersPerHour : R.plurals.voiceSpeedMilesPerHour; + if (isReportSpeed) { + int speedId = isMetricUnits ? R.plurals.voiceSpeedKilometersPerHour : R.plurals.voiceSpeedMilesPerHour; rate = context.getResources().getQuantityString(speedId, getQuantityCount(distancePerTime), distancePerTime); currentRate = context.getResources().getQuantityString(speedId, getQuantityCount(currentDistancePerTime), currentDistancePerTime); currentRateMsg = context.getString(R.string.voice_speed_lap, currentRate); } else { double timePerDistance = distancePerTime == 0 ? 0.0 : 1 / distancePerTime; - int paceId = metricUnits ? R.string.voice_pace_per_kilometer : R.string.voice_pace_per_mile; + int paceId = isMetricUnits ? R.string.voice_pace_per_kilometer : R.string.voice_pace_per_mile; Duration time = Duration.ofMillis((long) (timePerDistance * UnitConversions.HR_TO_MIN * UnitConversions.MIN_TO_S * UnitConversions.S_TO_MS)); rate = context.getString(paceId, getAnnounceTime(context, time)); @@ -53,7 +51,7 @@ public class AnnouncementUtils { currentRateMsg = context.getString(R.string.voice_pace_lap, currentRate); } - int totalDistanceId = metricUnits ? R.plurals.voiceTotalDistanceKilometers : R.plurals.voiceTotalDistanceMiles; + int totalDistanceId = isMetricUnits ? R.plurals.voiceTotalDistanceKilometers : R.plurals.voiceTotalDistanceMiles; String totalDistance = context.getResources().getQuantityString(totalDistanceId, getQuantityCount(distance), distance); currentRateMsg = currentInterval == null ? "" : " " + currentRateMsg; diff --git a/src/main/java/de/dennisguse/opentracks/util/ExportUtils.java b/src/main/java/de/dennisguse/opentracks/util/ExportUtils.java index 3efbed1ae..e946507e0 100644 --- a/src/main/java/de/dennisguse/opentracks/util/ExportUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/ExportUtils.java @@ -2,6 +2,7 @@ package de.dennisguse.opentracks.util; import android.content.ContentResolver; import android.content.Context; +import android.content.SharedPreferences; import android.database.Cursor; import android.net.Uri; import android.provider.DocumentsContract; @@ -28,9 +29,10 @@ public class ExportUtils { private static final String TAG = ExportUtils.class.getSimpleName(); public static void postWorkoutExport(Context context, Track track, ExportServiceResultReceiver resultReceiver) { - if (PreferencesUtils.shouldInstantExportAfterWorkout(context)) { - TrackFileFormat trackFileFormat = PreferencesUtils.getExportTrackFileFormat(context); - DocumentFile directory = PreferencesUtils.getDefaultExportDirectoryUri(context); + SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); + if (PreferencesUtils.shouldInstantExportAfterWorkout(sharedPreferences, context)) { + TrackFileFormat trackFileFormat = PreferencesUtils.getExportTrackFileFormat(sharedPreferences, context); + DocumentFile directory = PreferencesUtils.getDefaultExportDirectoryUri(sharedPreferences, context); ExportService.enqueue(context, resultReceiver, track.getId(), trackFileFormat, directory.getUri()); } diff --git a/src/main/java/de/dennisguse/opentracks/util/IntentDashboardUtils.java b/src/main/java/de/dennisguse/opentracks/util/IntentDashboardUtils.java index 6d17ffb74..2b23edf88 100644 --- a/src/main/java/de/dennisguse/opentracks/util/IntentDashboardUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/IntentDashboardUtils.java @@ -3,6 +3,7 @@ package de.dennisguse.opentracks.util; import android.content.ClipData; import android.content.Context; import android.content.Intent; +import android.content.SharedPreferences; import android.net.Uri; import androidx.annotation.NonNull; @@ -73,11 +74,13 @@ public class IntentDashboardUtils { intent.putParcelableArrayListExtra(ACTION_DASHBOARD_PAYLOAD, uris); - intent.putExtra(EXTRAS_SHOULD_KEEP_SCREEN_ON, PreferencesUtils.shouldKeepScreenOn(context)); - intent.putExtra(EXTRAS_SHOW_WHEN_LOCKED, PreferencesUtils.shouldShowStatsOnLockscreen(context)); + SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); + + intent.putExtra(EXTRAS_SHOULD_KEEP_SCREEN_ON, PreferencesUtils.shouldKeepScreenOn(sharedPreferences, context)); + intent.putExtra(EXTRAS_SHOW_WHEN_LOCKED, PreferencesUtils.shouldShowStatsOnLockscreen(sharedPreferences, context)); intent.putExtra(EXTRAS_OPENTRACKS_IS_RECORDING_THIS_TRACK, isRecording); if (isRecording) { - intent.putExtra(EXTRAS_SHOW_FULLSCREEN, PreferencesUtils.shouldUseFullscreen(context)); + intent.putExtra(EXTRAS_SHOW_FULLSCREEN, PreferencesUtils.shouldUseFullscreen(sharedPreferences, context)); } intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); diff --git a/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java b/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java index 6322c4879..fa58d105e 100644 --- a/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java @@ -91,7 +91,7 @@ public class IntentUtils { continue; } - Pair uriAndMime = ShareContentProvider.createURI(trackId, track.getName(), PreferencesUtils.getExportTrackFileFormat(context)); + Pair uriAndMime = ShareContentProvider.createURI(trackId, track.getName(), PreferencesUtils.getExportTrackFileFormat(PreferencesUtils.getSharedPreferences(context), context)); uris.add(uriAndMime.first); mime = uriAndMime.second; } diff --git a/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java b/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java index d14956008..1cfe05fd4 100644 --- a/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java @@ -46,33 +46,27 @@ public class PreferencesUtils { return PreferenceManager.getDefaultSharedPreferences(context); } - public static SharedPreferences register(Context context, SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener) { - SharedPreferences sharedPreferences = getSharedPreferences(context); - sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); - return sharedPreferences; - } - - public static void unregister(Context context, SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener) { - getSharedPreferences(context).unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); - } - @Deprecated //NOTE: is at the moment still used to determine if a track is currently recorded; better ask the service directly. //NOTE: This was also used to recover from a service restart, but this data should not be exposed to the whole application. public static final long RECORDING_TRACK_ID_DEFAULT = -1L; @Deprecated //Use the TrackRecordingService - public static Track.Id getRecordingTrackId(Context context) { - SharedPreferences sharedPreferences = getSharedPreferences(context); + public static Track.Id getRecordingTrackId(Context context, SharedPreferences sharedPreferences) { return new Track.Id(sharedPreferences.getLong(getKey(context, R.string.recording_track_id_key), RECORDING_TRACK_ID_DEFAULT)); } - public static String getDefaultActivity(Context context) { - return getString(context, R.string.default_activity_key, context.getString(R.string.default_activity_default)); + @Deprecated //Use the TrackRecordingService + public static Track.Id getRecordingTrackId(SharedPreferences sharedPreferences, Context context) { + return getRecordingTrackId(context, sharedPreferences); } - public static void setDefaultActivity(Context context, String newDefaultActivity) { - setString(context, R.string.default_activity_key, newDefaultActivity); + public static String getDefaultActivity(SharedPreferences sharedPreferences, Context context) { + return getString(sharedPreferences, context, R.string.default_activity_key, context.getString(R.string.default_activity_default)); + } + + public static void setDefaultActivity(SharedPreferences sharedPreferences, Context context, String newDefaultActivity) { + setString(sharedPreferences, context, R.string.default_activity_key, newDefaultActivity); } /** @@ -96,48 +90,20 @@ public class PreferencesUtils { return key == null || key.equals(getKey(context, keyId)); } - /** - * Gets a boolean preference value. - * - * @param context the context - * @param keyId the key id - * @param defaultValue the default value - */ - private static boolean getBoolean(Context context, int keyId, boolean defaultValue) { - SharedPreferences sharedPreferences = getSharedPreferences(context); + private static boolean getBoolean(SharedPreferences sharedPreferences, Context context, int keyId, boolean defaultValue) { return sharedPreferences.getBoolean(getKey(context, keyId), defaultValue); } - private static boolean getBoolean(Context context, SharedPreferences sharedPreferences, int keyId, boolean defaultValue) { - return sharedPreferences.getBoolean(getKey(context, keyId), defaultValue); - } - - /** - * Sets a boolean preference value. - * - * @param context the context - * @param keyId the key id - * @param value the value - */ //TODO Don't use; this function is only to be used TrackRecordingService and will be removed. @VisibleForTesting - public static void setBoolean(Context context, int keyId, boolean value) { - SharedPreferences sharedPreferences = getSharedPreferences(context); + public static void setBoolean(SharedPreferences sharedPreferences, Context context, int keyId, boolean value) { Editor editor = sharedPreferences.edit(); editor.putBoolean(getKey(context, keyId), value); editor.apply(); } - /** - * Gets an integer preference value. - * - * @param context the context - * @param keyId the key id - * @param defaultValue the default value - */ - private static int getInt(Context context, int keyId, int defaultValue) { - SharedPreferences sharedPreferences = getSharedPreferences(context); + private static int getInt(SharedPreferences sharedPreferences, Context context, int keyId, int defaultValue) { try { return sharedPreferences.getInt(getKey(context, keyId), defaultValue); } catch (ClassCastException e) { @@ -153,82 +119,42 @@ public class PreferencesUtils { } } - /** - * Sets an integer preference value. - * - * @param context the context - * @param keyId the key id - * @param value the value - */ @VisibleForTesting - public static void setInt(Context context, int keyId, int value) { - SharedPreferences sharedPreferences = getSharedPreferences(context); + public static void setInt(SharedPreferences sharedPreferences, Context context, int keyId, int value) { Editor editor = sharedPreferences.edit(); editor.putInt(getKey(context, keyId), value); editor.apply(); } - /** - * Sets a long preference value. - * - * @param context the context - * @param keyId the key id - * @param value the value - */ //TODO Don't use; this function is only to be used TrackRecordingService and will be removed. @Deprecated @VisibleForTesting - public static void setLong(Context context, int keyId, long value) { - SharedPreferences sharedPreferences = getSharedPreferences(context); + public static void setLong(SharedPreferences sharedPreferences, Context context, int keyId, long value) { Editor editor = sharedPreferences.edit(); editor.putLong(getKey(context, keyId), value); editor.apply(); } - @Deprecated - public static String getString(Context context, int keyId, String defaultValue) { - SharedPreferences sharedPreferences = getSharedPreferences(context); + public static String getString(SharedPreferences sharedPreferences, Context context, int keyId, String defaultValue) { return sharedPreferences.getString(getKey(context, keyId), defaultValue); } - public static String getString(Context context, SharedPreferences sharedPreferences, int keyId, String defaultValue) { - return sharedPreferences.getString(getKey(context, keyId), defaultValue); - } - - /** - * Sets a string preference value. - * - * @param context the context - * @param keyId the key id - * @param value the value - */ @VisibleForTesting - public static void setString(Context context, int keyId, String value) { - SharedPreferences sharedPreferences = getSharedPreferences(context); + public static void setString(SharedPreferences sharedPreferences, Context context, int keyId, String value) { Editor editor = sharedPreferences.edit(); editor.putString(getKey(context, keyId), value); editor.apply(); } - @Deprecated - public static boolean isMetricUnits(Context context) { - return isMetricUnits(getSharedPreferences(context), context); - } - public static boolean isMetricUnits(SharedPreferences sharedPreferences, Context context) { final String STATS_UNIT = context.getString(R.string.stats_units_default); - return STATS_UNIT.equals(getString(context, sharedPreferences, R.string.stats_units_key, STATS_UNIT)); - } - - @Deprecated - public static boolean isReportSpeed(Context context, String category) { - return isReportSpeed(getSharedPreferences(context), context, category); + return STATS_UNIT.equals(getString(sharedPreferences, context, R.string.stats_units_key, STATS_UNIT)); } public static boolean isReportSpeed(SharedPreferences sharedPreferences, Context context, String category) { final String STATS_RATE_DEFAULT = context.getString(R.string.stats_rate_default); - String currentStatsRate = getString(context, sharedPreferences, R.string.stats_rate_key, STATS_RATE_DEFAULT); - if (currentStatsRate.equals(getString(context, sharedPreferences, R.string.stats_rate_speed_or_pace_default, STATS_RATE_DEFAULT))) { + String currentStatsRate = getString(sharedPreferences, context, R.string.stats_rate_key, STATS_RATE_DEFAULT); + if (currentStatsRate.equals(getString(sharedPreferences, context, R.string.stats_rate_speed_or_pace_default, STATS_RATE_DEFAULT))) { return TrackIconUtils.isSpeedIcon(context, category); } @@ -236,8 +162,8 @@ public class PreferencesUtils { } @Deprecated //Use TrackRecordingService - public static boolean isRecordingTrackPaused(Context context) { - return getBoolean(context, R.string.recording_track_paused_key, isRecordingTrackPausedDefault(context)); + public static boolean isRecordingTrackPaused(SharedPreferences sharedPreferences, Context context) { + return getBoolean(sharedPreferences, context, R.string.recording_track_paused_key, isRecordingTrackPausedDefault(context)); } @Deprecated //Use TrackRecordingService @@ -246,9 +172,9 @@ public class PreferencesUtils { } @Deprecated //Use TrackRecordingService - public static void defaultRecordingTrackPaused(Context context) { + public static void defaultRecordingTrackPaused(SharedPreferences sharedPreferences, Context context) { final boolean RECORDING_TRACK_PAUSED = context.getResources().getBoolean(R.bool.recording_track_paused_default); - setBoolean(context, R.string.recording_track_paused_key, RECORDING_TRACK_PAUSED); + setBoolean(sharedPreferences, context, R.string.recording_track_paused_key, RECORDING_TRACK_PAUSED); } private static String getBluetoothSensorAddressNone(Context context) { @@ -259,83 +185,75 @@ public class PreferencesUtils { return getBluetoothSensorAddressNone(context).equals(currentValue); } - public static String getBluetoothHeartRateSensorAddress(Context context) { - return getString(context, R.string.settings_sensor_bluetooth_heart_rate_key, getBluetoothSensorAddressNone(context)); + public static String getBluetoothHeartRateSensorAddress(SharedPreferences sharedPreferences, Context context) { + return getString(sharedPreferences, context, R.string.settings_sensor_bluetooth_heart_rate_key, getBluetoothSensorAddressNone(context)); } - public static String getBluetoothCyclingCadenceSensorAddress(Context context) { - return getString(context, R.string.settings_sensor_bluetooth_cycling_cadence_key, getBluetoothSensorAddressNone(context)); + public static String getBluetoothCyclingCadenceSensorAddress(SharedPreferences sharedPreferences, Context context) { + return getString(sharedPreferences, context, R.string.settings_sensor_bluetooth_cycling_cadence_key, getBluetoothSensorAddressNone(context)); } - public static String getBluetoothCyclingSpeedSensorAddress(Context context) { - return getString(context, R.string.settings_sensor_bluetooth_cycling_speed_key, getBluetoothSensorAddressNone(context)); + public static String getBluetoothCyclingSpeedSensorAddress(SharedPreferences sharedPreferences, Context context) { + return getString(sharedPreferences, context, R.string.settings_sensor_bluetooth_cycling_speed_key, getBluetoothSensorAddressNone(context)); } - public static int getWheelCircumference(Context context) { + public static int getWheelCircumference(SharedPreferences sharedPreferences, Context context) { final int DEFAULT = Integer.parseInt(context.getResources().getString(R.string.settings_sensor_bluetooth_cycling_speed_wheel_circumference_default)); - return getInt(context, R.string.settings_sensor_bluetooth_cycling_speed_wheel_circumference_key, DEFAULT); + return getInt(sharedPreferences, context, R.string.settings_sensor_bluetooth_cycling_speed_wheel_circumference_key, DEFAULT); } - public static boolean isBluetoothCyclingPowerSensorAddressNone(Context context) { - return isBluetoothSensorAddressNone(context, getBluetoothCyclingPowerSensorAddress(context)); - } - - public static String getBluetoothCyclingPowerSensorAddress(Context context) { - return getString(context, R.string.settings_sensor_bluetooth_cycling_power_key, getBluetoothSensorAddressNone(context)); + public static String getBluetoothCyclingPowerSensorAddress(SharedPreferences sharedPreferences, Context context) { + return getString(sharedPreferences, context, R.string.settings_sensor_bluetooth_cycling_power_key, getBluetoothSensorAddressNone(context)); } - public static boolean shouldShowStatsOnLockscreen(Context context) { + public static boolean shouldShowStatsOnLockscreen(SharedPreferences sharedPreferences, Context context) { final boolean STATS_SHOW_ON_LOCKSCREEN_DEFAULT = context.getResources().getBoolean(R.bool.stats_show_on_lockscreen_while_recording_default); - return getBoolean(context, R.string.stats_show_on_lockscreen_while_recording_key, STATS_SHOW_ON_LOCKSCREEN_DEFAULT); + return getBoolean(sharedPreferences, context, R.string.stats_show_on_lockscreen_while_recording_key, STATS_SHOW_ON_LOCKSCREEN_DEFAULT); } - public static boolean shouldKeepScreenOn(Context context) { + public static boolean shouldKeepScreenOn(SharedPreferences sharedPreferences, Context context) { final boolean DEFAULT = context.getResources().getBoolean(R.bool.stats_keep_screen_on_while_recording_default); - return getBoolean(context, R.string.stats_keep_screen_on_while_recording_key, DEFAULT); + return getBoolean(sharedPreferences, context, R.string.stats_keep_screen_on_while_recording_key, DEFAULT); } - public static boolean shouldUseFullscreen(Context context) { + public static boolean shouldUseFullscreen(SharedPreferences sharedPreferences, Context context) { final boolean DEFAULT = context.getResources().getBoolean(R.bool.stats_fullscreen_while_recording_default); - return getBoolean(context, R.string.stats_fullscreen_while_recording_key, DEFAULT); - } - - @Deprecated - public static boolean isShowStatsElevation(Context context) { - return isShowStatsElevation(getSharedPreferences(context), context); + return getBoolean(sharedPreferences, context, R.string.stats_fullscreen_while_recording_key, DEFAULT); } public static boolean isShowStatsElevation(SharedPreferences sharedPreferences, Context context) { final boolean STATS_SHOW_ELEVATION = context.getResources().getBoolean(R.bool.stats_show_elevation_default); - return getBoolean(context, sharedPreferences, R.string.stats_show_grade_elevation_key, STATS_SHOW_ELEVATION); + return getBoolean(sharedPreferences, context, R.string.stats_show_grade_elevation_key, STATS_SHOW_ELEVATION); } public static boolean isStatsShowCoordinate(SharedPreferences sharedPreferences, Context context) { final boolean STATS_SHOW_COORDINATE = context.getResources().getBoolean(R.bool.stats_show_coordinate_default); - return getBoolean(context, R.string.stats_show_coordinate_key, STATS_SHOW_COORDINATE); + return getBoolean(sharedPreferences, context, R.string.stats_show_coordinate_key, STATS_SHOW_COORDINATE); } - public static int getVoiceFrequency(Context context) { + public static int getVoiceFrequency(SharedPreferences sharedPreferences, Context context) { final int VOICE_FREQUENCY_DEFAULT = Integer.parseInt(context.getResources().getString(R.string.voice_frequency_default)); - return getInt(context, R.string.voice_frequency_key, VOICE_FREQUENCY_DEFAULT); + return getInt(sharedPreferences, context, R.string.voice_frequency_key, VOICE_FREQUENCY_DEFAULT); } - public static int getRecordingDistanceInterval(Context context) { - return getInt(context, R.string.recording_distance_interval_key, getRecordingDistanceIntervalDefault(context)); + public static int getRecordingDistanceInterval(SharedPreferences sharedPreferences, Context context) { + return getInt(sharedPreferences, context, R.string.recording_distance_interval_key, getRecordingDistanceIntervalDefault(context)); } public static int getRecordingDistanceIntervalDefault(Context context) { return Integer.parseInt(context.getResources().getString(R.string.recording_distance_interval_default)); } - public static int getMaxRecordingDistance(Context context) { + public static int getMaxRecordingDistance(SharedPreferences sharedPreferences, Context context) { final int MAX_RECORDING_DISTANCE = Integer.parseInt(context.getResources().getString(R.string.max_recording_distance_default)); - return getInt(context, R.string.max_recording_distance_key, MAX_RECORDING_DISTANCE); + return getInt(sharedPreferences, context, R.string.max_recording_distance_key, MAX_RECORDING_DISTANCE); } - public static int getMinRecordingInterval(Context context) { + //TODO Duration + public static int getMinRecordingInterval(SharedPreferences sharedPreferences, Context context) { final int MIN_RECORDING_INTERVAL = Integer.parseInt(context.getResources().getString(R.string.min_recording_interval_default)); - return getInt(context, R.string.min_recording_interval_key, MIN_RECORDING_INTERVAL); + return getInt(sharedPreferences, context, R.string.min_recording_interval_key, MIN_RECORDING_INTERVAL); } public static int getMinRecordingIntervalAdaptAccuracy(Context context) { @@ -350,19 +268,19 @@ public class PreferencesUtils { return Integer.parseInt(context.getResources().getString(R.string.min_recording_interval_default)); } - public static int getRecordingGPSAccuracy(Context context) { + public static int getRecordingGPSAccuracy(SharedPreferences sharedPreferences, Context context) { final int RECORDING_GPS_ACCURACY = Integer.parseInt(context.getResources().getString(R.string.recording_gps_accuracy_default)); - return getInt(context, R.string.recording_gps_accuracy_key, RECORDING_GPS_ACCURACY); + return getInt(sharedPreferences, context, R.string.recording_gps_accuracy_key, RECORDING_GPS_ACCURACY); } - public static boolean shouldInstantExportAfterWorkout(Context context) { + public static boolean shouldInstantExportAfterWorkout(SharedPreferences sharedPreferences, Context context) { final boolean INSTANT_POST_WORKOUT_EXPORT_DEFAULT = context.getResources().getBoolean(R.bool.post_workout_export_enabled_default); - return getBoolean(context, R.string.post_workout_export_enabled_key, INSTANT_POST_WORKOUT_EXPORT_DEFAULT); + return getBoolean(sharedPreferences, context, R.string.post_workout_export_enabled_key, INSTANT_POST_WORKOUT_EXPORT_DEFAULT); } - public static TrackFileFormat getExportTrackFileFormat(Context context) { - final String TRACKFILEFORMAT_NAME_DEFAULT = getString(context, R.string.export_trackfileformat_default, null); - String trackFileFormatName = getString(context, R.string.export_trackfileformat_key, TRACKFILEFORMAT_NAME_DEFAULT); + public static TrackFileFormat getExportTrackFileFormat(SharedPreferences sharedPreferences, Context context) { + final String TRACKFILEFORMAT_NAME_DEFAULT = getString(sharedPreferences, context, R.string.export_trackfileformat_default, null); + String trackFileFormatName = getString(sharedPreferences, context, R.string.export_trackfileformat_key, TRACKFILEFORMAT_NAME_DEFAULT); try { return TrackFileFormat.valueOf(trackFileFormatName); } catch (Exception e) { @@ -370,24 +288,24 @@ public class PreferencesUtils { } } - public static boolean getPreventReimportTracks(Context context) { - final boolean defaultValue = getBoolean(context, R.bool.import_prevent_reimport_default, false); - return getBoolean(context, R.string.import_prevent_reimport_key, defaultValue); + public static boolean getPreventReimportTracks(SharedPreferences sharedPreferences, Context context) { + final boolean defaultValue = getBoolean(sharedPreferences, context, R.bool.import_prevent_reimport_default, false); + return getBoolean(sharedPreferences, context, R.string.import_prevent_reimport_key, defaultValue); } /** * @return {@link androidx.appcompat.app.AppCompatDelegate}.MODE_* */ - public static int getDefaultNightMode(Context context) { + public static int getDefaultNightMode(SharedPreferences sharedPreferences, Context context) { final String defaultValue = getKey(context, R.string.night_mode_default); - final String value = getString(context, R.string.night_mode_key, defaultValue); + final String value = getString(sharedPreferences, context, R.string.night_mode_key, defaultValue); return Integer.parseInt(value); } @Deprecated //Use TrackRecordingService - public static boolean isRecording(Context context) { - return isRecording(getRecordingTrackId(context)); + public static boolean isRecording(SharedPreferences sharedPreferences, Context context) { + return isRecording(getRecordingTrackId(context, sharedPreferences)); } @Deprecated @@ -399,16 +317,19 @@ public class PreferencesUtils { return recordingTrackId.getId() != RECORDING_TRACK_ID_DEFAULT; } - public static void resetPreferences(Context context, boolean readAgain) { + public static SharedPreferences resetPreferences(Context context, boolean readAgain) { + SharedPreferences sharedPreferences = getSharedPreferences(context); if (readAgain) { // We want to really clear settings now. - getSharedPreferences(context).edit().clear().commit(); + sharedPreferences.edit().clear().commit(); } PreferenceManager.setDefaultValues(context, R.xml.settings, readAgain); + + return sharedPreferences; } - public static DocumentFile getDefaultExportDirectoryUri(Context context) { - String singleExportDirectorySettingsKey = getString(context, R.string.settings_default_export_directory_key, null); + public static DocumentFile getDefaultExportDirectoryUri(SharedPreferences sharedPreferences, Context context) { + String singleExportDirectorySettingsKey = getString(sharedPreferences, context, R.string.settings_default_export_directory_key, null); if (singleExportDirectorySettingsKey == null) { return null; } @@ -420,12 +341,12 @@ public class PreferencesUtils { return null; } - public static void setDefaultExportDirectoryUri(Context context, Uri directoryUri) { + public static void setDefaultExportDirectoryUri(SharedPreferences sharedPreferences, Context context, Uri directoryUri) { String value = directoryUri != null ? directoryUri.toString() : null; - setString(context, R.string.settings_default_export_directory_key, value); + setString(sharedPreferences, context, R.string.settings_default_export_directory_key, value); } - public static boolean isDefaultExportDirectoryUri(Context context) { - return getDefaultExportDirectoryUri(context) != null; + public static boolean isDefaultExportDirectoryUri(SharedPreferences sharedPreferences, Context context) { + return getDefaultExportDirectoryUri(sharedPreferences, context) != null; } } diff --git a/src/main/java/de/dennisguse/opentracks/util/TrackNameUtils.java b/src/main/java/de/dennisguse/opentracks/util/TrackNameUtils.java index cd8bbe2a9..7b1300b55 100644 --- a/src/main/java/de/dennisguse/opentracks/util/TrackNameUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/TrackNameUtils.java @@ -41,8 +41,9 @@ public class TrackNameUtils { private TrackNameUtils() { } + //TODO Should not access sharedPreferences; trackName should be an ENUM. public static String getTrackName(Context context, Track.Id trackId, Instant startTime) { - String trackName = PreferencesUtils.getString(context, R.string.track_name_key, context.getString(R.string.track_name_default)); + String trackName = PreferencesUtils.getString(PreferencesUtils.getSharedPreferences(context), context, R.string.track_name_key, context.getString(R.string.track_name_default)); if (trackName.equals(context.getString(R.string.settings_recording_track_name_date_local_value))) { return StringUtils.formatDateTime(context, startTime);