From 5581b404f7e80947e00a86f6026778c565081f0f Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Thu, 2 Apr 2020 18:44:23 +0200 Subject: [PATCH] DataSourceManager now always registers for all changes. --- .../opentracks/content/DataSourceManager.java | 105 ++---------------- .../opentracks/content/TrackDataHub.java | 13 +-- 2 files changed, 16 insertions(+), 102 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/content/DataSourceManager.java b/src/main/java/de/dennisguse/opentracks/content/DataSourceManager.java index c3767c1d8..863650cc3 100644 --- a/src/main/java/de/dennisguse/opentracks/content/DataSourceManager.java +++ b/src/main/java/de/dennisguse/opentracks/content/DataSourceManager.java @@ -20,10 +20,6 @@ import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; import android.os.Handler; -import android.util.Log; - -import java.util.EnumSet; -import java.util.Set; import de.dennisguse.opentracks.content.data.TrackPointsColumns; import de.dennisguse.opentracks.content.data.TracksColumns; @@ -42,7 +38,6 @@ class DataSourceManager { private final ContentResolver contentResolver; // Registered listeners - private final Set registeredListeners = EnumSet.noneOf(TrackDataType.class); private final ContentObserver tracksTableObserver; private final ContentObserver waypointsTableObserver; private final ContentObserver trackPointsTableObserver; @@ -72,99 +67,21 @@ class DataSourceManager { } /** - * Updates listeners with data source. - * - * @param listeners the listeners + * Registers for content changes. */ - 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 - 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); - } - - Log.d(TAG, "Updating listeners " + neededListeners); - - // Unnecessary = registered - needed - Set unnecessaryListeners = EnumSet.copyOf(registeredListeners); - unnecessaryListeners.removeAll(neededListeners); - - // Missing = needed - registered - Set missingListeners = EnumSet.copyOf(neededListeners); - missingListeners.removeAll(registeredListeners); - - // Remove unnecessary listeners - for (TrackDataType trackDataType : unnecessaryListeners) { - unregisterListener(trackDataType); - } - - // Add missing listeners - for (TrackDataType trackDataType : missingListeners) { - registerListener(trackDataType); - } - - // Update registered listeners - registeredListeners.clear(); - registeredListeners.addAll(neededListeners); + public void start() { + contentResolver.registerContentObserver(TracksColumns.CONTENT_URI, false, tracksTableObserver); + contentResolver.registerContentObserver(WaypointsColumns.CONTENT_URI, false, waypointsTableObserver); + contentResolver.registerContentObserver(TrackPointsColumns.CONTENT_URI_BY_ID, false, trackPointsTableObserver); } /** - * Registers a listener with data source. - * - * @param trackDataType the listener data type + * Unregisters from content changes. */ - private void registerListener(TrackDataType trackDataType) { - switch (trackDataType) { - case TRACKS_TABLE: - contentResolver.registerContentObserver(TracksColumns.CONTENT_URI, false, tracksTableObserver); - break; - case WAYPOINTS_TABLE: - contentResolver.registerContentObserver(WaypointsColumns.CONTENT_URI, false, waypointsTableObserver); - break; - case SAMPLED_IN_TRACK_POINTS_TABLE: - contentResolver.registerContentObserver(TrackPointsColumns.CONTENT_URI_BY_ID, false, trackPointsTableObserver); - break; - case SAMPLED_OUT_TRACK_POINTS_TABLE: - // Do nothing. SAMPLED_OUT_POINT_UPDATES is mapped to POINT_UPDATES. - break; - default: - break; - } - } - - /** - * Unregisters a listener with data source. - * - * @param trackDataType listener data type - */ - private void unregisterListener(TrackDataType trackDataType) { - switch (trackDataType) { - case TRACKS_TABLE: - contentResolver.unregisterContentObserver(tracksTableObserver); - break; - case WAYPOINTS_TABLE: - contentResolver.unregisterContentObserver(waypointsTableObserver); - break; - case SAMPLED_IN_TRACK_POINTS_TABLE: - contentResolver.unregisterContentObserver(trackPointsTableObserver); - break; - case SAMPLED_OUT_TRACK_POINTS_TABLE: - // Do nothing. SAMPLED_OUT_POINT_UPDATES is mapped to POINT_UPDATES. - break; - default: - break; - } - } - - /** - * Unregisters all listeners with data source. - */ - void unregisterAllListeners() { - for (TrackDataType trackDataType : TrackDataType.values()) { - unregisterListener(trackDataType); - } + public void stop() { + contentResolver.unregisterContentObserver(tracksTableObserver); + contentResolver.unregisterContentObserver(waypointsTableObserver); + contentResolver.unregisterContentObserver(trackPointsTableObserver); } /** @@ -172,7 +89,7 @@ class DataSourceManager { * * @author Jimmy Shih */ - public interface DataSourceListener { + interface DataSourceListener { /** * Notifies when the tracks table is updated. diff --git a/src/main/java/de/dennisguse/opentracks/content/TrackDataHub.java b/src/main/java/de/dennisguse/opentracks/content/TrackDataHub.java index e103d2db8..8290a25b2 100644 --- a/src/main/java/de/dennisguse/opentracks/content/TrackDataHub.java +++ b/src/main/java/de/dennisguse/opentracks/content/TrackDataHub.java @@ -39,7 +39,7 @@ import de.dennisguse.opentracks.util.LocationUtils; import de.dennisguse.opentracks.util.PreferencesUtils; /** - * Track data hub. Receives data from {@link de.dennisguse.opentracks.content.DataSourceManager.DataSource} and distributes it to {@link TrackDataListener} after some processing. + * Track data hub. Receives data from {@link de.dennisguse.opentracks.content.DataSourceManager} and distributes it to {@link TrackDataListener} after some processing. * * @author Rodrigo Damazio */ @@ -100,7 +100,7 @@ public class TrackDataHub implements DataSourceManager.DataSourceListener, Share return; } started = true; - handlerThread = new HandlerThread("TrackDataHubHandlerThread"); + handlerThread = new HandlerThread(TAG); handlerThread.start(); handler = new Handler(handlerThread.getLooper()); dataSourceManager = new DataSourceManager(context, this); @@ -111,7 +111,7 @@ public class TrackDataHub implements DataSourceManager.DataSourceListener, Share @Override public void run() { if (dataSourceManager != null) { - dataSourceManager.updateListeners(trackDataManager.getRegisteredTrackDataTypes()); + dataSourceManager.start(); loadDataForAll(); } } @@ -128,7 +128,7 @@ public class TrackDataHub implements DataSourceManager.DataSourceListener, Share started = false; - dataSourceManager.unregisterAllListeners(); + dataSourceManager.stop(); if (handlerThread != null) { handlerThread.getLooper().quit(); handlerThread = null; @@ -163,7 +163,6 @@ public class TrackDataHub implements DataSourceManager.DataSourceListener, Share public void run() { trackDataManager.registerListener(trackDataListener, trackDataTypes); if (dataSourceManager != null) { - dataSourceManager.updateListeners(trackDataManager.getRegisteredTrackDataTypes()); loadDataForListener(trackDataListener); } } @@ -180,9 +179,6 @@ public class TrackDataHub implements DataSourceManager.DataSourceListener, Share @Override public void run() { trackDataManager.unregisterListener(trackDataListener); - if (dataSourceManager != null) { - dataSourceManager.updateListeners(trackDataManager.getRegisteredTrackDataTypes()); - } } }); } @@ -454,6 +450,7 @@ public class TrackDataHub implements DataSourceManager.DataSourceListener, Share * * @param runnable the runnable */ + @Deprecated //TODO: Why actually catch this problem: I guess it would be better to fail hard. @VisibleForTesting private void runInHandlerThread(Runnable runnable) { if (handler == null) {