From 5aeffe154ede8177319db4d6418a75cdeb7ae48f Mon Sep 17 00:00:00 2001 From: ivanPyrohivskyi Date: Tue, 24 Sep 2024 18:38:14 +0300 Subject: [PATCH] Refactoring and fix bugs --- .../core/android/MapRendererContext.java | 2 + .../builders/RenderedObjectMenuBuilder.java | 111 +++++++++--------- 2 files changed, 57 insertions(+), 56 deletions(-) diff --git a/OsmAnd/src/net/osmand/core/android/MapRendererContext.java b/OsmAnd/src/net/osmand/core/android/MapRendererContext.java index e8b5ad15145..94296a5f762 100644 --- a/OsmAnd/src/net/osmand/core/android/MapRendererContext.java +++ b/OsmAnd/src/net/osmand/core/android/MapRendererContext.java @@ -746,6 +746,8 @@ private RenderedObject createRenderedObjectForPolygon(MapObject mapObject, int o } object.markAsPolygon(true); object.setOrder(order); + object.setLabelX(mapObject.getLabelCoordinateX()); + object.setLabelY(mapObject.getLabelCoordinateY()); if (Algorithms.isEmpty(object.getName())) { String captionInNativeLanguage = mapObject.getCaptionInNativeLanguage(); diff --git a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/RenderedObjectMenuBuilder.java b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/RenderedObjectMenuBuilder.java index 4a51380e4ea..f1fa72eb4d3 100644 --- a/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/RenderedObjectMenuBuilder.java +++ b/OsmAnd/src/net/osmand/plus/mapcontextmenu/builders/RenderedObjectMenuBuilder.java @@ -1,5 +1,6 @@ package net.osmand.plus.mapcontextmenu.builders; +import static net.osmand.NativeLibrary.RenderedObject; import android.os.AsyncTask; import android.view.ViewGroup; @@ -7,20 +8,20 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import net.osmand.NativeLibrary; +import net.osmand.CallbackWithObject; +import net.osmand.ResultMatcher; +import net.osmand.binary.BinaryMapIndexReader; import net.osmand.data.Amenity; import net.osmand.data.QuadRect; import net.osmand.osm.MapPoiTypes; import net.osmand.osm.PoiType; import net.osmand.plus.OsmandApplication; import net.osmand.plus.activities.MapActivity; -import net.osmand.plus.poi.PoiUIFilter; import net.osmand.util.Algorithms; import net.osmand.util.MapUtils; import net.osmand.util.OsmUtils; import java.lang.ref.WeakReference; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -28,9 +29,10 @@ public class RenderedObjectMenuBuilder extends AmenityMenuBuilder { QuadRect bbox; - NativeLibrary.RenderedObject renderedObject; + RenderedObject renderedObject; + private static final int SEARCH_POI_RADIUS = 50; - public RenderedObjectMenuBuilder(@NonNull MapActivity mapActivity, @NonNull NativeLibrary.RenderedObject renderedObject) { + public RenderedObjectMenuBuilder(@NonNull MapActivity mapActivity, @NonNull RenderedObject renderedObject) { super(mapActivity, getSyntheticAmenity(mapActivity, renderedObject)); bbox = renderedObject.getBbox(); this.renderedObject = renderedObject; @@ -38,27 +40,20 @@ public RenderedObjectMenuBuilder(@NonNull MapActivity mapActivity, @NonNull Nati private void searchAmenity(ViewGroup view, Object object) { WeakReference viewGroupRef = new WeakReference<>(view); - PoiUIFilter filter = getPoiFilterForAmenity(amenity); - if (filter != null) { - execute(new SearchAmenitiesTask(filter, new SearchAmenityForRenderedObjectListener() { - @Override - public void onFinish(Amenity am) { - ViewGroup viewGroup = viewGroupRef.get(); - if (viewGroup == null) { - return; - } - if (am != null) { - amenity = am; - amenity.setX(renderedObject.getX()); - amenity.setY(renderedObject.getY()); - additionalInfo = amenity.getAmenityExtensions(app.getPoiTypes(), false); - } - rebuild(viewGroup, object); - } - })); - } else { - rebuild(view, object); - } + execute(new SearchAmenitiesTask(app, renderedObject, am -> { + ViewGroup viewGroup = viewGroupRef.get(); + if (viewGroup == null) { + return false; + } + if (am != null) { + amenity = am; + amenity.setX(renderedObject.getX()); + amenity.setY(renderedObject.getY()); + additionalInfo = amenity.getAmenityExtensions(app.getPoiTypes(), false); + } + RenderedObjectMenuBuilder.this.rebuild(viewGroup, object); + return true; + })); } @Override @@ -70,7 +65,7 @@ private void rebuild(@NonNull ViewGroup view, @Nullable Object object) { super.build(view, object); } - private static Amenity getSyntheticAmenity(@NonNull MapActivity mapActivity, @NonNull NativeLibrary.RenderedObject renderedObject) { + private static Amenity getSyntheticAmenity(@NonNull MapActivity mapActivity, @NonNull RenderedObject renderedObject) { Amenity am = new Amenity(); OsmandApplication app = mapActivity.getMyApplication(); MapPoiTypes mapPoiTypes = app.getPoiTypes(); @@ -98,11 +93,12 @@ private static Amenity getSyntheticAmenity(@NonNull MapActivity mapActivity, @No } pt = mapPoiTypes.getPoiTypeByKey(value); } else { - pt = mapPoiTypes.getPoiTypeByKey(e.getKey() + "_" + e.getValue()); - } - if (pt != null) { - subtype = value; - continue; + PoiType poiType = mapPoiTypes.getPoiTypeByKey(e.getKey() + "_" + e.getValue()); + if (poiType != null) { + otherPt = pt != null ? poiType : otherPt; + subtype = pt == null ? value : subtype; + pt = pt == null ? poiType : pt; + } } if (Algorithms.isEmpty(value) && otherPt == null) { otherPt = mapPoiTypes.getPoiTypeByKey(tag); @@ -139,46 +135,49 @@ private static Amenity getSyntheticAmenity(@NonNull MapActivity mapActivity, @No return am; } - private class SearchAmenitiesTask extends AsyncTask { + private static class SearchAmenitiesTask extends AsyncTask { - private final PoiUIFilter filter; - private final SearchAmenityForRenderedObjectListener listener; + private final CallbackWithObject listener; private final QuadRect rect; private final long osmId; + private final OsmandApplication app; - private SearchAmenitiesTask(PoiUIFilter filter, SearchAmenityForRenderedObjectListener listener) { - this.filter = filter; + private SearchAmenitiesTask(OsmandApplication application, RenderedObject renderedObject, CallbackWithObject listener) { this.listener = listener; - double l = MapUtils.get31LongitudeX((int)bbox.left); - double r = MapUtils.get31LongitudeX((int)bbox.right); - double t = MapUtils.get31LatitudeY((int)bbox.top); - double b = MapUtils.get31LatitudeY((int)bbox.bottom); - rect = new QuadRect(l, t, r, b); + double lat = MapUtils.get31LatitudeY(renderedObject.getLabelY()); + double lon = MapUtils.get31LongitudeX(renderedObject.getLabelX()); + rect = MapUtils.calculateLatLonBbox(lat, lon, SEARCH_POI_RADIUS); osmId = OsmUtils.getOsmObjectId(renderedObject); + app = application; } @Override protected Amenity doInBackground(Void... params) { - List amenities = Collections.emptyList(); - amenities = filter.searchAmenities(rect.top, rect.left, rect.bottom, rect.right, -1, null); - for (Amenity am : amenities) { - long id = OsmUtils.getOsmObjectId(am); - if (id == osmId) { - return am; - } + List amenities = app.getResourceManager().searchAmenities( + BinaryMapIndexReader.ACCEPT_ALL_POI_TYPE_FILTER, + rect.top, rect.left, rect.bottom, rect.right, + -1, true, + new ResultMatcher<>() { + @Override + public boolean publish(Amenity amenity) { + long id = OsmUtils.getOsmObjectId(amenity); + return id == osmId; + } + + @Override + public boolean isCancelled() { + return false; + } + }); + if (amenities.size() > 0) { + return amenities.get(0); } return null; } @Override protected void onPostExecute(Amenity amenity) { - if (listener != null) { - listener.onFinish(amenity); - } + listener.processResult(amenity); } } - - private interface SearchAmenityForRenderedObjectListener { - void onFinish(Amenity amenity); - } }