Merge pull request #10004 from osmandapp/Obsolete-import-duplication

Obsolete 'Import' duplication of GPX files
This commit is contained in:
Vitaliy 2020-10-11 23:25:17 +03:00 committed by GitHub
commit b7520a5134
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 104 additions and 38 deletions

View file

@ -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>

View file

@ -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();
}
})

View file

@ -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);
}
}

View file

@ -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);
}
}

View file

@ -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()

View file

@ -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;

View file

@ -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);
}
}