Merged DataSourceManager into TrackDataHub.

This commit is contained in:
Dennis Guse
2020-04-02 19:07:38 +02:00
parent 5581b404f7
commit 6cd27ab096
2 changed files with 47 additions and 149 deletions
@@ -1,109 +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 android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
import android.os.Handler;
import de.dennisguse.opentracks.content.data.TrackPointsColumns;
import de.dennisguse.opentracks.content.data.TracksColumns;
import de.dennisguse.opentracks.content.data.WaypointsColumns;
/**
* Creates observers/listeners and manages their registration.
* The observers/listeners calls {@link DataSourceListener} when data changes.
*
* @author Rodrigo Damazio
*/
class DataSourceManager {
private static final String TAG = DataSourceManager.class.getSimpleName();
private final ContentResolver contentResolver;
// Registered listeners
private final ContentObserver tracksTableObserver;
private final ContentObserver waypointsTableObserver;
private final ContentObserver trackPointsTableObserver;
DataSourceManager(Context context, final DataSourceListener dataSourceListener) {
contentResolver = context.getContentResolver();
Handler handler = new Handler();
tracksTableObserver = new ContentObserver(handler) {
@Override
public void onChange(boolean selfChange) {
dataSourceListener.notifyTracksTableUpdated();
}
};
waypointsTableObserver = new ContentObserver(handler) {
@Override
public void onChange(boolean selfChange) {
dataSourceListener.notifyWaypointsTableUpdated();
}
};
trackPointsTableObserver = new ContentObserver(handler) {
@Override
public void onChange(boolean selfChange) {
dataSourceListener.notifyTrackPointsTableUpdated();
}
};
}
/**
* Registers for content changes.
*/
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);
}
/**
* Unregisters from content changes.
*/
public void stop() {
contentResolver.unregisterContentObserver(tracksTableObserver);
contentResolver.unregisterContentObserver(waypointsTableObserver);
contentResolver.unregisterContentObserver(trackPointsTableObserver);
}
/**
* Listener to be invoked when observed data changes changes.
*
* @author Jimmy Shih
*/
interface DataSourceListener {
/**
* Notifies when the tracks table is updated.
*/
void notifyTracksTableUpdated();
/**
* Notifies when the waypoints table is updated.
*/
void notifyWaypointsTableUpdated();
/**
* Notifies when the track points table is updated.
*/
void notifyTrackPointsTableUpdated();
}
}
@@ -16,8 +16,10 @@
package de.dennisguse.opentracks.content; package de.dennisguse.opentracks.content;
import android.content.ContentResolver;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.database.ContentObserver;
import android.database.Cursor; import android.database.Cursor;
import android.os.Handler; import android.os.Handler;
import android.os.HandlerThread; import android.os.HandlerThread;
@@ -32,18 +34,21 @@ import java.util.Set;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.content.data.Track; import de.dennisguse.opentracks.content.data.Track;
import de.dennisguse.opentracks.content.data.TrackPoint; import de.dennisguse.opentracks.content.data.TrackPoint;
import de.dennisguse.opentracks.content.data.TrackPointsColumns;
import de.dennisguse.opentracks.content.data.TracksColumns;
import de.dennisguse.opentracks.content.data.Waypoint; import de.dennisguse.opentracks.content.data.Waypoint;
import de.dennisguse.opentracks.content.data.WaypointsColumns;
import de.dennisguse.opentracks.content.provider.ContentProviderUtils; import de.dennisguse.opentracks.content.provider.ContentProviderUtils;
import de.dennisguse.opentracks.content.provider.TrackPointIterator; import de.dennisguse.opentracks.content.provider.TrackPointIterator;
import de.dennisguse.opentracks.util.LocationUtils; import de.dennisguse.opentracks.util.LocationUtils;
import de.dennisguse.opentracks.util.PreferencesUtils; import de.dennisguse.opentracks.util.PreferencesUtils;
/** /**
* Track data hub. Receives data from {@link de.dennisguse.opentracks.content.DataSourceManager} and distributes it to {@link TrackDataListener} after some processing. * Track data hub. Receives data from {@link de.dennisguse.opentracks.content.provider.CustomContentProvider} and distributes it to {@link TrackDataListener} after some processing.
* *
* @author Rodrigo Damazio * @author Rodrigo Damazio
*/ */
public class TrackDataHub implements DataSourceManager.DataSourceListener, SharedPreferences.OnSharedPreferenceChangeListener { public class TrackDataHub implements SharedPreferences.OnSharedPreferenceChangeListener {
/** /**
* Target number of track points displayed by the map overlay. * Target number of track points displayed by the map overlay.
@@ -69,7 +74,6 @@ public class TrackDataHub implements DataSourceManager.DataSourceListener, Share
private boolean started; private boolean started;
private HandlerThread handlerThread; private HandlerThread handlerThread;
private Handler handler; private Handler handler;
private DataSourceManager dataSourceManager;
// Preference values // Preference values
private long selectedTrackId; private long selectedTrackId;
@@ -81,6 +85,11 @@ public class TrackDataHub implements DataSourceManager.DataSourceListener, Share
private long firstSeenTrackPointId; private long firstSeenTrackPointId;
private long lastSeenTrackPointId; private long lastSeenTrackPointId;
// Registered listeners
private ContentObserver tracksTableObserver;
private ContentObserver waypointsTableObserver;
private ContentObserver trackPointsTableObserver;
public TrackDataHub(Context context) { public TrackDataHub(Context context) {
this(context, new TrackDataManager(), new ContentProviderUtils(context), TARGET_DISPLAYED_TRACK_POINTS); this(context, new TrackDataManager(), new ContentProviderUtils(context), TARGET_DISPLAYED_TRACK_POINTS);
} }
@@ -103,15 +112,40 @@ public class TrackDataHub implements DataSourceManager.DataSourceListener, Share
handlerThread = new HandlerThread(TAG); handlerThread = new HandlerThread(TAG);
handlerThread.start(); handlerThread.start();
handler = new Handler(handlerThread.getLooper()); handler = new Handler(handlerThread.getLooper());
dataSourceManager = new DataSourceManager(context, this);
//register listeners
ContentResolver contentResolver = context.getContentResolver();
tracksTableObserver = new ContentObserver(handler) {
@Override
public void onChange(boolean selfChange) {
notifyTracksTableUpdate(trackDataManager.getListeners(TrackDataType.TRACKS_TABLE));
}
};
contentResolver.registerContentObserver(TracksColumns.CONTENT_URI, false, tracksTableObserver);
waypointsTableObserver = new ContentObserver(handler) {
@Override
public void onChange(boolean selfChange) {
notifyWaypointsTableUpdate(trackDataManager.getListeners(TrackDataType.WAYPOINTS_TABLE));
}
};
contentResolver.registerContentObserver(WaypointsColumns.CONTENT_URI, false, waypointsTableObserver);
trackPointsTableObserver = new ContentObserver(handler) {
@Override
public void onChange(boolean selfChange) {
notifyTrackPointsTableUpdate(true, trackDataManager.getListeners(TrackDataType.SAMPLED_IN_TRACK_POINTS_TABLE), trackDataManager.getListeners(TrackDataType.SAMPLED_OUT_TRACK_POINTS_TABLE));
}
};
contentResolver.registerContentObserver(TrackPointsColumns.CONTENT_URI_BY_ID, false, trackPointsTableObserver);
PreferencesUtils.register(context, this); PreferencesUtils.register(context, this);
onSharedPreferenceChanged(null, null); onSharedPreferenceChanged(null, null);
runInHandlerThread(new Runnable() { runInHandlerThread(new Runnable() {
@Override @Override
public void run() { public void run() {
if (dataSourceManager != null) { if (started) {
dataSourceManager.start();
loadDataForAll(); loadDataForAll();
} }
} }
@@ -128,13 +162,17 @@ public class TrackDataHub implements DataSourceManager.DataSourceListener, Share
started = false; started = false;
dataSourceManager.stop(); //Unregister listeners
ContentResolver contentResolver = context.getContentResolver();
contentResolver.unregisterContentObserver(tracksTableObserver);
contentResolver.unregisterContentObserver(waypointsTableObserver);
contentResolver.unregisterContentObserver(trackPointsTableObserver);
if (handlerThread != null) { if (handlerThread != null) {
handlerThread.getLooper().quit(); handlerThread.getLooper().quit();
handlerThread = null; handlerThread = null;
} }
handler = null; handler = null;
dataSourceManager = null;
} }
public void loadTrack(final long trackId) { public void loadTrack(final long trackId) {
@@ -162,7 +200,7 @@ public class TrackDataHub implements DataSourceManager.DataSourceListener, Share
@Override @Override
public void run() { public void run() {
trackDataManager.registerListener(trackDataListener, trackDataTypes); trackDataManager.registerListener(trackDataListener, trackDataTypes);
if (dataSourceManager != null) { if (started) {
loadDataForListener(trackDataListener); loadDataForListener(trackDataListener);
} }
} }
@@ -209,37 +247,6 @@ public class TrackDataHub implements DataSourceManager.DataSourceListener, Share
return selectedTrackId == recordingTrackId && recordingTrackPaused; return selectedTrackId == recordingTrackId && recordingTrackPaused;
} }
@Override
public void notifyTracksTableUpdated() {
runInHandlerThread(new Runnable() {
@Override
public void run() {
notifyTracksTableUpdate(trackDataManager.getListeners(TrackDataType.TRACKS_TABLE));
}
});
}
@Override
public void notifyWaypointsTableUpdated() {
runInHandlerThread(new Runnable() {
@Override
public void run() {
notifyWaypointsTableUpdate(trackDataManager.getListeners(TrackDataType.WAYPOINTS_TABLE));
}
});
}
@Override
public void notifyTrackPointsTableUpdated() {
runInHandlerThread(new Runnable() {
@Override
public void run() {
notifyTrackPointsTableUpdate(true, trackDataManager.getListeners(TrackDataType.SAMPLED_IN_TRACK_POINTS_TABLE),
trackDataManager.getListeners(TrackDataType.SAMPLED_OUT_TRACK_POINTS_TABLE));
}
});
}
@Override @Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, final String key) { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, final String key) {
runInHandlerThread(new Runnable() { runInHandlerThread(new Runnable() {