diff --git a/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataHub.java b/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataHub.java index c1481cf5e..f0a0e9522 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataHub.java +++ b/MyTracks/src/com/google/android/apps/mytracks/content/TrackDataHub.java @@ -158,10 +158,10 @@ public class TrackDataHub { private final TrackDataListeners listeners; /** Wrapper for interacting with system data managers. */ - private final DataSourcesWrapper dataSources; + private DataSourcesWrapper dataSources; /** Manager for system data listener registrations. */ - private final DataSourceManager dataSourceManager; + private DataSourceManager dataSourceManager; /** Condensed listener for system data listener events. */ private final DataSourceListener dataSourceListener = new HubDataSourceListener(); @@ -206,7 +206,6 @@ public class TrackDataHub { SharedPreferences preferences = context.getSharedPreferences(Constants.SETTINGS_NAME, 0); MyTracksProviderUtils providerUtils = MyTracksProviderUtils.Factory.get(context); instance = new TrackDataHub(context, - new DataSourcesWrapperImpl(context, preferences), new TrackDataListeners(), preferences, providerUtils, TARGET_DISPLAYED_TRACK_POINTS); @@ -217,15 +216,13 @@ public class TrackDataHub { * Injection constructor. */ // @VisibleForTesting - TrackDataHub(Context ctx, DataSourcesWrapper dataSources, TrackDataListeners listeners, - SharedPreferences preferences, MyTracksProviderUtils providerUtils, int targetNumPoints) { + TrackDataHub(Context ctx, TrackDataListeners listeners, SharedPreferences preferences, + MyTracksProviderUtils providerUtils, int targetNumPoints) { this.context = ctx; this.listeners = listeners; this.preferences = preferences; this.providerUtils = providerUtils; - this.dataSources = dataSources; this.targetNumPoints = targetNumPoints; - this.dataSourceManager = new DataSourceManager(dataSourceListener, dataSources); this.locationFactory = new DoubleBufferedLocationFactory(); SELECTED_TRACK_KEY = context.getString(R.string.selected_track_key); @@ -252,6 +249,8 @@ public class TrackDataHub { listenerHandlerThread = new HandlerThread("trackDataContentThread"); listenerHandlerThread.start(); listenerHandler = new Handler(listenerHandlerThread.getLooper()); + dataSources = newDataSources(); + dataSourceManager = new DataSourceManager(dataSourceListener, dataSources); // This may or may not register internal listeners, depending on whether // we already had external listeners. @@ -262,6 +261,11 @@ public class TrackDataHub { loadDataForAllListeners(); } + // @VisibleForTesting + protected DataSourcesWrapper newDataSources() { + return new DataSourcesWrapperImpl(context, preferences); + } + /** * Stops listening to data sources and reporting the data to external * listeners. @@ -275,10 +279,12 @@ public class TrackDataHub { // Unregister internal listeners even if there are external listeners registered. dataSourceManager.unregisterAllListeners(); + listenerHandlerThread.getLooper().quit(); started = false; - listenerHandlerThread.getLooper().quit(); + dataSources = null; + dataSourceManager = null; listenerHandlerThread = null; listenerHandler = null; } diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/content/TrackDataHubTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/content/TrackDataHubTest.java index fcf758ac6..ce77bb917 100644 --- a/MyTracksTest/src/com/google/android/apps/mytracks/content/TrackDataHubTest.java +++ b/MyTracksTest/src/com/google/android/apps/mytracks/content/TrackDataHubTest.java @@ -91,7 +91,12 @@ public class TrackDataHubTest extends AndroidTestCase { dataSources = AndroidMock.createNiceMock("dataSources", DataSourcesWrapper.class); listeners = new TrackDataListeners(); - hub = new TrackDataHub(context, dataSources, listeners, prefs, providerUtils, TARGET_POINTS) { + hub = new TrackDataHub(context, listeners, prefs, providerUtils, TARGET_POINTS) { + @Override + protected DataSourcesWrapper newDataSources() { + return dataSources; + } + @Override protected void runInListenerThread(Runnable runnable) { // Run everything in the same thread.