Skip to content

Commit

Permalink
Fix #21762
Browse files Browse the repository at this point in the history
  • Loading branch information
Chumva committed Feb 11, 2025
1 parent 243df6d commit b59d0cf
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 93 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,97 @@
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.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 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<String> 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
Expand All @@ -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);
}
}
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 Down Expand Up @@ -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();
}
Expand Down Expand Up @@ -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;
Expand All @@ -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;
}
Expand Down Expand Up @@ -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);
}
}

Expand All @@ -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;
Expand Down

0 comments on commit b59d0cf

Please sign in to comment.