Refactoring to marker: content-package and fragments.

#389
This commit is contained in:
Dennis Guse
2020-09-05 10:37:41 +02:00
parent 19d8563a76
commit 9d6c9676ab
14 changed files with 150 additions and 147 deletions
@@ -278,7 +278,7 @@ public class SearchEngineTest {
private void assertTrackResult(Track.Id trackId, ScoredResult result) { private void assertTrackResult(Track.Id trackId, ScoredResult result) {
assertNotNull("Not a track", result.track); assertNotNull("Not a track", result.track);
assertNull("Ambiguous result", result.waypoint); assertNull("Ambiguous result", result.marker);
assertEquals(trackId, result.track.getId()); assertEquals(trackId, result.track.getId());
} }
@@ -293,15 +293,15 @@ public class SearchEngineTest {
for (int i = 0; i < results.size(); i++) { for (int i = 0; i < results.size(); i++) {
ScoredResult result = results.get(i); ScoredResult result = results.get(i);
assertNotNull(errMsg, result.track); assertNotNull(errMsg, result.track);
assertNull(errMsg, result.waypoint); assertNull(errMsg, result.marker);
assertEquals(errMsg, trackIds[i], result.track.getId()); assertEquals(errMsg, trackIds[i], result.track.getId());
} }
} }
private void assertWaypointResult(Marker.Id waypointId, ScoredResult result) { private void assertWaypointResult(Marker.Id waypointId, ScoredResult result) {
assertNotNull("Not a waypoint", result.waypoint); assertNotNull("Not a waypoint", result.marker);
assertNull("Ambiguous result", result.track); assertNull("Ambiguous result", result.track);
assertEquals(waypointId, result.waypoint.getId()); assertEquals(waypointId, result.marker.getId());
} }
private void assertWaypointResults(List<ScoredResult> results, Marker.Id... waypointIds) { private void assertWaypointResults(List<ScoredResult> results, Marker.Id... waypointIds) {
@@ -314,9 +314,9 @@ public class SearchEngineTest {
assertEquals(results.size(), waypointIds.length); assertEquals(results.size(), waypointIds.length);
for (int i = 0; i < results.size(); i++) { for (int i = 0; i < results.size(); i++) {
ScoredResult result = results.get(i); ScoredResult result = results.get(i);
assertNotNull(errMsg, result.waypoint); assertNotNull(errMsg, result.marker);
assertNull(errMsg, result.track); assertNull(errMsg, result.track);
assertEquals(errMsg, waypointIds[i], result.waypoint.getId()); assertEquals(errMsg, waypointIds[i], result.marker.getId());
} }
} }
} }
@@ -53,7 +53,7 @@ public class ExportImportTest {
private static final String TRACK_CATEGORY = "the category"; private static final String TRACK_CATEGORY = "the category";
private static final String TRACK_DESCRIPTION = "the description"; private static final String TRACK_DESCRIPTION = "the description";
private final List<Marker> waypoints = new ArrayList<>(); private final List<Marker> markers = new ArrayList<>();
private final List<TrackPoint> trackPoints = new ArrayList<>(); private final List<TrackPoint> trackPoints = new ArrayList<>();
private Track.Id importTrackId; private Track.Id importTrackId;
@@ -72,19 +72,19 @@ public class ExportImportTest {
trackPoints.addAll(Arrays.asList(track.second)); trackPoints.addAll(Arrays.asList(track.second));
for (int i = 0; i < 3; i++) { for (int i = 0; i < 3; i++) {
Marker waypoint = new Marker(track.second[i].getLocation()); Marker marker = new Marker(track.second[i].getLocation());
waypoint.setName("the waypoint " + i); marker.setName("the marker " + i);
waypoint.setDescription("the waypoint description " + i); marker.setDescription("the marker description " + i);
waypoint.setCategory("the waypoint category" + i); marker.setCategory("the marker category" + i);
waypoint.setIcon("the waypoing icon" + i); marker.setIcon("the waypoing icon" + i);
waypoint.setPhotoUrl("the photo url" + i); marker.setPhotoUrl("the photo url" + i);
waypoint.setTrackId(trackId); marker.setTrackId(trackId);
contentProviderUtils.insertMarker(waypoint); contentProviderUtils.insertMarker(marker);
waypoints.add(waypoint); markers.add(marker);
} }
assertEquals(waypoints.size(), contentProviderUtils.getMarkerCount(trackId)); assertEquals(markers.size(), contentProviderUtils.getMarkerCount(trackId));
} }
@After @After
@@ -129,8 +129,8 @@ public class ExportImportTest {
assertEquals(track.getIcon(), importedTrack.getIcon()); assertEquals(track.getIcon(), importedTrack.getIcon());
assertEquals(track.getUuid(), importedTrack.getUuid()); assertEquals(track.getUuid(), importedTrack.getUuid());
// 2. waypoints // 2. markers
assertWaypoints(); assertMarkers();
// 3. trackpoints // 3. trackpoints
assertTrackpoints(false, false, false); assertTrackpoints(false, false, false);
@@ -164,8 +164,8 @@ public class ExportImportTest {
assertEquals(track.getName(), importedTrack.getName()); assertEquals(track.getName(), importedTrack.getName());
assertEquals(track.getIcon(), importedTrack.getIcon()); assertEquals(track.getIcon(), importedTrack.getIcon());
// 2. waypoints // 2. markers
assertWaypoints(); assertMarkers();
// 3. trackpoints // 3. trackpoints
assertTrackpoints(true, true, true); assertTrackpoints(true, true, true);
@@ -253,8 +253,8 @@ public class ExportImportTest {
//TODO exporting and importing a track icon is not yet supported by GpxTrackWriter. //TODO exporting and importing a track icon is not yet supported by GpxTrackWriter.
//assertEquals(track.getIcon(), trackImported.getIcon()); //assertEquals(track.getIcon(), trackImported.getIcon());
// 2. waypoints // 2. markers
assertWaypoints(); assertMarkers();
// 3. trackpoints // 3. trackpoints
assertTrackpoints(false, true, true); assertTrackpoints(false, true, true);
@@ -285,22 +285,22 @@ public class ExportImportTest {
assertNull(trackImported); assertNull(trackImported);
} }
private void assertWaypoints() { private void assertMarkers() {
assertEquals(waypoints.size(), contentProviderUtils.getMarkerCount(importTrackId)); assertEquals(markers.size(), contentProviderUtils.getMarkerCount(importTrackId));
List<Marker> importedWaypoints = contentProviderUtils.getMarkers(importTrackId); List<Marker> importedMarkers = contentProviderUtils.getMarkers(importTrackId);
for (int i = 0; i < waypoints.size(); i++) { for (int i = 0; i < markers.size(); i++) {
Marker waypoint = waypoints.get(i); Marker marker = markers.get(i);
Marker importedWaypoint = importedWaypoints.get(i); Marker importMarker = importedMarkers.get(i);
assertEquals(waypoint.getCategory(), importedWaypoint.getCategory()); assertEquals(marker.getCategory(), importMarker.getCategory());
assertEquals(waypoint.getDescription(), importedWaypoint.getDescription()); assertEquals(marker.getDescription(), importMarker.getDescription());
// assertEquals(waypoint.getIcon(), importedWaypoint.getIcon()); // TODO for KML // assertEquals(marker.getIcon(), importMarker.getIcon()); // TODO for KML
assertEquals(waypoint.getName(), importedWaypoint.getName()); assertEquals(marker.getName(), importMarker.getName());
assertEquals("", importedWaypoint.getPhotoUrl()); assertEquals("", importMarker.getPhotoUrl());
assertEquals(waypoint.getLocation().getLatitude(), importedWaypoint.getLocation().getLatitude(), 0.001); assertEquals(marker.getLocation().getLatitude(), importMarker.getLocation().getLatitude(), 0.001);
assertEquals(waypoint.getLocation().getLongitude(), importedWaypoint.getLocation().getLongitude(), 0.001); assertEquals(marker.getLocation().getLongitude(), importMarker.getLocation().getLongitude(), 0.001);
assertEquals(waypoint.getLocation().getAltitude(), importedWaypoint.getLocation().getAltitude(), 0.001); assertEquals(marker.getLocation().getAltitude(), importMarker.getLocation().getAltitude(), 0.001);
} }
} }
@@ -355,7 +355,7 @@ public class SearchListActivity extends AbstractListActivity implements DeleteMa
if (result.track != null) { if (result.track != null) {
output.add(prepareTrackForDisplay(result.track)); output.add(prepareTrackForDisplay(result.track));
} else { } else {
output.add(prepareMarkerForDisplay(result.waypoint)); output.add(prepareMarkerForDisplay(result.marker));
} }
} }
return output; return output;
@@ -28,7 +28,7 @@ import de.dennisguse.opentracks.util.StringUtils;
import de.dennisguse.opentracks.util.UnitConversions; import de.dennisguse.opentracks.util.UnitConversions;
/** /**
* Generates descriptions for tracks and waypoints. * Generates descriptions for tracks and markers.
* *
* @author Jimmy Shih * @author Jimmy Shih
*/ */
@@ -38,7 +38,7 @@ import de.dennisguse.opentracks.util.LocationUtils;
import de.dennisguse.opentracks.util.UnitConversions; import de.dennisguse.opentracks.util.UnitConversions;
/** /**
* Engine for searching for tracks and waypoints by text. * Engine for searching for tracks and markers by text.
* *
* @author Rodrigo Damazio * @author Rodrigo Damazio
*/ */
@@ -53,9 +53,9 @@ public class SearchEngine {
TracksColumns.CATEGORY + " LIKE ?"; TracksColumns.CATEGORY + " LIKE ?";
/** /**
* WHERE query to get waypoints by name. * WHERE query to get markers by name.
*/ */
private static final String WAYPOINT_SELECTION_QUERY = private static final String MARKER_SELECTION_QUERY =
MarkerColumns.NAME + " LIKE ? OR " + MarkerColumns.NAME + " LIKE ? OR " +
MarkerColumns.DESCRIPTION + " LIKE ? OR " + MarkerColumns.DESCRIPTION + " LIKE ? OR " +
MarkerColumns.CATEGORY + " LIKE ?"; MarkerColumns.CATEGORY + " LIKE ?";
@@ -66,9 +66,9 @@ public class SearchEngine {
private static final String TRACK_SELECTION_ORDER = TracksColumns._ID + " DESC LIMIT 1000"; private static final String TRACK_SELECTION_ORDER = TracksColumns._ID + " DESC LIMIT 1000";
/** /**
* Order of waypoint results. * Order of marker results.
*/ */
private static final String WAYPOINT_SELECTION_ORDER = MarkerColumns._ID + " DESC"; private static final String MARKER_SELECTION_ORDER = MarkerColumns._ID + " DESC";
/** /**
* How much we promote a match in the track category. * How much we promote a match in the track category.
@@ -86,9 +86,9 @@ public class SearchEngine {
private static final double TRACK_NAME_PROMOTION = 16.0; private static final double TRACK_NAME_PROMOTION = 16.0;
/** /**
* How much we promote a waypoint result if it's in the currently-selected track. * How much we promote a marker result if it's in the currently-selected track.
*/ */
private static final double CURRENT_TRACK_WAYPOINT_PROMOTION = 2.0; private static final double CURRENT_TRACK_MARKER_PROMOTION = 2.0;
/** /**
* How much we promote a track result if it's the currently-selected track. * How much we promote a track result if it's the currently-selected track.
@@ -96,9 +96,9 @@ public class SearchEngine {
private static final double CURRENT_TRACK_DEMOTION = 0.5; private static final double CURRENT_TRACK_DEMOTION = 0.5;
/** /**
* Maximum number of waypoints which will be retrieved and scored. * Maximum number of markers which will be retrieved and scored.
*/ */
private static final int MAX_SCORED_WAYPOINTS = 100; private static final int MAX_SCORED_MARKERS = 100;
/** /**
* Oldest timestamp for which we rank based on time (2000-01-01 00:00:00.000) * Oldest timestamp for which we rank based on time (2000-01-01 00:00:00.000)
@@ -115,16 +115,16 @@ public class SearchEngine {
return scoreDiff; return scoreDiff;
} }
// Make tracks come before waypoints. // Make tracks come before markers.
if (r1.waypoint != null && r2.track != null) { if (r1.marker != null && r2.track != null) {
return 1; return 1;
} else if (r1.track != null && r2.waypoint != null) { } else if (r1.track != null && r2.marker != null) {
return -1; return -1;
} }
// Finally, use arbitrary ordering, by ID. // Finally, use arbitrary ordering, by ID.
long id1 = r1.track != null ? r1.track.getId().getId() : r1.waypoint.getId().getId(); long id1 = r1.track != null ? r1.track.getId().getId() : r1.marker.getId().getId();
long id2 = r2.track != null ? r2.track.getId().getId() : r2.waypoint.getId().getId(); long id2 = r2.track != null ? r2.track.getId().getId() : r2.marker.getId().getId();
long idDiff = id2 - id1; long idDiff = id2 - id1;
return Long.signum(idDiff); return Long.signum(idDiff);
}; };
@@ -153,7 +153,7 @@ public class SearchEngine {
TreeSet<ScoredResult> scoredResults = new TreeSet<>(SCORED_RESULT_COMPARATOR); TreeSet<ScoredResult> scoredResults = new TreeSet<>(SCORED_RESULT_COMPARATOR);
scoreTrackResults(retrieveTracks(query), query, scoredResults); scoreTrackResults(retrieveTracks(query), query, scoredResults);
scoreWaypointResults(retrieveWaypoints(query), query, scoredResults); scoreMarkersResults(retrieveMarkers(query), query, scoredResults);
return scoredResults; return scoredResults;
} }
@@ -186,33 +186,33 @@ public class SearchEngine {
} }
/** /**
* Retrieves waypoints matching the given query from the database. * Retrieves markers matching the given query from the database.
* *
* @param query the query to retrieve for * @param query the query to retrieve for
*/ */
private List<Marker> retrieveWaypoints(SearchQuery query) { private List<Marker> retrieveMarkers(SearchQuery query) {
ArrayList<Marker> waypoints = new ArrayList<>(); ArrayList<Marker> markers = new ArrayList<>();
String queryLikeSelection2 = "%" + query.textQuery + "%"; String queryLikeSelection2 = "%" + query.textQuery + "%";
String[] waypointSelectionArgs = new String[]{ String[] markersSelectionArgs = new String[]{
queryLikeSelection2, queryLikeSelection2,
queryLikeSelection2, queryLikeSelection2,
queryLikeSelection2 queryLikeSelection2
}; };
try (Cursor cursor = providerUtils.getMarkerCursor(WAYPOINT_SELECTION_QUERY, waypointSelectionArgs, WAYPOINT_SELECTION_ORDER, MAX_SCORED_WAYPOINTS)) { try (Cursor cursor = providerUtils.getMarkerCursor(MARKER_SELECTION_QUERY, markersSelectionArgs, MARKER_SELECTION_ORDER, MAX_SCORED_MARKERS)) {
if (cursor != null) { if (cursor != null) {
waypoints.ensureCapacity(cursor.getCount()); markers.ensureCapacity(cursor.getCount());
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
Marker waypoint = providerUtils.createMarker(cursor); Marker marker = providerUtils.createMarker(cursor);
if (LocationUtils.isValidLocation(waypoint.getLocation())) { if (LocationUtils.isValidLocation(marker.getLocation())) {
waypoints.add(waypoint); markers.add(marker);
} }
} }
} }
} }
return waypoints; return markers;
} }
/** /**
@@ -258,40 +258,40 @@ public class SearchEngine {
} }
/** /**
* Scores a collection of waypoint results. * Scores a collection of marker results.
* *
* @param waypoints the results to score * @param markers the results to score
* @param query the query to score for * @param query the query to score for
* @param output the collection to fill with scored results * @param output the collection to fill with scored results
*/ */
private void scoreWaypointResults(Collection<Marker> waypoints, SearchQuery query, Collection<ScoredResult> output) { private void scoreMarkersResults(Collection<Marker> markers, SearchQuery query, Collection<ScoredResult> output) {
for (Marker waypoint : waypoints) { for (Marker marker : markers) {
// Calculate the score. // Calculate the score.
double score = scoreWaypointResult(query, waypoint); double score = scoreMarkerResult(query, marker);
// Add to the output. // Add to the output.
output.add(new ScoredResult(waypoint, score)); output.add(new ScoredResult(marker, score));
} }
} }
/** /**
* Scores a single waypoint result. * Scores a single marker result.
* *
* @param query the query to score for * @param query the query to score for
* @param waypoint the results to score * @param marker the results to score
* @return the score for the waypoint * @return the score for the marker
*/ */
private double scoreWaypointResult(SearchQuery query, Marker waypoint) { private double scoreMarkerResult(SearchQuery query, Marker marker) {
double score = 1.0; double score = 1.0;
Location location = waypoint.getLocation(); Location location = marker.getLocation();
score *= getTitleBoost(query, waypoint.getName(), waypoint.getDescription(), waypoint.getCategory()); score *= getTitleBoost(query, marker.getName(), marker.getDescription(), marker.getCategory());
score *= getDistanceBoost(query, location.getLatitude(), location.getLongitude()); score *= getDistanceBoost(query, location.getLatitude(), location.getLongitude());
score *= getTimeBoost(query, location.getTime()); score *= getTimeBoost(query, location.getTime());
// Score waypoints in the currently-selected track higher (searching inside the current track). // Score markers in the currently-selected track higher (searching inside the current track).
if (waypoint.getTrackId() != null && waypoint.getTrackId().equals(query.currentTrackId)) { if (marker.getTrackId() != null && marker.getTrackId().equals(query.currentTrackId)) {
score *= CURRENT_TRACK_WAYPOINT_PROMOTION; score *= CURRENT_TRACK_MARKER_PROMOTION;
} }
return score; return score;
@@ -301,9 +301,9 @@ public class SearchEngine {
* Calculates the boosting of the score due to the field(s) in which the match occured. * Calculates the boosting of the score due to the field(s) in which the match occured.
* *
* @param query the query to boost for * @param query the query to boost for
* @param name the name of the track or waypoint * @param name the name of the track or marker
* @param description the description of the track or waypoint * @param description the description of the track or marker
* @param category the category of the track or waypoint * @param category the category of the track or marker
* @return the total boost to be applied to the result * @return the total boost to be applied to the result
*/ */
private double getTitleBoost(SearchQuery query, String name, String description, String category) { private double getTitleBoost(SearchQuery query, String name, String description, String category) {
@@ -398,18 +398,18 @@ public class SearchEngine {
*/ */
public static class ScoredResult { public static class ScoredResult {
public final Track track; public final Track track;
public final Marker waypoint; public final Marker marker;
final double score; final double score;
ScoredResult(Track track, double score) { ScoredResult(Track track, double score) {
this.track = track; this.track = track;
this.waypoint = null; this.marker = null;
this.score = score; this.score = score;
} }
ScoredResult(Marker waypoint, double score) { ScoredResult(Marker marker, double score) {
this.track = null; this.track = null;
this.waypoint = waypoint; this.marker = marker;
this.score = score; this.score = score;
} }
@@ -418,7 +418,7 @@ public class SearchEngine {
public String toString() { public String toString() {
return "ScoredResult [" return "ScoredResult ["
+ (track != null ? ("trackId=" + track.getId().getId() + ", ") : "") + (track != null ? ("trackId=" + track.getId().getId() + ", ") : "")
+ (waypoint != null ? ("wptId=" + waypoint.getId().getId() + ", ") : "") + (marker != null ? ("wptId=" + marker.getId().getId() + ", ") : "")
+ "score=" + score + "]"; + "score=" + score + "]";
} }
} }
@@ -58,14 +58,14 @@ public class TrackDataHub implements SharedPreferences.OnSharedPreferenceChangeL
* We may display more than this number of points. * We may display more than this number of points.
*/ */
@Deprecated @Deprecated
private static final int TARGET_DISPLAYED_TRACK_POINTS = 5000; private static final int TARGET_DISPLAYED_TRACKPOINTS = 5000;
/** /**
* Maximum number of waypoints to displayed. * Maximum number of markers to displayed.
*/ */
@VisibleForTesting @VisibleForTesting
@Deprecated @Deprecated
private static final int MAX_DISPLAYED_WAYPOINTS = 128; private static final int MAX_DISPLAYED_MARKERS = 128;
private static final String TAG = TrackDataHub.class.getSimpleName(); private static final String TAG = TrackDataHub.class.getSimpleName();
@@ -90,11 +90,11 @@ public class TrackDataHub implements SharedPreferences.OnSharedPreferenceChangeL
// Registered listeners // Registered listeners
private ContentObserver tracksTableObserver; private ContentObserver tracksTableObserver;
private ContentObserver waypointsTableObserver; private ContentObserver markersTableObserver;
private ContentObserver trackPointsTableObserver; 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_TRACKPOINTS);
} }
@VisibleForTesting @VisibleForTesting
@@ -126,13 +126,13 @@ public class TrackDataHub implements SharedPreferences.OnSharedPreferenceChangeL
}; };
contentResolver.registerContentObserver(TracksColumns.CONTENT_URI, false, tracksTableObserver); contentResolver.registerContentObserver(TracksColumns.CONTENT_URI, false, tracksTableObserver);
waypointsTableObserver = new ContentObserver(handler) { markersTableObserver = new ContentObserver(handler) {
@Override @Override
public void onChange(boolean selfChange) { public void onChange(boolean selfChange) {
notifyWaypointsTableUpdate(trackDataManager.getListenerWaypoints()); notifyMarkersTableUpdate(trackDataManager.getListenerMarkers());
} }
}; };
contentResolver.registerContentObserver(MarkerColumns.CONTENT_URI, false, waypointsTableObserver); contentResolver.registerContentObserver(MarkerColumns.CONTENT_URI, false, markersTableObserver);
trackPointsTableObserver = new ContentObserver(handler) { trackPointsTableObserver = new ContentObserver(handler) {
@Override @Override
@@ -165,7 +165,7 @@ public class TrackDataHub implements SharedPreferences.OnSharedPreferenceChangeL
//Unregister listeners //Unregister listeners
ContentResolver contentResolver = context.getContentResolver(); ContentResolver contentResolver = context.getContentResolver();
contentResolver.unregisterContentObserver(tracksTableObserver); contentResolver.unregisterContentObserver(tracksTableObserver);
contentResolver.unregisterContentObserver(waypointsTableObserver); contentResolver.unregisterContentObserver(markersTableObserver);
contentResolver.unregisterContentObserver(trackPointsTableObserver); contentResolver.unregisterContentObserver(trackPointsTableObserver);
if (handlerThread != null) { if (handlerThread != null) {
@@ -191,9 +191,9 @@ public class TrackDataHub implements SharedPreferences.OnSharedPreferenceChangeL
* *
* @param trackDataListener the track data listener * @param trackDataListener the track data listener
*/ */
public void registerTrackDataListener(final TrackDataListener trackDataListener, final boolean tracksTable, final boolean waypointsTable, final boolean trackPointsTable_SampleIn, final boolean trackPointsTable_SampleOut) { public void registerTrackDataListener(final TrackDataListener trackDataListener, final boolean tracksTable, final boolean markersTable, final boolean trackPointsTable_SampleIn, final boolean trackPointsTable_SampleOut) {
runInHandlerThread(() -> { runInHandlerThread(() -> {
trackDataManager.registerTrackDataListener(trackDataListener, tracksTable, waypointsTable, trackPointsTable_SampleIn, trackPointsTable_SampleOut); trackDataManager.registerTrackDataListener(trackDataListener, tracksTable, markersTable, trackPointsTable_SampleIn, trackPointsTable_SampleOut);
if (started) { if (started) {
loadDataForListener(trackDataListener); loadDataForListener(trackDataListener);
} }
@@ -250,7 +250,7 @@ public class TrackDataHub implements SharedPreferences.OnSharedPreferenceChangeL
listener.clearTrackPoints(); listener.clearTrackPoints();
} }
notifyTrackPointsTableUpdate(true, trackDataManager.getListenerTrackPoints_SampledIn(), trackDataManager.getListenerTrackPoints_SampledOut()); notifyTrackPointsTableUpdate(true, trackDataManager.getListenerTrackPoints_SampledIn(), trackDataManager.getListenerTrackPoints_SampledOut());
notifyWaypointsTableUpdate(trackDataManager.getListenerWaypoints()); notifyMarkersTableUpdate(trackDataManager.getListenerMarkers());
} }
/** /**
@@ -277,8 +277,8 @@ public class TrackDataHub implements SharedPreferences.OnSharedPreferenceChangeL
notifyTrackPointsTableUpdate(isOnlyListener, trackDataListeners, sampledOutListeners); notifyTrackPointsTableUpdate(isOnlyListener, trackDataListeners, sampledOutListeners);
} }
if (trackDataManager.listensForWaypoints(trackDataListener)) { if (trackDataManager.listensForMarkers(trackDataListener)) {
notifyWaypointsTableUpdate(trackDataListeners); notifyMarkersTableUpdate(trackDataListeners);
} }
} }
@@ -298,36 +298,36 @@ public class TrackDataHub implements SharedPreferences.OnSharedPreferenceChangeL
} }
/** /**
* Notifies waypoint table update. * Notifies marker table update.
* Currently, reloads all the waypoints up to {@link #MAX_DISPLAYED_WAYPOINTS}. To be run in the {@link #handler} thread. * Currently, reloads all the markers up to {@link #MAX_DISPLAYED_MARKERS}. To be run in the {@link #handler} thread.
* *
* @param trackDataListeners the track data listeners to notify * @param trackDataListeners the track data listeners to notify
*/ */
private void notifyWaypointsTableUpdate(Set<TrackDataListener> trackDataListeners) { private void notifyMarkersTableUpdate(Set<TrackDataListener> trackDataListeners) {
if (trackDataListeners.isEmpty()) { if (trackDataListeners.isEmpty()) {
return; return;
} }
for (TrackDataListener trackDataListener : trackDataListeners) { for (TrackDataListener trackDataListener : trackDataListeners) {
trackDataListener.clearWaypoints(); trackDataListener.clearMarkers();
} }
try (Cursor cursor = contentProviderUtils.getMarkerCursor(selectedTrackId, null, MAX_DISPLAYED_WAYPOINTS)) { try (Cursor cursor = contentProviderUtils.getMarkerCursor(selectedTrackId, null, MAX_DISPLAYED_MARKERS)) {
if (cursor != null && cursor.moveToFirst()) { if (cursor != null && cursor.moveToFirst()) {
do { do {
Marker waypoint = contentProviderUtils.createMarker(cursor); Marker marker = contentProviderUtils.createMarker(cursor);
if (!LocationUtils.isValidLocation(waypoint.getLocation())) { if (!LocationUtils.isValidLocation(marker.getLocation())) {
continue; continue;
} }
for (TrackDataListener trackDataListener : trackDataListeners) { for (TrackDataListener trackDataListener : trackDataListeners) {
trackDataListener.onNewWaypoint(waypoint); trackDataListener.onNewMarker(marker);
} }
} while (cursor.moveToNext()); } while (cursor.moveToNext());
} }
} }
for (TrackDataListener trackDataListener : trackDataListeners) { for (TrackDataListener trackDataListener : trackDataListeners) {
trackDataListener.onNewWaypointsDone(); trackDataListener.onNewMarkersDone();
} }
} }
@@ -60,20 +60,20 @@ public interface TrackDataListener {
void onNewTrackPointsDone(); void onNewTrackPointsDone();
/** /**
* Called to clear previously sent waypoints. * Called to clear previously sent markers.
*/ */
void clearWaypoints(); void clearMarkers();
/** /**
* Called when a new waypoint is read. * Called when a new marker is read.
* *
* @param waypoint the waypoint * @param marker the marker
*/ */
void onNewWaypoint(Marker waypoint); void onNewMarker(Marker marker);
/** /**
* Called when finish sending new waypoints. * Called when finish sending new markers.
* This gets called after every batch of calls to {@link #clearWaypoints()} and {@link #onNewWaypoint(Marker)}. * This gets called after every batch of calls to {@link #clearMarkers()} and {@link #onNewMarker(Marker)}.
*/ */
void onNewWaypointsDone(); void onNewMarkersDone();
} }
@@ -29,32 +29,32 @@ class TrackDataManager {
private static final String TAG = TrackDataManager.class.getSimpleName(); private static final String TAG = TrackDataManager.class.getSimpleName();
private final Set<TrackDataListener> dataListenerTracks = new HashSet<>(); private final Set<TrackDataListener> dataListenerTracks = new HashSet<>();
private final Set<TrackDataListener> dataListenerWaypoints = new HashSet<>(); private final Set<TrackDataListener> dataListenerMarkers = new HashSet<>();
private final Set<TrackDataListener> dataListenerTrackPoints_SampledIn = new HashSet<>(); private final Set<TrackDataListener> dataListenerTrackPoints_SampledIn = new HashSet<>();
private final Set<TrackDataListener> dataListenerTrackPoints_SampledOut = new HashSet<>(); private final Set<TrackDataListener> dataListenerTrackPoints_SampledOut = new HashSet<>();
void registerTrackDataListener(final TrackDataListener trackDataListener, boolean tracksTable, boolean waypointsTable, boolean trackPointsTable_SampleIn, boolean trackPointsTable_SampleOut) { void registerTrackDataListener(final TrackDataListener trackDataListener, boolean tracksTable, boolean markersTable, boolean trackPointsTable_SampleIn, boolean trackPointsTable_SampleOut) {
if (tracksTable) dataListenerTracks.add(trackDataListener); if (tracksTable) dataListenerTracks.add(trackDataListener);
if (waypointsTable) dataListenerWaypoints.add(trackDataListener); if (markersTable) dataListenerMarkers.add(trackDataListener);
if (trackPointsTable_SampleIn) dataListenerTrackPoints_SampledIn.add(trackDataListener); if (trackPointsTable_SampleIn) dataListenerTrackPoints_SampledIn.add(trackDataListener);
if (trackPointsTable_SampleOut) dataListenerTrackPoints_SampledOut.add(trackDataListener); if (trackPointsTable_SampleOut) dataListenerTrackPoints_SampledOut.add(trackDataListener);
} }
void unregisterTrackDataListener(TrackDataListener trackDataListener) { void unregisterTrackDataListener(TrackDataListener trackDataListener) {
dataListenerTracks.add(trackDataListener); dataListenerTracks.add(trackDataListener);
dataListenerWaypoints.add(trackDataListener); dataListenerMarkers.add(trackDataListener);
dataListenerTrackPoints_SampledIn.add(trackDataListener); dataListenerTrackPoints_SampledIn.add(trackDataListener);
dataListenerTrackPoints_SampledOut.add(trackDataListener); dataListenerTrackPoints_SampledOut.add(trackDataListener);
} }
boolean hasListeners() { boolean hasListeners() {
return dataListenerTracks.size() + dataListenerWaypoints.size() + dataListenerTrackPoints_SampledIn.size() + dataListenerTrackPoints_SampledOut.size() > 0; return dataListenerTracks.size() + dataListenerMarkers.size() + dataListenerTrackPoints_SampledIn.size() + dataListenerTrackPoints_SampledOut.size() > 0;
} }
int getNumberOfListeners() { int getNumberOfListeners() {
Set<TrackDataListener> listener = new HashSet<>(); Set<TrackDataListener> listener = new HashSet<>();
listener.addAll(dataListenerTracks); listener.addAll(dataListenerTracks);
listener.addAll(dataListenerWaypoints); listener.addAll(dataListenerMarkers);
listener.addAll(dataListenerTrackPoints_SampledIn); listener.addAll(dataListenerTrackPoints_SampledIn);
listener.addAll(dataListenerTrackPoints_SampledOut); listener.addAll(dataListenerTrackPoints_SampledOut);
@@ -65,8 +65,8 @@ class TrackDataManager {
return dataListenerTracks.contains(listener); return dataListenerTracks.contains(listener);
} }
boolean listensForWaypoints(TrackDataListener listener) { boolean listensForMarkers(TrackDataListener listener) {
return dataListenerWaypoints.contains(listener); return dataListenerMarkers.contains(listener);
} }
boolean listensForTrackPoints_SampledIn(TrackDataListener listener) { boolean listensForTrackPoints_SampledIn(TrackDataListener listener) {
@@ -81,8 +81,8 @@ class TrackDataManager {
return dataListenerTracks; return dataListenerTracks;
} }
Set<TrackDataListener> getListenerWaypoints() { Set<TrackDataListener> getListenerMarkers() {
return dataListenerWaypoints; return dataListenerMarkers;
} }
Set<TrackDataListener> getListenerTrackPoints_SampledIn() { Set<TrackDataListener> getListenerTrackPoints_SampledIn() {
@@ -30,8 +30,6 @@ import java.util.Objects;
import de.dennisguse.opentracks.util.PreferencesUtils; import de.dennisguse.opentracks.util.PreferencesUtils;
/** /**
* A waypoint.
*
* @author Leif Hendrik Wilden * @author Leif Hendrik Wilden
* @author Rodrigo Damazio * @author Rodrigo Damazio
*/ */
@@ -59,10 +59,12 @@ public class TrackPoint {
location.setTime(time); location.setTime(time);
} }
@Deprecated //See #316
public static TrackPoint createPause() { public static TrackPoint createPause() {
return createPauseWithTime(System.currentTimeMillis()); return createPauseWithTime(System.currentTimeMillis());
} }
@Deprecated //See #316
public static TrackPoint createPauseWithTime(long time) { public static TrackPoint createPauseWithTime(long time) {
Location pause = new Location(LocationManager.GPS_PROVIDER); Location pause = new Location(LocationManager.GPS_PROVIDER);
pause.setLongitude(0); pause.setLongitude(0);
@@ -71,10 +73,12 @@ public class TrackPoint {
return new TrackPoint(pause); return new TrackPoint(pause);
} }
@Deprecated //See #316
public static TrackPoint createResume() { public static TrackPoint createResume() {
return createResumeWithTime(System.currentTimeMillis()); return createResumeWithTime(System.currentTimeMillis());
} }
@Deprecated //See #316
public static TrackPoint createResumeWithTime(long time) { public static TrackPoint createResumeWithTime(long time) {
Location resume = new Location(LocationManager.GPS_PROVIDER); Location resume = new Location(LocationManager.GPS_PROVIDER);
resume.setLongitude(0); resume.setLongitude(0);
@@ -242,21 +242,21 @@ public class ChartFragment extends Fragment implements TrackDataListener {
} }
@Override @Override
public void clearWaypoints() { public void clearMarkers() {
if (isResumed()) { if (isResumed()) {
chartView.clearWaypoints(); chartView.clearWaypoints();
} }
} }
@Override @Override
public void onNewWaypoint(Marker waypoint) { public void onNewMarker(Marker marker) {
if (isResumed() && waypoint != null && LocationUtils.isValidLocation(waypoint.getLocation())) { if (isResumed() && marker != null && LocationUtils.isValidLocation(marker.getLocation())) {
chartView.addWaypoint(waypoint); chartView.addWaypoint(marker);
} }
} }
@Override @Override
public void onNewWaypointsDone() { public void onNewMarkersDone() {
if (isResumed()) { if (isResumed()) {
runOnUiThread(updateChart); runOnUiThread(updateChart);
} }
@@ -64,23 +64,23 @@ public class DeleteMarkerDialogFragment extends DialogFragment {
@Override @Override
@NonNull @NonNull
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
final Marker.Id[] waypointIds = (Marker.Id[]) getArguments().getParcelableArray(KEY_MARKER_IDS); final Marker.Id[] markerIds = (Marker.Id[]) getArguments().getParcelableArray(KEY_MARKER_IDS);
final FragmentActivity fragmentActivity = getActivity(); final FragmentActivity fragmentActivity = getActivity();
int titleId; int titleId;
int messageId; int messageId;
if (waypointIds == null) { if (markerIds == null) {
titleId = R.string.generic_delete_all_confirm_title; titleId = R.string.generic_delete_all_confirm_title;
messageId = R.string.marker_delete_all_confirm_message; messageId = R.string.marker_delete_all_confirm_message;
} else { } else {
titleId = waypointIds.length > 1 ? R.string.generic_delete_selected_confirm_title : R.string.marker_delete_one_confirm_title; titleId = markerIds.length > 1 ? R.string.generic_delete_selected_confirm_title : R.string.marker_delete_one_confirm_title;
messageId = waypointIds.length > 1 ? R.string.marker_delete_multiple_confirm_message : R.string.marker_delete_one_confirm_message; messageId = markerIds.length > 1 ? R.string.marker_delete_multiple_confirm_message : R.string.marker_delete_one_confirm_message;
} }
return DialogUtils.createConfirmationDialog( return DialogUtils.createConfirmationDialog(
fragmentActivity, titleId, getString(messageId), (dialog, which) -> new Thread(() -> { fragmentActivity, titleId, getString(messageId), (dialog, which) -> new Thread(() -> {
ContentProviderUtils contentProviderUtils = new ContentProviderUtils(fragmentActivity); ContentProviderUtils contentProviderUtils = new ContentProviderUtils(fragmentActivity);
for (Marker.Id waypointId : waypointIds) { for (Marker.Id markerId : markerIds) {
contentProviderUtils.deleteMarker(getContext(), waypointId); contentProviderUtils.deleteMarker(getContext(), markerId);
} }
caller.onDeleteMarkerDone(); caller.onDeleteMarkerDone();
}).start()); }).start());
@@ -350,17 +350,17 @@ public class StatisticsRecordingFragment extends Fragment implements TrackDataLi
} }
@Override @Override
public void clearWaypoints() { public void clearMarkers() {
// We don't care. // We don't care.
} }
@Override @Override
public void onNewWaypoint(Marker wpt) { public void onNewMarker(Marker marker) {
// We don't care. // We don't care.
} }
@Override @Override
public void onNewWaypointsDone() { public void onNewMarkersDone() {
// We don't care. // We don't care.
} }
@@ -41,6 +41,7 @@ public class LocationUtils {
* @return true if the location is a valid location. * @return true if the location is a valid location.
*/ */
//TODO Move to TrackPoint //TODO Move to TrackPoint
@Deprecated //See #316
public static boolean isValidLocation(Location location) { public static boolean isValidLocation(Location location) {
return location != null return location != null
&& Math.abs(location.getLatitude()) <= 90 && Math.abs(location.getLatitude()) <= 90