From b59d0cf389b3f79581f9e18220a4a2c199210535 Mon Sep 17 00:00:00 2001 From: chumv Date: Tue, 11 Feb 2025 17:55:21 +0200 Subject: [PATCH 1/3] Fix #21762 --- .../dialogs/TracksSelectionFragment.java | 2 +- .../asynctasks/UploadGPXFilesTask.java | 134 +++++++----------- .../dialogs/SendGpxBottomSheetFragment.java | 42 ++++-- 3 files changed, 85 insertions(+), 93 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/myplaces/tracks/dialogs/TracksSelectionFragment.java b/OsmAnd/src/net/osmand/plus/myplaces/tracks/dialogs/TracksSelectionFragment.java index cc6a7680b57..ba668265659 100644 --- a/OsmAnd/src/net/osmand/plus/myplaces/tracks/dialogs/TracksSelectionFragment.java +++ b/OsmAnd/src/net/osmand/plus/myplaces/tracks/dialogs/TracksSelectionFragment.java @@ -338,7 +338,7 @@ protected boolean shouldShowFolderStats() { } @Override - public void onGpxUploaded(String result) { + public void onGpxUploadFinished(String result) { dismiss(); } diff --git a/OsmAnd/src/net/osmand/plus/plugins/osmedit/asynctasks/UploadGPXFilesTask.java b/OsmAnd/src/net/osmand/plus/plugins/osmedit/asynctasks/UploadGPXFilesTask.java index c6a8b4f7f1c..c3c15983d0a 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/osmedit/asynctasks/UploadGPXFilesTask.java +++ b/OsmAnd/src/net/osmand/plus/plugins/osmedit/asynctasks/UploadGPXFilesTask.java @@ -1,6 +1,5 @@ package net.osmand.plus.plugins.osmedit.asynctasks; -import android.app.Activity; import android.os.AsyncTask; import androidx.annotation.NonNull; @@ -10,7 +9,6 @@ import net.osmand.plus.R; import net.osmand.plus.plugins.osmedit.UploadVisibility; import net.osmand.plus.plugins.osmedit.helpers.OpenstreetmapRemoteUtil; -import net.osmand.plus.utils.AndroidUtils; import net.osmand.shared.gpx.GpxDataItem; import net.osmand.shared.gpx.GpxDbHelper; import net.osmand.shared.gpx.GpxParameter; @@ -18,9 +16,7 @@ import net.osmand.util.Algorithms; import java.io.File; -import java.lang.ref.WeakReference; import java.util.Arrays; -import java.util.List; import java.util.stream.Collectors; public class UploadGPXFilesTask extends AsyncTask { @@ -28,88 +24,82 @@ public class UploadGPXFilesTask extends AsyncTask { private final OsmandApplication app; private final GpxDbHelper gpxDbHelper; private final OpenstreetmapRemoteUtil remoteUtil; - private final WeakReference activityRef; - private final String commonTags; + private final String tags; private final String visibility; - private final String commonDescription; + private final String description; private final String defaultActivity; private final UploadGpxListener listener; - public UploadGPXFilesTask(@NonNull Activity activity, - @NonNull String commonDescription, - @NonNull String commonTags, - @Nullable UploadVisibility visibility, - @Nullable UploadGpxListener listener, - @Nullable String defaultActivity) { - app = (OsmandApplication) activity.getApplication(); + public UploadGPXFilesTask(@NonNull OsmandApplication app, @NonNull String tags, + @NonNull String description, @Nullable String defaultActivity, + @Nullable UploadVisibility visibility, @Nullable UploadGpxListener listener) { + this.app = app; this.gpxDbHelper = app.getGpxDbHelper(); this.remoteUtil = new OpenstreetmapRemoteUtil(app); - this.activityRef = new WeakReference<>(activity); - this.commonDescription = commonDescription; - this.commonTags = commonTags; + this.tags = tags; + this.description = description; + this.defaultActivity = defaultActivity; this.visibility = visibility != null ? visibility.asUrlParam() : UploadVisibility.PRIVATE.asUrlParam(); this.listener = listener; - this.defaultActivity = defaultActivity; + } + + @Override + protected void onPreExecute() { + if (listener != null) { + listener.onGpxUploadStarted(); + } } @Override protected String doInBackground(File... params) { int count = 0; - int total = 0; + int total = params.length; + boolean includeActivity = shouldIncludeActivity(); + for (File file : params) { - if (!isCancelled() && file != null) { - String activity = getGpxActivity(file); - String tags = getGpxTags(activity); - String description = getGpxDescription(file); - String warning = remoteUtil.uploadGPXFile(tags, description, visibility, file); - total++; - if (warning == null) { - count++; - } else { - publishProgress(warning); - } + if (isCancelled() || file == null) continue; + String updatedTags = adjustTags(file, includeActivity); + String fileDescription = getGpxDescription(file); + String warning = remoteUtil.uploadGPXFile(updatedTags, fileDescription, visibility, file); + + if (warning == null) { + count++; + } else { + publishProgress(warning); } } return app.getString(R.string.local_index_items_uploaded, count, total); } - @NonNull - private String getGpxDescription(@NonNull File file) { - return Algorithms.isEmpty(commonDescription.trim()) - ? Algorithms.getFileNameWithoutExtension(file.getName()) - : commonDescription; + private boolean shouldIncludeActivity() { + return !Algorithms.isEmpty(defaultActivity) && tags.contains(defaultActivity); } @NonNull - private String getGpxTags(@Nullable String activity) { - if (Algorithms.isEmpty(activity)) { - return removeDefaultActivity(); - } else if (!commonTags.contains(activity)) { - return addActivity(activity); - } - return commonTags; + private String getGpxDescription(@NonNull File file) { + return Algorithms.isEmpty(description.trim()) + ? Algorithms.getFileNameWithoutExtension(file.getName()) : description; } - public String removeDefaultActivity() { - String removedDefaultActivity = commonTags; - if (!Algorithms.isEmpty(defaultActivity) && commonTags.contains(defaultActivity)) { - List tagList = Arrays.stream(commonTags.split(",")) - .map(String::trim) - .filter(tag -> !tag.equals(defaultActivity)) - .collect(Collectors.toList()); - - removedDefaultActivity = String.join(", ", tagList); + @NonNull + private String adjustTags(@NonNull File file, boolean includeActivity) { + if (includeActivity) { + String activity = getGpxActivity(file); + if (Algorithms.isEmpty(activity)) { + return removeDefaultActivity(); + } + return tags.contains(activity) ? tags : tags.replaceFirst(defaultActivity, activity); } - return removedDefaultActivity; + return tags; } - public String addActivity(@Nullable String activity) { - if (!Algorithms.isEmpty(defaultActivity) && commonTags.contains(defaultActivity)) { - return commonTags.replace(defaultActivity, activity); - } else { - return commonTags + ", " + activity; - } + @NonNull + private String removeDefaultActivity() { + return Arrays.stream(tags.split(",")) + .map(String::trim) + .filter(tag -> !tag.equals(defaultActivity)) + .collect(Collectors.joining(", ")); } @Nullable @@ -121,38 +111,22 @@ private String getGpxActivity(@NonNull File file) { @Override protected void onProgressUpdate(String... values) { if (values.length > 0) { - StringBuilder builder = new StringBuilder(); - for (int i = 0; i < values.length; i++) { - if (i > 0) { - builder.append("\n"); - } - builder.append(values[i]); - } - app.showToastMessage(builder.toString()); - } - } - - @Override - protected void onPreExecute() { - Activity activity = activityRef.get(); - if (AndroidUtils.isActivityNotDestroyed(activity)) { - activity.setProgressBarIndeterminateVisibility(true); + app.showToastMessage(String.join("\n", values)); } } @Override protected void onPostExecute(String result) { if (listener != null) { - listener.onGpxUploaded(result); - } - Activity activity = activityRef.get(); - if (AndroidUtils.isActivityNotDestroyed(activity)) { - activity.setProgressBarIndeterminateVisibility(false); + listener.onGpxUploadFinished(result); } app.showToastMessage(result); } public interface UploadGpxListener { - void onGpxUploaded(String result); + default void onGpxUploadStarted() { + } + + void onGpxUploadFinished(String result); } } \ No newline at end of file diff --git a/OsmAnd/src/net/osmand/plus/plugins/osmedit/dialogs/SendGpxBottomSheetFragment.java b/OsmAnd/src/net/osmand/plus/plugins/osmedit/dialogs/SendGpxBottomSheetFragment.java index 3d13e313a82..c8088a48c07 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/osmedit/dialogs/SendGpxBottomSheetFragment.java +++ b/OsmAnd/src/net/osmand/plus/plugins/osmedit/dialogs/SendGpxBottomSheetFragment.java @@ -20,6 +20,7 @@ import com.google.android.material.textfield.TextInputEditText; +import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; import net.osmand.plus.base.MenuBottomSheetDialogFragment; @@ -52,16 +53,19 @@ public class SendGpxBottomSheetFragment extends MenuBottomSheetDialogFragment im private final OsmEditingPlugin plugin = PluginsHelper.requirePlugin(OsmEditingPlugin.class); + private GpxDbHelper gpxDbHelper; private File[] files; private UploadVisibility uploadVisibility; private TextInputEditText tagsField; private TextInputEditText messageField; - private String firstActivity; + private String defaultActivity; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + + gpxDbHelper = getMyApplication().getGpxDbHelper(); if (uploadVisibility == null) { uploadVisibility = plugin.OSM_UPLOAD_VISIBILITY.get(); } @@ -97,11 +101,10 @@ private void setupTagsRow(@NonNull View view) { } @Nullable - private String getFirstActivity() { - GpxDbHelper gpxDbHelper = requiredMyApplication().getGpxDbHelper(); + private String getDefaultActivity() { for (File file : files) { - GpxDataItem gpxDataItem = gpxDbHelper.getItem(new KFile(file.getPath())); - String activity = gpxDataItem != null ? gpxDataItem.getParameter(GpxParameter.ACTIVITY_TYPE) : null; + GpxDataItem item = gpxDbHelper.getItem(new KFile(file.getPath())); + String activity = item != null ? item.getParameter(GpxParameter.ACTIVITY_TYPE) : null; if (!Algorithms.isEmpty(activity)) { return activity; @@ -113,9 +116,9 @@ private String getFirstActivity() { @NonNull private String getDefaultTags() { String defaultTags = OSMAND_TAG; - firstActivity = getFirstActivity(); - if (!Algorithms.isEmpty(firstActivity)) { - return defaultTags + ", " + firstActivity; + defaultActivity = getDefaultActivity(); + if (!Algorithms.isEmpty(defaultActivity)) { + return defaultTags + ", " + defaultActivity; } return defaultTags; } @@ -183,17 +186,31 @@ protected void onRightBottomButtonClick() { String description = descrText != null ? descrText.toString() : ""; String tags = tagsText != null ? tagsText.toString() : ""; - UploadGPXFilesTask task = new UploadGPXFilesTask(activity, description, tags, uploadVisibility, this, firstActivity); + OsmandApplication app = getMyApplication(); + UploadGPXFilesTask task = new UploadGPXFilesTask(app, tags, description, defaultActivity, uploadVisibility, this); task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, files); } dismiss(); } @Override - public void onGpxUploaded(String result) { + public void onGpxUploadStarted() { + updateProgressVisibility(true); + } + + public void onGpxUploadFinished(String result) { + updateProgressVisibility(false); + Fragment target = getTargetFragment(); if (target instanceof UploadGpxListener) { - ((UploadGpxListener) target).onGpxUploaded(result); + ((UploadGpxListener) target).onGpxUploadFinished(result); + } + } + + private void updateProgressVisibility(boolean visible) { + FragmentActivity activity = getActivity(); + if (AndroidUtils.isActivityNotDestroyed(activity)) { + activity.setProgressBarIndeterminateVisibility(visible); } } @@ -214,7 +231,8 @@ protected static void showOpenStreetMapScreen(@NonNull FragmentActivity activity } } - public static void showInstance(@NonNull FragmentManager manager, @NonNull File[] files, @Nullable Fragment target) { + public static void showInstance(@NonNull FragmentManager manager, @NonNull File[] files, + @Nullable Fragment target) { if (AndroidUtils.isFragmentCanBeAdded(manager, TAG)) { SendGpxBottomSheetFragment fragment = new SendGpxBottomSheetFragment(); fragment.files = files; From 20c0edc91c6576d86b689bb0fbb5c4bfdd59d775 Mon Sep 17 00:00:00 2001 From: chumv Date: Tue, 11 Feb 2025 18:46:40 +0200 Subject: [PATCH 2/3] Use Set instead of plain string for tags --- .../asynctasks/UploadGPXFilesTask.java | 35 +++++++++---------- .../dialogs/SendGpxBottomSheetFragment.java | 15 +++++++- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/plugins/osmedit/asynctasks/UploadGPXFilesTask.java b/OsmAnd/src/net/osmand/plus/plugins/osmedit/asynctasks/UploadGPXFilesTask.java index c3c15983d0a..0db74798cd6 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/osmedit/asynctasks/UploadGPXFilesTask.java +++ b/OsmAnd/src/net/osmand/plus/plugins/osmedit/asynctasks/UploadGPXFilesTask.java @@ -16,7 +16,8 @@ import net.osmand.util.Algorithms; import java.io.File; -import java.util.Arrays; +import java.util.LinkedHashSet; +import java.util.Set; import java.util.stream.Collectors; public class UploadGPXFilesTask extends AsyncTask { @@ -24,14 +25,13 @@ public class UploadGPXFilesTask extends AsyncTask { private final OsmandApplication app; private final GpxDbHelper gpxDbHelper; private final OpenstreetmapRemoteUtil remoteUtil; - - private final String tags; + private final Set tags; private final String visibility; private final String description; private final String defaultActivity; private final UploadGpxListener listener; - public UploadGPXFilesTask(@NonNull OsmandApplication app, @NonNull String tags, + public UploadGPXFilesTask(@NonNull OsmandApplication app, @NonNull Set tags, @NonNull String description, @Nullable String defaultActivity, @Nullable UploadVisibility visibility, @Nullable UploadGpxListener listener) { this.app = app; @@ -59,9 +59,10 @@ protected String doInBackground(File... params) { for (File file : params) { if (isCancelled() || file == null) continue; - String updatedTags = adjustTags(file, includeActivity); + Set updatedTags = getAdjustedTags(file, includeActivity); + String tagsText = String.join(", ", updatedTags); String fileDescription = getGpxDescription(file); - String warning = remoteUtil.uploadGPXFile(updatedTags, fileDescription, visibility, file); + String warning = remoteUtil.uploadGPXFile(tagsText, fileDescription, visibility, file); if (warning == null) { count++; @@ -83,25 +84,23 @@ private String getGpxDescription(@NonNull File file) { } @NonNull - private String adjustTags(@NonNull File file, boolean includeActivity) { + private Set getAdjustedTags(@NonNull File file, boolean includeActivity) { if (includeActivity) { + Set updatedTags = new LinkedHashSet<>(tags); + String activity = getGpxActivity(file); - if (Algorithms.isEmpty(activity)) { - return removeDefaultActivity(); + if (!Algorithms.isEmpty(activity)) { + return updatedTags.stream() + .map(tag -> tag.equals(defaultActivity) ? activity : tag) + .collect(Collectors.toCollection(LinkedHashSet::new)); + } else { + updatedTags.remove(defaultActivity); } - return tags.contains(activity) ? tags : tags.replaceFirst(defaultActivity, activity); + return updatedTags; } return tags; } - @NonNull - private String removeDefaultActivity() { - return Arrays.stream(tags.split(",")) - .map(String::trim) - .filter(tag -> !tag.equals(defaultActivity)) - .collect(Collectors.joining(", ")); - } - @Nullable private String getGpxActivity(@NonNull File file) { GpxDataItem item = gpxDbHelper.getItem(new KFile(file.getPath())); diff --git a/OsmAnd/src/net/osmand/plus/plugins/osmedit/dialogs/SendGpxBottomSheetFragment.java b/OsmAnd/src/net/osmand/plus/plugins/osmedit/dialogs/SendGpxBottomSheetFragment.java index c8088a48c07..777101b1c19 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/osmedit/dialogs/SendGpxBottomSheetFragment.java +++ b/OsmAnd/src/net/osmand/plus/plugins/osmedit/dialogs/SendGpxBottomSheetFragment.java @@ -44,7 +44,12 @@ import java.io.File; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; public class SendGpxBottomSheetFragment extends MenuBottomSheetDialogFragment implements UploadGpxListener { @@ -184,7 +189,7 @@ protected void onRightBottomButtonClick() { Editable descrText = messageField.getText(); Editable tagsText = tagsField.getText(); String description = descrText != null ? descrText.toString() : ""; - String tags = tagsText != null ? tagsText.toString() : ""; + Set tags = tagsText != null ? parseTags(tagsText.toString()) : Collections.emptySet(); OsmandApplication app = getMyApplication(); UploadGPXFilesTask task = new UploadGPXFilesTask(app, tags, description, defaultActivity, uploadVisibility, this); @@ -193,6 +198,14 @@ protected void onRightBottomButtonClick() { dismiss(); } + @NonNull + private Set parseTags(@NonNull String tags) { + return Arrays.stream(tags.split(",")) + .map(String::trim) + .filter(tag -> !Algorithms.isEmpty(tag)) + .collect(Collectors.toCollection(LinkedHashSet::new)); + } + @Override public void onGpxUploadStarted() { updateProgressVisibility(true); From 047343c1bfb343a0e52f41b1b6d7beb9b061d51d Mon Sep 17 00:00:00 2001 From: chumv Date: Tue, 11 Feb 2025 18:54:06 +0200 Subject: [PATCH 3/3] Update UploadGpxListener --- .../dialogs/SendGpxBottomSheetFragment.java | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/OsmAnd/src/net/osmand/plus/plugins/osmedit/dialogs/SendGpxBottomSheetFragment.java b/OsmAnd/src/net/osmand/plus/plugins/osmedit/dialogs/SendGpxBottomSheetFragment.java index 777101b1c19..52b6a9b3607 100644 --- a/OsmAnd/src/net/osmand/plus/plugins/osmedit/dialogs/SendGpxBottomSheetFragment.java +++ b/OsmAnd/src/net/osmand/plus/plugins/osmedit/dialogs/SendGpxBottomSheetFragment.java @@ -51,7 +51,7 @@ import java.util.Set; import java.util.stream.Collectors; -public class SendGpxBottomSheetFragment extends MenuBottomSheetDialogFragment implements UploadGpxListener { +public class SendGpxBottomSheetFragment extends MenuBottomSheetDialogFragment { public static final String TAG = SendGpxBottomSheetFragment.class.getSimpleName(); @@ -192,7 +192,8 @@ protected void onRightBottomButtonClick() { Set tags = tagsText != null ? parseTags(tagsText.toString()) : Collections.emptySet(); OsmandApplication app = getMyApplication(); - UploadGPXFilesTask task = new UploadGPXFilesTask(app, tags, description, defaultActivity, uploadVisibility, this); + UploadGpxListener listener = getUploadListener(activity); + UploadGPXFilesTask task = new UploadGPXFilesTask(app, tags, description, defaultActivity, uploadVisibility, listener); task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, files); } dismiss(); @@ -206,25 +207,29 @@ private Set parseTags(@NonNull String tags) { .collect(Collectors.toCollection(LinkedHashSet::new)); } - @Override - public void onGpxUploadStarted() { - updateProgressVisibility(true); - } + @NonNull + private UploadGpxListener getUploadListener(@NonNull FragmentActivity activity) { + return new UploadGpxListener() { + @Override + public void onGpxUploadStarted() { + updateProgressVisibility(true); + } - public void onGpxUploadFinished(String result) { - updateProgressVisibility(false); + public void onGpxUploadFinished(String result) { + updateProgressVisibility(false); - Fragment target = getTargetFragment(); - if (target instanceof UploadGpxListener) { - ((UploadGpxListener) target).onGpxUploadFinished(result); - } - } + Fragment target = getTargetFragment(); + if (target instanceof UploadGpxListener) { + ((UploadGpxListener) target).onGpxUploadFinished(result); + } + } - private void updateProgressVisibility(boolean visible) { - FragmentActivity activity = getActivity(); - if (AndroidUtils.isActivityNotDestroyed(activity)) { - activity.setProgressBarIndeterminateVisibility(visible); - } + private void updateProgressVisibility(boolean visible) { + if (AndroidUtils.isActivityNotDestroyed(activity)) { + activity.setProgressBarIndeterminateVisibility(visible); + } + } + }; } protected static void showOpenStreetMapScreen(@NonNull FragmentActivity activity) {