diff --git a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/BuildingSearchListItem.java b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/BuildingSearchListItem.java new file mode 100644 index 0000000000..148c6ecaee --- /dev/null +++ b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/BuildingSearchListItem.java @@ -0,0 +1,43 @@ +package net.osmand.core.samples.android.sample1.adapters; + +import net.osmand.core.jni.Building; +import net.osmand.core.jni.Street; +import net.osmand.core.jni.StreetGroup; +import net.osmand.core.samples.android.sample1.MapUtils; +import net.osmand.core.samples.android.sample1.SampleApplication; +import net.osmand.core.samples.android.sample1.search.objects.BuildingSearchObject; + +public class BuildingSearchListItem extends SearchListPositionItem { + private String nameStr; + private String typeStr; + + public BuildingSearchListItem(SampleApplication app, BuildingSearchObject searchObject) { + super(app, searchObject); + + nameStr = searchObject.getName(MapUtils.LANGUAGE); + + Building building = searchObject.getBuilding(); + + Street street = building.getStreet(); + if (street != null) { + StreetGroup streetGroup = street.getStreetGroup(); + if (streetGroup != null) { + typeStr = streetGroup.getNativeName() + ", " + street.getNativeName(); + } else { + typeStr = street.getNativeName(); + } + } else { + typeStr = "Building"; + } + } + + @Override + public String getName() { + return nameStr; + } + + @Override + public String getTypeName() { + return typeStr; + } +} \ No newline at end of file diff --git a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/CitySearchListItem.java b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/CitySearchListItem.java index b87cc09685..edbd00e849 100644 --- a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/CitySearchListItem.java +++ b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/CitySearchListItem.java @@ -9,10 +9,10 @@ public class CitySearchListItem extends SearchListPositionItem{ private String nameStr; private String typeStr; - public CitySearchListItem(SampleApplication app, CitySearchObject searchItem) { - super(app, searchItem); + public CitySearchListItem(SampleApplication app, CitySearchObject searchObject) { + super(app, searchObject); - nameStr = searchItem.getName(MapUtils.LANGUAGE); + nameStr = searchObject.getName(MapUtils.LANGUAGE); typeStr = "City"; } diff --git a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/PoiSearchListItem.java b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/PoiSearchListItem.java index 5b4da14450..e596bfaa72 100644 --- a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/PoiSearchListItem.java +++ b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/PoiSearchListItem.java @@ -26,9 +26,9 @@ public class PoiSearchListItem extends SearchListPositionItem { private String nameStr; private String typeStr; - public PoiSearchListItem(SampleApplication app, PoiSearchObject searchItem) { - super(app, searchItem); - amenity = parseAmenity(searchItem); + public PoiSearchListItem(SampleApplication app, PoiSearchObject searchObject) { + super(app, searchObject); + amenity = parseAmenity(searchObject); nameStr = amenity.getName(MapUtils.LANGUAGE); typeStr = getTypeStr(); } diff --git a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/PostcodeSearchListItem.java b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/PostcodeSearchListItem.java index dc94d8957b..973e508d41 100644 --- a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/PostcodeSearchListItem.java +++ b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/PostcodeSearchListItem.java @@ -10,10 +10,10 @@ public class PostcodeSearchListItem extends SearchListPositionItem { private String nameStr; private String typeStr; - public PostcodeSearchListItem(SampleApplication app, PostcodeSearchObject searchItem) { - super(app, searchItem); + public PostcodeSearchListItem(SampleApplication app, PostcodeSearchObject searchObject) { + super(app, searchObject); - nameStr = searchItem.getNativeName(); + nameStr = searchObject.getNativeName(); typeStr = "Postcode"; } diff --git a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/SearchListItem.java b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/SearchListItem.java index 4104bab64d..9a0b3132ac 100644 --- a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/SearchListItem.java +++ b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/SearchListItem.java @@ -3,10 +3,12 @@ package net.osmand.core.samples.android.sample1.adapters; import android.graphics.drawable.Drawable; import net.osmand.core.samples.android.sample1.SampleApplication; +import net.osmand.core.samples.android.sample1.search.objects.BuildingSearchObject; import net.osmand.core.samples.android.sample1.search.objects.CitySearchObject; import net.osmand.core.samples.android.sample1.search.objects.PoiSearchObject; import net.osmand.core.samples.android.sample1.search.objects.PostcodeSearchObject; import net.osmand.core.samples.android.sample1.search.objects.SearchObject; +import net.osmand.core.samples.android.sample1.search.objects.StreetIntersectionSearchObject; import net.osmand.core.samples.android.sample1.search.objects.StreetSearchObject; import net.osmand.core.samples.android.sample1.search.objects.VillageSearchObject; @@ -20,18 +22,22 @@ public class SearchListItem { this.searchObject = searchObject; } - public static SearchListItem buildListItem(SampleApplication app, SearchObject item) { - switch (item.getType()) { + public static SearchListItem buildListItem(SampleApplication app, SearchObject searchObject) { + switch (searchObject.getType()) { case POI: - return new PoiSearchListItem(app, (PoiSearchObject) item); + return new PoiSearchListItem(app, (PoiSearchObject) searchObject); + case BUILDING: + return new BuildingSearchListItem(app, (BuildingSearchObject) searchObject); + case STREET_INTERSECTION: + return new StreetIntersectionSearchListItem(app, (StreetIntersectionSearchObject) searchObject); case STREET: - return new StreetSearchListItem(app, (StreetSearchObject) item); + return new StreetSearchListItem(app, (StreetSearchObject) searchObject); case CITY: - return new CitySearchListItem(app, (CitySearchObject) item); + return new CitySearchListItem(app, (CitySearchObject) searchObject); case VILLAGE: - return new VillageSearchListItem(app, (VillageSearchObject) item); + return new VillageSearchListItem(app, (VillageSearchObject) searchObject); case POSTCODE: - return new PostcodeSearchListItem(app, (PostcodeSearchObject) item); + return new PostcodeSearchListItem(app, (PostcodeSearchObject) searchObject); } return null; } diff --git a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/StreetIntersectionSearchListItem.java b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/StreetIntersectionSearchListItem.java new file mode 100644 index 0000000000..2ab6cbb85e --- /dev/null +++ b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/StreetIntersectionSearchListItem.java @@ -0,0 +1,43 @@ +package net.osmand.core.samples.android.sample1.adapters; + +import net.osmand.core.jni.Street; +import net.osmand.core.jni.StreetGroup; +import net.osmand.core.jni.StreetIntersection; +import net.osmand.core.samples.android.sample1.MapUtils; +import net.osmand.core.samples.android.sample1.SampleApplication; +import net.osmand.core.samples.android.sample1.search.objects.StreetIntersectionSearchObject; + +public class StreetIntersectionSearchListItem extends SearchListPositionItem { + private String nameStr; + private String typeStr; + + public StreetIntersectionSearchListItem(SampleApplication app, StreetIntersectionSearchObject searchObject) { + super(app, searchObject); + + nameStr = searchObject.getName(MapUtils.LANGUAGE); + + StreetIntersection streetIntersection = searchObject.getStreetIntersection(); + + Street street = streetIntersection.getStreet(); + if (street != null) { + StreetGroup streetGroup = street.getStreetGroup(); + if (streetGroup != null) { + typeStr = streetGroup.getNativeName() + ", " + street.getNativeName(); + } else { + typeStr = street.getNativeName(); + } + } else { + typeStr = "Street intersection"; + } + } + + @Override + public String getName() { + return nameStr; + } + + @Override + public String getTypeName() { + return typeStr; + } +} \ No newline at end of file diff --git a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/StreetSearchListItem.java b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/StreetSearchListItem.java index 59dacf4d24..cec23a1900 100644 --- a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/StreetSearchListItem.java +++ b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/StreetSearchListItem.java @@ -10,12 +10,12 @@ public class StreetSearchListItem extends SearchListPositionItem { private String nameStr; private String typeStr; - public StreetSearchListItem(SampleApplication app, StreetSearchObject searchItem) { - super(app, searchItem); + public StreetSearchListItem(SampleApplication app, StreetSearchObject searchObject) { + super(app, searchObject); - nameStr = searchItem.getName(MapUtils.LANGUAGE); + nameStr = searchObject.getName(MapUtils.LANGUAGE); - StreetGroup streetGroup = searchItem.getStreet().getStreetGroup(); + StreetGroup streetGroup = searchObject.getStreet().getStreetGroup(); if (streetGroup != null) { typeStr = streetGroup.getNativeName() + " — " + getTypeStr(streetGroup); } else { @@ -26,17 +26,9 @@ public class StreetSearchListItem extends SearchListPositionItem { private String getTypeStr(StreetGroup streetGroup) { String typeStr; if (streetGroup.getSubtype() != ObfAddressStreetGroupSubtype.Unknown) { - try { - typeStr = streetGroup.getSubtype().name(); - } catch (IllegalArgumentException e) { - typeStr = "Out of subtype"; - } + typeStr = streetGroup.getSubtype().name(); } else { - try { - typeStr = streetGroup.getType().name(); - } catch (IllegalArgumentException e) { - typeStr = "Out of type"; - } + typeStr = streetGroup.getType().name(); } return typeStr; } diff --git a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/VillageSearchListItem.java b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/VillageSearchListItem.java index f374ca2817..a71dbb9891 100644 --- a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/VillageSearchListItem.java +++ b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/adapters/VillageSearchListItem.java @@ -10,10 +10,10 @@ public class VillageSearchListItem extends SearchListPositionItem{ private String nameStr; private String typeStr; - public VillageSearchListItem(SampleApplication app, VillageSearchObject searchItem) { - super(app, searchItem); + public VillageSearchListItem(SampleApplication app, VillageSearchObject searchObject) { + super(app, searchObject); - nameStr = searchItem.getName(MapUtils.LANGUAGE); + nameStr = searchObject.getName(MapUtils.LANGUAGE); typeStr = "Village"; } diff --git a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/SearchScope.java b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/SearchScope.java index 34cf675022..2e31d91232 100644 --- a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/SearchScope.java +++ b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/SearchScope.java @@ -11,6 +11,7 @@ import net.osmand.core.jni.Street; import net.osmand.core.jni.StreetGroup; import net.osmand.core.jni.Utilities; import net.osmand.core.samples.android.sample1.search.objects.PoiSearchObject; +import net.osmand.core.samples.android.sample1.search.objects.PostcodeSearchObject; import net.osmand.core.samples.android.sample1.search.objects.SearchObject; import net.osmand.core.samples.android.sample1.search.objects.SearchObject.SearchObjectType; import net.osmand.core.samples.android.sample1.search.objects.SearchPositionObject; @@ -96,7 +97,25 @@ public class SearchScope { } public void setupAddressSearchCriteria(AddressesByNameSearch.Criteria criteria) { - // not implemented + if (objectTokens.containsKey(SearchObjectType.STREET)) { + StreetSearchObject streetSearchObject = + (StreetSearchObject) objectTokens.get(SearchObjectType.STREET).getSearchObject(); + criteria.setAddressFilter(streetSearchObject.getStreet()); + if (objectTokens.containsKey(SearchObjectType.POSTCODE)) { + PostcodeSearchObject postcodeSearchObject = + (PostcodeSearchObject) objectTokens.get(SearchObjectType.POSTCODE).getSearchObject(); + criteria.setPostcode(postcodeSearchObject.getNativeName()); + } + } else if (objectTokens.containsKey(SearchObjectType.CITY)) { + criteria.setAddressFilter(((StreetGroupSearchObject) objectTokens.get(SearchObjectType.CITY) + .getSearchObject()).getStreetGroup()); + } else if (objectTokens.containsKey(SearchObjectType.VILLAGE)) { + criteria.setAddressFilter(((StreetGroupSearchObject) objectTokens.get(SearchObjectType.VILLAGE) + .getSearchObject()).getStreetGroup()); + } else if (objectTokens.containsKey(SearchObjectType.POSTCODE)) { + criteria.setAddressFilter(((StreetGroupSearchObject) objectTokens.get(SearchObjectType.POSTCODE) + .getSearchObject()).getStreetGroup()); + } } public boolean processPoiSearchObject(PoiSearchObject poiSearchObject) { @@ -117,7 +136,7 @@ public class SearchScope { @Override public int compare(SearchObject lhs, SearchObject rhs) { int res = Double.compare(lhs.getPriority(), rhs.getPriority()); - if (res == 0 && lhs.isSortByName() && rhs.isSortByName()) { + if (res == 0) { return lhs.getName(lang).compareToIgnoreCase(rhs.getName(lang)); } else { return res; @@ -170,25 +189,27 @@ public class SearchScope { } private boolean processSearchObject(SearchObject searchObject) { - double priority = 0d; - boolean sortByName = false; + double priority = 0.0; switch (searchObject.getType()) { + case BUILDING: + priority = 3.0; + break; case POI: - priority = getPriorityByDistance(10, ((PoiSearchObject) searchObject).getDistance()); + priority = getPriorityByDistance(10.0, ((PoiSearchObject) searchObject).getDistance()); break; case CITY: case VILLAGE: case POSTCODE: - float cityType = getCityType((StreetGroupSearchObject) searchObject); + double cityType = getCityType((StreetGroupSearchObject) searchObject); priority = (getPriorityByDistance(citySelected - ? 20f : 7f + cityType, ((StreetGroupSearchObject) searchObject).getDistance())); + ? 20.0 : 7.0 + cityType, ((StreetGroupSearchObject) searchObject).getDistance())); break; case STREET: StreetSearchObject streetSearchObject = (StreetSearchObject) searchObject; Street street = streetSearchObject.getStreet(); if (!citySelected) { - priority = getPriorityByDistance(9f, streetSearchObject.getDistance()); + priority = getPriorityByDistance(9.0, streetSearchObject.getDistance()); } else { boolean streetFromSelectedCity = false; for (SearchToken st : objectTokens.values()) { @@ -209,33 +230,31 @@ public class SearchScope { } } if (streetFromSelectedCity) { - priority = 3f; - sortByName = true; + priority = 3.0; } else { - priority = getPriorityByDistance(9f, streetSearchObject.getDistance()); + priority = getPriorityByDistance(9.0, streetSearchObject.getDistance()); } } break; } searchObject.setPriority(priority); - searchObject.setSortByName(sortByName); return true; } - private float getCityType(StreetGroupSearchObject searchObject) { + private double getCityType(StreetGroupSearchObject searchObject) { if (searchObject.getStreetGroup().getType() == ObfAddressStreetGroupType.CityOrTown) { if (searchObject.getStreetGroup().getSubtype() == ObfAddressStreetGroupSubtype.City) { - return 1f; + return 1.0; } else if (searchObject.getStreetGroup().getSubtype() == ObfAddressStreetGroupSubtype.Town) { - return 1.5f; + return 1.5; } } - return 2.5f; + return 2.5; } private double getPriorityByDistance(double priority, double distance) { - return priority + 1d - (1d / (1d + distance)); + return priority + 1.0 - (1.0 / (1.0 + distance)); } private void updateDistance(SearchPositionObject item) { diff --git a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/objects/BuildingSearchObject.java b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/objects/BuildingSearchObject.java new file mode 100644 index 0000000000..153bee68d8 --- /dev/null +++ b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/objects/BuildingSearchObject.java @@ -0,0 +1,31 @@ +package net.osmand.core.samples.android.sample1.search.objects; + +import net.osmand.core.jni.Building; +import net.osmand.core.jni.PointI; +import net.osmand.core.jni.QStringStringHash; + +public class BuildingSearchObject extends SearchPositionObject { + + public BuildingSearchObject(Building building) { + super(SearchObjectType.BUILDING, building); + } + + public Building getBuilding() { + return (Building) getInternalObject(); + } + + @Override + public PointI getPosition31() { + return getBuilding().getPosition31(); + } + + @Override + public String getNativeName() { + return getBuilding().getNativeName(); + } + + @Override + protected QStringStringHash getLocalizedNames() { + return getBuilding().getLocalizedNames(); + } +} diff --git a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/objects/SearchObject.java b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/objects/SearchObject.java index dc250cf382..9eb7f76715 100644 --- a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/objects/SearchObject.java +++ b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/objects/SearchObject.java @@ -9,6 +9,7 @@ public abstract class SearchObject { VILLAGE, POSTCODE, STREET, + STREET_INTERSECTION, BUILDING, POI_TYPE, POI_FILTER, @@ -20,7 +21,6 @@ public abstract class SearchObject { private Object internalObject; private double priority; - private boolean sortByName; protected SearchObject(SearchObjectType type, Object internalObject) { this.type = type; @@ -67,14 +67,6 @@ public abstract class SearchObject { this.priority = priority; } - public boolean isSortByName() { - return sortByName; - } - - public void setSortByName(boolean sortByName) { - this.sortByName = sortByName; - } - protected abstract QStringStringHash getLocalizedNames(); @Override diff --git a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/objects/SearchObjectsHelper.java b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/objects/SearchObjectsHelper.java index 849f1881b4..3016aedb82 100644 --- a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/objects/SearchObjectsHelper.java +++ b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/objects/SearchObjectsHelper.java @@ -1,16 +1,25 @@ package net.osmand.core.samples.android.sample1.search.objects; import net.osmand.core.jni.Address; +import net.osmand.core.jni.Building; import net.osmand.core.jni.OsmAndCoreJNI; import net.osmand.core.jni.Street; import net.osmand.core.jni.StreetGroup; +import net.osmand.core.jni.StreetIntersection; public class SearchObjectsHelper { public static SearchPositionObject getAddressObject(Address address) { switch (address.getAddressType()) { - //todo add Building type to Address class + case Building: + BuildingInternal building = new BuildingInternal(address); + return new BuildingSearchObject(building); + + case StreetIntersection: + StreetIntercestionInternal streetIntersection = new StreetIntercestionInternal(address); + return new StreetIntersectionSearchObject(streetIntersection); + case Street: StreetInternal street = new StreetInternal(address); return new StreetSearchObject(street); @@ -30,6 +39,18 @@ public class SearchObjectsHelper { return null; } + private static class BuildingInternal extends Building { + public BuildingInternal(Address address) { + super(OsmAndCoreJNI.Street_SWIGSmartPtrUpcast(Address.getCPtr(address)), false); + } + } + + private static class StreetIntercestionInternal extends StreetIntersection { + public StreetIntercestionInternal(Address address) { + super(OsmAndCoreJNI.Street_SWIGSmartPtrUpcast(Address.getCPtr(address)), false); + } + } + private static class StreetInternal extends Street { public StreetInternal(Address address) { super(OsmAndCoreJNI.Street_SWIGSmartPtrUpcast(Address.getCPtr(address)), false); diff --git a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/objects/StreetIntersectionSearchObject.java b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/objects/StreetIntersectionSearchObject.java new file mode 100644 index 0000000000..c20021dcc9 --- /dev/null +++ b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/objects/StreetIntersectionSearchObject.java @@ -0,0 +1,31 @@ +package net.osmand.core.samples.android.sample1.search.objects; + +import net.osmand.core.jni.PointI; +import net.osmand.core.jni.QStringStringHash; +import net.osmand.core.jni.StreetIntersection; + +public class StreetIntersectionSearchObject extends SearchPositionObject { + + public StreetIntersectionSearchObject(StreetIntersection streetIntersection) { + super(SearchObjectType.STREET_INTERSECTION, streetIntersection); + } + + public StreetIntersection getStreetIntersection() { + return (StreetIntersection) getInternalObject(); + } + + @Override + public PointI getPosition31() { + return getStreetIntersection().getPosition31(); + } + + @Override + public String getNativeName() { + return getStreetIntersection().getNativeName(); + } + + @Override + protected QStringStringHash getLocalizedNames() { + return getStreetIntersection().getLocalizedNames(); + } +} \ No newline at end of file diff --git a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/requests/CoreSearchRequest.java b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/requests/CoreSearchRequest.java index bbdc49ce8c..249dcdfe16 100644 --- a/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/requests/CoreSearchRequest.java +++ b/OsmAndCore-sample/src/net/osmand/core/samples/android/sample1/search/requests/CoreSearchRequest.java @@ -148,7 +148,6 @@ public class CoreSearchRequest extends SearchRequest { // Setup Addresses by name search AddressesByNameSearch addrByNameSearch = new AddressesByNameSearch(searchScope.getObfsCollection()); final AddressesByNameSearch.Criteria addrByNameCriteria = new AddressesByNameSearch.Criteria(); - //todo implement StreetGroup and Street parameters in AddressesByNameSearch.Criteria and apply them here addrByNameCriteria.setName(keyword); if (searchScope.getObfAreaFilter() != null) { addrByNameCriteria.setObfInfoAreaFilter(new NullableAreaI(searchScope.getObfAreaFilter()));