forked from upstream-mirrors/OpenTracks
Merged DataSourceManager into TrackDataHub.
This commit is contained in:
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user