Merge remote-tracking branch 'origin/master'

This commit is contained in:
Weblate 2017-08-04 21:45:32 +02:00
commit 933f45c377
30 changed files with 1069 additions and 295 deletions

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout <LinearLayout
android:id="@+id/add_gpx_waypoint_bottom_sheet" android:id="@+id/add_gpx_point_bottom_sheet"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -25,14 +25,14 @@
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
android:id="@+id/add_gpx_waypoint_bottom_sheet_title" android:id="@+id/add_gpx_point_bottom_sheet_title"
style="@style/TextAppearance.ContextMenuTitle" style="@style/TextAppearance.ContextMenuTitle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="16dp" android:layout_marginLeft="16dp"
android:layout_marginRight="16dp" android:layout_marginRight="16dp"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:text="@string/add_gpx_waypoint_bottom_sheet_title"/> android:text="@string/waypoint_one"/>
<TextView <TextView
android:id="@+id/description" android:id="@+id/description"
@ -53,7 +53,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center_vertical" android:layout_gravity="center_vertical"
android:text="@string/shared_string_create"/> android:text="@string/shared_string_add"/>
<android.support.v7.widget.AppCompatButton <android.support.v7.widget.AppCompatButton
android:id="@+id/cancel_button" android:id="@+id/cancel_button"

View file

@ -262,7 +262,7 @@
tools:visibility="visible"/> tools:visibility="visible"/>
<include <include
layout="@layout/add_gpx_waypoint_bottom_sheet" layout="@layout/add_gpx_point_bottom_sheet"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="bottom|left" android:layout_gravity="bottom|left"

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout <LinearLayout
android:id="@+id/add_gpx_waypoint_bottom_sheet" android:id="@+id/add_gpx_point_bottom_sheet"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
@ -24,14 +24,14 @@
android:orientation="vertical"> android:orientation="vertical">
<TextView <TextView
android:id="@+id/add_gpx_waypoint_bottom_sheet_title" android:id="@+id/add_gpx_point_bottom_sheet_title"
style="@style/TextAppearance.ContextMenuTitle" style="@style/TextAppearance.ContextMenuTitle"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="16dp" android:layout_marginLeft="16dp"
android:layout_marginRight="16dp" android:layout_marginRight="16dp"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:text="@string/add_gpx_waypoint_bottom_sheet_title"/> tools:text="@string/waypoint_one"/>
<TextView <TextView
android:id="@+id/description" android:id="@+id/description"
@ -55,7 +55,7 @@
android:id="@+id/create_button" android:id="@+id/create_button"
style="@style/DialogActionButton" style="@style/DialogActionButton"
android:layout_marginRight="8dp" android:layout_marginRight="8dp"
android:text="@string/shared_string_create"/> android:text="@string/shared_string_add"/>
<Button <Button
android:id="@+id/cancel_button" android:id="@+id/cancel_button"

View file

@ -43,11 +43,9 @@
android:layout_alignParentEnd="true" android:layout_alignParentEnd="true"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginEnd="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp"
android:background="@null" android:background="@null"
android:paddingEnd="16dp"
android:paddingStart="16dp"
tools:src="@drawable/ic_action_arrow_down"/> tools:src="@drawable/ic_action_arrow_down"/>
<TextView <TextView
@ -83,6 +81,28 @@
android:layout_height="1dp" android:layout_height="1dp"
android:background="?attr/dashboard_divider"/> android:background="?attr/dashboard_divider"/>
<LinearLayout
android:id="@+id/points_list_container"
android:layout_width="match_parent"
android:layout_height="220dp"
android:background="@color/ctx_menu_info_view_bg_dark"
android:orientation="vertical"
android:visibility="gone">
<include layout="@layout/card_bottom_divider"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/points_recycler_view"
android:layout_width="match_parent"
android:layout_height="215dp"/>
<ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="fitXY"
android:src="@drawable/bg_shadow_onmap"/>
</LinearLayout>
<RelativeLayout <RelativeLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content"> android:layout_height="wrap_content">
@ -94,11 +114,9 @@
android:layout_alignParentLeft="true" android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginEnd="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginStart="16dp"
android:background="@null" android:background="@null"
android:paddingEnd="16dp"
android:paddingStart="16dp"
tools:src="@drawable/ic_action_undo_dark"/> tools:src="@drawable/ic_action_undo_dark"/>
<ImageButton <ImageButton
@ -106,11 +124,11 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:layout_toEndOf="@id/undo_point_button" android:layout_toEndOf="@id/undo_point_button"
android:layout_toRightOf="@id/undo_point_button" android:layout_toRightOf="@id/undo_point_button"
android:background="@null" android:background="@null"
android:paddingEnd="8dp"
android:paddingStart="8dp"
tools:src="@drawable/ic_action_redo_dark"/> tools:src="@drawable/ic_action_redo_dark"/>
<Button <Button

View file

@ -223,7 +223,7 @@
<include layout="@layout/move_marker_bottom_sheet" <include layout="@layout/move_marker_bottom_sheet"
tools:visibility="gone"/> tools:visibility="gone"/>
<include layout="@layout/add_gpx_waypoint_bottom_sheet" <include layout="@layout/add_gpx_point_bottom_sheet"
tools:visibility="gone"/> tools:visibility="gone"/>
<FrameLayout <FrameLayout

View file

@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/MainLayout" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" xmlns:osmand="http://schemas.android.com/apk/res-auto"
android:layout_height="match_parent" android:id="@+id/MainLayout"
android:orientation="vertical"> android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ExpandableListView <ExpandableListView
android:id="@android:id/list" android:id="@android:id/list"
@ -16,17 +18,96 @@
android:divider="@null" android:divider="@null"
android:dividerHeight="0dp" android:dividerHeight="0dp"
android:drawSelectorOnTop="false" android:drawSelectorOnTop="false"
android:groupIndicator="@android:color/transparent" /> android:groupIndicator="@android:color/transparent"/>
<android.support.design.widget.FloatingActionButton <android.support.design.widget.FloatingActionButton
android:id="@+id/fabButton" android:id="@+id/menu_fab"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:layout_margin="16dp" android:layout_margin="16dp"
android:src="@drawable/ic_action_plus"
android:contentDescription="@string/quick_action_new_action" android:contentDescription="@string/quick_action_new_action"
app:backgroundTint="@color/dashboard_blue"/> android:src="@drawable/ic_action_plus"
app:backgroundTint="@color/dashboard_blue"
app:fabSize="normal"/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/waypoint_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/menu_fab"
android:layout_alignParentRight="true"
android:layout_marginRight="24dp"
android:contentDescription="@string/quick_action_new_action"
android:src="@drawable/ic_action_marker_dark"
android:visibility="gone"
app:backgroundTint="@color/dashboard_blue"
app:fabSize="mini"
tools:visibility="visible"/>
<FrameLayout
android:id="@+id/waypoint_text_layout"
android:layout_toLeftOf="@id/waypoint_fab"
android:layout_toStartOf="@id/waypoint_fab"
android:layout_above="@id/menu_fab"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_marginRight="16dp"
android:layout_marginEnd="16dp"
android:visibility="gone"
tools:visibility="visible">
<net.osmand.plus.widgets.TextViewEx
android:textColor="?android:attr/textColorPrimary"
osmand:typeface="@string/font_roboto_medium"
android:layout_gravity="center_vertical"
android:id="@+id/waypoint_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text="@string/add_waypoint"/>
</FrameLayout>
<android.support.design.widget.FloatingActionButton
android:id="@+id/route_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@id/waypoint_fab"
android:layout_alignParentRight="true"
android:layout_marginBottom="16dp"
android:layout_marginRight="24dp"
android:contentDescription="@string/quick_action_new_action"
android:src="@drawable/ic_action_markers_dark"
android:visibility="gone"
app:backgroundTint="@color/dashboard_blue"
app:fabSize="mini"
tools:visibility="visible"/>
<FrameLayout
android:id="@+id/route_text_layout"
android:layout_toLeftOf="@id/route_fab"
android:layout_toStartOf="@id/route_fab"
android:layout_above="@id/waypoint_fab"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_marginBottom="16dp"
android:layout_marginRight="16dp"
android:layout_marginEnd="16dp"
android:visibility="gone"
tools:visibility="visible">
<net.osmand.plus.widgets.TextViewEx
android:textColor="?android:attr/textColorPrimary"
osmand:typeface="@string/font_roboto_medium"
android:layout_gravity="center_vertical"
android:id="@+id/route_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:text="@string/add_route_point"/>
</FrameLayout>
</RelativeLayout> </RelativeLayout>

View file

@ -0,0 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<EditText
android:id="@+id/gpx_name_et"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:inputType="text"/>
<TextView
android:id="@+id/file_exists_text_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginStart="16dp"
android:gravity="center_horizontal"
android:text="@string/file_with_name_already_exists"
android:textColor="@color/marker_red"
android:visibility="invisible"/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_marginTop="8dp"
android:background="?attr/dashboard_divider"/>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp">
<android.support.v7.widget.SwitchCompat
android:id="@+id/toggle_show_on_map"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginLeft="16dp"
android:layout_marginStart="16dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/toggle_row_toggle"
android:layout_toStartOf="@id/toggle_row_toggle"
android:text="@string/show_on_map_after_saving"/>
</RelativeLayout>
</LinearLayout>

View file

@ -9,8 +9,11 @@
3. All your modified/created strings are in the top of the file (to make easier find what\'s translated). 3. All your modified/created strings are in the top of the file (to make easier find what\'s translated).
PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy PLEASE: Have a look at http://code.google.com/p/osmand/wiki/UIConsistency, it may really improve your and our work :-) Thx - Hardy
--> -->
<string name="measurement_tool_action_bar">Select a location on the map and click "Add" to add a point to the ruler.</string> <string name="none_point_error">You need to add at least one point.</string>
<string name="measurement_tool">Measurement tool</string> <string name="enter_gpx_name">Enter name for GPX</string>
<string name="show_on_map_after_saving">Show on map after saving</string>
<string name="measurement_tool_action_bar">Browse map and add points to a line</string>
<string name="measurement_tool">Measure distance</string>
<string name="quick_action_resume_pause_navigation">Resume/Pause Navigation</string> <string name="quick_action_resume_pause_navigation">Resume/Pause Navigation</string>
<string name="quick_action_resume_pause_navigation_descr">Press this button to pause the navigation, or to resume it if it was already paused.</string> <string name="quick_action_resume_pause_navigation_descr">Press this button to pause the navigation, or to resume it if it was already paused.</string>
<string name="quick_action_show_navigation_finish_dialog">Show Finish navigation dialog</string> <string name="quick_action_show_navigation_finish_dialog">Show Finish navigation dialog</string>
@ -2660,6 +2663,10 @@
<string name="shared_string_action_name">Action name</string> <string name="shared_string_action_name">Action name</string>
<string name="mappilary_no_internet_desc">You need internet to view photos from Mapillary</string> <string name="mappilary_no_internet_desc">You need internet to view photos from Mapillary</string>
<string name="retry">Retry</string> <string name="retry">Retry</string>
<string name="add_gpx_waypoint_bottom_sheet_title">Add gpx waypoint</string> <string name="add_route_point">Add Route Point</string>
<string name="shared_string_create">Create</string> <string name="add_waypoint">Add Waypoint</string>
<string name="save_gpx_waypoint">Save GPX Waypoint</string>
<string name="save_route_point">Save Route Point</string>
<string name="waypoint_one">Waypoint 1</string>
<string name="route_point_one">Route Point 1</string>
</resources> </resources>

View file

@ -24,6 +24,7 @@ public class PointDescription {
public static final String POINT_TYPE_FAVORITE = "favorite"; public static final String POINT_TYPE_FAVORITE = "favorite";
public static final String POINT_TYPE_WPT = "wpt"; public static final String POINT_TYPE_WPT = "wpt";
public static final String POINT_TYPE_RTE = "rte";
public static final String POINT_TYPE_POI = "poi"; public static final String POINT_TYPE_POI = "poi";
public static final String POINT_TYPE_ADDRESS = "address"; public static final String POINT_TYPE_ADDRESS = "address";
public static final String POINT_TYPE_OSM_NOTE= "osm_note"; public static final String POINT_TYPE_OSM_NOTE= "osm_note";
@ -211,6 +212,10 @@ public class PointDescription {
public boolean isWpt() { public boolean isWpt() {
return POINT_TYPE_WPT.equals(type); return POINT_TYPE_WPT.equals(type);
} }
public boolean isRte() {
return POINT_TYPE_RTE.equals(type);
}
public boolean isPoi() { public boolean isPoi() {
return POINT_TYPE_POI.equals(type); return POINT_TYPE_POI.equals(type);

View file

@ -102,18 +102,6 @@ public class GPXUtilities {
public float speed; public float speed;
} }
public static class NewGpxWaypoint {
private GPXFile gpx;
public NewGpxWaypoint(GPXFile gpx) {
this.gpx = gpx;
}
public GPXFile getGpx() {
return gpx;
}
}
public static class WptPt extends GPXExtensions implements LocationPoint { public static class WptPt extends GPXExtensions implements LocationPoint {
public boolean firstPoint = false; public boolean firstPoint = false;
public boolean lastPoint = false; public boolean lastPoint = false;
@ -872,6 +860,29 @@ public class GPXUtilities {
} }
points.add(pt); points.add(pt);
modifiedTime = System.currentTimeMillis();
return pt;
}
public WptPt addRtePt(double lat, double lon, long time, String description, String name, String category, int color) {
double latAdjusted = Double.parseDouble(latLonFormat.format(lat));
double lonAdjusted = Double.parseDouble(latLonFormat.format(lon));
final WptPt pt = new WptPt(latAdjusted, lonAdjusted, time, Double.NaN, 0, Double.NaN);
pt.name = name;
pt.category = category;
pt.desc = description;
if (color != 0) {
pt.setColor(color);
}
if (routes.size() == 0) {
routes.add(new Route());
}
Route currentRoute = routes.get(routes.size() -1);
currentRoute.points.add(pt);
modifiedTime = System.currentTimeMillis(); modifiedTime = System.currentTimeMillis();
return pt; return pt;

View file

@ -57,8 +57,6 @@ import net.osmand.plus.AppInitializer;
import net.osmand.plus.AppInitializer.AppInitializeListener; import net.osmand.plus.AppInitializer.AppInitializeListener;
import net.osmand.plus.AppInitializer.InitEvents; import net.osmand.plus.AppInitializer.InitEvents;
import net.osmand.plus.ApplicationMode; import net.osmand.plus.ApplicationMode;
import net.osmand.plus.GPXUtilities;
import net.osmand.plus.GPXUtilities.NewGpxWaypoint;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem; import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
import net.osmand.plus.MapMarkersHelper.MapMarker; import net.osmand.plus.MapMarkersHelper.MapMarker;
import net.osmand.plus.MapMarkersHelper.MapMarkerChangedListener; import net.osmand.plus.MapMarkersHelper.MapMarkerChangedListener;
@ -97,6 +95,7 @@ import net.osmand.plus.mapcontextmenu.other.DestinationReachedMenu;
import net.osmand.plus.mapcontextmenu.other.MapRouteInfoMenu; import net.osmand.plus.mapcontextmenu.other.MapRouteInfoMenu;
import net.osmand.plus.mapcontextmenu.other.MapRouteInfoMenuFragment; import net.osmand.plus.mapcontextmenu.other.MapRouteInfoMenuFragment;
import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu; import net.osmand.plus.mapcontextmenu.other.TrackDetailsMenu;
import net.osmand.plus.measurementtool.MeasurementToolFragment;
import net.osmand.plus.render.RendererRegistry; import net.osmand.plus.render.RendererRegistry;
import net.osmand.plus.resources.ResourceManager; import net.osmand.plus.resources.ResourceManager;
import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.routing.RoutingHelper;
@ -105,6 +104,7 @@ import net.osmand.plus.routing.RoutingHelper.RouteCalculationProgressCallback;
import net.osmand.plus.search.QuickSearchDialogFragment; import net.osmand.plus.search.QuickSearchDialogFragment;
import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchTab; import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchTab;
import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchType; import net.osmand.plus.search.QuickSearchDialogFragment.QuickSearchType;
import net.osmand.plus.views.AddGpxPointBottomSheetHelper.NewGpxPoint;
import net.osmand.plus.views.AnimateDraggingMapThread; import net.osmand.plus.views.AnimateDraggingMapThread;
import net.osmand.plus.views.MapControlsLayer; import net.osmand.plus.views.MapControlsLayer;
import net.osmand.plus.views.MapInfoLayer; import net.osmand.plus.views.MapInfoLayer;
@ -500,6 +500,14 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
return; return;
} }
} }
if (getMeasurementToolFragment() != null) {
getMeasurementToolFragment().showQuitDialog();
return;
}
if (mapContextMenu.isVisible() && mapContextMenu.isClosable()) {
mapContextMenu.close();
return;
}
if (prevActivityIntent != null && getSupportFragmentManager().getBackStackEntryCount() == 0) { if (prevActivityIntent != null && getSupportFragmentManager().getBackStackEntryCount() == 0) {
prevActivityIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); prevActivityIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
LatLon loc = getMapLocation(); LatLon loc = getMapLocation();
@ -918,9 +926,9 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
} else if (toShow instanceof QuadRect) { } else if (toShow instanceof QuadRect) {
QuadRect qr = (QuadRect) toShow; QuadRect qr = (QuadRect) toShow;
mapView.fitRectToMap(qr.left, qr.right, qr.top, qr.bottom, (int) qr.width(), (int) qr.height(), 0); mapView.fitRectToMap(qr.left, qr.right, qr.top, qr.bottom, (int) qr.width(), (int) qr.height(), 0);
} else if (toShow instanceof NewGpxWaypoint) { } else if (toShow instanceof NewGpxPoint) {
NewGpxWaypoint newGpxWaypoint = (NewGpxWaypoint) toShow; NewGpxPoint newGpxPoint = (NewGpxPoint) toShow;
getMapLayers().getContextMenuLayer().enterAddGpxWaypointMode(newGpxWaypoint); getMapLayers().getContextMenuLayer().enterAddGpxPointMode(newGpxPoint);
} else { } else {
mapContextMenu.show(latLonToShow, mapLabelToShow, toShow); mapContextMenu.show(latLonToShow, mapLabelToShow, toShow);
} }
@ -1675,6 +1683,11 @@ public class MapActivity extends OsmandActionBarActivity implements DownloadEven
return fragment!= null && !fragment.isDetached() && !fragment.isRemoving() ? (QuickSearchDialogFragment) fragment : null; return fragment!= null && !fragment.isDetached() && !fragment.isRemoving() ? (QuickSearchDialogFragment) fragment : null;
} }
public MeasurementToolFragment getMeasurementToolFragment() {
Fragment fragment = getSupportFragmentManager().findFragmentByTag(MeasurementToolFragment.TAG);
return fragment != null && !fragment.isDetached() && !fragment.isRemoving() ? (MeasurementToolFragment) fragment : null;
}
public boolean isTopToolbarActive() { public boolean isTopToolbarActive() {
MapInfoLayer mapInfoLayer = getMapLayers().getMapInfoLayer(); MapInfoLayer mapInfoLayer = getMapLayers().getMapInfoLayer();
return mapInfoLayer.hasTopToolbar(); return mapInfoLayer.hasTopToolbar();

View file

@ -696,21 +696,6 @@ public class MapActivityActions implements DialogProvider {
} }
}).createItem()); }).createItem());
optionsMenuHelper.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.measurement_tool, mapActivity)
.setIcon(R.drawable.ic_action_ruler)
.setListener(new ContextMenuAdapter.ItemClickListener() {
@Override
public boolean onContextMenuClick(ArrayAdapter<ContextMenuItem> adapter, int itemId, int position, boolean isChecked) {
MeasurementToolFragment fragment = new MeasurementToolFragment();
mapActivity.getSupportFragmentManager()
.beginTransaction()
.add(R.id.bottomFragmentContainer, fragment, MeasurementToolFragment.TAG)
.addToBackStack(MeasurementToolFragment.TAG)
.commitAllowingStateLoss();
return true;
}
}).createItem());
optionsMenuHelper.addItem(new ItemBuilder().setTitleId(R.string.get_directions, mapActivity) optionsMenuHelper.addItem(new ItemBuilder().setTitleId(R.string.get_directions, mapActivity)
.setIcon(R.drawable.ic_action_gdirections_dark) .setIcon(R.drawable.ic_action_gdirections_dark)
.setListener(new ContextMenuAdapter.ItemClickListener() { .setListener(new ContextMenuAdapter.ItemClickListener() {
@ -774,6 +759,21 @@ public class MapActivityActions implements DialogProvider {
}).createItem()); }).createItem());
*/ */
optionsMenuHelper.addItem(new ContextMenuItem.ItemBuilder().setTitleId(R.string.measurement_tool, mapActivity)
.setIcon(R.drawable.ic_action_ruler)
.setListener(new ContextMenuAdapter.ItemClickListener() {
@Override
public boolean onContextMenuClick(ArrayAdapter<ContextMenuItem> adapter, int itemId, int position, boolean isChecked) {
MeasurementToolFragment fragment = new MeasurementToolFragment();
mapActivity.getSupportFragmentManager()
.beginTransaction()
.add(R.id.bottomFragmentContainer, fragment, MeasurementToolFragment.TAG)
.addToBackStack(MeasurementToolFragment.TAG)
.commitAllowingStateLoss();
return true;
}
}).createItem());
optionsMenuHelper.addItem(new ItemBuilder().setTitleId(R.string.prefs_plugins, mapActivity) optionsMenuHelper.addItem(new ItemBuilder().setTitleId(R.string.prefs_plugins, mapActivity)
.setIcon(R.drawable.ic_extension_dark) .setIcon(R.drawable.ic_extension_dark)
.setListener(new ItemClickListener() { .setListener(new ItemClickListener() {
@ -843,16 +843,16 @@ public class MapActivityActions implements DialogProvider {
//////////// Others //////////// Others
OsmandPlugin.registerOptionsMenu(mapActivity, optionsMenuHelper); OsmandPlugin.registerOptionsMenu(mapActivity, optionsMenuHelper);
int pluginsItemIndex = -1; int measureDistanceItemIndex = -1;
for (int i = 0; i < optionsMenuHelper.length(); i++) { for (int i = 0; i < optionsMenuHelper.length(); i++) {
if (optionsMenuHelper.getItem(i).getTitleId() == R.string.prefs_plugins) { if (optionsMenuHelper.getItem(i).getTitleId() == R.string.measurement_tool) {
pluginsItemIndex = i; measureDistanceItemIndex = i;
break; break;
} }
} }
ItemBuilder divider = new ItemBuilder().setLayout(R.layout.drawer_divider); ItemBuilder divider = new ItemBuilder().setLayout(R.layout.drawer_divider);
divider.setPosition(pluginsItemIndex >= 0 ? pluginsItemIndex : 7); divider.setPosition(measureDistanceItemIndex >= 0 ? measureDistanceItemIndex : 8);
optionsMenuHelper.addItem(divider.createItem()); optionsMenuHelper.addItem(divider.createItem());
getMyApplication().getAppCustomization().prepareOptionsMenu(mapActivity, optionsMenuHelper); getMyApplication().getAppCustomization().prepareOptionsMenu(mapActivity, optionsMenuHelper);

View file

@ -36,6 +36,7 @@ import java.util.List;
public class TrackActivity extends TabActivity { public class TrackActivity extends TabActivity {
public static final String TRACK_FILE_NAME = "TRACK_FILE_NAME"; public static final String TRACK_FILE_NAME = "TRACK_FILE_NAME";
public static final String OPEN_POINTS_TAB = "OPEN_POINTS_TAB";
public static final String CURRENT_RECORDING = "CURRENT_RECORDING"; public static final String CURRENT_RECORDING = "CURRENT_RECORDING";
protected List<WeakReference<Fragment>> fragList = new ArrayList<>(); protected List<WeakReference<Fragment>> fragList = new ArrayList<>();
protected PagerSlidingTabStrip slidingTabLayout; protected PagerSlidingTabStrip slidingTabLayout;
@ -47,6 +48,7 @@ public class TrackActivity extends TabActivity {
private List<GpxDisplayGroup> displayGroups; private List<GpxDisplayGroup> displayGroups;
private List<GpxDisplayGroup> originalGroups = new ArrayList<>(); private List<GpxDisplayGroup> originalGroups = new ArrayList<>();
private boolean stopped = false; private boolean stopped = false;
public boolean openPointsTab = false;
public PagerSlidingTabStrip getSlidingTabLayout() { public PagerSlidingTabStrip getSlidingTabLayout() {
return slidingTabLayout; return slidingTabLayout;
@ -75,6 +77,9 @@ public class TrackActivity extends TabActivity {
} }
actionBar.setElevation(0); actionBar.setElevation(0);
} }
if (intent.hasExtra(OPEN_POINTS_TAB)) {
openPointsTab = true;
}
setContentView(R.layout.tab_content); setContentView(R.layout.tab_content);
} }
@ -188,6 +193,9 @@ public class TrackActivity extends TabActivity {
if (isHavingWayPoints() || isHavingRoutePoints()) { if (isHavingWayPoints() || isHavingRoutePoints()) {
((OsmandFragmentPagerAdapter) mViewPager.getAdapter()).addTab( ((OsmandFragmentPagerAdapter) mViewPager.getAdapter()).addTab(
getTabIndicator(R.string.points, TrackPointFragment.class)); getTabIndicator(R.string.points, TrackPointFragment.class));
if (openPointsTab) {
mViewPager.setCurrentItem(1, false);
}
} else { } else {
slidingTabLayout.setVisibility(View.GONE); slidingTabLayout.setVisibility(View.GONE);
getSupportActionBar().setElevation(AndroidUtils.dpToPx(getMyApplication(), 4f)); getSupportActionBar().setElevation(AndroidUtils.dpToPx(getMyApplication(), 4f));

View file

@ -40,6 +40,7 @@ import net.osmand.plus.mapcontextmenu.MenuController.TitleProgressController;
import net.osmand.plus.mapcontextmenu.controllers.MapDataMenuController; import net.osmand.plus.mapcontextmenu.controllers.MapDataMenuController;
import net.osmand.plus.mapcontextmenu.editors.FavoritePointEditor; import net.osmand.plus.mapcontextmenu.editors.FavoritePointEditor;
import net.osmand.plus.mapcontextmenu.editors.PointEditor; import net.osmand.plus.mapcontextmenu.editors.PointEditor;
import net.osmand.plus.mapcontextmenu.editors.RtePtEditor;
import net.osmand.plus.mapcontextmenu.editors.WptPtEditor; import net.osmand.plus.mapcontextmenu.editors.WptPtEditor;
import net.osmand.plus.mapcontextmenu.other.MapMultiSelectionMenu; import net.osmand.plus.mapcontextmenu.other.MapMultiSelectionMenu;
import net.osmand.plus.mapcontextmenu.other.ShareMenu; import net.osmand.plus.mapcontextmenu.other.ShareMenu;
@ -64,6 +65,7 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL
private FavoritePointEditor favoritePointEditor; private FavoritePointEditor favoritePointEditor;
private WptPtEditor wptPtEditor; private WptPtEditor wptPtEditor;
private RtePtEditor rtePtEditor;
private boolean active; private boolean active;
private LatLon latLon; private LatLon latLon;
@ -147,6 +149,9 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL
if (wptPtEditor != null) { if (wptPtEditor != null) {
wptPtEditor.setMapActivity(mapActivity); wptPtEditor.setMapActivity(mapActivity);
} }
if (rtePtEditor != null) {
rtePtEditor.setMapActivity(mapActivity);
}
if (active) { if (active) {
acquireMenuController(false); acquireMenuController(false);
@ -196,11 +201,20 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL
return wptPtEditor; return wptPtEditor;
} }
public RtePtEditor getRtePtPointEditor() {
if (rtePtEditor == null) {
rtePtEditor = new RtePtEditor(mapActivity);
}
return rtePtEditor;
}
public PointEditor getPointEditor(String tag) { public PointEditor getPointEditor(String tag) {
if (favoritePointEditor != null && favoritePointEditor.getFragmentTag().equals(tag)) { if (favoritePointEditor != null && favoritePointEditor.getFragmentTag().equals(tag)) {
return favoritePointEditor; return favoritePointEditor;
} else if (wptPtEditor != null && wptPtEditor.getFragmentTag().equals(tag)) { } else if (wptPtEditor != null && wptPtEditor.getFragmentTag().equals(tag)) {
return wptPtEditor; return wptPtEditor;
} else if (rtePtEditor != null && rtePtEditor.getFragmentTag().equals(tag)) {
return rtePtEditor;
} }
return null; return null;
} }
@ -379,15 +393,9 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL
WeakReference<MapContextMenuFragment> fragmentRef = findMenuFragment(); WeakReference<MapContextMenuFragment> fragmentRef = findMenuFragment();
init(latLon, pointDescription, object, true, false); init(latLon, pointDescription, object, true, false);
if (fragmentRef != null) { if (fragmentRef != null) {
fragmentRef.get().rebuildMenu(); fragmentRef.get().rebuildMenu(centerMarker);
}
}
public void rebuildMenu() {
WeakReference<MapContextMenuFragment> fragmentRef = findMenuFragment();
if (fragmentRef != null) {
fragmentRef.get().rebuildMenu();
} }
centerMarker = false;
} }
public void showOrUpdate(LatLon latLon, PointDescription pointDescription, Object object) { public void showOrUpdate(LatLon latLon, PointDescription pointDescription, Object object) {
@ -609,8 +617,12 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL
public void onSingleTapOnMap() { public void onSingleTapOnMap() {
if (menuController == null || !menuController.handleSingleTapOnMap()) { if (menuController == null || !menuController.handleSingleTapOnMap()) {
updateMapCenter(null); if (menuController != null && !menuController.isClosable()) {
close(); hide();
} else {
updateMapCenter(null);
close();
}
if (mapActivity.getMapLayers().getMapQuickActionLayer().isLayerOn()) { if (mapActivity.getMapLayers().getMapQuickActionLayer().isLayerOn()) {
mapActivity.getMapLayers().getMapQuickActionLayer().refreshLayer(); mapActivity.getMapLayers().getMapQuickActionLayer().refreshLayer();
} }
@ -994,6 +1006,10 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL
return menuController == null || menuController.fabVisible(); return menuController == null || menuController.fabVisible();
} }
public boolean isClosable() {
return menuController == null || menuController.isClosable();
}
public boolean buttonsVisible() { public boolean buttonsVisible() {
return menuController == null || menuController.buttonsVisible(); return menuController == null || menuController.buttonsVisible();
} }

View file

@ -792,7 +792,7 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents {
menu.setMapZoom(0); menu.setMapZoom(0);
} }
public void rebuildMenu() { public void rebuildMenu(boolean centered) {
OsmandApplication app = getMyApplication(); OsmandApplication app = getMyApplication();
if (app != null && view != null) { if (app != null && view != null) {
IconsCache iconsCache = app.getIconsCache(); IconsCache iconsCache = app.getIconsCache();
@ -807,6 +807,10 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents {
bottomLayout.removeAllViews(); bottomLayout.removeAllViews();
buildBottomView(); buildBottomView();
if (centered) {
this.initLayout = true;
this.centered = true;
}
runLayoutListener(); runLayoutListener();
} }
} }
@ -1284,7 +1288,7 @@ public class MapContextMenuFragment extends Fragment implements DownloadEvents {
public void downloadHasFinished() { public void downloadHasFinished() {
updateOnDownload(); updateOnDownload();
if (menu != null && menu.isVisible() && menu.isMapDownloaded()) { if (menu != null && menu.isVisible() && menu.isMapDownloaded()) {
rebuildMenu(); rebuildMenu(false);
} }
} }

View file

@ -69,6 +69,7 @@ public class MenuBuilder {
private LatLon latLon; private LatLon latLon;
private boolean hidden; private boolean hidden;
private boolean showNearestWiki = false; private boolean showNearestWiki = false;
private boolean showOnlinePhotos = true;
protected List<Amenity> nearestWiki = new ArrayList<>(); protected List<Amenity> nearestWiki = new ArrayList<>();
private List<OsmandPlugin> menuPlugins = new ArrayList<>(); private List<OsmandPlugin> menuPlugins = new ArrayList<>();
private CardsRowBuilder onlinePhotoCardsRow; private CardsRowBuilder onlinePhotoCardsRow;
@ -207,6 +208,14 @@ public class MenuBuilder {
this.showNearestWiki = showNearestWiki; this.showNearestWiki = showNearestWiki;
} }
public boolean isShowOnlinePhotos() {
return showOnlinePhotos;
}
public void setShowOnlinePhotos(boolean showOnlinePhotos) {
this.showOnlinePhotos = showOnlinePhotos;
}
public void setShowNearestWiki(boolean showNearestWiki, long objectId) { public void setShowNearestWiki(boolean showNearestWiki, long objectId) {
this.objectId = objectId; this.objectId = objectId;
this.showNearestWiki = showNearestWiki; this.showNearestWiki = showNearestWiki;
@ -228,7 +237,9 @@ public class MenuBuilder {
buildPlainMenuItems(view); buildPlainMenuItems(view);
} }
buildInternal(view); buildInternal(view);
buildNearestPhotosRow(view); if (showOnlinePhotos) {
buildNearestPhotosRow(view);
}
buildPluginRows(view); buildPluginRows(view);
buildAfter(view); buildAfter(view);
} }

View file

@ -348,6 +348,10 @@ public abstract class MenuController extends BaseMenuController {
return false; return false;
} }
public boolean isClosable() {
return true;
}
public boolean needStreetName() { public boolean needStreetName() {
return !displayDistanceDirection(); return !displayDistanceDirection();
} }

View file

@ -10,13 +10,11 @@ import net.osmand.data.TransportStop;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.mapcontextmenu.MapContextMenu; import net.osmand.plus.mapcontextmenu.MapContextMenu;
import net.osmand.plus.mapcontextmenu.MapContextMenuFragment;
import net.osmand.plus.mapcontextmenu.MenuBuilder; import net.osmand.plus.mapcontextmenu.MenuBuilder;
import net.osmand.plus.mapcontextmenu.MenuController; import net.osmand.plus.mapcontextmenu.MenuController;
import net.osmand.plus.mapcontextmenu.controllers.TransportStopController.TransportStopRoute; import net.osmand.plus.mapcontextmenu.controllers.TransportStopController.TransportStopRoute;
import net.osmand.plus.views.TransportStopsLayer; import net.osmand.plus.views.TransportStopsLayer;
import java.lang.ref.WeakReference;
import java.util.List; import java.util.List;
public class TransportRouteController extends MenuController { public class TransportRouteController extends MenuController {
@ -27,6 +25,7 @@ public class TransportRouteController extends MenuController {
final TransportStopRoute transportRoute) { final TransportStopRoute transportRoute) {
super(new MenuBuilder(mapActivity), pointDescription, mapActivity); super(new MenuBuilder(mapActivity), pointDescription, mapActivity);
this.transportRoute = transportRoute; this.transportRoute = transportRoute;
builder.setShowOnlinePhotos(false);
toolbarController = new ContextMenuToolbarController(this); toolbarController = new ContextMenuToolbarController(this);
toolbarController.setTitle(getNameStr()); toolbarController.setTitle(getNameStr());
toolbarController.setOnBackButtonClickListener(new OnClickListener() { toolbarController.setOnBackButtonClickListener(new OnClickListener() {
@ -83,20 +82,25 @@ public class TransportRouteController extends MenuController {
return false; return false;
} }
@Override
public boolean isClosable() {
return false;
}
@Override @Override
public boolean buttonsVisible() { public boolean buttonsVisible() {
return false; return false;
} }
@Override
public boolean displayStreetNameInTitle() {
return super.displayStreetNameInTitle();
}
@Override @Override
public String getTypeStr() { public String getTypeStr() {
return getPointDescription().getTypeName(); if (transportRoute.refStop != null) {
return transportRoute.refStop.getName();
} else if (transportRoute.stop != null) {
return transportRoute.stop.getName();
} else {
return getPointDescription().getTypeName();
}
} }
@Override @Override
@ -154,15 +158,32 @@ public class TransportRouteController extends MenuController {
@Override @Override
public void onClick(View arg0) { public void onClick(View arg0) {
MapContextMenu menu = getMapActivity().getContextMenu(); if (mapContextMenu != null) {
transportRoute.stop = stop;
transportRoute.refStop = stop;
PointDescription pd = new PointDescription(PointDescription.POINT_TYPE_TRANSPORT_ROUTE,
transportRoute.getDescription(getMapActivity().getMyApplication(), false));
LatLon stopLocation = stop.getLocation();
if (mapContextMenu.isVisible()) {
mapContextMenu.updateMapCenter(stopLocation);
} else {
mapContextMenu.setMapCenter(stopLocation);
mapContextMenu.setMapPosition(getMapActivity().getMapView().getMapPosition());
}
mapContextMenu.setCenterMarker(true);
mapContextMenu.setMapZoom(15);
mapContextMenu.showOrUpdate(stopLocation, pd, transportRoute);
}
/*
PointDescription pd = new PointDescription(PointDescription.POINT_TYPE_TRANSPORT_STOP, PointDescription pd = new PointDescription(PointDescription.POINT_TYPE_TRANSPORT_STOP,
getMapActivity().getString(R.string.transport_Stop), name); getMapActivity().getString(R.string.transport_Stop), name);
resetRoute(); LatLon stopLocation = stop.getLocation();
menu.show(stop.getLocation(), pd, stop); getMapActivity().getMyApplication().getSettings()
WeakReference<MapContextMenuFragment> rr = menu.findMenuFragment(); .setMapLocationToShow(stopLocation.getLatitude(), stopLocation.getLongitude(),
if (rr != null && rr.get() != null) { 15, pd, false, transportRoute);
rr.get().centerMarkerLocation(); MapActivity.launchMapActivityMoveToTop(getMapActivity());
} */
} }
}); });
} }

View file

@ -0,0 +1,27 @@
package net.osmand.plus.mapcontextmenu.editors;
import net.osmand.plus.activities.MapActivity;
public class RtePtEditor extends WptPtEditor {
public static final String TAG = "RtePtEditorFragment";
public RtePtEditor(MapActivity mapActivity) {
super(mapActivity);
}
@Override
public String getFragmentTag() {
return TAG;
}
@Override
public void showEditorFragment() {
RtePtEditorFragment.showInstance(mapActivity);
}
@Override
public void showEditorFragment(boolean skipDialog) {
RtePtEditorFragment.showInstance(mapActivity, skipDialog);
}
}

View file

@ -0,0 +1,43 @@
package net.osmand.plus.mapcontextmenu.editors;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
public class RtePtEditorFragment extends WptPtEditorFragment {
@Override
public void assignEditor() {
editor = getMapActivity().getContextMenu().getRtePtPointEditor();
}
@Override
public String getToolbarTitle() {
return getMapActivity().getResources().getString(R.string.save_route_point);
}
public static void showInstance(final MapActivity mapActivity) {
RtePtEditor editor = mapActivity.getContextMenu().getRtePtPointEditor();
//int slideInAnim = editor.getSlideInAnimation();
//int slideOutAnim = editor.getSlideOutAnimation();
RtePtEditorFragment fragment = new RtePtEditorFragment();
mapActivity.getSupportFragmentManager().beginTransaction()
//.setCustomAnimations(slideInAnim, slideOutAnim, slideInAnim, slideOutAnim)
.add(R.id.fragmentContainer, fragment, editor.getFragmentTag())
.addToBackStack(null).commit();
}
public static void showInstance(final MapActivity mapActivity, boolean skipDialog) {
RtePtEditor editor = mapActivity.getContextMenu().getRtePtPointEditor();
//int slideInAnim = editor.getSlideInAnimation();
//int slideOutAnim = editor.getSlideOutAnimation();
RtePtEditorFragment fragment = new RtePtEditorFragment();
fragment.skipDialog = skipDialog;
mapActivity.getSupportFragmentManager().beginTransaction()
//.setCustomAnimations(slideInAnim, slideOutAnim, slideInAnim, slideOutAnim)
.add(R.id.fragmentContainer, fragment, editor.getFragmentTag())
.addToBackStack(null).commit();
}
}

View file

@ -9,9 +9,11 @@ import net.osmand.plus.activities.MapActivity;
public class WptPtEditor extends PointEditor { public class WptPtEditor extends PointEditor {
private OnDismissListener onDismissListener;
private GPXFile gpxFile; private GPXFile gpxFile;
private WptPt wpt; private WptPt wpt;
private boolean gpxSelected; private boolean gpxSelected;
private boolean newGpxPointProcessing;
public static final String TAG = "WptPtEditorFragment"; public static final String TAG = "WptPtEditorFragment";
@ -19,9 +21,24 @@ public class WptPtEditor extends PointEditor {
super(mapActivity); super(mapActivity);
} }
@Override public void setNewGpxPointProcessing(boolean newGpxPointProcessing) {
public String getFragmentTag() { this.newGpxPointProcessing = newGpxPointProcessing;
return TAG; }
public boolean isNewGpxPointProcessing() {
return newGpxPointProcessing;
}
public interface OnDismissListener {
void onDismiss();
}
public void setOnDismissListener(OnDismissListener listener) {
onDismissListener = listener;
}
public OnDismissListener getOnDismissListener() {
return onDismissListener;
} }
public GPXFile getGpxFile() { public GPXFile getGpxFile() {
@ -36,6 +53,11 @@ public class WptPtEditor extends PointEditor {
return wpt; return wpt;
} }
@Override
public String getFragmentTag() {
return TAG;
}
public void add(GPXFile gpxFile, LatLon latLon, String title) { public void add(GPXFile gpxFile, LatLon latLon, String title) {
if (latLon == null) { if (latLon == null) {
return; return;
@ -50,7 +72,7 @@ public class WptPtEditor extends PointEditor {
wpt = new WptPt(latLon.getLatitude(), latLon.getLongitude(), wpt = new WptPt(latLon.getLatitude(), latLon.getLongitude(),
System.currentTimeMillis(), Double.NaN, 0, Double.NaN); System.currentTimeMillis(), Double.NaN, 0, Double.NaN);
wpt.name = title; wpt.name = title;
WptPtEditorFragment.showInstance(mapActivity); showEditorFragment();
} }
public void add(GPXFile gpxFile, LatLon latLon, String title, String categoryName, int categoryColor, boolean skipDialog) { public void add(GPXFile gpxFile, LatLon latLon, String title, String categoryName, int categoryColor, boolean skipDialog) {
@ -86,7 +108,7 @@ public class WptPtEditor extends PointEditor {
wpt.category = categoryName; wpt.category = categoryName;
WptPtEditorFragment.showInstance(mapActivity, skipDialog); showEditorFragment(skipDialog);
} }
public void edit(WptPt wpt) { public void edit(WptPt wpt) {
@ -101,6 +123,14 @@ public class WptPtEditor extends PointEditor {
gpxFile = selectedGpxFile.getGpxFile(); gpxFile = selectedGpxFile.getGpxFile();
} }
this.wpt = wpt; this.wpt = wpt;
showEditorFragment();
}
public void showEditorFragment() {
WptPtEditorFragment.showInstance(mapActivity); WptPtEditorFragment.showInstance(mapActivity);
} }
public void showEditorFragment(boolean skipDialog) {
WptPtEditorFragment.showInstance(mapActivity, skipDialog);
}
} }

View file

@ -14,6 +14,7 @@ import net.osmand.plus.FavouritesDbHelper.FavoriteGroup;
import net.osmand.plus.GPXUtilities; import net.osmand.plus.GPXUtilities;
import net.osmand.plus.GPXUtilities.GPXFile; import net.osmand.plus.GPXUtilities.GPXFile;
import net.osmand.plus.GPXUtilities.WptPt; import net.osmand.plus.GPXUtilities.WptPt;
import net.osmand.plus.mapcontextmenu.editors.WptPtEditor.OnDismissListener;
import net.osmand.plus.GpxSelectionHelper; import net.osmand.plus.GpxSelectionHelper;
import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandApplication;
import net.osmand.plus.R; import net.osmand.plus.R;
@ -26,7 +27,8 @@ import net.osmand.util.Algorithms;
import java.io.File; import java.io.File;
public class WptPtEditorFragment extends PointEditorFragment { public class WptPtEditorFragment extends PointEditorFragment {
private WptPtEditor editor;
protected WptPtEditor editor;
private WptPt wpt; private WptPt wpt;
private SavingTrackHelper savingTrackHelper; private SavingTrackHelper savingTrackHelper;
private GpxSelectionHelper selectedGpxHelper; private GpxSelectionHelper selectedGpxHelper;
@ -34,17 +36,21 @@ public class WptPtEditorFragment extends PointEditorFragment {
private boolean saved; private boolean saved;
private int color; private int color;
private int defaultColor; private int defaultColor;
private boolean skipDialog; protected boolean skipDialog;
@Override @Override
public void onAttach(Activity activity) { public void onAttach(Activity activity) {
super.onAttach(activity); super.onAttach(activity);
savingTrackHelper = getMapActivity().getMyApplication().getSavingTrackHelper(); savingTrackHelper = getMapActivity().getMyApplication().getSavingTrackHelper();
selectedGpxHelper = getMapActivity().getMyApplication().getSelectedGpxHelper(); selectedGpxHelper = getMapActivity().getMyApplication().getSelectedGpxHelper();
editor = getMapActivity().getContextMenu().getWptPtPointEditor(); assignEditor();
defaultColor = getResources().getColor(R.color.gpx_color_point); defaultColor = getResources().getColor(R.color.gpx_color_point);
} }
protected void assignEditor() {
editor = getMapActivity().getContextMenu().getWptPtPointEditor();
}
@Override @Override
public void onCreate(final Bundle savedInstanceState) { public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -69,6 +75,17 @@ public class WptPtEditorFragment extends PointEditorFragment {
} }
} }
@Override
public void dismiss(boolean includingMenu) {
super.dismiss(includingMenu);
OnDismissListener listener = editor.getOnDismissListener();
if (listener != null) {
listener.onDismiss();
}
editor.setNewGpxPointProcessing(false);
editor.setOnDismissListener(null);
}
@Override @Override
public PointEditor getEditor() { public PointEditor getEditor() {
return editor; return editor;
@ -76,10 +93,14 @@ public class WptPtEditorFragment extends PointEditorFragment {
@Override @Override
public String getToolbarTitle() { public String getToolbarTitle() {
if (editor.isNew()) { if (editor.isNewGpxPointProcessing()) {
return getMapActivity().getResources().getString(R.string.context_menu_item_add_waypoint); return getMapActivity().getResources().getString(R.string.save_gpx_waypoint);
} else { } else {
return getMapActivity().getResources().getString(R.string.shared_string_edit); if (editor.isNew()) {
return getMapActivity().getResources().getString(R.string.context_menu_item_add_waypoint);
} else {
return getMapActivity().getResources().getString(R.string.shared_string_edit);
}
} }
} }

View file

@ -12,6 +12,7 @@ import net.osmand.plus.mapcontextmenu.MenuController.MenuType;
import net.osmand.plus.mapcontextmenu.MenuTitleController; import net.osmand.plus.mapcontextmenu.MenuTitleController;
import net.osmand.plus.views.ContextMenuLayer; import net.osmand.plus.views.ContextMenuLayer;
import net.osmand.plus.views.ContextMenuLayer.IContextMenuProvider; import net.osmand.plus.views.ContextMenuLayer.IContextMenuProvider;
import net.osmand.plus.views.OsmandMapTileView;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
@ -194,8 +195,8 @@ public class MapMultiSelectionMenu extends BaseMenuController {
public void openContextMenu(@NonNull MenuObject menuObject) { public void openContextMenu(@NonNull MenuObject menuObject) {
IContextMenuProvider provider = selectedObjects.remove(menuObject.getObject()); IContextMenuProvider provider = selectedObjects.remove(menuObject.getObject());
hide(); hide();
getMapActivity().getMapLayers().getContextMenuLayer().showContextMenu( ContextMenuLayer contextMenuLayer = getMapActivity().getMapLayers().getContextMenuLayer();
menuObject.getLatLon(), menuObject.getPointDescription(), menuObject.getObject(), provider); contextMenuLayer.showContextMenu(menuObject.getLatLon(), menuObject.getPointDescription(), menuObject.getObject(), provider);
} }
private void clearSelectedObjects() { private void clearSelectedObjects() {

View file

@ -1,20 +1,35 @@
package net.osmand.plus.measurementtool; package net.osmand.plus.measurementtool;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.v4.app.Fragment; import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.widget.SwitchCompat;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.ContextThemeWrapper; import android.view.ContextThemeWrapper;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast; import android.widget.Toast;
import net.osmand.AndroidUtils; import net.osmand.AndroidUtils;
import net.osmand.IndexConstants;
import net.osmand.plus.GPXUtilities;
import net.osmand.plus.GPXUtilities.Route;
import net.osmand.plus.GPXUtilities.WptPt;
import net.osmand.plus.IconsCache; import net.osmand.plus.IconsCache;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
@ -23,6 +38,16 @@ import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory;
import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarController; import net.osmand.plus.views.mapwidgets.MapInfoWidgetsFactory.TopToolbarController;
import net.osmand.plus.widgets.IconPopupMenu; import net.osmand.plus.widgets.IconPopupMenu;
import java.io.File;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedList;
import java.util.Locale;
import static net.osmand.plus.GPXUtilities.GPXFile;
import static net.osmand.plus.helpers.GpxImportHelper.GPX_SUFFIX;
public class MeasurementToolFragment extends Fragment { public class MeasurementToolFragment extends Fragment {
public static final String TAG = "MeasurementToolFragment"; public static final String TAG = "MeasurementToolFragment";
@ -33,23 +58,27 @@ public class MeasurementToolFragment extends Fragment {
private String pointsSt; private String pointsSt;
private boolean wasCollapseButtonVisible; private boolean wasCollapseButtonVisible;
private boolean pointsDetailsOpened;
@Nullable @Nullable
@Override @Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
final MapActivity mapActivity = (MapActivity) getActivity(); final MapActivity mapActivity = (MapActivity) getActivity();
final MeasurementToolLayer measurementLayer = mapActivity.getMapLayers().getMeasurementToolLayer(); final MeasurementToolLayer measurementLayer = mapActivity.getMapLayers().getMeasurementToolLayer();
IconsCache iconsCache = mapActivity.getMyApplication().getIconsCache(); final IconsCache iconsCache = mapActivity.getMyApplication().getIconsCache();
final boolean nightMode = mapActivity.getMyApplication().getDaynightHelper().isNightModeForMapControls(); final boolean nightMode = mapActivity.getMyApplication().getDaynightHelper().isNightModeForMapControls();
final int themeRes = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme; final int themeRes = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme;
final int backgroundColor = ContextCompat.getColor(getActivity(),
nightMode ? R.color.ctx_menu_info_view_bg_dark : R.color.ctx_menu_info_view_bg_light);
boolean portrait = AndroidUiHelper.isOrientationPortrait(mapActivity); boolean portrait = AndroidUiHelper.isOrientationPortrait(mapActivity);
pointsSt = mapActivity.getString(R.string.points).toLowerCase(); pointsSt = getString(R.string.points).toLowerCase();
View view = View.inflate(new ContextThemeWrapper(getContext(), themeRes), R.layout.fragment_measurement_tool, null); View view = View.inflate(new ContextThemeWrapper(getContext(), themeRes), R.layout.fragment_measurement_tool, null);
final View mainView = view.findViewById(R.id.main_view); final View mainView = view.findViewById(R.id.main_view);
AndroidUtils.setBackground(mapActivity, mainView, nightMode, R.drawable.bg_bottom_menu_light, R.drawable.bg_bottom_menu_dark); AndroidUtils.setBackground(mapActivity, mainView, nightMode, R.drawable.bg_bottom_menu_light, R.drawable.bg_bottom_menu_dark);
view.findViewById(R.id.points_list_container).setBackgroundColor(backgroundColor);
distanceTv = (TextView) mainView.findViewById(R.id.measurement_distance_text_view); distanceTv = (TextView) mainView.findViewById(R.id.measurement_distance_text_view);
pointsTv = (TextView) mainView.findViewById(R.id.measurement_points_text_view); pointsTv = (TextView) mainView.findViewById(R.id.measurement_points_text_view);
@ -62,7 +91,11 @@ public class MeasurementToolFragment extends Fragment {
upDownBtn.setOnClickListener(new View.OnClickListener() { upDownBtn.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
Toast.makeText(getActivity(), "Up / Down", Toast.LENGTH_SHORT).show(); if (!pointsDetailsOpened) {
upBtnOnClick(mainView, iconsCache.getThemedIcon(R.drawable.ic_action_arrow_down));
} else {
downBtnOnClick(mainView, iconsCache.getThemedIcon(R.drawable.ic_action_arrow_up));
}
} }
}); });
@ -101,23 +134,23 @@ public class MeasurementToolFragment extends Fragment {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
measurementLayer.addPointOnClick(); measurementLayer.addPointOnClick();
enable(undoBtn); enable(undoBtn, upDownBtn);
disable(redoBtn); disable(redoBtn);
updateText(); updateText();
} }
}); });
disable(undoBtn, redoBtn); disable(undoBtn, redoBtn, upDownBtn);
enterMeasurementMode(); enterMeasurementMode();
if (portrait) { if (portrait) {
toolBarController = new MeasurementToolBarController(); toolBarController = new MeasurementToolBarController();
toolBarController.setTitle(mapActivity.getString(R.string.measurement_tool_action_bar)); toolBarController.setTitle(getString(R.string.measurement_tool_action_bar));
toolBarController.setOnBackButtonClickListener(new View.OnClickListener() { toolBarController.setOnBackButtonClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
mapActivity.onBackPressed(); showQuitDialog();
} }
}); });
toolBarController.setOnCloseButtonClickListener(new View.OnClickListener() { toolBarController.setOnCloseButtonClickListener(new View.OnClickListener() {
@ -134,11 +167,15 @@ public class MeasurementToolFragment extends Fragment {
public boolean onMenuItemClick(MenuItem menuItem) { public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()) { switch (menuItem.getItemId()) {
case R.id.action_save_as_gpx: case R.id.action_save_as_gpx:
Toast.makeText(mapActivity, "Save as gpx", Toast.LENGTH_SHORT).show(); if (measurementLayer.getPointsCount() > 0) {
saveAsGpxOnClick(mapActivity);
} else {
Toast.makeText(mapActivity, getString(R.string.none_point_error), Toast.LENGTH_SHORT).show();
}
return true; return true;
case R.id.action_clear_all: case R.id.action_clear_all:
measurementLayer.clearPoints(); measurementLayer.clearPoints();
disable(undoBtn, redoBtn); disable(undoBtn, redoBtn, upDownBtn);
updateText(); updateText();
return true; return true;
} }
@ -154,6 +191,147 @@ public class MeasurementToolFragment extends Fragment {
return view; return view;
} }
private void upBtnOnClick(View view, Drawable icon) {
pointsDetailsOpened = true;
view.findViewById(R.id.points_list_container).setVisibility(View.VISIBLE);
((ImageButton) view.findViewById(R.id.up_down_button)).setImageDrawable(icon);
}
private void downBtnOnClick(View view, Drawable icon) {
pointsDetailsOpened = false;
view.findViewById(R.id.points_list_container).setVisibility(View.GONE);
((ImageButton) view.findViewById(R.id.up_down_button)).setImageDrawable(icon);
}
private void saveAsGpxOnClick(MapActivity mapActivity) {
final File dir = mapActivity.getMyApplication().getAppPath(IndexConstants.GPX_INDEX_DIR);
final LayoutInflater inflater = getLayoutInflater();
final View view = inflater.inflate(R.layout.save_gpx_dialog, null);
final EditText nameEt = (EditText) view.findViewById(R.id.gpx_name_et);
final TextView fileExistsTv = (TextView) view.findViewById(R.id.file_exists_text_view);
final SwitchCompat showOnMapToggle = (SwitchCompat) view.findViewById(R.id.toggle_show_on_map);
showOnMapToggle.setChecked(true);
final String suggestedName = new SimpleDateFormat("yyyy-M-dd_HH-mm_EEE", Locale.US).format(new Date());
String displayedName = suggestedName;
File fout = new File(dir, suggestedName + GPX_SUFFIX);
int ind = 1;
while (fout.exists()) {
displayedName = suggestedName + "_" + (++ind);
fout = new File(dir, displayedName + GPX_SUFFIX);
}
nameEt.setText(displayedName);
nameEt.setSelection(displayedName.length());
final boolean[] textChanged = new boolean[1];
nameEt.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void afterTextChanged(Editable editable) {
if (new File(dir, editable.toString() + GPX_SUFFIX).exists()) {
fileExistsTv.setVisibility(View.VISIBLE);
} else {
fileExistsTv.setVisibility(View.INVISIBLE);
}
textChanged[0] = true;
}
});
new AlertDialog.Builder(mapActivity)
.setTitle(R.string.enter_gpx_name)
.setView(view)
.setPositiveButton(R.string.shared_string_save, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
final String name = nameEt.getText().toString();
String fileName = name + GPX_SUFFIX;
if (textChanged[0]) {
File fout = new File(dir, fileName);
int ind = 1;
while (fout.exists()) {
fileName = name + "_" + (++ind) + GPX_SUFFIX;
fout = new File(dir, fileName);
}
}
saveGpx(dir, fileName, showOnMapToggle.isChecked());
}
})
.setNegativeButton(R.string.shared_string_cancel, null)
.show();
}
private void saveGpx(final File dir, final String fileName, final boolean showOnMap) {
new AsyncTask<Void, Void, String>() {
private ProgressDialog progressDialog;
private File toSave;
@Override
protected void onPreExecute() {
MapActivity activity = getMapActivity();
if (activity != null) {
progressDialog = new ProgressDialog(activity);
progressDialog.setMessage(getString(R.string.saving_gpx_tracks));
progressDialog.show();
}
}
@Override
protected String doInBackground(Void... voids) {
toSave = new File(dir, fileName);
GPXFile gpx = new GPXFile();
MeasurementToolLayer measurementLayer = getMeasurementLayer();
if (measurementLayer != null) {
LinkedList<WptPt> points = measurementLayer.getMeasurementPoints();
if (points.size() == 1) {
gpx.points.add(points.getFirst());
} else if (points.size() > 1) {
Route rt = new Route();
gpx.routes.add(rt);
rt.points.addAll(points);
}
}
MapActivity activity = getMapActivity();
if (activity != null) {
String res = GPXUtilities.writeGpxFile(toSave, gpx, activity.getMyApplication());
gpx.path = toSave.getAbsolutePath();
if (showOnMap) {
activity.getMyApplication().getSelectedGpxHelper().selectGpxFile(gpx, true, false);
}
return res;
}
return null;
}
@Override
protected void onPostExecute(String warning) {
MapActivity activity = getMapActivity();
if (activity != null) {
if (warning == null) {
Toast.makeText(activity,
MessageFormat.format(getString(R.string.gpx_saved_sucessfully), toSave.getAbsolutePath()),
Toast.LENGTH_LONG).show();
} else {
Toast.makeText(activity, warning, Toast.LENGTH_LONG).show();
}
activity.refreshMap();
}
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
}
}.execute();
}
@Override @Override
public void onDestroyView() { public void onDestroyView() {
super.onDestroyView(); super.onDestroyView();
@ -252,6 +430,36 @@ public class MeasurementToolFragment extends Fragment {
} }
} }
public void showQuitDialog() {
final MapActivity mapActivity = getMapActivity();
MeasurementToolLayer measurementLayer = getMeasurementLayer();
if (mapActivity != null && measurementLayer != null) {
if (measurementLayer.getPointsCount() < 1) {
dismiss(mapActivity);
return;
}
new AlertDialog.Builder(mapActivity)
.setTitle(getString(R.string.are_you_sure))
.setMessage(getString(R.string.unsaved_changes_will_be_lost))
.setPositiveButton(R.string.shared_string_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dismiss(mapActivity);
}
})
.setNegativeButton(R.string.shared_string_cancel, null)
.show();
}
}
private void dismiss(MapActivity mapActivity) {
try {
mapActivity.getSupportFragmentManager().popBackStackImmediate(TAG, FragmentManager.POP_BACK_STACK_INCLUSIVE);
} catch (Exception e) {
// ignore
}
}
private static class MeasurementToolBarController extends TopToolbarController { private static class MeasurementToolBarController extends TopToolbarController {
MeasurementToolBarController() { MeasurementToolBarController() {

View file

@ -5,27 +5,31 @@ import android.graphics.BitmapFactory;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.Path; import android.graphics.Path;
import android.graphics.PointF;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
import net.osmand.data.PointDescription;
import net.osmand.data.QuadPoint; import net.osmand.data.QuadPoint;
import net.osmand.data.RotatedTileBox; import net.osmand.data.RotatedTileBox;
import net.osmand.plus.GPXUtilities.WptPt; import net.osmand.plus.GPXUtilities.WptPt;
import net.osmand.plus.OsmAndFormatter; import net.osmand.plus.OsmAndFormatter;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.views.ContextMenuLayer;
import net.osmand.plus.views.OsmandMapLayer; import net.osmand.plus.views.OsmandMapLayer;
import net.osmand.plus.views.OsmandMapTileView; import net.osmand.plus.views.OsmandMapTileView;
import net.osmand.util.MapUtils; import net.osmand.util.MapUtils;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List;
import gnu.trove.list.array.TIntArrayList; import gnu.trove.list.array.TIntArrayList;
public class MeasurementToolLayer extends OsmandMapLayer { public class MeasurementToolLayer extends OsmandMapLayer implements ContextMenuLayer.IContextMenuProvider {
private OsmandMapTileView view; private OsmandMapTileView view;
private boolean inMeasurementMode; private boolean inMeasurementMode;
private LinkedList<WptPt> measurementPoints = new LinkedList<>(); private LinkedList<WptPt> measurementPoints = new LinkedList<>();
private LinkedList<WptPt> cacheMeasurementPoints; private LinkedList<WptPt> cacheMeasurementPoints = new LinkedList<>();
private Bitmap centerIconDay; private Bitmap centerIconDay;
private Bitmap centerIconNight; private Bitmap centerIconNight;
private Bitmap pointIcon; private Bitmap pointIcon;
@ -66,6 +70,10 @@ public class MeasurementToolLayer extends OsmandMapLayer {
return measurementPoints.size(); return measurementPoints.size();
} }
public LinkedList<WptPt> getMeasurementPoints() {
return measurementPoints;
}
String getDistanceSt() { String getDistanceSt() {
float dist = 0; float dist = 0;
if (measurementPoints.size() > 0) { if (measurementPoints.size() > 0) {
@ -104,16 +112,19 @@ public class MeasurementToolLayer extends OsmandMapLayer {
} }
tx.add(locX); tx.add(locX);
ty.add(locY); ty.add(locY);
if (tb.containsLatLon(pt.lat, pt.lon)) {
canvas.drawBitmap(pointIcon, locX - marginX, locY - marginY, bitmapPaint);
}
} }
path.lineTo(tb.getCenterPixelX(), tb.getCenterPixelY()); path.lineTo(tb.getCenterPixelX(), tb.getCenterPixelY());
tx.add(tb.getCenterPixelX()); tx.add(tb.getCenterPixelX());
ty.add(tb.getCenterPixelY()); ty.add(tb.getCenterPixelY());
calculatePath(tb, tx, ty, path); calculatePath(tb, tx, ty, path);
canvas.drawPath(path, lineAttrs.paint); canvas.drawPath(path, lineAttrs.paint);
for (WptPt pt : measurementPoints) {
if (tb.containsLatLon(pt.lat, pt.lon)) {
int locX = tb.getPixXFromLonNoRot(pt.lon);
int locY = tb.getPixYFromLatNoRot(pt.lat);
canvas.drawBitmap(pointIcon, locX - marginX, locY - marginY, bitmapPaint);
}
}
} }
} }
} }
@ -149,8 +160,10 @@ public class MeasurementToolLayer extends OsmandMapLayer {
boolean undoPointOnClick() { boolean undoPointOnClick() {
measurementPoints.remove(measurementPoints.size() - 1); measurementPoints.remove(measurementPoints.size() - 1);
WptPt pt = measurementPoints.get(measurementPoints.size() - 1); if (measurementPoints.size() > 0) {
view.getAnimatedDraggingThread().startMoving(pt.getLatitude(), pt.getLongitude(), view.getZoom(), true); WptPt pt = measurementPoints.get(measurementPoints.size() - 1);
view.getAnimatedDraggingThread().startMoving(pt.getLatitude(), pt.getLongitude(), view.getZoom(), true);
}
return measurementPoints.size() > 0; return measurementPoints.size() > 0;
} }
@ -170,4 +183,34 @@ public class MeasurementToolLayer extends OsmandMapLayer {
public boolean drawInScreenPixels() { public boolean drawInScreenPixels() {
return false; return false;
} }
@Override
public void collectObjectsFromPoint(PointF point, RotatedTileBox tileBox, List<Object> o) {
}
@Override
public LatLon getObjectLocation(Object o) {
return null;
}
@Override
public PointDescription getObjectName(Object o) {
return null;
}
@Override
public boolean disableSingleTap() {
return isInMeasurementMode();
}
@Override
public boolean disableLongPressOnMap() {
return isInMeasurementMode();
}
@Override
public boolean isObjectClickable(Object o) {
return !isInMeasurementMode();
}
} }

View file

@ -9,6 +9,7 @@ import android.os.Handler;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton; import android.support.design.widget.FloatingActionButton;
import android.support.v4.content.ContextCompat;
import android.support.v4.view.MenuItemCompat; import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.AlertDialog; import android.support.v7.app.AlertDialog;
import android.support.v7.view.ActionMode; import android.support.v7.view.ActionMode;
@ -20,6 +21,7 @@ import android.view.MenuInflater;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ExpandableListView; import android.widget.ExpandableListView;
@ -30,16 +32,13 @@ import android.widget.ListView;
import android.widget.TextView; import android.widget.TextView;
import net.osmand.AndroidUtils; import net.osmand.AndroidUtils;
import net.osmand.Location;
import net.osmand.data.FavouritePoint; import net.osmand.data.FavouritePoint;
import net.osmand.data.LatLon; import net.osmand.data.LatLon;
import net.osmand.data.PointDescription; import net.osmand.data.PointDescription;
import net.osmand.plus.FavouritesDbHelper; import net.osmand.plus.FavouritesDbHelper;
import net.osmand.plus.GPXDatabase.GpxDataItem; import net.osmand.plus.GPXDatabase.GpxDataItem;
import net.osmand.plus.GPXUtilities; import net.osmand.plus.GPXUtilities;
import net.osmand.plus.GPXUtilities.WptPt;
import net.osmand.plus.GPXUtilities.GPXFile; import net.osmand.plus.GPXUtilities.GPXFile;
import net.osmand.plus.GPXUtilities.NewGpxWaypoint;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup; import net.osmand.plus.GpxSelectionHelper.GpxDisplayGroup;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem; import net.osmand.plus.GpxSelectionHelper.GpxDisplayItem;
import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType; import net.osmand.plus.GpxSelectionHelper.GpxDisplayItemType;
@ -58,6 +57,7 @@ import net.osmand.plus.activities.TrackActivity;
import net.osmand.plus.base.FavoriteImageDrawable; import net.osmand.plus.base.FavoriteImageDrawable;
import net.osmand.plus.base.OsmandExpandableListFragment; import net.osmand.plus.base.OsmandExpandableListFragment;
import net.osmand.plus.dialogs.DirectionsDialogs; import net.osmand.plus.dialogs.DirectionsDialogs;
import net.osmand.plus.views.AddGpxPointBottomSheetHelper.NewGpxPoint;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
import java.io.File; import java.io.File;
@ -93,7 +93,12 @@ public class TrackPointFragment extends OsmandExpandableListFragment {
private Set<Integer> selectedGroups = new LinkedHashSet<>(); private Set<Integer> selectedGroups = new LinkedHashSet<>();
private ActionMode actionMode; private ActionMode actionMode;
private SearchView searchView; private SearchView searchView;
private FloatingActionButton fab; private boolean menuOpened = false;
private FloatingActionButton menuFab;
private FloatingActionButton waypointFab;
private View waypointTextLayout;
private FloatingActionButton routePointFab;
private View routePointTextLayout;
@Override @Override
public void onCreate(@Nullable Bundle savedInstanceState) { public void onCreate(@Nullable Bundle savedInstanceState) {
@ -104,6 +109,20 @@ public class TrackPointFragment extends OsmandExpandableListFragment {
@Override @Override
public void onActivityCreated(Bundle savedInstanceState) { public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState); super.onActivityCreated(savedInstanceState);
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int i) {
if (i == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
if (menuOpened) {
closeMenu();
}
}
}
@Override
public void onScroll(AbsListView absListView, int i, int i1, int i2) {
}
});
listView.setBackgroundColor(getResources().getColor( listView.setBackgroundColor(getResources().getColor(
getMyApplication().getSettings().isLightContent() ? R.color.ctx_menu_info_view_bg_light getMyApplication().getSettings().isLightContent() ? R.color.ctx_menu_info_view_bg_light
: R.color.ctx_menu_info_view_bg_dark)); : R.color.ctx_menu_info_view_bg_dark));
@ -115,26 +134,38 @@ public class TrackPointFragment extends OsmandExpandableListFragment {
ExpandableListView listView = (ExpandableListView) view.findViewById(android.R.id.list); ExpandableListView listView = (ExpandableListView) view.findViewById(android.R.id.list);
setHasOptionsMenu(true); setHasOptionsMenu(true);
fab = (FloatingActionButton) view.findViewById(R.id.fabButton); menuFab = (FloatingActionButton) view.findViewById(R.id.menu_fab);
menuFab.setOnClickListener(new View.OnClickListener() {
fab.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View view) { public void onClick(View view) {
final OsmandSettings settings = app.getSettings(); if (menuOpened) {
GPXFile gpx = getGpx(); closeMenu();
Location location = app.getLocationProvider().getLastKnownLocation(); } else {
if (location != null) { openMenu();
settings.setMapLocationToShow(location.getLatitude(), location.getLongitude(),
settings.getLastKnownMapZoom(),
new PointDescription(PointDescription.POINT_TYPE_WPT, getString(R.string.context_menu_item_add_waypoint)),
false,
new NewGpxWaypoint(gpx));
MapActivity.launchMapActivityMoveToTop(getActivity());
} }
} }
}); });
waypointFab = (FloatingActionButton) view.findViewById(R.id.waypoint_fab);
waypointFab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
PointDescription pointDescription = new PointDescription(PointDescription.POINT_TYPE_WPT, getString(R.string.add_waypoint));
addPoint(pointDescription);
}
});
waypointTextLayout = view.findViewById(R.id.waypoint_text_layout);
routePointFab = (FloatingActionButton) view.findViewById(R.id.route_fab);
routePointFab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
PointDescription pointDescription = new PointDescription(PointDescription.POINT_TYPE_RTE, getString(R.string.add_route_point));
addPoint(pointDescription);
}
});
routePointTextLayout = view.findViewById(R.id.route_text_layout);
TextView tv = new TextView(getActivity()); TextView tv = new TextView(getActivity());
tv.setText(R.string.none_selected_gpx); tv.setText(R.string.none_selected_gpx);
tv.setTextSize(24); tv.setTextSize(24);
@ -146,6 +177,43 @@ public class TrackPointFragment extends OsmandExpandableListFragment {
return view; return view;
} }
private void addPoint(PointDescription pointDescription) {
Intent currentIntent = getTrackActivity().getIntent();
if (currentIntent != null) {
currentIntent.putExtra(TrackActivity.OPEN_POINTS_TAB, true);
}
final OsmandSettings settings = app.getSettings();
GPXFile gpx = getGpx();
LatLon location = settings.getLastKnownMapLocation();
if (gpx != null && location != null) {
settings.setMapLocationToShow(location.getLatitude(), location.getLongitude(),
settings.getLastKnownMapZoom(),
pointDescription,
false,
new NewGpxPoint(gpx, pointDescription));
MapActivity.launchMapActivityMoveToTop(getActivity());
}
}
private void openMenu() {
menuFab.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_action_remove_dark));
waypointFab.setVisibility(View.VISIBLE);
waypointTextLayout.setVisibility(View.VISIBLE);
routePointFab.setVisibility(View.VISIBLE);
routePointTextLayout.setVisibility(View.VISIBLE);
menuOpened = true;
}
private void closeMenu() {
menuFab.setImageDrawable(ContextCompat.getDrawable(getContext(), R.drawable.ic_action_plus));
waypointFab.setVisibility(View.GONE);
waypointTextLayout.setVisibility(View.GONE);
routePointFab.setVisibility(View.GONE);
routePointTextLayout.setVisibility(View.GONE);
menuOpened = false;
}
public TrackActivity getTrackActivity() { public TrackActivity getTrackActivity() {
return (TrackActivity) getActivity(); return (TrackActivity) getActivity();
} }
@ -168,6 +236,11 @@ public class TrackPointFragment extends OsmandExpandableListFragment {
if (!adapter.isEmpty() && listView.getHeaderViewsCount() == 0) { if (!adapter.isEmpty() && listView.getHeaderViewsCount() == 0) {
listView.addHeaderView(getActivity().getLayoutInflater().inflate(R.layout.list_shadow_header, null, false)); listView.addHeaderView(getActivity().getLayoutInflater().inflate(R.layout.list_shadow_header, null, false));
listView.addFooterView(getActivity().getLayoutInflater().inflate(R.layout.list_shadow_footer, null, false)); listView.addFooterView(getActivity().getLayoutInflater().inflate(R.layout.list_shadow_footer, null, false));
View view = new View(getActivity());
view.setLayoutParams(new AbsListView.LayoutParams(
AbsListView.LayoutParams.MATCH_PARENT,
AndroidUtils.dpToPx(getActivity(), 72)));
listView.addFooterView(view);
} }
} }
@ -270,6 +343,7 @@ public class TrackPointFragment extends OsmandExpandableListFragment {
@Override @Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
menu.clear(); menu.clear();
getTrackActivity().getClearToolbar(false);
MenuItem mi = createMenuItem(menu, SEARCH_ID, R.string.search_poi_filter, R.drawable.ic_action_search_dark, MenuItem mi = createMenuItem(menu, SEARCH_ID, R.string.search_poi_filter, R.drawable.ic_action_search_dark,
R.drawable.ic_action_search_dark, MenuItemCompat.SHOW_AS_ACTION_ALWAYS | MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); R.drawable.ic_action_search_dark, MenuItemCompat.SHOW_AS_ACTION_ALWAYS | MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
searchView = new SearchView(getActivity()); searchView = new SearchView(getActivity());

View file

@ -0,0 +1,156 @@
package net.osmand.plus.views;
import android.content.Intent;
import android.graphics.PointF;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import net.osmand.data.LatLon;
import net.osmand.data.PointDescription;
import net.osmand.data.RotatedTileBox;
import net.osmand.plus.GPXUtilities.GPXFile;
import net.osmand.plus.IconsCache;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.activities.TrackActivity;
import net.osmand.plus.mapcontextmenu.MapContextMenu;
import net.osmand.plus.mapcontextmenu.editors.RtePtEditor;
import net.osmand.plus.mapcontextmenu.editors.WptPtEditor;
import net.osmand.plus.mapcontextmenu.editors.WptPtEditor.OnDismissListener;
public class AddGpxPointBottomSheetHelper implements OnDismissListener {
private final View view;
private final TextView title;
private final TextView description;
private final ImageView icon;
private final MapActivity mapActivity;
private final MapContextMenu contextMenu;
private final ContextMenuLayer contextMenuLayer;
private final IconsCache iconsCache;
private String titleText;
private boolean applyingPositionMode;
private NewGpxPoint newGpxPoint;
private PointDescription pointDescription;
public AddGpxPointBottomSheetHelper(final MapActivity activity, ContextMenuLayer ctxMenuLayer) {
this.contextMenuLayer = ctxMenuLayer;
iconsCache = activity.getMyApplication().getIconsCache();
mapActivity = activity;
contextMenu = activity.getContextMenu();
view = activity.findViewById(R.id.add_gpx_point_bottom_sheet);
title = (TextView) view.findViewById(R.id.add_gpx_point_bottom_sheet_title);
description = (TextView) view.findViewById(R.id.description);
icon = (ImageView) view.findViewById(R.id.icon);
view.findViewById(R.id.create_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
contextMenuLayer.createGpxPoint();
GPXFile gpx = newGpxPoint.getGpx();
LatLon latLon = contextMenu.getLatLon();
if (pointDescription.isWpt()) {
WptPtEditor editor = activity.getContextMenu().getWptPtPointEditor();
editor.setOnDismissListener(AddGpxPointBottomSheetHelper.this);
editor.setNewGpxPointProcessing(true);
editor.add(gpx, latLon, titleText);
} else if (pointDescription.isRte()) {
RtePtEditor editor = activity.getContextMenu().getRtePtPointEditor();
editor.setOnDismissListener(AddGpxPointBottomSheetHelper.this);
editor.setNewGpxPointProcessing(true);
editor.add(gpx, latLon, titleText);
}
}
});
view.findViewById(R.id.cancel_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
hide();
contextMenuLayer.cancelAddGpxPoint();
}
});
}
public void onDraw(RotatedTileBox rt) {
PointF point = contextMenuLayer.getMovableCenterPoint(rt);
double lat = rt.getLatFromPixel(point.x, point.y);
double lon = rt.getLonFromPixel(point.x, point.y);
description.setText(PointDescription.getLocationName(mapActivity, lat, lon, true));
}
public void setTitle(String title) {
if (title.equals("")) {
if (pointDescription.isWpt()) {
title = mapActivity.getString(R.string.waypoint_one);
} else if (pointDescription.isRte()) {
title = mapActivity.getString(R.string.route_point_one);
}
}
titleText = title;
this.title.setText(titleText);
}
public boolean isVisible() {
return view.getVisibility() == View.VISIBLE;
}
public void show(NewGpxPoint newPoint) {
this.newGpxPoint = newPoint;
pointDescription = newPoint.getPointDescription();
if (pointDescription.isWpt()) {
setTitle(mapActivity.getString(R.string.waypoint_one));
icon.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_marker_dark));
} else if (pointDescription.isRte()) {
setTitle(mapActivity.getString(R.string.route_point_one));
icon.setImageDrawable(iconsCache.getThemedIcon(R.drawable.ic_action_markers_dark));
}
exitApplyPositionMode();
view.setVisibility(View.VISIBLE);
}
public void hide() {
exitApplyPositionMode();
view.setVisibility(View.GONE);
}
public void enterApplyPositionMode() {
if (!applyingPositionMode) {
applyingPositionMode = true;
view.findViewById(R.id.create_button).setEnabled(false);
}
}
public void exitApplyPositionMode() {
if (applyingPositionMode) {
applyingPositionMode = false;
view.findViewById(R.id.create_button).setEnabled(true);
}
}
@Override
public void onDismiss() {
Intent newIntent = new Intent(mapActivity, mapActivity.getMyApplication().getAppCustomization().getTrackActivity());
newIntent.putExtra(TrackActivity.TRACK_FILE_NAME, newGpxPoint.getGpx().path);
newIntent.putExtra(TrackActivity.OPEN_POINTS_TAB, true);
newIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
mapActivity.startActivity(newIntent);
}
public static class NewGpxPoint {
private PointDescription pointDescription;
private GPXFile gpx;
public NewGpxPoint(GPXFile gpx, PointDescription pointDescription) {
this.gpx = gpx;
this.pointDescription = pointDescription;
}
public GPXFile getGpx() {
return gpx;
}
public PointDescription getPointDescription() {
return pointDescription;
}
}
}

View file

@ -1,102 +0,0 @@
package net.osmand.plus.views;
import android.content.Context;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import net.osmand.data.LatLon;
import net.osmand.data.PointDescription;
import net.osmand.data.RotatedTileBox;
import net.osmand.plus.GPXUtilities;
import net.osmand.plus.GPXUtilities.GPXFile;
import net.osmand.plus.GPXUtilities.NewGpxWaypoint;
import net.osmand.plus.IconsCache;
import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.mapcontextmenu.MapContextMenu;
public class AddWaypointBottomSheetHelper {
private final View view;
private final TextView title;
private String titleText = "";
private final TextView description;
private final Context context;
private final MapContextMenu contextMenu;
private final ContextMenuLayer contextMenuLayer;
private boolean applyingPositionMode;
private NewGpxWaypoint newGpxWaypoint;
public AddWaypointBottomSheetHelper(final MapActivity activity, ContextMenuLayer ctxMenuLayer) {
this.contextMenuLayer = ctxMenuLayer;
view = activity.findViewById(R.id.add_gpx_waypoint_bottom_sheet);
title = (TextView) view.findViewById(R.id.add_gpx_waypoint_bottom_sheet_title);
description = (TextView) view.findViewById(R.id.description);
context = activity;
contextMenu = activity.getContextMenu();
ImageView icon = (ImageView) view.findViewById(R.id.icon);
IconsCache iconsCache = activity.getMyApplication().getIconsCache();
icon.setImageDrawable(iconsCache.getIcon(R.drawable.ic_action_photo_dark, R.color.marker_green));
view.findViewById(R.id.create_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
contextMenuLayer.createGpxWaypoint();
GPXFile gpx = newGpxWaypoint.getGpx();
LatLon latLon = contextMenu.getLatLon();
activity.getContextMenu().getWptPtPointEditor().add(gpx, latLon, titleText);
}
});
view.findViewById(R.id.cancel_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
hide();
contextMenuLayer.cancelAddGpxWaypoint();
}
});
}
public void onDraw(RotatedTileBox rt) {
PointF point = contextMenuLayer.getMovableCenterPoint(rt);
double lat = rt.getLatFromPixel(point.x, point.y);
double lon = rt.getLonFromPixel(point.x, point.y);
description.setText(PointDescription.getLocationName(context, lat, lon, true));
}
public void setTitle(String title) {
titleText = title;
this.title.setText(titleText);
}
public boolean isVisible() {
return view.getVisibility() == View.VISIBLE;
}
public void show(Drawable drawable, NewGpxWaypoint newGpxWaypoint) {
this.newGpxWaypoint = newGpxWaypoint;
exitApplyPositionMode();
view.setVisibility(View.VISIBLE);
((ImageView) view.findViewById(R.id.icon)).setImageDrawable(drawable);
}
public void hide() {
exitApplyPositionMode();
view.setVisibility(View.GONE);
}
public void enterApplyPositionMode() {
if (!applyingPositionMode) {
applyingPositionMode = true;
view.findViewById(R.id.create_button).setEnabled(false);
}
}
public void exitApplyPositionMode() {
if (applyingPositionMode) {
applyingPositionMode = false;
view.findViewById(R.id.create_button).setEnabled(true);
}
}
}

View file

@ -35,13 +35,13 @@ import net.osmand.osm.PoiFilter;
import net.osmand.osm.PoiType; import net.osmand.osm.PoiType;
import net.osmand.plus.ContextMenuAdapter; import net.osmand.plus.ContextMenuAdapter;
import net.osmand.plus.ContextMenuItem; import net.osmand.plus.ContextMenuItem;
import net.osmand.plus.GPXUtilities.NewGpxWaypoint;
import net.osmand.plus.R; import net.osmand.plus.R;
import net.osmand.plus.activities.MapActivity; import net.osmand.plus.activities.MapActivity;
import net.osmand.plus.mapcontextmenu.MapContextMenu; import net.osmand.plus.mapcontextmenu.MapContextMenu;
import net.osmand.plus.mapcontextmenu.other.MapMultiSelectionMenu; import net.osmand.plus.mapcontextmenu.other.MapMultiSelectionMenu;
import net.osmand.plus.render.MapRenderRepositories; import net.osmand.plus.render.MapRenderRepositories;
import net.osmand.plus.render.NativeOsmandLibrary; import net.osmand.plus.render.NativeOsmandLibrary;
import net.osmand.plus.views.AddGpxPointBottomSheetHelper.NewGpxPoint;
import net.osmand.util.Algorithms; import net.osmand.util.Algorithms;
import net.osmand.util.MapUtils; import net.osmand.util.MapUtils;
@ -76,14 +76,14 @@ public class ContextMenuLayer extends OsmandMapLayer {
private GestureDetector movementListener; private GestureDetector movementListener;
private final MoveMarkerBottomSheetHelper mMoveMarkerBottomSheetHelper; private final MoveMarkerBottomSheetHelper mMoveMarkerBottomSheetHelper;
private final AddWaypointBottomSheetHelper mAddWaypointBottomSheetHelper; private final AddGpxPointBottomSheetHelper mAddGpxPointBottomSheetHelper;
private boolean mInChangeMarkerPositionMode; private boolean mInChangeMarkerPositionMode;
private IContextMenuProvider selectedObjectContextMenuProvider; private IContextMenuProvider selectedObjectContextMenuProvider;
private boolean cancelApplyingNewMarkerPosition; private boolean cancelApplyingNewMarkerPosition;
private LatLon applyingMarkerLatLon; private LatLon applyingMarkerLatLon;
private boolean wasCollapseButtonVisible; private boolean wasCollapseButtonVisible;
private boolean mInGpxDetailsMode; private boolean mInGpxDetailsMode;
private boolean mInAddGpxWaypointMode; private boolean mInAddGpxPointMode;
private List<String> publicTransportTypes; private List<String> publicTransportTypes;
private Object selectedObject; private Object selectedObject;
@ -94,7 +94,11 @@ public class ContextMenuLayer extends OsmandMapLayer {
multiSelectionMenu = menu.getMultiSelectionMenu(); multiSelectionMenu = menu.getMultiSelectionMenu();
movementListener = new GestureDetector(activity, new MenuLayerOnGestureListener()); movementListener = new GestureDetector(activity, new MenuLayerOnGestureListener());
mMoveMarkerBottomSheetHelper = new MoveMarkerBottomSheetHelper(activity, this); mMoveMarkerBottomSheetHelper = new MoveMarkerBottomSheetHelper(activity, this);
mAddWaypointBottomSheetHelper = new AddWaypointBottomSheetHelper(activity, this); mAddGpxPointBottomSheetHelper = new AddGpxPointBottomSheetHelper(activity, this);
}
public AddGpxPointBottomSheetHelper getAddGpxPointBottomSheetHelper() {
return mAddGpxPointBottomSheetHelper;
} }
@Override @Override
@ -207,10 +211,10 @@ public class ContextMenuLayer extends OsmandMapLayer {
contextMarker.draw(canvas); contextMarker.draw(canvas);
} }
mMoveMarkerBottomSheetHelper.onDraw(box); mMoveMarkerBottomSheetHelper.onDraw(box);
} else if (mInAddGpxWaypointMode) { } else if (mInAddGpxPointMode) {
canvas.translate(box.getPixWidth() / 2 - contextMarker.getWidth() / 2, box.getPixHeight() / 2 - contextMarker.getHeight()); canvas.translate(box.getPixWidth() / 2 - contextMarker.getWidth() / 2, box.getPixHeight() / 2 - contextMarker.getHeight());
contextMarker.draw(canvas); contextMarker.draw(canvas);
mAddWaypointBottomSheetHelper.onDraw(box); mAddGpxPointBottomSheetHelper.onDraw(box);
} else if (menu.isActive()) { } else if (menu.isActive()) {
LatLon latLon = menu.getLatLon(); LatLon latLon = menu.getLatLon();
int x = (int) box.getPixXFromLatLon(latLon.getLatitude(), latLon.getLongitude()); int x = (int) box.getPixXFromLatLon(latLon.getLatitude(), latLon.getLongitude());
@ -289,7 +293,7 @@ public class ContextMenuLayer extends OsmandMapLayer {
} }
public Object getMoveableObject() { public Object getMoveableObject() {
return mInChangeMarkerPositionMode || mInAddGpxWaypointMode ? menu.getObject() : null; return mInChangeMarkerPositionMode ? menu.getObject() : null;
} }
public boolean isInChangeMarkerPositionMode() { public boolean isInChangeMarkerPositionMode() {
@ -300,8 +304,8 @@ public class ContextMenuLayer extends OsmandMapLayer {
return mInGpxDetailsMode; return mInGpxDetailsMode;
} }
public boolean isInAddGpxWaypointMode() { public boolean isInAddGpxPointMode() {
return mInAddGpxWaypointMode; return mInAddGpxPointMode;
} }
public boolean isObjectMoveable(Object o) { public boolean isObjectMoveable(Object o) {
@ -318,14 +322,14 @@ public class ContextMenuLayer extends OsmandMapLayer {
} }
public void applyMovedObject(Object o, LatLon position, ApplyMovedObjectCallback callback) { public void applyMovedObject(Object o, LatLon position, ApplyMovedObjectCallback callback) {
if (selectedObjectContextMenuProvider != null) { if (selectedObjectContextMenuProvider != null && !isInAddGpxPointMode()) {
if (selectedObjectContextMenuProvider instanceof IMoveObjectProvider) { if (selectedObjectContextMenuProvider instanceof IMoveObjectProvider) {
final IMoveObjectProvider l = (IMoveObjectProvider) selectedObjectContextMenuProvider; final IMoveObjectProvider l = (IMoveObjectProvider) selectedObjectContextMenuProvider;
if (l.isObjectMovable(o)) { if (l.isObjectMovable(o)) {
l.applyNewObjectPosition(o, position, callback); l.applyNewObjectPosition(o, position, callback);
} }
} }
} else if (mInChangeMarkerPositionMode || mInAddGpxWaypointMode) { } else if (mInChangeMarkerPositionMode || mInAddGpxPointMode) {
callback.onApplyMovedObject(true, null); callback.onApplyMovedObject(true, null);
} }
} }
@ -351,11 +355,7 @@ public class ContextMenuLayer extends OsmandMapLayer {
mMoveMarkerBottomSheetHelper.hide(); mMoveMarkerBottomSheetHelper.hide();
quitMovingMarker(); quitMovingMarker();
PointDescription pointDescription = null;
if (selectedObjectContextMenuProvider != null) {
pointDescription = selectedObjectContextMenuProvider.getObjectName(newObject);
}
menu.show(ll, pointDescription, newObject);
view.refreshMap(); view.refreshMap();
} }
selectedObjectContextMenuProvider = null; selectedObjectContextMenuProvider = null;
@ -369,9 +369,9 @@ public class ContextMenuLayer extends OsmandMapLayer {
}); });
} }
public void createGpxWaypoint() { public void createGpxPoint() {
if (!mInAddGpxWaypointMode) { if (!mInAddGpxPointMode) {
throw new IllegalStateException("Not in add gpx waypoint mode"); throw new IllegalStateException("Not in add gpx point mode");
} }
RotatedTileBox tileBox = activity.getMapView().getCurrentRotatedTileBox(); RotatedTileBox tileBox = activity.getMapView().getCurrentRotatedTileBox();
@ -381,14 +381,14 @@ public class ContextMenuLayer extends OsmandMapLayer {
Object obj = getMoveableObject(); Object obj = getMoveableObject();
cancelApplyingNewMarkerPosition = false; cancelApplyingNewMarkerPosition = false;
mAddWaypointBottomSheetHelper.enterApplyPositionMode(); mAddGpxPointBottomSheetHelper.enterApplyPositionMode();
applyMovedObject(obj, ll, new ApplyMovedObjectCallback() { applyMovedObject(obj, ll, new ApplyMovedObjectCallback() {
@Override @Override
public void onApplyMovedObject(boolean success, @Nullable Object newObject) { public void onApplyMovedObject(boolean success, @Nullable Object newObject) {
mAddWaypointBottomSheetHelper.exitApplyPositionMode(); mAddGpxPointBottomSheetHelper.exitApplyPositionMode();
if (success && !cancelApplyingNewMarkerPosition) { if (success && !cancelApplyingNewMarkerPosition) {
mAddWaypointBottomSheetHelper.hide(); mAddGpxPointBottomSheetHelper.hide();
quitAddGpxWaipoint(); quitAddGpxPoint();
PointDescription pointDescription = null; PointDescription pointDescription = null;
if (selectedObjectContextMenuProvider != null) { if (selectedObjectContextMenuProvider != null) {
@ -449,8 +449,8 @@ public class ContextMenuLayer extends OsmandMapLayer {
} }
} }
private void quitAddGpxWaipoint() { private void quitAddGpxPoint() {
mInAddGpxWaypointMode = false; mInAddGpxPointMode = false;
mark(View.VISIBLE, R.id.map_ruler_layout, mark(View.VISIBLE, R.id.map_ruler_layout,
R.id.map_left_widgets_panel, R.id.map_right_widgets_panel, R.id.map_center_info); R.id.map_left_widgets_panel, R.id.map_right_widgets_panel, R.id.map_center_info);
@ -460,14 +460,14 @@ public class ContextMenuLayer extends OsmandMapLayer {
} }
} }
public void enterAddGpxWaypointMode(NewGpxWaypoint newGpxWaypoint) { public void enterAddGpxPointMode(NewGpxPoint newGpxPoint) {
menu.updateMapCenter(null); menu.updateMapCenter(null);
menu.hide(); menu.hide();
activity.disableDrawer(); activity.disableDrawer();
mInAddGpxWaypointMode = true; mInAddGpxPointMode = true;
mAddWaypointBottomSheetHelper.show(menu.getLeftIcon(), newGpxWaypoint); mAddGpxPointBottomSheetHelper.show(newGpxPoint);
mark(View.INVISIBLE, R.id.map_ruler_layout, mark(View.INVISIBLE, R.id.map_ruler_layout,
R.id.map_left_widgets_panel, R.id.map_right_widgets_panel, R.id.map_center_info); R.id.map_left_widgets_panel, R.id.map_right_widgets_panel, R.id.map_center_info);
@ -529,9 +529,9 @@ public class ContextMenuLayer extends OsmandMapLayer {
applyingMarkerLatLon = null; applyingMarkerLatLon = null;
} }
public void cancelAddGpxWaypoint() { public void cancelAddGpxPoint() {
cancelApplyingNewMarkerPosition = true; cancelApplyingNewMarkerPosition = true;
quitAddGpxWaipoint(); quitAddGpxPoint();
activity.getContextMenu().show(); activity.getContextMenu().show();
applyingMarkerLatLon = null; applyingMarkerLatLon = null;
} }
@ -547,15 +547,21 @@ public class ContextMenuLayer extends OsmandMapLayer {
@Nullable PointDescription pointDescription, @Nullable PointDescription pointDescription,
@Nullable Object object, @Nullable Object object,
@Nullable IContextMenuProvider provider) { @Nullable IContextMenuProvider provider) {
selectedObjectContextMenuProvider = provider; if (mInAddGpxPointMode) {
hideVisibleMenues(); String title = pointDescription == null ? "" : pointDescription.getName();
activity.getMapViewTrackingUtilities().setMapLinkedToLocation(false); mAddGpxPointBottomSheetHelper.setTitle(title);
if (!activity.getMapView().getCurrentRotatedTileBox().containsLatLon(latLon)) { view.getAnimatedDraggingThread().startMoving(latLon.getLatitude(), latLon.getLongitude(), view.getZoom(), true);
menu.setMapCenter(latLon); } else {
menu.setMapPosition(activity.getMapView().getMapPosition()); selectedObjectContextMenuProvider = provider;
menu.setCenterMarker(true); hideVisibleMenues();
activity.getMapViewTrackingUtilities().setMapLinkedToLocation(false);
if (!activity.getMapView().getCurrentRotatedTileBox().containsLatLon(latLon)) {
menu.setMapCenter(latLon);
menu.setMapPosition(activity.getMapView().getMapPosition());
menu.setCenterMarker(true);
}
menu.show(latLon, pointDescription, object);
} }
menu.show(latLon, pointDescription, object);
return true; return true;
} }
@ -641,10 +647,9 @@ public class ContextMenuLayer extends OsmandMapLayer {
if (latLon == null) { if (latLon == null) {
latLon = getLatLon(point, tileBox); latLon = getLatLon(point, tileBox);
} }
if (mInAddGpxWaypointMode) { if (mInAddGpxPointMode) {
if (pointDescription != null) { String title = pointDescription == null ? "" : pointDescription.getName();
mAddWaypointBottomSheetHelper.setTitle(pointDescription.getName()); mAddGpxPointBottomSheetHelper.setTitle(title);
}
view.getAnimatedDraggingThread().startMoving(latLon.getLatitude(), latLon.getLongitude(), view.getZoom(), true); view.getAnimatedDraggingThread().startMoving(latLon.getLatitude(), latLon.getLongitude(), view.getZoom(), true);
} else { } else {
showContextMenu(latLon, pointDescription, selectedObj, provider); showContextMenu(latLon, pointDescription, selectedObj, provider);
@ -661,7 +666,12 @@ public class ContextMenuLayer extends OsmandMapLayer {
selectedObjectContextMenuProvider = null; selectedObjectContextMenuProvider = null;
LatLon latLon = getLatLon(point, tileBox); LatLon latLon = getLatLon(point, tileBox);
activity.getMapViewTrackingUtilities().setMapLinkedToLocation(false); activity.getMapViewTrackingUtilities().setMapLinkedToLocation(false);
menu.show(latLon, null, null); if (mInAddGpxPointMode) {
mAddGpxPointBottomSheetHelper.setTitle("");
view.getAnimatedDraggingThread().startMoving(latLon.getLatitude(), latLon.getLongitude(), view.getZoom(), true);
} else {
menu.show(latLon, null, null);
}
return true; return true;
} }
return false; return false;
@ -690,7 +700,7 @@ public class ContextMenuLayer extends OsmandMapLayer {
} }
public boolean disableLongPressOnMap() { public boolean disableLongPressOnMap() {
if (mInChangeMarkerPositionMode || mInGpxDetailsMode || mInAddGpxWaypointMode) { if (mInChangeMarkerPositionMode || mInGpxDetailsMode || mInAddGpxPointMode) {
return true; return true;
} }
boolean res = false; boolean res = false;
@ -854,8 +864,12 @@ public class ContextMenuLayer extends OsmandMapLayer {
if (movementListener.onTouchEvent(event)) { if (movementListener.onTouchEvent(event)) {
if (menu.isVisible()) { if (menu.isVisible()) {
menu.updateMapCenter(null); if (!menu.isClosable()) {
menu.close(); menu.hide();
} else {
menu.updateMapCenter(null);
menu.close();
}
} }
if (multiSelectionMenu.isVisible()) { if (multiSelectionMenu.isVisible()) {
multiSelectionMenu.hide(); multiSelectionMenu.hide();

View file

@ -1120,8 +1120,8 @@ public class MapControlsLayer extends OsmandMapLayer {
} }
private boolean isInMovingMarkerMode(){ private boolean isInMovingMarkerMode(){
return mapQuickActionLayer == null ? contextMenuLayer.isInChangeMarkerPositionMode() || contextMenuLayer.isInAddGpxWaypointMode(): return mapQuickActionLayer == null ? contextMenuLayer.isInChangeMarkerPositionMode() || contextMenuLayer.isInAddGpxPointMode():
mapQuickActionLayer.isInMovingMarkerMode() || contextMenuLayer.isInChangeMarkerPositionMode() || contextMenuLayer.isInAddGpxWaypointMode(); mapQuickActionLayer.isInMovingMarkerMode() || contextMenuLayer.isInChangeMarkerPositionMode() || contextMenuLayer.isInAddGpxPointMode();
} }
private boolean isInGpxDetailsMode() { private boolean isInGpxDetailsMode() {