diff --git a/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java b/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java
index cd35c0a8ee..338bb9089e 100644
--- a/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java
+++ b/OsmAnd-java/src/main/java/net/osmand/util/Algorithms.java
@@ -250,6 +250,32 @@ public class Algorithms {
return test == 0x504b0304;
}
+ /**
+ * Checks, whether the child directory is a subdirectory of the parent
+ * directory.
+ *
+ * @param parent the parent directory.
+ * @param child the suspected child directory.
+ * @return true if the child is a subdirectory of the parent directory.
+ */
+ public static boolean isSubDirectory(File parent, File child) {
+ try {
+ parent = parent.getCanonicalFile();
+ child = child.getCanonicalFile();
+
+ File dir = child;
+ while (dir != null) {
+ if (parent.equals(dir)) {
+ return true;
+ }
+ dir = dir.getParentFile();
+ }
+ } catch (IOException e) {
+ return false;
+ }
+ return false;
+ }
+
private static int readInt(InputStream in) throws IOException {
int ch1 = in.read();
int ch2 = in.read();
diff --git a/OsmAnd/res/values/strings.xml b/OsmAnd/res/values/strings.xml
index c59d5301a9..1973a0cee4 100644
--- a/OsmAnd/res/values/strings.xml
+++ b/OsmAnd/res/values/strings.xml
@@ -10,7 +10,9 @@
- For wording and consistency, please note https://osmand.net/help-online?id=technical-articles#Creating_a_Consistent_User_Experience
Thx - Hardy
---> World overview map (detailed)
+-->
+ Unsupported type
+ World overview map (detailed)
Could not find any such profiles.
Change app profile
Add profile
diff --git a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java
index 933cf09a48..75330977de 100644
--- a/OsmAnd/src/net/osmand/plus/activities/MapActivity.java
+++ b/OsmAnd/src/net/osmand/plus/activities/MapActivity.java
@@ -101,7 +101,7 @@ import net.osmand.plus.firstusage.FirstUsageWizardFragment;
import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.helpers.DiscountHelper;
import net.osmand.plus.helpers.ImportHelper;
-import net.osmand.plus.helpers.ImportHelper.ImportGpxBottomSheetDialogFragment;
+import net.osmand.plus.dialogs.ImportGpxBottomSheetDialogFragment;
import net.osmand.plus.helpers.IntentHelper;
import net.osmand.plus.helpers.LockHelper;
import net.osmand.plus.helpers.LockHelper.LockUIAdapter;
diff --git a/OsmAnd/src/net/osmand/plus/dialogs/ImportGpxBottomSheetDialogFragment.java b/OsmAnd/src/net/osmand/plus/dialogs/ImportGpxBottomSheetDialogFragment.java
new file mode 100644
index 0000000000..cf371f006e
--- /dev/null
+++ b/OsmAnd/src/net/osmand/plus/dialogs/ImportGpxBottomSheetDialogFragment.java
@@ -0,0 +1,94 @@
+package net.osmand.plus.dialogs;
+
+import android.os.Bundle;
+import android.text.style.ForegroundColorSpan;
+import android.view.View;
+
+import net.osmand.AndroidUtils;
+import net.osmand.GPXUtilities.GPXFile;
+import net.osmand.plus.R;
+import net.osmand.plus.base.MenuBottomSheetDialogFragment;
+import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
+import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem;
+import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerHalfItem;
+import net.osmand.plus.base.bottomsheetmenu.simpleitems.ShortDescriptionItem;
+import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem;
+import net.osmand.plus.helpers.ImportHelper;
+
+public class ImportGpxBottomSheetDialogFragment extends MenuBottomSheetDialogFragment {
+
+ public static final String TAG = "ImportGpxBottomSheetDialogFragment";
+
+ private ImportHelper importHelper;
+
+ private GPXFile gpxFile;
+ private String fileName;
+ private boolean save;
+ private boolean useImportDir;
+
+ public void setImportHelper(ImportHelper importHelper) {
+ this.importHelper = importHelper;
+ }
+
+ public void setGpxFile(GPXFile gpxFile) {
+ this.gpxFile = gpxFile;
+ }
+
+ public void setFileName(String fileName) {
+ this.fileName = fileName;
+ }
+
+ public void setSave(boolean save) {
+ this.save = save;
+ }
+
+ public void setUseImportDir(boolean useImportDir) {
+ this.useImportDir = useImportDir;
+ }
+
+ @Override
+ public void createMenuItems(Bundle savedInstanceState) {
+ items.add(new TitleItem(getString(R.string.import_file)));
+
+ int nameColor = getResolvedColor(nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light);
+ int descrColor = getResolvedColor(nightMode ? R.color.text_color_secondary_dark : R.color.text_color_secondary_light);
+ String descr = getString(R.string.import_gpx_file_description);
+ if (!descr.contains("%s")) {
+ descr = "%s " + descr;
+ }
+
+ CharSequence txt = AndroidUtils.getStyledString(descr, fileName, new ForegroundColorSpan(descrColor),
+ new ForegroundColorSpan(nameColor));
+ items.add(new ShortDescriptionItem(txt));
+
+ BaseBottomSheetItem asFavoritesItem = new SimpleBottomSheetItem.Builder()
+ .setIcon(getContentIcon(R.drawable.ic_action_favorite))
+ .setTitle(getString(R.string.import_as_favorites))
+ .setLayoutId(R.layout.bottom_sheet_item_simple)
+ .setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ importHelper.importFavoritesFromGpx(gpxFile, fileName);
+ dismiss();
+ }
+ })
+ .create();
+ items.add(asFavoritesItem);
+
+ items.add(new DividerHalfItem(getContext()));
+
+ BaseBottomSheetItem asGpxItem = new SimpleBottomSheetItem.Builder()
+ .setIcon(getContentIcon(R.drawable.ic_action_polygom_dark))
+ .setTitle(getString(R.string.import_as_gpx))
+ .setLayoutId(R.layout.bottom_sheet_item_simple)
+ .setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ importHelper.handleGpxImport(gpxFile, fileName, save, useImportDir);
+ dismiss();
+ }
+ })
+ .create();
+ items.add(asGpxItem);
+ }
+}
\ No newline at end of file
diff --git a/OsmAnd/src/net/osmand/plus/helpers/ImportHelper.java b/OsmAnd/src/net/osmand/plus/helpers/ImportHelper.java
index 9716ebadf4..4ed8de3185 100644
--- a/OsmAnd/src/net/osmand/plus/helpers/ImportHelper.java
+++ b/OsmAnd/src/net/osmand/plus/helpers/ImportHelper.java
@@ -12,8 +12,6 @@ import android.os.Bundle;
import android.os.ParcelFileDescriptor;
import android.provider.OpenableColumns;
import android.provider.Settings;
-import android.text.style.ForegroundColorSpan;
-import android.view.View;
import android.widget.Toast;
import androidx.annotation.NonNull;
@@ -33,14 +31,17 @@ import net.osmand.PlatformUtil;
import net.osmand.data.FavouritePoint;
import net.osmand.data.FavouritePoint.BackgroundType;
import net.osmand.plus.AppInitializer;
-import net.osmand.plus.AppInitializer.AppInitializeListener;
-import net.osmand.plus.AppInitializer.InitEvents;
import net.osmand.plus.CustomOsmandPlugin;
import net.osmand.plus.FavouritesDbHelper;
import net.osmand.plus.GPXDatabase;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.OsmandPlugin;
import net.osmand.plus.R;
+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.rastermaps.OsmandRasterMapsPlugin;
import net.osmand.plus.settings.backend.SettingsHelper;
import net.osmand.plus.settings.backend.SettingsHelper.CheckDuplicatesListener;
import net.osmand.plus.settings.backend.SettingsHelper.PluginSettingsItem;
@@ -48,22 +49,14 @@ import net.osmand.plus.settings.backend.SettingsHelper.ProfileSettingsItem;
import net.osmand.plus.settings.backend.SettingsHelper.SettingsCollectListener;
import net.osmand.plus.settings.backend.SettingsHelper.SettingsImportListener;
import net.osmand.plus.settings.backend.SettingsHelper.SettingsItem;
-import net.osmand.plus.activities.ActivityResultListener;
-import net.osmand.plus.activities.MapActivity;
-import net.osmand.plus.activities.TrackActivity;
-import net.osmand.plus.base.MenuBottomSheetDialogFragment;
-import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem;
-import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem;
-import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerHalfItem;
-import net.osmand.plus.base.bottomsheetmenu.simpleitems.ShortDescriptionItem;
-import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem;
-import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin;
import net.osmand.plus.settings.fragments.ImportSettingsFragment;
import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.router.RoutingConfiguration;
import net.osmand.util.Algorithms;
import org.apache.commons.logging.Log;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
import java.io.ByteArrayInputStream;
import java.io.File;
@@ -109,7 +102,8 @@ public class ImportHelper {
public enum ImportType {
SETTINGS(OSMAND_SETTINGS_FILE_EXT),
- ROUTING(ROUTING_FILE_EXT);
+ ROUTING(ROUTING_FILE_EXT),
+ RENDERING(RENDERER_INDEX_EXT);
ImportType(String extension) {
this.extension = extension;
@@ -141,21 +135,29 @@ public class ImportHelper {
handleFileImport(contentUri, name, extras, useImportDir);
}
+ public void importFavoritesFromGpx(final GPXFile gpxFile, final String fileName) {
+ importFavoritesImpl(gpxFile, fileName, false);
+ }
+
+ public void handleGpxImport(GPXFile result, String name, boolean save, boolean useImportDir) {
+ handleResult(result, name, save, useImportDir, false);
+ }
+
public boolean handleGpxImport(final Uri contentUri, final boolean useImportDir) {
String name = getNameFromContentUri(app, contentUri);
- boolean isOsmandSubdir = isSubDirectory(app.getAppPath(IndexConstants.GPX_INDEX_DIR), new File(contentUri.getPath()));
+ boolean isOsmandSubdir = Algorithms.isSubDirectory(app.getAppPath(IndexConstants.GPX_INDEX_DIR), new File(contentUri.getPath()));
if (!isOsmandSubdir && name != null) {
String nameLC = name.toLowerCase();
if (nameLC.endsWith(GPX_FILE_EXT)) {
- name = name.substring(0, name.length() - 4) + GPX_FILE_EXT;
+ name = name.substring(0, name.length() - GPX_FILE_EXT.length()) + GPX_FILE_EXT;
handleGpxImport(contentUri, name, true, useImportDir);
return true;
} else if (nameLC.endsWith(KML_SUFFIX)) {
- name = name.substring(0, name.length() - 4) + KML_SUFFIX;
+ name = name.substring(0, name.length() - KML_SUFFIX.length()) + KML_SUFFIX;
handleKmlImport(contentUri, name, true, useImportDir);
return true;
} else if (nameLC.endsWith(KMZ_SUFFIX)) {
- name = name.substring(0, name.length() - 4) + KMZ_SUFFIX;
+ name = name.substring(0, name.length() - KMZ_SUFFIX.length()) + KMZ_SUFFIX;
handleKmzImport(contentUri, name, true, useImportDir);
return true;
}
@@ -167,7 +169,7 @@ public class ImportHelper {
String scheme = uri.getScheme();
boolean isFileIntent = "file".equals(scheme);
boolean isContentIntent = "content".equals(scheme);
- boolean isOsmandSubdir = isSubDirectory(app.getAppPath(IndexConstants.GPX_INDEX_DIR), new File(uri.getPath()));
+ boolean isOsmandSubdir = Algorithms.isSubDirectory(app.getAppPath(IndexConstants.GPX_INDEX_DIR), new File(uri.getPath()));
final boolean saveFile = !isFileIntent || !isOsmandSubdir;
String fileName = "";
if (isFileIntent) {
@@ -180,7 +182,7 @@ public class ImportHelper {
public void handleFileImport(Uri intentUri, String fileName, Bundle extras, boolean useImportDir) {
final boolean isFileIntent = "file".equals(intentUri.getScheme());
- final boolean isOsmandSubdir = isSubDirectory(app.getAppPath(IndexConstants.GPX_INDEX_DIR), new File(intentUri.getPath()));
+ final boolean isOsmandSubdir = Algorithms.isSubDirectory(app.getAppPath(IndexConstants.GPX_INDEX_DIR), new File(intentUri.getPath()));
final boolean saveFile = !isFileIntent || !isOsmandSubdir;
@@ -194,10 +196,8 @@ public class ImportHelper {
handleSqliteTileImport(intentUri, fileName);
} else if (fileName != null && fileName.endsWith(OSMAND_SETTINGS_FILE_EXT)) {
handleOsmAndSettingsImport(intentUri, fileName, extras, null);
- } else if (fileName != null && fileName.endsWith(RENDERER_INDEX_EXT)) {
- handleRenderingFileImport(intentUri, fileName);
} else if (fileName != null && fileName.endsWith(ROUTING_FILE_EXT)) {
- handleRoutingFileImport(intentUri, fileName, null);
+ handleXmlFileImport(intentUri, fileName, null);
} else {
handleFavouritesImport(intentUri, fileName, saveFile, useImportDir, false);
}
@@ -338,58 +338,45 @@ public class ImportHelper {
@SuppressLint("StaticFieldLeak")
private void importFavoritesImpl(final GPXFile gpxFile, final String fileName, final boolean forceImportFavourites) {
- if(!app.isApplicationInitializing()) {
- new AsyncTask() {
- ProgressDialog progress = null;
+ final AsyncTask favoritesImportTask = new AsyncTask() {
+ ProgressDialog progress = null;
- @Override
- protected void onPreExecute() {
- if (AndroidUtils.isActivityNotDestroyed(activity)) {
- progress = ProgressDialog.show(activity, app.getString(R.string.loading_smth, ""),
- app.getString(R.string.loading_data));
- }
+ @Override
+ protected void onPreExecute() {
+ if (AndroidUtils.isActivityNotDestroyed(activity)) {
+ progress = ProgressDialog.show(activity, app.getString(R.string.loading_smth, ""),
+ app.getString(R.string.loading_data));
}
+ }
- @Override
- protected GPXFile doInBackground(Void... nothing) {
- final List favourites = asFavourites(gpxFile.getPoints(),
+ @Override
+ protected GPXFile doInBackground(Void... nothing) {
+ final List favourites = asFavourites(gpxFile.getPoints(),
fileName, forceImportFavourites);
- final FavouritesDbHelper favoritesHelper = app.getFavorites();
- for (final FavouritePoint favourite : favourites) {
- favoritesHelper.deleteFavourite(favourite, false);
- favoritesHelper.addFavourite(favourite, false);
- }
- favoritesHelper.sortAll();
- favoritesHelper.saveCurrentPointsIntoFile();
- return null;
+ final FavouritesDbHelper favoritesHelper = app.getFavorites();
+ for (final FavouritePoint favourite : favourites) {
+ favoritesHelper.deleteFavourite(favourite, false);
+ favoritesHelper.addFavourite(favourite, false);
}
+ favoritesHelper.sortAll();
+ favoritesHelper.saveCurrentPointsIntoFile();
+ return null;
+ }
- @Override
- protected void onPostExecute(GPXFile result) {
- if (progress != null && AndroidUtils.isActivityNotDestroyed(activity)) {
- progress.dismiss();
- }
- Toast.makeText(activity, R.string.fav_imported_sucessfully, Toast.LENGTH_LONG)
- .show();
- final Intent newIntent = new Intent(activity,
+ @Override
+ protected void onPostExecute(GPXFile result) {
+ if (progress != null && AndroidUtils.isActivityNotDestroyed(activity)) {
+ progress.dismiss();
+ }
+ Toast.makeText(activity, R.string.fav_imported_sucessfully, Toast.LENGTH_LONG).show();
+ final Intent newIntent = new Intent(activity,
app.getAppCustomization().getFavoritesActivity());
- newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
- newIntent.putExtra(TAB_ID, FAV_TAB);
- activity.startActivity(newIntent);
- }
- }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- } else {
- app.getAppInitializer().addListener(new AppInitializeListener() {
-
- @Override
- public void onProgress(AppInitializer init, InitEvents event) {}
-
- @Override
- public void onFinish(AppInitializer init) {
- importFavoritesImpl(gpxFile, fileName, forceImportFavourites);
- }
- });
- }
+ newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ newIntent.putExtra(TAB_ID, FAV_TAB);
+ activity.startActivity(newIntent);
+ }
+ };
+ executeImportTask(favoritesImportTask);
}
@SuppressLint("StaticFieldLeak")
@@ -660,7 +647,7 @@ public class ImportHelper {
if (importType.equals(ImportType.SETTINGS)) {
handleOsmAndSettingsImport(data, fileName, resultData.getExtras(), callback);
} else if (importType.equals(ImportType.ROUTING)){
- handleRoutingFileImport(data, fileName, callback);
+ handleXmlFileImport(data, fileName, callback);
}
} else {
app.showToastMessage(app.getString(R.string.not_support_file_type_with_ext,
@@ -674,81 +661,6 @@ public class ImportHelper {
mapActivity.startActivityForResult(intent, IMPORT_FILE_REQUEST);
}
- @SuppressLint("StaticFieldLeak")
- private void handleRoutingFileImport(final Uri uri, final String fileName, final CallbackWithObject callback) {
- final AsyncTask routingImportTask = new AsyncTask() {
-
- String mFileName;
- ProgressDialog progress;
-
- @Override
- protected void onPreExecute() {
- if (AndroidUtils.isActivityNotDestroyed(activity)) {
- progress = ProgressDialog.show(activity, app.getString(R.string.loading_smth, ""), app.getString(R.string.loading_data));
- }
- mFileName = fileName;
- }
-
- @Override
- protected String doInBackground(Void... voids) {
- File routingDir = app.getAppPath(IndexConstants.ROUTING_PROFILES_DIR);
- if (!routingDir.exists()) {
- routingDir.mkdirs();
- }
- File dest = new File(routingDir, mFileName);
- while (dest.exists()) {
- mFileName = AndroidUtils.createNewFileName(mFileName);
- dest = new File(routingDir, mFileName);
- }
- return copyFile(app, dest, uri, true);
- }
-
- @Override
- protected void onPostExecute(String error) {
- File routingDir = app.getAppPath(IndexConstants.ROUTING_PROFILES_DIR);
- final File file = new File(routingDir, mFileName);
- if (error == null && file.exists()) {
- loadRoutingFiles(app, new AppInitializer.LoadRoutingFilesCallback() {
- @Override
- public void onRoutingFilesLoaded() {
- if (progress != null && AndroidUtils.isActivityNotDestroyed(activity)) {
- progress.dismiss();
- }
- RoutingConfiguration.Builder builder = app.getCustomRoutingConfig(mFileName);
- if (builder != null) {
- app.showShortToastMessage(app.getString(R.string.file_imported_successfully, mFileName));
- if (callback != null) {
- callback.processResult(builder);
- }
- } else {
- app.showToastMessage(app.getString(R.string.file_does_not_contain_routing_rules, mFileName));
- }
- }
- });
- } else {
- if (progress != null && AndroidUtils.isActivityNotDestroyed(activity)) {
- progress.dismiss();
- }
- app.showShortToastMessage(app.getString(R.string.file_import_error, mFileName, error));
- }
- }
- };
- if (app.isApplicationInitializing()) {
- app.getAppInitializer().addListener(new AppInitializer.AppInitializeListener() {
- @Override
- public void onProgress(AppInitializer init, AppInitializer.InitEvents event) {
- }
-
- @Override
- public void onFinish(AppInitializer init) {
- routingImportTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
- });
- } else {
- routingImportTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
- }
-
private void handleOsmAndSettingsImport(Uri intentUri, String fileName, Bundle extras, CallbackWithObject> callback) {
if (extras != null && extras.containsKey(SettingsHelper.SETTINGS_VERSION_KEY) && extras.containsKey(SettingsHelper.SETTINGS_LATEST_CHANGES_KEY)) {
int version = extras.getInt(SettingsHelper.SETTINGS_VERSION_KEY, -1);
@@ -824,20 +736,7 @@ public class ImportHelper {
}
}
};
- if (app.isApplicationInitializing()) {
- app.getAppInitializer().addListener(new AppInitializer.AppInitializeListener() {
- @Override
- public void onProgress(AppInitializer init, AppInitializer.InitEvents event) {
- }
-
- @Override
- public void onFinish(AppInitializer init) {
- settingsImportTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
- });
- } else {
- settingsImportTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
+ executeImportTask(settingsImportTask);
}
private void handlePluginImport(final PluginSettingsItem pluginItem, final File file) {
@@ -896,63 +795,137 @@ public class ImportHelper {
}
@SuppressLint("StaticFieldLeak")
- private void handleRenderingFileImport(final Uri intentUri, final String fileName) {
+ private void handleXmlFileImport(final Uri intentUri, final String fileName,
+ final CallbackWithObject routingCallback) {
final AsyncTask renderingImportTask = new AsyncTask() {
- String mFileName;
- ProgressDialog progress;
+ private String destFileName;
+ private ImportType importType;
+ private ProgressDialog progress;
@Override
protected void onPreExecute() {
if (AndroidUtils.isActivityNotDestroyed(activity)) {
progress = ProgressDialog.show(activity, app.getString(R.string.loading_smth, ""), app.getString(R.string.loading_data));
}
- mFileName = fileName;
+ destFileName = fileName;
}
@Override
protected String doInBackground(Void... voids) {
- File renderingDir = app.getAppPath(IndexConstants.RENDERERS_DIR);
- if (!renderingDir.exists()) {
- renderingDir.mkdirs();
+ checkImportType();
+ if (importType != null) {
+ File dest = getDestinationFile();
+ if (dest != null) {
+ return copyFile(app, dest, intentUri, true);
+ }
}
- File dest = new File(renderingDir, mFileName);
- while (dest.exists()) {
- mFileName = AndroidUtils.createNewFileName(mFileName);
- dest = new File(renderingDir, mFileName);
- }
- return copyFile(app, dest, intentUri, true);
+ return app.getString(R.string.file_import_error, destFileName, app.getString(R.string.unsupported_type_error));
}
@Override
protected void onPostExecute(String error) {
- File renderingDir = app.getAppPath(IndexConstants.RENDERERS_DIR);
- File file = new File(renderingDir, mFileName);
+ File destDir = getDestinationDir();
+ File file = new File(destDir, destFileName);
if (error == null && file.exists()) {
- app.getRendererRegistry().updateExternalRenderers();
- app.showShortToastMessage(app.getString(R.string.file_imported_successfully, mFileName));
+ if (importType == ImportType.RENDERING) {
+ app.getRendererRegistry().updateExternalRenderers();
+ app.showShortToastMessage(app.getString(R.string.file_imported_successfully, destFileName));
+ hideProgress();
+ } else if (importType == ImportType.ROUTING) {
+ loadRoutingFiles(app, new AppInitializer.LoadRoutingFilesCallback() {
+ @Override
+ public void onRoutingFilesLoaded() {
+ hideProgress();
+ RoutingConfiguration.Builder builder = app.getCustomRoutingConfig(destFileName);
+ if (builder != null) {
+ if (routingCallback != null) {
+ routingCallback.processResult(builder);
+ }
+ app.showShortToastMessage(app.getString(R.string.file_imported_successfully, destFileName));
+ } else {
+ app.showToastMessage(app.getString(R.string.file_does_not_contain_routing_rules, destFileName));
+ }
+ }
+ });
+ }
} else {
- app.showShortToastMessage(app.getString(R.string.file_import_error, mFileName, error));
+ hideProgress();
+ app.showShortToastMessage(app.getString(R.string.file_import_error, destFileName, error));
}
+ }
+
+ private void hideProgress() {
if (progress != null && AndroidUtils.isActivityNotDestroyed(activity)) {
progress.dismiss();
}
}
- };
- if (app.isApplicationInitializing()) {
- app.getAppInitializer().addListener(new AppInitializer.AppInitializeListener() {
- @Override
- public void onProgress(AppInitializer init, AppInitializer.InitEvents event) {
- }
- @Override
- public void onFinish(AppInitializer init) {
- renderingImportTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ private File getDestinationDir() {
+ if (importType == ImportType.ROUTING) {
+ return app.getAppPath(IndexConstants.ROUTING_PROFILES_DIR);
+ } else if (importType == ImportType.RENDERING) {
+ return app.getAppPath(IndexConstants.RENDERERS_DIR);
}
- });
- } else {
- renderingImportTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
- }
+ return null;
+ }
+
+ private File getDestinationFile() {
+ File destDir = getDestinationDir();
+ if (destDir != null) {
+ if (!destDir.exists()) {
+ destDir.mkdirs();
+ }
+ File destFile = new File(destDir, destFileName);
+ while (destFile.exists()) {
+ destFileName = AndroidUtils.createNewFileName(destFileName);
+ destFile = new File(destDir, destFileName);
+ }
+ return destFile;
+ }
+ return null;
+ }
+
+ private void checkImportType() {
+ InputStream is = null;
+ try {
+ final ParcelFileDescriptor pFD = app.getContentResolver().openFileDescriptor(intentUri, "r");
+ if (pFD != null) {
+ is = new FileInputStream(pFD.getFileDescriptor());
+ XmlPullParser parser = PlatformUtil.newXMLPullParser();
+ parser.setInput(is, "UTF-8");
+ int tok;
+ while ((tok = parser.next()) != XmlPullParser.END_DOCUMENT) {
+ if (tok == XmlPullParser.START_TAG) {
+ String name = parser.getName();
+ if ("osmand_routing_config".equals(name)) {
+ importType = ImportType.ROUTING;
+ } else if ("renderingStyle".equals(name)) {
+ importType = ImportType.RENDERING;
+ }
+ break;
+ }
+ }
+ try {
+ pFD.close();
+ } catch (IOException e) {
+ log.error(e);
+ }
+ }
+ } catch (FileNotFoundException | XmlPullParserException e) {
+ log.error(e);
+ } catch (IOException e) {
+ log.error(e);
+ } finally {
+ if (is != null) try {
+ is.close();
+ } catch (IOException e) {
+ log.error(e);
+ }
+ }
+ }
+ };
+ executeImportTask(renderingImportTask);
}
private void handleResult(final GPXFile result, final String name, final boolean save,
@@ -1198,107 +1171,20 @@ public class ImportHelper {
return favourites;
}
- /**
- * Checks, whether the child directory is a subdirectory of the parent
- * directory.
- *
- * @param parent the parent directory.
- * @param child the suspected child directory.
- * @return true if the child is a subdirectory of the parent directory.
- */
- public boolean isSubDirectory(File parent, File child) {
- try {
- parent = parent.getCanonicalFile();
- child = child.getCanonicalFile();
-
- File dir = child;
- while (dir != null) {
- if (parent.equals(dir)) {
- return true;
+ private void executeImportTask(final AsyncTask, ?, ?> importTask) {
+ if (app.isApplicationInitializing()) {
+ app.getAppInitializer().addListener(new AppInitializer.AppInitializeListener() {
+ @Override
+ public void onProgress(AppInitializer init, AppInitializer.InitEvents event) {
}
- dir = dir.getParentFile();
- }
- } catch (IOException e) {
- return false;
- }
- return false;
- }
- public static class ImportGpxBottomSheetDialogFragment extends MenuBottomSheetDialogFragment {
-
- public static final String TAG = "ImportGpxBottomSheetDialogFragment";
-
- private ImportHelper importHelper;
-
- private GPXFile gpxFile;
- private String fileName;
- private boolean save;
- private boolean useImportDir;
-
- public void setImportHelper(ImportHelper importHelper) {
- this.importHelper = importHelper;
- }
-
- public void setGpxFile(GPXFile gpxFile) {
- this.gpxFile = gpxFile;
- }
-
- public void setFileName(String fileName) {
- this.fileName = fileName;
- }
-
- public void setSave(boolean save) {
- this.save = save;
- }
-
- public void setUseImportDir(boolean useImportDir) {
- this.useImportDir = useImportDir;
- }
-
- @Override
- public void createMenuItems(Bundle savedInstanceState) {
- items.add(new TitleItem(getString(R.string.import_file)));
-
- int nameColor = getResolvedColor(nightMode ? R.color.active_color_primary_dark : R.color.active_color_primary_light);
- int descrColor = getResolvedColor(nightMode ? R.color.text_color_secondary_dark : R.color.text_color_secondary_light);
- String descr = getString(R.string.import_gpx_file_description);
- if(!descr.contains("%s")) {
- descr = "%s " +descr;
- }
-
- CharSequence txt = AndroidUtils.getStyledString(descr, fileName, new ForegroundColorSpan(descrColor),
- new ForegroundColorSpan(nameColor));
- items.add(new ShortDescriptionItem(txt));
-
- BaseBottomSheetItem asFavoritesItem = new SimpleBottomSheetItem.Builder()
- .setIcon(getContentIcon(R.drawable.ic_action_favorite))
- .setTitle(getString(R.string.import_as_favorites))
- .setLayoutId(R.layout.bottom_sheet_item_simple)
- .setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- importHelper.importFavoritesImpl(gpxFile, fileName, false);
- dismiss();
- }
- })
- .create();
- items.add(asFavoritesItem);
-
- items.add(new DividerHalfItem(getContext()));
-
- BaseBottomSheetItem asGpxItem = new SimpleBottomSheetItem.Builder()
- .setIcon(getContentIcon(R.drawable.ic_action_polygom_dark))
- .setTitle(getString(R.string.import_as_gpx))
- .setLayoutId(R.layout.bottom_sheet_item_simple)
- .setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- importHelper.handleResult(gpxFile, fileName, save, useImportDir, false);
- dismiss();
- }
- })
- .create();
- items.add(asGpxItem);
+ @Override
+ public void onFinish(AppInitializer init) {
+ importTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
+ }
+ });
+ } else {
+ importTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
}
-}
+}
\ No newline at end of file