From fb61cad9a4f50290191a1435601487d32e937017 Mon Sep 17 00:00:00 2001 From: Alexey Kulish Date: Tue, 18 Oct 2016 13:53:43 +0300 Subject: [PATCH] Fix #3138 --- .../src/net/osmand/data/PointDescription.java | 34 ++++- .../plus/search/QuickSearchListFragment.java | 8 +- .../plus/search/QuickSearchListItem.java | 126 +++++++++++------- 3 files changed, 112 insertions(+), 56 deletions(-) diff --git a/OsmAnd/src/net/osmand/data/PointDescription.java b/OsmAnd/src/net/osmand/data/PointDescription.java index 49dc0d365a..f45bc50c20 100644 --- a/OsmAnd/src/net/osmand/data/PointDescription.java +++ b/OsmAnd/src/net/osmand/data/PointDescription.java @@ -7,6 +7,7 @@ import net.osmand.plus.R; import net.osmand.util.Algorithms; import android.content.Context; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import com.jwetherell.openmap.common.LatLonPoint; import com.jwetherell.openmap.common.UTMPoint; @@ -15,6 +16,7 @@ public class PointDescription { private String type = ""; private String name = ""; private String typeName; + private String iconName; private double lat = 0; private double lon = 0; @@ -91,6 +93,15 @@ public class PointDescription { return typeName; } + @Nullable + public String getIconName() { + return iconName; + } + + public void setIconName(String iconName) { + this.iconName = iconName; + } + @NonNull public String getName() { return name; @@ -281,7 +292,11 @@ public class PointDescription { if(!Algorithms.isEmpty(p.typeName)) { tp = tp +'.' + p.typeName; } - return tp + "#" + p.name; + String res = tp + "#" + p.name; + if (!Algorithms.isEmpty(p.iconName)) { + res += "#" + p.iconName; + } + return res; } public static PointDescription deserializeFromString(String s, LatLon l) { @@ -289,12 +304,23 @@ public class PointDescription { if (s != null && s.length() > 0) { int in = s.indexOf('#'); if (in >= 0) { - String nm = s.substring(in + 1).trim(); + int ii = s.indexOf('#', in + 1); + String name; + String icon = null; + if (ii > 0) { + name = s.substring(in + 1, ii).trim(); + icon = s.substring(ii + 1).trim(); + } else { + name = s.substring(in + 1).trim(); + } String tp = s.substring(0, in); if(tp.contains(".")) { - pd = new PointDescription(tp.substring(0, tp.indexOf('.')), tp.substring(tp.indexOf('.') + 1), nm); + pd = new PointDescription(tp.substring(0, tp.indexOf('.')), tp.substring(tp.indexOf('.') + 1), name); } else { - pd = new PointDescription(tp, nm); + pd = new PointDescription(tp, name); + } + if (!Algorithms.isEmpty(icon)) { + pd.setIconName(icon); } } } diff --git a/OsmAnd/src/net/osmand/plus/search/QuickSearchListFragment.java b/OsmAnd/src/net/osmand/plus/search/QuickSearchListFragment.java index b9ef65d255..48e6832801 100644 --- a/OsmAnd/src/net/osmand/plus/search/QuickSearchListFragment.java +++ b/OsmAnd/src/net/osmand/plus/search/QuickSearchListFragment.java @@ -166,8 +166,10 @@ public abstract class QuickSearchListFragment extends OsmAndListFragment { Object object = searchResult.object; switch (searchResult.objectType) { case POI: - String poiSimpleFormat = OsmAndFormatter.getPoiStringWithoutType((Amenity) object, lang, transliterate); + Amenity a = (Amenity) object; + String poiSimpleFormat = OsmAndFormatter.getPoiStringWithoutType(a, lang, transliterate); pointDescription = new PointDescription(PointDescription.POINT_TYPE_POI, poiSimpleFormat); + pointDescription.setIconName(QuickSearchListItem.getAmenityIconName(a)); break; case RECENT_OBJ: HistoryEntry entry = (HistoryEntry) object; @@ -178,6 +180,7 @@ public abstract class QuickSearchListFragment extends OsmAndListFragment { object = amenity; pointDescription = new PointDescription(PointDescription.POINT_TYPE_POI, OsmAndFormatter.getPoiStringWithoutType(amenity, lang, transliterate)); + pointDescription.setIconName(QuickSearchListItem.getAmenityIconName(amenity)); } } else if (pointDescription.isFavorite()) { LatLon entryLatLon = new LatLon(entry.getLat(), entry.getLon()); @@ -209,10 +212,12 @@ public abstract class QuickSearchListFragment extends OsmAndListFragment { name = searchResult.localeRelatedObjectName + " " + name; } pointDescription = new PointDescription(PointDescription.POINT_TYPE_ADDRESS, typeNameHouse, name); + pointDescription.setIconName("ic_action_building"); break; case LOCATION: LatLon latLon = (LatLon) object; pointDescription = new PointDescription(latLon.getLatitude(), latLon.getLongitude()); + pointDescription.setIconName("ic_action_world_globe"); break; case STREET_INTERSECTION: String typeNameIntersection = QuickSearchListItem.getTypeName(app, searchResult); @@ -221,6 +226,7 @@ public abstract class QuickSearchListFragment extends OsmAndListFragment { } pointDescription = new PointDescription(PointDescription.POINT_TYPE_ADDRESS, typeNameIntersection, QuickSearchListItem.getName(app, searchResult)); + pointDescription.setIconName("ic_action_intersection"); break; case WPT: GPXUtilities.WptPt wpt = (GPXUtilities.WptPt) object; diff --git a/OsmAnd/src/net/osmand/plus/search/QuickSearchListItem.java b/OsmAnd/src/net/osmand/plus/search/QuickSearchListItem.java index 70e20105de..77f3b925b5 100644 --- a/OsmAnd/src/net/osmand/plus/search/QuickSearchListItem.java +++ b/OsmAnd/src/net/osmand/plus/search/QuickSearchListItem.java @@ -2,6 +2,7 @@ package net.osmand.plus.search; import android.content.Context; import android.graphics.drawable.Drawable; + import net.osmand.binary.BinaryMapIndexReader; import net.osmand.data.Amenity; import net.osmand.data.City; @@ -155,30 +156,30 @@ public class QuickSearchListItem { } return ""; case POI_TYPE: - String res= ""; - if (searchResult.object instanceof AbstractPoiType) { - AbstractPoiType abstractPoiType = (AbstractPoiType) searchResult.object; - if (abstractPoiType instanceof PoiCategory) { - res = ""; - } else if (abstractPoiType instanceof PoiFilter) { - PoiFilter poiFilter = (PoiFilter) abstractPoiType; - res = poiFilter.getPoiCategory() != null ? poiFilter.getPoiCategory().getTranslation() : ""; + String res = ""; + if (searchResult.object instanceof AbstractPoiType) { + AbstractPoiType abstractPoiType = (AbstractPoiType) searchResult.object; + if (abstractPoiType instanceof PoiCategory) { + res = ""; + } else if (abstractPoiType instanceof PoiFilter) { + PoiFilter poiFilter = (PoiFilter) abstractPoiType; + res = poiFilter.getPoiCategory() != null ? poiFilter.getPoiCategory().getTranslation() : ""; - } else if (abstractPoiType instanceof PoiType) { - PoiType poiType = (PoiType) abstractPoiType; - res = poiType.getParentType() != null ? poiType.getParentType().getTranslation() : null; - if (res == null) { - res = poiType.getCategory() != null ? poiType.getCategory().getTranslation() : null; - } - if (res == null) { + } else if (abstractPoiType instanceof PoiType) { + PoiType poiType = (PoiType) abstractPoiType; + res = poiType.getParentType() != null ? poiType.getParentType().getTranslation() : null; + if (res == null) { + res = poiType.getCategory() != null ? poiType.getCategory().getTranslation() : null; + } + if (res == null) { + res = ""; + } + } else { res = ""; } - } else { - res = ""; + } else if (searchResult.object instanceof CustomSearchPoiFilter) { + res = ((CustomSearchPoiFilter) searchResult.object).getName(); } - } else if (searchResult.object instanceof CustomSearchPoiFilter) { - res = ((CustomSearchPoiFilter) searchResult.object).getName(); - } return res; case POI: Amenity amenity = (Amenity) searchResult.object; @@ -257,17 +258,41 @@ public class QuickSearchListItem { return getIcon(app, searchResult); } + public static String getPoiTypeIconName(AbstractPoiType abstractPoiType) { + if (RenderingIcons.containsBigIcon(abstractPoiType.getIconKeyName())) { + return abstractPoiType.getIconKeyName(); + } else if (abstractPoiType instanceof PoiType + && RenderingIcons.containsBigIcon( + ((PoiType) abstractPoiType).getOsmTag() + "_" + ((PoiType) abstractPoiType).getOsmValue())) { + return ((PoiType) abstractPoiType).getOsmTag() + "_" + ((PoiType) abstractPoiType).getOsmValue(); + } + return null; + } + + public static String getAmenityIconName(Amenity amenity) { + PoiType st = amenity.getType().getPoiTypeByKeyName(amenity.getSubType()); + if (st != null) { + if (RenderingIcons.containsBigIcon(st.getIconKeyName())) { + return st.getIconKeyName(); + } else if (RenderingIcons.containsBigIcon(st.getOsmTag() + "_" + st.getOsmValue())) { + return st.getOsmTag() + "_" + st.getOsmValue(); + } + } + return null; + } + public static Drawable getIcon(OsmandApplication app, SearchResult searchResult) { if (searchResult == null || searchResult.objectType == null) { return null; } - + + int iconId = -1; switch (searchResult.objectType) { case CITY: return app.getIconsCache().getIcon(R.drawable.ic_action_building_number, app.getSettings().isLightContent() ? R.color.osmand_orange : R.color.osmand_orange_dark); case VILLAGE: - return app.getIconsCache().getIcon(R.drawable. ic_action_home_dark, + return app.getIconsCache().getIcon(R.drawable.ic_action_home_dark, app.getSettings().isLightContent() ? R.color.osmand_orange : R.color.osmand_orange_dark); case POSTCODE: case STREET: @@ -280,25 +305,19 @@ public class QuickSearchListItem { return app.getIconsCache().getIcon(R.drawable.ic_action_intersection, app.getSettings().isLightContent() ? R.color.osmand_orange : R.color.osmand_orange_dark); case POI_TYPE: - int iconId = -1; - if (searchResult.object instanceof AbstractPoiType) { - AbstractPoiType abstractPoiType = (AbstractPoiType) searchResult.object; - if (RenderingIcons.containsBigIcon(abstractPoiType.getIconKeyName())) { - iconId = RenderingIcons.getBigIconResourceId(abstractPoiType.getIconKeyName()); - } else if (abstractPoiType instanceof PoiType - && RenderingIcons.containsBigIcon(((PoiType) abstractPoiType).getOsmTag() + "_" - + ((PoiType) abstractPoiType).getOsmValue())) { - iconId = RenderingIcons.getBigIconResourceId(((PoiType) abstractPoiType).getOsmTag() + "_" - + ((PoiType) abstractPoiType).getOsmValue()); + if (searchResult.object instanceof AbstractPoiType) { + String iconName = getPoiTypeIconName((AbstractPoiType) searchResult.object); + if (!Algorithms.isEmpty(iconName)) { + iconId = RenderingIcons.getBigIconResourceId(iconName); + } + } else if (searchResult.object instanceof CustomSearchPoiFilter) { + Object res = ((CustomSearchPoiFilter) searchResult.object).getIconResource(); + if (res instanceof String && RenderingIcons.containsBigIcon(res.toString())) { + iconId = RenderingIcons.getBigIconResourceId(res.toString()); + } else { + iconId = R.drawable.mx_user_defined; + } } - } else if (searchResult.object instanceof CustomSearchPoiFilter) { - Object res = ((CustomSearchPoiFilter) searchResult.object).getIconResource(); - if (res instanceof String && RenderingIcons.containsBigIcon(res.toString())) { - iconId = RenderingIcons.getBigIconResourceId(res.toString()); - } else { - iconId = R.drawable.mx_user_defined; - } - } if (iconId != -1) { return app.getIconsCache().getIcon(iconId, app.getSettings().isLightContent() ? R.color.osmand_orange : R.color.osmand_orange_dark); @@ -307,15 +326,7 @@ public class QuickSearchListItem { } case POI: Amenity amenity = (Amenity) searchResult.object; - String id = null; - PoiType st = amenity.getType().getPoiTypeByKeyName(amenity.getSubType()); - if (st != null) { - if (RenderingIcons.containsBigIcon(st.getIconKeyName())) { - id = st.getIconKeyName(); - } else if (RenderingIcons.containsBigIcon(st.getOsmTag() + "_" + st.getOsmValue())) { - id = st.getOsmTag() + "_" + st.getOsmValue(); - } - } + String id = getAmenityIconName(amenity); if (id != null) { iconId = RenderingIcons.getBigIconResourceId(id); return app.getIconsCache().getIcon(iconId, @@ -334,8 +345,21 @@ public class QuickSearchListItem { app.getSettings().isLightContent() ? R.color.osmand_orange : R.color.osmand_orange_dark); case RECENT_OBJ: HistoryEntry entry = (HistoryEntry) searchResult.object; - return app.getIconsCache().getIcon(SearchHistoryFragment.getItemIcon(entry.getName()), - app.getSettings().isLightContent() ? R.color.osmand_orange : R.color.osmand_orange_dark); + if (entry.getName() != null && !Algorithms.isEmpty(entry.getName().getIconName())) { + String iconName = entry.getName().getIconName(); + if (RenderingIcons.containsBigIcon(iconName)) { + iconId = RenderingIcons.getBigIconResourceId(iconName); + } else { + iconId = app.getResources().getIdentifier(iconName, "drawable", app.getPackageName()); + } + } + if (iconId == -1) { + return app.getIconsCache().getIcon(SearchHistoryFragment.getItemIcon(entry.getName()), + app.getSettings().isLightContent() ? R.color.osmand_orange : R.color.osmand_orange_dark); + } else { + return app.getIconsCache().getIcon(iconId, + app.getSettings().isLightContent() ? R.color.osmand_orange : R.color.osmand_orange_dark); + } case WPT: WptPt wpt = (WptPt) searchResult.object; return FavoriteImageDrawable.getOrCreate(app, wpt.getColor(), false);