diff --git a/iphone/Maps/Core/Search/MWMSearch.h b/iphone/Maps/Core/Search/MWMSearch.h index e53d3d519d..e28131ac96 100644 --- a/iphone/Maps/Core/Search/MWMSearch.h +++ b/iphone/Maps/Core/Search/MWMSearch.h @@ -1,5 +1,5 @@ #import "MWMBanner.h" -#import "MWMSearchFilterViewController.h" +#import "MWMHotelParams.h" #import "MWMSearchItemType.h" #import "MWMSearchObserver.h" #import "MWMTypes.h" @@ -10,11 +10,6 @@ class Result; struct ProductInfo; } // namespace search -namespace search_filter -{ -struct HotelParams; -} - @interface MWMSearch : NSObject + (void)addObserver:(id)observer; @@ -33,7 +28,7 @@ struct HotelParams; + (BOOL)isBookingAvailableWithContainerIndex:(NSUInteger)index; + (BOOL)isDealAvailableWithContainerIndex:(NSUInteger)index; -+ (void)update; ++ (void)updateHotelFilterWithParams:(MWMHotelParams *)params; + (void)clear; + (void)setSearchOnMap:(BOOL)searchOnMap; @@ -44,10 +39,8 @@ struct HotelParams; + (BOOL)isHotelResults; + (BOOL)hasFilter; -+ (MWMSearchFilterViewController *)getFilter; ++ (MWMHotelParams *)getFilter; + (void)clearFilter; -+ (void)showHotelFilterWithParams:(search_filter::HotelParams &&)params - onFinishCallback:(MWMVoidBlock)callback; - (instancetype)init __attribute__((unavailable("unavailable"))); - (instancetype)copy __attribute__((unavailable("unavailable"))); diff --git a/iphone/Maps/Core/Search/MWMSearch.mm b/iphone/Maps/Core/Search/MWMSearch.mm index 8dae1242cd..261e5b8f8a 100644 --- a/iphone/Maps/Core/Search/MWMSearch.mm +++ b/iphone/Maps/Core/Search/MWMSearch.mm @@ -2,9 +2,6 @@ #import #import "MWMBannerHelpers.h" #import "MWMFrameworkListener.h" -#import "MWMSearchHotelsFilterViewController.h" -#import "MWMSearchManager+Filter.h" -#import "MWMSearchManager.h" #import "SwiftBridge.h" #include "Framework.h" @@ -70,7 +67,7 @@ booking::filter::Tasks MakeBookingFilterTasks(booking::filter::Params && availab @property(nonatomic) NSUInteger lastSearchTimestamp; -@property(nonatomic) MWMSearchFilterViewController * filter; +@property(nonatomic) MWMHotelParams * filter; @property(nonatomic) MWMSearchIndex * itemsIndex; @@ -319,7 +316,11 @@ booking::filter::Tasks MakeBookingFilterTasks(booking::filter::Params && availab return [itemsIndex resultContainerIndexWithRow:row]; } -+ (void)update { [[MWMSearch manager] update]; } ++ (void)updateHotelFilterWithParams:(MWMHotelParams *)params +{ + [MWMSearch manager].filter = params; + [[MWMSearch manager] update]; +} - (void)reset { @@ -375,11 +376,9 @@ booking::filter::Tasks MakeBookingFilterTasks(booking::filter::Params && availab return hasRules || hasBookingParams; } -+ (MWMSearchFilterViewController *)getFilter ++ (MWMHotelParams *)getFilter { MWMSearch * manager = [MWMSearch manager]; - if (!manager.filter && manager.isHotelResults) - manager.filter = [MWMSearchHotelsFilterViewController controller]; return manager.filter; } @@ -390,19 +389,6 @@ booking::filter::Tasks MakeBookingFilterTasks(booking::filter::Params && availab [manager update]; } -+ (void)showHotelFilterWithParams:(search_filter::HotelParams &&)params - onFinishCallback:(MWMVoidBlock)callback -{ - auto filter = - static_cast([MWMSearchHotelsFilterViewController controller]); - auto search = [MWMSearch manager]; - search.filter = filter; - [[MWMSearchManager manager] updateFilter:[filter, callback, params = std::move(params)]() mutable - { - [filter applyParams:std::move(params) onFinishCallback:callback]; - }]; -} - - (void)updateItemsIndexWithBannerReload:(BOOL)reloadBanner { auto const resultsCount = self->m_everywhereResults.GetCount(); diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj index b77d933dea..33e157bf16 100644 --- a/iphone/Maps/Maps.xcodeproj/project.pbxproj +++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj @@ -13,6 +13,7 @@ 3304306D21D4EAFB00317CA3 /* SearchCategoryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3304306C21D4EAFB00317CA3 /* SearchCategoryCell.swift */; }; 33046832219C57180041F3A8 /* CategorySettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33046831219C57180041F3A8 /* CategorySettingsViewController.swift */; }; 33046836219C5A4E0041F3A8 /* CategorySettings.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 33046835219C5A4E0041F3A8 /* CategorySettings.storyboard */; }; + 330473EA21F7440C00DC4AEA /* MWMHotelParams.mm in Sources */ = {isa = PBXBuildFile; fileRef = 330473E921F7440C00DC4AEA /* MWMHotelParams.mm */; }; 331630D12191D74B00BB91A9 /* TagSectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331630D02191D74B00BB91A9 /* TagSectionHeaderView.swift */; }; 331922AF21BAD29900D4AAC5 /* MWMPlaceDescriptionCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = 331922AE21BAD29900D4AAC5 /* MWMPlaceDescriptionCell.mm */; }; 3358607E217632A2006D11F2 /* BookmarksSharingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3358607D217632A2006D11F2 /* BookmarksSharingViewController.swift */; }; @@ -728,9 +729,6 @@ F6E2FEB81E097BA00083EBEC /* _MWMPPPSubtitle.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6E2FCDD1E097B9F0083EBEC /* _MWMPPPSubtitle.xib */; }; F6E2FEBB1E097BA00083EBEC /* _MWMPPPTitle.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6E2FCDE1E097B9F0083EBEC /* _MWMPPPTitle.xib */; }; F6E2FEBE1E097BA00083EBEC /* MWMPPPreviewLayoutHelper.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FCE01E097B9F0083EBEC /* MWMPPPreviewLayoutHelper.mm */; }; - F6E2FEC41E097BA00083EBEC /* MWMSearchFilterPresentationController.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FCE71E097B9F0083EBEC /* MWMSearchFilterPresentationController.mm */; }; - F6E2FECA1E097BA00083EBEC /* MWMSearchFilterTransitioning.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FCEA1E097B9F0083EBEC /* MWMSearchFilterTransitioning.mm */; }; - F6E2FECD1E097BA00083EBEC /* MWMSearchFilterTransitioningManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FCEC1E097B9F0083EBEC /* MWMSearchFilterTransitioningManager.mm */; }; F6E2FED01E097BA00083EBEC /* MWMSearchFilterViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FCEE1E097B9F0083EBEC /* MWMSearchFilterViewController.mm */; }; F6E2FED31E097BA00083EBEC /* MWMSearchHotelsFilterViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FCF11E097B9F0083EBEC /* MWMSearchHotelsFilterViewController.mm */; }; F6E2FED61E097BA00083EBEC /* MWMSearchChangeModeView.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FCF31E097B9F0083EBEC /* MWMSearchChangeModeView.mm */; }; @@ -807,6 +805,8 @@ 3304306C21D4EAFB00317CA3 /* SearchCategoryCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchCategoryCell.swift; sourceTree = ""; }; 33046831219C57180041F3A8 /* CategorySettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CategorySettingsViewController.swift; sourceTree = ""; }; 33046835219C5A4E0041F3A8 /* CategorySettings.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = CategorySettings.storyboard; sourceTree = ""; }; + 330473E821F7440C00DC4AEA /* MWMHotelParams.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMHotelParams.h; sourceTree = ""; }; + 330473E921F7440C00DC4AEA /* MWMHotelParams.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMHotelParams.mm; sourceTree = ""; }; 331630D02191D74B00BB91A9 /* TagSectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TagSectionHeaderView.swift; sourceTree = ""; }; 331922AD21BAD29900D4AAC5 /* MWMPlaceDescriptionCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMPlaceDescriptionCell.h; sourceTree = ""; }; 331922AE21BAD29900D4AAC5 /* MWMPlaceDescriptionCell.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMPlaceDescriptionCell.mm; sourceTree = ""; }; @@ -1885,12 +1885,6 @@ F6E2FCDE1E097B9F0083EBEC /* _MWMPPPTitle.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = _MWMPPPTitle.xib; sourceTree = ""; }; F6E2FCDF1E097B9F0083EBEC /* MWMPPPreviewLayoutHelper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMPPPreviewLayoutHelper.h; sourceTree = ""; }; F6E2FCE01E097B9F0083EBEC /* MWMPPPreviewLayoutHelper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = MWMPPPreviewLayoutHelper.mm; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; - F6E2FCE61E097B9F0083EBEC /* MWMSearchFilterPresentationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSearchFilterPresentationController.h; sourceTree = ""; }; - F6E2FCE71E097B9F0083EBEC /* MWMSearchFilterPresentationController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMSearchFilterPresentationController.mm; sourceTree = ""; }; - F6E2FCE91E097B9F0083EBEC /* MWMSearchFilterTransitioning.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSearchFilterTransitioning.h; sourceTree = ""; }; - F6E2FCEA1E097B9F0083EBEC /* MWMSearchFilterTransitioning.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMSearchFilterTransitioning.mm; sourceTree = ""; }; - F6E2FCEB1E097B9F0083EBEC /* MWMSearchFilterTransitioningManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSearchFilterTransitioningManager.h; sourceTree = ""; }; - F6E2FCEC1E097B9F0083EBEC /* MWMSearchFilterTransitioningManager.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMSearchFilterTransitioningManager.mm; sourceTree = ""; }; F6E2FCED1E097B9F0083EBEC /* MWMSearchFilterViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSearchFilterViewController.h; sourceTree = ""; }; F6E2FCEE1E097B9F0083EBEC /* MWMSearchFilterViewController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMSearchFilterViewController.mm; sourceTree = ""; }; F6E2FCEF1E097B9F0083EBEC /* MWMSearchFilterViewController_Protected.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSearchFilterViewController_Protected.h; sourceTree = ""; }; @@ -4213,17 +4207,13 @@ F63AF50D1EA6215100A1DB98 /* FilterPriceCategoryCell.swift */, F63AF5091EA6213F00A1DB98 /* FilterRatingCell.swift */, F63AF5041EA6162400A1DB98 /* FilterTypeCell.swift */, - F6E2FCE61E097B9F0083EBEC /* MWMSearchFilterPresentationController.h */, - F6E2FCE71E097B9F0083EBEC /* MWMSearchFilterPresentationController.mm */, - F6E2FCE91E097B9F0083EBEC /* MWMSearchFilterTransitioning.h */, - F6E2FCEA1E097B9F0083EBEC /* MWMSearchFilterTransitioning.mm */, - F6E2FCEB1E097B9F0083EBEC /* MWMSearchFilterTransitioningManager.h */, - F6E2FCEC1E097B9F0083EBEC /* MWMSearchFilterTransitioningManager.mm */, F6E2FCEF1E097B9F0083EBEC /* MWMSearchFilterViewController_Protected.h */, F6E2FCED1E097B9F0083EBEC /* MWMSearchFilterViewController.h */, F6E2FCEE1E097B9F0083EBEC /* MWMSearchFilterViewController.mm */, F6E2FCF01E097B9F0083EBEC /* MWMSearchHotelsFilterViewController.h */, F6E2FCF11E097B9F0083EBEC /* MWMSearchHotelsFilterViewController.mm */, + 330473E821F7440C00DC4AEA /* MWMHotelParams.h */, + 330473E921F7440C00DC4AEA /* MWMHotelParams.mm */, ); path = Filters; sourceTree = ""; @@ -4994,7 +4984,6 @@ B33D21AF20DAF9F000BAD749 /* Toast.swift in Sources */, 33B19C67218B481700B323A7 /* TagCollectionViewCell.swift in Sources */, 6741A9D41BF340DE002C974C /* MWMAlertViewController.mm in Sources */, - F6E2FECD1E097BA00083EBEC /* MWMSearchFilterTransitioningManager.mm in Sources */, 34D3B0181E389D05004100F9 /* EditorAdditionalNamePlaceholderTableViewCell.swift in Sources */, 346DB8281E5C4F6700E3123E /* GalleryCell.swift in Sources */, 47B9065521C7FA400079C85E /* NSString+MD5.m in Sources */, @@ -5138,7 +5127,6 @@ 34AB66411FC5AA330078E451 /* RouteManagerTransitioningManager.swift in Sources */, 3454D7CE1E07F045004AF2AD /* UIFont+MapsMeFonts.mm in Sources */, F682249B1E5B104600BC1C18 /* PPHotelDescriptionCell.swift in Sources */, - F6E2FECA1E097BA00083EBEC /* MWMSearchFilterTransitioning.mm in Sources */, 3454D7DD1E07F045004AF2AD /* UISwitch+RuntimeAttributes.m in Sources */, 4719A647219CBD7F009F9AA7 /* IBillingPendingTransaction.swift in Sources */, 340416581E7C0D4100E2B6D6 /* PhotosOverlayView.swift in Sources */, @@ -5205,7 +5193,6 @@ F6E2FEA01E097BA00083EBEC /* MWMPlacePageLayout.mm in Sources */, F655C027207278300048A241 /* DiscoveryMoreCell.swift in Sources */, 337F98B821D3D67E00C8AC27 /* SearchHistoryQueryCell.swift in Sources */, - F6E2FEC41E097BA00083EBEC /* MWMSearchFilterPresentationController.mm in Sources */, 34AB66621FC5AA330078E451 /* TransportTransitSeparator.swift in Sources */, B32FE74020D2844600EF7446 /* DownloadedBookmarksViewController.swift in Sources */, 340416541E7C09C200E2B6D6 /* PhotoScalingView.swift in Sources */, @@ -5288,6 +5275,7 @@ 346DB83D1E5C4F6700E3123E /* GalleryModel.swift in Sources */, 34E776101F14B165003040B3 /* VisibleArea.swift in Sources */, 34C0A69D1F4C1B380007CE5B /* GoogleNativeBanner.swift in Sources */, + 330473EA21F7440C00DC4AEA /* MWMHotelParams.mm in Sources */, 3454D7D71E07F045004AF2AD /* UIKitCategories.mm in Sources */, 47E6CB0B2178BA3600EA102B /* SearchBannerCell.swift in Sources */, 34AB39C21D2BD8310021857D /* MWMStopButton.mm in Sources */, diff --git a/iphone/Maps/UI/Discovery/MWMDiscoveryController.mm b/iphone/Maps/UI/Discovery/MWMDiscoveryController.mm index 219033d515..d77371d5e3 100644 --- a/iphone/Maps/UI/Discovery/MWMDiscoveryController.mm +++ b/iphone/Maps/UI/Discovery/MWMDiscoveryController.mm @@ -7,8 +7,7 @@ #import "MWMMapViewControlsManager.h" #import "MWMRoutePoint+CPP.h" #import "MWMRouter.h" -#import "MWMSearch.h" -#import "MWMSearchHotelsFilterViewController.h" +#import "MWMSearchManager+Filter.h" #import "Statistics.h" #import "UIKitCategories.h" @@ -219,12 +218,12 @@ struct Callback - (void)openFilters { [self.navigationController popViewControllerAnimated:YES]; - [MWMSearch showHotelFilterWithParams:{} - onFinishCallback:^{ - [MWMMapViewControlsManager.manager - searchTextOnMap:[L(@"hotel") stringByAppendingString:@" "] - forInputLocale:[NSLocale currentLocale].localeIdentifier]; - }]; + [[MWMSearchManager manager] showHotelFilterWithParams:nil + onFinishCallback:^{ + [MWMMapViewControlsManager.manager + searchTextOnMap:[L(@"hotel") stringByAppendingString:@" "] + forInputLocale:[NSLocale currentLocale].localeIdentifier]; + }]; } - (void)searchFood diff --git a/iphone/Maps/UI/PlacePage/MWMPlacePageManager.mm b/iphone/Maps/UI/PlacePage/MWMPlacePageManager.mm index 97c7cf251b..6d66ba73b4 100644 --- a/iphone/Maps/UI/PlacePage/MWMPlacePageManager.mm +++ b/iphone/Maps/UI/PlacePage/MWMPlacePageManager.mm @@ -12,8 +12,7 @@ #import "MWMPlacePageLayout.h" #import "MWMRoutePoint+CPP.h" #import "MWMRouter.h" -#import "MWMSearch.h" -#import "MWMSearchHotelsFilterViewController.h" +#import "MWMSearchManager+Filter.h" #import "MWMStorage.h" #import "MWMUGCViewModel.h" #import "MapViewController.h" @@ -627,23 +626,9 @@ void RegisterEventIfPossible(eye::MapObject::Event::Type const type, place_page: auto data = self.data; if (!data) return; - - search_filter::HotelParams params; - params.m_type = *data.hotelType; - CHECK(data.hotelType, ("Incorrect hotel type at coordinate:", data.latLon.lat, data.latLon.lon)); - - if (data.isBooking) - { - if (auto const price = data.hotelRawApproximatePricing) - { - CHECK_LESS_OR_EQUAL(*price, base::Key(search_filter::Price::Three), ()); - params.m_price = static_cast(*price); - } - - params.m_rating = place_page::rating::GetFilterRating(data.ratingRawValue); - } - - [MWMSearch showHotelFilterWithParams:std::move(params) + + MWMHotelParams * params = [[MWMHotelParams alloc] initWithPlacePageData:data]; + [[MWMSearchManager manager] showHotelFilterWithParams:params onFinishCallback:^{ [MWMMapViewControlsManager.manager searchTextOnMap:[L(@"booking_hotel") stringByAppendingString:@" "] forInputLocale:[NSLocale currentLocale].localeIdentifier]; diff --git a/iphone/Maps/UI/Search/Filters/MWMHotelParams.h b/iphone/Maps/UI/Search/Filters/MWMHotelParams.h new file mode 100644 index 0000000000..21719c2d99 --- /dev/null +++ b/iphone/Maps/UI/Search/Filters/MWMHotelParams.h @@ -0,0 +1,28 @@ +#import "MWMPlacePageData.h" + +#include "indexer/ftypes_matcher.hpp" +#include "map/place_page_info.hpp" +#include "search/hotels_filter.hpp" +#include "map/booking_filter_params.hpp" + +typedef enum { + Any, + One, + Two, + Three +} Price; + +@interface MWMHotelParams : NSObject + +@property (nonatomic) Price price; +@property (nonatomic) std::unordered_set types; +@property (nonatomic) place_page::rating::FilterRating rating; +@property (nonatomic) NSDate * checkInDate; +@property (nonatomic) NSDate * checkOutDate; + +- (instancetype)initWithPlacePageData:(MWMPlacePageData *)data; + +- (shared_ptr)rules; +- (booking::filter::Params)availabilityParams; + +@end diff --git a/iphone/Maps/UI/Search/Filters/MWMHotelParams.mm b/iphone/Maps/UI/Search/Filters/MWMHotelParams.mm new file mode 100644 index 0000000000..e969c9123f --- /dev/null +++ b/iphone/Maps/UI/Search/Filters/MWMHotelParams.mm @@ -0,0 +1,81 @@ +#import "MWMHotelParams.h" + +static uint8_t kAdultsCount = 2; +static int8_t kAgeOfChild = 5; + +@implementation MWMHotelParams + +- (instancetype)initWithPlacePageData:(MWMPlacePageData *)data +{ + self = [super init]; + if (self) + { + _types.insert(ftypes::IsHotelChecker::Type::Hotel); + CHECK(data.hotelType, ("Incorrect hotel type at coordinate:", data.latLon.lat, data.latLon.lon)); + + if (data.isBooking) + { + if (auto const price = data.hotelRawApproximatePricing) + { + CHECK_LESS_OR_EQUAL(*price, base::Key(Price::Three), ()); + _price = static_cast(*price); + } + + self.rating = place_page::rating::GetFilterRating(data.ratingRawValue); + } + } + + return self; +} + +- (shared_ptr)rules +{ + using namespace search::hotels_filter; + using namespace place_page::rating; + + shared_ptr ratingRule; + switch (self.rating) + { + case FilterRating::Any: break; + case FilterRating::Good: ratingRule = Ge(7.0); break; + case FilterRating::VeryGood: ratingRule = Ge(8.0); break; + case FilterRating::Excellent: ratingRule = Ge(9.0); break; + } + + shared_ptr priceRule; + if (self.price != Any) + priceRule = Or(priceRule, Eq(self.price)); + + shared_ptr typeRule; + if (!self.types.empty()) + typeRule = OneOf(makeMask(self.types)); + + if (!ratingRule && !priceRule && !typeRule) + return nullptr; + + return And(And(ratingRule, priceRule), typeRule); +} + +unsigned makeMask(std::unordered_set const & items) +{ + unsigned mask = 0; + for (auto const i : items) + mask = mask | 1U << static_cast(i); + + return mask; +} + +- (booking::filter::Params)availabilityParams +{ + using Clock = booking::AvailabilityParams::Clock; + booking::AvailabilityParams params; + params.m_rooms = {{kAdultsCount, kAgeOfChild}}; + if (Platform::IsConnected()) + { + params.m_checkin = Clock::from_time_t(self.checkInDate.timeIntervalSince1970); + params.m_checkout = Clock::from_time_t(self.checkOutDate.timeIntervalSince1970); + } + return { make_shared(params), {} }; +} + +@end diff --git a/iphone/Maps/UI/Search/Filters/MWMSearchFilterPresentationController.h b/iphone/Maps/UI/Search/Filters/MWMSearchFilterPresentationController.h deleted file mode 100644 index c20e5263cc..0000000000 --- a/iphone/Maps/UI/Search/Filters/MWMSearchFilterPresentationController.h +++ /dev/null @@ -1,3 +0,0 @@ -@interface MWMSearchFilterPresentationController : UIPresentationController - -@end diff --git a/iphone/Maps/UI/Search/Filters/MWMSearchFilterPresentationController.mm b/iphone/Maps/UI/Search/Filters/MWMSearchFilterPresentationController.mm deleted file mode 100644 index a201fc339f..0000000000 --- a/iphone/Maps/UI/Search/Filters/MWMSearchFilterPresentationController.mm +++ /dev/null @@ -1,133 +0,0 @@ -#import "MWMSearchFilterPresentationController.h" -#import "MWMCommon.h" -#import "MWMSearch.h" - -namespace -{ -CGFloat const kiPhonePortraitHeightPercentage = 0.7; - -CGPoint originForParentSize(CGSize size) -{ - if (size.width > size.height) - return {0, isIOSVersionLessThan(10) ? statusBarHeight() : 0}; - return {0, size.height * (1 - kiPhonePortraitHeightPercentage)}; -} - -CGSize sizeForParentSize(CGSize size) -{ - if (size.width > size.height) - return {size.width, size.height - (isIOSVersionLessThan(10) ? statusBarHeight() : 0)}; - return {size.width, size.height * kiPhonePortraitHeightPercentage}; -} -} // namespace - -@interface MWMSearchFilterPresentationController () - -@property(nonatomic) UIView * chromeView; - -@end - -@implementation MWMSearchFilterPresentationController - -- (instancetype)initWithPresentedViewController:(UIViewController *)presentedViewController - presentingViewController:(UIViewController *)presentingViewController -{ - self = [super initWithPresentedViewController:presentedViewController - presentingViewController:presentingViewController]; - - if (self) - { - _chromeView = [[UIView alloc] initWithFrame:{}]; - _chromeView.backgroundColor = [UIColor blackStatusBarBackground]; - _chromeView.alpha = 0; - - auto rec = - [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(chromeViewTapped:)]; - [_chromeView addGestureRecognizer:rec]; - } - - return self; -} - -#pragma mark - Gesture recognizers - -- (void)chromeViewTapped:(UIGestureRecognizer *)gesture -{ - if (gesture.state != UIGestureRecognizerStateEnded) - return; - [MWMSearch update]; - [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; -} - -#pragma mark - Layout - -- (CGRect)frameOfPresentedViewInContainerView -{ - auto const size = self.containerView.bounds.size; - return {originForParentSize(size), sizeForParentSize(size)}; -} - -- (CGSize)sizeForChildContentContainer:(id)container - withParentContainerSize:(CGSize)parentSize -{ - return sizeForParentSize(parentSize); -} - -- (void)containerViewWillLayoutSubviews -{ - self.chromeView.frame = self.containerView.bounds; - self.presentedView.frame = [self frameOfPresentedViewInContainerView]; -} - -#pragma mark - Style - -- (BOOL)shouldPresentInFullscreen { return YES; } -- (UIModalPresentationStyle)adaptivePresentationStyle { return UIModalPresentationFullScreen; } -#pragma mark - Presentation - -- (void)presentationTransitionWillBegin -{ - UIView * chromeView = self.chromeView; - UIView * containerView = self.containerView; - - chromeView.frame = containerView.bounds; - chromeView.alpha = 0; - - [containerView insertSubview:chromeView atIndex:0]; - - id coordinator = - self.presentedViewController.transitionCoordinator; - if (coordinator) - { - [coordinator - animateAlongsideTransition:^(id context) { - chromeView.alpha = 1; - } - completion:nil]; - } - else - { - chromeView.alpha = 1; - } -} - -- (void)dismissalTransitionWillBegin -{ - UIView * chromeView = self.chromeView; - id coordinator = - self.presentedViewController.transitionCoordinator; - if (coordinator) - { - [coordinator - animateAlongsideTransition:^(id context) { - chromeView.alpha = 0; - } - completion:nil]; - } - else - { - chromeView.alpha = 0; - } -} - -@end diff --git a/iphone/Maps/UI/Search/Filters/MWMSearchFilterTransitioning.h b/iphone/Maps/UI/Search/Filters/MWMSearchFilterTransitioning.h deleted file mode 100644 index 1f07ab84a3..0000000000 --- a/iphone/Maps/UI/Search/Filters/MWMSearchFilterTransitioning.h +++ /dev/null @@ -1,5 +0,0 @@ -@interface MWMSearchFilterTransitioning : NSObject - -@property(nonatomic) BOOL isPresentation; - -@end diff --git a/iphone/Maps/UI/Search/Filters/MWMSearchFilterTransitioning.mm b/iphone/Maps/UI/Search/Filters/MWMSearchFilterTransitioning.mm deleted file mode 100644 index 31473e597a..0000000000 --- a/iphone/Maps/UI/Search/Filters/MWMSearchFilterTransitioning.mm +++ /dev/null @@ -1,63 +0,0 @@ -#import "MWMSearchFilterTransitioning.h" -#import "MWMCommon.h" - -@implementation MWMSearchFilterTransitioning - -- (instancetype)init -{ - self = [super init]; - if (self) - _isPresentation = NO; - return self; -} - -- (NSTimeInterval)transitionDuration:(id)transitionContext -{ - return kDefaultAnimationDuration; -} - -- (void)animateTransition:(id)transitionContext -{ - UIViewController * fromVC = - [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; - UIViewController * toVC = - [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; - - if (!toVC || !fromVC) - return; - - UIView * fromView = fromVC.view; - UIView * toView = toVC.view; - UIView * containerView = [transitionContext containerView]; - - UIViewController * animatingVC = self.isPresentation ? toVC : fromVC; - UIView * animatingView = animatingVC.view; - - CGRect const finalFrameForVC = [transitionContext finalFrameForViewController:animatingVC]; - CGRect initialFrameForVC = finalFrameForVC; - initialFrameForVC.origin.y += initialFrameForVC.size.height; - - CGRect const initialFrame = self.isPresentation ? initialFrameForVC : finalFrameForVC; - CGRect const finalFrame = self.isPresentation ? finalFrameForVC : initialFrameForVC; - - animatingView.frame = initialFrame; - - if (self.isPresentation) - [containerView addSubview:toView]; - - [UIView animateWithDuration:[self transitionDuration:transitionContext] - delay:0 - usingSpringWithDamping:300 - initialSpringVelocity:5.0 - options:UIViewAnimationOptionAllowUserInteraction - animations:^{ - animatingView.frame = finalFrame; - } - completion:^(BOOL finished) { - if (!self.isPresentation) - [fromView removeFromSuperview]; - [transitionContext completeTransition:YES]; - }]; -} - -@end diff --git a/iphone/Maps/UI/Search/Filters/MWMSearchFilterTransitioningManager.h b/iphone/Maps/UI/Search/Filters/MWMSearchFilterTransitioningManager.h deleted file mode 100644 index ef532b8264..0000000000 --- a/iphone/Maps/UI/Search/Filters/MWMSearchFilterTransitioningManager.h +++ /dev/null @@ -1,3 +0,0 @@ -@interface MWMSearchFilterTransitioningManager : NSObject - -@end diff --git a/iphone/Maps/UI/Search/Filters/MWMSearchFilterTransitioningManager.mm b/iphone/Maps/UI/Search/Filters/MWMSearchFilterTransitioningManager.mm deleted file mode 100644 index 9939eb3041..0000000000 --- a/iphone/Maps/UI/Search/Filters/MWMSearchFilterTransitioningManager.mm +++ /dev/null @@ -1,34 +0,0 @@ -#import "MWMSearchFilterTransitioningManager.h" -#import "MWMSearchFilterPresentationController.h" -#import "MWMSearchFilterTransitioning.h" - -@implementation MWMSearchFilterTransitioningManager - -- (UIPresentationController *) -presentationControllerForPresentedViewController:(UIViewController *)presented - presentingViewController:(UIViewController *)presenting - sourceViewController:(UIViewController *)source -{ - return [[MWMSearchFilterPresentationController alloc] initWithPresentedViewController:presented - presentingViewController:presenting]; -} - -- (id) -animationControllerForPresentedController:(UIViewController *)presented - presentingController:(UIViewController *)presenting - sourceController:(UIViewController *)source -{ - auto animationController = [[MWMSearchFilterTransitioning alloc] init]; - animationController.isPresentation = YES; - return animationController; -} - -- (id)animationControllerForDismissedController: - (UIViewController *)dismissed -{ - auto animationController = [[MWMSearchFilterTransitioning alloc] init]; - animationController.isPresentation = NO; - return animationController; -} - -@end diff --git a/iphone/Maps/UI/Search/Filters/MWMSearchFilterViewController.h b/iphone/Maps/UI/Search/Filters/MWMSearchFilterViewController.h index c08b6adc7c..6b641a3886 100644 --- a/iphone/Maps/UI/Search/Filters/MWMSearchFilterViewController.h +++ b/iphone/Maps/UI/Search/Filters/MWMSearchFilterViewController.h @@ -1,23 +1,7 @@ #import "MWMViewController.h" -#include "map/booking_filter_params.hpp" - -#include "std/shared_ptr.hpp" - -namespace search -{ -namespace hotels_filter -{ -struct Rule; -} // namespace hotels_filter -} // namespace search - @interface MWMSearchFilterViewController : MWMViewController + (MWMSearchFilterViewController *)controller; -- (shared_ptr)rules; -- (booking::filter::Params)availabilityParams; -- (void)reset; - @end diff --git a/iphone/Maps/UI/Search/Filters/MWMSearchFilterViewController.mm b/iphone/Maps/UI/Search/Filters/MWMSearchFilterViewController.mm index 06eb8c0585..75d1454fc6 100644 --- a/iphone/Maps/UI/Search/Filters/MWMSearchFilterViewController.mm +++ b/iphone/Maps/UI/Search/Filters/MWMSearchFilterViewController.mm @@ -17,8 +17,5 @@ } - (void)mwm_refreshUI { [self.view mwm_refreshUI]; } -- (shared_ptr)rules { return nullptr; } -- (booking::filter::Params)availabilityParams { return {}; } -- (void)reset {} @end diff --git a/iphone/Maps/UI/Search/Filters/MWMSearchHotelsFilterViewController.h b/iphone/Maps/UI/Search/Filters/MWMSearchHotelsFilterViewController.h index ee523e057b..2e6564b6d0 100644 --- a/iphone/Maps/UI/Search/Filters/MWMSearchHotelsFilterViewController.h +++ b/iphone/Maps/UI/Search/Filters/MWMSearchHotelsFilterViewController.h @@ -1,30 +1,21 @@ #import "MWMSearchFilterViewController.h" #import "MWMTypes.h" +#import "MWMHotelParams.h" -#include "map/place_page_info.hpp" +@class MWMSearchHotelsFilterViewController; -#include "indexer/ftypes_matcher.hpp" +@protocol MWMSearchHotelsFilterViewControllerDelegate -namespace search_filter -{ -enum class Price -{ - Any = 0, - One = 1, - Two = 2, - Three = 3 -}; - -struct HotelParams -{ - ftypes::IsHotelChecker::Type m_type = ftypes::IsHotelChecker::Type::Count; - place_page::rating::FilterRating m_rating = place_page::rating::FilterRating::Any; - Price m_price = Price::Any; -}; -} // namespace search_filter +- (void)hotelsFilterViewController:(MWMSearchHotelsFilterViewController *)viewController + didSelectParams:(MWMHotelParams *)params; +- (void)hotelsFilterViewControllerDidCancel:(MWMSearchHotelsFilterViewController *)viewController; + +@end @interface MWMSearchHotelsFilterViewController : MWMSearchFilterViewController -- (void)applyParams:(search_filter::HotelParams &&)params onFinishCallback:(MWMVoidBlock)callback; +- (void)applyParams:(MWMHotelParams *)params; + +@property (nonatomic, weak) id delegate; @end diff --git a/iphone/Maps/UI/Search/Filters/MWMSearchHotelsFilterViewController.mm b/iphone/Maps/UI/Search/Filters/MWMSearchHotelsFilterViewController.mm index 023fab3afb..e8119b56dd 100644 --- a/iphone/Maps/UI/Search/Filters/MWMSearchHotelsFilterViewController.mm +++ b/iphone/Maps/UI/Search/Filters/MWMSearchHotelsFilterViewController.mm @@ -1,24 +1,15 @@ #import "MWMSearchHotelsFilterViewController.h" #import #import "MWMEye.h" -#import "MWMSearch.h" #import "MWMSearchFilterViewController_Protected.h" #import "Statistics.h" #import "SwiftBridge.h" -#include "search/hotels_filter.hpp" - -#include "base/stl_helpers.hpp" - -#include - namespace { static NSTimeInterval kDayInterval = 24 * 60 * 60; static NSTimeInterval k30DaysInterval = 30 * kDayInterval; static NSTimeInterval k360DaysInterval = 360 * kDayInterval; -static uint8_t kAdultsCount = 2; -static int8_t kAgeOfChild = 5; static NSString * const kHotelTypePattern = @"search_hotel_filter_%@"; std::array const @@ -27,15 +18,6 @@ std::array const & items) -{ - unsigned mask = 0; - for (auto const i : items) - mask = mask | 1U << static_cast(i); - - return mask; -} - enum class Section { Check, @@ -118,8 +100,6 @@ void configButton(UIButton * button, NSString * primaryText, NSString * secondar @property(nonatomic) NSDate * checkInDate; @property(nonatomic) NSDate * checkOutDate; -@property(nonatomic, copy) MWMVoidBlock onFinishCallback; - @end @implementation MWMSearchHotelsFilterViewController @@ -131,28 +111,18 @@ void configButton(UIButton * button, NSString * primaryText, NSString * secondar [self controllerWithIdentifier:identifier]); } -- (void)applyParams:(search_filter::HotelParams &&)params onFinishCallback:(MWMVoidBlock)callback +- (void)applyParams:(MWMHotelParams *)params { - using namespace search_filter; + m_selectedTypes = params.types; + [self.type.collectionView reloadData]; + + self.checkInDate = params.checkInDate; + self.checkOutDate = params.checkOutDate; + using namespace place_page::rating; - - self.onFinishCallback = callback; - - if (params.m_type != ftypes::IsHotelChecker::Type::Count) - { - m_selectedTypes.emplace(params.m_type); - [self.type.collectionView - selectItemAtIndexPath:[NSIndexPath indexPathForItem:base::Key(params.m_type) - inSection:0] - animated:NO - scrollPosition:UICollectionViewScrollPositionNone]; - } - auto ratingCell = self.rating; - ratingCell.any.selected = NO; - - switch (params.m_rating) + switch (params.rating) { case FilterRating::Any: ratingCell.any.selected = YES; @@ -169,22 +139,29 @@ void configButton(UIButton * button, NSString * primaryText, NSString * secondar } auto priceCell = self.price; - switch (params.m_price) + switch (params.price) { - case Price::Any: + case Any: break; - case Price::One: + case One: priceCell.one.selected = YES; break; - case Price::Two: + case Two: priceCell.two.selected = YES; break; - case Price::Three: + case Three: priceCell.three.selected = YES; break; } } +- (void)viewDidLoad +{ + [super viewDidLoad]; + [self configNavigationBar:self.navigationController.navigationBar]; + [self configNavigationItem:self.navigationItem]; +} + - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; @@ -235,8 +212,34 @@ void configButton(UIButton * button, NSString * primaryText, NSString * secondar { [Statistics logEvent:kStatSearchFilterApply withParameters:@{kStatCategory: kStatHotel}]; [MWMEye bookingFilterUsed]; - [MWMSearch update]; - [self dismissViewControllerAnimated:YES completion:self.onFinishCallback]; + [self.delegate hotelsFilterViewController:self didSelectParams:[self getSelectedHotelParams]]; +} + +- (MWMHotelParams *)getSelectedHotelParams +{ + MWMHotelParams * params = [MWMHotelParams new]; + params.types = m_selectedTypes; + params.checkInDate = self.checkInDate; + params.checkOutDate = self.checkOutDate; + + using namespace place_page::rating; + MWMFilterRatingCell * rating = self.rating; + if (rating.good.selected) + params.rating = FilterRating::Good; + else if (rating.veryGood.selected) + params.rating = FilterRating::VeryGood; + else if (rating.excellent.selected) + params.rating = FilterRating::Excellent; + + MWMFilterPriceCategoryCell * price = self.price; + if (price.one.selected) + params.price = One; + else if (price.two.selected) + params.price = Two; + else if (price.three.selected) + params.price = Three; + + return params; } - (void)initialCheckConfig @@ -297,50 +300,6 @@ void configButton(UIButton * button, NSString * primaryText, NSString * secondar m_selectedTypes.clear(); } -- (shared_ptr)rules -{ - using namespace search::hotels_filter; - MWMFilterRatingCell * rating = self.rating; - shared_ptr ratingRule; - if (rating.good.selected) - ratingRule = Ge(7.0); - else if (rating.veryGood.selected) - ratingRule = Ge(8.0); - else if (rating.excellent.selected) - ratingRule = Ge(9.0); - - MWMFilterPriceCategoryCell * price = self.price; - shared_ptr priceRule; - if (price.one.selected) - priceRule = Or(priceRule, Eq(1)); - if (price.two.selected) - priceRule = Or(priceRule, Eq(2)); - if (price.three.selected) - priceRule = Or(priceRule, Eq(3)); - - shared_ptr typeRule; - if (!m_selectedTypes.empty()) - typeRule = OneOf(makeMask(m_selectedTypes)); - - if (!ratingRule && !priceRule && !typeRule) - return nullptr; - - return And(And(ratingRule, priceRule), typeRule); -} - -- (booking::filter::Params)availabilityParams -{ - using Clock = booking::AvailabilityParams::Clock; - booking::AvailabilityParams params; - params.m_rooms = {{kAdultsCount, kAgeOfChild}}; - if (Platform::IsConnected()) - { - params.m_checkin = Clock::from_time_t(self.checkInDate.timeIntervalSince1970); - params.m_checkout = Clock::from_time_t(self.checkOutDate.timeIntervalSince1970); - } - return { make_shared(params), {} }; -} - #pragma mark - MWMFilterCheckCellDelegate - (void)checkCellButtonTap:(UIButton * _Nonnull)button @@ -558,4 +517,74 @@ void configButton(UIButton * button, NSString * primaryText, NSString * secondar } } +#pragma mark - Navigation bar + +- (IBAction)closeAction +{ + [Statistics logEvent:kStatSearchFilterCancel withParameters:@{kStatCategory: kStatHotel}]; + [self.delegate hotelsFilterViewControllerDidCancel:self]; +} + +- (IBAction)resetAction +{ + [Statistics logEvent:kStatSearchFilterReset withParameters:@{kStatCategory: kStatHotel}]; + [self reset]; +} + +- (void)configNavigationBar:(UINavigationBar *)navBar +{ + if (IPAD) + { + UIColor * white = [UIColor white]; + navBar.tintColor = white; + navBar.barTintColor = white; + navBar.translucent = NO; + } + navBar.titleTextAttributes = @{ + NSForegroundColorAttributeName: IPAD ? [UIColor blackPrimaryText] : [UIColor whiteColor], + NSFontAttributeName: [UIFont bold17] + }; +} + +- (void)configNavigationItem:(UINavigationItem *)navItem +{ + UIFont * textFont = [UIFont regular17]; + + UIColor * normalStateColor = IPAD ? [UIColor linkBlue] : [UIColor whiteColor]; + UIColor * highlightedStateColor = IPAD ? [UIColor linkBlueHighlighted] : [UIColor whiteColor]; + UIColor * disabledStateColor = [UIColor lightGrayColor]; + + navItem.title = L(@"booking_filters"); + navItem.rightBarButtonItem.title = L(@"booking_filters_reset"); + + [navItem.rightBarButtonItem setTitleTextAttributes:@{ + NSForegroundColorAttributeName: normalStateColor, + NSFontAttributeName: textFont + } + forState:UIControlStateNormal]; + [navItem.rightBarButtonItem setTitleTextAttributes:@{ + NSForegroundColorAttributeName: highlightedStateColor, + } + forState:UIControlStateHighlighted]; + [navItem.rightBarButtonItem setTitleTextAttributes:@{ + NSForegroundColorAttributeName: disabledStateColor, + } + forState:UIControlStateDisabled]; + + [navItem.leftBarButtonItem setTitleTextAttributes:@{ + NSForegroundColorAttributeName: normalStateColor, + NSFontAttributeName: textFont + } + forState:UIControlStateNormal]; + [navItem.leftBarButtonItem setTitleTextAttributes:@{ + NSForegroundColorAttributeName: highlightedStateColor, + } + forState:UIControlStateHighlighted]; + + [navItem.leftBarButtonItem setTitleTextAttributes:@{ + NSForegroundColorAttributeName: disabledStateColor, + } + forState:UIControlStateDisabled]; +} + @end diff --git a/iphone/Maps/UI/Search/MWMSearchManager+Filter.h b/iphone/Maps/UI/Search/MWMSearchManager+Filter.h index 18a668b0f3..57ce31dab8 100644 --- a/iphone/Maps/UI/Search/MWMSearchManager+Filter.h +++ b/iphone/Maps/UI/Search/MWMSearchManager+Filter.h @@ -1,9 +1,12 @@ #import "MWMSearchManager.h" +#import "MWMSearchHotelsFilterViewController.h" #import "MWMTypes.h" +#import "MWMHotelParams.h" -@interface MWMSearchManager (Filter) +@interface MWMSearchManager (Filter) -- (void)updateFilter:(MWMVoidBlock)completion; - (void)clearFilter; +- (void)showHotelFilterWithParams:(MWMHotelParams *)params + onFinishCallback:(MWMVoidBlock)callback; @end diff --git a/iphone/Maps/UI/Search/MWMSearchManager+Filter.mm b/iphone/Maps/UI/Search/MWMSearchManager+Filter.mm index 835ff2fe85..0ca594f8f2 100644 --- a/iphone/Maps/UI/Search/MWMSearchManager+Filter.mm +++ b/iphone/Maps/UI/Search/MWMSearchManager+Filter.mm @@ -1,27 +1,30 @@ #import "MWMSearch.h" -#import "MWMSearchFilterTransitioningManager.h" -#import "MWMSearchFilterViewController.h" #import "MWMSearchManager+Filter.h" #import "Statistics.h" +#import -@interface MWMSearchManager () +@interface MWMSearchManager () @property(weak, nonatomic, readonly) UIViewController * ownerController; @property(weak, nonatomic) IBOutlet UIButton * actionBarViewFilterButton; -@property(nonatomic) MWMSearchFilterTransitioningManager * filterTransitioningManager; +@property(nonatomic, copy) MWMVoidBlock onFinishCallback; @end @implementation MWMSearchManager (Filter) -- (void)updateFilter:(MWMVoidBlock)completion +- (void)showHotelFilterWithParams:(MWMHotelParams *)params + onFinishCallback:(MWMVoidBlock)callback { - MWMSearchFilterViewController * filter = [MWMSearch getFilter]; + MWMSearchHotelsFilterViewController * filterVC = + (MWMSearchHotelsFilterViewController *)[MWMSearchHotelsFilterViewController controller]; + filterVC.delegate = self; + UINavigationController * navController = - [[UINavigationController alloc] initWithRootViewController:filter]; + [[UINavigationController alloc] initWithRootViewController:filterVC]; UIViewController * ownerController = self.ownerController; - + if (IPAD) { navController.modalPresentationStyle = UIModalPresentationPopover; @@ -29,106 +32,47 @@ popover.sourceView = self.actionBarViewFilterButton; popover.sourceRect = self.actionBarViewFilterButton.bounds; popover.permittedArrowDirections = UIPopoverArrowDirectionLeft; - popover.delegate = self; } - - [self configNavigationBar:navController.navigationBar]; - [self configNavigationItem:navController.topViewController.navigationItem]; - - [ownerController presentViewController:navController animated:YES completion:completion]; + + self.onFinishCallback = callback; + [ownerController presentViewController:navController animated:YES completion:^{ + if (params) + [filterVC applyParams:params]; + }]; } - (IBAction)updateTap { - [self updateFilter:nil /* completion */]; + [self showHotelFilterWithParams:[MWMSearch getFilter] onFinishCallback:nil]; } -- (IBAction)clearFilter { [MWMSearch clearFilter]; } -- (void)configNavigationBar:(UINavigationBar *)navBar +- (IBAction)clearFilter { - if (IPAD) - { - UIColor * white = [UIColor white]; - navBar.tintColor = white; - navBar.barTintColor = white; - navBar.translucent = NO; - } - navBar.titleTextAttributes = @{ - NSForegroundColorAttributeName: IPAD ? [UIColor blackPrimaryText] : [UIColor whiteColor], - NSFontAttributeName: [UIFont bold17] - }; + [MWMSearch clearFilter]; } -- (void)configNavigationItem:(UINavigationItem *)navItem +- (NSString *)onFinishCallback { - UIFont * textFont = [UIFont regular17]; - - UIColor * normalStateColor = IPAD ? [UIColor linkBlue] : [UIColor whiteColor]; - UIColor * highlightedStateColor = IPAD ? [UIColor linkBlueHighlighted] : [UIColor whiteColor]; - UIColor * disabledStateColor = [UIColor lightGrayColor]; - - navItem.title = L(@"booking_filters"); - navItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:L(@"booking_filters_reset") - style:UIBarButtonItemStylePlain - target:self - action:@selector(resetAction)]; - [navItem.rightBarButtonItem setTitleTextAttributes:@{ - NSForegroundColorAttributeName: normalStateColor, - NSFontAttributeName: textFont - } - forState:UIControlStateNormal]; - [navItem.rightBarButtonItem setTitleTextAttributes:@{ - NSForegroundColorAttributeName: highlightedStateColor, - } - forState:UIControlStateHighlighted]; - [navItem.rightBarButtonItem setTitleTextAttributes:@{ - NSForegroundColorAttributeName: disabledStateColor, - } - forState:UIControlStateDisabled]; - - navItem.leftBarButtonItem = - [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel - target:self - action:@selector(closeAction)]; - - [navItem.leftBarButtonItem setTitleTextAttributes:@{ - NSForegroundColorAttributeName: normalStateColor, - NSFontAttributeName: textFont - } - forState:UIControlStateNormal]; - [navItem.leftBarButtonItem setTitleTextAttributes:@{ - NSForegroundColorAttributeName: highlightedStateColor, - } - forState:UIControlStateHighlighted]; - - [navItem.leftBarButtonItem setTitleTextAttributes:@{ - NSForegroundColorAttributeName: disabledStateColor, - } - forState:UIControlStateDisabled]; + return objc_getAssociatedObject(self, @selector(onFinishCallback)); } -#pragma mark - Actions - -- (void)closeAction +- (void)setOnFinishCallback:(NSString *)onFinishCallback +{ + objc_setAssociatedObject(self, @selector(onFinishCallback), onFinishCallback, OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +#pragma mark - MWMSearchHotelsFilterViewControllerDelegate + +- (void)hotelsFilterViewController:(MWMSearchHotelsFilterViewController *)viewController + didSelectParams:(MWMHotelParams *)params +{ + [MWMSearch updateHotelFilterWithParams:params]; + [self.ownerController dismissViewControllerAnimated:YES completion:self.onFinishCallback]; +} + +- (void)hotelsFilterViewControllerDidCancel:(MWMSearchHotelsFilterViewController *)viewController { - [Statistics logEvent:kStatSearchFilterCancel withParameters:@{kStatCategory: kStatHotel}]; [self.ownerController dismissViewControllerAnimated:YES completion:nil]; } -- (void)resetAction -{ - [Statistics logEvent:kStatSearchFilterReset withParameters:@{kStatCategory: kStatHotel}]; - MWMSearchFilterViewController * filter = [MWMSearch getFilter]; - [filter reset]; -} - -#pragma mark - UIPopoverPresentationControllerDelegate - -- (BOOL)popoverPresentationControllerShouldDismissPopover: - (UIPopoverPresentationController *)popoverPresentationController -{ - [MWMSearch update]; - return YES; -} - @end diff --git a/iphone/Maps/UI/Search/MWMSearchManager.mm b/iphone/Maps/UI/Search/MWMSearchManager.mm index a8c9542b98..ee05a9576e 100644 --- a/iphone/Maps/UI/Search/MWMSearchManager.mm +++ b/iphone/Maps/UI/Search/MWMSearchManager.mm @@ -6,7 +6,6 @@ #import "MWMRoutePoint+CPP.h" #import "MWMRouter.h" #import "MWMSearchChangeModeView.h" -#import "MWMSearchFilterTransitioningManager.h" #import "MWMSearchManager+Filter.h" #import "MWMSearchManager+Layout.h" #import "MWMSearchTableViewController.h" @@ -62,8 +61,6 @@ using Observers = NSHashTable; @property(nonatomic) MWMSearchTableViewController * tableViewController; @property(nonatomic) MWMNoMapsViewController * noMapsController; -@property(nonatomic) MWMSearchFilterTransitioningManager * filterTransitioningManager; - @property(nonatomic) Observers * observers; @end @@ -90,8 +87,6 @@ using Observers = NSHashTable; [self.actionBarView mwm_refreshUI]; [self.tableViewController mwm_refreshUI]; [self.noMapsController mwm_refreshUI]; - if ([MWMSearch hasFilter]) - [[MWMSearch getFilter] mwm_refreshUI]; } - (void)beginSearch diff --git a/iphone/Maps/UI/Storyboard/SearchFilters.storyboard b/iphone/Maps/UI/Storyboard/SearchFilters.storyboard index a32a37ee60..2af1c6336c 100644 --- a/iphone/Maps/UI/Storyboard/SearchFilters.storyboard +++ b/iphone/Maps/UI/Storyboard/SearchFilters.storyboard @@ -10,7 +10,7 @@ - + @@ -375,6 +375,21 @@ + + + + + + + + + + + + + + +