Improved aidl import gpx
This commit is contained in:
parent
e3c6545bd4
commit
8a671f8572
6 changed files with 268 additions and 56 deletions
|
@ -39,18 +39,10 @@ import net.osmand.aidl.maplayer.AddMapLayerParams;
|
||||||
import net.osmand.aidl.maplayer.RemoveMapLayerParams;
|
import net.osmand.aidl.maplayer.RemoveMapLayerParams;
|
||||||
import net.osmand.aidl.maplayer.UpdateMapLayerParams;
|
import net.osmand.aidl.maplayer.UpdateMapLayerParams;
|
||||||
|
|
||||||
|
// NOTE: Add new methods at the end of file!!!
|
||||||
|
|
||||||
interface IOsmAndAidlInterface {
|
interface IOsmAndAidlInterface {
|
||||||
|
|
||||||
boolean refreshMap();
|
|
||||||
|
|
||||||
boolean addFavoriteGroup(in AddFavoriteGroupParams params);
|
|
||||||
boolean removeFavoriteGroup(in RemoveFavoriteGroupParams params);
|
|
||||||
boolean updateFavoriteGroup(in UpdateFavoriteGroupParams params);
|
|
||||||
|
|
||||||
boolean addFavorite(in AddFavoriteParams params);
|
|
||||||
boolean removeFavorite(in RemoveFavoriteParams params);
|
|
||||||
boolean updateFavorite(in UpdateFavoriteParams params);
|
|
||||||
|
|
||||||
boolean addMapMarker(in AddMapMarkerParams params);
|
boolean addMapMarker(in AddMapMarkerParams params);
|
||||||
boolean removeMapMarker(in RemoveMapMarkerParams params);
|
boolean removeMapMarker(in RemoveMapMarkerParams params);
|
||||||
boolean updateMapMarker(in UpdateMapMarkerParams params);
|
boolean updateMapMarker(in UpdateMapMarkerParams params);
|
||||||
|
@ -74,4 +66,15 @@ interface IOsmAndAidlInterface {
|
||||||
|
|
||||||
boolean setMapLocation(in SetMapLocationParams params);
|
boolean setMapLocation(in SetMapLocationParams params);
|
||||||
boolean calculateRoute(in CalculateRouteParams params);
|
boolean calculateRoute(in CalculateRouteParams params);
|
||||||
|
|
||||||
|
boolean refreshMap();
|
||||||
|
|
||||||
|
boolean addFavoriteGroup(in AddFavoriteGroupParams params);
|
||||||
|
boolean removeFavoriteGroup(in RemoveFavoriteGroupParams params);
|
||||||
|
boolean updateFavoriteGroup(in UpdateFavoriteGroupParams params);
|
||||||
|
|
||||||
|
boolean addFavorite(in AddFavoriteParams params);
|
||||||
|
boolean removeFavorite(in RemoveFavoriteParams params);
|
||||||
|
boolean updateFavorite(in UpdateFavoriteParams params);
|
||||||
|
|
||||||
}
|
}
|
|
@ -5,6 +5,7 @@ import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.os.AsyncTask;
|
||||||
import android.os.ParcelFileDescriptor;
|
import android.os.ParcelFileDescriptor;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
|
@ -20,13 +21,16 @@ import net.osmand.data.FavouritePoint;
|
||||||
import net.osmand.data.LatLon;
|
import net.osmand.data.LatLon;
|
||||||
import net.osmand.data.PointDescription;
|
import net.osmand.data.PointDescription;
|
||||||
import net.osmand.plus.FavouritesDbHelper;
|
import net.osmand.plus.FavouritesDbHelper;
|
||||||
|
import net.osmand.plus.GPXDatabase.GpxDataItem;
|
||||||
import net.osmand.plus.GPXUtilities;
|
import net.osmand.plus.GPXUtilities;
|
||||||
import net.osmand.plus.GPXUtilities.GPXFile;
|
import net.osmand.plus.GPXUtilities.GPXFile;
|
||||||
|
import net.osmand.plus.GpxSelectionHelper;
|
||||||
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
|
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
|
||||||
import net.osmand.plus.MapMarkersHelper;
|
import net.osmand.plus.MapMarkersHelper;
|
||||||
import net.osmand.plus.MapMarkersHelper.MapMarker;
|
import net.osmand.plus.MapMarkersHelper.MapMarker;
|
||||||
import net.osmand.plus.OsmandApplication;
|
import net.osmand.plus.OsmandApplication;
|
||||||
import net.osmand.plus.activities.MapActivity;
|
import net.osmand.plus.activities.MapActivity;
|
||||||
|
import net.osmand.plus.dialogs.ConfigureMapMenu;
|
||||||
import net.osmand.plus.helpers.ColorDialogs;
|
import net.osmand.plus.helpers.ColorDialogs;
|
||||||
import net.osmand.plus.views.AidlMapLayer;
|
import net.osmand.plus.views.AidlMapLayer;
|
||||||
import net.osmand.plus.views.MapInfoLayer;
|
import net.osmand.plus.views.MapInfoLayer;
|
||||||
|
@ -631,13 +635,71 @@ public class OsmandAidlApi {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean importGpxFromFile(File source, String destinationPath) {
|
private void finishGpxImport(boolean destinationExists, File destination, String color, boolean show) {
|
||||||
|
int col = ConfigureMapMenu.GpxAppearanceAdapter.parseTrackColor(
|
||||||
|
app.getRendererRegistry().getCurrentSelectedRenderer(), color);
|
||||||
|
if (!destinationExists) {
|
||||||
|
GpxDataItem gpxDataItem = new GpxDataItem(destination, col);
|
||||||
|
app.getGpxDatabase().add(gpxDataItem);
|
||||||
|
} else {
|
||||||
|
GpxDataItem item = app.getGpxDatabase().getItem(destination);
|
||||||
|
if (item != null) {
|
||||||
|
app.getGpxDatabase().updateColor(item, col);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final GpxSelectionHelper helper = app.getSelectedGpxHelper();
|
||||||
|
final SelectedGpxFile selectedGpx = helper.getSelectedFileByName(destination.getName());
|
||||||
|
if (selectedGpx != null) {
|
||||||
|
if (show) {
|
||||||
|
new AsyncTask<File, Void, GPXFile>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected GPXFile doInBackground(File... files) {
|
||||||
|
return GPXUtilities.loadGPXFile(app, files[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(GPXFile gpx) {
|
||||||
|
if (gpx.warning == null) {
|
||||||
|
selectedGpx.setGpxFile(gpx);
|
||||||
|
refreshMap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}.execute(destination);
|
||||||
|
} else {
|
||||||
|
helper.selectGpxFile(selectedGpx.getGpxFile(), false, false);
|
||||||
|
refreshMap();
|
||||||
|
}
|
||||||
|
} else if (show) {
|
||||||
|
new AsyncTask<File, Void, GPXFile>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected GPXFile doInBackground(File... files) {
|
||||||
|
return GPXUtilities.loadGPXFile(app, files[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(GPXFile gpx) {
|
||||||
|
if (gpx.warning == null) {
|
||||||
|
helper.selectGpxFile(gpx, true, false);
|
||||||
|
refreshMap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}.execute(destination);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean importGpxFromFile(File source, String destinationPath, String color, boolean show) {
|
||||||
if (source != null && !Algorithms.isEmpty(destinationPath)) {
|
if (source != null && !Algorithms.isEmpty(destinationPath)) {
|
||||||
if (source.exists() && source.canRead()) {
|
if (source.exists() && source.canRead()) {
|
||||||
File destination = app.getAppPath(IndexConstants.GPX_INDEX_DIR + destinationPath);
|
File destination = app.getAppPath(IndexConstants.GPX_INDEX_DIR + destinationPath);
|
||||||
if (destination.getParentFile().canWrite()) {
|
if (destination.getParentFile().canWrite()) {
|
||||||
|
boolean destinationExists = destination.exists();
|
||||||
try {
|
try {
|
||||||
Algorithms.fileCopy(source, destination);
|
Algorithms.fileCopy(source, destination);
|
||||||
|
finishGpxImport(destinationExists, destination, color, show);
|
||||||
return true;
|
return true;
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
@ -648,18 +710,20 @@ public class OsmandAidlApi {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean importGpxFromUri(Uri gpxUri, String destinationPath) {
|
boolean importGpxFromUri(Uri gpxUri, String destinationPath, String color, boolean show) {
|
||||||
if (gpxUri != null && !Algorithms.isEmpty(destinationPath)) {
|
if (gpxUri != null && !Algorithms.isEmpty(destinationPath)) {
|
||||||
File destination = app.getAppPath(IndexConstants.GPX_INDEX_DIR + destinationPath);
|
File destination = app.getAppPath(IndexConstants.GPX_INDEX_DIR + destinationPath);
|
||||||
ParcelFileDescriptor gpxParcelDescriptor = null;
|
ParcelFileDescriptor gpxParcelDescriptor;
|
||||||
try {
|
try {
|
||||||
gpxParcelDescriptor = app.getContentResolver().openFileDescriptor(gpxUri, "r");
|
gpxParcelDescriptor = app.getContentResolver().openFileDescriptor(gpxUri, "r");
|
||||||
if (gpxParcelDescriptor != null) {
|
if (gpxParcelDescriptor != null) {
|
||||||
|
boolean destinationExists = destination.exists();
|
||||||
FileDescriptor fileDescriptor = gpxParcelDescriptor.getFileDescriptor();
|
FileDescriptor fileDescriptor = gpxParcelDescriptor.getFileDescriptor();
|
||||||
InputStream is = new FileInputStream(fileDescriptor);
|
InputStream is = new FileInputStream(fileDescriptor);
|
||||||
FileOutputStream fout = new FileOutputStream(destination);
|
FileOutputStream fout = new FileOutputStream(destination);
|
||||||
try {
|
try {
|
||||||
Algorithms.streamCopy(is, fout);
|
Algorithms.streamCopy(is, fout);
|
||||||
|
finishGpxImport(destinationExists, destination, color, show);
|
||||||
} finally {
|
} finally {
|
||||||
try {
|
try {
|
||||||
is.close();
|
is.close();
|
||||||
|
@ -681,14 +745,16 @@ public class OsmandAidlApi {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean importGpxFromData(String sourceRawData, String destinationPath) {
|
boolean importGpxFromData(String sourceRawData, String destinationPath, String color, boolean show) {
|
||||||
if (!Algorithms.isEmpty(sourceRawData) && !Algorithms.isEmpty(destinationPath)) {
|
if (!Algorithms.isEmpty(sourceRawData) && !Algorithms.isEmpty(destinationPath)) {
|
||||||
File destination = app.getAppPath(IndexConstants.GPX_INDEX_DIR + destinationPath);
|
File destination = app.getAppPath(IndexConstants.GPX_INDEX_DIR + destinationPath);
|
||||||
try {
|
try {
|
||||||
InputStream is = new ByteArrayInputStream(sourceRawData.getBytes());
|
InputStream is = new ByteArrayInputStream(sourceRawData.getBytes());
|
||||||
FileOutputStream fout = new FileOutputStream(destination);
|
FileOutputStream fout = new FileOutputStream(destination);
|
||||||
|
boolean destinationExists = destination.exists();
|
||||||
try {
|
try {
|
||||||
Algorithms.streamCopy(is, fout);
|
Algorithms.streamCopy(is, fout);
|
||||||
|
finishGpxImport(destinationExists, destination, color, show);
|
||||||
} finally {
|
} finally {
|
||||||
try {
|
try {
|
||||||
is.close();
|
is.close();
|
||||||
|
@ -713,9 +779,23 @@ public class OsmandAidlApi {
|
||||||
if (!Algorithms.isEmpty(fileName)) {
|
if (!Algorithms.isEmpty(fileName)) {
|
||||||
File f = app.getAppPath(IndexConstants.GPX_INDEX_DIR + fileName);
|
File f = app.getAppPath(IndexConstants.GPX_INDEX_DIR + fileName);
|
||||||
if (f.exists()) {
|
if (f.exists()) {
|
||||||
GPXFile gpx = GPXUtilities.loadGPXFile(app, f);
|
new AsyncTask<File, Void, GPXFile>() {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected GPXFile doInBackground(File... files) {
|
||||||
|
return GPXUtilities.loadGPXFile(app, files[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(GPXFile gpx) {
|
||||||
|
if (gpx.warning == null) {
|
||||||
app.getSelectedGpxHelper().selectGpxFile(gpx, true, false);
|
app.getSelectedGpxHelper().selectGpxFile(gpx, true, false);
|
||||||
refreshMap();
|
refreshMap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}.execute(f);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -227,11 +227,14 @@ public class OsmandAidlService extends Service {
|
||||||
public boolean importGpx(ImportGpxParams params) throws RemoteException {
|
public boolean importGpx(ImportGpxParams params) throws RemoteException {
|
||||||
if (params != null && !Algorithms.isEmpty(params.getDestinationPath())) {
|
if (params != null && !Algorithms.isEmpty(params.getDestinationPath())) {
|
||||||
if (params.getGpxFile() != null) {
|
if (params.getGpxFile() != null) {
|
||||||
return getApi().importGpxFromFile(params.getGpxFile(), params.getDestinationPath());
|
return getApi().importGpxFromFile(params.getGpxFile(), params.getDestinationPath(),
|
||||||
|
params.getColor(), params.isShow());
|
||||||
} else if (params.getGpxUri() != null) {
|
} else if (params.getGpxUri() != null) {
|
||||||
return getApi().importGpxFromUri(params.getGpxUri(), params.getDestinationPath());
|
return getApi().importGpxFromUri(params.getGpxUri(), params.getDestinationPath(),
|
||||||
|
params.getColor(), params.isShow());
|
||||||
} else if (params.getSourceRawData() != null) {
|
} else if (params.getSourceRawData() != null) {
|
||||||
return getApi().importGpxFromData(params.getSourceRawData(), params.getDestinationPath());
|
return getApi().importGpxFromData(params.getSourceRawData(), params.getDestinationPath(),
|
||||||
|
params.getColor(), params.isShow());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -12,20 +12,28 @@ public class ImportGpxParams implements Parcelable {
|
||||||
private Uri gpxUri;
|
private Uri gpxUri;
|
||||||
private String sourceRawData;
|
private String sourceRawData;
|
||||||
private String destinationPath;
|
private String destinationPath;
|
||||||
|
private String color;
|
||||||
|
private boolean show;
|
||||||
|
|
||||||
public ImportGpxParams(File gpxFile, String destinationPath) {
|
public ImportGpxParams(File gpxFile, String destinationPath, String color, boolean show) {
|
||||||
this.gpxFile = gpxFile;
|
this.gpxFile = gpxFile;
|
||||||
this.destinationPath = destinationPath;
|
this.destinationPath = destinationPath;
|
||||||
|
this.color = color;
|
||||||
|
this.show = show;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ImportGpxParams(Uri gpxUri, String destinationPath) {
|
public ImportGpxParams(Uri gpxUri, String destinationPath, String color, boolean show) {
|
||||||
this.gpxUri = gpxUri;
|
this.gpxUri = gpxUri;
|
||||||
this.destinationPath = destinationPath;
|
this.destinationPath = destinationPath;
|
||||||
|
this.color = color;
|
||||||
|
this.show = show;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ImportGpxParams(String sourceRawData, String destinationPath) {
|
public ImportGpxParams(String sourceRawData, String destinationPath, String color, boolean show) {
|
||||||
this.sourceRawData = sourceRawData;
|
this.sourceRawData = sourceRawData;
|
||||||
this.destinationPath = destinationPath;
|
this.destinationPath = destinationPath;
|
||||||
|
this.color = color;
|
||||||
|
this.show = show;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ImportGpxParams(Parcel in) {
|
public ImportGpxParams(Parcel in) {
|
||||||
|
@ -59,6 +67,14 @@ public class ImportGpxParams implements Parcelable {
|
||||||
return destinationPath;
|
return destinationPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getColor() {
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isShow() {
|
||||||
|
return show;
|
||||||
|
}
|
||||||
|
|
||||||
public void writeToParcel(Parcel out, int flags) {
|
public void writeToParcel(Parcel out, int flags) {
|
||||||
if (gpxFile != null) {
|
if (gpxFile != null) {
|
||||||
out.writeString(gpxFile.getAbsolutePath());
|
out.writeString(gpxFile.getAbsolutePath());
|
||||||
|
@ -68,6 +84,8 @@ public class ImportGpxParams implements Parcelable {
|
||||||
out.writeParcelable(gpxUri, flags);
|
out.writeParcelable(gpxUri, flags);
|
||||||
out.writeString(sourceRawData);
|
out.writeString(sourceRawData);
|
||||||
out.writeString(destinationPath);
|
out.writeString(destinationPath);
|
||||||
|
out.writeString(color);
|
||||||
|
out.writeByte((byte) (show ? 1 : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void readFromParcel(Parcel in) {
|
private void readFromParcel(Parcel in) {
|
||||||
|
@ -78,6 +96,8 @@ public class ImportGpxParams implements Parcelable {
|
||||||
gpxUri = in.readParcelable(Uri.class.getClassLoader());
|
gpxUri = in.readParcelable(Uri.class.getClassLoader());
|
||||||
sourceRawData = in.readString();
|
sourceRawData = in.readString();
|
||||||
destinationPath = in.readString();
|
destinationPath = in.readString();
|
||||||
|
color = in.readString();
|
||||||
|
show = in.readByte() == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int describeContents() {
|
public int describeContents() {
|
||||||
|
|
|
@ -13,7 +13,7 @@ import java.util.List;
|
||||||
public class GPXDatabase {
|
public class GPXDatabase {
|
||||||
|
|
||||||
private static final String DB_NAME = "gpx_database";
|
private static final String DB_NAME = "gpx_database";
|
||||||
private static final int DB_VERSION = 2;
|
private static final int DB_VERSION = 3;
|
||||||
private static final String GPX_TABLE_NAME = "gpxTable";
|
private static final String GPX_TABLE_NAME = "gpxTable";
|
||||||
private static final String GPX_COL_NAME = "fileName";
|
private static final String GPX_COL_NAME = "fileName";
|
||||||
private static final String GPX_COL_DIR = "fileDir";
|
private static final String GPX_COL_DIR = "fileDir";
|
||||||
|
@ -38,6 +38,7 @@ public class GPXDatabase {
|
||||||
private static final String GPX_COL_WPT_POINTS = "wptPoints";
|
private static final String GPX_COL_WPT_POINTS = "wptPoints";
|
||||||
|
|
||||||
private static final String GPX_COL_COLOR = "color";
|
private static final String GPX_COL_COLOR = "color";
|
||||||
|
private static final String GPX_COL_FILE_LAST_MODIFIED_TIME = "fileLastModifiedTime";
|
||||||
|
|
||||||
private static final String GPX_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " + GPX_TABLE_NAME + " (" +
|
private static final String GPX_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS " + GPX_TABLE_NAME + " (" +
|
||||||
GPX_COL_NAME + " TEXT, " +
|
GPX_COL_NAME + " TEXT, " +
|
||||||
|
@ -61,14 +62,30 @@ public class GPXDatabase {
|
||||||
|
|
||||||
GPX_COL_POINTS + " int, " +
|
GPX_COL_POINTS + " int, " +
|
||||||
GPX_COL_WPT_POINTS + " int, " +
|
GPX_COL_WPT_POINTS + " int, " +
|
||||||
GPX_COL_COLOR + " TEXT);";
|
GPX_COL_COLOR + " TEXT, " +
|
||||||
|
GPX_COL_FILE_LAST_MODIFIED_TIME + " long);";
|
||||||
|
|
||||||
private static final String GPX_TABLE_SELECT = "SELECT " + GPX_COL_NAME + ", " + GPX_COL_DIR + "," + GPX_COL_TOTAL_DISTANCE + ", " +
|
private static final String GPX_TABLE_SELECT = "SELECT " +
|
||||||
GPX_COL_TOTAL_TRACKS + ", " + GPX_COL_START_TIME + ", " + GPX_COL_END_TIME + ", " +
|
GPX_COL_NAME + ", " +
|
||||||
GPX_COL_TIME_SPAN + ", " + GPX_COL_TIME_MOVING + ", " + GPX_COL_TOTAL_DISTANCE_MOVING + ", " +
|
GPX_COL_DIR + "," +
|
||||||
GPX_COL_DIFF_ELEVATION_UP + ", " + GPX_COL_DIFF_ELEVATION_DOWN + ", " + GPX_COL_AVG_ELEVATION + ", " +
|
GPX_COL_TOTAL_DISTANCE + ", " +
|
||||||
GPX_COL_MIN_ELEVATION + ", " + GPX_COL_MAX_ELEVATION + ", " + GPX_COL_MAX_SPEED + ", " +
|
GPX_COL_TOTAL_TRACKS + ", " +
|
||||||
GPX_COL_AVG_SPEED + ", " + GPX_COL_POINTS + ", " + GPX_COL_WPT_POINTS + ", " + GPX_COL_COLOR +
|
GPX_COL_START_TIME + ", " +
|
||||||
|
GPX_COL_END_TIME + ", " +
|
||||||
|
GPX_COL_TIME_SPAN + ", " +
|
||||||
|
GPX_COL_TIME_MOVING + ", " +
|
||||||
|
GPX_COL_TOTAL_DISTANCE_MOVING + ", " +
|
||||||
|
GPX_COL_DIFF_ELEVATION_UP + ", " +
|
||||||
|
GPX_COL_DIFF_ELEVATION_DOWN + ", " +
|
||||||
|
GPX_COL_AVG_ELEVATION + ", " +
|
||||||
|
GPX_COL_MIN_ELEVATION + ", " +
|
||||||
|
GPX_COL_MAX_ELEVATION + ", " +
|
||||||
|
GPX_COL_MAX_SPEED + ", " +
|
||||||
|
GPX_COL_AVG_SPEED + ", " +
|
||||||
|
GPX_COL_POINTS + ", " +
|
||||||
|
GPX_COL_WPT_POINTS + ", " +
|
||||||
|
GPX_COL_COLOR + ", " +
|
||||||
|
GPX_COL_FILE_LAST_MODIFIED_TIME +
|
||||||
" FROM " + GPX_TABLE_NAME;
|
" FROM " + GPX_TABLE_NAME;
|
||||||
|
|
||||||
private OsmandApplication context;
|
private OsmandApplication context;
|
||||||
|
@ -77,12 +94,18 @@ public class GPXDatabase {
|
||||||
private File file;
|
private File file;
|
||||||
private GPXTrackAnalysis analysis;
|
private GPXTrackAnalysis analysis;
|
||||||
private int color;
|
private int color;
|
||||||
|
private long fileLastModifiedTime;
|
||||||
|
|
||||||
public GpxDataItem(File file, GPXTrackAnalysis analysis) {
|
public GpxDataItem(File file, GPXTrackAnalysis analysis) {
|
||||||
this.file = file;
|
this.file = file;
|
||||||
this.analysis = analysis;
|
this.analysis = analysis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public GpxDataItem(File file, int color) {
|
||||||
|
this.file = file;
|
||||||
|
this.color = color;
|
||||||
|
}
|
||||||
|
|
||||||
public File getFile() {
|
public File getFile() {
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
@ -95,8 +118,8 @@ public class GPXDatabase {
|
||||||
return color;
|
return color;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setColor(int color) {
|
public long getFileLastModifiedTime() {
|
||||||
this.color = color;
|
return fileLastModifiedTime;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,7 +140,6 @@ public class GPXDatabase {
|
||||||
onUpgrade(conn, conn.getVersion(), DB_VERSION);
|
onUpgrade(conn, conn.getVersion(), DB_VERSION);
|
||||||
}
|
}
|
||||||
conn.setVersion(DB_VERSION);
|
conn.setVersion(DB_VERSION);
|
||||||
|
|
||||||
}
|
}
|
||||||
return conn;
|
return conn;
|
||||||
}
|
}
|
||||||
|
@ -130,6 +152,33 @@ public class GPXDatabase {
|
||||||
if (oldVersion < 2) {
|
if (oldVersion < 2) {
|
||||||
db.execSQL("ALTER TABLE " + GPX_TABLE_NAME + " ADD " + GPX_COL_COLOR + " TEXT");
|
db.execSQL("ALTER TABLE " + GPX_TABLE_NAME + " ADD " + GPX_COL_COLOR + " TEXT");
|
||||||
}
|
}
|
||||||
|
if (oldVersion < 3) {
|
||||||
|
db.execSQL("ALTER TABLE " + GPX_TABLE_NAME + " ADD " + GPX_COL_FILE_LAST_MODIFIED_TIME + " long");
|
||||||
|
List<GpxDataItem> items = getItems();
|
||||||
|
for (GpxDataItem item : items) {
|
||||||
|
updateLastModifiedTime(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean updateLastModifiedTime(GpxDataItem item) {
|
||||||
|
SQLiteConnection db = openConnection(false);
|
||||||
|
if (db != null) {
|
||||||
|
try {
|
||||||
|
String fileName = getFileName(item.file);
|
||||||
|
String fileDir = getFileDir(item.file);
|
||||||
|
long fileLastModifiedTime = item.file.lastModified();
|
||||||
|
db.execSQL("UPDATE " + GPX_TABLE_NAME + " SET " +
|
||||||
|
GPX_COL_FILE_LAST_MODIFIED_TIME + " = ? " +
|
||||||
|
" WHERE " + GPX_COL_NAME + " = ? AND " + GPX_COL_DIR + " = ?",
|
||||||
|
new Object[] { fileLastModifiedTime, fileName, fileDir });
|
||||||
|
item.fileLastModifiedTime = fileLastModifiedTime;
|
||||||
|
} finally {
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean rename(File currentFile, File newFile) {
|
public boolean rename(File currentFile, File newFile) {
|
||||||
|
@ -163,7 +212,7 @@ public class GPXDatabase {
|
||||||
GPX_COL_COLOR + " = ? " +
|
GPX_COL_COLOR + " = ? " +
|
||||||
" WHERE " + GPX_COL_NAME + " = ? AND " + GPX_COL_DIR + " = ?",
|
" WHERE " + GPX_COL_NAME + " = ? AND " + GPX_COL_DIR + " = ?",
|
||||||
new Object[] { (color == 0 ? "" : Algorithms.colorToString(color)), fileName, fileDir });
|
new Object[] { (color == 0 ? "" : Algorithms.colorToString(color)), fileName, fileDir });
|
||||||
item.setColor(color);
|
item.color = color;
|
||||||
} finally {
|
} finally {
|
||||||
db.close();
|
db.close();
|
||||||
}
|
}
|
||||||
|
@ -225,11 +274,57 @@ public class GPXDatabase {
|
||||||
} else {
|
} else {
|
||||||
color = Algorithms.colorToString(item.color);
|
color = Algorithms.colorToString(item.color);
|
||||||
}
|
}
|
||||||
|
if (a != null) {
|
||||||
db.execSQL(
|
db.execSQL(
|
||||||
"INSERT INTO " + GPX_TABLE_NAME + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
"INSERT INTO " + GPX_TABLE_NAME + " VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
|
||||||
new Object[]{ fileName, fileDir, a.totalDistance, a.totalTracks, a.startTime, a.endTime,
|
new Object[]{ fileName, fileDir, a.totalDistance, a.totalTracks, a.startTime, a.endTime,
|
||||||
a.timeSpan, a.timeMoving, a.totalDistanceMoving, a.diffElevationUp, a.diffElevationDown,
|
a.timeSpan, a.timeMoving, a.totalDistanceMoving, a.diffElevationUp, a.diffElevationDown,
|
||||||
a.avgElevation, a.minElevation, a.maxElevation, a.maxSpeed, a.avgSpeed, a.points, a.wptPoints, color });
|
a.avgElevation, a.minElevation, a.maxElevation, a.maxSpeed, a.avgSpeed, a.points, a.wptPoints,
|
||||||
|
color, item.file.lastModified() });
|
||||||
|
} else {
|
||||||
|
db.execSQL(
|
||||||
|
"INSERT INTO " + GPX_TABLE_NAME + "(" + GPX_COL_NAME + ", " + GPX_COL_DIR + ", " +
|
||||||
|
GPX_COL_COLOR + ", " + GPX_COL_FILE_LAST_MODIFIED_TIME + ") VALUES (?, ?, ?, ?)",
|
||||||
|
new Object[]{ fileName, fileDir, color, 0 });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean updateAnalysis(GpxDataItem item, GPXTrackAnalysis a) {
|
||||||
|
SQLiteConnection db = openConnection(false);
|
||||||
|
if (db != null && a != null) {
|
||||||
|
try {
|
||||||
|
String fileName = getFileName(item.file);
|
||||||
|
String fileDir = getFileDir(item.file);
|
||||||
|
db.execSQL("UPDATE " + GPX_TABLE_NAME + " SET " +
|
||||||
|
GPX_COL_TOTAL_DISTANCE + " = ?, " +
|
||||||
|
GPX_COL_TOTAL_TRACKS + " = ?, " +
|
||||||
|
GPX_COL_START_TIME + " = ?, " +
|
||||||
|
GPX_COL_END_TIME + " = ?, " +
|
||||||
|
GPX_COL_TIME_SPAN + " = ?, " +
|
||||||
|
GPX_COL_TIME_MOVING + " = ?, " +
|
||||||
|
GPX_COL_TOTAL_DISTANCE_MOVING + " = ?, " +
|
||||||
|
GPX_COL_DIFF_ELEVATION_UP + " = ?, " +
|
||||||
|
GPX_COL_DIFF_ELEVATION_DOWN + " = ?, " +
|
||||||
|
GPX_COL_AVG_ELEVATION + " = ?, " +
|
||||||
|
GPX_COL_MIN_ELEVATION + " = ?, " +
|
||||||
|
GPX_COL_MAX_ELEVATION + " = ?, " +
|
||||||
|
GPX_COL_MAX_SPEED + " = ?, " +
|
||||||
|
GPX_COL_AVG_SPEED + " = ?, " +
|
||||||
|
GPX_COL_POINTS + " = ?, " +
|
||||||
|
GPX_COL_WPT_POINTS + " = ?, " +
|
||||||
|
GPX_COL_FILE_LAST_MODIFIED_TIME + " = ? " +
|
||||||
|
" WHERE " + GPX_COL_NAME + " = ? AND " + GPX_COL_DIR + " = ?",
|
||||||
|
new Object[]{ a.totalDistance, a.totalTracks, a.startTime, a.endTime,
|
||||||
|
a.timeSpan, a.timeMoving, a.totalDistanceMoving, a.diffElevationUp,
|
||||||
|
a.diffElevationDown, a.avgElevation, a.minElevation, a.maxElevation,
|
||||||
|
a.maxSpeed, a.avgSpeed, a.points, a.wptPoints, item.file.lastModified(),
|
||||||
|
fileName, fileDir });
|
||||||
|
} finally {
|
||||||
|
db.close();
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private GpxDataItem readItem(SQLiteCursor query) {
|
private GpxDataItem readItem(SQLiteCursor query) {
|
||||||
|
@ -252,6 +347,7 @@ public class GPXDatabase {
|
||||||
int points = (int)query.getInt(16);
|
int points = (int)query.getInt(16);
|
||||||
int wptPoints = (int)query.getInt(17);
|
int wptPoints = (int)query.getInt(17);
|
||||||
String color = query.getString(18);
|
String color = query.getString(18);
|
||||||
|
long fileLastModifiedTime = query.getLong(19);
|
||||||
|
|
||||||
GPXTrackAnalysis a = new GPXTrackAnalysis();
|
GPXTrackAnalysis a = new GPXTrackAnalysis();
|
||||||
a.totalDistance = totalDistance;
|
a.totalDistance = totalDistance;
|
||||||
|
@ -280,10 +376,11 @@ public class GPXDatabase {
|
||||||
}
|
}
|
||||||
GpxDataItem item = new GpxDataItem(new File(dir, fileName), a);
|
GpxDataItem item = new GpxDataItem(new File(dir, fileName), a);
|
||||||
try {
|
try {
|
||||||
item.setColor(Algorithms.isEmpty(color) ? 0 : Algorithms.parseColor(color));
|
item.color = Algorithms.isEmpty(color) ? 0 : Algorithms.parseColor(color);
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
item.setColor(0);
|
item.color = 0;
|
||||||
}
|
}
|
||||||
|
item.fileLastModifiedTime = fileLastModifiedTime;
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,7 @@ import net.osmand.data.PointDescription;
|
||||||
import net.osmand.plus.ContextMenuAdapter;
|
import net.osmand.plus.ContextMenuAdapter;
|
||||||
import net.osmand.plus.ContextMenuAdapter.ItemClickListener;
|
import net.osmand.plus.ContextMenuAdapter.ItemClickListener;
|
||||||
import net.osmand.plus.ContextMenuItem;
|
import net.osmand.plus.ContextMenuItem;
|
||||||
|
import net.osmand.plus.GPXDatabase;
|
||||||
import net.osmand.plus.GPXDatabase.GpxDataItem;
|
import net.osmand.plus.GPXDatabase.GpxDataItem;
|
||||||
import net.osmand.plus.GPXUtilities;
|
import net.osmand.plus.GPXUtilities;
|
||||||
import net.osmand.plus.GPXUtilities.GPXFile;
|
import net.osmand.plus.GPXUtilities.GPXFile;
|
||||||
|
@ -86,6 +87,7 @@ import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
import java.util.LinkedHashSet;
|
import java.util.LinkedHashSet;
|
||||||
|
@ -1511,12 +1513,13 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment {
|
||||||
|
|
||||||
public class ProcessGpxTask extends AsyncTask<Void, GpxDataItem, Void> {
|
public class ProcessGpxTask extends AsyncTask<Void, GpxDataItem, Void> {
|
||||||
|
|
||||||
private List<File> processedDataFiles = new ArrayList<>();
|
private Map<File, GpxDataItem> processedDataFiles = new HashMap<>();
|
||||||
|
private GPXDatabase db = app.getGpxDatabase();
|
||||||
|
|
||||||
ProcessGpxTask() {
|
ProcessGpxTask() {
|
||||||
List<GpxDataItem> dataItems = app.getGpxDatabase().getItems();
|
List<GpxDataItem> dataItems = db.getItems();
|
||||||
for (GpxDataItem item : dataItems) {
|
for (GpxDataItem item : dataItems) {
|
||||||
processedDataFiles.add(item.getFile());
|
processedDataFiles.put(item.getFile(), item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1545,18 +1548,24 @@ public class AvailableGPXFragment extends OsmandExpandableListFragment {
|
||||||
String sub = gpxSubfolder.length() == 0 ?
|
String sub = gpxSubfolder.length() == 0 ?
|
||||||
gpxFile.getName() : gpxSubfolder + "/" + gpxFile.getName();
|
gpxFile.getName() : gpxSubfolder + "/" + gpxFile.getName();
|
||||||
processGPXFolder(gpxFile, sub);
|
processGPXFolder(gpxFile, sub);
|
||||||
} else if (gpxFile.isFile() && gpxFile.getName().toLowerCase().endsWith(".gpx") && !processedDataFiles.contains(gpxFile)) {
|
} else if (gpxFile.isFile() && gpxFile.getName().toLowerCase().endsWith(".gpx")) {
|
||||||
|
GpxDataItem item = processedDataFiles.get(gpxFile);
|
||||||
|
if (item == null || item.getFileLastModifiedTime() != gpxFile.lastModified()) {
|
||||||
GPXFile f = GPXUtilities.loadGPXFile(app, gpxFile);
|
GPXFile f = GPXUtilities.loadGPXFile(app, gpxFile);
|
||||||
GPXTrackAnalysis analysis = f.getAnalysis(gpxFile.lastModified());
|
GPXTrackAnalysis analysis = f.getAnalysis(gpxFile.lastModified());
|
||||||
GpxDataItem newItem = new GpxDataItem(gpxFile, analysis);
|
if (item == null) {
|
||||||
app.getGpxDatabase().add(newItem);
|
item = new GpxDataItem(gpxFile, analysis);
|
||||||
|
db.add(item);
|
||||||
|
} else {
|
||||||
|
db.updateAnalysis(item, analysis);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
processedDataFiles.put(gpxFile, item);
|
||||||
|
publishProgress(item);
|
||||||
|
}
|
||||||
if (isCancelled()) {
|
if (isCancelled()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
processedDataFiles.add(gpxFile);
|
|
||||||
publishProgress(newItem);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue