Skip to content

Commit

Permalink
Merge pull request #21890 from osmandapp/fix_#21762
Browse files Browse the repository at this point in the history
Fix #21762
  • Loading branch information
Chumva authored Feb 11, 2025
2 parents 243df6d + 047343c commit 7564695
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 103 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@ protected boolean shouldShowFolderStats() {
}

@Override
public void onGpxUploaded(String result) {
public void onGpxUploadFinished(String result) {
dismiss();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package net.osmand.plus.plugins.osmedit.asynctasks;

import android.app.Activity;
import android.os.AsyncTask;

import androidx.annotation.NonNull;
Expand All @@ -10,106 +9,96 @@
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;
import net.osmand.shared.io.KFile;
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.LinkedHashSet;
import java.util.Set;
import java.util.stream.Collectors;

public class UploadGPXFilesTask extends AsyncTask<File, String, String> {

private final OsmandApplication app;
private final GpxDbHelper gpxDbHelper;
private final OpenstreetmapRemoteUtil remoteUtil;
private final WeakReference<Activity> activityRef;

private final String commonTags;
private final Set<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 Set<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;
Set<String> updatedTags = getAdjustedTags(file, includeActivity);
String tagsText = String.join(", ", updatedTags);
String fileDescription = getGpxDescription(file);
String warning = remoteUtil.uploadGPXFile(tagsText, 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;
}

public String removeDefaultActivity() {
String removedDefaultActivity = commonTags;
if (!Algorithms.isEmpty(defaultActivity) && commonTags.contains(defaultActivity)) {
List<String> tagList = Arrays.stream(commonTags.split(","))
.map(String::trim)
.filter(tag -> !tag.equals(defaultActivity))
.collect(Collectors.toList());

removedDefaultActivity = String.join(", ", tagList);
}
return removedDefaultActivity;
private String getGpxDescription(@NonNull File file) {
return Algorithms.isEmpty(description.trim())
? Algorithms.getFileNameWithoutExtension(file.getName()) : description;
}

public String addActivity(@Nullable String activity) {
if (!Algorithms.isEmpty(defaultActivity) && commonTags.contains(defaultActivity)) {
return commonTags.replace(defaultActivity, activity);
} else {
return commonTags + ", " + activity;
@NonNull
private Set<String> getAdjustedTags(@NonNull File file, boolean includeActivity) {
if (includeActivity) {
Set<String> updatedTags = new LinkedHashSet<>(tags);

String activity = getGpxActivity(file);
if (!Algorithms.isEmpty(activity)) {
return updatedTags.stream()
.map(tag -> tag.equals(defaultActivity) ? activity : tag)
.collect(Collectors.toCollection(LinkedHashSet::new));
} else {
updatedTags.remove(defaultActivity);
}
return updatedTags;
}
return tags;
}

@Nullable
Expand All @@ -121,38 +110,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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -43,25 +44,33 @@

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 {
public class SendGpxBottomSheetFragment extends MenuBottomSheetDialogFragment {

public static final String TAG = SendGpxBottomSheetFragment.class.getSimpleName();

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();
}
Expand Down Expand Up @@ -97,11 +106,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;
Expand All @@ -113,9 +121,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;
}
Expand Down Expand Up @@ -181,20 +189,47 @@ protected void onRightBottomButtonClick() {
Editable descrText = messageField.getText();
Editable tagsText = tagsField.getText();
String description = descrText != null ? descrText.toString() : "";
String tags = tagsText != null ? tagsText.toString() : "";
Set<String> tags = tagsText != null ? parseTags(tagsText.toString()) : Collections.emptySet();

UploadGPXFilesTask task = new UploadGPXFilesTask(activity, description, tags, uploadVisibility, this, firstActivity);
OsmandApplication app = getMyApplication();
UploadGpxListener listener = getUploadListener(activity);
UploadGPXFilesTask task = new UploadGPXFilesTask(app, tags, description, defaultActivity, uploadVisibility, listener);
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, files);
}
dismiss();
}

@Override
public void onGpxUploaded(String result) {
Fragment target = getTargetFragment();
if (target instanceof UploadGpxListener) {
((UploadGpxListener) target).onGpxUploaded(result);
}
@NonNull
private Set<String> parseTags(@NonNull String tags) {
return Arrays.stream(tags.split(","))
.map(String::trim)
.filter(tag -> !Algorithms.isEmpty(tag))
.collect(Collectors.toCollection(LinkedHashSet::new));
}

@NonNull
private UploadGpxListener getUploadListener(@NonNull FragmentActivity activity) {
return new UploadGpxListener() {
@Override
public void onGpxUploadStarted() {
updateProgressVisibility(true);
}

public void onGpxUploadFinished(String result) {
updateProgressVisibility(false);

Fragment target = getTargetFragment();
if (target instanceof UploadGpxListener) {
((UploadGpxListener) target).onGpxUploadFinished(result);
}
}

private void updateProgressVisibility(boolean visible) {
if (AndroidUtils.isActivityNotDestroyed(activity)) {
activity.setProgressBarIndeterminateVisibility(visible);
}
}
};
}

protected static void showOpenStreetMapScreen(@NonNull FragmentActivity activity) {
Expand All @@ -214,7 +249,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;
Expand Down

0 comments on commit 7564695

Please sign in to comment.