Merge pull request #10004 from osmandapp/Obsolete-import-duplication
Obsolete 'Import' duplication of GPX files
This commit is contained in:
commit
b7520a5134
7 changed files with 104 additions and 38 deletions
|
@ -11,6 +11,7 @@
|
|||
Thx - Hardy
|
||||
|
||||
-->
|
||||
<string name="file_already_imported">File is already imported in OsmAnd</string>
|
||||
<string name="osm_edit_logout_success">Logout successful</string>
|
||||
<string name="clear_osm_token">Clear OpenStreetMap OAuth token</string>
|
||||
<string name="perform_oauth_authorization">Log in via OAuth</string>
|
||||
|
|
|
@ -23,6 +23,8 @@ public class ImportGpxBottomSheetDialogFragment extends MenuBottomSheetDialogFra
|
|||
|
||||
private GPXFile gpxFile;
|
||||
private String fileName;
|
||||
private long fileSize;
|
||||
|
||||
private boolean save;
|
||||
private boolean useImportDir;
|
||||
|
||||
|
@ -38,6 +40,10 @@ public class ImportGpxBottomSheetDialogFragment extends MenuBottomSheetDialogFra
|
|||
this.fileName = fileName;
|
||||
}
|
||||
|
||||
public void setFileSize(long fileSize) {
|
||||
this.fileSize = fileSize;
|
||||
}
|
||||
|
||||
public void setSave(boolean save) {
|
||||
this.save = save;
|
||||
}
|
||||
|
@ -84,7 +90,7 @@ public class ImportGpxBottomSheetDialogFragment extends MenuBottomSheetDialogFra
|
|||
.setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
importHelper.handleGpxImport(gpxFile, fileName, save, useImportDir);
|
||||
importHelper.handleGpxImport(gpxFile, fileName, fileSize, save, useImportDir);
|
||||
dismiss();
|
||||
}
|
||||
})
|
||||
|
|
|
@ -10,6 +10,7 @@ import net.osmand.GPXUtilities.GPXFile;
|
|||
import net.osmand.util.Algorithms;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
class GpxImportTask extends BaseImportAsyncTask<Void, Void, GPXFile> {
|
||||
|
@ -17,13 +18,15 @@ class GpxImportTask extends BaseImportAsyncTask<Void, Void, GPXFile> {
|
|||
private ImportHelper importHelper;
|
||||
private Uri gpxFile;
|
||||
private String fileName;
|
||||
private long fileSize;
|
||||
|
||||
private boolean save;
|
||||
private boolean useImportDir;
|
||||
private boolean showInDetailsActivity;
|
||||
|
||||
public GpxImportTask(@NonNull ImportHelper importHelper, @NonNull FragmentActivity activity,
|
||||
@NonNull Uri gpxFile, @NonNull String fileName, boolean save, boolean useImportDir,
|
||||
boolean showInDetailsActivity) {
|
||||
@NonNull Uri gpxFile, @NonNull String fileName, boolean save, boolean useImportDir,
|
||||
boolean showInDetailsActivity) {
|
||||
super(activity);
|
||||
this.importHelper = importHelper;
|
||||
this.gpxFile = gpxFile;
|
||||
|
@ -39,10 +42,13 @@ class GpxImportTask extends BaseImportAsyncTask<Void, Void, GPXFile> {
|
|||
try {
|
||||
is = app.getContentResolver().openInputStream(gpxFile);
|
||||
if (is != null) {
|
||||
fileSize = is.available();
|
||||
return GPXUtilities.loadGPXFile(is);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
//
|
||||
} catch (IOException e) {
|
||||
ImportHelper.log.error(e.getMessage(), e);
|
||||
} catch (SecurityException e) {
|
||||
ImportHelper.log.error(e.getMessage(), e);
|
||||
} finally {
|
||||
|
@ -54,6 +60,6 @@ class GpxImportTask extends BaseImportAsyncTask<Void, Void, GPXFile> {
|
|||
@Override
|
||||
protected void onPostExecute(GPXFile result) {
|
||||
hideProgress();
|
||||
importHelper.handleResult(result, fileName, save, useImportDir, false, showInDetailsActivity);
|
||||
importHelper.handleResult(result, fileName, fileSize, save, useImportDir, false, showInDetailsActivity);
|
||||
}
|
||||
}
|
|
@ -10,25 +10,28 @@ import net.osmand.GPXUtilities.GPXFile;
|
|||
import net.osmand.util.Algorithms;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipInputStream;
|
||||
|
||||
import static net.osmand.plus.importfiles.KmlImportTask.loadGpxFromKml;
|
||||
import static net.osmand.plus.importfiles.KmlImportTask.convertKmlToGpxStream;
|
||||
|
||||
class GpxOrFavouritesImportTask extends BaseImportAsyncTask<Void, Void, GPXFile> {
|
||||
|
||||
private ImportHelper importHelper;
|
||||
private Uri fileUri;
|
||||
private String fileName;
|
||||
private long fileSize;
|
||||
|
||||
private boolean save;
|
||||
private boolean useImportDir;
|
||||
private boolean forceImportFavourites;
|
||||
private boolean forceImportGpx;
|
||||
private boolean forceImportFavourites;
|
||||
|
||||
public GpxOrFavouritesImportTask(@NonNull ImportHelper importHelper, @NonNull FragmentActivity activity,
|
||||
@NonNull Uri fileUri, String fileName, boolean save, boolean useImportDir,
|
||||
boolean forceImportFavourites, boolean forceImportGpx) {
|
||||
@NonNull Uri fileUri, String fileName, boolean save, boolean useImportDir,
|
||||
boolean forceImportFavourites, boolean forceImportGpx) {
|
||||
super(activity);
|
||||
this.importHelper = importHelper;
|
||||
this.fileUri = fileUri;
|
||||
|
@ -46,15 +49,24 @@ class GpxOrFavouritesImportTask extends BaseImportAsyncTask<Void, Void, GPXFile>
|
|||
try {
|
||||
is = app.getContentResolver().openInputStream(fileUri);
|
||||
if (is != null) {
|
||||
fileSize = is.available();
|
||||
if (fileName != null && fileName.endsWith(ImportHelper.KML_SUFFIX)) {
|
||||
return loadGpxFromKml(is);
|
||||
InputStream gpxStream = convertKmlToGpxStream(is);
|
||||
if (gpxStream != null) {
|
||||
fileSize = gpxStream.available();
|
||||
return GPXUtilities.loadGPXFile(gpxStream);
|
||||
}
|
||||
} else if (fileName != null && fileName.endsWith(ImportHelper.KMZ_SUFFIX)) {
|
||||
try {
|
||||
zis = new ZipInputStream(is);
|
||||
ZipEntry entry;
|
||||
while ((entry = zis.getNextEntry()) != null) {
|
||||
if (entry.getName().endsWith(ImportHelper.KML_SUFFIX)) {
|
||||
return loadGpxFromKml(zis);
|
||||
InputStream gpxStream = convertKmlToGpxStream(is);
|
||||
if (gpxStream != null) {
|
||||
fileSize = gpxStream.available();
|
||||
return GPXUtilities.loadGPXFile(gpxStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
@ -66,6 +78,8 @@ class GpxOrFavouritesImportTask extends BaseImportAsyncTask<Void, Void, GPXFile>
|
|||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
//
|
||||
} catch (IOException e) {
|
||||
ImportHelper.log.error(e.getMessage(), e);
|
||||
} catch (SecurityException e) {
|
||||
ImportHelper.log.error(e.getMessage(), e);
|
||||
} finally {
|
||||
|
@ -78,6 +92,6 @@ class GpxOrFavouritesImportTask extends BaseImportAsyncTask<Void, Void, GPXFile>
|
|||
@Override
|
||||
protected void onPostExecute(GPXFile result) {
|
||||
hideProgress();
|
||||
importHelper.importGpxOrFavourites(result, fileName, save, useImportDir, forceImportFavourites, forceImportGpx);
|
||||
importHelper.importGpxOrFavourites(result, fileName, fileSize, save, useImportDir, forceImportFavourites, forceImportGpx);
|
||||
}
|
||||
}
|
|
@ -31,6 +31,8 @@ import net.osmand.plus.activities.ActivityResultListener;
|
|||
import net.osmand.plus.activities.MapActivity;
|
||||
import net.osmand.plus.activities.TrackActivity;
|
||||
import net.osmand.plus.dialogs.ImportGpxBottomSheetDialogFragment;
|
||||
import net.osmand.plus.helpers.GpxUiHelper;
|
||||
import net.osmand.plus.helpers.GpxUiHelper.GPXInfo;
|
||||
import net.osmand.plus.measurementtool.MeasurementToolFragment;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper;
|
||||
import net.osmand.plus.settings.backend.SettingsHelper.SettingsItem;
|
||||
|
@ -128,8 +130,8 @@ public class ImportHelper {
|
|||
importFavoritesImpl(gpxFile, fileName, false);
|
||||
}
|
||||
|
||||
public void handleGpxImport(GPXFile result, String name, boolean save, boolean useImportDir) {
|
||||
handleResult(result, name, save, useImportDir, false);
|
||||
public void handleGpxImport(GPXFile result, String name, long fileSize, boolean save, boolean useImportDir) {
|
||||
handleResult(result, name, fileSize, save, useImportDir, false);
|
||||
}
|
||||
|
||||
public boolean handleGpxImport(final Uri contentUri, final boolean useImportDir) {
|
||||
|
@ -387,12 +389,12 @@ public class ImportHelper {
|
|||
return intent;
|
||||
}
|
||||
|
||||
protected void handleResult(GPXFile result, String name, boolean save,
|
||||
protected void handleResult(GPXFile result, String name, long fileSize, boolean save,
|
||||
boolean useImportDir, boolean forceImportFavourites) {
|
||||
handleResult(result, name, save, useImportDir, forceImportFavourites, true);
|
||||
handleResult(result, name, fileSize, save, useImportDir, forceImportFavourites, true);
|
||||
}
|
||||
|
||||
protected void handleResult(final GPXFile result, final String name, final boolean save,
|
||||
protected void handleResult(final GPXFile result, final String name, long fileSize, final boolean save,
|
||||
final boolean useImportDir, boolean forceImportFavourites, boolean showInDetailsActivity) {
|
||||
if (result != null) {
|
||||
if (result.error != null) {
|
||||
|
@ -402,9 +404,15 @@ public class ImportHelper {
|
|||
}
|
||||
} else {
|
||||
if (save) {
|
||||
executeImportTask(new SaveAsyncTask(result, name, useImportDir, showInDetailsActivity));
|
||||
String existingFilePath = getExistingFilePath(name, fileSize);
|
||||
if (existingFilePath != null) {
|
||||
app.showToastMessage(R.string.file_already_imported);
|
||||
showGpxInDetailsActivity(existingFilePath);
|
||||
} else {
|
||||
executeImportTask(new SaveAsyncTask(result, name, useImportDir, showInDetailsActivity));
|
||||
}
|
||||
} else {
|
||||
showGpxInDetailsActivity(result);
|
||||
showGpxInDetailsActivity(result.path);
|
||||
}
|
||||
if (gpxImportCompleteListener != null) {
|
||||
gpxImportCompleteListener.onImportComplete(true);
|
||||
|
@ -445,6 +453,20 @@ public class ImportHelper {
|
|||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private String getExistingFilePath(String name, long fileSize) {
|
||||
File dir = app.getAppPath(GPX_INDEX_DIR);
|
||||
List<GPXInfo> gpxInfoList = GpxUiHelper.getSortedGPXFilesInfoByDate(dir, true);
|
||||
for (GPXInfo gpxInfo : gpxInfoList) {
|
||||
String fileName = gpxInfo.getFileName();
|
||||
String nameWithoutDirs = Algorithms.getFileWithoutDirs(fileName);
|
||||
if (nameWithoutDirs.equals(name) && gpxInfo.getFileSize() == fileSize) {
|
||||
return fileName;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private String saveImport(final GPXFile gpxFile, final String fileName, final boolean useImportDir) {
|
||||
final String warning;
|
||||
|
||||
|
@ -531,7 +553,7 @@ public class ImportHelper {
|
|||
}
|
||||
if (success) {
|
||||
if (showInDetailsActivity) {
|
||||
showGpxInDetailsActivity(result);
|
||||
showGpxInDetailsActivity(result.path);
|
||||
} else {
|
||||
showPlanRouteFragment();
|
||||
}
|
||||
|
@ -553,10 +575,10 @@ public class ImportHelper {
|
|||
}
|
||||
}
|
||||
|
||||
private void showGpxInDetailsActivity(final GPXFile gpxFile) {
|
||||
if (gpxFile.path != null) {
|
||||
private void showGpxInDetailsActivity(String gpxFilePath) {
|
||||
if (!Algorithms.isEmpty(gpxFilePath)) {
|
||||
Intent newIntent = new Intent(activity, app.getAppCustomization().getTrackActivity());
|
||||
newIntent.putExtra(TrackActivity.TRACK_FILE_NAME, gpxFile.path);
|
||||
newIntent.putExtra(TrackActivity.TRACK_FILE_NAME, gpxFilePath);
|
||||
newIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
activity.startActivity(newIntent);
|
||||
}
|
||||
|
@ -576,9 +598,9 @@ public class ImportHelper {
|
|||
}
|
||||
}
|
||||
|
||||
protected void importGpxOrFavourites(final GPXFile gpxFile, final String fileName, final boolean save,
|
||||
final boolean useImportDir, final boolean forceImportFavourites,
|
||||
final boolean forceImportGpx) {
|
||||
protected void importGpxOrFavourites(final GPXFile gpxFile, final String fileName, final long fileSize,
|
||||
final boolean save, final boolean useImportDir,
|
||||
final boolean forceImportFavourites, final boolean forceImportGpx) {
|
||||
if (gpxFile == null || gpxFile.isPointsEmpty()) {
|
||||
if (forceImportFavourites) {
|
||||
final DialogInterface.OnClickListener importAsTrackListener = new DialogInterface.OnClickListener() {
|
||||
|
@ -586,7 +608,7 @@ public class ImportHelper {
|
|||
public void onClick(DialogInterface dialog, int which) {
|
||||
switch (which) {
|
||||
case DialogInterface.BUTTON_POSITIVE:
|
||||
handleResult(gpxFile, fileName, save, useImportDir, true);
|
||||
handleResult(gpxFile, fileName, fileSize, save, useImportDir, true);
|
||||
break;
|
||||
case DialogInterface.BUTTON_NEGATIVE:
|
||||
dialog.dismiss();
|
||||
|
@ -602,7 +624,7 @@ public class ImportHelper {
|
|||
.setNegativeButton(R.string.shared_string_cancel, importAsTrackListener)
|
||||
.show();
|
||||
} else {
|
||||
handleResult(gpxFile, fileName, save, useImportDir, false);
|
||||
handleResult(gpxFile, fileName, fileSize, save, useImportDir, false);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
@ -611,13 +633,14 @@ public class ImportHelper {
|
|||
importFavoritesImpl(gpxFile, fileName, true);
|
||||
} else if (fileName != null) {
|
||||
if (forceImportGpx) {
|
||||
handleResult(gpxFile, fileName, save, useImportDir, false);
|
||||
handleResult(gpxFile, fileName, fileSize, save, useImportDir, false);
|
||||
} else {
|
||||
ImportGpxBottomSheetDialogFragment fragment = new ImportGpxBottomSheetDialogFragment();
|
||||
fragment.setUsedOnMap(true);
|
||||
fragment.setImportHelper(this);
|
||||
fragment.setGpxFile(gpxFile);
|
||||
fragment.setFileName(fileName);
|
||||
fragment.setFileSize(fileSize);
|
||||
fragment.setSave(save);
|
||||
fragment.setUseImportDir(useImportDir);
|
||||
activity.getSupportFragmentManager().beginTransaction()
|
||||
|
|
|
@ -12,6 +12,7 @@ import net.osmand.util.Algorithms;
|
|||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
|
||||
|
@ -20,11 +21,13 @@ class KmlImportTask extends BaseImportAsyncTask<Void, Void, GPXFile> {
|
|||
private ImportHelper importHelper;
|
||||
private Uri uri;
|
||||
private String name;
|
||||
private long fileSize;
|
||||
|
||||
private boolean save;
|
||||
private boolean useImportDir;
|
||||
|
||||
public KmlImportTask(@NonNull ImportHelper importHelper, @NonNull FragmentActivity activity,
|
||||
@NonNull Uri uri, String name, boolean save, boolean useImportDir) {
|
||||
@NonNull Uri uri, String name, boolean save, boolean useImportDir) {
|
||||
super(activity);
|
||||
this.importHelper = importHelper;
|
||||
this.uri = uri;
|
||||
|
@ -39,12 +42,18 @@ class KmlImportTask extends BaseImportAsyncTask<Void, Void, GPXFile> {
|
|||
try {
|
||||
is = app.getContentResolver().openInputStream(uri);
|
||||
if (is != null) {
|
||||
return loadGpxFromKml(is);
|
||||
InputStream gpxStream = convertKmlToGpxStream(is);
|
||||
if (gpxStream != null) {
|
||||
fileSize = gpxStream.available();
|
||||
return GPXUtilities.loadGPXFile(gpxStream);
|
||||
}
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
//
|
||||
} catch (SecurityException e) {
|
||||
ImportHelper.log.error(e.getMessage(), e);
|
||||
} catch (IOException e) {
|
||||
ImportHelper.log.error(e.getMessage(), e);
|
||||
} finally {
|
||||
Algorithms.closeStream(is);
|
||||
}
|
||||
|
@ -54,16 +63,16 @@ class KmlImportTask extends BaseImportAsyncTask<Void, Void, GPXFile> {
|
|||
@Override
|
||||
protected void onPostExecute(GPXFile result) {
|
||||
hideProgress();
|
||||
importHelper.handleResult(result, name, save, useImportDir, false);
|
||||
importHelper.handleResult(result, name, fileSize, save, useImportDir, false);
|
||||
}
|
||||
|
||||
protected static GPXFile loadGpxFromKml(@NonNull InputStream is) {
|
||||
protected static InputStream convertKmlToGpxStream(@NonNull InputStream is) {
|
||||
String result = Kml2Gpx.toGpx(is);
|
||||
if (result != null) {
|
||||
try {
|
||||
return GPXUtilities.loadGPXFile(new ByteArrayInputStream(result.getBytes("UTF-8")));
|
||||
return new ByteArrayInputStream(result.getBytes("UTF-8"));
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
return null;
|
||||
ImportHelper.log.error(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
|
|
|
@ -5,6 +5,7 @@ import android.net.Uri;
|
|||
import androidx.annotation.NonNull;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
|
||||
import net.osmand.GPXUtilities;
|
||||
import net.osmand.GPXUtilities.GPXFile;
|
||||
import net.osmand.util.Algorithms;
|
||||
|
||||
|
@ -13,18 +14,20 @@ import java.util.zip.ZipEntry;
|
|||
import java.util.zip.ZipInputStream;
|
||||
|
||||
import static net.osmand.plus.importfiles.ImportHelper.KML_SUFFIX;
|
||||
import static net.osmand.plus.importfiles.KmlImportTask.loadGpxFromKml;
|
||||
import static net.osmand.plus.importfiles.KmlImportTask.convertKmlToGpxStream;
|
||||
|
||||
class KmzImportTask extends BaseImportAsyncTask<Void, Void, GPXFile> {
|
||||
|
||||
private ImportHelper importHelper;
|
||||
private Uri uri;
|
||||
private String name;
|
||||
private long fileSize;
|
||||
|
||||
private boolean save;
|
||||
private boolean useImportDir;
|
||||
|
||||
public KmzImportTask(@NonNull ImportHelper importHelper, @NonNull FragmentActivity activity,
|
||||
@NonNull Uri uri, @NonNull String name, boolean save, boolean useImportDir) {
|
||||
@NonNull Uri uri, @NonNull String name, boolean save, boolean useImportDir) {
|
||||
super(activity);
|
||||
this.importHelper = importHelper;
|
||||
this.uri = uri;
|
||||
|
@ -45,7 +48,11 @@ class KmzImportTask extends BaseImportAsyncTask<Void, Void, GPXFile> {
|
|||
ZipEntry entry;
|
||||
while ((entry = zis.getNextEntry()) != null) {
|
||||
if (entry.getName().endsWith(KML_SUFFIX)) {
|
||||
return loadGpxFromKml(is);
|
||||
InputStream gpxStream = convertKmlToGpxStream(is);
|
||||
if (gpxStream != null) {
|
||||
fileSize = gpxStream.available();
|
||||
return GPXUtilities.loadGPXFile(gpxStream);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -61,6 +68,6 @@ class KmzImportTask extends BaseImportAsyncTask<Void, Void, GPXFile> {
|
|||
@Override
|
||||
protected void onPostExecute(GPXFile result) {
|
||||
hideProgress();
|
||||
importHelper.handleResult(result, name, save, useImportDir, false);
|
||||
importHelper.handleResult(result, name, fileSize, save, useImportDir, false);
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue