diff --git a/src/main/java/de/dennisguse/opentracks/content/TrackDataHub.java b/src/main/java/de/dennisguse/opentracks/content/TrackDataHub.java index 25e9a9323..fa08848b2 100644 --- a/src/main/java/de/dennisguse/opentracks/content/TrackDataHub.java +++ b/src/main/java/de/dennisguse/opentracks/content/TrackDataHub.java @@ -29,6 +29,7 @@ import androidx.annotation.VisibleForTesting; import java.io.IOException; import java.util.Collections; +import java.util.HashSet; import java.util.Set; import de.dennisguse.opentracks.content.data.Altitude; @@ -71,7 +72,7 @@ public class TrackDataHub { private static final String TAG = TrackDataHub.class.getSimpleName(); private final Context context; - private final TrackDataManager trackDataManager; + private final Set listeners; private final ContentProviderUtils contentProviderUtils; private final int targetNumPoints; @@ -100,13 +101,13 @@ public class TrackDataHub { private ContentObserver trackPointsTableObserver; public TrackDataHub(Context context) { - this(context, new TrackDataManager(), new ContentProviderUtils(context), TARGET_DISPLAYED_TRACKPOINTS); + this(context, new ContentProviderUtils(context), TARGET_DISPLAYED_TRACKPOINTS); } @VisibleForTesting - private TrackDataHub(Context context, TrackDataManager trackDataManager, ContentProviderUtils contentProviderUtils, int targetNumPoints) { + private TrackDataHub(Context context, ContentProviderUtils contentProviderUtils, int targetNumPoints) { this.context = context; - this.trackDataManager = trackDataManager; + this.listeners = new HashSet<>(); this.contentProviderUtils = contentProviderUtils; this.targetNumPoints = targetNumPoints; resetSamplingState(); @@ -127,7 +128,7 @@ public class TrackDataHub { tracksTableObserver = new ContentObserver(handler) { @Override public void onChange(boolean selfChange) { - notifyTracksTableUpdate(trackDataManager.getListenerTracks()); + notifyTracksTableUpdate(listeners); } }; contentResolver.registerContentObserver(TracksColumns.CONTENT_URI, false, tracksTableObserver); @@ -135,7 +136,7 @@ public class TrackDataHub { markersTableObserver = new ContentObserver(handler) { @Override public void onChange(boolean selfChange) { - notifyMarkersTableUpdate(trackDataManager.getListenerMarkers()); + notifyMarkersTableUpdate(listeners); } }; contentResolver.registerContentObserver(MarkerColumns.CONTENT_URI, false, markersTableObserver); @@ -143,7 +144,7 @@ public class TrackDataHub { trackPointsTableObserver = new ContentObserver(handler) { @Override public void onChange(boolean selfChange) { - notifyTrackPointsTableUpdate(true, trackDataManager.getListenerTrackPoints_SampledIn(), trackDataManager.getListenerTrackPoints_SampledOut()); + notifyTrackPointsTableUpdate(true, listeners); } }; contentResolver.registerContentObserver(TrackPointsColumns.CONTENT_URI_BY_ID, false, trackPointsTableObserver); @@ -187,9 +188,9 @@ public class TrackDataHub { * * @param trackDataListener the track data listener */ - public void registerTrackDataListener(final TrackDataListener trackDataListener, final boolean tracksTable, final boolean markersTable, final boolean trackPointsTable_SampleIn, final boolean trackPointsTable_SampleOut) { + public void registerTrackDataListener(final TrackDataListener trackDataListener) { handler.post(() -> { - trackDataManager.registerTrackDataListener(trackDataListener, tracksTable, markersTable, trackPointsTable_SampleIn, trackPointsTable_SampleOut); + listeners.add(trackDataListener); if (started) { loadDataForListener(trackDataListener); } @@ -202,7 +203,7 @@ public class TrackDataHub { * @param trackDataListener the track data listener */ public void unregisterTrackDataListener(final TrackDataListener trackDataListener) { - handler.post(() -> trackDataManager.unregisterTrackDataListener(trackDataListener)); + handler.post(() -> listeners.remove(trackDataListener)); } /** @@ -224,17 +225,17 @@ public class TrackDataHub { */ private void loadDataForAll() { resetSamplingState(); - if (!trackDataManager.hasListeners()) { + if (listeners.isEmpty()) { return; } - notifyTracksTableUpdate(trackDataManager.getListenerTracks()); + notifyTracksTableUpdate(listeners); - for (TrackDataListener listener : trackDataManager.getListenerTrackPoints_SampledIn()) { + for (TrackDataListener listener : listeners) { listener.clearTrackPoints(); } - notifyTrackPointsTableUpdate(true, trackDataManager.getListenerTrackPoints_SampledIn(), trackDataManager.getListenerTrackPoints_SampledOut()); - notifyMarkersTableUpdate(trackDataManager.getListenerMarkers()); + notifyTrackPointsTableUpdate(true, listeners); + notifyMarkersTableUpdate(listeners); } /** @@ -245,25 +246,19 @@ public class TrackDataHub { private void loadDataForListener(TrackDataListener trackDataListener) { Set trackDataListeners = Collections.singleton(trackDataListener); - if (trackDataManager.listensForTracks(trackDataListener)) { - notifyTracksTableUpdate(trackDataListeners); - } + //Track + notifyTracksTableUpdate(trackDataListeners); - boolean hasSampledIn = trackDataManager.listensForTrackPoints_SampledIn(trackDataListener); - boolean hasSampledOut = trackDataManager.listensForTrackPoints_SampledOut(trackDataListener); - if (hasSampledIn || hasSampledOut) { - trackDataListener.clearTrackPoints(); - boolean isOnlyListener = trackDataManager.getNumberOfListeners() == 1; - if (isOnlyListener) { - resetSamplingState(); - } - Set sampledOutListeners = hasSampledOut ? trackDataListeners : Collections.emptySet(); - notifyTrackPointsTableUpdate(isOnlyListener, trackDataListeners, sampledOutListeners); + //TrackPoints + trackDataListener.clearTrackPoints(); + boolean isOnlyListener = listeners.size() == 1; + if (isOnlyListener) { + resetSamplingState(); } + notifyTrackPointsTableUpdate(isOnlyListener, trackDataListeners); - if (trackDataManager.listensForMarkers(trackDataListener)) { - notifyMarkersTableUpdate(trackDataListeners); - } + //Markers + notifyMarkersTableUpdate(trackDataListeners); } /** @@ -316,11 +311,9 @@ public class TrackDataHub { * Notifies track points table update; to be run in the {@link #handler} thread. * * @param updateSamplingState true to update the sampling state - * @param sampledInListeners the sampled-in listeners - * @param sampledOutListeners the sampled-out listeners */ - private void notifyTrackPointsTableUpdate(boolean updateSamplingState, Set sampledInListeners, Set sampledOutListeners) { - if (sampledInListeners.isEmpty() && sampledOutListeners.isEmpty()) { + private void notifyTrackPointsTableUpdate(boolean updateSamplingState, Set listeners) { + if (listeners.isEmpty()) { return; } @@ -328,7 +321,7 @@ public class TrackDataHub { // Reload and resample the track at a lower frequency. Log.i(TAG, "Resampling track after " + numLoadedPoints + " points."); resetSamplingState(); - for (TrackDataListener listener : sampledInListeners) { + for (TrackDataListener listener : listeners) { listener.clearTrackPoints(); } } @@ -384,11 +377,11 @@ public class TrackDataHub { // Also include the last point if the selected track is not recording. if ((localNumLoadedTrackPoints % samplingFrequency == 0) || (trackPointId == lastTrackPointId && !isSelectedTrackRecording())) { - for (TrackDataListener trackDataListener : sampledInListeners) { + for (TrackDataListener trackDataListener : listeners) { trackDataListener.onSampledInTrackPoint(trackPoint, currentUpdater.getTrackStatistics(), currentUpdater.getSmoothedSpeed(), currentUpdater.getSmoothedAltitude()); } } else { - for (TrackDataListener trackDataListener : sampledOutListeners) { + for (TrackDataListener trackDataListener : listeners) { trackDataListener.onSampledOutTrackPoint(trackPoint, currentUpdater.getTrackStatistics()); } } @@ -407,7 +400,7 @@ public class TrackDataHub { lastSeenTrackPointId = localLastSeenTrackPointIdId; } - sampledInListeners.stream().forEach(TrackDataListener::onNewTrackPointsDone); + listeners.stream().forEach(TrackDataListener::onNewTrackPointsDone); } private void correctAltitude(TrackPoint trackPoint) { diff --git a/src/main/java/de/dennisguse/opentracks/content/TrackDataManager.java b/src/main/java/de/dennisguse/opentracks/content/TrackDataManager.java deleted file mode 100644 index 43585a9ca..000000000 --- a/src/main/java/de/dennisguse/opentracks/content/TrackDataManager.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - -package de.dennisguse.opentracks.content; - -import java.util.HashSet; -import java.util.Set; - -/** - * Manages register/unregister {@link TrackDataListener} and keeping the state for each registered listener. - * - * @author Rodrigo Damazio - */ -class TrackDataManager { - - private static final String TAG = TrackDataManager.class.getSimpleName(); - - private final Set dataListenerTracks = new HashSet<>(); - private final Set dataListenerMarkers = new HashSet<>(); - private final Set dataListenerTrackPoints_SampledIn = new HashSet<>(); - private final Set dataListenerTrackPoints_SampledOut = new HashSet<>(); - - void registerTrackDataListener(final TrackDataListener trackDataListener, boolean tracksTable, boolean markersTable, boolean trackPointsTable_SampleIn, boolean trackPointsTable_SampleOut) { - if (tracksTable) dataListenerTracks.add(trackDataListener); - if (markersTable) dataListenerMarkers.add(trackDataListener); - if (trackPointsTable_SampleIn) dataListenerTrackPoints_SampledIn.add(trackDataListener); - if (trackPointsTable_SampleOut) dataListenerTrackPoints_SampledOut.add(trackDataListener); - } - - void unregisterTrackDataListener(TrackDataListener trackDataListener) { - dataListenerTracks.remove(trackDataListener); - dataListenerMarkers.remove(trackDataListener); - dataListenerTrackPoints_SampledIn.remove(trackDataListener); - dataListenerTrackPoints_SampledOut.remove(trackDataListener); - } - - boolean hasListeners() { - return dataListenerTracks.size() + dataListenerMarkers.size() + dataListenerTrackPoints_SampledIn.size() + dataListenerTrackPoints_SampledOut.size() > 0; - } - - int getNumberOfListeners() { - Set listener = new HashSet<>(); - listener.addAll(dataListenerTracks); - listener.addAll(dataListenerMarkers); - listener.addAll(dataListenerTrackPoints_SampledIn); - listener.addAll(dataListenerTrackPoints_SampledOut); - - return listener.size(); - } - - boolean listensForTracks(TrackDataListener listener) { - return dataListenerTracks.contains(listener); - } - - boolean listensForMarkers(TrackDataListener listener) { - return dataListenerMarkers.contains(listener); - } - - boolean listensForTrackPoints_SampledIn(TrackDataListener listener) { - return dataListenerTrackPoints_SampledIn.contains(listener); - } - - boolean listensForTrackPoints_SampledOut(TrackDataListener listener) { - return dataListenerTrackPoints_SampledOut.contains(listener); - } - - Set getListenerTracks() { - return dataListenerTracks; - } - - Set getListenerMarkers() { - return dataListenerMarkers; - } - - Set getListenerTrackPoints_SampledIn() { - return dataListenerTrackPoints_SampledIn; - } - - Set getListenerTrackPoints_SampledOut() { - return dataListenerTrackPoints_SampledOut; - } -} diff --git a/src/main/java/de/dennisguse/opentracks/fragments/ChartFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/ChartFragment.java index 8fe969e41..242d96421 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/ChartFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/ChartFragment.java @@ -250,7 +250,7 @@ public class ChartFragment extends Fragment implements TrackDataListener { */ private synchronized void resumeTrackDataHub() { trackDataHub = ((TrackActivityDataHubInterface) getActivity()).getTrackDataHub(); - trackDataHub.registerTrackDataListener(this, true, true, true, true); + trackDataHub.registerTrackDataListener(this); } /** diff --git a/src/main/java/de/dennisguse/opentracks/fragments/IntervalsFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/IntervalsFragment.java index eb8508121..e2ae77d4b 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/IntervalsFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/IntervalsFragment.java @@ -194,7 +194,7 @@ public class IntervalsFragment extends Fragment implements TrackDataListener { */ private synchronized void resumeTrackDataHub() { trackDataHub = ((TrackActivityDataHubInterface) getActivity()).getTrackDataHub(); - trackDataHub.registerTrackDataListener(this, true, false, true, true); + trackDataHub.registerTrackDataListener(this); } /**