diff --git a/OsmAnd-java/src/net/osmand/TspAnt.java b/OsmAnd-java/src/net/osmand/TspAnt.java index 245b67ff82..815bddb7ef 100644 --- a/OsmAnd-java/src/net/osmand/TspAnt.java +++ b/OsmAnd-java/src/net/osmand/TspAnt.java @@ -1,11 +1,11 @@ package net.osmand; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Random; import net.osmand.data.LatLon; import net.osmand.util.MapUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; /* * === Implementation of ant swarm TSP solver. === * @@ -106,10 +106,13 @@ public class TspAnt { // Allocates all memory. // Adds 1 to edge lengths to ensure no zero length edges. public TspAnt readGraph(List intermediates, LatLon start, LatLon end) { + boolean keepEndPoint = end != null; List l = new ArrayList(); l.add(start); l.addAll(intermediates); - l.add(end); + if (keepEndPoint) { + l.add(end); + } n = l.size() ; // System.out.println("Cost"); graph = new double[n][n]; @@ -125,7 +128,7 @@ public class TspAnt { } maxSum = Math.rint(maxSum) + 1; for (int i = 0; i < n; i++) { - if (i == n - 1) { + if (keepEndPoint && i == n - 1) { graph[i][0] = 0.1; } else { graph[i][0] = maxSum; diff --git a/OsmAnd/res/layout-land/menu_obj_selection_fragment.xml b/OsmAnd/res/layout-land/menu_obj_selection_fragment.xml index 5102244cbd..0b54849f1c 100644 --- a/OsmAnd/res/layout-land/menu_obj_selection_fragment.xml +++ b/OsmAnd/res/layout-land/menu_obj_selection_fragment.xml @@ -15,7 +15,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + + + + + + + + + \ No newline at end of file diff --git a/OsmAnd/res/layout/edit_fav_fragment.xml b/OsmAnd/res/layout/edit_fav_fragment.xml deleted file mode 100644 index b8e46dbfa6..0000000000 --- a/OsmAnd/res/layout/edit_fav_fragment.xml +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/OsmAnd/res/layout/gpx_track_item.xml b/OsmAnd/res/layout/gpx_track_item.xml index 5c68c9c4f3..a62f652a8d 100644 --- a/OsmAnd/res/layout/gpx_track_item.xml +++ b/OsmAnd/res/layout/gpx_track_item.xml @@ -26,8 +26,12 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:focusable="false" - android:layout_marginRight="@dimen/list_content_padding" - android:visibility="gone"/> + android:visibility="gone" + android:paddingTop="4dp" + android:paddingBottom="4dp" + android:paddingRight="@dimen/dialog_content_margin" + android:clickable="false" + android:focusableInTouchMode="false"/> - + android:foreground="?attr/selectableItemBackground"> Напольные покрытия Глиняная посуда + Название речного порога + diff --git a/OsmAnd/res/values/phrases.xml b/OsmAnd/res/values/phrases.xml index 4a1fd69fc6..f9d425780e 100644 --- a/OsmAnd/res/values/phrases.xml +++ b/OsmAnd/res/values/phrases.xml @@ -3759,4 +3759,6 @@ Flooring store Pottery + Name of the river rapids + diff --git a/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java b/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java index c2c5e77418..ecd0bc5cfa 100644 --- a/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java +++ b/OsmAnd/src/net/osmand/plus/MapMarkersHelper.java @@ -1438,7 +1438,8 @@ public class MapMarkersHelper { } public List getActiveMarkers() { - List activeMarkers = new ArrayList<>(); + List markers = new ArrayList<>(this.markers); + List activeMarkers = new ArrayList<>(markers.size()); for (MapMarker marker : markers) { if (!marker.history) { activeMarkers.add(marker); diff --git a/OsmAnd/src/net/osmand/plus/activities/EditFavoriteGroupDialogFragment.java b/OsmAnd/src/net/osmand/plus/activities/EditFavoriteGroupDialogFragment.java index d543ce8405..06a3044a81 100644 --- a/OsmAnd/src/net/osmand/plus/activities/EditFavoriteGroupDialogFragment.java +++ b/OsmAnd/src/net/osmand/plus/activities/EditFavoriteGroupDialogFragment.java @@ -1,6 +1,5 @@ package net.osmand.plus.activities; -import android.app.Activity; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; @@ -9,13 +8,11 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v7.app.AlertDialog; import android.support.v7.widget.ListPopupWindow; -import android.support.v7.widget.SwitchCompat; +import android.view.ContextThemeWrapper; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.view.Window; -import android.view.WindowManager; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.EditText; @@ -25,209 +22,195 @@ import android.widget.TextView; import net.osmand.AndroidUtils; import net.osmand.plus.FavouritesDbHelper; import net.osmand.plus.FavouritesDbHelper.FavoriteGroup; -import net.osmand.plus.IconsCache; import net.osmand.plus.MapMarkersHelper; import net.osmand.plus.MapMarkersHelper.MarkersSyncGroup; import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; -import net.osmand.plus.base.BottomSheetDialogFragment; +import net.osmand.plus.base.MenuBottomSheetDialogFragment; +import net.osmand.plus.base.bottomsheetmenu.BaseBottomSheetItem; +import net.osmand.plus.base.bottomsheetmenu.BottomSheetItemWithCompoundButton; +import net.osmand.plus.base.bottomsheetmenu.SimpleBottomSheetItem; +import net.osmand.plus.base.bottomsheetmenu.simpleitems.DividerHalfItem; +import net.osmand.plus.base.bottomsheetmenu.simpleitems.TitleItem; import net.osmand.plus.helpers.ColorDialogs; import net.osmand.util.Algorithms; -public class EditFavoriteGroupDialogFragment extends BottomSheetDialogFragment { +public class EditFavoriteGroupDialogFragment extends MenuBottomSheetDialogFragment { public static final String TAG = "EditFavoriteGroupDialogFragment"; private static final String GROUP_NAME_KEY = "group_name_key"; - private OsmandApplication app; private FavoriteGroup group; - private FavouritesDbHelper helper; @Override - public void onStart() { - super.onStart(); - - final Window window = getDialog().getWindow(); - WindowManager.LayoutParams params = window.getAttributes(); - params.height = ViewGroup.LayoutParams.WRAP_CONTENT; - params.gravity = Gravity.BOTTOM; - params.width = ViewGroup.LayoutParams.MATCH_PARENT; - window.setAttributes(params); - } - - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - - final Activity activity = getActivity(); - app = (OsmandApplication) activity.getApplicationContext(); - helper = app.getFavorites(); - - Bundle args = null; - if (savedInstanceState != null) { - args = savedInstanceState; - } else if (getArguments() != null) { - args = getArguments(); - } - + public void createMenuItems(Bundle savedInstanceState) { + final OsmandApplication app = getMyApplication(); + FavouritesDbHelper helper = app.getFavorites(); + Bundle args = getArguments(); if (args != null) { String groupName = args.getString(GROUP_NAME_KEY); if (groupName != null) { group = helper.getGroup(groupName); } } - - final View view = inflater.inflate(R.layout.edit_fav_fragment, container, - false); if (group == null) { - return view; + return; + } + items.add(new TitleItem(Algorithms.isEmpty(group.name) ? app.getString(R.string.shared_string_favorites) : group.name)); + + BaseBottomSheetItem editNameItem = new SimpleBottomSheetItem.Builder() + .setIcon(getContentIcon(R.drawable.ic_action_edit_dark)) + .setTitle(getString(R.string.edit_name)) + .setLayoutId(R.layout.bottom_sheet_item_simple) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + AlertDialog.Builder b = new AlertDialog.Builder(getContext()); + b.setTitle(R.string.favorite_group_name); + final EditText nameEditText = new EditText(getContext()); + nameEditText.setText(group.name); + b.setView(nameEditText); + b.setNegativeButton(R.string.shared_string_cancel, null); + b.setPositiveButton(R.string.shared_string_save, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + String name = nameEditText.getText().toString(); + boolean nameChanged = !Algorithms.objectEquals(group.name, name); + if (nameChanged) { + app.getFavorites() + .editFavouriteGroup(group, name, group.color, group.visible); + updateParentFragment(); + } + dismiss(); + } + }); + b.show(); + } + }) + .create(); + items.add(editNameItem); + + final int themeRes = nightMode ? R.style.OsmandDarkTheme : R.style.OsmandLightTheme; + final View changeColorView = View.inflate(new ContextThemeWrapper(getContext(), themeRes), + R.layout.change_fav_color, null); + ((ImageView) changeColorView.findViewById(R.id.change_color_icon)) + .setImageDrawable(getContentIcon(R.drawable.ic_action_appearance)); + updateColorView((ImageView) changeColorView.findViewById(R.id.colorImage)); + BaseBottomSheetItem changeColorItem = new BaseBottomSheetItem.Builder() + .setCustomView(changeColorView) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + final ListPopupWindow popup = new ListPopupWindow(getActivity()); + popup.setAnchorView(changeColorView); + popup.setContentWidth(AndroidUtils.dpToPx(app, 200f)); + popup.setModal(true); + popup.setDropDownGravity(Gravity.END | Gravity.TOP); + popup.setVerticalOffset(AndroidUtils.dpToPx(app, -48f)); + popup.setHorizontalOffset(AndroidUtils.dpToPx(app, -6f)); + final FavoriteColorAdapter colorAdapter = new FavoriteColorAdapter(getActivity()); + popup.setAdapter(colorAdapter); + popup.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + Integer color = colorAdapter.getItem(position); + if (color != null) { + if (color != group.color) { + app.getFavorites() + .editFavouriteGroup(group, group.name, color, group.visible); + updateParentFragment(); + } + } + popup.dismiss(); + dismiss(); + } + }); + popup.show(); + } + }) + .create(); + items.add(changeColorItem); + + BaseBottomSheetItem showOnMapItem = new BottomSheetItemWithCompoundButton.Builder() + .setChecked(group.visible) + .setIcon(getContentIcon(R.drawable.ic_map)) + .setTitle(getString(R.string.shared_string_show_on_map)) + .setLayoutId(R.layout.bottom_sheet_item_with_switch) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + boolean visible = !group.visible; + app.getFavorites() + .editFavouriteGroup(group, group.name, group.color, visible); + updateParentFragment(); + dismiss(); + } + }) + .create(); + items.add(showOnMapItem); + + if (group.points.size() > 0) { + items.add(new DividerHalfItem(getContext())); } - IconsCache ic = app.getIconsCache(); - - final TextView title = (TextView) view.findViewById(R.id.title); - title.setText(Algorithms.isEmpty(group.name) ? app.getString(R.string.shared_string_favorites) : group.name); - View editNameView = view.findViewById(R.id.edit_name_view); - ((ImageView) view.findViewById(R.id.edit_name_icon)) - .setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_edit_dark)); - editNameView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - AlertDialog.Builder b = new AlertDialog.Builder(activity); - b.setTitle(R.string.favorite_group_name); - final EditText nameEditText = new EditText(activity); - nameEditText.setText(group.name); - int leftPadding = AndroidUtils.dpToPx(activity, 24f); - int topPadding = AndroidUtils.dpToPx(activity, 4f); - b.setView(nameEditText, leftPadding, topPadding, leftPadding, topPadding); - b.setNegativeButton(R.string.shared_string_cancel, null); - b.setPositiveButton(R.string.shared_string_save, new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int which) { - String name = nameEditText.getText().toString(); - boolean nameChanged = !Algorithms.objectEquals(group.name, name); - if (nameChanged) { - getMyApplication().getFavorites() - .editFavouriteGroup(group, name, group.color, group.visible); - updateParentFragment(); - } - dismiss(); - } - }); - b.show(); - } - }); - - final View changeColorView = view.findViewById(R.id.change_color_view); - ((ImageView) view.findViewById(R.id.change_color_icon)) - .setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_appearance)); - updateColorView(changeColorView); - changeColorView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - final ListPopupWindow popup = new ListPopupWindow(getActivity()); - popup.setAnchorView(changeColorView); - popup.setContentWidth(AndroidUtils.dpToPx(app, 200f)); - popup.setModal(true); - popup.setDropDownGravity(Gravity.RIGHT | Gravity.TOP); - popup.setVerticalOffset(AndroidUtils.dpToPx(app, -48f)); - popup.setHorizontalOffset(AndroidUtils.dpToPx(app, -6f)); - final FavoriteColorAdapter colorAdapter = new FavoriteColorAdapter(getActivity()); - popup.setAdapter(colorAdapter); - popup.setOnItemClickListener(new AdapterView.OnItemClickListener() { - - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - Integer color = colorAdapter.getItem(position); - if (color != null) { - if (color != group.color) { - getMyApplication().getFavorites() - .editFavouriteGroup(group, group.name, color, group.visible); - updateParentFragment(); - } - } - popup.dismiss(); - dismiss(); - } - }); - popup.show(); - } - }); - - View showOnMapView = view.findViewById(R.id.show_on_map_view); - ((ImageView) view.findViewById(R.id.show_on_map_icon)) - .setImageDrawable(ic.getThemedIcon(R.drawable.ic_map)); - final SwitchCompat checkbox = (SwitchCompat) view.findViewById(R.id.show_on_map_switch); - checkbox.setChecked(group.visible); - showOnMapView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - boolean visible = !group.visible; - checkbox.setChecked(visible); - getMyApplication().getFavorites() - .editFavouriteGroup(group, group.name, group.color, visible); - updateParentFragment(); - } - }); - - final MapMarkersHelper markersHelper = getMyApplication().getMapMarkersHelper(); + final MapMarkersHelper markersHelper = app.getMapMarkersHelper(); final MarkersSyncGroup syncGroup = new MarkersSyncGroup(group.name, group.name, MarkersSyncGroup.FAVORITES_TYPE, group.color); boolean groupSyncedWithMarkers = markersHelper.isGroupSynced(syncGroup.getId()); - View addToMarkersView = view.findViewById(R.id.add_to_markers_view); if (app.getSettings().USE_MAP_MARKERS.get() && group.points.size() > 0 && !groupSyncedWithMarkers) { - ((ImageView) view.findViewById(R.id.add_to_markers_icon)) - .setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_flag_dark)); - addToMarkersView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - markersHelper.addMarkersSyncGroup(syncGroup); - markersHelper.syncGroupAsync(syncGroup); - dismiss(); - MapActivity.launchMapActivityMoveToTop(getActivity()); - } - }); - } else { - addToMarkersView.setVisibility(View.GONE); + BaseBottomSheetItem addToMarkersItem = new SimpleBottomSheetItem.Builder() + .setIcon(getContentIcon(R.drawable.ic_action_flag_dark)) + .setTitle(getString(R.string.shared_string_add_to_map_markers)) + .setLayoutId(R.layout.bottom_sheet_item_simple) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + markersHelper.addMarkersSyncGroup(syncGroup); + markersHelper.syncGroupAsync(syncGroup); + dismiss(); + MapActivity.launchMapActivityMoveToTop(getActivity()); + } + }) + .create(); + items.add(addToMarkersItem); } - View removeFromMarkersView = view.findViewById(R.id.remove_from_markers_view); if (app.getSettings().USE_MAP_MARKERS.get() && groupSyncedWithMarkers) { - removeFromMarkersView.setVisibility(View.VISIBLE); - ((ImageView) view.findViewById(R.id.remove_from_markers_icon)) - .setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_delete_dark)); - removeFromMarkersView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - markersHelper.removeMarkersSyncGroup(syncGroup.getId(), true); - dismiss(); - MapActivity.launchMapActivityMoveToTop(getActivity()); - } - }); + BaseBottomSheetItem removeFromMarkersItem = new SimpleBottomSheetItem.Builder() + .setIcon(getContentIcon(R.drawable.ic_action_delete_dark)) + .setTitle(getString(R.string.remove_from_map_markers)) + .setLayoutId(R.layout.bottom_sheet_item_simple) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + markersHelper.removeMarkersSyncGroup(syncGroup.getId(), true); + dismiss(); + MapActivity.launchMapActivityMoveToTop(getActivity()); + } + }) + .create(); + items.add(removeFromMarkersItem); } - View shareView = view.findViewById(R.id.share_view); if (group.points.size() > 0) { - ((ImageView) view.findViewById(R.id.share_icon)) - .setImageDrawable(ic.getThemedIcon(R.drawable.ic_action_gshare_dark)); - shareView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - FavoritesTreeFragment fragment = getFavoritesTreeFragment(); - if (fragment != null) { - fragment.shareFavorites(group); - } - dismiss(); - } - }); - } else { - shareView.setVisibility(View.GONE); + BaseBottomSheetItem shareItem = new SimpleBottomSheetItem.Builder() + .setIcon(getContentIcon(R.drawable.ic_action_gshare_dark)) + .setTitle(getString(R.string.shared_string_share)) + .setLayoutId(R.layout.bottom_sheet_item_simple) + .setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + FavoritesTreeFragment fragment = getFavoritesTreeFragment(); + if (fragment != null) { + fragment.shareFavorites(group); + } + dismiss(); + } + }) + .create(); + items.add(shareItem); } - if (group.points.size() == 0) { - view.findViewById(R.id.divider).setVisibility(View.GONE); - } - - return view; } @Override @@ -253,13 +236,12 @@ public class EditFavoriteGroupDialogFragment extends BottomSheetDialogFragment { } } - private void updateColorView(View colorView) { - ImageView colorImageView = (ImageView) colorView.findViewById(R.id.colorImage); + private void updateColorView(ImageView colorImageView) { int color = group.color == 0 ? getResources().getColor(R.color.color_favorite) : group.color; if (color == 0) { - colorImageView.setImageDrawable(app.getIconsCache().getThemedIcon(R.drawable.ic_action_circle)); + colorImageView.setImageDrawable(getContentIcon(R.drawable.ic_action_circle)); } else { - colorImageView.setImageDrawable(app.getIconsCache().getPaintedIcon(R.drawable.ic_action_circle, color)); + colorImageView.setImageDrawable(getMyApplication().getIconsCache().getPaintedIcon(R.drawable.ic_action_circle, color)); } } @@ -273,9 +255,9 @@ public class EditFavoriteGroupDialogFragment extends BottomSheetDialogFragment { public static class FavoriteColorAdapter extends ArrayAdapter { - private OsmandApplication app; + private final OsmandApplication app; - public FavoriteColorAdapter(Context context) { + FavoriteColorAdapter(Context context) { super(context, R.layout.rendering_prop_menu_item); this.app = (OsmandApplication) getContext().getApplicationContext(); init(); @@ -293,7 +275,7 @@ public class EditFavoriteGroupDialogFragment extends BottomSheetDialogFragment { Integer color = getItem(position); View v = convertView; if (v == null) { - v = LayoutInflater.from(getContext()).inflate(R.layout.rendering_prop_menu_item, null); + v = LayoutInflater.from(getContext()).inflate(R.layout.rendering_prop_menu_item, parent, false); } if (color != null) { TextView textView = (TextView) v.findViewById(R.id.text1); diff --git a/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java b/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java index a403a43f5c..7c52cd7c03 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/GpxUiHelper.java @@ -30,6 +30,7 @@ import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.Button; +import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.ImageView; @@ -471,9 +472,10 @@ public class GpxUiHelper { if (item.getSelected() == null) { v.findViewById(R.id.check_item).setVisibility(View.GONE); + v.findViewById(R.id.check_local_index).setVisibility(View.GONE); } else { if (checkLayout) { - final AppCompatCheckBox ch = ((AppCompatCheckBox) v.findViewById(R.id.toggle_checkbox_item)); + final CheckBox ch = ((CheckBox) v.findViewById(R.id.check_local_index)); ch.setVisibility(View.VISIBLE); v.findViewById(R.id.toggle_item).setVisibility(View.GONE); ch.setOnCheckedChangeListener(null); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java index 280e293b60..a1788d050b 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java @@ -832,34 +832,43 @@ public class MapContextMenu extends MenuTitleController implements StateChangedL } public void buttonWaypointPressed() { - if (object != null && object instanceof MapMarker) { + MapMarker marker = getMapMarker(); + if (marker != null) { RenameMarkerBottomSheetDialogFragment - .showInstance(mapActivity.getSupportFragmentManager(), (MapMarker) object); - } else { - if (pointDescription.isDestination()) { - mapActivity.getMapActions().editWaypoints(); - } else if (settings.USE_MAP_MARKERS.get()) { - if (pointDescription.isMapMarker()) { - hide(); - MapActivity.clearPrevActivityIntent(); - MapMarkersDialogFragment.showInstance(mapActivity); - } else { - String mapObjectName = null; - if (object instanceof Amenity) { - Amenity amenity = (Amenity) object; - mapObjectName = amenity.getName() + "_" + amenity.getType().getKeyName(); - } - mapActivity.getMapActions().addMapMarker(latLon.getLatitude(), latLon.getLongitude(), - getPointDescriptionForMarker(), mapObjectName); - } + .showInstance(mapActivity.getSupportFragmentManager(), marker); + } else if (settings.USE_MAP_MARKERS.get()) { + if (pointDescription.isMapMarker()) { + hide(); + MapActivity.clearPrevActivityIntent(); + MapMarkersDialogFragment.showInstance(mapActivity); } else { - mapActivity.getMapActions().addAsTarget(latLon.getLatitude(), latLon.getLongitude(), - getPointDescriptionForTarget()); + String mapObjectName = null; + if (object instanceof Amenity) { + Amenity amenity = (Amenity) object; + mapObjectName = amenity.getName() + "_" + amenity.getType().getKeyName(); + } + mapActivity.getMapActions().addMapMarker(latLon.getLatitude(), latLon.getLongitude(), + getPointDescriptionForMarker(), mapObjectName); } + } else { + mapActivity.getMapActions().addAsTarget(latLon.getLatitude(), latLon.getLongitude(), + getPointDescriptionForTarget()); } close(); } + @Nullable + private MapMarker getMapMarker() { + Object correspondingObj = menuController.getCorrespondingMapObject(); + if (correspondingObj != null && correspondingObj instanceof MapMarker) { + return (MapMarker) correspondingObj; + } + if (object != null && object instanceof MapMarker) { + return (MapMarker) object; + } + return null; + } + public void buttonFavoritePressed() { if (object != null && object instanceof FavouritePoint) { diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java index 0c83a68727..402fce0b56 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MenuController.java @@ -239,6 +239,10 @@ public abstract class MenuController extends BaseMenuController implements Colla protected abstract Object getObject(); + protected Object getCorrespondingMapObject() { + return null; + } + public boolean isActive() { return active; } diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/AmenityMenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/AmenityMenuController.java index 453f2f91dc..07b29991c5 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/AmenityMenuController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/controllers/AmenityMenuController.java @@ -93,8 +93,8 @@ public class AmenityMenuController extends MenuController { } @Override - public boolean isWaypointButtonEnabled() { - return marker == null; + protected Object getCorrespondingMapObject() { + return marker; } @Override diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/MapMultiSelectionMenuFragment.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/MapMultiSelectionMenuFragment.java index 8e80c623cb..44546d08a4 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/MapMultiSelectionMenuFragment.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/MapMultiSelectionMenuFragment.java @@ -1,17 +1,27 @@ package net.osmand.plus.mapcontextmenu.other; +import android.app.Activity; +import android.content.Context; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; +import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; +import android.widget.AbsListView; +import android.widget.FrameLayout; +import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; +import com.github.ksoichiro.android.observablescrollview.ObservableListView; +import com.github.ksoichiro.android.observablescrollview.ObservableScrollViewCallbacks; +import com.github.ksoichiro.android.observablescrollview.ScrollState; + import net.osmand.AndroidUtils; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; @@ -41,22 +51,103 @@ public class MapMultiSelectionMenuFragment extends Fragment implements MultiSele AndroidUtils.setBackground(view.getContext(), view, !menu.isLight(), R.drawable.multi_selection_menu_bg_light_land, R.drawable.multi_selection_menu_bg_dark_land); } else { - AndroidUtils.setBackground(view.getContext(), view, !menu.isLight(), - R.drawable.multi_selection_menu_bg_light, R.drawable.multi_selection_menu_bg_dark); + AndroidUtils.setBackground(view.getContext(), view.findViewById(R.id.cancel_row), !menu.isLight(), + R.color.ctx_menu_bg_light, R.color.ctx_menu_bg_dark); } - ListView listView = (ListView) view.findViewById(R.id.list); + final ListView listView = (ListView) view.findViewById(R.id.list); if (menu.isLandscapeLayout() && Build.VERSION.SDK_INT >= 21) { AndroidUtils.addStatusBarPadding21v(getActivity(), listView); } - View headerView = inflater.inflate(R.layout.menu_obj_selection_header, listView, false); - headerView.setOnClickListener(null); - listView.addHeaderView(headerView); listAdapter = createAdapter(); listAdapter.setListener(this); listView.setAdapter(listAdapter); - runLayoutListener(); + if (!menu.isLandscapeLayout()) { + final Context context = getContext(); + + FrameLayout paddingView = new FrameLayout(context); + paddingView.setLayoutParams(new AbsListView.LayoutParams( + AbsListView.LayoutParams.MATCH_PARENT, getPaddingViewHeight()) + ); + paddingView.setClickable(true); + paddingView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + dismissMenu(); + } + }); + + FrameLayout shadowContainer = new FrameLayout(context); + shadowContainer.setLayoutParams(new FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT, Gravity.BOTTOM + )); + + ImageView shadow = new ImageView(context); + shadow.setImageDrawable(ContextCompat.getDrawable(context, R.drawable.bg_shadow_onmap)); + shadow.setLayoutParams(new FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT, Gravity.BOTTOM + )); + shadow.setScaleType(ImageView.ScaleType.FIT_XY); + + shadowContainer.addView(shadow); + paddingView.addView(shadowContainer); + listView.addHeaderView(paddingView); + + view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + float titleHeight = getResources().getDimension(R.dimen.multi_selection_header_height); + int maxHeight = (int) (titleHeight); + for (int i = 0; i < 3 && i < listAdapter.getCount(); i++) { + View childView = listAdapter.getView(0, null, (ListView) view.findViewById(R.id.list)); + childView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), + View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); + maxHeight += childView.getMeasuredHeight(); + } + + listView.setSelectionFromTop(0, -maxHeight); + + ViewTreeObserver obs = view.getViewTreeObserver(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + obs.removeOnGlobalLayoutListener(this); + } else { + obs.removeGlobalOnLayoutListener(this); + } + } + }); + + ((ObservableListView) listView).setScrollViewCallbacks(new ObservableScrollViewCallbacks() { + + boolean initialScroll = true; + int minHeight = getResources().getDimensionPixelSize(R.dimen.multi_selection_header_height) + + getResources().getDimensionPixelSize(R.dimen.list_item_height); + + @Override + public void onScrollChanged(int scrollY, boolean firstScroll, boolean dragging) { + if (scrollY <= minHeight && !initialScroll) { + dismissMenu(); + } + } + + @Override + public void onDownMotionEvent() { + initialScroll = false; + } + + @Override + public void onUpOrCancelMotionEvent(ScrollState scrollState) { + + } + }); + } + + View headerView = inflater.inflate(R.layout.menu_obj_selection_header, listView, false); + if (!menu.isLandscapeLayout()) { + AndroidUtils.setBackground(getContext(), headerView, !menu.isLight(), R.color.ctx_menu_bg_light, R.color.ctx_menu_bg_dark); + } + headerView.setOnClickListener(null); + listView.addHeaderView(headerView); view.findViewById(R.id.divider).setBackgroundColor(ContextCompat.getColor(getContext(), menu.isLight() ? R.color.multi_selection_menu_divider_light : R.color.multi_selection_menu_divider_dark)); @@ -111,6 +202,12 @@ public class MapMultiSelectionMenuFragment extends Fragment implements MultiSele menu.getMapActivity().getMapLayers().getMapControlsLayer().setControlsClickable(true); } + private int getPaddingViewHeight() { + Activity activity = getActivity(); + return AndroidUtils.getScreenHeight(activity) + - activity.getResources().getDimensionPixelSize(R.dimen.bottom_sheet_cancel_button_height); + } + public static void showInstance(final MapActivity mapActivity) { if (mapActivity.isActivityDestroyed()) { @@ -137,45 +234,6 @@ public class MapMultiSelectionMenuFragment extends Fragment implements MultiSele .addToBackStack(TAG).commitAllowingStateLoss(); } - private void runLayoutListener() { - ViewTreeObserver vto = view.getViewTreeObserver(); - vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { - - @Override - public void onGlobalLayout() { - - if (!menu.isLandscapeLayout() && listAdapter.getCount() > 3) { - View contentView = view.findViewById(R.id.content); - float headerHeight = contentView.getResources().getDimension(R.dimen.multi_selection_header_height); - float cancelRowHeight = contentView.getResources().getDimension(R.dimen.bottom_sheet_cancel_button_height); - int maxHeight = (int) (headerHeight + cancelRowHeight); - for (int i = 0; i < 3; i++) { - View childView = listAdapter.getView(0, null, (ListView) contentView.findViewById(R.id.list)); - childView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), - View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); - maxHeight += childView.getMeasuredHeight(); - } - int height = contentView.getHeight(); - - if (height > maxHeight) { - ViewGroup.LayoutParams lp = contentView.getLayoutParams(); - lp.height = maxHeight; - contentView.setLayoutParams(lp); - contentView.requestLayout(); - } - } - - ViewTreeObserver obs = view.getViewTreeObserver(); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - obs.removeOnGlobalLayoutListener(this); - } else { - obs.removeGlobalOnLayoutListener(this); - } - } - }); - } - private MultiSelectionArrayAdapter createAdapter() { final List items = new LinkedList<>(menu.getObjects()); return new MultiSelectionArrayAdapter(menu, R.layout.menu_obj_list_item, items); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/MultiSelectionArrayAdapter.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/MultiSelectionArrayAdapter.java index c98342c0e2..d714caf0e2 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/MultiSelectionArrayAdapter.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/other/MultiSelectionArrayAdapter.java @@ -38,6 +38,10 @@ public class MultiSelectionArrayAdapter extends ArrayAdapter fullObjects = new ArrayList<>(); @ColorInt int fileColor = getFileColor(g); + boolean synced = isSynced(g); for (WptPt o : pts) { if (o.lat >= latLonBounds.bottom && o.lat <= latLonBounds.top && o.lon >= latLonBounds.left && o.lon <= latLonBounds.right && o != contextMenuLayer.getMoveableObject()) { + if (synced) { + if (mapMarkersHelper.getMapMarker(o) == null) { + continue; + } + } cache.add(o); float x = tileBox.getPixXFromLatLon(o.lat, o.lon); float y = tileBox.getPixYFromLatLon(o.lat, o.lon); @@ -385,7 +391,6 @@ public class GPXLayer extends OsmandMapLayer implements ContextMenuLayer.IContex } pointFileMap.put(o, g); } - boolean synced = isSynced(g); for (WptPt o : fullObjects) { float x = tileBox.getPixXFromLatLon(o.lat, o.lon); float y = tileBox.getPixYFromLatLon(o.lat, o.lon); diff --git a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java index 86fac1bfea..c14ab304cb 100644 --- a/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java +++ b/OsmAnd/src/net/osmand/plus/views/mapwidgets/MapMarkersWidgetsFactory.java @@ -215,11 +215,7 @@ public class MapMarkersWidgetsFactory { return; } - boolean mapLinkedToLoc = map.getMapViewTrackingUtilities().isMapLinkedToLocation(); - Float heading = 0f; - if (mapLinkedToLoc) { - heading = map.getMapViewTrackingUtilities().getHeading(); - } + Float heading = map.getMapViewTrackingUtilities().getHeading(); MapMarker marker = markers.get(0); updateUI(loc, heading, marker, arrowImg, distText, okButton, addressText, true, customLocation != null);