diff --git a/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java b/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java index 11a2d09b0f..7a660d9df1 100644 --- a/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java +++ b/OsmAnd/src/net/osmand/plus/activities/search/SearchHistoryFragment.java @@ -265,26 +265,7 @@ public class SearchHistoryFragment extends OsmAndListFragment implements SearchA PointDescription pd = historyEntry.getName(); nameText.setText(pd.getSimpleName(activity, false), BufferType.SPANNABLE); ImageView icon = ((ImageView) row.findViewById(R.id.icon)); - - if (historyEntry.getName().isAddress()) { - icon.setImageDrawable(ic.getContentIcon(R.drawable.ic_type_address)); - } else if (historyEntry.getName().isFavorite()) { - icon.setImageDrawable(ic.getContentIcon(R.drawable.ic_type_favorites)); - } else if (historyEntry.getName().isLocation()) { - icon.setImageDrawable(ic.getContentIcon(R.drawable.ic_type_coordinates)); - } else if (historyEntry.getName().isPoi()) { - icon.setImageDrawable(ic.getContentIcon(R.drawable.ic_type_info)); - } else if (historyEntry.getName().isWpt()) { - icon.setImageDrawable(ic.getContentIcon(R.drawable.ic_type_waypoint)); - } else if (historyEntry.getName().isAudioNote()) { - icon.setImageDrawable(ic.getContentIcon(R.drawable.ic_type_audio)); - } else if (historyEntry.getName().isVideoNote()) { - icon.setImageDrawable(ic.getContentIcon(R.drawable.ic_type_video)); - }else if (historyEntry.getName().isPhotoNote()) { - icon.setImageDrawable(ic.getContentIcon(R.drawable.ic_type_img)); - } else { - icon.setImageDrawable(ic.getContentIcon(R.drawable.ic_type_address)); - } + icon.setImageDrawable(ic.getContentIcon(getItemIcon(historyEntry.getName()))); String typeName = historyEntry.getName().getTypeName(); if (typeName != null && !typeName.isEmpty()) { @@ -298,6 +279,30 @@ public class SearchHistoryFragment extends OsmAndListFragment implements SearchA } } + public static int getItemIcon(PointDescription pd) { + int iconId; + if (pd.isAddress()) { + iconId = R.drawable.ic_type_address; + } else if (pd.isFavorite()) { + iconId = R.drawable.ic_type_favorites; + } else if (pd.isLocation()) { + iconId = R.drawable.ic_type_coordinates; + } else if (pd.isPoi()) { + iconId = R.drawable.ic_type_info; + } else if (pd.isWpt()) { + iconId = R.drawable.ic_type_waypoint; + } else if (pd.isAudioNote()) { + iconId = R.drawable.ic_type_audio; + } else if (pd.isVideoNote()) { + iconId = R.drawable.ic_type_video; + }else if (pd.isPhotoNote()) { + iconId = R.drawable.ic_type_img; + } else { + iconId = R.drawable.ic_type_address; + } + return iconId; + } + @Override public void onCreateOptionsMenu(Menu onCreate, MenuInflater inflater) { if (getActivity() instanceof SearchActivity) { diff --git a/OsmAnd/src/net/osmand/plus/helpers/SearchHistoryHelper.java b/OsmAnd/src/net/osmand/plus/helpers/SearchHistoryHelper.java index ccedb506b5..ae38f7bdf7 100644 --- a/OsmAnd/src/net/osmand/plus/helpers/SearchHistoryHelper.java +++ b/OsmAnd/src/net/osmand/plus/helpers/SearchHistoryHelper.java @@ -1,13 +1,5 @@ package net.osmand.plus.helpers; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; - import net.osmand.data.LatLon; import net.osmand.data.PointDescription; import net.osmand.plus.OsmandApplication; @@ -16,6 +8,14 @@ import net.osmand.plus.api.SQLiteAPI.SQLiteConnection; import net.osmand.plus.api.SQLiteAPI.SQLiteCursor; import net.osmand.util.Algorithms; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + public class SearchHistoryHelper { private static final int HISTORY_LIMIT = 1500; @@ -51,7 +51,7 @@ public class SearchHistoryHelper { } }; - public static class HistoryEntry { + public static class HistoryEntry implements Serializable { double lat; double lon; PointDescription name; diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java index e2817c38ee..0cb2e6c9e6 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/MapContextMenu.java @@ -17,8 +17,10 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.OsmandSettings; import net.osmand.plus.R; import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.helpers.SearchHistoryHelper.HistoryEntry; import net.osmand.plus.mapcontextmenu.details.AmenityMenuController; import net.osmand.plus.mapcontextmenu.details.FavouritePointMenuController; +import net.osmand.plus.mapcontextmenu.details.HistoryMenuController; import net.osmand.plus.mapcontextmenu.details.MenuController; import net.osmand.plus.routing.RoutingHelper; import net.osmand.plus.views.ContextMenuLayer; @@ -200,6 +202,8 @@ public class MapContextMenu { menuController = new AmenityMenuController(app, mapActivity, (Amenity) object); } else if (object instanceof FavouritePoint) { menuController = new FavouritePointMenuController(app, mapActivity, (FavouritePoint) object); + } else if (object instanceof HistoryEntry) { + menuController = new HistoryMenuController(app, mapActivity, (HistoryEntry) object); } } } diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/AmenityMenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/AmenityMenuBuilder.java index bf46644f6e..69b5de9764 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/AmenityMenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/AmenityMenuBuilder.java @@ -47,7 +47,6 @@ public class AmenityMenuBuilder extends MenuBuilder { LinearLayout ll = new LinearLayout(view.getContext()); ll.setOrientation(LinearLayout.HORIZONTAL); LinearLayout.LayoutParams llParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - //llParams.setMargins(0, dpToPx(14f), 0, dpToPx(14f)); ll.setLayoutParams(llParams); // Icon @@ -118,15 +117,6 @@ public class AmenityMenuBuilder extends MenuBuilder { rowBuilt(); } - public int dpToPx(float dp) { - Resources r = app.getResources(); - return (int) TypedValue.applyDimension( - COMPLEX_UNIT_DIP, - dp, - r.getDisplayMetrics() - ); - } - @Override public void build(View view) { super.build(view); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/AmenityMenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/AmenityMenuController.java index 503a522f57..9cb1b587af 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/AmenityMenuController.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/AmenityMenuController.java @@ -1,7 +1,6 @@ package net.osmand.plus.mapcontextmenu.details; import android.os.Bundle; -import android.util.Log; import net.osmand.data.Amenity; import net.osmand.data.PointDescription; diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/FavouritePointMenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/FavouritePointMenuBuilder.java index 1ee479c4ce..81fa2b6fa1 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/FavouritePointMenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/FavouritePointMenuBuilder.java @@ -1,9 +1,7 @@ package net.osmand.plus.mapcontextmenu.details; -import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.text.util.Linkify; -import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; @@ -16,8 +14,6 @@ import net.osmand.plus.OsmandApplication; import net.osmand.plus.R; import net.osmand.util.Algorithms; -import static android.util.TypedValue.COMPLEX_UNIT_DIP; - public class FavouritePointMenuBuilder extends MenuBuilder { private final FavouritePoint fav; @@ -37,7 +33,6 @@ public class FavouritePointMenuBuilder extends MenuBuilder { LinearLayout ll = new LinearLayout(view.getContext()); ll.setOrientation(LinearLayout.HORIZONTAL); LinearLayout.LayoutParams llParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); - //llParams.setMargins(0, dpToPx(14f), 0, dpToPx(14f)); ll.setLayoutParams(llParams); // Icon @@ -95,15 +90,6 @@ public class FavouritePointMenuBuilder extends MenuBuilder { rowBuilt(); } - public int dpToPx(float dp) { - Resources r = app.getResources(); - return (int) TypedValue.applyDimension( - COMPLEX_UNIT_DIP, - dp, - r.getDisplayMetrics() - ); - } - @Override public void build(View view) { super.build(view); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/HistoryMenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/HistoryMenuBuilder.java new file mode 100644 index 0000000000..dd0bcdbc41 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/HistoryMenuBuilder.java @@ -0,0 +1,99 @@ +package net.osmand.plus.mapcontextmenu.details; + +import android.graphics.drawable.Drawable; +import android.text.util.Linkify; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.R; +import net.osmand.plus.helpers.SearchHistoryHelper.HistoryEntry; + +public class HistoryMenuBuilder extends MenuBuilder { + private final HistoryEntry entry; + + public HistoryMenuBuilder(OsmandApplication app, final HistoryEntry entry) { + super(app); + this.entry = entry; + } + + private void buildRow(View view, int iconId, String text, int textColor) { + buildRow(view, getRowIcon(iconId), text, textColor); + } + + private void buildRow(final View view, Drawable icon, String text, int textColor) { + boolean light = app.getSettings().isLightContent(); + + LinearLayout ll = new LinearLayout(view.getContext()); + ll.setOrientation(LinearLayout.HORIZONTAL); + LinearLayout.LayoutParams llParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + ll.setLayoutParams(llParams); + + // Icon + LinearLayout llIcon = new LinearLayout(view.getContext()); + llIcon.setOrientation(LinearLayout.HORIZONTAL); + llIcon.setLayoutParams(new LinearLayout.LayoutParams(dpToPx(72f), isFirstRow() ? dpToPx(48f) - dpToPx(SHADOW_HEIGHT_BOTTOM_DP) : dpToPx(48f))); + llIcon.setGravity(Gravity.CENTER_VERTICAL); + ll.addView(llIcon); + + ImageView iconView = new ImageView(view.getContext()); + LinearLayout.LayoutParams llIconParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); + llIconParams.setMargins(dpToPx(16f), isFirstRow() ? dpToPx(12f) - dpToPx(SHADOW_HEIGHT_BOTTOM_DP / 2f) : dpToPx(12f), dpToPx(32f), dpToPx(12f)); + llIconParams.gravity = Gravity.CENTER_VERTICAL; + iconView.setLayoutParams(llIconParams); + iconView.setScaleType(ImageView.ScaleType.CENTER); + iconView.setImageDrawable(icon); + llIcon.addView(iconView); + + // Text + LinearLayout llText = new LinearLayout(view.getContext()); + llText.setOrientation(LinearLayout.VERTICAL); + ll.addView(llText); + + TextView textView = new TextView(view.getContext()); + LinearLayout.LayoutParams llTextParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); + llTextParams.setMargins(0, isFirstRow() ? dpToPx(8f) - dpToPx(SHADOW_HEIGHT_BOTTOM_DP) : dpToPx(8f), 0, dpToPx(8f)); + textView.setLayoutParams(llTextParams); + textView.setTextSize(16); + textView.setTextColor(app.getResources().getColor(light ? R.color.ctx_menu_info_text_light : R.color.ctx_menu_info_text_dark)); + + textView.setAutoLinkMask(Linkify.ALL); + textView.setLinksClickable(true); + textView.setText(text); + if (textColor > 0) { + textView.setTextColor(view.getResources().getColor(textColor)); + } + + LinearLayout.LayoutParams llTextViewParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + llTextViewParams.setMargins(0, 0, dpToPx(10f), 0); + llTextViewParams.gravity = Gravity.CENTER_VERTICAL; + llText.setLayoutParams(llTextViewParams); + llText.addView(textView); + + ((LinearLayout) view).addView(ll); + + View horizontalLine = new View(view.getContext()); + LinearLayout.LayoutParams llHorLineParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dpToPx(1f)); + llHorLineParams.gravity = Gravity.BOTTOM; + horizontalLine.setLayoutParams(llHorLineParams); + + horizontalLine.setBackgroundColor(app.getResources().getColor(light ? R.color.ctx_menu_info_divider_light : R.color.ctx_menu_info_divider_dark)); + + ((LinearLayout) view).addView(horizontalLine); + + rowBuilt(); + } + + @Override + public void build(View view) { + super.build(view); + + for (PlainMenuItem item : plainMenuItems) { + buildRow(view, item.getIconId(), item.getText(), 0); + } + } +} diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/HistoryMenuController.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/HistoryMenuController.java new file mode 100644 index 0000000000..85c7306de9 --- /dev/null +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/HistoryMenuController.java @@ -0,0 +1,83 @@ +package net.osmand.plus.mapcontextmenu.details; + +import android.graphics.drawable.Drawable; +import android.os.Bundle; + +import net.osmand.data.PointDescription; +import net.osmand.plus.OsmandApplication; +import net.osmand.plus.R; +import net.osmand.plus.activities.MapActivity; +import net.osmand.plus.activities.search.SearchHistoryFragment; +import net.osmand.plus.helpers.SearchHistoryHelper.HistoryEntry; + +public class HistoryMenuController extends MenuController { + + private HistoryEntry entry; + + public HistoryMenuController(OsmandApplication app, MapActivity mapActivity, final HistoryEntry entry) { + super(new HistoryMenuBuilder(app, entry), mapActivity); + this.entry = entry; + } + + @Override + protected int getInitialMenuStatePortrait() { + return MenuState.HEADER_ONLY; + } + + @Override + protected int getSupportedMenuStatesPortrait() { + return MenuState.HEADER_ONLY | MenuState.HALF_SCREEN | MenuState.FULL_SCREEN; + } + + @Override + public boolean needTypeStr() { + String typeName = entry.getName().getTypeName(); + return (typeName != null && !typeName.isEmpty()); + } + + @Override + public Drawable getLeftIcon() { + return getIcon(SearchHistoryFragment.getItemIcon(entry.getName())); + } + + @Override + public Drawable getSecondLineIcon() { + if (needTypeStr()) { + return getIcon(R.drawable.ic_small_group); + } else { + return null; + } + } + + @Override + public String getNameStr() { + return entry.getName().getSimpleName(getMapActivity(), false); + } + + @Override + public String getTypeStr() { + if (needTypeStr()) { + return entry.getName().getTypeName(); + } else { + return ""; + } + } + + @Override + public boolean needStreetName() { + return !entry.getName().isAddress(); + } + + @Override + public void addPlainMenuItems(String typeStr, PointDescription pointDescription) { + if (pointDescription != null) { + addPlainMenuItem(R.drawable.map_my_location, PointDescription.getLocationName(getMapActivity(), + entry.getLat(), entry.getLon(), true).replaceAll("\n", "")); + } + } + + @Override + public void saveEntityState(Bundle bundle, String key) { + bundle.putSerializable(key, entry); + } +} diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/MenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/MenuBuilder.java index 025156033d..11c96a5362 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/MenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/details/MenuBuilder.java @@ -1,9 +1,11 @@ package net.osmand.plus.mapcontextmenu.details; import android.content.Context; +import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; +import android.util.TypedValue; import android.view.View; import net.osmand.plus.IconsCache; @@ -13,6 +15,8 @@ import net.osmand.plus.render.RenderingIcons; import java.util.LinkedList; +import static android.util.TypedValue.COMPLEX_UNIT_DIP; + public abstract class MenuBuilder { public class PlainMenuItem { @@ -76,4 +80,13 @@ public abstract class MenuBuilder { return null; } } + + public int dpToPx(float dp) { + Resources r = app.getResources(); + return (int) TypedValue.applyDimension( + COMPLEX_UNIT_DIP, + dp, + r.getDisplayMetrics() + ); + } }