Cleanup: SharedPreference as static variable.

Fixes #961.
This commit is contained in:
Dennis Guse
2021-09-28 23:32:53 +02:00
parent d7bc550b29
commit eac3d4b3db
44 changed files with 431 additions and 504 deletions
@@ -59,8 +59,7 @@ public class EspressoCustomLayoutTest {
trackControllerRecordButton.perform(click()); trackControllerRecordButton.perform(click());
// Get custom layout preferences and check all data fields are showed. // Get custom layout preferences and check all data fields are showed.
SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); Layout layout = PreferencesUtils.getCustomLayout();
Layout layout = PreferencesUtils.getCustomLayout(sharedPreferences, context);
onView(withId(R.id.stats_recycler_view)).check(new RecyclerViewItemCountAssertion((int) layout.getFields().stream().filter(DataField::isVisible).count())); onView(withId(R.id.stats_recycler_view)).check(new RecyclerViewItemCountAssertion((int) layout.getFields().stream().filter(DataField::isVisible).count()));
@@ -25,14 +25,13 @@ public class PreferenceMetricUnitRule implements TestRule {
return new Statement() { return new Statement() {
@Override @Override
public void evaluate() throws Throwable { public void evaluate() throws Throwable {
SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); final boolean previousMetricUnits = PreferencesUtils.isMetricUnits();
final boolean previousMetricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, context);
try { try {
PreferencesUtils.setMetricUnits(sharedPreferences, context, metricUnits); PreferencesUtils.setMetricUnits(metricUnits);
base.evaluate(); base.evaluate();
} finally { } finally {
PreferencesUtils.setMetricUnits(sharedPreferences, context, previousMetricUnits); PreferencesUtils.setMetricUnits(previousMetricUnits);
} }
} }
}; };
@@ -97,7 +97,6 @@ public class TrackRecordingServiceTest {
} }
private final Context context = ApplicationProvider.getApplicationContext(); private final Context context = ApplicationProvider.getApplicationContext();
private final SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context);
private ContentProviderUtils contentProviderUtils; private ContentProviderUtils contentProviderUtils;
private final Track.Id trackId = new Track.Id(Math.abs(new Random().nextLong())); private final Track.Id trackId = new Track.Id(Math.abs(new Random().nextLong()));
@@ -124,7 +123,7 @@ public class TrackRecordingServiceTest {
contentProviderUtils = new ContentProviderUtils(context); contentProviderUtils = new ContentProviderUtils(context);
// Let's use default values. // Let's use default values.
sharedPreferences.edit().clear().commit(); PreferencesUtils.clear();
// Ensure that the database is empty before every test // Ensure that the database is empty before every test
contentProviderUtils.deleteAllTracks(context); contentProviderUtils.deleteAllTracks(context);
@@ -91,8 +91,7 @@ public class TrackRecordingServiceTestLocation {
tearDown(); tearDown();
// Let's use default values. // Let's use default values.
SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); PreferencesUtils.clear();
sharedPreferences.edit().clear().commit();
service = ((TrackRecordingService.Binder) mServiceRule.bindService(TrackRecordingServiceTest.createStartIntent(context))) service = ((TrackRecordingService.Binder) mServiceRule.bindService(TrackRecordingServiceTest.createStartIntent(context)))
.getService(); .getService();
@@ -54,7 +54,6 @@ public class TrackRecordingServiceTestLooper {
public final ServiceTestRule mServiceRule = ServiceTestRule.withTimeout(5, TimeUnit.SECONDS); public final ServiceTestRule mServiceRule = ServiceTestRule.withTimeout(5, TimeUnit.SECONDS);
private final Context context = ApplicationProvider.getApplicationContext(); private final Context context = ApplicationProvider.getApplicationContext();
private final SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context);
private ContentProviderUtils contentProviderUtils; private ContentProviderUtils contentProviderUtils;
@@ -79,7 +78,7 @@ public class TrackRecordingServiceTestLooper {
contentProviderUtils = new ContentProviderUtils(context); contentProviderUtils = new ContentProviderUtils(context);
// Let's use default values. // Let's use default values.
sharedPreferences.edit().clear().apply(); PreferencesUtils.clear();
// Ensure that the database is empty before every test // Ensure that the database is empty before every test
contentProviderUtils.deleteAllTracks(context); contentProviderUtils.deleteAllTracks(context);
@@ -146,14 +145,14 @@ public class TrackRecordingServiceTestLooper {
@MediumTest @MediumTest
@Test @Test
public void testWithProperties_metricUnitsDefault() throws TimeoutException { public void testWithProperties_metricUnitsDefault() throws TimeoutException {
PreferencesUtils.setString(sharedPreferences, context, R.string.stats_units_key, context.getString(R.string.stats_units_default)); PreferencesUtils.setString(R.string.stats_units_key, context.getString(R.string.stats_units_default));
fullRecordingSession(); fullRecordingSession();
} }
@MediumTest @MediumTest
@Test @Test
public void testWithProperties_metricUnitsDisabled() throws TimeoutException { public void testWithProperties_metricUnitsDisabled() throws TimeoutException {
PreferencesUtils.setString(sharedPreferences, context, R.string.stats_units_key, context.getString(R.string.stats_units_imperial)); PreferencesUtils.setString(R.string.stats_units_key, context.getString(R.string.stats_units_imperial));
fullRecordingSession(); fullRecordingSession();
} }
@@ -215,7 +214,7 @@ public class TrackRecordingServiceTestLooper {
.setSpeed(Speed.of(10)) .setSpeed(Speed.of(10))
.setBearing(3.0f); .setBearing(3.0f);
Distance prefAccuracy = PreferencesUtils.getThresholdHorizontalAccuracy(sharedPreferences, context); Distance prefAccuracy = PreferencesUtils.getThresholdHorizontalAccuracy();
service.getTrackPointCreator().onNewTrackPoint(trackPoint, prefAccuracy); service.getTrackPointCreator().onNewTrackPoint(trackPoint, prefAccuracy);
if (i % 7 == 0) { if (i % 7 == 0) {
@@ -30,7 +30,6 @@ import de.dennisguse.opentracks.util.PreferencesUtils;
public class LocationHandlerTest { public class LocationHandlerTest {
private final Context context = ApplicationProvider.getApplicationContext(); private final Context context = ApplicationProvider.getApplicationContext();
private final SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context);
@Mock @Mock
private TrackPointCreator trackPointCreator; private TrackPointCreator trackPointCreator;
@@ -47,15 +46,12 @@ public class LocationHandlerTest {
@Before @Before
public void setUp() { public void setUp() {
// Let's use default values. // Let's use default values.
sharedPreferences.edit().clear().commit(); PreferencesUtils.clear();
Mockito.when(trackPointCreator.createNow()) Mockito.when(trackPointCreator.createNow())
.thenReturn(Instant.now()); .thenReturn(Instant.now());
//TODO REMOVE locationHandler.onStart(context);
// 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, sharedPreferences);
} }
/** /**
@@ -92,7 +88,7 @@ public class LocationHandlerTest {
@Test @Test
public void testOnLocationChanged_poorAccuracy() { public void testOnLocationChanged_poorAccuracy() {
// given // given
Distance prefAccuracy = PreferencesUtils.getThresholdHorizontalAccuracy(sharedPreferences, context); Distance prefAccuracy = PreferencesUtils.getThresholdHorizontalAccuracy();
// when // when
locationHandler.onLocationChanged(createLocation(45f, 35f, (float) (prefAccuracy.toM() + 1), 5, System.currentTimeMillis())); locationHandler.onLocationChanged(createLocation(45f, 35f, (float) (prefAccuracy.toM() + 1), 5, System.currentTimeMillis()));
@@ -3,6 +3,7 @@ package de.dennisguse.opentracks.util;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import androidx.preference.PreferenceManager;
import androidx.test.core.app.ApplicationProvider; import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.ext.junit.runners.AndroidJUnit4;
@@ -27,14 +28,14 @@ public class PreferencesUtilsTest {
@Test @Test
public void ExportTrackFileFormat_ok() { public void ExportTrackFileFormat_ok() {
// given // given
SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = sharedPreferences.edit(); SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(context.getString(R.string.export_trackfileformat_key), TrackFileFormat.KML_WITH_TRACKDETAIL_AND_SENSORDATA.name()); editor.putString(context.getString(R.string.export_trackfileformat_key), TrackFileFormat.KML_WITH_TRACKDETAIL_AND_SENSORDATA.name());
editor.commit(); editor.commit();
// when // when
TrackFileFormat trackFileFormat = PreferencesUtils.getExportTrackFileFormat(sharedPreferences, context); TrackFileFormat trackFileFormat = PreferencesUtils.getExportTrackFileFormat();
// then // then
assertEquals(TrackFileFormat.KML_WITH_TRACKDETAIL_AND_SENSORDATA, trackFileFormat); assertEquals(TrackFileFormat.KML_WITH_TRACKDETAIL_AND_SENSORDATA, trackFileFormat);
@@ -43,13 +44,13 @@ public class PreferencesUtilsTest {
@Test @Test
public void ExportTrackFileFormat_invalid() { public void ExportTrackFileFormat_invalid() {
// given // given
SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = sharedPreferences.edit(); SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(context.getString(R.string.export_trackfileformat_key), "invalid"); editor.putString(context.getString(R.string.export_trackfileformat_key), "invalid");
editor.commit(); editor.commit();
// when // when
TrackFileFormat trackFileFormat = PreferencesUtils.getExportTrackFileFormat(sharedPreferences, context); TrackFileFormat trackFileFormat = PreferencesUtils.getExportTrackFileFormat();
// then // then
assertEquals(TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA, trackFileFormat); assertEquals(TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA, trackFileFormat);
@@ -58,13 +59,13 @@ public class PreferencesUtilsTest {
@Test @Test
public void ExportTrackFileFormat_noValue() { public void ExportTrackFileFormat_noValue() {
// given // given
SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = sharedPreferences.edit(); SharedPreferences.Editor editor = sharedPreferences.edit();
editor.clear(); editor.clear();
editor.commit(); editor.commit();
// when // when
TrackFileFormat trackFileFormat = PreferencesUtils.getExportTrackFileFormat(sharedPreferences, context); TrackFileFormat trackFileFormat = PreferencesUtils.getExportTrackFileFormat();
// then // then
assertEquals(TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA, trackFileFormat); assertEquals(TrackFileFormat.KMZ_WITH_TRACKDETAIL_AND_SENSORDATA, trackFileFormat);
@@ -73,13 +74,13 @@ public class PreferencesUtilsTest {
@Test @Test
public void testGetCustomLayout_default() { public void testGetCustomLayout_default() {
// given // given
SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = sharedPreferences.edit(); SharedPreferences.Editor editor = sharedPreferences.edit();
editor.clear(); editor.clear();
editor.commit(); editor.commit();
// when // when
Layout layout = PreferencesUtils.getCustomLayout(sharedPreferences, context); Layout layout = PreferencesUtils.getCustomLayout();
// then // then
assertTrue(layout.getFields().size() > 0); assertTrue(layout.getFields().size() > 0);
@@ -90,7 +91,7 @@ public class PreferencesUtilsTest {
@Test @Test
public void testGetCustomLayout_1() { public void testGetCustomLayout_1() {
// given // given
SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = sharedPreferences.edit(); SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString( editor.putString(
context.getString(R.string.stats_custom_layout_fields_key), context.getString(R.string.stats_custom_layout_fields_key),
@@ -102,7 +103,7 @@ public class PreferencesUtilsTest {
editor.apply(); editor.apply();
// when // when
Layout layout = PreferencesUtils.getCustomLayout(sharedPreferences, context); Layout layout = PreferencesUtils.getCustomLayout();
// then // then
assertEquals(layout.getFields().size(), 4); assertEquals(layout.getFields().size(), 4);
@@ -128,7 +129,7 @@ public class PreferencesUtilsTest {
@Test @Test
public void testGetCustomLayout_coordinatesIsWide() { public void testGetCustomLayout_coordinatesIsWide() {
// given // given
SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
SharedPreferences.Editor editor = sharedPreferences.edit(); SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString( editor.putString(
context.getString(R.string.stats_custom_layout_fields_key), context.getString(R.string.stats_custom_layout_fields_key),
@@ -140,7 +141,7 @@ public class PreferencesUtilsTest {
editor.apply(); editor.apply();
// when // when
Layout layout = PreferencesUtils.getCustomLayout(sharedPreferences, context); Layout layout = PreferencesUtils.getCustomLayout();
// then // then
assertEquals(layout.getFields().size(), 4); assertEquals(layout.getFields().size(), 4);
@@ -167,7 +168,7 @@ public class PreferencesUtilsTest {
@Test @Test
public void testSetCustomLayout() { public void testSetCustomLayout() {
// given // given
SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
Layout layoutSrc = new Layout("road cycling"); Layout layoutSrc = new Layout("road cycling");
layoutSrc.addField(new DataField(context.getString(R.string.stats_custom_layout_moving_time_key), context.getString(R.string.stats_moving_time), true, true, false)); layoutSrc.addField(new DataField(context.getString(R.string.stats_custom_layout_moving_time_key), context.getString(R.string.stats_moving_time), true, true, false));
layoutSrc.addField(new DataField(context.getString(R.string.stats_custom_layout_distance_key), context.getString(R.string.stats_distance), true, false, false)); layoutSrc.addField(new DataField(context.getString(R.string.stats_custom_layout_distance_key), context.getString(R.string.stats_distance), true, false, false));
@@ -175,7 +176,7 @@ public class PreferencesUtilsTest {
layoutSrc.addField(new DataField(context.getString(R.string.stats_custom_layout_speed_key), context.getString(R.string.stats_speed), false, false, false)); layoutSrc.addField(new DataField(context.getString(R.string.stats_custom_layout_speed_key), context.getString(R.string.stats_speed), false, false, false));
// when // when
PreferencesUtils.setCustomLayout(sharedPreferences, context, layoutSrc); PreferencesUtils.setCustomLayout(layoutSrc);
// then // then
String csv = sharedPreferences.getString(context.getString(R.string.stats_custom_layout_fields_key), null); String csv = sharedPreferences.getString(context.getString(R.string.stats_custom_layout_fields_key), null);
@@ -187,7 +188,7 @@ public class PreferencesUtilsTest {
+ context.getString(R.string.stats_custom_layout_average_moving_speed_key) + ",0,1;" + context.getString(R.string.stats_custom_layout_average_moving_speed_key) + ",0,1;"
+ context.getString(R.string.stats_custom_layout_speed_key) + ",0,0;"); + context.getString(R.string.stats_custom_layout_speed_key) + ",0,0;");
Layout layoutDst = PreferencesUtils.getCustomLayout(sharedPreferences, context); Layout layoutDst = PreferencesUtils.getCustomLayout();
assertEquals(layoutSrc.getProfile(), layoutDst.getProfile()); assertEquals(layoutSrc.getProfile(), layoutDst.getProfile());
assertEquals(layoutSrc.getFields().size(), layoutDst.getFields().size()); assertEquals(layoutSrc.getFields().size(), layoutDst.getFields().size());
for (int i = 0; i < layoutSrc.getFields().size(); i++) { for (int i = 0; i < layoutSrc.getFields().size(); i++) {
@@ -47,14 +47,12 @@ public class TrackNameUtilsTest {
private static final Context CONTEXT = ApplicationProvider.getApplicationContext(); 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. * Tests when the track_name_key is settings_recording_track_name_date_local_value.
*/ */
@Test @Test
public void testTrackName_date_local() { public void testTrackName_date_local() {
PreferencesUtils.setString(SHARED_PREFERENCES, CONTEXT, R.string.track_name_key, CONTEXT.getString(R.string.settings_recording_track_name_date_local_value)); PreferencesUtils.setString(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)); assertEquals(StringUtils.formatDateTime(CONTEXT, START_TIME), TrackNameUtils.getTrackName(CONTEXT, TRACK_ID, START_TIME));
} }
@@ -63,7 +61,7 @@ public class TrackNameUtilsTest {
*/ */
@Test @Test
public void testTrackName_date_iso_8601() { public void testTrackName_date_iso_8601() {
PreferencesUtils.setString(SHARED_PREFERENCES, CONTEXT, R.string.track_name_key, CONTEXT.getString(R.string.settings_recording_track_name_date_iso_8601_value)); PreferencesUtils.setString(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); SimpleDateFormat simpleDateFormat = new SimpleDateFormat(TrackNameUtils.ISO_8601_FORMAT, Locale.US);
assertEquals(simpleDateFormat.format(START_TIME.toEpochMilli()), TrackNameUtils.getTrackName(CONTEXT, TRACK_ID, START_TIME)); assertEquals(simpleDateFormat.format(START_TIME.toEpochMilli()), TrackNameUtils.getTrackName(CONTEXT, TRACK_ID, START_TIME));
} }
@@ -73,7 +71,7 @@ public class TrackNameUtilsTest {
*/ */
@Test @Test
public void testTrackName_number() { public void testTrackName_number() {
PreferencesUtils.setString(SHARED_PREFERENCES, CONTEXT, R.string.track_name_key, CONTEXT.getString(R.string.settings_recording_track_name_number_value)); PreferencesUtils.setString(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)); assertEquals("Track " + TRACK_ID.getId(), TrackNameUtils.getTrackName(CONTEXT, TRACK_ID, START_TIME));
} }
} }
@@ -27,13 +27,14 @@ public class Startup extends Application {
// Include version information into stack traces. // Include version information into stack traces.
Log.i(TAG, BuildConfig.APPLICATION_ID + "; BuildType: " + BuildConfig.BUILD_TYPE + "; VersionName: " + BuildConfig.VERSION_NAME + "/" + BuildConfig.VERSION_NAME_FULL + " VersionCode: " + BuildConfig.VERSION_CODE); Log.i(TAG, BuildConfig.APPLICATION_ID + "; BuildType: " + BuildConfig.BUILD_TYPE + "; VersionName: " + BuildConfig.VERSION_NAME + "/" + BuildConfig.VERSION_NAME_FULL + " VersionCode: " + BuildConfig.VERSION_CODE);
PreferencesUtils.initPreferences(this, getResources());
// Set default values of preferences on first start. // Set default values of preferences on first start.
SharedPreferences sharedPreferences = PreferencesUtils.resetPreferences(this, false); PreferencesUtils.resetPreferences(this, false);
if (PreferencesUtils.getString(sharedPreferences, this, R.string.stats_units_key, "").equals("")) { if (PreferencesUtils.getString( R.string.stats_units_key, "").equals("")) {
PreferencesUtils.setMetricUnits(sharedPreferences, this, !Locale.US.equals(Locale.getDefault())); PreferencesUtils.setMetricUnits(!Locale.US.equals(Locale.getDefault()));
} }
PreferencesUtils.applyNightMode();
ActivityUtils.applyNightMode(sharedPreferences, this);
// In debug builds: show thread and VM warnings. // In debug builds: show thread and VM warnings.
if (BuildConfig.DEBUG) { if (BuildConfig.DEBUG) {
@@ -78,7 +78,6 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
private static final String TAG = TrackListActivity.class.getSimpleName(); private static final String TAG = TrackListActivity.class.getSimpleName();
// The following are setFrequency in onCreate // The following are setFrequency in onCreate
private SharedPreferences sharedPreferences;
private TrackRecordingServiceConnection trackRecordingServiceConnection; private TrackRecordingServiceConnection trackRecordingServiceConnection;
private ResourceCursorAdapter resourceCursorAdapter; private ResourceCursorAdapter resourceCursorAdapter;
@@ -110,8 +109,8 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
}; };
private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener = (sharedPreferences, key) -> { private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener = (sharedPreferences, key) -> {
if (PreferencesUtils.isKey(TrackListActivity.this, R.string.stats_units_key, key)) { if (PreferencesUtils.isKey(R.string.stats_units_key, key)) {
metricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, TrackListActivity.this); metricUnits = PreferencesUtils.isMetricUnits();
} }
if (key != null) { if (key != null) {
runOnUiThread(() -> { runOnUiThread(() -> {
@@ -161,8 +160,6 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL); setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);
sharedPreferences = PreferencesUtils.getSharedPreferences(this);
trackRecordingServiceConnection = new TrackRecordingServiceConnection(bindChangedCallback); trackRecordingServiceConnection = new TrackRecordingServiceConnection(bindChangedCallback);
viewBinding.trackList.setEmptyView(viewBinding.trackListEmptyView); viewBinding.trackList.setEmptyView(viewBinding.trackListEmptyView);
@@ -231,8 +228,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
protected void onStart() { protected void onStart() {
super.onStart(); super.onStart();
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); PreferencesUtils.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, null);
trackRecordingServiceConnection.startConnection(this); trackRecordingServiceConnection.startConnection(this);
} }
@@ -249,7 +245,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
protected void onStop() { protected void onStop() {
super.onStop(); super.onStop();
sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); PreferencesUtils.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
trackRecordingServiceConnection.unbind(this); trackRecordingServiceConnection.unbind(this);
} }
@@ -68,7 +68,6 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement
// The following are setFrequency in onCreate. // The following are setFrequency in onCreate.
private ContentProviderUtils contentProviderUtils; private ContentProviderUtils contentProviderUtils;
private SharedPreferences sharedPreferences;
private TrackDataHub trackDataHub; private TrackDataHub trackDataHub;
private TrackRecordedBinding viewBinding; private TrackRecordedBinding viewBinding;
@@ -96,8 +95,8 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement
private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() { private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override @Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (PreferencesUtils.isKey(TrackRecordedActivity.this, R.string.recording_distance_interval_key, key)) { if (PreferencesUtils.isKey(R.string.recording_distance_interval_key, key)) {
trackDataHub.setRecordingDistanceInterval(PreferencesUtils.getRecordingDistanceInterval(sharedPreferences, TrackRecordedActivity.this)); trackDataHub.setRecordingDistanceInterval(PreferencesUtils.getRecordingDistanceInterval());
} }
} }
}; };
@@ -107,7 +106,6 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
contentProviderUtils = new ContentProviderUtils(this); contentProviderUtils = new ContentProviderUtils(this);
sharedPreferences = PreferencesUtils.getSharedPreferences(this);
handleIntent(getIntent()); handleIntent(getIntent());
@@ -130,8 +128,7 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement
protected void onStart() { protected void onStart() {
super.onStart(); super.onStart();
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); PreferencesUtils.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, null);
trackDataHub.start(); trackDataHub.start();
} }
@@ -155,7 +152,7 @@ public class TrackRecordedActivity extends AbstractTrackDeleteActivity implement
super.onStop(); super.onStop();
trackRecordingServiceConnection.unbind(this); trackRecordingServiceConnection.unbind(this);
trackDataHub.stop(); trackDataHub.stop();
sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); PreferencesUtils.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
} }
@Override @Override
@@ -53,7 +53,6 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
// The following are setFrequency in onCreate // The following are setFrequency in onCreate
private ContentProviderUtils contentProviderUtils; private ContentProviderUtils contentProviderUtils;
private SharedPreferences sharedPreferences;
private TrackRecordingServiceConnection trackRecordingServiceConnection; private TrackRecordingServiceConnection trackRecordingServiceConnection;
private TrackDataHub trackDataHub; private TrackDataHub trackDataHub;
@@ -96,17 +95,17 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() { private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() {
@Override @Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (PreferencesUtils.isKey(TrackRecordingActivity.this, R.string.stats_show_on_lockscreen_while_recording_key, key)) { if (PreferencesUtils.isKey(R.string.stats_show_on_lockscreen_while_recording_key, key)) {
setLockscreenPolicy(); setLockscreenPolicy();
} }
if (PreferencesUtils.isKey(TrackRecordingActivity.this, R.string.stats_keep_screen_on_while_recording_key, key)) { if (PreferencesUtils.isKey(R.string.stats_keep_screen_on_while_recording_key, key)) {
setScreenOnPolicy(); setScreenOnPolicy();
} }
if (PreferencesUtils.isKey(TrackRecordingActivity.this, R.string.stats_fullscreen_while_recording_key, key)) { if (PreferencesUtils.isKey(R.string.stats_fullscreen_while_recording_key, key)) {
setFullscreenPolicy(); setFullscreenPolicy();
} }
if (PreferencesUtils.isKey(TrackRecordingActivity.this, R.string.recording_distance_interval_key, key)) { if (PreferencesUtils.isKey(R.string.recording_distance_interval_key, key)) {
trackDataHub.setRecordingDistanceInterval(PreferencesUtils.getRecordingDistanceInterval(sharedPreferences, TrackRecordingActivity.this)); trackDataHub.setRecordingDistanceInterval(PreferencesUtils.getRecordingDistanceInterval());
} }
if (key == null) return; if (key == null) return;
@@ -121,7 +120,6 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
contentProviderUtils = new ContentProviderUtils(this); contentProviderUtils = new ContentProviderUtils(this);
sharedPreferences = PreferencesUtils.getSharedPreferences(this);
trackId = null; trackId = null;
if (savedInstanceState != null) { if (savedInstanceState != null) {
//Activity was recreated. //Activity was recreated.
@@ -156,7 +154,7 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
} }
private void setLockscreenPolicy() { private void setLockscreenPolicy() {
boolean showOnLockScreen = PreferencesUtils.shouldShowStatsOnLockscreen(sharedPreferences, TrackRecordingActivity.this); boolean showOnLockScreen = PreferencesUtils.shouldShowStatsOnLockscreen();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
setShowWhenLocked(showOnLockScreen); setShowWhenLocked(showOnLockScreen);
@@ -168,7 +166,7 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
} }
private void setScreenOnPolicy() { private void setScreenOnPolicy() {
boolean keepScreenOn = PreferencesUtils.shouldKeepScreenOn(sharedPreferences, TrackRecordingActivity.this); boolean keepScreenOn = PreferencesUtils.shouldKeepScreenOn();
if (keepScreenOn) { if (keepScreenOn) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
@@ -178,7 +176,7 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
} }
private void setFullscreenPolicy() { private void setFullscreenPolicy() {
boolean keepScreenOn = PreferencesUtils.shouldUseFullscreen(sharedPreferences, TrackRecordingActivity.this); boolean keepScreenOn = PreferencesUtils.shouldUseFullscreen();
if (keepScreenOn) { if (keepScreenOn) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
@@ -191,8 +189,7 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
protected void onStart() { protected void onStart() {
super.onStart(); super.onStart();
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); PreferencesUtils.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, null);
trackRecordingServiceConnection.startConnection(this); trackRecordingServiceConnection.startConnection(this);
trackDataHub.start(); trackDataHub.start();
@@ -230,7 +227,7 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
@Override @Override
protected void onStop() { protected void onStop() {
super.onStop(); super.onStop();
sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); PreferencesUtils.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
trackRecordingServiceConnection.unbind(this); trackRecordingServiceConnection.unbind(this);
trackDataHub.stop(); trackDataHub.stop();
} }
@@ -58,7 +58,7 @@ public class AggregatedStatisticsAdapter extends BaseAdapter {
viewHolder = (ViewHolder) convertView.getTag(); viewHolder = (ViewHolder) convertView.getTag();
} }
if (TrackIconUtils.isSpeedIcon(context, aggregatedStatistic.getCategory())) { if (TrackIconUtils.isSpeedIcon(context.getResources(), aggregatedStatistic.getCategory())) {
viewHolder.setSpeed(aggregatedStatistic); viewHolder.setSpeed(aggregatedStatistic);
} else { } else {
viewHolder.setPace(aggregatedStatistic); viewHolder.setPace(aggregatedStatistic);
@@ -139,9 +139,8 @@ public class AggregatedStatisticsAdapter extends BaseAdapter {
private void setCommonValues(AggregatedStatistics.AggregatedStatistic aggregatedStatistic) { private void setCommonValues(AggregatedStatistics.AggregatedStatistic aggregatedStatistic) {
String category = aggregatedStatistic.getCategory(); String category = aggregatedStatistic.getCategory();
SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); reportSpeed = PreferencesUtils.isReportSpeed(category);
reportSpeed = PreferencesUtils.isReportSpeed(sharedPreferences, context, category); metricsUnits = PreferencesUtils.isMetricUnits();
metricsUnits = PreferencesUtils.isMetricUnits(sharedPreferences, context);
sportIcon.setImageResource(getIcon(aggregatedStatistic)); sportIcon.setImageResource(getIcon(aggregatedStatistic));
typeLabel.setText(category); typeLabel.setText(category);
@@ -1,6 +1,7 @@
package de.dennisguse.opentracks.content.data; package de.dennisguse.opentracks.content.data;
import android.content.Context; import android.content.Context;
import android.content.res.Resources;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.util.CsvConstants; import de.dennisguse.opentracks.util.CsvConstants;
@@ -57,43 +58,43 @@ public class DataField {
return key + CsvConstants.ITEM_SEPARATOR + visible + CsvConstants.ITEM_SEPARATOR + primary; return key + CsvConstants.ITEM_SEPARATOR + visible + CsvConstants.ITEM_SEPARATOR + primary;
} }
public static String getTitleByKey(Context context, String key) { public static String getTitleByKey(Resources resources, String key) {
if (key.equals(context.getString(R.string.stats_custom_layout_total_time_key))) { if (key.equals(resources.getString(R.string.stats_custom_layout_total_time_key))) {
return context.getString(R.string.stats_total_time); return resources.getString(R.string.stats_total_time);
} else if (key.equals(context.getString(R.string.stats_custom_layout_moving_time_key))) { } else if (key.equals(resources.getString(R.string.stats_custom_layout_moving_time_key))) {
return context.getString(R.string.stats_moving_time); return resources.getString(R.string.stats_moving_time);
} else if (key.equals(context.getString(R.string.stats_custom_layout_distance_key))) { } else if (key.equals(resources.getString(R.string.stats_custom_layout_distance_key))) {
return context.getString(R.string.stats_distance); return resources.getString(R.string.stats_distance);
} else if (key.equals(context.getString(R.string.stats_custom_layout_speed_key))) { } else if (key.equals(resources.getString(R.string.stats_custom_layout_speed_key))) {
return context.getString(R.string.stats_speed); return resources.getString(R.string.stats_speed);
} else if (key.equals(context.getString(R.string.stats_custom_layout_pace_key))) { } else if (key.equals(resources.getString(R.string.stats_custom_layout_pace_key))) {
return context.getString(R.string.stats_pace); return resources.getString(R.string.stats_pace);
} else if (key.equals(context.getString(R.string.stats_custom_layout_average_moving_speed_key))) { } else if (key.equals(resources.getString(R.string.stats_custom_layout_average_moving_speed_key))) {
return context.getString(R.string.stats_average_moving_speed); return resources.getString(R.string.stats_average_moving_speed);
} else if (key.equals(context.getString(R.string.stats_custom_layout_average_speed_key))) { } else if (key.equals(resources.getString(R.string.stats_custom_layout_average_speed_key))) {
return context.getString(R.string.stats_average_speed); return resources.getString(R.string.stats_average_speed);
} else if (key.equals(context.getString(R.string.stats_custom_layout_max_speed_key))) { } else if (key.equals(resources.getString(R.string.stats_custom_layout_max_speed_key))) {
return context.getString(R.string.stats_max_speed); return resources.getString(R.string.stats_max_speed);
} else if (key.equals(context.getString(R.string.stats_custom_layout_average_moving_pace_key))) { } else if (key.equals(resources.getString(R.string.stats_custom_layout_average_moving_pace_key))) {
return context.getString(R.string.stats_average_moving_pace); return resources.getString(R.string.stats_average_moving_pace);
} else if (key.equals(context.getString(R.string.stats_custom_layout_average_pace_key))) { } else if (key.equals(resources.getString(R.string.stats_custom_layout_average_pace_key))) {
return context.getString(R.string.stats_average_pace); return resources.getString(R.string.stats_average_pace);
} else if (key.equals(context.getString(R.string.stats_custom_layout_fastest_pace_key))) { } else if (key.equals(resources.getString(R.string.stats_custom_layout_fastest_pace_key))) {
return context.getString(R.string.stats_fastest_pace); return resources.getString(R.string.stats_fastest_pace);
} else if (key.equals(context.getString(R.string.stats_custom_layout_altitude_key))) { } else if (key.equals(resources.getString(R.string.stats_custom_layout_altitude_key))) {
return context.getString(R.string.stats_altitude); return resources.getString(R.string.stats_altitude);
} else if (key.equals(context.getString(R.string.stats_custom_layout_gain_key))) { } else if (key.equals(resources.getString(R.string.stats_custom_layout_gain_key))) {
return context.getString(R.string.stats_gain); return resources.getString(R.string.stats_gain);
} else if (key.equals(context.getString(R.string.stats_custom_layout_loss_key))) { } else if (key.equals(resources.getString(R.string.stats_custom_layout_loss_key))) {
return context.getString(R.string.stats_loss); return resources.getString(R.string.stats_loss);
} else if (key.equals(context.getString(R.string.stats_custom_layout_coordinates_key))) { } else if (key.equals(resources.getString(R.string.stats_custom_layout_coordinates_key))) {
return context.getString(R.string.stats_coordinates); return resources.getString(R.string.stats_coordinates);
} else if (key.equals(context.getString(R.string.stats_custom_layout_heart_rate_key))) { } else if (key.equals(resources.getString(R.string.stats_custom_layout_heart_rate_key))) {
return context.getString(R.string.stats_sensors_heart_rate); return resources.getString(R.string.stats_sensors_heart_rate);
} else if (key.equals(context.getString(R.string.stats_custom_layout_cadence_key))) { } else if (key.equals(resources.getString(R.string.stats_custom_layout_cadence_key))) {
return context.getString(R.string.stats_sensors_cadence); return resources.getString(R.string.stats_sensors_cadence);
} else if (key.equals(context.getString(R.string.stats_custom_layout_power_key))) { } else if (key.equals(resources.getString(R.string.stats_custom_layout_power_key))) {
return context.getString(R.string.stats_sensors_power); return resources.getString(R.string.stats_sensors_power);
} else { } else {
throw new RuntimeException("It doesn't exists a field with key: " + key); throw new RuntimeException("It doesn't exists a field with key: " + key);
} }
@@ -64,8 +64,6 @@ public class ChartFragment extends Fragment implements TrackDataListener {
return chartFragment; return chartFragment;
} }
private SharedPreferences sharedPreferences;
private TrackDataHub trackDataHub; private TrackDataHub trackDataHub;
// Stats gathered from the received data // Stats gathered from the received data
@@ -80,8 +78,8 @@ public class ChartFragment extends Fragment implements TrackDataListener {
private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() { private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override @Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (PreferencesUtils.isKey(getContext(), R.string.stats_units_key, key)) { if (PreferencesUtils.isKey(R.string.stats_units_key, key)) {
boolean metricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, getContext()); boolean metricUnits = PreferencesUtils.isMetricUnits();
if (metricUnits != viewBinding.chartView.getMetricUnits()) { if (metricUnits != viewBinding.chartView.getMetricUnits()) {
viewBinding.chartView.setMetricUnits(metricUnits); viewBinding.chartView.setMetricUnits(metricUnits);
runOnUiThread(() -> { runOnUiThread(() -> {
@@ -91,8 +89,8 @@ public class ChartFragment extends Fragment implements TrackDataListener {
}); });
} }
} }
if (PreferencesUtils.isKey(getContext(), R.string.stats_rate_key, key)) { if (PreferencesUtils.isKey(R.string.stats_rate_key, key)) {
boolean reportSpeed = PreferencesUtils.isReportSpeed(sharedPreferences, getContext(), category); boolean reportSpeed = PreferencesUtils.isReportSpeed(category);
if (reportSpeed != viewBinding.chartView.getReportSpeed()) { if (reportSpeed != viewBinding.chartView.getReportSpeed()) {
viewBinding.chartView.setReportSpeed(reportSpeed); viewBinding.chartView.setReportSpeed(reportSpeed);
viewBinding.chartView.applyReportSpeed(); viewBinding.chartView.applyReportSpeed();
@@ -141,9 +139,8 @@ public class ChartFragment extends Fragment implements TrackDataListener {
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
resumeTrackDataHub(); resumeTrackDataHub();
sharedPreferences = PreferencesUtils.getSharedPreferences(getContext());
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); PreferencesUtils.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, null);
checkChartSettings(); checkChartSettings();
getActivity().runOnUiThread(updateChart); getActivity().runOnUiThread(updateChart);
@@ -153,7 +150,7 @@ public class ChartFragment extends Fragment implements TrackDataListener {
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
pauseTrackDataHub(); pauseTrackDataHub();
sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); PreferencesUtils.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
} }
@Override @Override
@@ -162,12 +159,6 @@ public class ChartFragment extends Fragment implements TrackDataListener {
viewBinding = null; viewBinding = null;
} }
@Override
public void onDestroy() {
super.onDestroy();
sharedPreferences = null;
}
@Override @Override
public void onTrackUpdated(Track track) { public void onTrackUpdated(Track track) {
if (isResumed()) { if (isResumed()) {
@@ -177,7 +168,7 @@ public class ChartFragment extends Fragment implements TrackDataListener {
} }
category = track.getCategory(); category = track.getCategory();
boolean reportSpeed = PreferencesUtils.isReportSpeed(PreferencesUtils.getSharedPreferences(getContext()), getContext(), category); boolean reportSpeed = PreferencesUtils.isReportSpeed(category);
if (reportSpeed != viewBinding.chartView.getReportSpeed()) { if (reportSpeed != viewBinding.chartView.getReportSpeed()) {
viewBinding.chartView.setReportSpeed(reportSpeed); viewBinding.chartView.setReportSpeed(reportSpeed);
viewBinding.chartView.applyReportSpeed(); viewBinding.chartView.applyReportSpeed();
@@ -46,15 +46,13 @@ public class IntervalsFragment extends Fragment {
private IntervalStatisticsAdapter adapter; private IntervalStatisticsAdapter adapter;
private ArrayAdapter<IntervalStatisticsModel.IntervalOption> spinnerAdapter; private ArrayAdapter<IntervalStatisticsModel.IntervalOption> spinnerAdapter;
private SharedPreferences sharedPreferences;
private boolean isReportSpeed; private boolean isReportSpeed;
private IntervalListViewBinding viewBinding; private IntervalListViewBinding viewBinding;
protected final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = (sharedPreferences, 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)) { if (PreferencesUtils.isKey(R.string.stats_units_key, key) || PreferencesUtils.isKey(R.string.stats_rate_key, key)) {
updateIntervals(PreferencesUtils.isMetricUnits(sharedPreferences, getContext()), selectedInterval); updateIntervals(PreferencesUtils.isMetricUnits(), selectedInterval);
if (spinnerAdapter != null) { if (spinnerAdapter != null) {
spinnerAdapter.notifyDataSetChanged(); spinnerAdapter.notifyDataSetChanged();
} }
@@ -93,8 +91,6 @@ public class IntervalsFragment extends Fragment {
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState); super.onViewCreated(view, savedInstanceState);
sharedPreferences = PreferencesUtils.getSharedPreferences(getContext());
adapter = new IntervalStatisticsAdapter(getContext(), stackModeListView, metricUnits, isReportSpeed); adapter = new IntervalStatisticsAdapter(getContext(), stackModeListView, metricUnits, isReportSpeed);
viewBinding.intervalList.setLayoutManager(new LinearLayoutManager(getContext())); viewBinding.intervalList.setLayoutManager(new LinearLayoutManager(getContext()));
// TODO handle empty view: before we did viewBinding.intervalList.setEmptyView(viewBinding.intervalListEmptyView); // TODO handle empty view: before we did viewBinding.intervalList.setEmptyView(viewBinding.intervalListEmptyView);
@@ -136,13 +132,12 @@ public class IntervalsFragment extends Fragment {
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); PreferencesUtils.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, null);
ContentProviderUtils contentProviderUtils = new ContentProviderUtils(getContext()); ContentProviderUtils contentProviderUtils = new ContentProviderUtils(getContext());
Track track = contentProviderUtils.getTrack(trackId); Track track = contentProviderUtils.getTrack(trackId);
if (track != null) { if (track != null) {
isReportSpeed = PreferencesUtils.isReportSpeed(sharedPreferences, getContext(), track.getCategory()); isReportSpeed = PreferencesUtils.isReportSpeed(track.getCategory());
} }
viewModel = new ViewModelProvider(getActivity()).get(IntervalStatisticsModel.class); viewModel = new ViewModelProvider(getActivity()).get(IntervalStatisticsModel.class);
@@ -152,7 +147,9 @@ public class IntervalsFragment extends Fragment {
@Override @Override
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
PreferencesUtils.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
if (viewModel != null) { if (viewModel != null) {
viewModel.onPause(); viewModel.onPause();
} }
@@ -168,8 +165,6 @@ public class IntervalsFragment extends Fragment {
public void onDestroy() { public void onDestroy() {
super.onDestroy(); super.onDestroy();
sharedPreferences = null;
adapter = null; adapter = null;
viewModel = null; viewModel = null;
} }
@@ -79,21 +79,20 @@ public class StatisticsRecordedFragment extends Fragment {
private StatisticsRecordedBinding viewBinding; private StatisticsRecordedBinding viewBinding;
private SharedPreferences sharedPreferences;
private boolean preferenceMetricUnits; private boolean preferenceMetricUnits;
private boolean preferenceReportSpeed; private boolean preferenceReportSpeed;
private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = (sharedPreferences, key) -> { private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = (sharedPreferences, key) -> {
boolean updateUInecessary = false; boolean updateUInecessary = false;
if (PreferencesUtils.isKey(getContext(), R.string.stats_units_key, key)) { if (PreferencesUtils.isKey(R.string.stats_units_key, key)) {
updateUInecessary = true; updateUInecessary = true;
preferenceMetricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, getContext()); preferenceMetricUnits = PreferencesUtils.isMetricUnits();
} }
if (PreferencesUtils.isKey(getContext(), R.string.stats_rate_key, key) && track != null) { if (PreferencesUtils.isKey(R.string.stats_rate_key, key) && track != null) {
updateUInecessary = true; updateUInecessary = true;
preferenceReportSpeed = PreferencesUtils.isReportSpeed(sharedPreferences, getContext(), track.getCategory()); preferenceReportSpeed = PreferencesUtils.isReportSpeed(track.getCategory());
} }
if (key != null && updateUInecessary && isResumed()) { if (key != null && updateUInecessary && isResumed()) {
@@ -112,8 +111,6 @@ public class StatisticsRecordedFragment extends Fragment {
trackId = getArguments().getParcelable(TRACK_ID_KEY); trackId = getArguments().getParcelable(TRACK_ID_KEY);
contentProviderUtils = new ContentProviderUtils(getContext()); contentProviderUtils = new ContentProviderUtils(getContext());
sharedPreferences = PreferencesUtils.getSharedPreferences(getContext());
sensorsAdapter = new StatisticsAdapter.WithRecordedLayout(getContext()); sensorsAdapter = new StatisticsAdapter.WithRecordedLayout(getContext());
} }
@@ -132,24 +129,22 @@ public class StatisticsRecordedFragment extends Fragment {
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); PreferencesUtils.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, null);
loadStatistics(); loadStatistics();
} }
@Override
public void onPause() {
super.onPause();
PreferencesUtils.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
}
@Override @Override
public void onDestroyView() { public void onDestroyView() {
super.onDestroyView(); super.onDestroyView();
viewBinding = null; viewBinding = null;
sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
}
@Override
public void onDestroy() {
super.onDestroy();
sharedPreferences = null;
} }
public void loadStatistics() { public void loadStatistics() {
@@ -168,7 +163,7 @@ public class StatisticsRecordedFragment extends Fragment {
boolean prefsChanged = this.track == null || (!this.track.getCategory().equals(track.getCategory())); boolean prefsChanged = this.track == null || (!this.track.getCategory().equals(track.getCategory()));
this.track = track; this.track = track;
if (prefsChanged) { if (prefsChanged) {
sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, getString(R.string.stats_rate_key)); sharedPreferenceChangeListener.onSharedPreferenceChanged(null, getString(R.string.stats_rate_key));
} }
loadTrackDescription(track); loadTrackDescription(track);
@@ -55,24 +55,23 @@ public class StatisticsRecordingFragment extends Fragment {
private StatisticsDataModel viewModel; private StatisticsDataModel viewModel;
private LiveData<List<StatisticData>> statisticsLiveData; private LiveData<List<StatisticData>> statisticsLiveData;
private SharedPreferences sharedPreferences;
private boolean preferenceMetricUnits; private boolean preferenceMetricUnits;
private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = (sharedPreferences, key) -> { private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = (sharedPreferences, key) -> {
boolean updateUInecessary = false; boolean updateUInecessary = false;
if (PreferencesUtils.isKey(getContext(), R.string.stats_units_key, key)) { if (PreferencesUtils.isKey(R.string.stats_units_key, key)) {
updateUInecessary = true; updateUInecessary = true;
preferenceMetricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, getContext()); preferenceMetricUnits = PreferencesUtils.isMetricUnits();
} }
if (PreferencesUtils.isKey(getContext(), R.string.stats_custom_layout_fields_key, key)) { if (PreferencesUtils.isKey(R.string.stats_custom_layout_fields_key, key)) {
updateUInecessary = true; updateUInecessary = true;
layout = PreferencesUtils.getCustomLayout(sharedPreferences, getContext()); layout = PreferencesUtils.getCustomLayout();
} }
if (PreferencesUtils.isKey(getContext(), R.string.stats_custom_layout_columns_key, key)) { if (PreferencesUtils.isKey(R.string.stats_custom_layout_columns_key, key)) {
gridLayoutManager.setSpanCount(PreferencesUtils.getLayoutColumns(sharedPreferences, getContext())); gridLayoutManager.setSpanCount(PreferencesUtils.getLayoutColumns());
} }
if (key != null && updateUInecessary && isResumed()) { if (key != null && updateUInecessary && isResumed()) {
@@ -97,7 +96,6 @@ public class StatisticsRecordingFragment extends Fragment {
@Override @Override
public void onCreate(@Nullable Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
sharedPreferences = PreferencesUtils.getSharedPreferences(getContext());
trackRecordingServiceConnection = new TrackRecordingServiceConnection(bindChangedCallback); trackRecordingServiceConnection = new TrackRecordingServiceConnection(bindChangedCallback);
statisticsAdapter = new StatisticsAdapter(getContext()); statisticsAdapter = new StatisticsAdapter(getContext());
@@ -109,7 +107,7 @@ public class StatisticsRecordingFragment extends Fragment {
RecyclerView recyclerView = viewBinding.statsRecyclerView; RecyclerView recyclerView = viewBinding.statsRecyclerView;
recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), RecyclerView.VERTICAL)); recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), RecyclerView.VERTICAL));
final int numColumns = PreferencesUtils.getLayoutColumns(sharedPreferences, getContext()); final int numColumns = PreferencesUtils.getLayoutColumns();
gridLayoutManager = new GridLayoutManager(getContext(), numColumns); gridLayoutManager = new GridLayoutManager(getContext(), numColumns);
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override @Override
@@ -130,8 +128,7 @@ public class StatisticsRecordingFragment extends Fragment {
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); PreferencesUtils.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, null);
viewModel = new ViewModelProvider(getActivity()).get(StatisticsDataModel.class); viewModel = new ViewModelProvider(getActivity()).get(StatisticsDataModel.class);
statisticsLiveData = viewModel.getStatsData(); statisticsLiveData = viewModel.getStatsData();
@@ -143,7 +140,7 @@ public class StatisticsRecordingFragment extends Fragment {
@Override @Override
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); PreferencesUtils.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
} }
@Override @Override
@@ -162,7 +159,6 @@ public class StatisticsRecordingFragment extends Fragment {
public void onDestroy() { public void onDestroy() {
super.onDestroy(); super.onDestroy();
trackRecordingServiceConnection = null; trackRecordingServiceConnection = null;
sharedPreferences = null;
viewModel = null; viewModel = null;
statisticsLiveData.removeObservers(getActivity()); statisticsLiveData.removeObservers(getActivity());
} }
@@ -179,7 +175,7 @@ public class StatisticsRecordingFragment extends Fragment {
this.recordingData = recordingData; this.recordingData = recordingData;
if (!oldCategory.equals(newCategory)) { if (!oldCategory.equals(newCategory)) {
sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, getString(R.string.stats_rate_key)); sharedPreferenceChangeListener.onSharedPreferenceChanged(null, getString(R.string.stats_rate_key));
} }
latestTrackPoint = recordingData.getLatestTrackPoint(); latestTrackPoint = recordingData.getLatestTrackPoint();
@@ -61,7 +61,7 @@ public class SharePictureTrackExporter implements TrackExporter {
TrackSharePictureBinding viewBinding = TrackSharePictureBinding.inflate(LayoutInflater.from(context)); TrackSharePictureBinding viewBinding = TrackSharePictureBinding.inflate(LayoutInflater.from(context));
viewBinding.sharePictureCategory.setText(track.getCategory()); viewBinding.sharePictureCategory.setText(track.getCategory());
boolean metricUnits = PreferencesUtils.isMetricUnits(PreferencesUtils.getSharedPreferences(context), context); boolean metricUnits = PreferencesUtils.isMetricUnits();
TrackStatistics trackStatistics = track.getTrackStatistics(); TrackStatistics trackStatistics = track.getTrackStatistics();
viewBinding.sharePictureTotalTime.setText(StringUtils.formatElapsedTimeWithHour(track.getTrackStatistics().getTotalTime())); viewBinding.sharePictureTotalTime.setText(StringUtils.formatElapsedTimeWithHour(track.getTrackStatistics().getTotalTime()));
@@ -19,14 +19,10 @@ public abstract class DirectoryChooserActivity extends AppCompatActivity {
private static final int DIRECTORY_PICKER_REQUEST_CODE = 6; private static final int DIRECTORY_PICKER_REQUEST_CODE = 6;
protected SharedPreferences sharedPreferences;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
sharedPreferences = PreferencesUtils.getSharedPreferences(this);
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
DocumentFile directoryUri = configureDirectoryChooserIntent(intent); DocumentFile directoryUri = configureDirectoryChooserIntent(intent);
if (directoryUri == null) { if (directoryUri == null) {
@@ -46,7 +42,6 @@ public abstract class DirectoryChooserActivity extends AppCompatActivity {
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
sharedPreferences = null;
} }
protected void onActivityResultCustom(int requestCode, int resultCode, @Nullable Intent resultData) { protected void onActivityResultCustom(int requestCode, int resultCode, @Nullable Intent resultData) {
@@ -91,14 +86,14 @@ public abstract class DirectoryChooserActivity extends AppCompatActivity {
super.configureDirectoryChooserIntent(intent); super.configureDirectoryChooserIntent(intent);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
return PreferencesUtils.getDefaultExportDirectoryUri(sharedPreferences, this); return PreferencesUtils.getDefaultExportDirectoryUri(this);
} }
@Override @Override
protected Intent createNextActivityIntent(Uri directoryUri) { protected Intent createNextActivityIntent(Uri directoryUri) {
Intent intent = IntentUtils.newIntent(this, ExportActivity.class); Intent intent = IntentUtils.newIntent(this, ExportActivity.class);
intent.putExtra(ExportActivity.EXTRA_DIRECTORY_URI_KEY, directoryUri); intent.putExtra(ExportActivity.EXTRA_DIRECTORY_URI_KEY, directoryUri);
intent.putExtra(ExportActivity.EXTRA_TRACKFILEFORMAT_KEY, PreferencesUtils.getExportTrackFileFormat(sharedPreferences, this)); intent.putExtra(ExportActivity.EXTRA_TRACKFILEFORMAT_KEY, PreferencesUtils.getExportTrackFileFormat());
return intent; return intent;
} }
} }
@@ -112,11 +107,11 @@ public abstract class DirectoryChooserActivity extends AppCompatActivity {
case RESULT_OK: case RESULT_OK:
Uri directoryUri = resultData.getData(); Uri directoryUri = resultData.getData();
PreferencesUtils.setDefaultExportDirectoryUri(sharedPreferences, this, directoryUri); PreferencesUtils.setDefaultExportDirectoryUri(directoryUri);
IntentUtils.persistDirectoryAccessPermission(getApplicationContext(), directoryUri); IntentUtils.persistDirectoryAccessPermission(getApplicationContext(), directoryUri);
break; break;
case RESULT_CANCELED: case RESULT_CANCELED:
PreferencesUtils.setDefaultExportDirectoryUri(sharedPreferences, this, null); PreferencesUtils.setDefaultExportDirectoryUri(null);
//TODO Remove stored permission contentResolver.releasePersistableUriPermission //TODO Remove stored permission contentResolver.releasePersistableUriPermission
break; break;
} }
@@ -129,8 +124,8 @@ public abstract class DirectoryChooserActivity extends AppCompatActivity {
protected DocumentFile configureDirectoryChooserIntent(Intent intent) { protected DocumentFile configureDirectoryChooserIntent(Intent intent) {
super.configureDirectoryChooserIntent(intent); super.configureDirectoryChooserIntent(intent);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
if (PreferencesUtils.isDefaultExportDirectoryUri(sharedPreferences, this)) { if (PreferencesUtils.isDefaultExportDirectoryUri(this)) {
intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, PreferencesUtils.getDefaultExportDirectoryUri(sharedPreferences, this).getUri()); intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, PreferencesUtils.getDefaultExportDirectoryUri(this).getUri());
} }
return null; return null;
} }
@@ -54,10 +54,9 @@ public class ImportService extends JobIntentService {
String fileExtension = FileUtils.getExtension(file); String fileExtension = FileUtils.getExtension(file);
try { try {
SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(this); Distance maxRecordingDistance = PreferencesUtils.getMaxRecordingDistance();
Distance maxRecordingDistance = PreferencesUtils.getMaxRecordingDistance(sharedPreferences, this); Distance recordingDistanceInterval = PreferencesUtils.getRecordingDistanceInterval();
Distance recordingDistanceInterval = PreferencesUtils.getRecordingDistanceInterval(sharedPreferences, this); boolean preventReimport = PreferencesUtils.getPreventReimportTracks();
boolean preventReimport = PreferencesUtils.getPreventReimportTracks(sharedPreferences, this);
TrackImporter trackImporter = new TrackImporter(this, new ContentProviderUtils(this), recordingDistanceInterval, maxRecordingDistance, preventReimport); TrackImporter trackImporter = new TrackImporter(this, new ContentProviderUtils(this), recordingDistanceInterval, maxRecordingDistance, preventReimport);
@@ -59,7 +59,7 @@ class TrackRecordingManager {
//TODO Pass TrackPoint //TODO Pass TrackPoint
track.setName(TrackNameUtils.getTrackName(context, trackId, segmentStartTrackPoint.getTime())); track.setName(TrackNameUtils.getTrackName(context, trackId, segmentStartTrackPoint.getTime()));
String category = PreferencesUtils.getDefaultActivity(PreferencesUtils.getSharedPreferences(context), context); //TODO Re-use sharedpreferences String category = PreferencesUtils.getDefaultActivity();
track.setCategory(category); track.setCategory(category);
track.setIcon(TrackIconUtils.getIconValue(context, category)); track.setIcon(TrackIconUtils.getIconValue(context, category));
track.setTrackStatistics(trackStatisticsUpdater.getTrackStatistics()); track.setTrackStatistics(trackStatisticsUpdater.getTrackStatistics());
@@ -277,12 +277,12 @@ class TrackRecordingManager {
} }
} }
public void onSharedPreferenceChanged(@NonNull SharedPreferences sharedPreferences, String key) { public void onSharedPreferenceChanged(String key) {
if (PreferencesUtils.isKey(context, R.string.recording_distance_interval_key, key)) { if (PreferencesUtils.isKey(R.string.recording_distance_interval_key, key)) {
recordingDistanceInterval = PreferencesUtils.getRecordingDistanceInterval(sharedPreferences, context); recordingDistanceInterval = PreferencesUtils.getRecordingDistanceInterval();
} }
if (PreferencesUtils.isKey(context, R.string.max_recording_distance_key, key)) { if (PreferencesUtils.isKey(R.string.max_recording_distance_key, key)) {
maxRecordingDistance = PreferencesUtils.getMaxRecordingDistance(sharedPreferences, context); maxRecordingDistance = PreferencesUtils.getMaxRecordingDistance();
} }
} }
} }
@@ -96,25 +96,23 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
} }
}; };
private SharedPreferences sharedPreferences;
private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() { private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() {
@Override @Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Context context = TrackRecordingService.this; Context context = TrackRecordingService.this;
if (PreferencesUtils.isKey(context, R.string.stats_units_key, key)) { if (PreferencesUtils.isKey(R.string.stats_units_key, key)) {
boolean metricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, context); boolean metricUnits = PreferencesUtils.isMetricUnits();
notificationManager.setMetricUnits(metricUnits); notificationManager.setMetricUnits(metricUnits);
} }
if (PreferencesUtils.isKey(context, R.string.voice_announcement_frequency_key, key)) { if (PreferencesUtils.isKey(R.string.voice_announcement_frequency_key, key)) {
voiceAnnouncementManager.setFrequency(PreferencesUtils.getVoiceAnnouncementFrequency(sharedPreferences, context)); voiceAnnouncementManager.setFrequency(PreferencesUtils.getVoiceAnnouncementFrequency());
} }
if (PreferencesUtils.isKey(context, new int[]{R.string.voice_announcement_distance_key, R.string.stats_units_key}, key)) { if (PreferencesUtils.isKey(new int[]{R.string.voice_announcement_distance_key, R.string.stats_units_key}, key)) {
voiceAnnouncementManager.setFrequency(PreferencesUtils.getVoiceAnnouncementDistance(sharedPreferences, context)); voiceAnnouncementManager.setFrequency(PreferencesUtils.getVoiceAnnouncementDistance());
} }
trackPointCreator.onSharedPreferenceChanged(sharedPreferences, key); trackPointCreator.onSharedPreferenceChanged(key);
trackRecordingManager.onSharedPreferenceChanged(sharedPreferences, key); trackRecordingManager.onSharedPreferenceChanged(key);
} }
}; };
@@ -148,9 +146,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
notificationManager = new TrackRecordingServiceNotificationManager(this); notificationManager = new TrackRecordingServiceNotificationManager(this);
sharedPreferences = PreferencesUtils.getSharedPreferences(this); PreferencesUtils.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, null);
} }
@Override @Override
@@ -173,8 +169,7 @@ public class TrackRecordingService extends Service implements TrackPointCreator.
// Reverse order from onCreate // Reverse order from onCreate
showNotification(false); //TODO Why? showNotification(false); //TODO Why?
sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); PreferencesUtils.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
sharedPreferences = null;
try { try {
voiceAnnouncementManager.shutdown(); voiceAnnouncementManager.shutdown();
@@ -68,10 +68,9 @@ class GpsStatus {
this.client = client; this.client = client;
this.context = context; this.context = context;
SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); thresholdHorizontalAccuracy = PreferencesUtils.getRecordingDistanceInterval();
thresholdHorizontalAccuracy = PreferencesUtils.getRecordingDistanceInterval(sharedPreferences, context);
Duration minRecordingInterval = PreferencesUtils.getMinRecordingInterval(sharedPreferences, context); Duration minRecordingInterval = PreferencesUtils.getMinRecordingInterval();
signalLostThreshold = SIGNAL_LOST_THRESHOLD.plus(minRecordingInterval); signalLostThreshold = SIGNAL_LOST_THRESHOLD.plus(minRecordingInterval);
gpsStatusHandler = new Handler(); gpsStatusHandler = new Handler();
@@ -35,8 +35,8 @@ public class LocationHandler implements LocationListener, GpsStatus.GpsStatusLis
this.trackPointCreator = trackPointCreator; this.trackPointCreator = trackPointCreator;
} }
public void onStart(@NonNull Context context, SharedPreferences sharedPreferences) { public void onStart(@NonNull Context context) {
onSharedPreferenceChanged(context, sharedPreferences, null); onSharedPreferenceChanged(null);
gpsStatus = new GpsStatus(context, this); gpsStatus = new GpsStatus(context, this);
locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
registerLocationListener(); registerLocationListener();
@@ -62,26 +62,26 @@ public class LocationHandler implements LocationListener, GpsStatus.GpsStatusLis
} }
} }
public void onSharedPreferenceChanged(@NonNull Context context, @NonNull SharedPreferences sharedPreferences, String key) { public void onSharedPreferenceChanged(String key) {
boolean registerListener = false; boolean registerListener = false;
if (PreferencesUtils.isKey(context, R.string.min_recording_interval_key, key)) { if (PreferencesUtils.isKey(R.string.min_recording_interval_key, key)) {
registerListener = true; registerListener = true;
gpsInterval = PreferencesUtils.getMinRecordingInterval(sharedPreferences, context); gpsInterval = PreferencesUtils.getMinRecordingInterval();
if (gpsStatus != null) { if (gpsStatus != null) {
gpsStatus.onMinRecordingIntervalChanged(gpsInterval); gpsStatus.onMinRecordingIntervalChanged(gpsInterval);
} }
} }
if (PreferencesUtils.isKey(context, R.string.recording_gps_accuracy_key, key)) { if (PreferencesUtils.isKey(R.string.recording_gps_accuracy_key, key)) {
thresholdHorizontalAccuracy = PreferencesUtils.getThresholdHorizontalAccuracy(sharedPreferences, context); thresholdHorizontalAccuracy = PreferencesUtils.getThresholdHorizontalAccuracy();
} }
if (PreferencesUtils.isKey(context, R.string.recording_distance_interval_key, key)) { if (PreferencesUtils.isKey(R.string.recording_distance_interval_key, key)) {
registerListener = true; registerListener = true;
if (gpsStatus != null) { if (gpsStatus != null) {
Distance gpsMinDistance = PreferencesUtils.getRecordingDistanceInterval(sharedPreferences, context); Distance gpsMinDistance = PreferencesUtils.getRecordingDistanceInterval();
gpsStatus.onRecordingDistanceChanged(gpsMinDistance); gpsStatus.onRecordingDistanceChanged(gpsMinDistance);
} }
} }
@@ -51,8 +51,7 @@ public class TrackPointCreator {
public void start(@NonNull Context context) { public void start(@NonNull Context context) {
this.context = context; this.context = context;
SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); locationHandler.onStart(context);
locationHandler.onStart(context, sharedPreferences);
remoteSensorManager = new BluetoothRemoteSensorManager(context); remoteSensorManager = new BluetoothRemoteSensorManager(context);
remoteSensorManager.start(); remoteSensorManager.start();
@@ -110,13 +109,8 @@ public class TrackPointCreator {
this.context = null; this.context = null;
} }
public void onSharedPreferenceChanged(@NonNull SharedPreferences preferences, String key) { public void onSharedPreferenceChanged(String key) {
if (context == null) { locationHandler.onSharedPreferenceChanged(key);
Log.w(TAG, "not started yet.");
return;
}
locationHandler.onSharedPreferenceChanged(context, preferences, key);
} }
public void onNewTrackPoint(TrackPoint trackPoint, Distance thresholdHorizontalAccuracy) { public void onNewTrackPoint(TrackPoint trackPoint, Distance thresholdHorizontalAccuracy) {
@@ -61,7 +61,6 @@ public class BluetoothRemoteSensorManager implements BluetoothConnectionManager.
private boolean started = false; private boolean started = false;
private final SharedPreferences sharedPreferences;
private Distance preferenceWheelCircumference; private Distance preferenceWheelCircumference;
private final BluetoothConnectionManager.HeartRate heartRate = new BluetoothConnectionManager.HeartRate(this); private final BluetoothConnectionManager.HeartRate heartRate = new BluetoothConnectionManager.HeartRate(this);
@@ -77,34 +76,34 @@ public class BluetoothRemoteSensorManager implements BluetoothConnectionManager.
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (!started) return; if (!started) return;
if (PreferencesUtils.isKey(context, R.string.settings_sensor_bluetooth_heart_rate_key, key)) { if (PreferencesUtils.isKey(R.string.settings_sensor_bluetooth_heart_rate_key, key)) {
String address = PreferencesUtils.getBluetoothHeartRateSensorAddress(sharedPreferences, context); String address = PreferencesUtils.getBluetoothHeartRateSensorAddress();
connect(heartRate, address); connect(heartRate, address);
} }
if (PreferencesUtils.isKey(context, R.string.settings_sensor_bluetooth_cycling_cadence_key, key)) { if (PreferencesUtils.isKey(R.string.settings_sensor_bluetooth_cycling_cadence_key, key)) {
String address = PreferencesUtils.getBluetoothCyclingCadenceSensorAddress(sharedPreferences, context); String address = PreferencesUtils.getBluetoothCyclingCadenceSensorAddress();
connect(cyclingCadence, address); connect(cyclingCadence, address);
} }
if (PreferencesUtils.isKey(context, R.string.settings_sensor_bluetooth_cycling_speed_key, key)) { if (PreferencesUtils.isKey(R.string.settings_sensor_bluetooth_cycling_speed_key, key)) {
String address = PreferencesUtils.getBluetoothCyclingSpeedSensorAddress(sharedPreferences, context); String address = PreferencesUtils.getBluetoothCyclingSpeedSensorAddress();
connect(cyclingSpeed, address); connect(cyclingSpeed, address);
} }
if (PreferencesUtils.isKey(context, R.string.settings_sensor_bluetooth_cycling_speed_wheel_circumference_key, key)) { if (PreferencesUtils.isKey(R.string.settings_sensor_bluetooth_cycling_speed_wheel_circumference_key, key)) {
preferenceWheelCircumference = PreferencesUtils.getWheelCircumference(sharedPreferences, context); preferenceWheelCircumference = PreferencesUtils.getWheelCircumference();
} }
if (PreferencesUtils.isKey(context, R.string.settings_sensor_bluetooth_cycling_power_key, key)) { if (PreferencesUtils.isKey(R.string.settings_sensor_bluetooth_cycling_power_key, key)) {
String address = PreferencesUtils.getBluetoothCyclingPowerSensorAddress(sharedPreferences, context); String address = PreferencesUtils.getBluetoothCyclingPowerSensorAddress();
connect(cyclingPower, address); connect(cyclingPower, address);
} }
if (PreferencesUtils.isKey(context, R.string.settings_sensor_bluetooth_running_speed_and_cadence_key, key)) { if (PreferencesUtils.isKey(R.string.settings_sensor_bluetooth_running_speed_and_cadence_key, key)) {
String address = PreferencesUtils.getBluetoothRunningSpeedAndCadenceAddress(sharedPreferences, context); String address = PreferencesUtils.getBluetoothRunningSpeedAndCadenceAddress();
connect(runningSpeedAndCadence, address); connect(runningSpeedAndCadence, address);
} }
@@ -113,16 +112,14 @@ public class BluetoothRemoteSensorManager implements BluetoothConnectionManager.
public BluetoothRemoteSensorManager(Context context) { public BluetoothRemoteSensorManager(Context context) {
this.context = context; this.context = context;
sharedPreferences = PreferencesUtils.getSharedPreferences(context);
bluetoothAdapter = BluetoothUtils.getAdapter(context); bluetoothAdapter = BluetoothUtils.getAdapter(context);
} }
public void start() { public void start() {
started = true; started = true;
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
//Trigger connection startup //Registering triggers connection startup
sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, null); PreferencesUtils.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
} }
public synchronized void stop() { public synchronized void stop() {
@@ -134,7 +131,7 @@ public class BluetoothRemoteSensorManager implements BluetoothConnectionManager.
sensorDataSet.clear(); sensorDataSet.clear();
sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); PreferencesUtils.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
started = false; started = false;
} }
@@ -148,7 +145,7 @@ public class BluetoothRemoteSensorManager implements BluetoothConnectionManager.
return; return;
} }
if (PreferencesUtils.isBluetoothSensorAddressNone(context, address)) { if (PreferencesUtils.isBluetoothSensorAddressNone(address)) {
Log.w(TAG, "No Bluetooth address."); Log.w(TAG, "No Bluetooth address.");
connectionManager.disconnect(); connectionManager.disconnect();
return; return;
@@ -103,8 +103,6 @@ public class VoiceAnnouncement {
} }
}; };
private SharedPreferences sharedPreferences;
private TextToSpeech tts; private TextToSpeech tts;
// Response from TTS after its initialization // Response from TTS after its initialization
private int ttsInitStatus = TextToSpeech.ERROR; private int ttsInitStatus = TextToSpeech.ERROR;
@@ -122,8 +120,6 @@ public class VoiceAnnouncement {
public void start() { public void start() {
Log.d(TAG, "Start"); Log.d(TAG, "Start");
sharedPreferences = PreferencesUtils.getSharedPreferences(context);
if (tts == null) { if (tts == null) {
tts = new TextToSpeech(context, status -> { tts = new TextToSpeech(context, status -> {
Log.i(TAG, "TextToSpeech initialized with status " + status); Log.i(TAG, "TextToSpeech initialized with status " + status);
@@ -161,9 +157,9 @@ public class VoiceAnnouncement {
} }
boolean isMetricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, context); boolean isMetricUnits = PreferencesUtils.isMetricUnits();
boolean isReportSpeed = PreferencesUtils.isReportSpeed(sharedPreferences, context, track.getCategory()); boolean isReportSpeed = PreferencesUtils.isReportSpeed(track.getCategory());
Distance minGPSDistance = PreferencesUtils.getRecordingDistanceInterval(sharedPreferences, context); Distance minGPSDistance = PreferencesUtils.getRecordingDistanceInterval();
//TODO Do not load all trackpoints for every announcement //TODO Do not load all trackpoints for every announcement
TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(track.getId(), null); TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(track.getId(), null);
@@ -187,8 +183,6 @@ public class VoiceAnnouncement {
ttsFallback.release(); ttsFallback.release();
ttsFallback = null; ttsFallback = null;
} }
sharedPreferences = null;
} }
private void onTtsReady() { private void onTtsReady() {
@@ -203,7 +197,7 @@ public class VoiceAnnouncement {
*/ */
} }
tts.setLanguage(locale); tts.setLanguage(locale);
tts.setSpeechRate(PreferencesUtils.getVoiceSpeedRate(PreferencesUtils.getSharedPreferences(context), context)); tts.setSpeechRate(PreferencesUtils.getVoiceSpeedRate());
tts.setOnUtteranceProgressListener(utteranceListener); tts.setOnUtteranceProgressListener(utteranceListener);
} }
} }
@@ -49,7 +49,7 @@ public class ActivityTypePreference extends DialogPreference {
setDialogIcon(null); setDialogIcon(null);
setPersistent(true); setPersistent(true);
SummaryProvider<DialogPreference> summaryProvider = preference -> PreferencesUtils.getDefaultActivity(PreferencesUtils.getSharedPreferences(context), ActivityTypePreference.this.getContext()); SummaryProvider<DialogPreference> summaryProvider = preference -> PreferencesUtils.getDefaultActivity();
setSummaryProvider(summaryProvider); setSummaryProvider(summaryProvider);
} }
@@ -61,8 +61,6 @@ public class ActivityTypePreference extends DialogPreference {
public static class ActivityPreferenceDialog extends PreferenceDialogFragmentCompat { public static class ActivityPreferenceDialog extends PreferenceDialogFragmentCompat {
private SharedPreferences sharedPreferences;
private AutoCompleteTextView textView; private AutoCompleteTextView textView;
private ImageView iconView; private ImageView iconView;
@@ -80,11 +78,9 @@ public class ActivityTypePreference extends DialogPreference {
super.onBindDialogView(view); super.onBindDialogView(view);
final Context context = getActivity(); final Context context = getActivity();
sharedPreferences = PreferencesUtils.getSharedPreferences(context);
textView = view.findViewById(R.id.activity_type_preference_text_view); textView = view.findViewById(R.id.activity_type_preference_text_view);
String category = PreferencesUtils.getDefaultActivity(sharedPreferences, context); String category = PreferencesUtils.getDefaultActivity();
textView.setText(category); textView.setText(category);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(context, R.array.activity_types, android.R.layout.simple_dropdown_item_1line); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(context, R.array.activity_types, android.R.layout.simple_dropdown_item_1line);
textView.setAdapter(adapter); textView.setAdapter(adapter);
@@ -105,14 +101,8 @@ public class ActivityTypePreference extends DialogPreference {
updateIcon(TrackIconUtils.getIconValue(context, category)); updateIcon(TrackIconUtils.getIconValue(context, category));
} }
@Override
public void onDestroy() {
super.onDestroy();
sharedPreferences = null;
}
private void showIconSelectDialog() { private void showIconSelectDialog() {
String category = PreferencesUtils.getDefaultActivity(sharedPreferences, getActivity()); String category = PreferencesUtils.getDefaultActivity();
ChooseActivityTypeDialogFragment.showDialog(getActivity().getSupportFragmentManager(), category); ChooseActivityTypeDialogFragment.showDialog(getActivity().getSupportFragmentManager(), category);
} }
@@ -121,7 +111,7 @@ public class ActivityTypePreference extends DialogPreference {
if (positiveResult) { if (positiveResult) {
String newDefaultActivity = textView.getText().toString(); String newDefaultActivity = textView.getText().toString();
if (getPreference().callChangeListener(newDefaultActivity)) { if (getPreference().callChangeListener(newDefaultActivity)) {
PreferencesUtils.setDefaultActivity(sharedPreferences, getActivity(), newDefaultActivity); PreferencesUtils.setDefaultActivity(newDefaultActivity);
HackUtils.invalidatePreference(getPreference()); HackUtils.invalidatePreference(getPreference());
} }
} }
@@ -14,7 +14,7 @@ final class PreferenceHelper {
for (int i = 0; i < entryValues.length; i++) { for (int i = 0; i < entryValues.length; i++) {
int value = Integer.parseInt(entryValues[i]); int value = Integer.parseInt(entryValues[i]);
if (value == PreferencesUtils.getMinRecordingIntervalDefault(context).getSeconds()) { if (value == PreferencesUtils.getMinRecordingIntervalDefault().getSeconds()) {
entries[i] = context.getString(R.string.value_smallest_recommended); entries[i] = context.getString(R.string.value_smallest_recommended);
} else { } else {
entries[i] = value < 60 ? context.getString(R.string.value_integer_second, value) : context.getString(R.string.value_integer_minute, value / 60); entries[i] = value < 60 ? context.getString(R.string.value_integer_second, value) : context.getString(R.string.value_integer_minute, value / 60);
@@ -28,7 +28,7 @@ final class PreferenceHelper {
String[] entryValues = context.getResources().getStringArray(R.array.recording_distance_interval_values); String[] entryValues = context.getResources().getStringArray(R.array.recording_distance_interval_values);
String[] entries = new String[entryValues.length]; String[] entries = new String[entryValues.length];
final int recordingDistanceIntervalDefault = (int) PreferencesUtils.getRecordingDistanceIntervalDefault(context).toM(); final int recordingDistanceIntervalDefault = (int) PreferencesUtils.getRecordingDistanceIntervalDefault().toM();
for (int i = 0; i < entryValues.length; i++) { for (int i = 0; i < entryValues.length; i++) {
int value = Integer.parseInt(entryValues[i]); int value = Integer.parseInt(entryValues[i]);
@@ -46,7 +46,7 @@ public class ResetDialogPreference extends DialogPreference {
PreferencesUtils.resetPreferences(activity, true); PreferencesUtils.resetPreferences(activity, true);
Toast.makeText(activity, R.string.settings_reset_done, Toast.LENGTH_SHORT).show(); Toast.makeText(activity, R.string.settings_reset_done, Toast.LENGTH_SHORT).show();
} else if (preferenceKey.equals(getString(R.string.settings_layout_reset_key))) { } else if (preferenceKey.equals(getString(R.string.settings_layout_reset_key))) {
PreferencesUtils.resetCustomLayoutPreferences(activity); PreferencesUtils.resetCustomLayoutPreferences();
Toast.makeText(activity, R.string.settings_layout_reset_done, Toast.LENGTH_SHORT).show(); Toast.makeText(activity, R.string.settings_layout_reset_done, Toast.LENGTH_SHORT).show();
} }
@@ -96,14 +96,12 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity
public static class PrefsFragment extends PreferenceFragmentCompat { public static class PrefsFragment extends PreferenceFragmentCompat {
private SharedPreferences sharedPreferences;
private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = (sharedPreferences, key) -> { private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = (sharedPreferences, key) -> {
if (PreferencesUtils.isKey(getActivity(), R.string.stats_units_key, key)) { if (PreferencesUtils.isKey(R.string.stats_units_key, key)) {
getActivity().runOnUiThread(this::updateUnits); getActivity().runOnUiThread(this::updateUnits);
} }
if (PreferencesUtils.isKey(getActivity(), R.string.night_mode_key, key)) { if (PreferencesUtils.isKey(R.string.night_mode_key, key)) {
getActivity().runOnUiThread(() -> ActivityUtils.applyNightMode(sharedPreferences, getContext())); getActivity().runOnUiThread(PreferencesUtils::applyNightMode);
} }
}; };
@@ -130,8 +128,6 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity
@Override @Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
sharedPreferences = PreferencesUtils.getSharedPreferences(getContext());
trackRecordingServiceConnection = new TrackRecordingServiceConnection(bindServiceCallback); trackRecordingServiceConnection = new TrackRecordingServiceConnection(bindServiceCallback);
try { try {
@@ -149,7 +145,7 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity
Preference instantExportDirectoryPreference = findPreference(getString(R.string.settings_default_export_directory_key)); Preference instantExportDirectoryPreference = findPreference(getString(R.string.settings_default_export_directory_key));
instantExportDirectoryPreference.setSummaryProvider(preference -> { instantExportDirectoryPreference.setSummaryProvider(preference -> {
DocumentFile directory = PreferencesUtils.getDefaultExportDirectoryUri(sharedPreferences, getContext()); DocumentFile directory = PreferencesUtils.getDefaultExportDirectoryUri(getContext());
//Use same value for not set as Androidx ListPreference and EditTextPreference //Use same value for not set as Androidx ListPreference and EditTextPreference
return directory != null ? directory.getName() : getString(R.string.not_set); return directory != null ? directory.getName() : getString(R.string.not_set);
}); });
@@ -157,31 +153,31 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity
findPreference(getString(R.string.recording_distance_interval_key)) findPreference(getString(R.string.recording_distance_interval_key))
.setSummaryProvider( .setSummaryProvider(
preference -> { preference -> {
boolean metricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, getActivity()); boolean metricUnits = PreferencesUtils.isMetricUnits();
Distance distance = PreferencesUtils.getRecordingDistanceInterval(sharedPreferences, getContext()); Distance distance = PreferencesUtils.getRecordingDistanceInterval();
return getString(R.string.settings_recording_location_frequency_summary, StringUtils.formatDistance(getContext(), distance, metricUnits)); return getString(R.string.settings_recording_location_frequency_summary, StringUtils.formatDistance(getContext(), distance, metricUnits));
} }
); );
findPreference(getString(R.string.max_recording_distance_key)) findPreference(getString(R.string.max_recording_distance_key))
.setSummaryProvider( .setSummaryProvider(
preference -> { preference -> {
boolean metricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, getActivity()); boolean metricUnits = PreferencesUtils.isMetricUnits();
Distance distance = PreferencesUtils.getMaxRecordingDistance(sharedPreferences, getContext()); Distance distance = PreferencesUtils.getMaxRecordingDistance();
return getString(R.string.settings_recording_max_recording_distance_summary, StringUtils.formatDistance(getContext(), distance, metricUnits)); return getString(R.string.settings_recording_max_recording_distance_summary, StringUtils.formatDistance(getContext(), distance, metricUnits));
} }
); );
findPreference(getString(R.string.recording_gps_accuracy_key)) findPreference(getString(R.string.recording_gps_accuracy_key))
.setSummaryProvider( .setSummaryProvider(
preference -> { preference -> {
boolean metricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, getActivity()); boolean metricUnits = PreferencesUtils.isMetricUnits();
Distance distance = PreferencesUtils.getThresholdHorizontalAccuracy(sharedPreferences, getContext()); Distance distance = PreferencesUtils.getThresholdHorizontalAccuracy();
return getString(R.string.settings_recording_min_required_accuracy_summary, StringUtils.formatDistance(getContext(), distance, metricUnits)); return getString(R.string.settings_recording_min_required_accuracy_summary, StringUtils.formatDistance(getContext(), distance, metricUnits));
} }
); );
findPreference(getString(R.string.min_recording_interval_key)) findPreference(getString(R.string.min_recording_interval_key))
.setSummaryProvider( .setSummaryProvider(
preference -> { preference -> {
Duration interval = PreferencesUtils.getMinRecordingInterval(sharedPreferences, getContext()); Duration interval = PreferencesUtils.getMinRecordingInterval();
return getString(R.string.settings_recording_location_frequency_summary, getString(R.string.value_integer_second, interval.getSeconds())); return getString(R.string.settings_recording_location_frequency_summary, getString(R.string.value_integer_second, interval.getSeconds()));
} }
); );
@@ -200,8 +196,7 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity
trackRecordingServiceConnection.bind(getContext()); trackRecordingServiceConnection.bind(getContext());
sharedPreferences.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); PreferencesUtils.registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, null);
updateUnits(); updateUnits();
updatePrefsDependOnRecording(); updatePrefsDependOnRecording();
@@ -211,13 +206,13 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity
private void updatePostWorkoutExport() { private void updatePostWorkoutExport() {
Preference instantExportEnabledPreference = findPreference(getString(R.string.post_workout_export_enabled_key)); Preference instantExportEnabledPreference = findPreference(getString(R.string.post_workout_export_enabled_key));
instantExportEnabledPreference.setEnabled(PreferencesUtils.isDefaultExportDirectoryUri(sharedPreferences, getContext())); instantExportEnabledPreference.setEnabled(PreferencesUtils.isDefaultExportDirectoryUri(getContext()));
} }
@Override @Override
public void onPause() { public void onPause() {
super.onPause(); super.onPause();
sharedPreferences.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); PreferencesUtils.unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener);
} }
@Override @Override
@@ -251,7 +246,6 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity
public void onDestroy() { public void onDestroy() {
super.onDestroy(); super.onDestroy();
trackRecordingServiceConnection.unbind(getContext()); trackRecordingServiceConnection.unbind(getContext());
sharedPreferences = null;
} }
public void setDefaultActivity(String iconValue) { public void setDefaultActivity(String iconValue) {
@@ -282,7 +276,7 @@ public class SettingsActivity extends AbstractActivity implements ChooseActivity
} }
private void updateUnits() { private void updateUnits() {
boolean metricUnits = PreferencesUtils.isMetricUnits(sharedPreferences, getActivity()); boolean metricUnits = PreferencesUtils.isMetricUnits();
ListPreference voiceFrequency = findPreference(getString(R.string.voice_announcement_frequency_key)); ListPreference voiceFrequency = findPreference(getString(R.string.voice_announcement_frequency_key));
voiceFrequency.setEntries(StringUtils.getAnnouncementFrequency(getActivity())); voiceFrequency.setEntries(StringUtils.getAnnouncementFrequency(getActivity()));
@@ -34,20 +34,18 @@ public class SettingsCustomLayoutActivity extends AbstractActivity implements Se
private SettingsCustomLayoutAdapter adapterFieldsHidden; private SettingsCustomLayoutAdapter adapterFieldsHidden;
private Layout layoutFieldsVisible; private Layout layoutFieldsVisible;
private Layout layoutFieldsHidden; private Layout layoutFieldsHidden;
private SharedPreferences sharedPreferences;
private int numColumns; private int numColumns;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
sharedPreferences = PreferencesUtils.getSharedPreferences(this);
// Recycler view with visible stats. // Recycler view with visible stats.
layoutFieldsVisible = StatisticsUtils.filterVisible(PreferencesUtils.getCustomLayout(sharedPreferences, this), true); layoutFieldsVisible = StatisticsUtils.filterVisible(PreferencesUtils.getCustomLayout(), true);
adapterFieldsVisible = new SettingsCustomLayoutAdapter(this, this, layoutFieldsVisible); adapterFieldsVisible = new SettingsCustomLayoutAdapter(this, this, layoutFieldsVisible);
numColumns = PreferencesUtils.getLayoutColumns(sharedPreferences, this); numColumns = PreferencesUtils.getLayoutColumns();
RecyclerView recyclerViewVisible = viewBinding.recyclerViewVisible; RecyclerView recyclerViewVisible = viewBinding.recyclerViewVisible;
gridLayoutManager = new GridLayoutManager(this, numColumns); gridLayoutManager = new GridLayoutManager(this, numColumns);
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@@ -90,7 +88,7 @@ public class SettingsCustomLayoutActivity extends AbstractActivity implements Se
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
numColumns = position + 1; numColumns = position + 1;
gridLayoutManager.setSpanCount(numColumns); gridLayoutManager.setSpanCount(numColumns);
PreferencesUtils.setLayoutColumns(sharedPreferences, SettingsCustomLayoutActivity.this, position + 1); PreferencesUtils.setLayoutColumns(position + 1);
} }
@Override @Override
@@ -98,10 +96,10 @@ public class SettingsCustomLayoutActivity extends AbstractActivity implements Se
} }
}); });
viewBinding.spinnerOptions.setSelection(PreferencesUtils.getLayoutColumns(sharedPreferences, SettingsCustomLayoutActivity.this) - 1); viewBinding.spinnerOptions.setSelection(PreferencesUtils.getLayoutColumns() - 1);
// Recycler view with not visible stats. // Recycler view with not visible stats.
layoutFieldsHidden = StatisticsUtils.filterVisible(PreferencesUtils.getCustomLayout(sharedPreferences, this), false); layoutFieldsHidden = StatisticsUtils.filterVisible(PreferencesUtils.getCustomLayout(), false);
adapterFieldsHidden = new SettingsCustomLayoutAdapter(this, this, layoutFieldsHidden); adapterFieldsHidden = new SettingsCustomLayoutAdapter(this, this, layoutFieldsHidden);
RecyclerView recyclerViewNotVisible = viewBinding.recyclerViewNotVisible; RecyclerView recyclerViewNotVisible = viewBinding.recyclerViewNotVisible;
recyclerViewNotVisible.setLayoutManager(new LinearLayoutManager(this)); recyclerViewNotVisible.setLayoutManager(new LinearLayoutManager(this));
@@ -115,14 +113,13 @@ public class SettingsCustomLayoutActivity extends AbstractActivity implements Se
Layout newLayout = new Layout(layoutFieldsVisible.getProfile()); Layout newLayout = new Layout(layoutFieldsVisible.getProfile());
newLayout.addFields(layoutFieldsVisible.getFields()); newLayout.addFields(layoutFieldsVisible.getFields());
newLayout.addFields(layoutFieldsHidden.getFields()); newLayout.addFields(layoutFieldsHidden.getFields());
PreferencesUtils.setCustomLayout(sharedPreferences, this, newLayout); PreferencesUtils.setCustomLayout(newLayout);
} }
} }
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
sharedPreferences = null;
layoutFieldsVisible = null; layoutFieldsVisible = null;
} }
@@ -91,7 +91,7 @@ public abstract class BluetoothLeSensorPreference extends DialogPreference {
@Override @Override
public CharSequence getSummary() { public CharSequence getSummary() {
if (getValue() == null || PreferencesUtils.isBluetoothSensorAddressNone(getContext(), getValue())) { if (getValue() == null || PreferencesUtils.isBluetoothSensorAddressNone(getValue())) {
return getContext().getString(DEVICE_NONE_RESOURCEID); return getContext().getString(DEVICE_NONE_RESOURCEID);
} }
@@ -107,8 +107,4 @@ public class ActivityUtils {
vibrator.vibrate(milliseconds); vibrator.vibrate(milliseconds);
} }
} }
public static void applyNightMode(SharedPreferences sharedPreferences, Context context) {
AppCompatDelegate.setDefaultNightMode(PreferencesUtils.getDefaultNightMode(sharedPreferences, context));
}
} }
@@ -29,10 +29,9 @@ public class ExportUtils {
private static final String TAG = ExportUtils.class.getSimpleName(); private static final String TAG = ExportUtils.class.getSimpleName();
public static void postWorkoutExport(Context context, Track.Id trackId, ExportServiceResultReceiver resultReceiver) { public static void postWorkoutExport(Context context, Track.Id trackId, ExportServiceResultReceiver resultReceiver) {
SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); if (PreferencesUtils.shouldInstantExportAfterWorkout(context)) {
if (PreferencesUtils.shouldInstantExportAfterWorkout(sharedPreferences, context)) { TrackFileFormat trackFileFormat = PreferencesUtils.getExportTrackFileFormat();
TrackFileFormat trackFileFormat = PreferencesUtils.getExportTrackFileFormat(sharedPreferences, context); DocumentFile directory = PreferencesUtils.getDefaultExportDirectoryUri(context);
DocumentFile directory = PreferencesUtils.getDefaultExportDirectoryUri(sharedPreferences, context);
ExportService.enqueue(context, resultReceiver, trackId, trackFileFormat, directory.getUri()); ExportService.enqueue(context, resultReceiver, trackId, trackFileFormat, directory.getUri());
} }
@@ -74,13 +74,11 @@ public class IntentDashboardUtils {
intent.putParcelableArrayListExtra(ACTION_DASHBOARD_PAYLOAD, uris); intent.putParcelableArrayListExtra(ACTION_DASHBOARD_PAYLOAD, uris);
SharedPreferences sharedPreferences = PreferencesUtils.getSharedPreferences(context); intent.putExtra(EXTRAS_SHOULD_KEEP_SCREEN_ON, PreferencesUtils.shouldKeepScreenOn());
intent.putExtra(EXTRAS_SHOW_WHEN_LOCKED, PreferencesUtils.shouldShowStatsOnLockscreen());
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); intent.putExtra(EXTRAS_OPENTRACKS_IS_RECORDING_THIS_TRACK, isRecording);
if (isRecording) { if (isRecording) {
intent.putExtra(EXTRAS_SHOW_FULLSCREEN, PreferencesUtils.shouldUseFullscreen(sharedPreferences, context)); intent.putExtra(EXTRAS_SHOW_FULLSCREEN, PreferencesUtils.shouldUseFullscreen());
} }
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
@@ -91,7 +91,7 @@ public class IntentUtils {
continue; continue;
} }
Pair<Uri, String> uriTrackFile = ShareContentProvider.createURI(trackId, track.getName(), PreferencesUtils.getExportTrackFileFormat(PreferencesUtils.getSharedPreferences(context), context)); Pair<Uri, String> uriTrackFile = ShareContentProvider.createURI(trackId, track.getName(), PreferencesUtils.getExportTrackFileFormat());
Pair<Uri, String> uriSharePicture = ShareContentProvider.createURI(trackId, track.getName(), TrackFileFormat.SHARE_PICTURE_PNG); Pair<Uri, String> uriSharePicture = ShareContentProvider.createURI(trackId, track.getName(), TrackFileFormat.SHARE_PICTURE_PNG);
uris.addAll(Arrays.asList(uriSharePicture.first, uriTrackFile.first)); uris.addAll(Arrays.asList(uriSharePicture.first, uriTrackFile.first));
@@ -6,29 +6,25 @@ import android.content.SharedPreferences;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
public class PreferencesOpenHelper { public class PreferencesOpenHelper {
private final Context context;
private final SharedPreferences sharedPreferences;
private static final int PREFERENCES_VERSION = 1; private static final int PREFERENCES_VERSION = 1;
private PreferencesOpenHelper(Context context, SharedPreferences sharedPreferences) { private PreferencesOpenHelper() {
this.context = context;
this.sharedPreferences = sharedPreferences;
} }
public static PreferencesOpenHelper newInstance(Context context, SharedPreferences sharedPreferences) { public static PreferencesOpenHelper newInstance() {
return new PreferencesOpenHelper(context, sharedPreferences); return new PreferencesOpenHelper();
} }
public void checkForUpgrade() { public void checkForUpgrade() {
int lastVersion = PreferencesUtils.getInt(sharedPreferences, context, R.string.prefs_last_version_key, 0); int lastVersion = PreferencesUtils.getInt(R.string.prefs_last_version_key, 0);
if (PREFERENCES_VERSION > lastVersion) { if (PREFERENCES_VERSION > lastVersion) {
onUpgrade(); onUpgrade();
} }
} }
private void onUpgrade() { private void onUpgrade() {
PreferencesUtils.setInt(sharedPreferences, context, R.string.prefs_last_version_key, PREFERENCES_VERSION); PreferencesUtils.setInt(R.string.prefs_last_version_key, PREFERENCES_VERSION);
switch (PREFERENCES_VERSION) { switch (PREFERENCES_VERSION) {
case 1: case 1:
upgradeFrom0to1(); upgradeFrom0to1();
@@ -36,6 +32,6 @@ public class PreferencesOpenHelper {
} }
private void upgradeFrom0to1() { private void upgradeFrom0to1() {
PreferencesUtils.setString(sharedPreferences, context, R.string.stats_custom_layout_fields_key, PreferencesUtils.buildDefaultLayout(context)); PreferencesUtils.setString(R.string.stats_custom_layout_fields_key, PreferencesUtils.buildDefaultLayout());
} }
} }
@@ -20,11 +20,13 @@ import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor; import android.content.SharedPreferences.Editor;
import android.content.res.Resources;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.net.Uri; import android.net.Uri;
import android.util.Log; import android.util.Log;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.documentfile.provider.DocumentFile; import androidx.documentfile.provider.DocumentFile;
import androidx.preference.PreferenceManager; import androidx.preference.PreferenceManager;
@@ -54,29 +56,44 @@ public class PreferencesUtils {
private PreferencesUtils() { private PreferencesUtils() {
} }
@Deprecated //Should only be used to get a sharedPreference for more than one interaction! private static SharedPreferences sharedPreferences;
public static SharedPreferences getSharedPreferences(Context context) {
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); private static Resources resources;
PreferencesOpenHelper.newInstance(context, sharedPreferences).checkForUpgrade();
return sharedPreferences; /**
* Must be called during application startup.
*/
public static void initPreferences(final Context context, final Resources resources) {
PreferencesUtils.resources = resources;
PreferencesUtils.sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
PreferencesOpenHelper.newInstance().checkForUpgrade();
} }
public static String getDefaultActivity(SharedPreferences sharedPreferences, Context context) { public static void registerOnSharedPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener changeListener) {
return getString(sharedPreferences, context, R.string.default_activity_key, context.getString(R.string.default_activity_default)); sharedPreferences.registerOnSharedPreferenceChangeListener(changeListener);
changeListener.onSharedPreferenceChanged(sharedPreferences, null);
} }
public static void setDefaultActivity(SharedPreferences sharedPreferences, Context context, String newDefaultActivity) { public static void unregisterOnSharedPreferenceChangeListener(SharedPreferences.OnSharedPreferenceChangeListener changeListener) {
setString(sharedPreferences, context, R.string.default_activity_key, newDefaultActivity); sharedPreferences.unregisterOnSharedPreferenceChangeListener(changeListener);
}
public static String getDefaultActivity() {
return getString(R.string.default_activity_key, resources.getString(R.string.default_activity_default));
}
public static void setDefaultActivity(String newDefaultActivity) {
setString(R.string.default_activity_key, newDefaultActivity);
} }
/** /**
* Gets a preference key * Gets a preference key
* *
* @param context the context
* @param keyId the key id * @param keyId the key id
*/ */
private static String getKey(Context context, int keyId) { private static String getKey(int keyId) {
return context.getString(keyId); return resources.getString(keyId);
} }
/** /**
@@ -86,210 +103,210 @@ public class PreferencesUtils {
* @param key The key of the preference * @param key The key of the preference
* @return true if key == null or key belongs to keyId * @return true if key == null or key belongs to keyId
*/ */
public static boolean isKey(Context context, int keyId, String key) { public static boolean isKey(int keyId, String key) {
return key == null || key.equals(getKey(context, keyId)); return key == null || key.equals(getKey(keyId));
} }
public static boolean isKey(Context context, int[] keyIds, String key) { public static boolean isKey(int[] keyIds, String key) {
for(int keyId : keyIds) { for(int keyId : keyIds) {
if (isKey(context, keyId, key)) { if (isKey(keyId, key)) {
return true; return true;
} }
} }
return false; return false;
} }
private static boolean getBoolean(SharedPreferences sharedPreferences, Context context, int keyId, boolean defaultValue) { private static boolean getBoolean(int keyId, boolean defaultValue) {
return sharedPreferences.getBoolean(getKey(context, keyId), defaultValue); return sharedPreferences.getBoolean(getKey(keyId), defaultValue);
} }
static int getInt(SharedPreferences sharedPreferences, Context context, int keyId, int defaultValue) { static int getInt(int keyId, int defaultValue) {
try { try {
return sharedPreferences.getInt(getKey(context, keyId), defaultValue); return sharedPreferences.getInt(getKey(keyId), defaultValue);
} catch (ClassCastException e) { } catch (ClassCastException e) {
//Ignore //Ignore
} }
//NOTE: We assume that the data was stored as String due to use of ListPreference. //NOTE: We assume that the data was stored as String due to use of ListPreference.
try { try {
String stringValue = sharedPreferences.getString(getKey(context, keyId), null); String stringValue = sharedPreferences.getString(getKey(keyId), null);
return Integer.parseInt(stringValue); return Integer.parseInt(stringValue);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
return defaultValue; return defaultValue;
} }
} }
private static float getFloat(SharedPreferences sharedPreferences, Context context, int keyId, float defaultValue) { private static float getFloat(int keyId, float defaultValue) {
try { try {
return sharedPreferences.getFloat(getKey(context, keyId), defaultValue); return sharedPreferences.getFloat(getKey(keyId), defaultValue);
} catch (ClassCastException e) { } catch (ClassCastException e) {
//Ignore //Ignore
} }
//NOTE: We assume that the data was stored as String due to use of ListPreference. //NOTE: We assume that the data was stored as String due to use of ListPreference.
try { try {
String stringValue = sharedPreferences.getString(getKey(context, keyId), null); String stringValue = sharedPreferences.getString(getKey(keyId), null);
return Float.parseFloat(stringValue); return Float.parseFloat(stringValue);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
return defaultValue; return defaultValue;
} }
} }
public static String getString(SharedPreferences sharedPreferences, Context context, int keyId, String defaultValue) { public static String getString(int keyId, String defaultValue) {
return sharedPreferences.getString(getKey(context, keyId), defaultValue); return sharedPreferences.getString(getKey(keyId), defaultValue);
} }
@VisibleForTesting @VisibleForTesting
public static void setString(SharedPreferences sharedPreferences, Context context, int keyId, String value) { public static void setString(int keyId, String value) {
Editor editor = sharedPreferences.edit(); Editor editor = sharedPreferences.edit();
editor.putString(getKey(context, keyId), value); editor.putString(getKey(keyId), value);
editor.apply(); editor.apply();
} }
static void setInt(SharedPreferences sharedPreferences, Context context, int keyId, int value) { static void setInt(int keyId, int value) {
Editor editor = sharedPreferences.edit(); Editor editor = sharedPreferences.edit();
editor.putInt(getKey(context, keyId), value); editor.putInt(getKey(keyId), value);
editor.apply(); editor.apply();
} }
public static boolean isMetricUnits(SharedPreferences sharedPreferences, Context context) { public static boolean isMetricUnits() {
final String STATS_UNIT = context.getString(R.string.stats_units_default); final String STATS_UNIT = resources.getString(R.string.stats_units_default);
return STATS_UNIT.equals(getString(sharedPreferences, context, R.string.stats_units_key, STATS_UNIT)); return STATS_UNIT.equals(getString(R.string.stats_units_key, STATS_UNIT));
} }
public static void setMetricUnits(SharedPreferences sharedPreferences, Context context, boolean metricUnits) { public static void setMetricUnits(boolean metricUnits) {
String unit; String unit;
if (metricUnits) { if (metricUnits) {
unit = context.getString(R.string.stats_units_metric); unit = resources.getString(R.string.stats_units_metric);
} else { } else {
unit = context.getString(R.string.stats_units_imperial); unit = resources.getString(R.string.stats_units_imperial);
} }
setString(sharedPreferences, context, R.string.stats_units_key, unit); setString( R.string.stats_units_key, unit);
} }
public static boolean isReportSpeed(SharedPreferences sharedPreferences, Context context, String category) { public static boolean isReportSpeed(String category) {
final String STATS_RATE_DEFAULT = context.getString(R.string.stats_rate_default); final String STATS_RATE_DEFAULT = resources.getString(R.string.stats_rate_default);
String currentStatsRate = getString(sharedPreferences, context, R.string.stats_rate_key, STATS_RATE_DEFAULT); String currentStatsRate = getString(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))) { if (currentStatsRate.equals(getString(R.string.stats_rate_speed_or_pace_default, STATS_RATE_DEFAULT))) {
return TrackIconUtils.isSpeedIcon(context, category); return TrackIconUtils.isSpeedIcon(resources, category);
} }
return currentStatsRate.equals(context.getString(R.string.stats_rate_speed)); return currentStatsRate.equals(resources.getString(R.string.stats_rate_speed));
} }
private static String getBluetoothSensorAddressNone(Context context) { private static String getBluetoothSensorAddressNone() {
return context.getString(R.string.sensor_type_value_none); return resources.getString(R.string.sensor_type_value_none);
} }
public static boolean isBluetoothSensorAddressNone(Context context, String currentValue) { public static boolean isBluetoothSensorAddressNone(String currentValue) {
return getBluetoothSensorAddressNone(context).equals(currentValue); return getBluetoothSensorAddressNone().equals(currentValue);
} }
public static String getBluetoothHeartRateSensorAddress(SharedPreferences sharedPreferences, Context context) { public static String getBluetoothHeartRateSensorAddress() {
return getString(sharedPreferences, context, R.string.settings_sensor_bluetooth_heart_rate_key, getBluetoothSensorAddressNone(context)); return getString(R.string.settings_sensor_bluetooth_heart_rate_key, getBluetoothSensorAddressNone());
} }
public static String getBluetoothCyclingCadenceSensorAddress(SharedPreferences sharedPreferences, Context context) { public static String getBluetoothCyclingCadenceSensorAddress() {
return getString(sharedPreferences, context, R.string.settings_sensor_bluetooth_cycling_cadence_key, getBluetoothSensorAddressNone(context)); return getString(R.string.settings_sensor_bluetooth_cycling_cadence_key, getBluetoothSensorAddressNone());
} }
public static String getBluetoothCyclingSpeedSensorAddress(SharedPreferences sharedPreferences, Context context) { public static String getBluetoothCyclingSpeedSensorAddress() {
return getString(sharedPreferences, context, R.string.settings_sensor_bluetooth_cycling_speed_key, getBluetoothSensorAddressNone(context)); return getString(R.string.settings_sensor_bluetooth_cycling_speed_key, getBluetoothSensorAddressNone());
} }
public static Distance getWheelCircumference(SharedPreferences sharedPreferences, Context context) { public static Distance getWheelCircumference() {
final int DEFAULT = Integer.parseInt(context.getResources().getString(R.string.settings_sensor_bluetooth_cycling_speed_wheel_circumference_default)); final int DEFAULT = Integer.parseInt(resources.getString(R.string.settings_sensor_bluetooth_cycling_speed_wheel_circumference_default));
return Distance.ofMM(getInt(sharedPreferences, context, R.string.settings_sensor_bluetooth_cycling_speed_wheel_circumference_key, DEFAULT)); return Distance.ofMM(getInt(R.string.settings_sensor_bluetooth_cycling_speed_wheel_circumference_key, DEFAULT));
} }
public static String getBluetoothCyclingPowerSensorAddress(SharedPreferences sharedPreferences, Context context) { public static String getBluetoothCyclingPowerSensorAddress() {
return getString(sharedPreferences, context, R.string.settings_sensor_bluetooth_cycling_power_key, getBluetoothSensorAddressNone(context)); return getString(R.string.settings_sensor_bluetooth_cycling_power_key, getBluetoothSensorAddressNone());
} }
public static String getBluetoothRunningSpeedAndCadenceAddress(SharedPreferences sharedPreferences, Context context) { public static String getBluetoothRunningSpeedAndCadenceAddress() {
return getString(sharedPreferences, context, R.string.settings_sensor_bluetooth_running_speed_and_cadence_key, getBluetoothSensorAddressNone(context)); return getString(R.string.settings_sensor_bluetooth_running_speed_and_cadence_key, getBluetoothSensorAddressNone());
} }
public static boolean shouldShowStatsOnLockscreen(SharedPreferences sharedPreferences, Context context) { public static boolean shouldShowStatsOnLockscreen() {
final boolean STATS_SHOW_ON_LOCKSCREEN_DEFAULT = context.getResources().getBoolean(R.bool.stats_show_on_lockscreen_while_recording_default); final boolean STATS_SHOW_ON_LOCKSCREEN_DEFAULT = resources.getBoolean(R.bool.stats_show_on_lockscreen_while_recording_default);
return getBoolean(sharedPreferences, context, R.string.stats_show_on_lockscreen_while_recording_key, STATS_SHOW_ON_LOCKSCREEN_DEFAULT); return getBoolean(R.string.stats_show_on_lockscreen_while_recording_key, STATS_SHOW_ON_LOCKSCREEN_DEFAULT);
} }
public static boolean shouldKeepScreenOn(SharedPreferences sharedPreferences, Context context) { public static boolean shouldKeepScreenOn() {
final boolean DEFAULT = context.getResources().getBoolean(R.bool.stats_keep_screen_on_while_recording_default); final boolean DEFAULT = resources.getBoolean(R.bool.stats_keep_screen_on_while_recording_default);
return getBoolean(sharedPreferences, context, R.string.stats_keep_screen_on_while_recording_key, DEFAULT); return getBoolean(R.string.stats_keep_screen_on_while_recording_key, DEFAULT);
} }
public static boolean shouldUseFullscreen(SharedPreferences sharedPreferences, Context context) { public static boolean shouldUseFullscreen() {
final boolean DEFAULT = context.getResources().getBoolean(R.bool.stats_fullscreen_while_recording_default); final boolean DEFAULT = resources.getBoolean(R.bool.stats_fullscreen_while_recording_default);
return getBoolean(sharedPreferences, context, R.string.stats_fullscreen_while_recording_key, DEFAULT); return getBoolean(R.string.stats_fullscreen_while_recording_key, DEFAULT);
} }
public static Duration getVoiceAnnouncementFrequency(SharedPreferences sharedPreferences, Context context) { public static Duration getVoiceAnnouncementFrequency() {
final int DEFAULT = Integer.parseInt(context.getResources().getString(R.string.voice_announcement_frequency_default)); final int DEFAULT = Integer.parseInt(resources.getString(R.string.voice_announcement_frequency_default));
int value = getInt(sharedPreferences, context, R.string.voice_announcement_frequency_key, DEFAULT); int value = getInt(R.string.voice_announcement_frequency_key, DEFAULT);
return Duration.ofSeconds(value); return Duration.ofSeconds(value);
} }
/** /**
* @return Result depends on isMetricUnits * @return Result depends on isMetricUnits
*/ */
public static Distance getVoiceAnnouncementDistance(SharedPreferences sharedPreferences, Context context) { public static Distance getVoiceAnnouncementDistance() {
final float DEFAULT = Integer.parseInt(context.getResources().getString(R.string.voice_announcement_distance_default)); final float DEFAULT = Integer.parseInt(resources.getString(R.string.voice_announcement_distance_default));
float value = getFloat(sharedPreferences, context, R.string.voice_announcement_distance_key, DEFAULT); float value = getFloat(R.string.voice_announcement_distance_key, DEFAULT);
return Distance.one(isMetricUnits(sharedPreferences, context)).multipliedBy(value); return Distance.one(isMetricUnits()).multipliedBy(value);
} }
public static float getVoiceSpeedRate(SharedPreferences sharedPreferences, Context context) { public static float getVoiceSpeedRate() {
final float DEFAULT = Float.parseFloat(context.getResources().getString(R.string.voice_speed_rate_default)); final float DEFAULT = Float.parseFloat(resources.getString(R.string.voice_speed_rate_default));
return getFloat(sharedPreferences, context, R.string.voice_speed_rate_key, DEFAULT); return getFloat(R.string.voice_speed_rate_key, DEFAULT);
} }
public static Distance getRecordingDistanceInterval(SharedPreferences sharedPreferences, Context context) { public static Distance getRecordingDistanceInterval() {
return Distance.of(getInt(sharedPreferences, context, R.string.recording_distance_interval_key, getRecordingDistanceIntervalDefaultInternal(context))); return Distance.of(getInt(R.string.recording_distance_interval_key, getRecordingDistanceIntervalDefaultInternal()));
} }
public static Distance getRecordingDistanceIntervalDefault(Context context) { public static Distance getRecordingDistanceIntervalDefault() {
return Distance.of(getRecordingDistanceIntervalDefaultInternal(context)); return Distance.of(getRecordingDistanceIntervalDefaultInternal());
} }
private static int getRecordingDistanceIntervalDefaultInternal(Context context) { private static int getRecordingDistanceIntervalDefaultInternal() {
return Integer.parseInt(context.getResources().getString(R.string.recording_distance_interval_default)); return Integer.parseInt(resources.getString(R.string.recording_distance_interval_default));
} }
public static Distance getMaxRecordingDistance(SharedPreferences sharedPreferences, Context context) { public static Distance getMaxRecordingDistance() {
final int MAX_RECORDING_DISTANCE = Integer.parseInt(context.getResources().getString(R.string.max_recording_distance_default)); final int MAX_RECORDING_DISTANCE = Integer.parseInt(resources.getString(R.string.max_recording_distance_default));
return Distance.of(getInt(sharedPreferences, context, R.string.max_recording_distance_key, MAX_RECORDING_DISTANCE)); return Distance.of(getInt(R.string.max_recording_distance_key, MAX_RECORDING_DISTANCE));
} }
public static Duration getMinRecordingInterval(SharedPreferences sharedPreferences, Context context) { public static Duration getMinRecordingInterval() {
final Duration MIN_RECORDING_INTERVAL = getMinRecordingIntervalDefault(context); final Duration MIN_RECORDING_INTERVAL = getMinRecordingIntervalDefault();
Duration interval = Duration.ofSeconds(getInt(sharedPreferences, context, R.string.min_recording_interval_key, (int) MIN_RECORDING_INTERVAL.getSeconds())); Duration interval = Duration.ofSeconds(getInt(R.string.min_recording_interval_key, (int) MIN_RECORDING_INTERVAL.getSeconds()));
if (interval.isNegative()) { if (interval.isNegative()) {
// Due to removal of adaptive listener policy; used -1, and -2 // Due to removal of adaptive listener policy; used -1, and -2
interval = getMinRecordingIntervalDefault(context); interval = getMinRecordingIntervalDefault();
} }
return interval; return interval;
} }
public static Duration getMinRecordingIntervalDefault(Context context) { public static Duration getMinRecordingIntervalDefault() {
return Duration.ofSeconds(Integer.parseInt(context.getResources().getString(R.string.min_recording_interval_default))); return Duration.ofSeconds(Integer.parseInt(resources.getString(R.string.min_recording_interval_default)));
} }
public static Distance getThresholdHorizontalAccuracy(SharedPreferences sharedPreferences, Context context) { public static Distance getThresholdHorizontalAccuracy() {
final int RECORDING_GPS_ACCURACY = Integer.parseInt(context.getResources().getString(R.string.recording_gps_accuracy_default)); final int RECORDING_GPS_ACCURACY = Integer.parseInt(resources.getString(R.string.recording_gps_accuracy_default));
return Distance.of(getInt(sharedPreferences, context, R.string.recording_gps_accuracy_key, RECORDING_GPS_ACCURACY)); return Distance.of(getInt(R.string.recording_gps_accuracy_key, RECORDING_GPS_ACCURACY));
} }
public static boolean shouldInstantExportAfterWorkout(SharedPreferences sharedPreferences, Context context) { public static boolean shouldInstantExportAfterWorkout(Context context) {
final boolean INSTANT_POST_WORKOUT_EXPORT_DEFAULT = context.getResources().getBoolean(R.bool.post_workout_export_enabled_default); final boolean INSTANT_POST_WORKOUT_EXPORT_DEFAULT = resources.getBoolean(R.bool.post_workout_export_enabled_default);
return getBoolean(sharedPreferences, context, R.string.post_workout_export_enabled_key, INSTANT_POST_WORKOUT_EXPORT_DEFAULT) && isDefaultExportDirectoryUri(sharedPreferences, context); return getBoolean(R.string.post_workout_export_enabled_key, INSTANT_POST_WORKOUT_EXPORT_DEFAULT) && isDefaultExportDirectoryUri(context);
} }
public static TrackFileFormat getExportTrackFileFormat(SharedPreferences sharedPreferences, Context context) { public static TrackFileFormat getExportTrackFileFormat() {
final String TRACKFILEFORMAT_NAME_DEFAULT = getString(sharedPreferences, context, R.string.export_trackfileformat_default, null); final String TRACKFILEFORMAT_NAME_DEFAULT = getString(R.string.export_trackfileformat_default, null);
String trackFileFormatName = getString(sharedPreferences, context, R.string.export_trackfileformat_key, TRACKFILEFORMAT_NAME_DEFAULT); String trackFileFormatName = getString(R.string.export_trackfileformat_key, TRACKFILEFORMAT_NAME_DEFAULT);
try { try {
return TrackFileFormat.valueOf(trackFileFormatName); return TrackFileFormat.valueOf(trackFileFormatName);
} catch (Exception e) { } catch (Exception e) {
@@ -297,34 +314,31 @@ public class PreferencesUtils {
} }
} }
public static boolean getPreventReimportTracks(SharedPreferences sharedPreferences, Context context) { public static boolean getPreventReimportTracks() {
final boolean defaultValue = getBoolean(sharedPreferences, context, R.bool.import_prevent_reimport_default, false); final boolean defaultValue = getBoolean(R.bool.import_prevent_reimport_default, false);
return getBoolean(sharedPreferences, context, R.string.import_prevent_reimport_key, defaultValue); return getBoolean(R.string.import_prevent_reimport_key, defaultValue);
} }
/** /**
* @return {@link androidx.appcompat.app.AppCompatDelegate}.MODE_* * @return {@link androidx.appcompat.app.AppCompatDelegate}.MODE_*
*/ */
public static int getDefaultNightMode(SharedPreferences sharedPreferences, Context context) { public static int getDefaultNightMode() {
final String defaultValue = getKey(context, R.string.night_mode_default); final String defaultValue = getKey(R.string.night_mode_default);
final String value = getString(sharedPreferences, context, R.string.night_mode_key, defaultValue); final String value = getString(R.string.night_mode_key, defaultValue);
return Integer.parseInt(value); return Integer.parseInt(value);
} }
public static SharedPreferences resetPreferences(Context context, boolean readAgain) { public static void resetPreferences(Context context, boolean readAgain) {
SharedPreferences sharedPreferences = getSharedPreferences(context);
if (readAgain) { if (readAgain) {
// We want to really clear settings now. // We want to really clear settings now.
sharedPreferences.edit().clear().commit(); sharedPreferences.edit().clear().commit();
} }
PreferenceManager.setDefaultValues(context, R.xml.settings, readAgain); PreferenceManager.setDefaultValues(context, R.xml.settings, readAgain);
return sharedPreferences;
} }
public static DocumentFile getDefaultExportDirectoryUri(SharedPreferences sharedPreferences, Context context) { public static DocumentFile getDefaultExportDirectoryUri(Context context) {
String singleExportDirectorySettingsKey = getString(sharedPreferences, context, R.string.settings_default_export_directory_key, null); String singleExportDirectorySettingsKey = getString(R.string.settings_default_export_directory_key, null);
if (singleExportDirectorySettingsKey == null) { if (singleExportDirectorySettingsKey == null) {
return null; return null;
} }
@@ -336,24 +350,24 @@ public class PreferencesUtils {
return null; return null;
} }
public static void setDefaultExportDirectoryUri(SharedPreferences sharedPreferences, Context context, Uri directoryUri) { public static void setDefaultExportDirectoryUri(Uri directoryUri) {
String value = directoryUri != null ? directoryUri.toString() : null; String value = directoryUri != null ? directoryUri.toString() : null;
setString(sharedPreferences, context, R.string.settings_default_export_directory_key, value); setString(R.string.settings_default_export_directory_key, value);
} }
public static boolean isDefaultExportDirectoryUri(SharedPreferences sharedPreferences, Context context) { public static boolean isDefaultExportDirectoryUri(Context context) {
return getDefaultExportDirectoryUri(sharedPreferences, context) != null; return getDefaultExportDirectoryUri(context) != null;
} }
public static int getLayoutColumns(SharedPreferences sharedPreferences, Context context) { public static int getLayoutColumns() {
return getInt(sharedPreferences, context, R.string.stats_custom_layout_columns_key, context.getResources().getInteger(R.integer.stats_custom_layout_columns_default)); return getInt(R.string.stats_custom_layout_columns_key, resources.getInteger(R.integer.stats_custom_layout_columns_default));
} }
public static void setLayoutColumns(SharedPreferences sharedPreferences, Context context, int columns) { public static void setLayoutColumns(int columns) {
setInt(sharedPreferences, context, R.string.stats_custom_layout_columns_key, columns); setInt(R.string.stats_custom_layout_columns_key, columns);
} }
private static List<TypedArray> getMultiTypedArray(Context context, String key) { private static List<TypedArray> getMultiTypedArray(String key) {
List<TypedArray> typedArrays = new ArrayList<>(); List<TypedArray> typedArrays = new ArrayList<>();
try { try {
@@ -362,10 +376,10 @@ public class PreferencesUtils {
int i = 0; int i = 0;
do { do {
field = resource.getField(key + context.getString(R.string.stats_custom_layout_fields_default_value_separator) + i); field = resource.getField(key + resources.getString(R.string.stats_custom_layout_fields_default_value_separator) + i);
typedArrays.add(context.getResources().obtainTypedArray(field.getInt(null))); typedArrays.add(resources.obtainTypedArray(field.getInt(null)));
i++; i++;
} while (field != null); } while (field != null); //TODO Catch no such field exception instead of using an endless loop.
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
Log.e(TAG, e.getMessage()); Log.e(TAG, e.getMessage());
@@ -375,47 +389,58 @@ public class PreferencesUtils {
} }
@SuppressLint("ResourceType") @SuppressLint("ResourceType")
static String buildDefaultLayout(Context context) { static String buildDefaultLayout() {
List<TypedArray> fieldsArrays = getMultiTypedArray(context, "stats_custom_layout_fields_default_value"); List<TypedArray> fieldsArrays = getMultiTypedArray("stats_custom_layout_fields_default_value");
return context.getString(R.string.default_activity_default) + CsvConstants.LINE_SEPARATOR return resources.getString(R.string.default_activity_default) + CsvConstants.LINE_SEPARATOR
+ fieldsArrays.stream().map(i -> i.getString(0) + CsvConstants.ITEM_SEPARATOR + i.getString(1)).collect(Collectors.joining(CsvConstants.LINE_SEPARATOR)) + fieldsArrays.stream().map(i -> i.getString(0) + CsvConstants.ITEM_SEPARATOR + i.getString(1)).collect(Collectors.joining(CsvConstants.LINE_SEPARATOR))
+ CsvConstants.LINE_SEPARATOR; + CsvConstants.LINE_SEPARATOR;
} }
public static Layout getCustomLayout(SharedPreferences sharedPreferences, Context context) { public static Layout getCustomLayout() {
String csvCustomLayout = getString(sharedPreferences, context, R.string.stats_custom_layout_fields_key, buildDefaultLayout(context)); String csvCustomLayout = getString(R.string.stats_custom_layout_fields_key, buildDefaultLayout());
List<String> csvParts = Arrays.asList(csvCustomLayout.split(CsvConstants.LINE_SEPARATOR)); List<String> csvParts = Arrays.asList(csvCustomLayout.split(CsvConstants.LINE_SEPARATOR));
Layout layout = new Layout(csvParts.get(0)); Layout layout = new Layout(csvParts.get(0));
for (int i = 1; i < csvParts.size(); i++) { for (int i = 1; i < csvParts.size(); i++) {
String[] fieldParts = csvParts.get(i).split(CsvConstants.ITEM_SEPARATOR); String[] fieldParts = csvParts.get(i).split(CsvConstants.ITEM_SEPARATOR);
layout.addField(fieldParts[0], DataField.getTitleByKey(context, fieldParts[0]), fieldParts[1].equals(DataField.YES_VALUE), fieldParts[2].equals(DataField.YES_VALUE), fieldParts[0].equals(context.getString(R.string.stats_custom_layout_coordinates_key))); layout.addField(fieldParts[0], DataField.getTitleByKey(resources, fieldParts[0]), fieldParts[1].equals(DataField.YES_VALUE), fieldParts[2].equals(DataField.YES_VALUE), fieldParts[0].equals(resources.getString(R.string.stats_custom_layout_coordinates_key)));
} }
return layout; return layout;
} }
public static void setCustomLayout(SharedPreferences sharedPreferences, Context context, Layout layout) { public static void setCustomLayout(Layout layout) {
List<DataField> fields = layout.getFields(); List<DataField> fields = layout.getFields();
if (fields.isEmpty()) { if (fields.isEmpty()) {
return; return;
} }
String csv = layout.getProfile() + CsvConstants.LINE_SEPARATOR String csv = layout.getProfile() + CsvConstants.LINE_SEPARATOR
+ fields.stream().map(DataField::toCsv).collect(Collectors.joining(CsvConstants.LINE_SEPARATOR)) + CsvConstants.LINE_SEPARATOR; + fields.stream().map(DataField::toCsv).collect(Collectors.joining(CsvConstants.LINE_SEPARATOR))
setString(sharedPreferences, context, R.string.stats_custom_layout_fields_key, csv); + CsvConstants.LINE_SEPARATOR;
setString(R.string.stats_custom_layout_fields_key, csv);
} }
public static void resetCustomLayoutPreferences(Context context) { public static void resetCustomLayoutPreferences() {
SharedPreferences settings = getSharedPreferences(context); if (sharedPreferences.contains(resources.getString(R.string.stats_custom_layout_fields_key))) {
if (settings.contains(context.getString(R.string.stats_custom_layout_fields_key))) { SharedPreferences.Editor editor = sharedPreferences.edit();
SharedPreferences.Editor editor = settings.edit(); editor.remove(resources.getString(R.string.stats_custom_layout_fields_key));
editor.remove(context.getString(R.string.stats_custom_layout_fields_key));
editor.commit(); editor.commit();
} }
if (settings.contains(context.getString(R.string.stats_custom_layout_columns_key))) { if (sharedPreferences.contains(resources.getString(R.string.stats_custom_layout_columns_key))) {
SharedPreferences.Editor editor = settings.edit(); SharedPreferences.Editor editor = sharedPreferences.edit();
editor.remove(context.getString(R.string.stats_custom_layout_columns_key)); editor.remove(resources.getString(R.string.stats_custom_layout_columns_key));
editor.commit(); editor.commit();
} }
} }
public static void applyNightMode() {
AppCompatDelegate.setDefaultNightMode(PreferencesUtils.getDefaultNightMode());
}
//TODO Check if resetPreferences can be used instead.
@Deprecated
@VisibleForTesting
public static void clear() {
sharedPreferences.edit().clear().commit();
}
} }
@@ -12,11 +12,11 @@ import de.dennisguse.opentracks.content.data.Layout;
public class StatisticsUtils { public class StatisticsUtils {
public static String emptyValue(@NonNull Context context, @NonNull String statTitle) { public static String emptyValue(@NonNull Context context, @NonNull String statTitle) {
if (PreferencesUtils.isKey(context, R.string.stats_custom_layout_total_time_key, statTitle) || PreferencesUtils.isKey(context, R.string.stats_custom_layout_moving_time_key, statTitle) || PreferencesUtils.isKey(context, R.string.stats_custom_layout_pace_key, statTitle) || PreferencesUtils.isKey(context, R.string.stats_custom_layout_average_moving_pace_key, statTitle) || PreferencesUtils.isKey(context, R.string.stats_custom_layout_average_pace_key, statTitle) || PreferencesUtils.isKey(context, R.string.stats_custom_layout_fastest_pace_key, statTitle)) { if (PreferencesUtils.isKey(R.string.stats_custom_layout_total_time_key, statTitle) || PreferencesUtils.isKey(R.string.stats_custom_layout_moving_time_key, statTitle) || PreferencesUtils.isKey(R.string.stats_custom_layout_pace_key, statTitle) || PreferencesUtils.isKey(R.string.stats_custom_layout_average_moving_pace_key, statTitle) || PreferencesUtils.isKey(R.string.stats_custom_layout_average_pace_key, statTitle) || PreferencesUtils.isKey(R.string.stats_custom_layout_fastest_pace_key, statTitle)) {
return context.getString(R.string.stats_empty_value_time); return context.getString(R.string.stats_empty_value_time);
} else if (PreferencesUtils.isKey(context, R.string.stats_custom_layout_distance_key, statTitle) || PreferencesUtils.isKey(context, R.string.stats_custom_layout_speed_key, statTitle) || PreferencesUtils.isKey(context, R.string.stats_custom_layout_average_speed_key, statTitle) || PreferencesUtils.isKey(context, R.string.stats_custom_layout_max_speed_key, statTitle) || PreferencesUtils.isKey(context, R.string.stats_custom_layout_average_moving_speed_key, statTitle)) { } else if (PreferencesUtils.isKey(R.string.stats_custom_layout_distance_key, statTitle) || PreferencesUtils.isKey(R.string.stats_custom_layout_speed_key, statTitle) || PreferencesUtils.isKey(R.string.stats_custom_layout_average_speed_key, statTitle) || PreferencesUtils.isKey(R.string.stats_custom_layout_max_speed_key, statTitle) || PreferencesUtils.isKey(R.string.stats_custom_layout_average_moving_speed_key, statTitle)) {
return context.getString(R.string.stats_empty_value_float); return context.getString(R.string.stats_empty_value_float);
} else if (PreferencesUtils.isKey(context, R.string.stats_custom_layout_coordinates_key, statTitle)) { } else if (PreferencesUtils.isKey(R.string.stats_custom_layout_coordinates_key, statTitle)) {
return context.getString(R.string.stats_empty_value_coordinates); return context.getString(R.string.stats_empty_value_coordinates);
} else { } else {
return context.getString(R.string.stats_empty_value_integer); return context.getString(R.string.stats_empty_value_integer);
@@ -17,6 +17,7 @@
package de.dennisguse.opentracks.util; package de.dennisguse.opentracks.util;
import android.content.Context; import android.content.Context;
import android.content.res.Resources;
import android.util.Pair; import android.util.Pair;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@@ -155,55 +156,56 @@ public class TrackIconUtils {
*/ */
@NonNull @NonNull
public static String getIconValue(Context context, String activityType) { public static String getIconValue(Context context, String activityType) {
Resources resources = context.getResources();
if (activityType == null || activityType.equals("")) { if (activityType == null || activityType.equals("")) {
return UNKNOWN; return UNKNOWN;
} }
if (inList(context, activityType, AIRPLANE_LIST)) { if (inList(resources, activityType, AIRPLANE_LIST)) {
return AIRPLANE; return AIRPLANE;
} }
if (inList(context, activityType, BIKE_LIST)) { if (inList(resources, activityType, BIKE_LIST)) {
return BIKE; return BIKE;
} }
if (inList(context, activityType, MOUNTAIN_BIKE_LIST)) { if (inList(resources, activityType, MOUNTAIN_BIKE_LIST)) {
return MOUNTAIN_BIKE; return MOUNTAIN_BIKE;
} }
if (inList(context, activityType, CLIMBING_LIST)) { if (inList(resources, activityType, CLIMBING_LIST)) {
return CLIMBING; return CLIMBING;
} }
if (inList(context, activityType, MOTOR_BIKE_LIST)) { if (inList(resources, activityType, MOTOR_BIKE_LIST)) {
return MOTOR_BIKE; return MOTOR_BIKE;
} }
if (inList(context, activityType, KAYAKING_LIST)) { if (inList(resources, activityType, KAYAKING_LIST)) {
return KAYAK; return KAYAK;
} }
if (inList(context, activityType, BOAT_LIST)) { if (inList(resources, activityType, BOAT_LIST)) {
return BOAT; return BOAT;
} }
if (inList(context, activityType, SAILING_LIST)) { if (inList(resources, activityType, SAILING_LIST)) {
return SAILING; return SAILING;
} }
if (inList(context, activityType, DRIVE_LIST)) { if (inList(resources, activityType, DRIVE_LIST)) {
return DRIVE; return DRIVE;
} }
if (inList(context, activityType, INLINE_SKATING_LIST)) { if (inList(resources, activityType, INLINE_SKATING_LIST)) {
return INLINE_SKATING; return INLINE_SKATING;
} }
if (inList(context, activityType, ESCOOTER_LIST)) { if (inList(resources, activityType, ESCOOTER_LIST)) {
return ESCOOTER; return ESCOOTER;
} }
if (inList(context, activityType, RUN_LIST)) { if (inList(resources, activityType, RUN_LIST)) {
return RUN; return RUN;
} }
if (inList(context, activityType, SKI_LIST)) { if (inList(resources, activityType, SKI_LIST)) {
return SKI; return SKI;
} }
if (inList(context, activityType, SNOW_BOARDING_LIST)) { if (inList(resources, activityType, SNOW_BOARDING_LIST)) {
return SNOW_BOARDING; return SNOW_BOARDING;
} }
if (inList(context, activityType, SKATE_BOARDING_LIST)) { if (inList(resources, activityType, SKATE_BOARDING_LIST)) {
return SKATE_BOARDING; return SKATE_BOARDING;
} }
if (inList(context, activityType, WALK_LIST)) { if (inList(resources, activityType, WALK_LIST)) {
return WALK; return WALK;
} }
return UNKNOWN; return UNKNOWN;
@@ -216,7 +218,7 @@ public class TrackIconUtils {
* @param activityType the activity type * @param activityType the activity type
* @param list the list * @param list the list
*/ */
private static boolean inList(Context context, String activityType, int[] list) { private static boolean inList(Resources context, String activityType, int[] list) {
for (int i : list) { for (int i : list) {
if (context.getString(i).equals(activityType)) { if (context.getString(i).equals(activityType)) {
return true; return true;
@@ -228,10 +230,9 @@ public class TrackIconUtils {
/** /**
* Returns true if category is in the SPEED_ICON array. Otherwise returns false. * Returns true if category is in the SPEED_ICON array. Otherwise returns false.
* *
* @param context the context.
* @param category the name of the category, activity type. * @param category the name of the category, activity type.
*/ */
public static boolean isSpeedIcon(Context context, String category) { public static boolean isSpeedIcon(Resources resources, String category) {
return inList(context, category, SPEED_ICON); return inList(resources, category, SPEED_ICON);
} }
} }
@@ -43,7 +43,7 @@ public class TrackNameUtils {
//TODO Should not access sharedPreferences; trackName should be an ENUM. //TODO Should not access sharedPreferences; trackName should be an ENUM.
public static String getTrackName(Context context, Track.Id trackId, Instant startTime) { public static String getTrackName(Context context, Track.Id trackId, Instant startTime) {
String trackName = PreferencesUtils.getString(PreferencesUtils.getSharedPreferences(context), context, R.string.track_name_key, context.getString(R.string.track_name_default)); String trackName = PreferencesUtils.getString(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))) { if (trackName.equals(context.getString(R.string.settings_recording_track_name_date_local_value))) {
return StringUtils.formatDateTime(context, startTime); return StringUtils.formatDateTime(context, startTime);
@@ -46,7 +46,7 @@ public class IntervalStatisticsModel extends AndroidViewModel {
public IntervalStatisticsModel(@NonNull Application application) { public IntervalStatisticsModel(@NonNull Application application) {
super(application); super(application);
minGPSDistance = PreferencesUtils.getRecordingDistanceInterval(PreferencesUtils.getSharedPreferences(application), application); minGPSDistance = PreferencesUtils.getRecordingDistanceInterval();
contentResolver = getApplication().getContentResolver(); contentResolver = getApplication().getContentResolver();
handlerThread = new HandlerThread(TAG); handlerThread = new HandlerThread(TAG);
handlerThread.start(); handlerThread.start();