Merge pull request #9509 from osmandapp/fix_67

Track point menu fixes
This commit is contained in:
max-klaus 2020-07-30 13:38:05 +03:00 committed by GitHub
commit 1efe021df2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 182 additions and 146 deletions

View file

@ -11,6 +11,7 @@
Thx - Hardy Thx - Hardy
--> -->
<string name="overwrite_track">Overwrite track</string>
<string name="shared_string_done">Done</string> <string name="shared_string_done">Done</string>
<string name="plan_route_select_track_file_for_open">Select a track file for open.</string> <string name="plan_route_select_track_file_for_open">Select a track file for open.</string>
<string name="plan_route_create_new_route">Create new route</string> <string name="plan_route_create_new_route">Create new route</string>

View file

@ -767,8 +767,8 @@ public class SettingsNavigationActivity extends SettingsBaseActivity {
minValue[0] = Math.round(Math.min(minSpeedValue, settingsDefaultSpeed) * ratio[0]); minValue[0] = Math.round(Math.min(minSpeedValue, settingsDefaultSpeed) * ratio[0]);
maxValue[0] = Math.round(Math.max(maxSpeedValue, settingsDefaultSpeed) * ratio[0]); maxValue[0] = Math.round(Math.max(maxSpeedValue, settingsDefaultSpeed) * ratio[0]);
min = Math.round(Math.min(router.getMinSpeed(), settingsDefaultSpeed) * ratio[0] / 2f); min = Math.round(Math.min(minValue[0], router.getMinSpeed() * ratio[0] / 2f));
max = Math.round(Math.max(router.getMaxSpeed(), settingsDefaultSpeed) * ratio[0] * 1.5f); max = Math.round(Math.max(maxValue[0], router.getMaxSpeed() * ratio[0] * 1.5f));
} }
boolean nightMode = !app.getSettings().isLightContentForMode(mode); boolean nightMode = !app.getSettings().isLightContentForMode(mode);

View file

@ -1,15 +1,19 @@
package net.osmand.plus.mapcontextmenu.controllers; package net.osmand.plus.mapcontextmenu.controllers;
import android.app.ProgressDialog; import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask; import android.os.AsyncTask;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import net.osmand.AndroidUtils; import net.osmand.AndroidUtils;
import net.osmand.GPXUtilities; import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.WptPt; import net.osmand.GPXUtilities.WptPt;
import net.osmand.data.LatLon;
import net.osmand.data.PointDescription; import net.osmand.data.PointDescription;
import net.osmand.plus.GpxSelectionHelper; import net.osmand.plus.GpxSelectionHelper;
import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile; import net.osmand.plus.GpxSelectionHelper.SelectedGpxFile;
@ -20,7 +24,10 @@ import net.osmand.plus.activities.TrackActivity;
import net.osmand.plus.helpers.GpxUiHelper; import net.osmand.plus.helpers.GpxUiHelper;
import net.osmand.plus.mapcontextmenu.MenuController; import net.osmand.plus.mapcontextmenu.MenuController;
import net.osmand.plus.mapcontextmenu.builders.SelectedGpxMenuBuilder; import net.osmand.plus.mapcontextmenu.builders.SelectedGpxMenuBuilder;
import net.osmand.plus.myplaces.SaveCurrentTrackTask;
import net.osmand.plus.settings.backend.OsmandSettings; import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.track.SaveGpxAsyncTask.SaveGpxListener;
import net.osmand.util.Algorithms;
import java.io.File; import java.io.File;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
@ -191,6 +198,48 @@ public class SelectedGpxMenuController extends MenuController {
return getIcon(R.drawable.ic_action_polygom_dark, color); return getIcon(R.drawable.ic_action_polygom_dark, color);
} }
@Override
public void share(LatLon latLon, String title, String address) {
MapActivity mapActivity = getMapActivity();
if (mapActivity != null && selectedGpxPoint != null) {
final GPXFile gpxFile = selectedGpxPoint.getSelectedGpxFile().getGpxFile();
if (gpxFile != null) {
if (Algorithms.isEmpty(gpxFile.path)) {
SaveGpxListener saveGpxListener = new SaveGpxListener() {
@Override
public void gpxSavingStarted() {
}
@Override
public void gpxSavingFinished(Exception errorMessage) {
MapActivity mapActivity = getMapActivity();
if (mapActivity != null) {
shareGpx(mapActivity, gpxFile.path);
}
}
};
new SaveCurrentTrackTask(mapActivity.getMyApplication(), gpxFile, saveGpxListener).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
shareGpx(mapActivity, gpxFile.path);
}
}
} else {
super.share(latLon, title, "");
}
}
private void shareGpx(@NonNull Context context, @NonNull String path) {
final Uri fileUri = AndroidUtils.getUriForFile(context, new File(path));
final Intent sendIntent = new Intent(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_STREAM, fileUri);
sendIntent.setType("application/gpx+xml");
sendIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
if (AndroidUtils.isIntentSafe(context, sendIntent)) {
context.startActivity(sendIntent);
}
}
public static class SelectedGpxPoint { public static class SelectedGpxPoint {
private final WptPt selectedPoint; private final WptPt selectedPoint;

View file

@ -95,7 +95,7 @@ public class OptionsBottomSheetDialogFragment extends MenuBottomSheetDialogFragm
BaseBottomSheetItem saveAsNewSegmentItem = new SimpleBottomSheetItem.Builder() BaseBottomSheetItem saveAsNewSegmentItem = new SimpleBottomSheetItem.Builder()
.setIcon(getContentIcon(R.drawable.ic_action_polygom_dark)) .setIcon(getContentIcon(R.drawable.ic_action_polygom_dark))
.setTitle("Overwrite GPX") .setTitle(getString(R.string.overwrite_track))
.setLayoutId(R.layout.bottom_sheet_item_simple) .setLayoutId(R.layout.bottom_sheet_item_simple)
.setOnClickListener(new View.OnClickListener() { .setOnClickListener(new View.OnClickListener() {
@Override @Override

View file

@ -0,0 +1,70 @@
package net.osmand.plus.myplaces;
import android.os.AsyncTask;
import androidx.annotation.NonNull;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.IndexConstants;
import net.osmand.plus.OsmandApplication;
import net.osmand.plus.activities.SavingTrackHelper;
import net.osmand.plus.track.SaveGpxAsyncTask.SaveGpxListener;
import java.io.File;
import java.util.Map;
public class SaveCurrentTrackTask extends AsyncTask<Void, Void, Boolean> {
private final OsmandApplication app;
private final GPXFile gpx;
private final SaveGpxListener saveGpxListener;
public SaveCurrentTrackTask(@NonNull OsmandApplication app, @NonNull GPXFile gpx, @NonNull SaveGpxListener listener) {
this.app = app;
this.gpx = gpx;
saveGpxListener = listener;
}
@Override
protected void onPreExecute() {
if (saveGpxListener != null) {
saveGpxListener.gpxSavingStarted();
}
}
@Override
protected Boolean doInBackground(Void... params) {
SavingTrackHelper savingTrackHelper = app.getSavingTrackHelper();
Map<String, GPXUtilities.GPXFile> files = savingTrackHelper.collectRecordedData();
File dir;
boolean shouldClearPath = false;
if (gpx.path.isEmpty()) {
dir = app.getCacheDir();
shouldClearPath = true;
} else {
dir = app.getAppCustomization().getTracksDir();
}
if (!dir.exists()) {
dir.mkdir();
}
for (final String f : files.keySet()) {
File fout = new File(dir, f + IndexConstants.GPX_FILE_EXT);
GPXUtilities.writeGpxFile(fout, gpx);
}
return shouldClearPath;
}
@Override
protected void onPostExecute(Boolean shouldClearPath) {
if (gpx != null) {
if (saveGpxListener != null) {
saveGpxListener.gpxSavingFinished(null);
}
if (shouldClearPath) {
gpx.path = "";
}
}
}
}

View file

@ -1,49 +0,0 @@
package net.osmand.plus.myplaces;
import android.os.AsyncTask;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile;
import java.io.File;
public class SaveGpxAsyncTask extends AsyncTask<Void, Void, Exception> {
private final GPXFile gpx;
private final SaveGpxListener saveGpxListener;
public SaveGpxAsyncTask(@NonNull GPXFile gpx,
@Nullable SaveGpxListener saveGpxListener) {
this.gpx = gpx;
this.saveGpxListener = saveGpxListener;
}
@Override
protected void onPreExecute() {
if (saveGpxListener != null) {
saveGpxListener.gpxSavingStarted();
}
}
@Override
protected Exception doInBackground(Void... params) {
return GPXUtilities.writeGpxFile(new File(gpx.path), gpx);
}
@Override
protected void onPostExecute(Exception errorMessage) {
if (saveGpxListener != null) {
saveGpxListener.gpxSavingFinished(errorMessage);
}
}
public interface SaveGpxListener {
void gpxSavingStarted();
void gpxSavingFinished(Exception errorMessage);
}
}

View file

@ -46,7 +46,6 @@ import net.osmand.Collator;
import net.osmand.GPXUtilities; import net.osmand.GPXUtilities;
import net.osmand.GPXUtilities.GPXFile; import net.osmand.GPXUtilities.GPXFile;
import net.osmand.GPXUtilities.WptPt; import net.osmand.GPXUtilities.WptPt;
import net.osmand.IndexConstants;
import net.osmand.OsmAndCollator; import net.osmand.OsmAndCollator;
import net.osmand.data.FavouritePoint; import net.osmand.data.FavouritePoint;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
@ -59,7 +58,6 @@ import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType;
import net.osmand.plus.MapMarkersHelper; import net.osmand.plus.MapMarkersHelper;
import net.osmand.plus.MapMarkersHelper.MapMarkersGroup; import net.osmand.plus.MapMarkersHelper.MapMarkersGroup;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.UiUtilities; import net.osmand.plus.UiUtilities;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
@ -67,10 +65,12 @@ import net.osmand.plus.activities.OsmandActionBarActivity;
import net.osmand.plus.activities.OsmandBaseExpandableListAdapter; import net.osmand.plus.activities.OsmandBaseExpandableListAdapter;
import net.osmand.plus.activities.SavingTrackHelper; import net.osmand.plus.activities.SavingTrackHelper;
import net.osmand.plus.activities.TrackActivity; import net.osmand.plus.activities.TrackActivity;
import net.osmand.plus.base.PointImageDrawable;
import net.osmand.plus.base.OsmandExpandableListFragment; import net.osmand.plus.base.OsmandExpandableListFragment;
import net.osmand.plus.base.PointImageDrawable;
import net.osmand.plus.mapmarkers.CoordinateInputDialogFragment; import net.osmand.plus.mapmarkers.CoordinateInputDialogFragment;
import net.osmand.plus.myplaces.TrackBitmapDrawer.TrackBitmapDrawerListener; import net.osmand.plus.myplaces.TrackBitmapDrawer.TrackBitmapDrawerListener;
import net.osmand.plus.settings.backend.OsmandSettings;
import net.osmand.plus.track.SaveGpxAsyncTask.SaveGpxListener;
import net.osmand.plus.widgets.TextViewEx; import net.osmand.plus.widgets.TextViewEx;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
@ -303,10 +303,24 @@ public class TrackPointFragment extends OsmandExpandableListFragment implements
} }
private void shareItems() { private void shareItems() {
GPXFile gpxFile = getGpx(); final GPXFile gpxFile = getGpx();
if (gpxFile != null) { if (gpxFile != null && getTrackActivity() != null) {
if (gpxFile.path.isEmpty() && getTrackActivity() != null) { if (Algorithms.isEmpty(gpxFile.path)) {
new SaveAndShareTask(this, gpxFile).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); SaveGpxListener saveGpxListener = new SaveGpxListener() {
@Override
public void gpxSavingStarted() {
showProgressBar();
}
@Override
public void gpxSavingFinished(Exception errorMessage) {
if (isResumed()) {
hideProgressBar();
shareGpx(gpxFile.path);
}
}
};
new SaveCurrentTrackTask(app, gpxFile, saveGpxListener).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else { } else {
shareGpx(gpxFile.path); shareGpx(gpxFile.path);
} }
@ -1236,62 +1250,6 @@ public class TrackPointFragment extends OsmandExpandableListFragment implements
} }
} }
public static class SaveAndShareTask extends AsyncTask<Void, Void, Boolean> {
private final GPXFile gpx;
private final OsmandApplication app;
private final WeakReference<TrackPointFragment> fragmentRef;
SaveAndShareTask(@NonNull TrackPointFragment fragment, @NonNull GPXFile gpx) {
this.gpx = gpx;
fragmentRef = new WeakReference<>(fragment);
app = fragment.getMyApplication();
}
@Override
protected void onPreExecute() {
TrackPointFragment fragment = fragmentRef.get();
if (fragment != null) {
fragment.showProgressBar();
}
}
@Override
protected Boolean doInBackground(Void... params) {
SavingTrackHelper savingTrackHelper = app.getSavingTrackHelper();
Map<String, GPXFile> files = savingTrackHelper.collectRecordedData();
File dir;
boolean shouldClearPath = false;
if (gpx.path.isEmpty()) {
dir = app.getCacheDir();
shouldClearPath = true;
} else {
dir = app.getAppCustomization().getTracksDir();
}
if (!dir.exists()) {
dir.mkdir();
}
for (final String f : files.keySet()) {
File fout = new File(dir, f + IndexConstants.GPX_FILE_EXT);
GPXUtilities.writeGpxFile(fout, gpx);
}
return shouldClearPath;
}
@Override
protected void onPostExecute(Boolean shouldClearPath) {
TrackPointFragment fragment = fragmentRef.get();
if (gpx != null) {
if (fragment != null && fragment.isResumed()) {
fragment.hideProgressBar();
fragment.shareGpx(gpx.path);
}
if (shouldClearPath) {
gpx.path = "";
}
}
}
}
private static class DeletePointsTask extends AsyncTask<Void, Void, Void> { private static class DeletePointsTask extends AsyncTask<Void, Void, Void> {
private OsmandApplication app; private OsmandApplication app;

View file

@ -32,6 +32,7 @@ import androidx.core.view.ViewPropertyAnimatorListener;
import com.google.android.material.slider.Slider; import com.google.android.material.slider.Slider;
import net.osmand.AndroidUtils; import net.osmand.AndroidUtils;
import net.osmand.GPXUtilities.GPXFile;
import net.osmand.Location; import net.osmand.Location;
import net.osmand.core.android.MapRendererContext; import net.osmand.core.android.MapRendererContext;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
@ -52,6 +53,7 @@ import net.osmand.plus.dashboard.DashboardOnMap.DashboardType;
import net.osmand.plus.dialogs.DirectionsDialogs; import net.osmand.plus.dialogs.DirectionsDialogs;
import net.osmand.plus.helpers.AndroidUiHelper; import net.osmand.plus.helpers.AndroidUiHelper;
import net.osmand.plus.mapcontextmenu.MapContextMenu; import net.osmand.plus.mapcontextmenu.MapContextMenu;
import net.osmand.plus.mapcontextmenu.controllers.SelectedGpxMenuController.SelectedGpxPoint;
import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin; import net.osmand.plus.rastermaps.OsmandRasterMapsPlugin;
import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu; import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu;
import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu.PointType; import net.osmand.plus.routepreparationmenu.MapRouteInfoMenu.PointType;
@ -440,7 +442,7 @@ public class MapControlsLayer extends OsmandMapLayer {
public void navigateButton() { public void navigateButton() {
if (!OsmAndLocationProvider.isLocationPermissionAvailable(mapActivity)) { if (!OsmAndLocationProvider.isLocationPermissionAvailable(mapActivity)) {
ActivityCompat.requestPermissions(mapActivity, ActivityCompat.requestPermissions(mapActivity,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, new String[] {Manifest.permission.ACCESS_FINE_LOCATION},
REQUEST_LOCATION_FOR_NAVIGATION_FAB_PERMISSION); REQUEST_LOCATION_FOR_NAVIGATION_FAB_PERMISSION);
} else { } else {
final MapContextMenu menu = mapActivity.getContextMenu(); final MapContextMenu menu = mapActivity.getContextMenu();
@ -449,43 +451,48 @@ public class MapControlsLayer extends OsmandMapLayer {
menu.hide(); menu.hide();
final TargetPointsHelper targets = mapActivity.getMyApplication().getTargetPointsHelper(); final TargetPointsHelper targets = mapActivity.getMyApplication().getTargetPointsHelper();
RoutingHelper routingHelper = mapActivity.getMyApplication().getRoutingHelper(); RoutingHelper routingHelper = mapActivity.getMyApplication().getRoutingHelper();
if (routingHelper.isFollowingMode() || routingHelper.isRoutePlanningMode()) {
DirectionsDialogs.addWaypointDialogAndLaunchMap(mapActivity, latLon.getLatitude(), Object object = menu.getObject();
latLon.getLongitude(), pointDescription); if (object instanceof SelectedGpxPoint && !((SelectedGpxPoint) object).getSelectedGpxFile().isShowCurrentTrack()) {
} else if (targets.getIntermediatePoints().isEmpty()) { GPXFile gpxFile = ((SelectedGpxPoint) object).getSelectedGpxFile().getGpxFile();
startRoutePlanningWithDestination(latLon, pointDescription, targets); mapActivity.getMapActions().enterRoutePlanningModeGivenGpx(gpxFile, null, null, true, true, MenuState.HEADER_ONLY);
routingHelper.recalculateRouteDueToSettingsChange();
menu.close(); menu.close();
} else { } else {
AlertDialog.Builder bld = new AlertDialog.Builder(mapActivity); if (routingHelper.isFollowingMode() || routingHelper.isRoutePlanningMode()) {
bld.setTitle(R.string.new_directions_point_dialog); DirectionsDialogs.addWaypointDialogAndLaunchMap(mapActivity, latLon.getLatitude(),
final int[] defaultVls = new int[]{0}; latLon.getLongitude(), pointDescription);
bld.setSingleChoiceItems(new String[]{ } else if (targets.getIntermediatePoints().isEmpty()) {
mapActivity.getString(R.string.clear_intermediate_points), startRoutePlanningWithDestination(latLon, pointDescription, targets);
mapActivity.getString(R.string.keep_intermediate_points) menu.close();
}, 0, new DialogInterface.OnClickListener() { } else {
@Override AlertDialog.Builder bld = new AlertDialog.Builder(mapActivity);
public void onClick(DialogInterface dialog, int which) { bld.setTitle(R.string.new_directions_point_dialog);
defaultVls[0] = which; final int[] defaultVls = new int[] {0};
} bld.setSingleChoiceItems(new String[] {
}); mapActivity.getString(R.string.clear_intermediate_points),
bld.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() { mapActivity.getString(R.string.keep_intermediate_points)
}, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
defaultVls[0] = which;
}
});
bld.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
if (defaultVls[0] == 0) { if (defaultVls[0] == 0) {
targets.removeAllWayPoints(false, true); targets.removeAllWayPoints(false, true);
targets.navigateToPoint(latLon, true, -1, pointDescription); }
mapActivity.getMapActions().enterRoutePlanningModeGivenGpx(null, null, null, true, true, MenuState.HEADER_ONLY);
menu.close();
} else {
targets.navigateToPoint(latLon, true, -1, pointDescription); targets.navigateToPoint(latLon, true, -1, pointDescription);
mapActivity.getMapActions().enterRoutePlanningModeGivenGpx(null, null, null, true, true, MenuState.HEADER_ONLY); mapActivity.getMapActions().enterRoutePlanningModeGivenGpx(null, null, null, true, true, MenuState.HEADER_ONLY);
menu.close(); menu.close();
} }
} });
}); bld.setNegativeButton(R.string.shared_string_cancel, null);
bld.setNegativeButton(R.string.shared_string_cancel, null); bld.show();
bld.show(); }
} }
} }
} }