diff --git a/iphone/CoreApi/CoreApi.xcodeproj/project.pbxproj b/iphone/CoreApi/CoreApi.xcodeproj/project.pbxproj index 296b5dae63..55d0470e14 100644 --- a/iphone/CoreApi/CoreApi.xcodeproj/project.pbxproj +++ b/iphone/CoreApi/CoreApi.xcodeproj/project.pbxproj @@ -19,6 +19,44 @@ 471AB99123AB931000F56D49 /* MWMMapSearchResult+Core.h in Headers */ = {isa = PBXBuildFile; fileRef = 471AB98F23AB931000F56D49 /* MWMMapSearchResult+Core.h */; }; 475784C22344B422008291A4 /* Framework.h in Headers */ = {isa = PBXBuildFile; fileRef = 475784C02344B421008291A4 /* Framework.h */; settings = {ATTRIBUTES = (Public, ); }; }; 475784C32344B422008291A4 /* Framework.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 475784C12344B422008291A4 /* Framework.cpp */; }; + 47942D6B237CC3D600DEFAE3 /* PlacePageData.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D51237CC3B500DEFAE3 /* PlacePageData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47942D6C237CC3DE00DEFAE3 /* PlacePageData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 47942D52237CC3B500DEFAE3 /* PlacePageData.mm */; }; + 47942D6D237CC3E300DEFAE3 /* PlacePagePreviewData.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D53237CC3B500DEFAE3 /* PlacePagePreviewData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47942D6E237CC3E800DEFAE3 /* PlacePagePreviewData+Core.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D54237CC3B500DEFAE3 /* PlacePagePreviewData+Core.h */; }; + 47942D6F237CC3F400DEFAE3 /* PlacePageInfoData.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D56237CC3B500DEFAE3 /* PlacePageInfoData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47942D70237CC40400DEFAE3 /* PlacePageInfoData+Core.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D57237CC3B500DEFAE3 /* PlacePageInfoData+Core.h */; }; + 47942D71237CC40800DEFAE3 /* PlacePageInfoData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 47942D58237CC3B500DEFAE3 /* PlacePageInfoData.mm */; }; + 47942D72237CC40B00DEFAE3 /* OpeningHours.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D59237CC3B500DEFAE3 /* OpeningHours.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47942D73237CC41400DEFAE3 /* OpeningHours.mm in Sources */ = {isa = PBXBuildFile; fileRef = 47942D5A237CC3B500DEFAE3 /* OpeningHours.mm */; }; + 47942D74237CC41A00DEFAE3 /* HotelBookingData.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D5C237CC3B500DEFAE3 /* HotelBookingData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47942D75237CC41A00DEFAE3 /* HotelBookingData+Core.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D5D237CC3B500DEFAE3 /* HotelBookingData+Core.h */; }; + 47942D76237CC41A00DEFAE3 /* HotelBookingData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 47942D5E237CC3B500DEFAE3 /* HotelBookingData.mm */; }; + 47942D77237CC41A00DEFAE3 /* HotelRooms.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D5F237CC3B500DEFAE3 /* HotelRooms.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47942D78237CC41A00DEFAE3 /* HotelRooms+Core.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D60237CC3B500DEFAE3 /* HotelRooms+Core.h */; }; + 47942D79237CC41A00DEFAE3 /* HotelRooms.mm in Sources */ = {isa = PBXBuildFile; fileRef = 47942D61237CC3B500DEFAE3 /* HotelRooms.mm */; }; + 47942D7A237CC41A00DEFAE3 /* HotelRoom.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D62237CC3B500DEFAE3 /* HotelRoom.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47942D7B237CC41A00DEFAE3 /* HotelRoom+Core.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D63237CC3B500DEFAE3 /* HotelRoom+Core.h */; }; + 47942D7C237CC41A00DEFAE3 /* HotelRoom.mm in Sources */ = {isa = PBXBuildFile; fileRef = 47942D64237CC3B500DEFAE3 /* HotelRoom.mm */; }; + 47942D7D237CC42B00DEFAE3 /* UgcData.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D66237CC3B500DEFAE3 /* UgcData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47942D7E237CC43000DEFAE3 /* UgcData+Core.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D67237CC3B500DEFAE3 /* UgcData+Core.h */; }; + 47942D7F237CC43300DEFAE3 /* UgcData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 47942D68237CC3B500DEFAE3 /* UgcData.mm */; }; + 47942D82237CC52A00DEFAE3 /* MWMOpeningHours.mm in Sources */ = {isa = PBXBuildFile; fileRef = 47942D80237CC52A00DEFAE3 /* MWMOpeningHours.mm */; }; + 47942D83237CC52E00DEFAE3 /* MWMOpeningHours.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D81237CC52A00DEFAE3 /* MWMOpeningHours.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47942D86237CC55500DEFAE3 /* MWMOpeningHoursCommon.mm in Sources */ = {isa = PBXBuildFile; fileRef = 47942D85237CC55500DEFAE3 /* MWMOpeningHoursCommon.mm */; }; + 47942D87237CC55800DEFAE3 /* MWMOpeningHoursCommon.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D84237CC55400DEFAE3 /* MWMOpeningHoursCommon.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47942D88237CCA8800DEFAE3 /* PlacePagePreviewData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 47942D55237CC3B500DEFAE3 /* PlacePagePreviewData.mm */; }; + 47942D8C237D634300DEFAE3 /* CatalogPromoData.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D8A237D634300DEFAE3 /* CatalogPromoData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47942D8D237D634300DEFAE3 /* CatalogPromoData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 47942D8B237D634300DEFAE3 /* CatalogPromoData.mm */; }; + 47942D90237D654B00DEFAE3 /* CatalogPromoData+Core.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D8E237D654B00DEFAE3 /* CatalogPromoData+Core.h */; }; + 47942D94237D673E00DEFAE3 /* CatalogPromoItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D92237D673E00DEFAE3 /* CatalogPromoItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47942D95237D673E00DEFAE3 /* CatalogPromoItem.mm in Sources */ = {isa = PBXBuildFile; fileRef = 47942D93237D673E00DEFAE3 /* CatalogPromoItem.mm */; }; + 47942D98237D675400DEFAE3 /* CatalogPromoItem+Core.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D96237D675400DEFAE3 /* CatalogPromoItem+Core.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47942D9C237D927800DEFAE3 /* PlacePageBookmarkData.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D9A237D927800DEFAE3 /* PlacePageBookmarkData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47942D9D237D927800DEFAE3 /* PlacePageBookmarkData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 47942D9B237D927800DEFAE3 /* PlacePageBookmarkData.mm */; }; + 47942DA0237D954400DEFAE3 /* PlacePageBookmarkData+Core.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942D9E237D954400DEFAE3 /* PlacePageBookmarkData+Core.h */; }; + 47942DAB237ED9FE00DEFAE3 /* IOpeningHoursLocalization.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942DAA237ED9FE00DEFAE3 /* IOpeningHoursLocalization.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47942DAE2382ABE100DEFAE3 /* UgcSummaryRating.h in Headers */ = {isa = PBXBuildFile; fileRef = 47942DAC2382ABE100DEFAE3 /* UgcSummaryRating.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47942DAF2382ABE100DEFAE3 /* UgcSummaryRating.mm in Sources */ = {isa = PBXBuildFile; fileRef = 47942DAD2382ABE100DEFAE3 /* UgcSummaryRating.mm */; }; 479834EA2342697400724D1E /* MWMTag+Convenience.mm in Sources */ = {isa = PBXBuildFile; fileRef = 479834E62342697100724D1E /* MWMTag+Convenience.mm */; }; 479834EB2342697400724D1E /* MWMTagGroup+Convenience.mm in Sources */ = {isa = PBXBuildFile; fileRef = 479834E72342697200724D1E /* MWMTagGroup+Convenience.mm */; }; 479834F023426C0100724D1E /* common-debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 479834EE23426C0100724D1E /* common-debug.xcconfig */; }; @@ -74,6 +112,9 @@ 9957FAE9237AE5B000855F48 /* Logger.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9957FAE7237AE5B000855F48 /* Logger.mm */; }; 999D3A64237B097C00C5F7A8 /* DeepLinkSubscriptionData.h in Headers */ = {isa = PBXBuildFile; fileRef = 999D3A62237B097C00C5F7A8 /* DeepLinkSubscriptionData.h */; settings = {ATTRIBUTES = (Public, ); }; }; 999D3A65237B097C00C5F7A8 /* DeepLinkSubscriptionData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 999D3A63237B097C00C5F7A8 /* DeepLinkSubscriptionData.mm */; }; + 47F701EF238C86F000D18E95 /* PlacePageButtonsData.h in Headers */ = {isa = PBXBuildFile; fileRef = 47F701ED238C86F000D18E95 /* PlacePageButtonsData.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 47F701F0238C86F000D18E95 /* PlacePageButtonsData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 47F701EE238C86F000D18E95 /* PlacePageButtonsData.mm */; }; + 47F701F3238C877C00D18E95 /* PlacePageButtonsData+Core.h in Headers */ = {isa = PBXBuildFile; fileRef = 47F701F1238C877C00D18E95 /* PlacePageButtonsData+Core.h */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -93,6 +134,44 @@ 471AB98F23AB931000F56D49 /* MWMMapSearchResult+Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MWMMapSearchResult+Core.h"; sourceTree = ""; }; 475784C02344B421008291A4 /* Framework.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Framework.h; sourceTree = ""; }; 475784C12344B422008291A4 /* Framework.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Framework.cpp; sourceTree = ""; }; + 47942D51237CC3B500DEFAE3 /* PlacePageData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlacePageData.h; sourceTree = ""; }; + 47942D52237CC3B500DEFAE3 /* PlacePageData.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = PlacePageData.mm; sourceTree = ""; }; + 47942D53237CC3B500DEFAE3 /* PlacePagePreviewData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlacePagePreviewData.h; sourceTree = ""; }; + 47942D54237CC3B500DEFAE3 /* PlacePagePreviewData+Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "PlacePagePreviewData+Core.h"; sourceTree = ""; }; + 47942D55237CC3B500DEFAE3 /* PlacePagePreviewData.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = PlacePagePreviewData.mm; sourceTree = ""; }; + 47942D56237CC3B500DEFAE3 /* PlacePageInfoData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlacePageInfoData.h; sourceTree = ""; }; + 47942D57237CC3B500DEFAE3 /* PlacePageInfoData+Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "PlacePageInfoData+Core.h"; sourceTree = ""; }; + 47942D58237CC3B500DEFAE3 /* PlacePageInfoData.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = PlacePageInfoData.mm; sourceTree = ""; }; + 47942D59237CC3B500DEFAE3 /* OpeningHours.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpeningHours.h; sourceTree = ""; }; + 47942D5A237CC3B500DEFAE3 /* OpeningHours.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = OpeningHours.mm; sourceTree = ""; }; + 47942D5C237CC3B500DEFAE3 /* HotelBookingData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HotelBookingData.h; sourceTree = ""; }; + 47942D5D237CC3B500DEFAE3 /* HotelBookingData+Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "HotelBookingData+Core.h"; sourceTree = ""; }; + 47942D5E237CC3B500DEFAE3 /* HotelBookingData.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = HotelBookingData.mm; sourceTree = ""; }; + 47942D5F237CC3B500DEFAE3 /* HotelRooms.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HotelRooms.h; sourceTree = ""; }; + 47942D60237CC3B500DEFAE3 /* HotelRooms+Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "HotelRooms+Core.h"; sourceTree = ""; }; + 47942D61237CC3B500DEFAE3 /* HotelRooms.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = HotelRooms.mm; sourceTree = ""; }; + 47942D62237CC3B500DEFAE3 /* HotelRoom.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HotelRoom.h; sourceTree = ""; }; + 47942D63237CC3B500DEFAE3 /* HotelRoom+Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "HotelRoom+Core.h"; sourceTree = ""; }; + 47942D64237CC3B500DEFAE3 /* HotelRoom.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = HotelRoom.mm; sourceTree = ""; }; + 47942D66237CC3B500DEFAE3 /* UgcData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UgcData.h; sourceTree = ""; }; + 47942D67237CC3B500DEFAE3 /* UgcData+Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UgcData+Core.h"; sourceTree = ""; }; + 47942D68237CC3B500DEFAE3 /* UgcData.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = UgcData.mm; sourceTree = ""; }; + 47942D80237CC52A00DEFAE3 /* MWMOpeningHours.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMOpeningHours.mm; sourceTree = ""; }; + 47942D81237CC52A00DEFAE3 /* MWMOpeningHours.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMOpeningHours.h; sourceTree = ""; }; + 47942D84237CC55400DEFAE3 /* MWMOpeningHoursCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMOpeningHoursCommon.h; sourceTree = ""; }; + 47942D85237CC55500DEFAE3 /* MWMOpeningHoursCommon.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMOpeningHoursCommon.mm; sourceTree = ""; }; + 47942D8A237D634300DEFAE3 /* CatalogPromoData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CatalogPromoData.h; sourceTree = ""; }; + 47942D8B237D634300DEFAE3 /* CatalogPromoData.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = CatalogPromoData.mm; sourceTree = ""; }; + 47942D8E237D654B00DEFAE3 /* CatalogPromoData+Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CatalogPromoData+Core.h"; sourceTree = ""; }; + 47942D92237D673E00DEFAE3 /* CatalogPromoItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CatalogPromoItem.h; sourceTree = ""; }; + 47942D93237D673E00DEFAE3 /* CatalogPromoItem.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = CatalogPromoItem.mm; sourceTree = ""; }; + 47942D96237D675400DEFAE3 /* CatalogPromoItem+Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CatalogPromoItem+Core.h"; sourceTree = ""; }; + 47942D9A237D927800DEFAE3 /* PlacePageBookmarkData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlacePageBookmarkData.h; sourceTree = ""; }; + 47942D9B237D927800DEFAE3 /* PlacePageBookmarkData.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = PlacePageBookmarkData.mm; sourceTree = ""; }; + 47942D9E237D954400DEFAE3 /* PlacePageBookmarkData+Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "PlacePageBookmarkData+Core.h"; sourceTree = ""; }; + 47942DAA237ED9FE00DEFAE3 /* IOpeningHoursLocalization.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IOpeningHoursLocalization.h; sourceTree = ""; }; + 47942DAC2382ABE100DEFAE3 /* UgcSummaryRating.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UgcSummaryRating.h; sourceTree = ""; }; + 47942DAD2382ABE100DEFAE3 /* UgcSummaryRating.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = UgcSummaryRating.mm; sourceTree = ""; }; 479834E62342697100724D1E /* MWMTag+Convenience.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "MWMTag+Convenience.mm"; sourceTree = ""; }; 479834E72342697200724D1E /* MWMTagGroup+Convenience.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "MWMTagGroup+Convenience.mm"; sourceTree = ""; }; 479834E82342697200724D1E /* MWMTag+Convenience.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MWMTag+Convenience.h"; sourceTree = ""; }; @@ -135,6 +214,9 @@ 47F4F1FB23A3D1AC0022FD56 /* MWMMapNodeAttributes+Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MWMMapNodeAttributes+Core.h"; sourceTree = ""; }; 99103841237EDFA200893C9F /* DeepLinkData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DeepLinkData.h; sourceTree = ""; }; 99103842237EDFA200893C9F /* DeepLinkData.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DeepLinkData.m; sourceTree = ""; }; + 47F701ED238C86F000D18E95 /* PlacePageButtonsData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlacePageButtonsData.h; sourceTree = ""; }; + 47F701EE238C86F000D18E95 /* PlacePageButtonsData.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = PlacePageButtonsData.mm; sourceTree = ""; }; + 47F701F1238C877C00D18E95 /* PlacePageButtonsData+Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "PlacePageButtonsData+Core.h"; sourceTree = ""; }; 991CE2E82375AF19009EB02A /* PromoAfterBookingCampaignAdapter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PromoAfterBookingCampaignAdapter.mm; sourceTree = ""; }; 991CE2E92375AF19009EB02A /* PromoAfterBookingCampaignAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PromoAfterBookingCampaignAdapter.h; sourceTree = ""; }; 991CE2EC2375AF25009EB02A /* PromoDiscoveryCampaignAdapter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PromoDiscoveryCampaignAdapter.h; sourceTree = ""; }; @@ -194,6 +276,7 @@ 993F54ED237C5D1000545511 /* Promo */, 9957FAE5237AE59C00855F48 /* Logger */, 9957FAC1237AABD800855F48 /* DeepLink */, + 47942D6A237CC3B500DEFAE3 /* PlacePageData */, 4718C42F2355FC0D00640DF1 /* NetworkPolicy */, 47C637D92354B76700E12DE0 /* Search */, 47C637D32354AEA800E12DE0 /* Traffic */, @@ -244,6 +327,86 @@ path = Framework; sourceTree = ""; }; + 47942D5B237CC3B500DEFAE3 /* Common */ = { + isa = PBXGroup; + children = ( + 47942D9A237D927800DEFAE3 /* PlacePageBookmarkData.h */, + 47942D9E237D954400DEFAE3 /* PlacePageBookmarkData+Core.h */, + 47942D9B237D927800DEFAE3 /* PlacePageBookmarkData.mm */, + 47942D53237CC3B500DEFAE3 /* PlacePagePreviewData.h */, + 47942D54237CC3B500DEFAE3 /* PlacePagePreviewData+Core.h */, + 47942D55237CC3B500DEFAE3 /* PlacePagePreviewData.mm */, + 47942D56237CC3B500DEFAE3 /* PlacePageInfoData.h */, + 47942D57237CC3B500DEFAE3 /* PlacePageInfoData+Core.h */, + 47942D58237CC3B500DEFAE3 /* PlacePageInfoData.mm */, + 47942D59237CC3B500DEFAE3 /* OpeningHours.h */, + 47942D5A237CC3B500DEFAE3 /* OpeningHours.mm */, + 47942D81237CC52A00DEFAE3 /* MWMOpeningHours.h */, + 47942D80237CC52A00DEFAE3 /* MWMOpeningHours.mm */, + 47942D84237CC55400DEFAE3 /* MWMOpeningHoursCommon.h */, + 47942D85237CC55500DEFAE3 /* MWMOpeningHoursCommon.mm */, + 47942DAA237ED9FE00DEFAE3 /* IOpeningHoursLocalization.h */, + 47F701ED238C86F000D18E95 /* PlacePageButtonsData.h */, + 47F701F1238C877C00D18E95 /* PlacePageButtonsData+Core.h */, + 47F701EE238C86F000D18E95 /* PlacePageButtonsData.mm */, + ); + path = Common; + sourceTree = ""; + }; + 47942D65237CC3B500DEFAE3 /* Booking */ = { + isa = PBXGroup; + children = ( + 47942D5C237CC3B500DEFAE3 /* HotelBookingData.h */, + 47942D5D237CC3B500DEFAE3 /* HotelBookingData+Core.h */, + 47942D5E237CC3B500DEFAE3 /* HotelBookingData.mm */, + 47942D5F237CC3B500DEFAE3 /* HotelRooms.h */, + 47942D60237CC3B500DEFAE3 /* HotelRooms+Core.h */, + 47942D61237CC3B500DEFAE3 /* HotelRooms.mm */, + 47942D62237CC3B500DEFAE3 /* HotelRoom.h */, + 47942D63237CC3B500DEFAE3 /* HotelRoom+Core.h */, + 47942D64237CC3B500DEFAE3 /* HotelRoom.mm */, + ); + path = Booking; + sourceTree = ""; + }; + 47942D69237CC3B500DEFAE3 /* UGC */ = { + isa = PBXGroup; + children = ( + 47942D66237CC3B500DEFAE3 /* UgcData.h */, + 47942D67237CC3B500DEFAE3 /* UgcData+Core.h */, + 47942D68237CC3B500DEFAE3 /* UgcData.mm */, + 47942DAC2382ABE100DEFAE3 /* UgcSummaryRating.h */, + 47942DAD2382ABE100DEFAE3 /* UgcSummaryRating.mm */, + ); + path = UGC; + sourceTree = ""; + }; + 47942D6A237CC3B500DEFAE3 /* PlacePageData */ = { + isa = PBXGroup; + children = ( + 47942D51237CC3B500DEFAE3 /* PlacePageData.h */, + 47942D52237CC3B500DEFAE3 /* PlacePageData.mm */, + 47942D89237D629D00DEFAE3 /* Catalog */, + 47942D5B237CC3B500DEFAE3 /* Common */, + 47942D65237CC3B500DEFAE3 /* Booking */, + 47942D69237CC3B500DEFAE3 /* UGC */, + ); + path = PlacePageData; + sourceTree = ""; + }; + 47942D89237D629D00DEFAE3 /* Catalog */ = { + isa = PBXGroup; + children = ( + 47942D8A237D634300DEFAE3 /* CatalogPromoData.h */, + 47942D8E237D654B00DEFAE3 /* CatalogPromoData+Core.h */, + 47942D8B237D634300DEFAE3 /* CatalogPromoData.mm */, + 47942D92237D673E00DEFAE3 /* CatalogPromoItem.h */, + 47942D96237D675400DEFAE3 /* CatalogPromoItem+Core.h */, + 47942D93237D673E00DEFAE3 /* CatalogPromoItem.mm */, + ); + path = Catalog; + sourceTree = ""; + }; 479F7048234F784B00011E2E /* Common */ = { isa = PBXGroup; children = ( @@ -415,40 +578,69 @@ files = ( 9957FAE8237AE5B000855F48 /* Logger.h in Headers */, 470015F42342509C00EBF03D /* CoreApi.h in Headers */, + 47942D74237CC41A00DEFAE3 /* HotelBookingData.h in Headers */, 479F705F234FBB8F00011E2E /* MWMCategory.h in Headers */, 471AB99123AB931000F56D49 /* MWMMapSearchResult+Core.h in Headers */, + 47942D6D237CC3E300DEFAE3 /* PlacePagePreviewData.h in Headers */, 47A65CAF235008E100DCD85F /* CoreApi-swift.h in Headers */, 9957FACE237AB01400855F48 /* DeepLinkParser.h in Headers */, 993F54F5237C5D1100545511 /* PromoAfterBookingCampaignAdapter.h in Headers */, + 47942D7D237CC42B00DEFAE3 /* UgcData.h in Headers */, + 47942D77237CC41A00DEFAE3 /* HotelRooms.h in Headers */, 479834F223426CCC00724D1E /* MWMTag+Convenience.h in Headers */, + 47942D78237CC41A00DEFAE3 /* HotelRooms+Core.h in Headers */, 479F704F234FB60400011E2E /* MWMCatalogObserver.h in Headers */, 47E8164023B2B98F008FD836 /* MWMUser.h in Headers */, + 47F701EF238C86F000D18E95 /* PlacePageButtonsData.h in Headers */, + 47942DAE2382ABE100DEFAE3 /* UgcSummaryRating.h in Headers */, 47EEAFF72350D060005CF316 /* MWMCommon.h in Headers */, 47D9019523AC22E500D9364C /* MWMMapUpdateInfo.h in Headers */, 9957FADB237ACB1100855F48 /* DeepLinkSearchData.h in Headers */, 479F7056234FB7F200011E2E /* MWMBookmarksManager.h in Headers */, + 47942D83237CC52E00DEFAE3 /* MWMOpeningHours.h in Headers */, 4718C4322355FC3C00640DF1 /* MWMNetworkPolicy.h in Headers */, 99103843237EDFA200893C9F /* DeepLinkData.h in Headers */, 47F4F1FD23A3D1AC0022FD56 /* MWMMapNodeAttributes+Core.h in Headers */, 47C637DD2354B79B00E12DE0 /* MWMSearchFrameworkHelper.h in Headers */, + 47942D70237CC40400DEFAE3 /* PlacePageInfoData+Core.h in Headers */, + 47942DA0237D954400DEFAE3 /* PlacePageBookmarkData+Core.h in Headers */, 479F704B234F78AB00011E2E /* MWMFrameworkHelper.h in Headers */, 479834F323426CD200724D1E /* MWMTagGroup+Convenience.h in Headers */, 47D9019923AC236100D9364C /* MWMMapUpdateInfo+Core.h in Headers */, 999D3A64237B097C00C5F7A8 /* DeepLinkSubscriptionData.h in Headers */, + 47942D7E237CC43000DEFAE3 /* UgcData+Core.h in Headers */, + 47942D6E237CC3E800DEFAE3 /* PlacePagePreviewData+Core.h in Headers */, + 47942D7B237CC41A00DEFAE3 /* HotelRoom+Core.h in Headers */, + 47942D94237D673E00DEFAE3 /* CatalogPromoItem.h in Headers */, 470016102342579200EBF03D /* MWMTagGroup.h in Headers */, + 47942D87237CC55800DEFAE3 /* MWMOpeningHoursCommon.h in Headers */, + 47942DAB237ED9FE00DEFAE3 /* IOpeningHoursLocalization.h in Headers */, 479F7063234FBC5900011E2E /* MWMCarPlayBookmarkObject.h in Headers */, 47E8163723B188D3008FD836 /* MWMStorage.h in Headers */, 47EEAFF62350CF48005CF316 /* AppInfo.h in Headers */, + 47F701F3238C877C00D18E95 /* PlacePageButtonsData+Core.h in Headers */, 479F7053234FB7BC00011E2E /* MWMCatalogCommon.h in Headers */, + 47942D7A237CC41A00DEFAE3 /* HotelRoom.h in Headers */, 4700160F2342579000EBF03D /* MWMTag.h in Headers */, 47F4F1F923A3336C0022FD56 /* MWMMapNodeAttributes.h in Headers */, 479F705B234FBB1100011E2E /* MWMUTM.h in Headers */, + 47942D98237D675400DEFAE3 /* CatalogPromoItem+Core.h in Headers */, 479F704A234F785B00011E2E /* MWMTypes.h in Headers */, 47C637D72354AEBE00E12DE0 /* MWMTrafficManager.h in Headers */, 993F54F2237C5D1100545511 /* PromoDiscoveryCampaignAdapter.h in Headers */, 99447849238559F2004DAEE5 /* DeeplinkParsingResult.h in Headers */, + 991CE2EB2375AF19009EB02A /* PromoAfterBookingCampaignAdapter.h in Headers */, + 991CE2EF2375AF4E009EB02A /* PromoDiscoveryCampaignAdapter.h in Headers */, + 47942D9C237D927800DEFAE3 /* PlacePageBookmarkData.h in Headers */, + 47942D75237CC41A00DEFAE3 /* HotelBookingData+Core.h in Headers */, + 47942D72237CC40B00DEFAE3 /* OpeningHours.h in Headers */, + 47C637D72354AEBE00E12DE0 /* MWMTrafficManager.h in Headers */, + 47942D6B237CC3D600DEFAE3 /* PlacePageData.h in Headers */, + 47942D8C237D634300DEFAE3 /* CatalogPromoData.h in Headers */, + 47942D90237D654B00DEFAE3 /* CatalogPromoData+Core.h in Headers */, 47D609DC234FE625008ECC47 /* MWMBookmarksObserver.h in Headers */, 471AB98D23AB925D00F56D49 /* MWMMapSearchResult.h in Headers */, + 47942D6F237CC3F400DEFAE3 /* PlacePageInfoData.h in Headers */, 475784C22344B422008291A4 /* Framework.h in Headers */, 47C637D22354A6FB00E12DE0 /* MWMEye.h in Headers */, ); @@ -528,14 +720,27 @@ 9957FACF237AB01400855F48 /* DeepLinkParser.mm in Sources */, 47F4F1FA23A3336C0022FD56 /* MWMMapNodeAttributes.mm in Sources */, 99103844237EDFA200893C9F /* DeepLinkData.m in Sources */, + 47942D88237CCA8800DEFAE3 /* PlacePagePreviewData.mm in Sources */, + 479F7050234FB60400011E2E /* MWMCatalogObserver.mm in Sources */, + 47942D7F237CC43300DEFAE3 /* UgcData.mm in Sources */, 47C637D12354A6FB00E12DE0 /* MWMEye.mm in Sources */, + 47942D9D237D927800DEFAE3 /* PlacePageBookmarkData.mm in Sources */, + 47942D86237CC55500DEFAE3 /* MWMOpeningHoursCommon.mm in Sources */, + 47942D82237CC52A00DEFAE3 /* MWMOpeningHours.mm in Sources */, + 47942D73237CC41400DEFAE3 /* OpeningHours.mm in Sources */, 47C637DC2354B79B00E12DE0 /* MWMSearchFrameworkHelper.mm in Sources */, 993F54F4237C5D1100545511 /* PromoDiscoveryCampaignAdapter.mm in Sources */, 479F7062234FBC4700011E2E /* MWMCarPlayBookmarkObject.mm in Sources */, + 991CE2EA2375AF19009EB02A /* PromoAfterBookingCampaignAdapter.mm in Sources */, + 47942D95237D673E00DEFAE3 /* CatalogPromoItem.mm in Sources */, + 47942D6C237CC3DE00DEFAE3 /* PlacePageData.mm in Sources */, + 47942DAF2382ABE100DEFAE3 /* UgcSummaryRating.mm in Sources */, 479F705E234FBB8C00011E2E /* MWMCategory.m in Sources */, 479834EB2342697400724D1E /* MWMTagGroup+Convenience.mm in Sources */, 470016082342541100EBF03D /* MWMTagGroup.m in Sources */, + 47942D79237CC41A00DEFAE3 /* HotelRooms.mm in Sources */, 479F7057234FB7F200011E2E /* MWMBookmarksManager.mm in Sources */, + 47942D71237CC40800DEFAE3 /* PlacePageInfoData.mm in Sources */, 479F7047234F774100011E2E /* MWMFrameworkHelper.mm in Sources */, 470016072342541100EBF03D /* MWMTag.m in Sources */, 47D9019623AC22E500D9364C /* MWMMapUpdateInfo.mm in Sources */, @@ -544,12 +749,16 @@ 479834EA2342697400724D1E /* MWMTag+Convenience.mm in Sources */, 47C637D62354AEBE00E12DE0 /* MWMTrafficManager.mm in Sources */, 475784C32344B422008291A4 /* Framework.cpp in Sources */, + 47942D8D237D634300DEFAE3 /* CatalogPromoData.mm in Sources */, 4718C4332355FC3C00640DF1 /* MWMNetworkPolicy.mm in Sources */, 993F54F3237C5D1100545511 /* PromoAfterBookingCampaignAdapter.mm in Sources */, + 47F701F0238C86F000D18E95 /* PlacePageButtonsData.mm in Sources */, 47EEAFF42350CEDB005CF316 /* AppInfo.mm in Sources */, 47E8163623B1889C008FD836 /* MWMStorage.mm in Sources */, 9957FAE9237AE5B000855F48 /* Logger.mm in Sources */, 999D3A65237B097C00C5F7A8 /* DeepLinkSubscriptionData.mm in Sources */, + 47942D7C237CC41A00DEFAE3 /* HotelRoom.mm in Sources */, + 47942D76237CC41A00DEFAE3 /* HotelBookingData.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/iphone/CoreApi/CoreApi/Common/AppInfo.h b/iphone/CoreApi/CoreApi/Common/AppInfo.h index 714e51f925..7d0727f244 100644 --- a/iphone/CoreApi/CoreApi/Common/AppInfo.h +++ b/iphone/CoreApi/CoreApi/Common/AppInfo.h @@ -6,6 +6,8 @@ typedef NS_ENUM(NSInteger, MWMOpenGLDriver) { MWMOpenGLDriverMetal }; +NS_ASSUME_NONNULL_BEGIN + @interface AppInfo : NSObject + (instancetype)sharedInfo; @@ -21,3 +23,5 @@ typedef NS_ENUM(NSInteger, MWMOpenGLDriver) { @property(nonatomic, readonly) BOOL canMakeCalls; @end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/CoreApi-swift.h b/iphone/CoreApi/CoreApi/CoreApi-swift.h index e9caebbcf9..d1f0d5444c 100644 --- a/iphone/CoreApi/CoreApi/CoreApi-swift.h +++ b/iphone/CoreApi/CoreApi/CoreApi-swift.h @@ -30,3 +30,18 @@ FOUNDATION_EXPORT const unsigned char CoreApiVersionString[]; #import #import #import + +#pragma mark - Place Page + +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import +#import diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelBookingData+Core.h b/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelBookingData+Core.h new file mode 100644 index 0000000000..853d99aa60 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelBookingData+Core.h @@ -0,0 +1,13 @@ +#import "HotelBookingData.h" + +#include + +NS_ASSUME_NONNULL_BEGIN + +@interface HotelBookingData (Core) + +- (instancetype)initWithHotelInfo:(booking::HotelInfo const &)hotelInfo; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelBookingData.h b/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelBookingData.h new file mode 100644 index 0000000000..c621ba5b04 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelBookingData.h @@ -0,0 +1,41 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface HotelFacility : NSObject + +@property(nonatomic, readonly) NSString *type; +@property(nonatomic, readonly) NSString *name; + +@end + +@interface HotelPhotoUrl : NSObject + +@property(nonatomic, readonly) NSString *original; +@property(nonatomic, readonly) NSString *thumbnail; + +@end + +@interface HotelReview : NSObject + +@property(nonatomic, readonly) NSDate *date; +@property(nonatomic, readonly) float score; +@property(nonatomic, readonly) NSString *author; +@property(nonatomic, readonly, nullable) NSString *pros; +@property(nonatomic, readonly, nullable) NSString *cons; + +@end + +@interface HotelBookingData : NSObject + +@property(nonatomic, readonly) NSString *hotelId; +@property(nonatomic, readonly) NSString *hotelDescription; +@property(nonatomic, readonly) float score; +@property(nonatomic, readonly) NSUInteger scoreCount; +@property(nonatomic, readonly) NSArray *facilities; +@property(nonatomic, readonly) NSArray *photos; +@property(nonatomic, readonly) NSArray *reviews; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelBookingData.mm b/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelBookingData.mm new file mode 100644 index 0000000000..6d231374a8 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelBookingData.mm @@ -0,0 +1,83 @@ +#import "HotelBookingData+Core.h" + +@implementation HotelFacility + +- (instancetype)initWithFacility:(booking::HotelFacility const &)facility { + self = [super init]; + if (self) { + _type = @(facility.m_type.c_str()); + _name = @(facility.m_name.c_str()); + } + return self; +} + +@end + +@implementation HotelPhotoUrl + +- (instancetype)initWithPhotoUrl:(booking::HotelPhotoUrls const &)photoUrl { + self = [super init]; + if (self) { + _original = @(photoUrl.m_original.c_str()); + _thumbnail = @(photoUrl.m_small.c_str()); + } + return self; +} + +@end + +@implementation HotelReview + +- (instancetype)initWithHotelReview:(booking::HotelReview const &)review { + self = [super init]; + if (self) { + auto seconds = std::chrono::duration_cast(review.m_date.time_since_epoch()).count(); + _date = [NSDate dateWithTimeIntervalSince1970:seconds]; + _score = review.m_score; + _author = @(review.m_author.c_str()); + _pros = review.m_pros.empty() ? nil : @(review.m_pros.c_str()); + _cons = review.m_cons.empty() ? nil : @(review.m_cons.c_str()); + } + return self; +} + +@end + +@implementation HotelBookingData + +@end + +@implementation HotelBookingData (Core) + +- (instancetype)initWithHotelInfo:(booking::HotelInfo const &)hotelInfo { + self = [super init]; + if (self) { + _hotelId = @(hotelInfo.m_hotelId.c_str()); + _hotelDescription = @(hotelInfo.m_description.c_str()); + _score = hotelInfo.m_score; + _scoreCount = hotelInfo.m_scoreCount; + NSMutableArray *facilitiesArray = [NSMutableArray arrayWithCapacity:hotelInfo.m_facilities.size()]; + for (auto const &f : hotelInfo.m_facilities) { + HotelFacility *facility = [[HotelFacility alloc] initWithFacility:f]; + [facilitiesArray addObject:facility]; + } + _facilities = [facilitiesArray copy]; + + NSMutableArray *photosArray = [NSMutableArray arrayWithCapacity:hotelInfo.m_photos.size()]; + for (auto const &ph : hotelInfo.m_photos) { + HotelPhotoUrl *photo = [[HotelPhotoUrl alloc] initWithPhotoUrl:ph]; + [photosArray addObject:photo]; + } + _photos = [photosArray copy]; + + NSMutableArray *reviewsArray = [NSMutableArray arrayWithCapacity:hotelInfo.m_reviews.size()]; + for (auto const &r : hotelInfo.m_reviews) { + HotelReview *review = [[HotelReview alloc] initWithHotelReview:r]; + [reviewsArray addObject:review]; + } + _reviews = [reviewsArray copy]; + } + return self; +} + +@end diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelRoom+Core.h b/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelRoom+Core.h new file mode 100644 index 0000000000..9147aab567 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelRoom+Core.h @@ -0,0 +1,13 @@ +#import "HotelRoom.h" + +#include + +NS_ASSUME_NONNULL_BEGIN + +@interface HotelRoom (Core) + +- (instancetype)initWithBlockInfo:(booking::BlockInfo const &)blockInfo; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelRoom.h b/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelRoom.h new file mode 100644 index 0000000000..7f5b5841d4 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelRoom.h @@ -0,0 +1,34 @@ +#import + +typedef NS_ENUM(NSInteger, HotelRoomDealType) { + HotelRoomDealTypeSmart, + HotelRoomDealTypeLastMinute +}; + +NS_ASSUME_NONNULL_BEGIN + +@interface HotelRoomDeal : NSObject + +@property(nonatomic, readonly) NSUInteger discount; +@property(nonatomic, readonly) NSArray *types; + +@end + +@interface HotelRoom : NSObject + +@property(nonatomic, readonly) NSString *offerId; +@property(nonatomic, readonly) NSString *name; +@property(nonatomic, readonly) NSString *roomDescription; +@property(nonatomic, readonly) NSUInteger maxOccupancy; +@property(nonatomic, readonly) double price; +@property(nonatomic, readonly) NSString *currency; +@property(nonatomic, readonly) NSArray *photos; +@property(nonatomic, readonly, nullable) HotelRoomDeal *deal; +@property(nonatomic, readonly, nullable) NSDate *refundableUntil; +@property(nonatomic, readonly) BOOL isBreakfastIncluded; +@property(nonatomic, readonly) BOOL isDepositRequired; +@property(nonatomic, readonly) NSUInteger discount; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelRoom.mm b/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelRoom.mm new file mode 100644 index 0000000000..0630e02a33 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelRoom.mm @@ -0,0 +1,64 @@ +#import "HotelRoom+Core.h" + +static HotelRoomDealType convertDeal(booking::Deals::Type const &dealType) { + switch (dealType) { + case booking::Deals::Type::Smart: + return HotelRoomDealTypeSmart; + case booking::Deals::Type::LastMinute: + return HotelRoomDealTypeLastMinute; + } +} + +@implementation HotelRoomDeal + +- (instancetype)initWithDeal:(booking::Deals const &)deal { + if (deal.m_discount == 0 || deal.m_types.empty()) { + return nil; + } + + self = [super init]; + if (self) { + _discount = deal.m_discount; + NSMutableArray *typesArray = [NSMutableArray arrayWithCapacity:deal.m_types.size()]; + for (auto const &type : deal.m_types) { + NSNumber *n = [NSNumber numberWithInteger:convertDeal(type)]; + [typesArray addObject:n]; + } + _types = [typesArray copy]; + } + return self; +} + +@end + +@implementation HotelRoom + +@end + +@implementation HotelRoom (Core) + +- (instancetype)initWithBlockInfo:(booking::BlockInfo const &)blockInfo { + self = [super init]; + if (self) { + _offerId = @(blockInfo.m_blockId.c_str()); + _name = @(blockInfo.m_name.c_str()); + _roomDescription = @(blockInfo.m_description.c_str()); + _maxOccupancy = blockInfo.m_maxOccupancy; + _price = blockInfo.m_minPrice; + _currency = @(blockInfo.m_currency.c_str()); + _isBreakfastIncluded = blockInfo.m_breakfastIncluded; + _isDepositRequired = blockInfo.m_depositRequired; + _discount = blockInfo.m_deals.m_discount; + _deal = [[HotelRoomDeal alloc] initWithDeal:blockInfo.m_deals]; + auto seconds = std::chrono::duration_cast(blockInfo.m_refundableUntil.time_since_epoch()).count(); + _refundableUntil = seconds > 0 ? [NSDate dateWithTimeIntervalSince1970:seconds] : nil; + NSMutableArray *photosArray = [NSMutableArray arrayWithCapacity:blockInfo.m_photos.size()]; + for (auto const &photo : blockInfo.m_photos) { + [photosArray addObject:@(photo.c_str())]; + } + _photos = [photosArray copy]; + } + return self; +} + +@end diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelRooms+Core.h b/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelRooms+Core.h new file mode 100644 index 0000000000..fd814c45a0 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelRooms+Core.h @@ -0,0 +1,13 @@ +#import "HotelRooms.h" + +#include + +NS_ASSUME_NONNULL_BEGIN + +@interface HotelRooms (Core) + +- (instancetype)initWithBlocks:(booking::Blocks const &)blocks; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelRooms.h b/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelRooms.h new file mode 100644 index 0000000000..e9e1829a81 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelRooms.h @@ -0,0 +1,17 @@ +#import + +@class HotelRoom; + +NS_ASSUME_NONNULL_BEGIN + +@interface HotelRooms : NSObject + +@property(nonatomic, readonly) double minPrice; +@property(nonatomic, readonly) NSString *currency; +@property(nonatomic, readonly) NSUInteger discount; +@property(nonatomic, readonly) BOOL isSmartDeal; +@property(nonatomic, readonly) NSArray *rooms; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelRooms.mm b/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelRooms.mm new file mode 100644 index 0000000000..29c0b4ff55 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Booking/HotelRooms.mm @@ -0,0 +1,27 @@ +#import "HotelRooms+Core.h" +#import "HotelRoom+Core.h" + +@implementation HotelRooms + +@end + +@implementation HotelRooms (Core) + +- (instancetype)initWithBlocks:(booking::Blocks const &)blocks { + self = [super init]; + if (self) { + _minPrice = blocks.m_totalMinPrice; + _currency = @(blocks.m_currency.c_str()); + _discount = blocks.m_maxDiscount; + _isSmartDeal = blocks.m_hasSmartDeal; + NSMutableArray *roomsArray = [NSMutableArray arrayWithCapacity:blocks.m_blocks.size()]; + for (auto const &block : blocks.m_blocks) { + HotelRoom *room = [[HotelRoom alloc] initWithBlockInfo:block]; + [roomsArray addObject:room]; + } + _rooms = roomsArray; + } + return self; +} + +@end diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Catalog/CatalogPromoData+Core.h b/iphone/CoreApi/CoreApi/PlacePageData/Catalog/CatalogPromoData+Core.h new file mode 100644 index 0000000000..ec76154304 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Catalog/CatalogPromoData+Core.h @@ -0,0 +1,13 @@ +#import "CatalogPromoData.h" + +#include + +NS_ASSUME_NONNULL_BEGIN + +@interface CatalogPromoData (Core) + +- (instancetype)initWithCityGallery:(promo::CityGallery const &)cityGallery; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Catalog/CatalogPromoData.h b/iphone/CoreApi/CoreApi/PlacePageData/Catalog/CatalogPromoData.h new file mode 100644 index 0000000000..b305c08b15 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Catalog/CatalogPromoData.h @@ -0,0 +1,15 @@ +#import + +@class CatalogPromoItem; + +NS_ASSUME_NONNULL_BEGIN + +@interface CatalogPromoData : NSObject + +@property(nonatomic, readonly) NSArray *promoItems; +@property(nonatomic, readonly, nullable) NSURL *moreUrl; +@property(nonatomic, readonly) NSString *tagsString; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Catalog/CatalogPromoData.mm b/iphone/CoreApi/CoreApi/PlacePageData/Catalog/CatalogPromoData.mm new file mode 100644 index 0000000000..69841ffa46 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Catalog/CatalogPromoData.mm @@ -0,0 +1,30 @@ +#import "CatalogPromoData+Core.h" + +#import "CatalogPromoItem+Core.h" + +@implementation CatalogPromoData + +@end + +@implementation CatalogPromoData (Core) + +- (instancetype)initWithCityGallery:(promo::CityGallery const &)cityGallery { + self = [super init]; + if (self) { + _tagsString = @(cityGallery.m_category.c_str()); + NSString *urlString = @(cityGallery.m_moreUrl.c_str()); + if (urlString.length > 0) { + _moreUrl = [NSURL URLWithString:urlString]; + } + + NSMutableArray *itemsArray = [NSMutableArray arrayWithCapacity:cityGallery.m_items.size()]; + for (auto const &item : cityGallery.m_items) { + CatalogPromoItem *promoItem = [[CatalogPromoItem alloc] initWithCoreItem:item]; + [itemsArray addObject:promoItem]; + } + _promoItems = [itemsArray copy]; + } + return self; +} + +@end diff --git a/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/CatalogPromo/CatalogPromoItem+Core.h b/iphone/CoreApi/CoreApi/PlacePageData/Catalog/CatalogPromoItem+Core.h similarity index 83% rename from iphone/Maps/UI/PlacePage/PlacePageLayout/Content/CatalogPromo/CatalogPromoItem+Core.h rename to iphone/CoreApi/CoreApi/PlacePageData/Catalog/CatalogPromoItem+Core.h index 442f72191d..e4815bbcb3 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/CatalogPromo/CatalogPromoItem+Core.h +++ b/iphone/CoreApi/CoreApi/PlacePageData/Catalog/CatalogPromoItem+Core.h @@ -1,6 +1,6 @@ #import "CatalogPromoItem.h" -#include "partners_api/promo_api.hpp" +#include NS_ASSUME_NONNULL_BEGIN diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Catalog/CatalogPromoItem.h b/iphone/CoreApi/CoreApi/PlacePageData/Catalog/CatalogPromoItem.h new file mode 100644 index 0000000000..f29e7323cd --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Catalog/CatalogPromoItem.h @@ -0,0 +1,18 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface CatalogPromoItem : NSObject + +@property(nonatomic, readonly) NSString *placeTitle; +@property(nonatomic, readonly) NSString *placeDescription; +@property(nonatomic, readonly) NSString *imageUrl; +@property(nonatomic, readonly) NSString *catalogUrl; +@property(nonatomic, readonly) NSString *guideName; +@property(nonatomic, readonly) NSString *guideAuthor; +@property(nonatomic, readonly) NSString *categoryLabel; +@property(nonatomic, readonly) NSString *hexColor; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Catalog/CatalogPromoItem.mm b/iphone/CoreApi/CoreApi/PlacePageData/Catalog/CatalogPromoItem.mm new file mode 100644 index 0000000000..66d84b1a21 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Catalog/CatalogPromoItem.mm @@ -0,0 +1,25 @@ +#import "CatalogPromoItem+Core.h" + +@implementation CatalogPromoItem + +@end + +@implementation CatalogPromoItem (Core) + +- (instancetype)initWithCoreItem:(promo::CityGallery::Item const &)item { + self = [super init]; + if (self) { + _placeTitle = @(item.m_place.m_name.c_str()); + _placeDescription = @(item.m_place.m_description.c_str()); + _imageUrl = @(item.m_imageUrl.c_str()); + _catalogUrl = @(item.m_url.c_str()); + _guideName = @(item.m_name.c_str()); + _guideAuthor = @(item.m_author.m_name.c_str()); + _categoryLabel = @(item.m_luxCategory.m_name.c_str()); + _hexColor = @(item.m_luxCategory.m_color.c_str()); + } + return self; +} + +@end + diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/IOpeningHoursLocalization.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/IOpeningHoursLocalization.h new file mode 100644 index 0000000000..ad4226a3bb --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/IOpeningHoursLocalization.h @@ -0,0 +1,17 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@protocol IOpeningHoursLocalization + +@property(nonatomic, readonly) NSString *closedString; +@property(nonatomic, readonly) NSString *breakString; +@property(nonatomic, readonly) NSString *twentyFourSevenString; +@property(nonatomic, readonly) NSString *allDayString; +@property(nonatomic, readonly) NSString *dailyString; +@property(nonatomic, readonly) NSString *todayString; +@property(nonatomic, readonly) NSString *dayOffString; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/OpeningHoursCell/MWMOpeningHours.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/MWMOpeningHours.h similarity index 78% rename from iphone/Maps/UI/PlacePage/PlacePageLayout/Content/OpeningHoursCell/MWMOpeningHours.h rename to iphone/CoreApi/CoreApi/PlacePageData/Common/MWMOpeningHours.h index 7d49445281..facfe2f5db 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/OpeningHoursCell/MWMOpeningHours.h +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/MWMOpeningHours.h @@ -1,3 +1,7 @@ +#import + +#import "IOpeningHoursLocalization.h" + #include namespace osmoh @@ -22,10 +26,6 @@ struct Day bool m_isOpen = true; }; +std::vector processRawString(NSString *str, id localization); + } // namespace osmoh - -@interface MWMOpeningHours : NSObject - -+ (std::vector)processRawString:(NSString *)str; - -@end diff --git a/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/OpeningHoursCell/MWMOpeningHours.mm b/iphone/CoreApi/CoreApi/PlacePageData/Common/MWMOpeningHours.mm similarity index 71% rename from iphone/Maps/UI/PlacePage/PlacePageLayout/Content/OpeningHoursCell/MWMOpeningHours.mm rename to iphone/CoreApi/CoreApi/PlacePageData/Common/MWMOpeningHours.mm index cd0705348a..402c14ccf9 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/OpeningHoursCell/MWMOpeningHours.mm +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/MWMOpeningHours.mm @@ -14,7 +14,7 @@ NSString * stringFromTimeSpan(Timespan const & timeSpan) stringFromTime(timeSpan.GetEnd())]; } -NSString * breaksFromClosedTime(TTimespans const & closedTimes) +NSString * breaksFromClosedTime(TTimespans const & closedTimes, id localization) { NSMutableString * breaks = [@"" mutableCopy]; auto const size = closedTimes.size(); @@ -22,13 +22,13 @@ NSString * breaksFromClosedTime(TTimespans const & closedTimes) { if (i) [breaks appendString:@"\n"]; - [breaks appendString:[NSString stringWithFormat:@"%@ %@", L(@"editor_hours_closed"), + [breaks appendString:[NSString stringWithFormat:@"%@ %@", localization.breakString, stringFromTimeSpan(closedTimes[i])]]; } return [breaks copy]; } -void addToday(ui::TimeTable const & tt, std::vector & allDays) +void addToday(ui::TimeTable const & tt, std::vector & allDays, id localization) { NSString * workingDays; NSString * workingTimes; @@ -37,38 +37,38 @@ void addToday(ui::TimeTable const & tt, std::vector & allDays) BOOL const everyDay = isEveryDay(tt); if (tt.IsTwentyFourHours()) { - workingDays = everyDay ? L(@"twentyfour_seven") : L(@"editor_time_allday"); + workingDays = everyDay ? localization.twentyFourSevenString : localization.allDayString; workingTimes = @""; breaks = @""; } else { - workingDays = everyDay ? L(@"daily") : L(@"today"); + workingDays = everyDay ? localization.dailyString : localization.todayString; workingTimes = stringFromTimeSpan(tt.GetOpeningTime()); - breaks = breaksFromClosedTime(tt.GetExcludeTime()); + breaks = breaksFromClosedTime(tt.GetExcludeTime(), localization); } allDays.emplace(allDays.begin(), workingDays, workingTimes, breaks); } -void addClosedToday(std::vector & allDays) +void addClosedToday(std::vector & allDays, id localization) { - allDays.emplace(allDays.begin(), L(@"day_off_today")); + allDays.emplace(allDays.begin(), localization.dayOffString); } -void addDay(ui::TimeTable const & tt, std::vector & allDays) +void addDay(ui::TimeTable const & tt, std::vector & allDays, id localization) { NSString * workingDays = stringFromOpeningDays(tt.GetOpeningDays()); NSString * workingTimes; NSString * breaks; if (tt.IsTwentyFourHours()) { - workingTimes = L(@"editor_time_allday"); + workingTimes = localization.allDayString; } else { workingTimes = stringFromTimeSpan(tt.GetOpeningTime()); - breaks = breaksFromClosedTime(tt.GetExcludeTime()); + breaks = breaksFromClosedTime(tt.GetExcludeTime(), localization); } allDays.emplace_back(workingDays, workingTimes, breaks); } @@ -81,9 +81,9 @@ void addUnhandledDays(ui::OpeningDays const & days, std::vector & allDays) } // namespace -@implementation MWMOpeningHours +namespace osmoh { -+ (std::vector)processRawString:(NSString *)str +std::vector processRawString(NSString *str, id localization) { ui::TimeTableSet timeTableSet; osmoh::OpeningHours oh(str.UTF8String); @@ -110,18 +110,18 @@ void addUnhandledDays(ui::OpeningDays const & days, std::vector & allDays) if (workingDays.find(today) != workingDays.end()) { hasCurrentDay = YES; - addToday(tt, days); + addToday(tt, days, localization); } if (isExtendedSchedule) - addDay(tt, days); + addDay(tt, days, localization); } if (!hasCurrentDay) - addClosedToday(days); + addClosedToday(days, localization); addUnhandledDays(unhandledDays, days); return days; } -@end +} // namespace osmoh diff --git a/iphone/Maps/UI/Editor/OpeningHours/MWMOpeningHoursCommon.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/MWMOpeningHoursCommon.h similarity index 92% rename from iphone/Maps/UI/Editor/OpeningHours/MWMOpeningHoursCommon.h rename to iphone/CoreApi/CoreApi/PlacePageData/Common/MWMOpeningHoursCommon.h index d9bb971075..5ae050c225 100644 --- a/iphone/Maps/UI/Editor/OpeningHours/MWMOpeningHoursCommon.h +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/MWMOpeningHoursCommon.h @@ -1,3 +1,5 @@ +#import + #include "3party/opening_hours/opening_hours.hpp" #include "editor/opening_hours_ui.hpp" #include "base/assert.hpp" diff --git a/iphone/Maps/UI/Editor/OpeningHours/MWMOpeningHoursCommon.mm b/iphone/CoreApi/CoreApi/PlacePageData/Common/MWMOpeningHoursCommon.mm similarity index 100% rename from iphone/Maps/UI/Editor/OpeningHours/MWMOpeningHoursCommon.mm rename to iphone/CoreApi/CoreApi/PlacePageData/Common/MWMOpeningHoursCommon.mm diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/OpeningHours.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/OpeningHours.h new file mode 100644 index 0000000000..4e086c2e78 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/OpeningHours.h @@ -0,0 +1,23 @@ +#import + +#import "IOpeningHoursLocalization.h" + +NS_ASSUME_NONNULL_BEGIN + +@interface WorkingDay : NSObject + +@property(nonatomic, readonly) NSString *workingDays; +@property(nonatomic, readonly) NSString *workingTimes; +@property(nonatomic, readonly) NSString *breaks; + +@end + +@interface OpeningHours : NSObject + +@property(nonatomic, readonly) NSArray *days; + +- (instancetype)initWithRawString:(NSString *)rawString localization:(id)localization; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/OpeningHours.mm b/iphone/CoreApi/CoreApi/PlacePageData/Common/OpeningHours.mm new file mode 100644 index 0000000000..4f85bd79b5 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/OpeningHours.mm @@ -0,0 +1,42 @@ +#import "OpeningHours.h" + +#import "MWMOpeningHours.h" + +@interface WorkingDay () + +@property(nonatomic, copy) NSString *workingDays; +@property(nonatomic, copy) NSString *workingTimes; +@property(nonatomic, copy) NSString *breaks; + +@end + +@implementation WorkingDay + +@end + +@interface OpeningHours () + +@property(nonatomic, strong) NSArray *days; + +@end + +@implementation OpeningHours + +- (instancetype)initWithRawString:(NSString *)rawString localization:(id)localization { + self = [super init]; + if (self) { + auto days = osmoh::processRawString(rawString, localization); + NSMutableArray *array = [NSMutableArray arrayWithCapacity:days.size()]; + for (auto day : days) { + WorkingDay *wd = [[WorkingDay alloc] init]; + wd.workingDays = day.m_workingDays; + wd.workingTimes = day.m_workingTimes.length > 0 ? day.m_workingTimes : localization.closedString; + wd.breaks = day.m_breaks; + [array addObject:wd]; + } + _days = [array copy]; + } + return self; +} + +@end diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageBookmarkData+Core.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageBookmarkData+Core.h new file mode 100644 index 0000000000..f6ec8f73a5 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageBookmarkData+Core.h @@ -0,0 +1,13 @@ +#import "PlacePageBookmarkData.h" + +#include + +NS_ASSUME_NONNULL_BEGIN + +@interface PlacePageBookmarkData (Core) + +- (instancetype)initWithRawData:(place_page::Info const &)rawData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageBookmarkData.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageBookmarkData.h new file mode 100644 index 0000000000..1df7ca545f --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageBookmarkData.h @@ -0,0 +1,17 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface PlacePageBookmarkData : NSObject + +@property(nonatomic, readonly) uint64_t bookmarkId; +@property(nonatomic, readonly) uint64_t bookmarkGroupId; +@property(nonatomic, readonly, nullable) NSString *externalTitle; +@property(nonatomic, readonly, nullable) NSString *bookmarkDescription; +@property(nonatomic, readonly, nullable) NSString *bookmarkCategory; +@property(nonatomic, readonly) BOOL isHtmlDescription; +@property(nonatomic, readonly) BOOL isEditable; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageBookmarkData.mm b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageBookmarkData.mm new file mode 100644 index 0000000000..1e251fd020 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageBookmarkData.mm @@ -0,0 +1,23 @@ +#import "PlacePageBookmarkData+Core.h" + +@implementation PlacePageBookmarkData + +@end + +@implementation PlacePageBookmarkData (Core) + +- (instancetype)initWithRawData:(place_page::Info const &)rawData { + self = [super init]; + if (self) { + _bookmarkId = rawData.GetBookmarkId(); + _bookmarkGroupId = rawData.GetBookmarkCategoryId(); + _externalTitle = rawData.GetSecondaryTitle().empty() ? nil : @(rawData.GetSecondaryTitle().c_str()); + _bookmarkDescription = rawData.IsBookmark() ? @(GetPreferredBookmarkStr(rawData.GetBookmarkData().m_description).c_str()) : nil; + _bookmarkCategory = rawData.IsBookmark() ? @(rawData.GetBookmarkCategoryName().c_str()) : nil; + _isHtmlDescription = strings::IsHTML(GetPreferredBookmarkStr(rawData.GetBookmarkData().m_description)); + _isEditable = GetFramework().GetBookmarkManager().IsEditableBookmark(_bookmarkId); + } + return self; +} + +@end diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData+Core.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData+Core.h new file mode 100644 index 0000000000..97e3a9f950 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData+Core.h @@ -0,0 +1,13 @@ +#import "PlacePageButtonsData.h" + +#include + +NS_ASSUME_NONNULL_BEGIN + +@interface PlacePageButtonsData (Core) + +- (instancetype)initWithRawData:(place_page::Info const &)rawData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData.h new file mode 100644 index 0000000000..9b27b02860 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData.h @@ -0,0 +1,14 @@ +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface PlacePageButtonsData : NSObject + +@property(nonatomic, readonly) BOOL showHotelDescription; +@property(nonatomic, readonly) BOOL showAddPlace; +@property(nonatomic, readonly) BOOL showEditPlace; +@property(nonatomic, readonly) BOOL showAddBusiness; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData.mm b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData.mm new file mode 100644 index 0000000000..fb4ed593f4 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageButtonsData.mm @@ -0,0 +1,28 @@ +#import "PlacePageButtonsData+Core.h" + +@implementation PlacePageButtonsData + +@end + +@implementation PlacePageButtonsData (Core) + +- (instancetype)initWithRawData:(place_page::Info const &)rawData { + self = [super init]; + if (self) { + if (rawData.GetSponsoredType() == place_page::SponsoredType::Booking) { + _showHotelDescription = YES; + } else { + _showAddPlace = rawData.ShouldShowAddPlace(); + _showEditPlace = rawData.ShouldShowEditPlace(); + _showAddBusiness = rawData.ShouldShowAddBusiness(); + } + } + + if (_showHotelDescription || _showAddPlace || _showEditPlace || _showAddBusiness) { + return self; + } else { + return nil; + } +} + +@end diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData+Core.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData+Core.h new file mode 100644 index 0000000000..d50f4c5057 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData+Core.h @@ -0,0 +1,13 @@ +#import "PlacePageInfoData.h" + +#include + +NS_ASSUME_NONNULL_BEGIN + +@interface PlacePageInfoData (Core) + +- (instancetype)initWithRawData:(place_page::Info const &)rawData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.h new file mode 100644 index 0000000000..acb3f26c57 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.h @@ -0,0 +1,29 @@ +#import + +typedef NS_ENUM(NSInteger, PlacePageDataLocalAdsStatus) { + PlacePageDataLocalAdsStatusNotAvailable, + PlacePageDataLocalAdsStatusCandidate, + PlacePageDataLocalAdsStatusCustomer, + PlacePageDataLocalAdsStatusHidden +}; + +NS_ASSUME_NONNULL_BEGIN + +@interface PlacePageInfoData : NSObject + +@property(nonatomic, readonly, nullable) NSString *openingHoursString; +@property(nonatomic, readonly, nullable) NSString *phone; +@property(nonatomic, readonly, nullable) NSURL *phoneUrl; +@property(nonatomic, readonly, nullable) NSString *website; +@property(nonatomic, readonly, nullable) NSString *email; +@property(nonatomic, readonly, nullable) NSString *cuisine; +@property(nonatomic, readonly, nullable) NSString *ppOperator; +@property(nonatomic, readonly, nullable) NSString *address; +@property(nonatomic, readonly, nullable) NSString *rawCoordinates; +@property(nonatomic, readonly, nullable) NSString *formattedCoordinates; +@property(nonatomic, readonly) BOOL wifiAvailable; +@property(nonatomic, readonly) PlacePageDataLocalAdsStatus localAdsStatus; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.mm b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.mm new file mode 100644 index 0000000000..b167f60859 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.mm @@ -0,0 +1,77 @@ +#import "PlacePageInfoData+Core.h" + +#import "OpeningHours.h" + +#include "map/place_page_info.hpp" + +using namespace place_page; +using namespace osm; + +static PlacePageDataLocalAdsStatus convertLocalAdsStatus(LocalAdsStatus status) { + switch (status) { + case LocalAdsStatus::NotAvailable: + return PlacePageDataLocalAdsStatusNotAvailable; + case LocalAdsStatus::Candidate: + return PlacePageDataLocalAdsStatusCandidate; + case LocalAdsStatus::Customer: + return PlacePageDataLocalAdsStatusCustomer; + case LocalAdsStatus::Hidden: + return PlacePageDataLocalAdsStatusHidden; + } +} + +@implementation PlacePageInfoData + +@end + +@implementation PlacePageInfoData (Core) + +- (instancetype)initWithRawData:(Info const &)rawData { + self = [super init]; + if (self) { + auto availableProperties = rawData.AvailableProperties(); + for (auto property : availableProperties) { + switch (property) { + case Props::OpeningHours: + _openingHoursString = @(rawData.GetOpeningHours().c_str()); + break; + case Props::Phone: { + _phone = @(rawData.GetPhone().c_str()); + NSString *filteredDigits = [[_phone componentsSeparatedByCharactersInSet: + [[NSCharacterSet decimalDigitCharacterSet] invertedSet]] + componentsJoinedByString:@""]; + NSString *resultNumber = [_phone hasPrefix:@"+"] ? [NSString stringWithFormat:@"+%@", filteredDigits] : filteredDigits; + _phoneUrl = [NSURL URLWithString:[NSString stringWithFormat:@"tel://%@", resultNumber]]; + break; + } + case Props::Website: + if (rawData.GetSponsoredType() != SponsoredType::Booking) { + _website = @(rawData.GetWebsite().c_str()); + } + break; + case Props::Email: + _email = @(rawData.GetEmail().c_str()); + break; + case Props::Cuisine: + _cuisine = @(strings::JoinStrings(rawData.GetLocalizedCuisines(), Info::kSubtitleSeparator).c_str()); + break; + case Props::Operator: + _ppOperator = @(rawData.GetOperator().c_str()); + break; + case Props::Internet: + _wifiAvailable = YES; + break; + default: + break; + } + } + + _address = rawData.GetAddress().empty() ? nil : @(rawData.GetAddress().c_str()); + _rawCoordinates = @(rawData.GetFormattedCoordinate(true).c_str()); + _formattedCoordinates = @(rawData.GetFormattedCoordinate(false).c_str()); + _localAdsStatus = convertLocalAdsStatus(rawData.GetLocalAdsStatus()); + } + return self; +} + +@end diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePagePreviewData+Core.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePagePreviewData+Core.h new file mode 100644 index 0000000000..ed5dbfc063 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePagePreviewData+Core.h @@ -0,0 +1,13 @@ +#import "PlacePagePreviewData.h" + +#include + +NS_ASSUME_NONNULL_BEGIN + +@interface PlacePagePreviewData (Core) + +- (instancetype)initWithRawData:(place_page::Info const &)rawData; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePagePreviewData.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePagePreviewData.h new file mode 100644 index 0000000000..3043887add --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePagePreviewData.h @@ -0,0 +1,43 @@ +#import + +@class PlacePageScheduleData; +@class UgcSummaryRating; + +typedef NS_ENUM(NSInteger, PlacePageDataHotelType) { + PlacePageDataHotelTypeHotel, + PlacePageDataHotelTypeApartment, + PlacePageDataHotelTypeCampSite, + PlacePageDataHotelTypeChalet, + PlacePageDataHotelTypeGuestHouse, + PlacePageDataHotelTypeHostel, + PlacePageDataHotelTypeMotel, + PlacePageDataHotelTypeResort, + PlacePageDataHotelTypeNone +}; + +typedef NS_ENUM(NSInteger, PlacePageDataSchedule) { + PlacePageDataOpeningHoursAllDay, + PlacePageDataOpeningHoursOpen, + PlacePageDataOpeningHoursClosed, + PlacePageDataOpeningHoursUnknown +}; + +NS_ASSUME_NONNULL_BEGIN + +@interface PlacePagePreviewData : NSObject + +@property(nonatomic, readonly, nullable) NSString *title; +@property(nonatomic, readonly, nullable) NSString *subtitle; +@property(nonatomic, readonly, nullable) NSString *address; +@property(nonatomic, readonly, nullable) NSString *pricing; +@property(nonatomic, readonly) PlacePageDataSchedule schedule; +@property(nonatomic, readonly) PlacePageDataHotelType hotelType; +@property(nonatomic, readonly) BOOL hasBanner; +@property(nonatomic, readonly) BOOL isPopular; +@property(nonatomic, readonly) BOOL isBookingPlace; +@property(nonatomic, readonly) BOOL showUgc; +//@property(nonatomic, readonly, nullable) UgcSummaryRating *ugcSummaryRating; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePagePreviewData.mm b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePagePreviewData.mm new file mode 100644 index 0000000000..83565e6b57 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePagePreviewData.mm @@ -0,0 +1,80 @@ +#import "PlacePagePreviewData+Core.h" + +#import "UgcSummaryRating.h" + +#include "3party/opening_hours/opening_hours.hpp" + +static PlacePageDataSchedule convertOpeningHours(std::string rawOpeningHours) { + if (rawOpeningHours.empty()) + return PlacePageDataOpeningHoursUnknown; + + osmoh::OpeningHours oh(rawOpeningHours); + if (!oh.IsValid()) { + return PlacePageDataOpeningHoursUnknown; + } + if (oh.IsTwentyFourHours()) { + return PlacePageDataOpeningHoursAllDay; + } + + auto const t = time(nullptr); + if (oh.IsOpen(t)) { + return PlacePageDataOpeningHoursOpen; + } + if (oh.IsClosed(t)) { + return PlacePageDataOpeningHoursClosed; + } + + return PlacePageDataOpeningHoursUnknown; +} + +static PlacePageDataHotelType convertHotelType(boost::optional hotelType) { + if (!hotelType.has_value()) { + return PlacePageDataHotelTypeNone; + } + + switch (hotelType.get()) { + case ftypes::IsHotelChecker::Type::Hotel: + return PlacePageDataHotelTypeHotel; + case ftypes::IsHotelChecker::Type::Apartment: + return PlacePageDataHotelTypeApartment; + case ftypes::IsHotelChecker::Type::CampSite: + return PlacePageDataHotelTypeCampSite; + case ftypes::IsHotelChecker::Type::Chalet: + return PlacePageDataHotelTypeChalet; + case ftypes::IsHotelChecker::Type::GuestHouse: + return PlacePageDataHotelTypeGuestHouse; + case ftypes::IsHotelChecker::Type::Hostel: + return PlacePageDataHotelTypeHostel; + case ftypes::IsHotelChecker::Type::Motel: + return PlacePageDataHotelTypeMotel; + case ftypes::IsHotelChecker::Type::Resort: + return PlacePageDataHotelTypeResort; + case ftypes::IsHotelChecker::Type::Count: + return PlacePageDataHotelTypeNone; + } +} + +@implementation PlacePagePreviewData + +@end + +@implementation PlacePagePreviewData (Core) + +- (instancetype)initWithRawData:(place_page::Info const &)rawData { + self = [super init]; + if (self) { + _title = rawData.GetTitle().empty() ? nil : @(rawData.GetTitle().c_str()); + _subtitle = rawData.GetSubtitle().empty() ? nil : @(rawData.GetSubtitle().c_str()); + _address = rawData.GetAddress().empty() ? nil : @(rawData.GetAddress().c_str()); + _pricing = rawData.GetApproximatePricing().empty() ? nil : @(rawData.GetApproximatePricing().c_str()); + _hasBanner = rawData.HasBanner(); + _isPopular = rawData.GetPopularity() > 0; + _isBookingPlace = rawData.GetSponsoredType() == place_page::SponsoredType::Booking; + _schedule = convertOpeningHours(rawData.GetOpeningHours()); + _hotelType = convertHotelType(rawData.GetHotelType()); + _showUgc = rawData.ShouldShowUGC(); + } + return self; +} + +@end diff --git a/iphone/CoreApi/CoreApi/PlacePageData/PlacePageData.h b/iphone/CoreApi/CoreApi/PlacePageData/PlacePageData.h new file mode 100644 index 0000000000..8612966f53 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/PlacePageData.h @@ -0,0 +1,63 @@ +#import +#import + +#import "MWMTypes.h" + +@class PlacePageButtonsData; +@class PlacePagePreviewData; +@class PlacePageInfoData; +@class PlacePageBookmarkData; +@class CatalogPromoData; +@class HotelBookingData; +@class HotelRooms; +@class UgcData; + +typedef NS_ENUM(NSInteger, PlacePageSponsoredType) { + PlacePageSponsoredTypeNone, + PlacePageSponsoredTypeBooking, + PlacePageSponsoredTypeOpentable, + PlacePageSponsoredTypePartner, + PlacePageSponsoredTypeHoliday, + PlacePageSponsoredTypePromoCatalogCity, + PlacePageSponsoredTypePromoCatalogSightseeings, + PlacePageSponsoredTypePromoCatalogOutdoor +}; + +typedef NS_ENUM(NSInteger, PlacePageTaxiProvider) { + PlacePageTaxiProviderNone, + PlacePageTaxiProviderUber, + PlacePageTaxiProviderYandex, + PlacePageTaxiProviderMaxim, + PlacePageTaxiProviderRutaxi +}; + +NS_ASSUME_NONNULL_BEGIN + +@interface PlacePageData : NSObject + +@property(nonatomic, readonly, nullable) PlacePageButtonsData *buttonsData; +@property(nonatomic, readonly) PlacePagePreviewData *previewData; +@property(nonatomic, readonly) PlacePageInfoData *infoData; +@property(nonatomic, readonly, nullable) PlacePageBookmarkData *bookmarkData; +@property(nonatomic, readonly) PlacePageSponsoredType sponsoredType; +@property(nonatomic, readonly) PlacePageTaxiProvider taxiProvider; +@property(nonatomic, readonly, nullable) NSString *wikiDescriptionHtml; +@property(nonatomic, readonly, nullable) CatalogPromoData *catalogPromo; +@property(nonatomic, readonly, nullable) HotelBookingData *hotelBooking; +@property(nonatomic, readonly, nullable) HotelRooms *hotelRooms; +@property(nonatomic, readonly, nullable) UgcData *ugcData; +@property(nonatomic, readonly, nullable) NSString *bookingSearchUrl; +@property(nonatomic, readonly) BOOL isLargeToponim; +@property(nonatomic, readonly) BOOL isSightseeing; +@property(nonatomic, readonly) BOOL isPromoCatalog; +@property(nonatomic, readonly) BOOL shouldShowUgc; +@property(nonatomic, readonly) BOOL isMyPosition; +@property(nonatomic, readonly) CLLocationCoordinate2D locationCoordinate; + +- (void)loadOnlineDataWithCompletion:(MWMVoidBlock)completion; +- (void)loadUgcWithCompletion:(MWMVoidBlock)completion; +- (void)loadCatalogPromoWithCompletion:(MWMVoidBlock)completion; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/PlacePageData.mm b/iphone/CoreApi/CoreApi/PlacePageData/PlacePageData.mm new file mode 100644 index 0000000000..818ec8986e --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/PlacePageData.mm @@ -0,0 +1,216 @@ +#import "PlacePageData.h" + +#import "PlacePageButtonsData+Core.h" +#import "PlacePagePreviewData+Core.h" +#import "PlacePageInfoData+Core.h" +#import "PlacePageBookmarkData+Core.h" +#import "CatalogPromoData+Core.h" +#import "HotelBookingData+Core.h" +#import "HotelRooms+Core.h" +#import "UgcData+Core.h" + +#include +#include "platform/network_policy.hpp" + +static place_page::Info & rawData() { return GetFramework().GetCurrentPlacePageInfo(); } + +static PlacePageSponsoredType convertSponsoredType(place_page::SponsoredType sponsoredType) { + switch (sponsoredType) { + case place_page::SponsoredType::None: + return PlacePageSponsoredTypeNone; + case place_page::SponsoredType::Booking: + return PlacePageSponsoredTypeBooking; + case place_page::SponsoredType::Opentable: + return PlacePageSponsoredTypeOpentable; + case place_page::SponsoredType::Partner: + return PlacePageSponsoredTypePartner; + case place_page::SponsoredType::Holiday: + return PlacePageSponsoredTypeHoliday; + case place_page::SponsoredType::PromoCatalogCity: + return PlacePageSponsoredTypePromoCatalogCity; + case place_page::SponsoredType::PromoCatalogSightseeings: + return PlacePageSponsoredTypePromoCatalogSightseeings; + case place_page::SponsoredType::PromoCatalogOutdoor: + return PlacePageSponsoredTypePromoCatalogOutdoor; + } +} + +static PlacePageTaxiProvider convertTaxiProvider(taxi::Provider::Type providerType) { + switch (providerType) { + case taxi::Provider::Uber: + return PlacePageTaxiProviderUber; + case taxi::Provider::Yandex: + return PlacePageTaxiProviderYandex; + case taxi::Provider::Maxim: + return PlacePageTaxiProviderMaxim; + case taxi::Provider::Rutaxi: + return PlacePageTaxiProviderRutaxi; + case taxi::Provider::Count: + return PlacePageTaxiProviderNone; + } +} + +@implementation PlacePageData + +- (instancetype)init { + self = [super init]; + if (self) { + _buttonsData = [[PlacePageButtonsData alloc] initWithRawData:rawData()]; + _previewData = [[PlacePagePreviewData alloc] initWithRawData:rawData()]; + _infoData = [[PlacePageInfoData alloc] initWithRawData:rawData()]; + + if (rawData().IsBookmark()) { + _bookmarkData = [[PlacePageBookmarkData alloc] initWithRawData:rawData()]; + } + + NSString *descr = @(rawData().GetDescription().c_str()); + if (descr.length > 0) { + _wikiDescriptionHtml = [NSString stringWithFormat:@"%@", descr]; + } + + _sponsoredType = convertSponsoredType(rawData().GetSponsoredType()); + + auto const &taxiProviders = rawData().ReachableByTaxiProviders(); + if (!taxiProviders.empty()) { + _taxiProvider = convertTaxiProvider(taxiProviders.front()); + } + + _isLargeToponim = rawData().GetSponsoredType() == place_page::SponsoredType::PromoCatalogCity; + _isSightseeing = rawData().GetSponsoredType() == place_page::SponsoredType::PromoCatalogSightseeings; + _isPromoCatalog = _isLargeToponim || _isSightseeing; + _shouldShowUgc = rawData().ShouldShowUGC(); + _isMyPosition = rawData().IsMyPosition(); + _bookingSearchUrl = rawData().GetBookingSearchUrl().empty() ? nil : @(rawData().GetBookingSearchUrl().c_str()); + auto latlon = rawData().GetLatLon(); + _locationCoordinate = CLLocationCoordinate2DMake(latlon.m_lat, latlon.m_lon); + } + return self; +} + +- (void)loadOnlineDataWithCompletion:(MWMVoidBlock)completion { + dispatch_group_t group = dispatch_group_create(); + if (self.previewData.isBookingPlace) { + dispatch_group_enter(group); + [self loadBookingDataWithCompletion:^{ + dispatch_group_leave(group); + }]; + + dispatch_group_enter(group); + [self loadHotelRoomsWithCompletion:^{ + dispatch_group_leave(group); + }]; + } + + dispatch_group_notify(group, dispatch_get_main_queue(), ^{ + completion(); + }); +} + +- (void)loadUgcWithCompletion:(MWMVoidBlock)completion { + __weak __typeof(self) wSelf = self; + GetFramework().GetUGC(rawData().GetID(), [wSelf, completion] (ugc::UGC const & ugc, ugc::UGCUpdate const & update) { + __strong __typeof(wSelf) self = wSelf; + if (self == nil) { + completion(); + return; + } + + _ugcData = [[UgcData alloc] initWithUgc:ugc ugcUpdate:update]; + completion(); + }); +} + +- (void)loadCatalogPromoWithCompletion:(MWMVoidBlock)completion { + auto const api = GetFramework().GetPromoApi(platform::GetCurrentNetworkPolicy()); + if (!api) { + completion(); + return; + } + + __weak __typeof(self) wSelf = self; + auto const resultHandler = [wSelf, completion](promo::CityGallery const &cityGallery) { + __strong __typeof(wSelf) self = wSelf; + if (self == nil) { + completion(); + return; + } + + _catalogPromo = [[CatalogPromoData alloc] initWithCityGallery:cityGallery]; + completion(); + }; + + auto const errorHandler = [completion]() { + completion(); + }; + + auto locale = AppInfo.sharedInfo.twoLetterLanguageId.UTF8String; + if (self.isLargeToponim) { + api->GetCityGallery(rawData().GetMercator(), locale, UTM::LargeToponymsPlacepageGallery, resultHandler, errorHandler); + } else { + api->GetPoiGallery(rawData().GetMercator(), + locale, + rawData().GetRawTypes(), + [MWMFrameworkHelper isWiFiConnected], + UTM::SightseeingsPlacepageGallery, + resultHandler, + errorHandler); + } +} + +#pragma mark - Private + +- (void)loadBookingDataWithCompletion:(MWMVoidBlock)completion { + auto api = GetFramework().GetBookingApi(platform::GetCurrentNetworkPolicy()); + if (!api) { + dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0), ^{ + completion(); + }); + return; + } + + std::string const hotelId = rawData().GetMetadata().Get(feature::Metadata::FMD_SPONSORED_ID); + __weak __typeof(self) wSelf = self; + api->GetHotelInfo(hotelId, + [[AppInfo sharedInfo] twoLetterLanguageId].UTF8String, + [wSelf, hotelId, completion] (booking::HotelInfo const & hotelInfo) { + __strong __typeof(wSelf) self = wSelf; + if (self == nil || hotelId != hotelInfo.m_hotelId) { + completion(); + return; + } + + _hotelBooking = [[HotelBookingData alloc] initWithHotelInfo:hotelInfo]; + completion(); + }); +} + +- (void)loadHotelRoomsWithCompletion:(MWMVoidBlock)completion { + auto api = GetFramework().GetBookingApi(platform::GetCurrentNetworkPolicy()); + if (!api) { + dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0), ^{ + completion(); + }); + return; + } + + std::string const currency = "RUB"; + + auto params = booking::BlockParams::MakeDefault(); + params.m_hotelId = rawData().GetMetadata().Get(feature::Metadata::FMD_SPONSORED_ID); + params.m_currency = currency; + + __weak __typeof(self) wSelf = self; + api->GetBlockAvailability(std::move(params), + [wSelf, currency, completion] (std::string const &hotelId, booking::Blocks const &blocks) { + __strong __typeof(wSelf) self = wSelf; + if (self == nil || currency != blocks.m_currency) { + completion(); + return; + } + + _hotelRooms = [[HotelRooms alloc] initWithBlocks:blocks]; + completion(); + }); +} + +@end diff --git a/iphone/CoreApi/CoreApi/PlacePageData/UGC/UgcData+Core.h b/iphone/CoreApi/CoreApi/PlacePageData/UGC/UgcData+Core.h new file mode 100644 index 0000000000..c325eab2dc --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/UGC/UgcData+Core.h @@ -0,0 +1,13 @@ +#import "UgcData.h" + +#include + +NS_ASSUME_NONNULL_BEGIN + +@interface UgcData (Core) + +- initWithUgc:(ugc::UGC const &)ugc ugcUpdate:(ugc::UGCUpdate const &)update; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/UGC/UgcData.h b/iphone/CoreApi/CoreApi/PlacePageData/UGC/UgcData.h new file mode 100644 index 0000000000..896d9898da --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/UGC/UgcData.h @@ -0,0 +1,45 @@ +#import + +@class UgcSummaryRating; + +NS_ASSUME_NONNULL_BEGIN + +@interface UgcStarRating : NSObject + +@property(nonatomic, readonly) NSString *title; +@property(nonatomic, readonly) float value; + +@end + +@interface UgcReview : NSObject + +@property(nonatomic, readonly) uint64_t reviewId; +@property(nonatomic, readonly) NSString *author; +@property(nonatomic, readonly) NSString *text; +@property(nonatomic, readonly) float rating; +@property(nonatomic, readonly) NSDate *date; + +@end + +@interface UgcMyReview : NSObject + +@property(nonatomic, readonly) NSString *text; +@property(nonatomic, readonly) NSArray *starRatings; +@property(nonatomic, readonly) NSDate *date; + +@end + +@interface UgcData : NSObject + +@property(nonatomic, readonly) BOOL isEmpty; +@property(nonatomic, readonly) BOOL isUpdateEmpty; +@property(nonatomic, readonly) BOOL isTotalRatingEmpty; +@property(nonatomic, readonly) NSUInteger ratingsCount; +@property(nonatomic, readonly, nullable) UgcSummaryRating *summaryRating; +@property(nonatomic, readonly) NSArray *starRatings; +@property(nonatomic, readonly) NSArray *reviews; +@property(nonatomic, readonly, nullable) UgcMyReview *myReview; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/UGC/UgcData.mm b/iphone/CoreApi/CoreApi/PlacePageData/UGC/UgcData.mm new file mode 100644 index 0000000000..a975811ae1 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/UGC/UgcData.mm @@ -0,0 +1,99 @@ +#import "UgcData+Core.h" + +#import "UgcSummaryRating.h" + +using namespace place_page; + +@implementation UgcStarRating + +- (instancetype)initWithRating:(ugc::RatingRecord const &)ratingRecord { + self = [super init]; + if (self) { + _title = @(ratingRecord.m_key.m_key.c_str()); + _value = ratingRecord.m_value; + } + return self; +} + +@end + +@implementation UgcReview + +- (instancetype)initWithReview:(ugc::Review const &)review { + self = [super init]; + if (self) { + _reviewId = review.m_id; + _author = @(review.m_author.c_str()); + _text = @(review.m_text.m_text.c_str()); + _rating = review.m_rating; + auto seconds = std::chrono::duration_cast(review.m_time.time_since_epoch()).count(); + _date = [NSDate dateWithTimeIntervalSince1970:seconds]; + } + return self; +} + +@end + +@implementation UgcMyReview + +- (instancetype)initWithUgcUpdate:(ugc::UGCUpdate const &)ugcUpdate { + self = [super init]; + if (self) { + _text = @(ugcUpdate.m_text.m_text.c_str()); + auto seconds = std::chrono::duration_cast(ugcUpdate.m_time.time_since_epoch()).count(); + _date = [NSDate dateWithTimeIntervalSince1970:seconds]; + + NSMutableArray *ratingsArray = [NSMutableArray arrayWithCapacity:ugcUpdate.m_ratings.size()]; + for (auto const &r : ugcUpdate.m_ratings) { + UgcStarRating *rating = [[UgcStarRating alloc] initWithRating:r]; + [ratingsArray addObject:rating]; + } + _starRatings = [ratingsArray copy]; + } + return self; +} + +@end + +@implementation UgcData + +@end + +@implementation UgcData (Core) + +- initWithUgc:(ugc::UGC const &)ugc ugcUpdate:(ugc::UGCUpdate const &)update { + self = [super init]; + if (self) { + _isEmpty = ugc.IsEmpty(); + _isUpdateEmpty = update.IsEmpty(); + _isTotalRatingEmpty = ugc.m_totalRating == kIncorrectRating; + _ratingsCount = ugc.m_basedOn; + + if (!_isTotalRatingEmpty) { + _summaryRating = [[UgcSummaryRating alloc] initWithRating:ugc.m_totalRating]; + } + + if (!_isUpdateEmpty) { + _myReview = [[UgcMyReview alloc] initWithUgcUpdate:update]; + } + + NSMutableArray *ratingsArray = [NSMutableArray arrayWithCapacity:ugc.m_ratings.size()]; + for (auto const &r : ugc.m_ratings) { + UgcStarRating *rating = [[UgcStarRating alloc] initWithRating:r]; + [ratingsArray addObject:rating]; + } + _starRatings = [ratingsArray copy]; + + NSMutableArray *reviewsArray = [NSMutableArray arrayWithCapacity:ugc.m_reviews.size()]; + for (auto const &r : ugc.m_reviews) { + UgcReview *review = [[UgcReview alloc] initWithReview:r]; + [reviewsArray addObject:review]; + } + _reviews = [reviewsArray copy]; + } + return self; +} + +@end + + diff --git a/iphone/CoreApi/CoreApi/PlacePageData/UGC/UgcSummaryRating.h b/iphone/CoreApi/CoreApi/PlacePageData/UGC/UgcSummaryRating.h new file mode 100644 index 0000000000..c96d46811f --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/UGC/UgcSummaryRating.h @@ -0,0 +1,23 @@ +#import + +typedef NS_ENUM(NSInteger, UgcSummaryRatingType) { + UgcSummaryRatingTypeNone, + UgcSummaryRatingTypeHorrible, + UgcSummaryRatingTypeBad, + UgcSummaryRatingTypeNormal, + UgcSummaryRatingTypeGood, + UgcSummaryRatingTypeExcellent +}; + +NS_ASSUME_NONNULL_BEGIN + +@interface UgcSummaryRating : NSObject + +@property(nonatomic, readonly) NSString *ratingString; +@property(nonatomic, readonly) UgcSummaryRatingType ratingType; + +- (instancetype)initWithRating:(float)ratingValue; + +@end + +NS_ASSUME_NONNULL_END diff --git a/iphone/CoreApi/CoreApi/PlacePageData/UGC/UgcSummaryRating.mm b/iphone/CoreApi/CoreApi/PlacePageData/UGC/UgcSummaryRating.mm new file mode 100644 index 0000000000..dd5131b254 --- /dev/null +++ b/iphone/CoreApi/CoreApi/PlacePageData/UGC/UgcSummaryRating.mm @@ -0,0 +1,36 @@ +#import "UgcSummaryRating.h" + +#include + +using namespace place_page; + +static UgcSummaryRatingType convertRatingType(rating::Impress impress) { + switch (impress) { + case rating::None: + return UgcSummaryRatingTypeNone; + case rating::Horrible: + return UgcSummaryRatingTypeHorrible; + case rating::Bad: + return UgcSummaryRatingTypeBad; + case rating::Normal: + return UgcSummaryRatingTypeNormal; + case rating::Good: + return UgcSummaryRatingTypeGood; + case rating::Excellent: + return UgcSummaryRatingTypeExcellent; + } +} + +@implementation UgcSummaryRating + +- (instancetype)initWithRating:(float)ratingValue { + self = [super init]; + if (self) { + _ratingString = @(rating::GetRatingFormatted(ratingValue).c_str()); + _ratingType = convertRatingType(rating::GetImpress(ratingValue)); + } + return self; +} + +@end + diff --git a/iphone/Maps/Bridging-Header.h b/iphone/Maps/Bridging-Header.h index 268f4e902c..532f9b0ff7 100644 --- a/iphone/Maps/Bridging-Header.h +++ b/iphone/Maps/Bridging-Header.h @@ -24,7 +24,6 @@ #import "BookmarksVC.h" #import "FacebookNativeAdAdapter.h" -#import "CatalogPromoItem.h" #import "CoreNotificationWrapper.h" #import "MapViewController.h" #import "MWMActivityViewController.h" diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj index 460d028c09..371bb2e0c5 100644 --- a/iphone/Maps/Maps.xcodeproj/project.pbxproj +++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj @@ -342,6 +342,9 @@ 45A37B9E20B33F5E005FBDBB /* FBAudienceNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 45A37B9D20B33F5D005FBDBB /* FBAudienceNetwork.framework */; }; 45CBCCBA20590AAB006B55C2 /* libkml.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 45CBCCBB20590AAB006B55C2 /* libkml.a */; }; 45FFD65D1E965EBE00DB854E /* liblocal_ads.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 45FFD65C1E965EBE00DB854E /* liblocal_ads.a */; }; + 4707E4B12372FE860017DF6E /* PlacePageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4707E4AF2372FE860017DF6E /* PlacePageViewController.swift */; }; + 4707E4B42372FF480017DF6E /* PlacePage.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 4707E4B32372FF480017DF6E /* PlacePage.storyboard */; }; + 4707E4B62375B2900017DF6E /* PlacePageInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4707E4B52375B2900017DF6E /* PlacePageInfoViewController.swift */; }; 470A89FD21342A9D00D72FBF /* TutorialBlurView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 470A89FC21342A9D00D72FBF /* TutorialBlurView.swift */; }; 470A89FF2134517600D72FBF /* BookmarksTutorialBlur.xib in Resources */ = {isa = PBXBuildFile; fileRef = 470A89FE2134517600D72FBF /* BookmarksTutorialBlur.xib */; }; 470A8A012136097000D72FBF /* SubwayTutorialBlur.xib in Resources */ = {isa = PBXBuildFile; fileRef = 470A8A002136073000D72FBF /* SubwayTutorialBlur.xib */; }; @@ -366,8 +369,6 @@ 4728F69322CF89A400E00028 /* GradientView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4728F69222CF89A400E00028 /* GradientView.swift */; }; 472C40E4232A7B9F009AA777 /* CatalogSingleItemCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472C40E2232A7B9F009AA777 /* CatalogSingleItemCell.swift */; }; 472C40E5232A7B9F009AA777 /* CatalogSingleItemCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 472C40E3232A7B9F009AA777 /* CatalogSingleItemCell.xib */; }; - 472C40E8232BA810009AA777 /* CatalogPromoItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 472C40E7232BA810009AA777 /* CatalogPromoItem.m */; }; - 472C40EB232BAE20009AA777 /* CatalogPromoItem+Core.mm in Sources */ = {isa = PBXBuildFile; fileRef = 472C40EA232BAE20009AA777 /* CatalogPromoItem+Core.mm */; }; 472E3F472146BCD30020E412 /* SubscriptionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472E3F462146BCD30020E412 /* SubscriptionManager.swift */; }; 472E3F4A2146C4CD0020E412 /* MWMPurchaseManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 472E3F492146C4CD0020E412 /* MWMPurchaseManager.mm */; }; 472E3F4C2147D5700020E412 /* Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472E3F4B2147D5700020E412 /* Subscription.swift */; }; @@ -757,7 +758,6 @@ F6E2FE161E097BA00083EBEC /* MWMOpeningHoursTimeSelectorTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6E2FC751E097B9F0083EBEC /* MWMOpeningHoursTimeSelectorTableViewCell.xib */; }; F6E2FE191E097BA00083EBEC /* MWMOpeningHoursTimeSpanTableViewCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FC771E097B9F0083EBEC /* MWMOpeningHoursTimeSpanTableViewCell.mm */; }; F6E2FE1C1E097BA00083EBEC /* MWMOpeningHoursTimeSpanTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6E2FC781E097B9F0083EBEC /* MWMOpeningHoursTimeSpanTableViewCell.xib */; }; - F6E2FE1F1E097BA00083EBEC /* MWMOpeningHoursCommon.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FC7A1E097B9F0083EBEC /* MWMOpeningHoursCommon.mm */; }; F6E2FE221E097BA00083EBEC /* MWMOpeningHoursEditorViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FC7D1E097B9F0083EBEC /* MWMOpeningHoursEditorViewController.mm */; }; F6E2FE251E097BA00083EBEC /* MWMOpeningHoursModel.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FC7F1E097B9F0083EBEC /* MWMOpeningHoursModel.mm */; }; F6E2FE281E097BA00083EBEC /* MWMOpeningHoursSection.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FC811E097B9F0083EBEC /* MWMOpeningHoursSection.mm */; }; @@ -778,7 +778,6 @@ F6E2FE6A1E097BA00083EBEC /* MWMPlacePageButtonCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6E2FCB21E097B9F0083EBEC /* MWMPlacePageButtonCell.xib */; }; F6E2FE6D1E097BA00083EBEC /* _MWMOHHeaderCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6E2FCB41E097B9F0083EBEC /* _MWMOHHeaderCell.xib */; }; F6E2FE701E097BA00083EBEC /* _MWMOHSubCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6E2FCB51E097B9F0083EBEC /* _MWMOHSubCell.xib */; }; - F6E2FE731E097BA00083EBEC /* MWMOpeningHours.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FCB71E097B9F0083EBEC /* MWMOpeningHours.mm */; }; F6E2FE761E097BA00083EBEC /* MWMOpeningHoursCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6E2FCB81E097B9F0083EBEC /* MWMOpeningHoursCell.xib */; }; F6E2FE791E097BA00083EBEC /* MWMOpeningHoursLayoutHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FCBA1E097B9F0083EBEC /* MWMOpeningHoursLayoutHelper.mm */; }; F6E2FE7C1E097BA00083EBEC /* MWMPlacePageOpeningHoursCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FCBC1E097B9F0083EBEC /* MWMPlacePageOpeningHoursCell.mm */; }; @@ -1421,6 +1420,9 @@ 46F26CD610F623BA00ECCA39 /* EAGLView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = EAGLView.h; sourceTree = ""; }; 46F26CD710F623BA00ECCA39 /* EAGLView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = EAGLView.mm; sourceTree = ""; }; 46F8A2EB10EB63040045521A /* MapViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = MapViewController.h; sourceTree = ""; }; + 4707E4AF2372FE860017DF6E /* PlacePageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlacePageViewController.swift; sourceTree = ""; }; + 4707E4B32372FF480017DF6E /* PlacePage.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = PlacePage.storyboard; sourceTree = ""; }; + 4707E4B52375B2900017DF6E /* PlacePageInfoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlacePageInfoViewController.swift; sourceTree = ""; }; 470A89FC21342A9D00D72FBF /* TutorialBlurView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TutorialBlurView.swift; sourceTree = ""; }; 470A89FE2134517600D72FBF /* BookmarksTutorialBlur.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = BookmarksTutorialBlur.xib; sourceTree = ""; }; 470A8A002136073000D72FBF /* SubwayTutorialBlur.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SubwayTutorialBlur.xib; sourceTree = ""; }; @@ -1446,10 +1448,6 @@ 4728F69222CF89A400E00028 /* GradientView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = GradientView.swift; path = CustomViews/GradientView.swift; sourceTree = ""; }; 472C40E2232A7B9F009AA777 /* CatalogSingleItemCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CatalogSingleItemCell.swift; sourceTree = ""; }; 472C40E3232A7B9F009AA777 /* CatalogSingleItemCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CatalogSingleItemCell.xib; sourceTree = ""; }; - 472C40E6232BA810009AA777 /* CatalogPromoItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CatalogPromoItem.h; sourceTree = ""; }; - 472C40E7232BA810009AA777 /* CatalogPromoItem.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CatalogPromoItem.m; sourceTree = ""; }; - 472C40E9232BAE20009AA777 /* CatalogPromoItem+Core.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "CatalogPromoItem+Core.h"; sourceTree = ""; }; - 472C40EA232BAE20009AA777 /* CatalogPromoItem+Core.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = "CatalogPromoItem+Core.mm"; sourceTree = ""; }; 472E3F462146BCD30020E412 /* SubscriptionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionManager.swift; sourceTree = ""; }; 472E3F482146C4CD0020E412 /* MWMPurchaseManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMPurchaseManager.h; sourceTree = ""; }; 472E3F492146C4CD0020E412 /* MWMPurchaseManager.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMPurchaseManager.mm; sourceTree = ""; }; @@ -1964,8 +1962,6 @@ F6E2FC761E097B9F0083EBEC /* MWMOpeningHoursTimeSpanTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMOpeningHoursTimeSpanTableViewCell.h; sourceTree = ""; }; F6E2FC771E097B9F0083EBEC /* MWMOpeningHoursTimeSpanTableViewCell.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMOpeningHoursTimeSpanTableViewCell.mm; sourceTree = ""; }; F6E2FC781E097B9F0083EBEC /* MWMOpeningHoursTimeSpanTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMOpeningHoursTimeSpanTableViewCell.xib; sourceTree = ""; }; - F6E2FC791E097B9F0083EBEC /* MWMOpeningHoursCommon.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMOpeningHoursCommon.h; sourceTree = ""; }; - F6E2FC7A1E097B9F0083EBEC /* MWMOpeningHoursCommon.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMOpeningHoursCommon.mm; sourceTree = ""; }; F6E2FC7B1E097B9F0083EBEC /* MWMOpeningHoursEditorCells.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMOpeningHoursEditorCells.h; sourceTree = ""; }; F6E2FC7C1E097B9F0083EBEC /* MWMOpeningHoursEditorViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMOpeningHoursEditorViewController.h; sourceTree = ""; }; F6E2FC7D1E097B9F0083EBEC /* MWMOpeningHoursEditorViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMOpeningHoursEditorViewController.mm; sourceTree = ""; }; @@ -2002,8 +1998,6 @@ F6E2FCB21E097B9F0083EBEC /* MWMPlacePageButtonCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMPlacePageButtonCell.xib; sourceTree = ""; }; F6E2FCB41E097B9F0083EBEC /* _MWMOHHeaderCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = _MWMOHHeaderCell.xib; sourceTree = ""; }; F6E2FCB51E097B9F0083EBEC /* _MWMOHSubCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = _MWMOHSubCell.xib; sourceTree = ""; }; - F6E2FCB61E097B9F0083EBEC /* MWMOpeningHours.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMOpeningHours.h; sourceTree = ""; }; - F6E2FCB71E097B9F0083EBEC /* MWMOpeningHours.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMOpeningHours.mm; sourceTree = ""; }; F6E2FCB81E097B9F0083EBEC /* MWMOpeningHoursCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMOpeningHoursCell.xib; sourceTree = ""; }; F6E2FCB91E097B9F0083EBEC /* MWMOpeningHoursLayoutHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMOpeningHoursLayoutHelper.h; sourceTree = ""; }; F6E2FCBA1E097B9F0083EBEC /* MWMOpeningHoursLayoutHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = MWMOpeningHoursLayoutHelper.mm; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; @@ -3490,10 +3484,6 @@ children = ( 472C40E2232A7B9F009AA777 /* CatalogSingleItemCell.swift */, 472C40E3232A7B9F009AA777 /* CatalogSingleItemCell.xib */, - 472C40E6232BA810009AA777 /* CatalogPromoItem.h */, - 472C40E7232BA810009AA777 /* CatalogPromoItem.m */, - 472C40E9232BAE20009AA777 /* CatalogPromoItem+Core.h */, - 472C40EA232BAE20009AA777 /* CatalogPromoItem+Core.mm */, ); path = CatalogPromo; sourceTree = ""; @@ -4357,8 +4347,6 @@ isa = PBXGroup; children = ( F6E2FC5E1E097B9F0083EBEC /* Cells */, - F6E2FC791E097B9F0083EBEC /* MWMOpeningHoursCommon.h */, - F6E2FC7A1E097B9F0083EBEC /* MWMOpeningHoursCommon.mm */, F6E2FC7B1E097B9F0083EBEC /* MWMOpeningHoursEditorCells.h */, F6E2FC7C1E097B9F0083EBEC /* MWMOpeningHoursEditorViewController.h */, F6E2FC7D1E097B9F0083EBEC /* MWMOpeningHoursEditorViewController.mm */, @@ -4431,6 +4419,9 @@ 4716EACA21B01C270029B886 /* MWMUGCReviewSource.h */, F6E2FC9C1E097B9F0083EBEC /* PlacePageLayout */, 4726254821C27D4B00C7BAAD /* PlacePageDescriptionViewController.swift */, + 4707E4AF2372FE860017DF6E /* PlacePageViewController.swift */, + 4707E4B32372FF480017DF6E /* PlacePage.storyboard */, + 4707E4B52375B2900017DF6E /* PlacePageInfoViewController.swift */, ); path = PlacePage; sourceTree = ""; @@ -4522,8 +4513,6 @@ children = ( F6E2FCB41E097B9F0083EBEC /* _MWMOHHeaderCell.xib */, F6E2FCB51E097B9F0083EBEC /* _MWMOHSubCell.xib */, - F6E2FCB61E097B9F0083EBEC /* MWMOpeningHours.h */, - F6E2FCB71E097B9F0083EBEC /* MWMOpeningHours.mm */, F6E2FCB81E097B9F0083EBEC /* MWMOpeningHoursCell.xib */, F6E2FCB91E097B9F0083EBEC /* MWMOpeningHoursLayoutHelper.h */, F6E2FCBA1E097B9F0083EBEC /* MWMOpeningHoursLayoutHelper.mm */, @@ -5194,6 +5183,7 @@ 34E50DF31F6FCC41008EED49 /* UGCYourReviewCell.xib in Resources */, CDB4D4D7222D248900104869 /* CarPlayStoryboard.storyboard in Resources */, 47C8789122DF525A00A772DA /* SubscriptionSuccessViewController.xib in Resources */, + 4707E4B42372FF480017DF6E /* PlacePage.storyboard in Resources */, 3476B8E11BFDD33A00874594 /* tts-how-to-set-up-voice-img in Resources */, 47C8789E22DF662700A772DA /* SubscriptionExpiredViewController.xib in Resources */, 3476B8DD1BFDD30B00874594 /* tts-how-to-set-up-voice.html in Resources */, @@ -5307,7 +5297,6 @@ 47F86D0120C93D8D00FEE291 /* TabViewController.swift in Sources */, 99536113235DB86C008B218F /* BookmarksSubscriptionDiscountLabel.swift in Sources */, 6741A9A51BF340DE002C974C /* MWMShareActivityItem.mm in Sources */, - F6E2FE1F1E097BA00083EBEC /* MWMOpeningHoursCommon.mm in Sources */, 3454D7B91E07F045004AF2AD /* CALayer+RuntimeAttributes.m in Sources */, 99E2B0232369904800FFABC5 /* WelcomeViewController.swift in Sources */, F6E2FF5D1E097BA00083EBEC /* MWMRecentTrackSettingsController.mm in Sources */, @@ -5492,7 +5481,6 @@ 340475531E081A4600C92850 /* MWMCustomFacebookEvents.mm in Sources */, 349D1CE41E3F836900A878FD /* UIViewController+Hierarchy.swift in Sources */, CDB4D4E1222D70DF00104869 /* CarPlayMapViewController.swift in Sources */, - 472C40EB232BAE20009AA777 /* CatalogPromoItem+Core.mm in Sources */, 471AB98923AA8A3500F56D49 /* IDownloaderDataSource.swift in Sources */, F692F3831EA0FAF5001E82EB /* MWMAutoupdateController.mm in Sources */, 34574A671E3B85F80061E839 /* ThemeManager.swift in Sources */, @@ -5691,6 +5679,7 @@ 34AB66621FC5AA330078E451 /* TransportTransitSeparator.swift in Sources */, CDCA2743223F8D1E00167D87 /* ListItemInfo.swift in Sources */, B32FE74020D2844600EF7446 /* DownloadedBookmarksViewController.swift in Sources */, + 4707E4B62375B2900017DF6E /* PlacePageInfoViewController.swift in Sources */, 340416541E7C09C200E2B6D6 /* PhotoScalingView.swift in Sources */, 4767CDA820AB401000BD8166 /* LinkTextView.swift in Sources */, 47289E5A2212DFFF002ABFC0 /* EditOnWebAlertViewController.swift in Sources */, @@ -5740,6 +5729,7 @@ 3404756E1E081A4600C92850 /* MWMSearch.mm in Sources */, 6741AA191BF340DE002C974C /* MWMDownloaderDialogCell.m in Sources */, 3DE1762422D614B8000214FF /* PromoAfterBookingViewController.swift in Sources */, + 4707E4B12372FE860017DF6E /* PlacePageViewController.swift in Sources */, 34AB66441FC5AA330078E451 /* RouteManagerViewModelProtocol.swift in Sources */, 3486B5081E27A4B50069C126 /* LocalNotificationManager.mm in Sources */, 3454D7BF1E07F045004AF2AD /* DateComponentsFormatter+ETA.swift in Sources */, @@ -5761,7 +5751,6 @@ 3457C4261F680F1900028233 /* String+BoundingRect.swift in Sources */, 34EF94291C05A6F30050B714 /* MWMSegue.m in Sources */, 3430291D1F87BF4400D0A07C /* ReviewsViewController.swift in Sources */, - F6E2FE731E097BA00083EBEC /* MWMOpeningHours.mm in Sources */, CD96C70C22A681C400DB7CFE /* DiscoveryGuideCell.swift in Sources */, 47E3C7312111F4C2008B3B27 /* CoverVerticalPresentationAnimator.swift in Sources */, 99E2B0122368A8C700FFABC5 /* MWMCategory+PlacesCountTitle.swift in Sources */, @@ -5773,7 +5762,6 @@ 34AB661D1FC5AA330078E451 /* MWMTaxiPreviewDataSource.mm in Sources */, F69CE8D61E5C49B4002B5881 /* PPHotelCarouselCell.swift in Sources */, 47B9065321C7FA400079C85E /* MWMImageCache.m in Sources */, - 472C40E8232BA810009AA777 /* CatalogPromoItem.m in Sources */, 993F550A237C622700545511 /* DeepLinkGeoStrategy.swift in Sources */, F6FEA82E1C58F108007223CC /* MWMButton.m in Sources */, 3445324E1F714FD70059FBCC /* UGCAddReviewController.swift in Sources */, diff --git a/iphone/Maps/UI/Editor/OpeningHours/Cells/MWMOpeningHoursAddScheduleTableViewCell.mm b/iphone/Maps/UI/Editor/OpeningHours/Cells/MWMOpeningHoursAddScheduleTableViewCell.mm index e73143bdf2..76310a489b 100644 --- a/iphone/Maps/UI/Editor/OpeningHours/Cells/MWMOpeningHoursAddScheduleTableViewCell.mm +++ b/iphone/Maps/UI/Editor/OpeningHours/Cells/MWMOpeningHoursAddScheduleTableViewCell.mm @@ -1,5 +1,5 @@ #import "MWMOpeningHoursAddScheduleTableViewCell.h" -#import "MWMOpeningHoursCommon.h" +#import @interface MWMOpeningHoursAddScheduleTableViewCell () diff --git a/iphone/Maps/UI/Editor/OpeningHours/MWMOpeningHoursModel.mm b/iphone/Maps/UI/Editor/OpeningHours/MWMOpeningHoursModel.mm index 91e1422cda..568388ba15 100644 --- a/iphone/Maps/UI/Editor/OpeningHours/MWMOpeningHoursModel.mm +++ b/iphone/Maps/UI/Editor/OpeningHours/MWMOpeningHoursModel.mm @@ -1,4 +1,4 @@ -#import "MWMOpeningHoursCommon.h" +#import #import "MWMOpeningHoursModel.h" #include "editor/ui2oh.hpp" diff --git a/iphone/Maps/UI/Editor/OpeningHours/MWMOpeningHoursSection.mm b/iphone/Maps/UI/Editor/OpeningHours/MWMOpeningHoursSection.mm index 392ad9f7f2..0d5b1ed5b8 100644 --- a/iphone/Maps/UI/Editor/OpeningHours/MWMOpeningHoursSection.mm +++ b/iphone/Maps/UI/Editor/OpeningHours/MWMOpeningHoursSection.mm @@ -1,5 +1,5 @@ #import "MWMOpeningHoursSection.h" -#import "MWMOpeningHoursCommon.h" +#import #import "MWMOpeningHoursTableViewCell.h" #import "SwiftBridge.h" diff --git a/iphone/Maps/UI/PlacePage/MWMPlacePageData.mm b/iphone/Maps/UI/PlacePage/MWMPlacePageData.mm index 6df510e0bd..ec03d5858e 100644 --- a/iphone/Maps/UI/PlacePage/MWMPlacePageData.mm +++ b/iphone/Maps/UI/PlacePage/MWMPlacePageData.mm @@ -10,6 +10,8 @@ #include "3party/opening_hours/opening_hours.hpp" +#import + using namespace place_page; namespace @@ -28,6 +30,9 @@ NSString * const kUserDefaultsLatLonAsDMSKey = @"UserDefaultsLatLonAsDMS"; @property(nonatomic) NSInteger bookingDiscount; @property(nonatomic) BOOL isSmartDeal; + +@property(nonatomic, strong) PlacePageData *pd; + @end @implementation MWMPlacePageData @@ -52,6 +57,12 @@ NSString * const kUserDefaultsLatLonAsDMSKey = @"UserDefaultsLatLonAsDMS"; - (void)fillSections { + self.pd = [[PlacePageData alloc] init]; + __weak __typeof(self) ws = self; + [self.pd loadOnlineDataWithCompletion:^{ + NSLog(@"%@", ws); + }]; + m_sections.clear(); m_previewRows.clear(); m_metainfoRows.clear(); diff --git a/iphone/Maps/UI/PlacePage/PlacePage.storyboard b/iphone/Maps/UI/PlacePage/PlacePage.storyboard new file mode 100644 index 0000000000..065ee097f1 --- /dev/null +++ b/iphone/Maps/UI/PlacePage/PlacePage.storyboard @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iphone/Maps/UI/PlacePage/PlacePageInfoViewController.swift b/iphone/Maps/UI/PlacePage/PlacePageInfoViewController.swift new file mode 100644 index 0000000000..6b91f7c732 --- /dev/null +++ b/iphone/Maps/UI/PlacePage/PlacePageInfoViewController.swift @@ -0,0 +1,30 @@ +// +// PlacePageInfoViewController.swift +// MAPS.ME +// +// Created by aleksey.belousov on 08/11/2019. +// Copyright © 2019 MapsWithMe. All rights reserved. +// + +import UIKit + +class PlacePageInfoViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + // Get the new view controller using segue.destination. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/CatalogPromo/CatalogPromoItem+Core.mm b/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/CatalogPromo/CatalogPromoItem+Core.mm deleted file mode 100644 index 73d9afcd51..0000000000 --- a/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/CatalogPromo/CatalogPromoItem+Core.mm +++ /dev/null @@ -1,18 +0,0 @@ -#import "CatalogPromoItem+Core.h" - -@implementation CatalogPromoItem (Core) - -- (instancetype)initWithCoreItem:(promo::CityGallery::Item const &)item { - self = [super init]; - if (self) { - self.placeTitle = @(item.m_place.m_name.c_str()); - self.placeDescription = @(item.m_place.m_description.c_str()); - self.imageUrl = @(item.m_imageUrl.c_str()); - self.catalogUrl = @(item.m_url.c_str()); - self.guideName = @(item.m_name.c_str()); - self.guideAuthor = @(item.m_author.m_name.c_str()); - } - return self; -} - -@end diff --git a/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/CatalogPromo/CatalogPromoItem.h b/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/CatalogPromo/CatalogPromoItem.h deleted file mode 100644 index 04d250ab0b..0000000000 --- a/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/CatalogPromo/CatalogPromoItem.h +++ /dev/null @@ -1,14 +0,0 @@ -NS_ASSUME_NONNULL_BEGIN - -@interface CatalogPromoItem : NSObject - -@property(nonatomic, copy) NSString *placeTitle; -@property(nonatomic, copy) NSString *placeDescription; -@property(nonatomic, copy) NSString *imageUrl; -@property(nonatomic, copy) NSString *catalogUrl; -@property(nonatomic, copy) NSString *guideName; -@property(nonatomic, copy) NSString *guideAuthor; - -@end - -NS_ASSUME_NONNULL_END diff --git a/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/CatalogPromo/CatalogPromoItem.m b/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/CatalogPromo/CatalogPromoItem.m deleted file mode 100644 index 948891369c..0000000000 --- a/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/CatalogPromo/CatalogPromoItem.m +++ /dev/null @@ -1,5 +0,0 @@ -#import "CatalogPromoItem.h" - -@implementation CatalogPromoItem - -@end diff --git a/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/OpeningHoursCell/MWMOpeningHoursLayoutHelper.mm b/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/OpeningHoursCell/MWMOpeningHoursLayoutHelper.mm index 11a2cdf74b..0f6e9ba4dc 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/OpeningHoursCell/MWMOpeningHoursLayoutHelper.mm +++ b/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/OpeningHoursCell/MWMOpeningHoursLayoutHelper.mm @@ -1,5 +1,5 @@ #import "MWMOpeningHoursLayoutHelper.h" -#import "MWMOpeningHours.h" +#import #import "MWMPlacePageData.h" #import "MWMTableViewCell.h" #import "SwiftBridge.h" @@ -135,7 +135,7 @@ NSAttributedString * richStringFromDay(osmoh::Day const & day, BOOL isClosedNow) self.data = data; self.rawString = [data stringForRow:place_page::MetainfoRows::OpeningHours]; self.isClosed = [data schedule] == place_page::OpeningHours::Closed; - m_days = [MWMOpeningHours processRawString:self.rawString]; + m_days = osmoh::processRawString(self.rawString, nil); } - (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath diff --git a/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/OpeningHoursCell/MWMPlacePageOpeningHoursCell.mm b/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/OpeningHoursCell/MWMPlacePageOpeningHoursCell.mm index 9e6b900d27..ac0da220b4 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/OpeningHoursCell/MWMPlacePageOpeningHoursCell.mm +++ b/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/OpeningHoursCell/MWMPlacePageOpeningHoursCell.mm @@ -1,6 +1,6 @@ #import "MWMPlacePageOpeningHoursCell.h" #import -#import "MWMOpeningHoursCommon.h" +#import #import "MWMPlacePageOpeningHoursDayView.h" #import "UIImageView+Coloring.h" diff --git a/iphone/Maps/UI/PlacePage/PlacePageLayout/MWMPlacePageLayout.mm b/iphone/Maps/UI/PlacePage/PlacePageLayout/MWMPlacePageLayout.mm index e7fbbc5699..802e593c02 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageLayout/MWMPlacePageLayout.mm +++ b/iphone/Maps/UI/PlacePage/PlacePageLayout/MWMPlacePageLayout.mm @@ -1,4 +1,3 @@ -#import "CatalogPromoItem+Core.h" #import "MWMPlacePageLayout.h" #import "MWMBookmarkCell.h" #import "MWMDiscoveryCityGalleryObjects.h" @@ -22,6 +21,7 @@ #include "partners_api/booking_api.hpp" #import +#import namespace { diff --git a/iphone/Maps/UI/PlacePage/PlacePageViewController.swift b/iphone/Maps/UI/PlacePage/PlacePageViewController.swift new file mode 100644 index 0000000000..76f75eb307 --- /dev/null +++ b/iphone/Maps/UI/PlacePage/PlacePageViewController.swift @@ -0,0 +1,30 @@ +// +// PlacePageViewController.swift +// MAPS.ME +// +// Created by aleksey.belousov on 06/11/2019. +// Copyright © 2019 MapsWithMe. All rights reserved. +// + +import UIKit + +class PlacePageViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + // Get the new view controller using segue.destination. + // Pass the selected object to the new view controller. + } + */ + +}