Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions OsmAnd.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -450,6 +450,7 @@
32A7EE16261BBF6C00F7A697 /* bg_point_octagon_contour@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 32A7EE14261BBF6C00F7A697 /* bg_point_octagon_contour@2x.png */; };
32A7EE1B261BBF7E00F7A697 /* bg_point_square_contour@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 32A7EE19261BBF7D00F7A697 /* bg_point_square_contour@2x.png */; };
32A7EE1C261BBF7E00F7A697 /* bg_point_square_contour@3x.png in Resources */ = {isa = PBXBuildFile; fileRef = 32A7EE1A261BBF7E00F7A697 /* bg_point_square_contour@3x.png */; };
32AB31242E66EF6A00FAC47E /* PlaceDetailsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32AB31232E66EF5700FAC47E /* PlaceDetailsViewController.swift */; };
32AB48692C9C50CB005EF1D4 /* DownloadingListHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32AB48682C9C50CB005EF1D4 /* DownloadingListHelper.swift */; };
32AB486B2C9C84B3005EF1D4 /* DownloadingListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 32AB486A2C9C84B3005EF1D4 /* DownloadingListViewController.swift */; };
32ABB64E2AEBC02D00491E99 /* OAWebImagesCacheHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 32ABB64D2AEBC02D00491E99 /* OAWebImagesCacheHelper.mm */; };
Expand Down Expand Up @@ -3926,6 +3927,7 @@
32A7EE14261BBF6C00F7A697 /* bg_point_octagon_contour@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "bg_point_octagon_contour@2x.png"; path = "Resources/Icons/bg_point_octagon_contour@2x.png"; sourceTree = "<group>"; };
32A7EE19261BBF7D00F7A697 /* bg_point_square_contour@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "bg_point_square_contour@2x.png"; path = "Resources/Icons/bg_point_square_contour@2x.png"; sourceTree = "<group>"; };
32A7EE1A261BBF7E00F7A697 /* bg_point_square_contour@3x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "bg_point_square_contour@3x.png"; path = "Resources/Icons/bg_point_square_contour@3x.png"; sourceTree = "<group>"; };
32AB31232E66EF5700FAC47E /* PlaceDetailsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlaceDetailsViewController.swift; sourceTree = "<group>"; };
32AB48682C9C50CB005EF1D4 /* DownloadingListHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadingListHelper.swift; sourceTree = "<group>"; };
32AB486A2C9C84B3005EF1D4 /* DownloadingListViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DownloadingListViewController.swift; sourceTree = "<group>"; };
32ABB64C2AEBC02100491E99 /* OAWebImagesCacheHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OAWebImagesCacheHelper.h; sourceTree = "<group>"; };
Expand Down Expand Up @@ -12471,6 +12473,7 @@
DA5A7E5226C563A400F274C7 /* OAPOIViewController.h */,
DA5A7E5326C563A400F274C7 /* OAPOIViewController.mm */,
3226C1A62D3E66DB008F9905 /* RenderedObjectViewController.swift */,
32AB31232E66EF5700FAC47E /* PlaceDetailsViewController.swift */,
);
path = POI;
sourceTree = "<group>";
Expand Down Expand Up @@ -17777,6 +17780,7 @@
320F71372A86438B0071C0E7 /* OAGPXDocumentAdapter.mm in Sources */,
46C8412F2C32F26000E284B0 /* OAShowHideCloudAction.m in Sources */,
DA5A815026C563A700F274C7 /* OACarPlayAddressSearchController.mm in Sources */,
32AB31242E66EF6A00FAC47E /* PlaceDetailsViewController.swift in Sources */,
DAA612E527E9E934003317BD /* OAPrepareBackupResult.m in Sources */,
DADBE9F22A32085800C0C102 /* CompassVisibilityViewController.swift in Sources */,
46C841312C32F27500E284B0 /* OAShowHideWindAction.m in Sources */,
Expand Down
2 changes: 2 additions & 0 deletions Sources/Constants/OAIndexConstants.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,6 @@ static NSString * const MODEL_NAME_PREFIX = @"model_";

static NSString * const ONLINE_TILES_DIR = @"OsmAnd (online tiles)";

static NSString * const XML_COLON = @"_-_";

#endif /* OAIndexConstants_h */
98 changes: 49 additions & 49 deletions Sources/Controllers/Map/Helpers/BaseDetailsObject.swift
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ private enum ObjectCompleteness: UInt {
@objcMembers
final class BaseDetailsObject: NSObject {

var osmIds: Set<Int>
var osmIds: Set<UInt64>
var wikidataIds: Set<String>
var objects: Array<Any>
var lang: String
Expand All @@ -35,7 +35,7 @@ final class BaseDetailsObject: NSObject {

override init() {
self.lang = "en"
self.osmIds = Set<Int>()
self.osmIds = Set<UInt64>()
self.wikidataIds = Set<String>()
self.objects = Array()
self.syntheticAmenity = OAPOI()
Expand Down Expand Up @@ -97,8 +97,8 @@ final class BaseDetailsObject: NSObject {
let osmId = getOsmId(object)
let wikidata = getWikidata(object)

if osmId != -1 {
osmIds.insert(Int(osmId))
if osmId > 0 {
osmIds.insert(UInt64(osmId))
}
if let wikidata, !wikidata.isEmpty {
wikidataIds.insert(wikidata)
Expand All @@ -120,20 +120,20 @@ final class BaseDetailsObject: NSObject {
return nil
}

private func getOsmId(_ object: Any) -> Int64 {
private func getOsmId(_ object: Any) -> UInt64 {
if let amenity = object as? OAPOI {
return amenity.getOsmId()
} else if let mapObject = object as? OAMapObject {
return ObfConstants.getOsmObjectId(mapObject)
}
return -1
return 0
}

func overlapsWith(_ object: Any) -> Bool {
let osmId = getOsmId(object)
let wikidata = getWikidata(object)

let osmIdEqual = osmId != -1 && osmIds.contains(Int(osmId))
let osmIdEqual = osmId > 0 && osmIds.contains(UInt64(osmId))

var wikidataEqual = false
if let wikidata, !wikidata.isEmpty, wikidataIds.contains(wikidata) {
Expand Down Expand Up @@ -230,7 +230,7 @@ final class BaseDetailsObject: NSObject {
guard let transportStopPoi = transportStop.poi else { return }

let osmId = ObfConstants.getOsmObjectId(transportStopPoi)
osmIds.insert(Int(osmId))
osmIds.insert(UInt64(osmId))

if let amenity = transportStop.poi {
if let wikidata = amenity.getWikidata() {
Expand All @@ -242,7 +242,7 @@ final class BaseDetailsObject: NSObject {

private func mergeRenderedObject(_ renderedObject: OARenderedObject) {
let osmId = ObfConstants.getOsmObjectId(renderedObject)
osmIds.insert(Int(osmId))
osmIds.insert(UInt64(osmId))

if let wikidata = renderedObject.tags[WIKIDATA_TAG] as? String {
wikidataIds.insert(wikidata)
Expand All @@ -258,50 +258,15 @@ final class BaseDetailsObject: NSObject {
var contentLocales = Set<String>()

for object in objects {
if let amenity = object as? OAPOI {
processAmenity(amenity, contentLocales: &contentLocales)
} else if let transportStop = object as? OATransportStop {
if let poi = transportStop.poi {
processAmenity(poi, contentLocales: &contentLocales)
} else {
processId(transportStop)
syntheticAmenity.copyNames(transportStop)
if syntheticAmenity.getLocation() == nil {
syntheticAmenity.latitude = transportStop.latitude
syntheticAmenity.longitude = transportStop.longitude
}
}
} else if let renderedObject = object as? OARenderedObject {
let type = ObfConstants.getOsmEntityType(renderedObject)
if let type {
let osmId = ObfConstants.getOsmObjectId(renderedObject)
let objectId = ObfConstants.createMapObjectIdFromOsmId(osmId, type: type)

if syntheticAmenity.obfId >= 0 && objectId > 0 {
syntheticAmenity.obfId = objectId
}
}

if syntheticAmenity.type == nil {
syntheticAmenity.copyAdditionalInfo(withMap: renderedObject.tags, overwrite: false)
}

syntheticAmenity.copyNames(renderedObject)
if syntheticAmenity.getLocation() == nil {
syntheticAmenity.latitude = renderedObject.latitude
syntheticAmenity.longitude = renderedObject.longitude
}

processPolygonCoordinates(x: renderedObject.x, y: renderedObject.y)
}
mergeObject(object, contentLocales: &contentLocales)
}

if contentLocales.count > 0 {
syntheticAmenity.updateContentLocales(contentLocales)
}

if objectCompleteness != .full {
objectCompleteness = syntheticAmenity.type != nil ? .combined : .empty
if objectCompleteness.rawValue < ObjectCompleteness.full.rawValue {
objectCompleteness = syntheticAmenity.type == nil ? .empty : .combined
}

if syntheticAmenity.type == nil {
Expand All @@ -311,6 +276,41 @@ final class BaseDetailsObject: NSObject {
}
}

private func mergeObject(_ object: Any, contentLocales: inout Set<String>) {
if let amenity = object as? OAPOI {
processAmenity(amenity, contentLocales: &contentLocales)
} else if let transportStop = object as? OATransportStop {
if let amenity = transportStop.poi {
processAmenity(amenity, contentLocales: &contentLocales)
} else {
processId(transportStop)
syntheticAmenity.copyNames(transportStop)
if syntheticAmenity.latitude == 0 && syntheticAmenity.longitude == 0 {
syntheticAmenity.latitude = transportStop.latitude
syntheticAmenity.longitude = transportStop.longitude
}
}
} else if let renderedObject = object as? OARenderedObject {
if let type = ObfConstants.getOsmEntityType(renderedObject) {
let osmId = ObfConstants.getOsmObjectId(renderedObject)
let objectId = ObfConstants.createMapObjectIdFromOsmId(osmId, type: type)

if syntheticAmenity.obfId <= 0 && objectId > 0 {
syntheticAmenity.obfId = objectId
}
}
if syntheticAmenity.type == nil {
syntheticAmenity.copyAdditionalInfo(withMap: renderedObject.tags, overwrite: false)
}
syntheticAmenity.copyNames(renderedObject)
if syntheticAmenity.latitude == 0 && syntheticAmenity.longitude == 0 {
syntheticAmenity.latitude = renderedObject.latitude
syntheticAmenity.longitude = renderedObject.longitude
}
processPolygonCoordinates(x: renderedObject.x, y: renderedObject.y)
}
}

private func processId(_ object: OAMapObject?) {
guard let object else { return }
if (syntheticAmenity.obfId >= 0) && ObfConstants.isOsmUrlAvailable(object) {
Expand Down Expand Up @@ -362,9 +362,9 @@ final class BaseDetailsObject: NSObject {
syntheticAmenity.localizedContent = MutableOrderedDictionary<NSString, NSString>()
}

if amenity.localizedContent.count > 0 {
if let amenityContent = amenity.localizedContent, amenityContent.count > 0 {
let localizedContent = MutableOrderedDictionary<NSString, NSString>(dictionary: syntheticAmenity.localizedContent)
localizedContent.addEntries(from: amenity.localizedContent as! [NSString : NSString])
localizedContent.addEntries(from: amenityContent as! [NSString : NSString])
syntheticAmenity.localizedContent = localizedContent
}

Expand Down
75 changes: 2 additions & 73 deletions Sources/Controllers/Map/Helpers/OAMapSelectionHelper.mm
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,6 @@ - (MapSelectionResult *)collectObjectsFromMap:(CGPoint)point showUnknownLocation
[self collectObjectsFromLayers:result unknownLocation:showUnknownLocation secondaryObjects:NO];
[self collectObjectsFromMap:result point:point];

[self processTransportStops:result];

if ([result isEmpty])
[self collectObjectsFromLayers:result unknownLocation:showUnknownLocation secondaryObjects:YES];

Expand Down Expand Up @@ -192,7 +190,7 @@ - (void)selectObjectsFromOpenGl:(MapSelectionResult *)result point:(CGPoint)poin
[requestAmenity setLongitude:result.objectLatLon.coordinate.longitude];

OAAmenitySearcherRequest *request = [[OAAmenitySearcherRequest alloc] initWithMapObject:requestAmenity names:names];
detailsObject = [amenitySearcher searchDetailedObject:request];
detailsObject = [amenitySearcher searchDetailedObjectWithRequest:request];
}
else
{
Expand Down Expand Up @@ -254,7 +252,7 @@ - (void)selectObjectsFromOpenGl:(MapSelectionResult *)result point:(CGPoint)poin
else
{
OAAmenitySearcherRequest *request = [[OAAmenitySearcherRequest alloc] initWithMapObject:renderedObject];
detailsObject = [amenitySearcher searchDetailedObject:request];
detailsObject = [amenitySearcher searchDetailedObjectWithRequest:request];
if (detailsObject)
{
[detailsObject setMapIconName:[self getMapIconName:symbolInfo]];
Expand Down Expand Up @@ -619,75 +617,6 @@ - (BOOL)isTransportStop:(NSArray<SelectedMapObject *> *)selectedObjects detail:(
return _publicTransportTypes;
}

- (void)processTransportStops:(MapSelectionResult *)result
{
// Android has same code in contex menu UI init()

// TODO: make this code async in part of next task https://github.com/osmandapp/OsmAnd-iOS/issues/4594
// Step 1) ContextMenuLayer -> showContextMenu -> MapContextMenu.init() -> setSelectedObject(renderedObject)
// Step 2) RenderedObjectMenuBuilder -> build() -> searchAmenity() -> searchBaseDetailedObjectAsync() -> MapContextMenu.update() -> setSelectedObject(poi)

NSMutableArray<SelectedMapObject *> *selectedObjects = [result.allObjects mutableCopy];
NSArray<NSString *> *publicTransportTypes = [self getPublicTransportTypes];
if (publicTransportTypes)
{
NSMutableArray<OAPOI *> *transportStopAmenities = [NSMutableArray array];

for (SelectedMapObject *selectedObject in selectedObjects)
{
if ([selectedObject.object isKindOfClass:[OARenderedObject class]])
{
OARenderedObject *renderedObject = selectedObject.object;
OAAmenitySearcherRequest *request = [[OAAmenitySearcherRequest alloc] initWithMapObject:renderedObject];
BaseDetailsObject *detailsObject = [OAAmenitySearcher.sharedInstance searchDetailedObject:request];
if (detailsObject)
{
selectedObject.object = detailsObject.syntheticAmenity;
}
else
{
OAPOI *poi = [RenderedObjectHelper getSyntheticAmenityWithRenderedObject:(OARenderedObject *)selectedObject.object];
if (poi)
{
NSString *type = [ObfConstants getOsmEntityType:selectedObject.object];
if (type)
{
int64_t osmId = [ObfConstants getOsmObjectId:selectedObject.object];
int64_t poiObjectId = [ObfConstants createMapObjectIdFromOsmId:osmId type:type];
poi.obfId = poiObjectId;
}
selectedObject.object = poi;
}
}
}
if ([selectedObject.object isKindOfClass:[OAPOI class]])
{
OAPOI *amenity = (OAPOI *)selectedObject.object;
if (!NSStringIsEmpty(amenity.type.name) && [publicTransportTypes containsObject:amenity.type.name])
[transportStopAmenities addObject:amenity];
}
}

if (!NSArrayIsEmpty(transportStopAmenities))
{
for (OAPOI *amenity in transportStopAmenities)
{
OATransportStopsLayer *transportStopsLayer = [OARootViewController instance].mapPanel.mapViewController.mapLayers.transportStopsLayer;
OATransportStop *transportStop = [OATransportStopsBaseController findNearestTransportStopForAmenity:amenity];
if (transportStop && transportStopsLayer)
{
SelectedMapObject *newTransportStop = [[SelectedMapObject alloc] initWithMapObject:transportStop provider:transportStopsLayer];
[selectedObjects addObject:newTransportStop];

[selectedObjects filterUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(SelectedMapObject *selectedObject, NSDictionary *bindings) {
return (!selectedObject && !amenity) || [amenity isEqual:selectedObject.object];
}]];
}
}
}
}
}

- (NSMutableArray<NSString *> *)getValues:(QHash<QString, QString>)set
{
NSMutableArray<NSString *> *res = [NSMutableArray new];
Expand Down
2 changes: 1 addition & 1 deletion Sources/Controllers/Map/Layers/OAContextMenuLayer.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
- (void) hideContextPinMarker;

- (BOOL) showContextMenu:(CGPoint)touchPoint showUnknownLocation:(BOOL)showUnknownLocation forceHide:(BOOL)forceHide;
- (void) showContextMenu:(CLLocation *)touchPointLatLon object:(SelectedMapObject *)selectedObject;
- (void) showContextMenuFor:(SelectedMapObject *)selectedObject latLon:(CLLocation *)latLon;

- (OATargetPoint *) getUnknownTargetPoint:(double)latitude longitude:(double)longitude;

Expand Down
Loading