From b4d5eb0eec5e957dc30114ec6e162dfc2eb0ac41 Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Sat, 4 Jan 2020 14:14:50 +0100 Subject: [PATCH] Refactoring: SharedPreferences are not provided via DataSource anymore. --- .../opentracks/MarkerListActivity.java | 5 +- .../de/dennisguse/opentracks/Startup.java | 2 +- .../opentracks/TrackDetailActivity.java | 1 - .../opentracks/TrackListActivity.java | 4 - .../opentracks/content/DataSource.java | 35 ------ .../content/DataSourceListener.java | 7 -- .../opentracks/content/DataSourceManager.java | 28 +---- .../opentracks/content/TrackDataHub.java | 97 ++------------- .../opentracks/content/TrackDataListener.java | 32 ----- .../opentracks/content/TrackDataType.java | 1 - .../opentracks/fragments/ChartFragment.java | 113 ++++++++---------- .../opentracks/fragments/StatsFragment.java | 73 +++++------ .../opentracks/io/file/TrackFileFormat.java | 8 +- .../importer/AbstractFileTrackImporter.java | 3 +- ...ckRecordingServiceNotificationManager.java | 4 +- .../settings/BluetoothLePreference.java | 4 +- .../opentracks/settings/SettingsActivity.java | 4 - .../opentracks/util/IntentUtils.java | 2 +- .../opentracks/util/PreferencesUtils.java | 56 ++++----- 19 files changed, 128 insertions(+), 351 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/MarkerListActivity.java b/src/main/java/de/dennisguse/opentracks/MarkerListActivity.java index 6d87d44b8..867d70713 100644 --- a/src/main/java/de/dennisguse/opentracks/MarkerListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/MarkerListActivity.java @@ -70,10 +70,7 @@ public class MarkerListActivity extends AbstractActivity implements DeleteMarker private long recordingTrackId = PreferencesUtils.RECORDING_TRACK_ID_DEFAULT; private boolean recordingTrackPaused; - /* - * Note that sharedPreferenceChangeListener cannot be an anonymous inner - * class. Anonymous inner class will get garbage collected. - */ + private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { diff --git a/src/main/java/de/dennisguse/opentracks/Startup.java b/src/main/java/de/dennisguse/opentracks/Startup.java index 5476f6d53..1607130b4 100644 --- a/src/main/java/de/dennisguse/opentracks/Startup.java +++ b/src/main/java/de/dennisguse/opentracks/Startup.java @@ -14,7 +14,7 @@ import de.dennisguse.opentracks.util.PreferencesUtils; */ public class Startup extends Application { - private final static String TAG = Startup.class.getSimpleName(); + private static final String TAG = Startup.class.getSimpleName(); @Override public void onCreate() { diff --git a/src/main/java/de/dennisguse/opentracks/TrackDetailActivity.java b/src/main/java/de/dennisguse/opentracks/TrackDetailActivity.java index 8697ce3ef..0c26841ca 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackDetailActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackDetailActivity.java @@ -113,7 +113,6 @@ public class TrackDetailActivity extends AbstractListActivity implements ChooseA } }; - // Note that sharedPreferenceChangeListener cannot be an anonymous inner class. Anonymous inner class will get garbage collected. private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { diff --git a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java index bcae137e1..0bc0f7881 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java @@ -127,10 +127,6 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe private boolean recordingTrackPaused; - /* - * Note that sharedPreferenceChangeListener cannot be an anonymous inner class. - * Anonymous inner class will get garbage collected. - */ private final OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new OnSharedPreferenceChangeListener() { @Override diff --git a/src/main/java/de/dennisguse/opentracks/content/DataSource.java b/src/main/java/de/dennisguse/opentracks/content/DataSource.java index ac1ec0154..65ce6ec3c 100644 --- a/src/main/java/de/dennisguse/opentracks/content/DataSource.java +++ b/src/main/java/de/dennisguse/opentracks/content/DataSource.java @@ -18,13 +18,9 @@ package de.dennisguse.opentracks.content; import android.content.ContentResolver; import android.content.Context; -import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.database.ContentObserver; import android.net.Uri; -import de.dennisguse.opentracks.util.PreferencesUtils; - /** * Data source on the phone. * @@ -33,47 +29,16 @@ import de.dennisguse.opentracks.util.PreferencesUtils; class DataSource { private final ContentResolver contentResolver; - private final SharedPreferences sharedPreferences; DataSource(Context context) { contentResolver = context.getContentResolver(); - sharedPreferences = PreferencesUtils.getSharedPreferences(context); } - /** - * Registers a content observer. - * - * @param uri the uri - * @param observer the observer - */ void registerContentObserver(Uri uri, ContentObserver observer) { contentResolver.registerContentObserver(uri, false, observer); } - /** - * Unregisters a content observer. - * - * @param observer the observer - */ void unregisterContentObserver(ContentObserver observer) { contentResolver.unregisterContentObserver(observer); } - - /** - * Registers a shared preference change listener. - * - * @param listener the listener - */ - void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) { - sharedPreferences.registerOnSharedPreferenceChangeListener(listener); - } - - /** - * Unregisters a shared preference change listener. - * - * @param listener the listener - */ - void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) { - sharedPreferences.unregisterOnSharedPreferenceChangeListener(listener); - } } \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/content/DataSourceListener.java b/src/main/java/de/dennisguse/opentracks/content/DataSourceListener.java index 673d63def..f5ef9a0f6 100644 --- a/src/main/java/de/dennisguse/opentracks/content/DataSourceListener.java +++ b/src/main/java/de/dennisguse/opentracks/content/DataSourceListener.java @@ -38,11 +38,4 @@ public interface DataSourceListener { * Notifies when the track points table is updated. */ void notifyTrackPointsTableUpdated(); - - /** - * Notifies when a preference changes. - * - * @param key the preference key - */ - void notifyPreferenceChanged(String key); } \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/content/DataSourceManager.java b/src/main/java/de/dennisguse/opentracks/content/DataSourceManager.java index ea1f1f4ca..810bf10e8 100644 --- a/src/main/java/de/dennisguse/opentracks/content/DataSourceManager.java +++ b/src/main/java/de/dennisguse/opentracks/content/DataSourceManager.java @@ -16,8 +16,6 @@ package de.dennisguse.opentracks.content; -import android.content.SharedPreferences; -import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.database.ContentObserver; import android.os.Handler; import android.util.Log; @@ -49,7 +47,6 @@ class DataSourceManager { private final TracksTableObserver tracksTableObserver; private final WaypointsTableObserver waypointsTableObserver; private final TrackPointsTableObserver trackPointsTableObserver; - private final PreferenceListener preferenceListener; DataSourceManager(DataSource dataSource, DataSourceListener dataSourceListener) { this.dataSource = dataSource; @@ -59,7 +56,6 @@ class DataSourceManager { tracksTableObserver = new TracksTableObserver(); waypointsTableObserver = new WaypointsTableObserver(); trackPointsTableObserver = new TrackPointsTableObserver(); - preferenceListener = new PreferenceListener(); } /** @@ -70,10 +66,7 @@ class DataSourceManager { void updateListeners(EnumSet listeners) { EnumSet neededListeners = EnumSet.copyOf(listeners); - /* - * Map SAMPLED_OUT_POINT_UPDATES to POINT_UPDATES since they correspond to - * the same internal listener - */ + // Map SAMPLED_OUT_POINT_UPDATES to POINT_UPDATES since they correspond to the same internal listener if (neededListeners.contains(TrackDataType.SAMPLED_OUT_TRACK_POINTS_TABLE)) { neededListeners.remove(TrackDataType.SAMPLED_OUT_TRACK_POINTS_TABLE); neededListeners.add(TrackDataType.SAMPLED_IN_TRACK_POINTS_TABLE); @@ -124,9 +117,6 @@ class DataSourceManager { case SAMPLED_OUT_TRACK_POINTS_TABLE: // Do nothing. SAMPLED_OUT_POINT_UPDATES is mapped to POINT_UPDATES. break; - case PREFERENCE: - dataSource.registerOnSharedPreferenceChangeListener(preferenceListener); - break; default: break; } @@ -151,9 +141,6 @@ class DataSourceManager { case SAMPLED_OUT_TRACK_POINTS_TABLE: // Do nothing. SAMPLED_OUT_POINT_UPDATES is mapped to POINT_UPDATES. break; - case PREFERENCE: - dataSource.unregisterOnSharedPreferenceChangeListener(preferenceListener); - break; default: break; } @@ -218,17 +205,4 @@ class DataSourceManager { dataSourceListener.notifyTrackPointsTableUpdated(); } } - - /** - * Listener for preference changes. - * - * @author Jimmy Shih - */ - private class PreferenceListener implements OnSharedPreferenceChangeListener { - - @Override - public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { - dataSourceListener.notifyPreferenceChanged(key); - } - } } diff --git a/src/main/java/de/dennisguse/opentracks/content/TrackDataHub.java b/src/main/java/de/dennisguse/opentracks/content/TrackDataHub.java index 5f600ddaa..02e68bf09 100644 --- a/src/main/java/de/dennisguse/opentracks/content/TrackDataHub.java +++ b/src/main/java/de/dennisguse/opentracks/content/TrackDataHub.java @@ -17,6 +17,7 @@ package de.dennisguse.opentracks.content; import android.content.Context; +import android.content.SharedPreferences; import android.database.Cursor; import android.location.Location; import android.os.Handler; @@ -43,7 +44,7 @@ import de.dennisguse.opentracks.util.PreferencesUtils; * * @author Rodrigo Damazio */ -public class TrackDataHub implements DataSourceListener { +public class TrackDataHub implements DataSourceListener, SharedPreferences.OnSharedPreferenceChangeListener { /** * Target number of track points displayed by the map overlay. @@ -76,10 +77,6 @@ public class TrackDataHub implements DataSourceListener { private long selectedTrackId; private long recordingTrackId; private boolean recordingTrackPaused; - private boolean metricUnits; - private boolean reportSpeed; - private int recordingGpsAccuracy; - private int recordingDistanceInterval; // Track points sampling state private int numLoadedPoints; @@ -111,7 +108,8 @@ public class TrackDataHub implements DataSourceListener { dataSource = newDataSource(); dataSourceManager = new DataSourceManager(dataSource, this); - notifyPreferenceChanged(null); + PreferencesUtils.register(context, this); + onSharedPreferenceChanged(null, null); runInHandlerThread(new Runnable() { @Override public void run() { @@ -128,6 +126,9 @@ public class TrackDataHub implements DataSourceListener { Log.i(TAG, "TrackDataHub not started, ignoring stop."); return; } + + PreferencesUtils.unregister(context, this); + started = false; dataSourceManager.unregisterAllListeners(); @@ -248,7 +249,7 @@ public class TrackDataHub implements DataSourceListener { } @Override - public void notifyPreferenceChanged(final String key) { + public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, final String key) { runInHandlerThread(new Runnable() { @Override public void run() { @@ -258,46 +259,6 @@ public class TrackDataHub implements DataSourceListener { if (PreferencesUtils.isKey(context, R.string.recording_track_paused_key, key)) { recordingTrackPaused = PreferencesUtils.isRecordingTrackPaused(context); } - if (PreferencesUtils.isKey(context, R.string.stats_units_key, key)) { - metricUnits = PreferencesUtils.isMetricUnits(context); - if (key != null) { - for (TrackDataListener trackDataListener : trackDataManager.getListeners(TrackDataType.PREFERENCE)) { - if (trackDataListener.onMetricUnitsChanged(metricUnits)) { - loadDataForListener(trackDataListener); - } - } - } - } - if (PreferencesUtils.isKey(context, R.string.stats_rate_key, key)) { - reportSpeed = PreferencesUtils.isReportSpeed(context); - if (key != null) { - for (TrackDataListener trackDataListener : trackDataManager.getListeners(TrackDataType.PREFERENCE)) { - if (trackDataListener.onReportSpeedChanged(reportSpeed)) { - loadDataForListener(trackDataListener); - } - } - } - } - if (PreferencesUtils.isKey(context, R.string.recording_gps_accuracy_key, key)) { - recordingGpsAccuracy = PreferencesUtils.getRecordingGPSAccuracy(context); - if (key != null) { - for (TrackDataListener trackDataListener : trackDataManager.getListeners(TrackDataType.PREFERENCE)) { - if (trackDataListener.onRecordingGpsAccuracy(recordingGpsAccuracy)) { - loadDataForListener(trackDataListener); - } - } - } - } - if (PreferencesUtils.isKey(context, R.string.recording_distance_interval_key, key)) { - recordingDistanceInterval = PreferencesUtils.getRecordingDistanceInterval(context); - if (key != null) { - for (TrackDataListener trackDataListener : trackDataManager.getListeners(TrackDataType.PREFERENCE)) { - if (trackDataListener.onRecordingDistanceIntervalChanged(recordingDistanceInterval)) { - loadDataForListener(trackDataListener); - } - } - } - } } }); } @@ -311,13 +272,6 @@ public class TrackDataHub implements DataSourceListener { return; } - for (TrackDataListener trackDataListener : trackDataManager.getListeners(TrackDataType.PREFERENCE)) { - trackDataListener.onMetricUnitsChanged(metricUnits); - trackDataListener.onReportSpeedChanged(reportSpeed); - trackDataListener.onRecordingGpsAccuracy(recordingGpsAccuracy); - trackDataListener.onRecordingDistanceIntervalChanged(recordingDistanceInterval); - } - notifyTracksTableUpdate(trackDataManager.getListeners(TrackDataType.TRACKS_TABLE)); for (TrackDataListener listener : trackDataManager.getListeners(TrackDataType.SAMPLED_IN_TRACK_POINTS_TABLE)) { @@ -338,13 +292,6 @@ public class TrackDataHub implements DataSourceListener { Set trackDataListeners = Collections.singleton(trackDataListener); EnumSet trackDataTypes = trackDataManager.getTrackDataTypes(trackDataListener); - if (trackDataTypes.contains(TrackDataType.PREFERENCE)) { - trackDataListener.onMetricUnitsChanged(metricUnits); - trackDataListener.onReportSpeedChanged(reportSpeed); - trackDataListener.onRecordingGpsAccuracy(recordingGpsAccuracy); - trackDataListener.onRecordingDistanceIntervalChanged(recordingDistanceInterval); - } - if (trackDataTypes.contains(TrackDataType.TRACKS_TABLE)) { notifyTracksTableUpdate(trackDataListeners); } @@ -537,32 +484,4 @@ public class TrackDataHub implements DataSourceListener { public long getSelectedTrackId() { return selectedTrackId; } - - /** - * Gets the recordingGpsAccuracy. - */ - @VisibleForTesting - int getRecordingGpsAccuracy() { - return recordingGpsAccuracy; - } - - /** - * Gets the metricUnits. - * - * @return the metricUnits - */ - @VisibleForTesting - boolean isMetricUnits() { - return metricUnits; - } - - /** - * Gets the reportSpeed. - * - * @return the reportSpeed - */ - @VisibleForTesting - boolean isReportSpeed() { - return reportSpeed; - } } \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/content/TrackDataListener.java b/src/main/java/de/dennisguse/opentracks/content/TrackDataListener.java index 0cb6358cc..a2c6de602 100644 --- a/src/main/java/de/dennisguse/opentracks/content/TrackDataListener.java +++ b/src/main/java/de/dennisguse/opentracks/content/TrackDataListener.java @@ -77,36 +77,4 @@ public interface TrackDataListener { * This gets called after every batch of calls to {@link #clearWaypoints()} and {@link #onNewWaypoint(Waypoint)}. */ void onNewWaypointsDone(); - - /** - * Called when the metric units preference value is change. - * - * @param metricUnits true to use metric units, false to use imperial units - * @return true to reload all the data, false otherwise. - */ - boolean onMetricUnitsChanged(boolean metricUnits); - - /** - * Called when the report speed preference value is changed. - * - * @param reportSpeed true to report speed, false to report pace - * @return true to reload all the data, false otherwise. - */ - boolean onReportSpeedChanged(boolean reportSpeed); - - /** - * Called when the recording gps accuracy preference value is changed. - * - * @param recordingGpsAccuracy the new value - * @return true to reload all the data, false otherwise - */ - boolean onRecordingGpsAccuracy(int recordingGpsAccuracy); - - /** - * Called when the recording distance interval preference value is changed. - * - * @param recordingDistanceInterval the new value - * @return true to reload all the data, false otherwise. - */ - boolean onRecordingDistanceIntervalChanged(int recordingDistanceInterval); } diff --git a/src/main/java/de/dennisguse/opentracks/content/TrackDataType.java b/src/main/java/de/dennisguse/opentracks/content/TrackDataType.java index a239023c9..728a01de4 100644 --- a/src/main/java/de/dennisguse/opentracks/content/TrackDataType.java +++ b/src/main/java/de/dennisguse/opentracks/content/TrackDataType.java @@ -26,5 +26,4 @@ public enum TrackDataType { WAYPOINTS_TABLE, // waypoints table changes SAMPLED_IN_TRACK_POINTS_TABLE, // sampled-in track points table changes SAMPLED_OUT_TRACK_POINTS_TABLE, // sampled-out track points table changes - PREFERENCE // preference changes } \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/fragments/ChartFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/ChartFragment.java index 9b52ea5a3..5100ecf30 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/ChartFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/ChartFragment.java @@ -16,6 +16,7 @@ package de.dennisguse.opentracks.fragments; +import android.content.SharedPreferences; import android.location.Location; import android.os.Bundle; import android.view.LayoutInflater; @@ -78,6 +79,51 @@ public abstract class ChartFragment extends Fragment implements TrackDataListene // UI elements private ChartView chartView; + private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() { + @Override + public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { + if (!isResumed()) { + return; + } + if (PreferencesUtils.isKey(getContext(), R.string.stats_units_key, key)) { + boolean metric = PreferencesUtils.isMetricUnits(getContext()); + if (metricUnits != metric) { + metricUnits = metric; + chartView.setMetricUnits(metricUnits); + runOnUiThread(new Runnable() { + @Override + public void run() { + if (isResumed()) { + chartView.requestLayout(); + } + } + }); + } + } + if (PreferencesUtils.isKey(getContext(), R.string.stats_rate_key, key)) { + boolean speed = PreferencesUtils.isReportSpeed(getContext()); + if (reportSpeed != speed) { + reportSpeed = speed; + chartView.setReportSpeed(reportSpeed); + setSeriesEnabled(ChartView.SPEED_SERIES, reportSpeed); + setSeriesEnabled(ChartView.PACE_SERIES, !reportSpeed); + runOnUiThread(new Runnable() { + @Override + public void run() { + if (isResumed()) { + chartView.requestLayout(); + } + } + }); + } + } + + if (PreferencesUtils.isKey(getContext(), R.string.recording_distance_interval_key, key)) { + recordingDistanceInterval = PreferencesUtils.getRecordingDistanceInterval(getContext()); + } + } + }; + /** * A runnable that will set the orange pointer as appropriate and redraw. */ @@ -124,6 +170,8 @@ public abstract class ChartFragment extends Fragment implements TrackDataListene public void onResume() { super.onResume(); resumeTrackDataHub(); + PreferencesUtils.register(getContext(), sharedPreferenceChangeListener); + checkChartSettings(); getActivity().runOnUiThread(updateChart); } @@ -132,6 +180,7 @@ public abstract class ChartFragment extends Fragment implements TrackDataListene public void onPause() { super.onPause(); pauseTrackDataHub(); + PreferencesUtils.register(getContext(), sharedPreferenceChangeListener); } @Override @@ -229,68 +278,6 @@ public abstract class ChartFragment extends Fragment implements TrackDataListene } } - @Override - public boolean onMetricUnitsChanged(boolean metric) { - if (isResumed()) { - if (metricUnits == metric) { - return false; - } - metricUnits = metric; - chartView.setMetricUnits(metricUnits); - runOnUiThread(new Runnable() { - @Override - public void run() { - if (isResumed()) { - chartView.requestLayout(); - } - } - }); - return true; - } - return false; - } - - @Override - public boolean onReportSpeedChanged(boolean speed) { - if (isResumed()) { - if (reportSpeed == speed) { - return false; - } - reportSpeed = speed; - chartView.setReportSpeed(reportSpeed); - setSeriesEnabled(ChartView.SPEED_SERIES, reportSpeed); - setSeriesEnabled(ChartView.PACE_SERIES, !reportSpeed); - runOnUiThread(new Runnable() { - @Override - public void run() { - if (isResumed()) { - chartView.requestLayout(); - } - } - }); - return true; - } - return false; - } - - @Override - public boolean onRecordingGpsAccuracy(int minRequiredAccuracy) { - // We don't care. - return false; - } - - @Override - public boolean onRecordingDistanceIntervalChanged(int value) { - if (isResumed()) { - if (recordingDistanceInterval == value) { - return false; - } - recordingDistanceInterval = value; - return true; - } - return false; - } - /** * Checks the chart settings. */ @@ -334,7 +321,7 @@ public abstract class ChartFragment extends Fragment implements TrackDataListene trackDataHub = ((TrackDetailActivity) getActivity()).getTrackDataHub(); trackDataHub.registerTrackDataListener(this, EnumSet.of(TrackDataType.TRACKS_TABLE, TrackDataType.WAYPOINTS_TABLE, TrackDataType.SAMPLED_IN_TRACK_POINTS_TABLE, - TrackDataType.SAMPLED_OUT_TRACK_POINTS_TABLE, TrackDataType.PREFERENCE)); + TrackDataType.SAMPLED_OUT_TRACK_POINTS_TABLE)); } /** diff --git a/src/main/java/de/dennisguse/opentracks/fragments/StatsFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/StatsFragment.java index cc4d61b7f..f0a3cb072 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/StatsFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/StatsFragment.java @@ -16,6 +16,7 @@ package de.dennisguse.opentracks.fragments; +import android.content.SharedPreferences; import android.location.Location; import android.os.Bundle; import android.os.Handler; @@ -61,7 +62,7 @@ import de.dennisguse.opentracks.util.UnitConversions; */ public class StatsFragment extends Fragment implements TrackDataListener { - public static final String STATS_FRAGMENT_TAG = StatsFragment.class.getSimpleName(); + private static final String STATS_FRAGMENT_TAG = StatsFragment.class.getSimpleName(); private static final long UI_UPDATE_INTERVAL = UnitConversions.ONE_SECOND; @@ -75,8 +76,30 @@ public class StatsFragment extends Fragment implements TrackDataListener { private TripStatistics lastTripStatistics = null; private String category = ""; + @Deprecated //TODO This should be handled somewhere else; not in the UI. private int recordingGpsAccuracy; + private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() { + @Override + public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { + if (PreferencesUtils.isKey(getContext(), R.string.stats_units_key, key) || PreferencesUtils.isKey(getContext(), R.string.stats_rate_key, key)) { + if (isResumed()) { + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + if (isResumed()) { + updateUI(); + } + } + }); + } + } + if (PreferencesUtils.isKey(getContext(), R.string.recording_track_id_key, key)) { + recordingGpsAccuracy = PreferencesUtils.getRecordingGPSAccuracy(getContext()); + } + } + }; + @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.stats, container, false); @@ -221,6 +244,7 @@ public class StatsFragment extends Fragment implements TrackDataListener { public void onResume() { super.onResume(); resumeTrackDataHub(); + PreferencesUtils.register(getContext(), sharedPreferenceChangeListener); trackRecordingServiceConnection = new TrackRecordingServiceConnection(getContext(), null); trackRecordingServiceConnection.startConnection(getContext()); @@ -232,6 +256,8 @@ public class StatsFragment extends Fragment implements TrackDataListener { public void onPause() { super.onPause(); pauseTrackDataHub(); + PreferencesUtils.unregister(getContext(), sharedPreferenceChangeListener); + handlerUpdateUI.removeCallbacks(updateUIeachSecond); } @@ -370,48 +396,6 @@ public class StatsFragment extends Fragment implements TrackDataListener { // We don't care. } - @Override - public boolean onMetricUnitsChanged(final boolean metric) { - if (isResumed()) { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - if (isResumed()) { - updateUI(); - } - } - }); - } - return true; - } - - @Override - public boolean onReportSpeedChanged(final boolean speed) { - if (isResumed()) { - getActivity().runOnUiThread(new Runnable() { - @Override - public void run() { - if (isResumed()) { - updateUI(); - } - } - }); - } - return true; - } - - @Override - public boolean onRecordingGpsAccuracy(int newValue) { - recordingGpsAccuracy = newValue; - return false; - } - - @Override - public boolean onRecordingDistanceIntervalChanged(int minRecordingDistance) { - // We don't care. - return false; - } - /** * Resumes the trackDataHub. * Needs to be synchronized because trackDataHub can be accessed by multiple threads. @@ -419,8 +403,7 @@ public class StatsFragment extends Fragment implements TrackDataListener { private synchronized void resumeTrackDataHub() { trackDataHub = ((TrackDetailActivity) getActivity()).getTrackDataHub(); trackDataHub.registerTrackDataListener(this, EnumSet.of(TrackDataType.TRACKS_TABLE, - TrackDataType.SAMPLED_IN_TRACK_POINTS_TABLE, TrackDataType.SAMPLED_OUT_TRACK_POINTS_TABLE, - TrackDataType.PREFERENCE)); + TrackDataType.SAMPLED_IN_TRACK_POINTS_TABLE, TrackDataType.SAMPLED_OUT_TRACK_POINTS_TABLE)); } /** diff --git a/src/main/java/de/dennisguse/opentracks/io/file/TrackFileFormat.java b/src/main/java/de/dennisguse/opentracks/io/file/TrackFileFormat.java index 78a783145..83a2ddaab 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/TrackFileFormat.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/TrackFileFormat.java @@ -67,7 +67,7 @@ public enum TrackFileFormat { }, KMZ_ONLY_TRACK { - private final static boolean exportPhotos = false; + private static final boolean exportPhotos = false; @Override public TrackWriter newTrackWriter(Context context, boolean multiple) { @@ -94,7 +94,7 @@ public enum TrackFileFormat { }, KMZ_WITH_TRACKDETAIL { - private final static boolean exportPhotos = false; + private static final boolean exportPhotos = false; @Override public TrackWriter newTrackWriter(Context context, boolean multiple) { @@ -122,7 +122,7 @@ public enum TrackFileFormat { }, KMZ_WITH_TRACKDETAIL_AND_SENSORDATA { - private final static boolean exportPhotos = false; + private static final boolean exportPhotos = false; @Override public TrackWriter newTrackWriter(Context context, boolean multiple) { @@ -151,7 +151,7 @@ public enum TrackFileFormat { }, KMZ_WITH_TRACKDETAIL_AND_SENSORDATA_AND_PICTURES { - private final static boolean exportPhotos = true; + private static final boolean exportPhotos = true; @Override public TrackWriter newTrackWriter(Context context, boolean multiple) { diff --git a/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java b/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java index 8759f8534..df884ad77 100644 --- a/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java +++ b/src/main/java/de/dennisguse/opentracks/io/file/importer/AbstractFileTrackImporter.java @@ -160,7 +160,8 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track Waypoint waypoint = null; Location location = null; TripStatisticsUpdater trackTripStatisticstrackUpdater = new TripStatisticsUpdater(track.getTripStatistics().getStartTime()); - TripStatisticsUpdater markerTripStatisticsUpdater = new TripStatisticsUpdater(track.getTripStatistics().getStartTime()); + @Deprecated // TODO Should not be necessary anymore? + TripStatisticsUpdater markerTripStatisticsUpdater = new TripStatisticsUpdater(track.getTripStatistics().getStartTime()); try (TrackPointIterator locationIterator = contentProviderUtils.getTrackPointLocationIterator(track.getId(), -1L, false, TrackPointFactory.DEFAULT_LOCATION_FACTORY)) { diff --git a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java index 52e5d92bc..ece482af6 100644 --- a/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java +++ b/src/main/java/de/dennisguse/opentracks/services/TrackRecordingServiceNotificationManager.java @@ -20,9 +20,9 @@ import de.dennisguse.opentracks.util.StringUtils; */ class TrackRecordingServiceNotificationManager { - private final static int NOTIFICATION_ID = 123; + private static final int NOTIFICATION_ID = 123; - private final static String CHANNEL_ID = TrackRecordingServiceNotificationManager.class.getSimpleName(); + private static final String CHANNEL_ID = TrackRecordingServiceNotificationManager.class.getSimpleName(); private final NotificationCompat.Builder notificationBuilder; diff --git a/src/main/java/de/dennisguse/opentracks/settings/BluetoothLePreference.java b/src/main/java/de/dennisguse/opentracks/settings/BluetoothLePreference.java index ea7aad051..4f8468408 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/BluetoothLePreference.java +++ b/src/main/java/de/dennisguse/opentracks/settings/BluetoothLePreference.java @@ -32,9 +32,9 @@ import de.dennisguse.opentracks.util.PreferencesUtils; */ public class BluetoothLePreference extends DialogPreference { - private final static String TAG = BluetoothLePreference.class.getSimpleName(); + private static final String TAG = BluetoothLePreference.class.getSimpleName(); - private final static int DEVICE_NONE_RESOURCEID = R.string.value_none; + private static final int DEVICE_NONE_RESOURCEID = R.string.value_none; public BluetoothLePreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); diff --git a/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java b/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java index 6d5af78bd..e904e5f1c 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java +++ b/src/main/java/de/dennisguse/opentracks/settings/SettingsActivity.java @@ -50,10 +50,6 @@ public class SettingsActivity extends AppCompatActivity implements ChooseActivit public static class PrefsFragment extends PreferenceFragmentCompat { - /* - * Note that sharedPreferenceChangeListener cannot be an anonymous inner class. - * Anonymous inner class will get garbage collected. - */ private final SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { diff --git a/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java b/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java index 60454c08a..009da1cec 100644 --- a/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/IntentUtils.java @@ -48,7 +48,7 @@ import de.dennisguse.opentracks.io.file.TrackFileFormat; */ public class IntentUtils { - private final static String TAG = IntentUtils.class.getSimpleName(); + private static final String TAG = IntentUtils.class.getSimpleName(); private static final String JPEG_EXTENSION = "jpeg"; diff --git a/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java b/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java index 15ec376ab..e7583e282 100644 --- a/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/PreferencesUtils.java @@ -39,21 +39,30 @@ public class PreferencesUtils { return PreferenceManager.getDefaultSharedPreferences(context); } + public static void register(Context context, SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener) { + getSharedPreferences(context).registerOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); + } + + public static void unregister(Context context, SharedPreferences.OnSharedPreferenceChangeListener sharedPreferenceChangeListener) { + getSharedPreferences(context).unregisterOnSharedPreferenceChangeListener(sharedPreferenceChangeListener); + } + @Deprecated //NOTE: is at the moment still used to determine if a track is currently recorded; better ask the service directly. //NOTE: This was also used to recover from a reboot, but this data should not be exposed to the whole application. public static final long RECORDING_TRACK_ID_DEFAULT = -1L; public static long getRecordingTrackId(Context context) { - return PreferencesUtils.getLong(context); + SharedPreferences sharedPreferences = getSharedPreferences(context); + return sharedPreferences.getLong(getKey(context, R.string.recording_track_id_key), RECORDING_TRACK_ID_DEFAULT); } public static String getDefaultActivity(Context context) { - return PreferencesUtils.getString(context, R.string.default_activity_key, context.getString(R.string.default_activity_default)); + return getString(context, R.string.default_activity_key, context.getString(R.string.default_activity_default)); } public static void setDefaultActivity(Context context, String newDefaultActivity) { - PreferencesUtils.setString(context, R.string.default_activity_key, newDefaultActivity); + setString(context, R.string.default_activity_key, newDefaultActivity); } /** @@ -74,7 +83,7 @@ public class PreferencesUtils { * @return true if key == null or key belongs to keyId */ public static boolean isKey(Context context, int keyId, String key) { - return key == null || key.equals(PreferencesUtils.getKey(context, keyId)); + return key == null || key.equals(getKey(context, keyId)); } /** @@ -143,16 +152,6 @@ public class PreferencesUtils { editor.apply(); } - /** - * Gets a long preference value. - * @param context the context - * - */ - private static long getLong(Context context) { - SharedPreferences sharedPreferences = getSharedPreferences(context); - return sharedPreferences.getLong(getKey(context, R.string.recording_track_id_key), PreferencesUtils.RECORDING_TRACK_ID_DEFAULT); - } - /** * Sets a long preference value. * @@ -204,7 +203,7 @@ public class PreferencesUtils { } public static boolean isRecordingTrackPaused(Context context) { - return PreferencesUtils.getBoolean(context, R.string.recording_track_paused_key, isRecordingTrackPausedDefault(context)); + return getBoolean(context, R.string.recording_track_paused_key, isRecordingTrackPausedDefault(context)); } public static boolean isRecordingTrackPausedDefault(Context context) { @@ -213,7 +212,7 @@ public class PreferencesUtils { public static void defaultRecordingTrackPaused(Context context) { final boolean RECORDING_TRACK_PAUSED = context.getResources().getBoolean(R.bool.recording_track_paused_default); - PreferencesUtils.setBoolean(context, R.string.recording_track_paused_key, RECORDING_TRACK_PAUSED); + setBoolean(context, R.string.recording_track_paused_key, RECORDING_TRACK_PAUSED); } public static String getBluetoothHeartRateSensorAddressNone(Context context) { @@ -229,7 +228,7 @@ public class PreferencesUtils { } public static String getBluetoothHeartRateSensorAddress(Context context) { - return PreferencesUtils.getString(context, R.string.settings_sensor_bluetooth_heart_rate_key, getBluetoothHeartRateSensorAddressNone(context)); + return getString(context, R.string.settings_sensor_bluetooth_heart_rate_key, getBluetoothHeartRateSensorAddressNone(context)); } public static boolean shouldShowStatsOnLockscreen(Context context) { @@ -244,21 +243,21 @@ public class PreferencesUtils { public static boolean isShowStatsGradeElevation(Context context) { final boolean STATS_SHOW_GRADE_ELEVATION = context.getResources().getBoolean(R.bool.stats_show_grade_elevation_default); - return PreferencesUtils.getBoolean(context, R.string.stats_show_grade_elevation_key, STATS_SHOW_GRADE_ELEVATION); + return getBoolean(context, R.string.stats_show_grade_elevation_key, STATS_SHOW_GRADE_ELEVATION); } public static boolean isStatsShowCoordinate(Context context) { final boolean STATS_SHOW_COORDINATE = context.getResources().getBoolean(R.bool.stats_show_coordinate_default); - return PreferencesUtils.getBoolean(context, R.string.stats_show_coordinate_key, STATS_SHOW_COORDINATE); + return getBoolean(context, R.string.stats_show_coordinate_key, STATS_SHOW_COORDINATE); } public static int getVoiceFrequency(Context context) { final int VOICE_FREQUENCY_DEFAULT = Integer.parseInt(context.getResources().getString(R.string.voice_frequency_default)); - return PreferencesUtils.getInt(context, R.string.voice_frequency_key, VOICE_FREQUENCY_DEFAULT); + return getInt(context, R.string.voice_frequency_key, VOICE_FREQUENCY_DEFAULT); } public static int getRecordingDistanceInterval(Context context) { - return PreferencesUtils.getInt(context, R.string.recording_distance_interval_key, getRecordingDistanceIntervalDefault(context)); + return getInt(context, R.string.recording_distance_interval_key, getRecordingDistanceIntervalDefault(context)); } public static int getRecordingDistanceIntervalDefault(Context context) { @@ -267,12 +266,12 @@ public class PreferencesUtils { public static int getMaxRecordingDistance(Context context) { final int MAX_RECORDING_DISTANCE = Integer.parseInt(context.getResources().getString(R.string.max_recording_distance_default)); - return PreferencesUtils.getInt(context, R.string.max_recording_distance_key, MAX_RECORDING_DISTANCE); + return getInt(context, R.string.max_recording_distance_key, MAX_RECORDING_DISTANCE); } public static int getMinRecordingInterval(Context context) { final int MIN_RECORDING_INTERVAL = Integer.parseInt(context.getResources().getString(R.string.min_recording_interval_default)); - return PreferencesUtils.getInt(context, R.string.min_recording_interval_key, MIN_RECORDING_INTERVAL); + return getInt(context, R.string.min_recording_interval_key, MIN_RECORDING_INTERVAL); } public static int getMinRecordingIntervalAdaptAccuracy(Context context) { @@ -287,19 +286,20 @@ public class PreferencesUtils { return Integer.parseInt(context.getResources().getString(R.string.min_recording_interval_default)); } - public static int getRecordingGPSAccuracy(Context context) { final int RECORDING_GPS_ACCURACY = Integer.parseInt(context.getResources().getString(R.string.recording_gps_accuracy_default)); - return PreferencesUtils.getInt(context, R.string.recording_gps_accuracy_key, RECORDING_GPS_ACCURACY); + return getInt(context, R.string.recording_gps_accuracy_key, RECORDING_GPS_ACCURACY); } public static boolean isRecording(Context context) { - long recordingTrackId = PreferencesUtils.getRecordingTrackId(context); - return recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT; + long recordingTrackId = getRecordingTrackId(context); + return isRecording(recordingTrackId); } + @Deprecated + //TODO Method is very misleading: it only checks if the provided trackId not the default value (i.e., not recording). public static boolean isRecording(long recordingTrackId) { - return recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT; + return recordingTrackId != RECORDING_TRACK_ID_DEFAULT; } public static void resetPreferences(Context context, boolean readAgain) {