From 5d0563b29bca5903568e3f19083ff070a6d5f82f Mon Sep 17 00:00:00 2001 From: Ilya Grechuhin Date: Wed, 30 Aug 2017 18:50:16 +0300 Subject: [PATCH] [fix] [ios] Fixed search usage (Cian and other cases). --- iphone/Maps/Classes/MapViewController.mm | 4 +- iphone/Maps/Core/Search/MWMSearch.h | 2 + iphone/Maps/Core/Search/MWMSearch.mm | 98 ++++++++++++++--------- iphone/Maps/UI/Search/MWMSearchManager.mm | 16 ++-- 4 files changed, 76 insertions(+), 44 deletions(-) diff --git a/iphone/Maps/Classes/MapViewController.mm b/iphone/Maps/Classes/MapViewController.mm index fe67061277..805aebcaf1 100644 --- a/iphone/Maps/Classes/MapViewController.mm +++ b/iphone/Maps/Classes/MapViewController.mm @@ -584,10 +584,12 @@ BOOL gIsFirstMyPositionMode = YES; - (void)onKeyboardAnimation { auto const kbHeight = [MWMKeyboard keyboardHeight]; - self.visibleAreaKeyboard.constant = kbHeight; self.sideButtonsAreaKeyboard.constant = kbHeight; if (IPAD) + { + self.visibleAreaKeyboard.constant = kbHeight; self.placePageAreaKeyboard.constant = kbHeight; + } [self.view layoutIfNeeded]; } #pragma mark - Properties diff --git a/iphone/Maps/Core/Search/MWMSearch.h b/iphone/Maps/Core/Search/MWMSearch.h index ac73ba1f9e..306bc1dcd2 100644 --- a/iphone/Maps/Core/Search/MWMSearch.h +++ b/iphone/Maps/Core/Search/MWMSearch.h @@ -10,6 +10,8 @@ class Result; @interface MWMSearch : NSObject ++ (BOOL)isCianSearch:(NSString *)query; + + (void)addObserver:(id)observer; + (void)removeObserver:(id)observer; diff --git a/iphone/Maps/Core/Search/MWMSearch.mm b/iphone/Maps/Core/Search/MWMSearch.mm index 7ad03aa156..3ada774ff3 100644 --- a/iphone/Maps/Core/Search/MWMSearch.mm +++ b/iphone/Maps/Core/Search/MWMSearch.mm @@ -11,6 +11,8 @@ #include "search/everywhere_search_params.hpp" #include "search/viewport_search_params.hpp" +extern NSString * const kCianCategory; + namespace { using Observer = id; @@ -40,6 +42,8 @@ using Observers = NSHashTable; @property(nonatomic) MWMSearchBanners * banners; +@property(nonatomic) NSInteger searchCount; + @end @implementation MWMSearch @@ -63,6 +67,11 @@ using Observers = NSHashTable; return manager; } ++ (BOOL)isCianSearch:(NSString *)query +{ + return [query isEqualToString:[L(kCianCategory) stringByAppendingString:@" "]]; +} + - (instancetype)initManager { self = [super init]; @@ -81,32 +90,37 @@ using Observers = NSHashTable; __strong auto self = weakSelf; if (!self) return; - if (timestamp != self.lastSearchStamp) - return; - - self->m_everywhereResults = results; - self->m_isLocalAdsCustomer = isLocalAdsCustomer; - self.suggestionsCount = results.GetSuggestsCount(); - - if (results.IsEndMarker()) + if (timestamp == self.lastSearchStamp) { - [self checkIsHotelResults:results]; - if (results.IsEndedNormal()) + self->m_everywhereResults = results; + self->m_isLocalAdsCustomer = isLocalAdsCustomer; + self.suggestionsCount = results.GetSuggestsCount(); + + if (results.IsEndMarker()) { - self.everywhereSearchCompleted = YES; - if (IPAD || self.searchOnMap) + [self checkIsHotelResults:results]; + if (results.IsEndedNormal()) { + self.everywhereSearchCompleted = YES; + if ([MWMSearch isCianSearch:@(m_viewportParams.m_query.c_str())]) + { + self.searchCount -= 1; + return; + } + auto & f = GetFramework(); - f.ShowSearchResults(m_everywhereResults); + if (IPAD || self.searchOnMap) + f.ShowSearchResults(m_everywhereResults); f.SearchInViewport(m_viewportParams); } } - [self onSearchCompleted]; - } - else - { - [self onSearchResultsUpdated]; + else + { + [self onSearchResultsUpdated]; + } } + if (results.IsEndMarker()) + self.searchCount -= 1; }; } { @@ -115,7 +129,7 @@ using Observers = NSHashTable; __strong auto self = weakSelf; if (!self) return; - [self onSearchStarted]; + self.searchCount += 1; }; } { @@ -130,11 +144,18 @@ using Observers = NSHashTable; self.viewportResultsEmpty = results.GetCount() == 0; self.viewportSearchCompleted = YES; } - [self onSearchCompleted]; + if (results.IsEndMarker()) + self.searchCount -= 1; }; } } +- (void)searchEverywhere +{ + GetFramework().SearchEverywhere(m_everywhereParams); + self.searchCount += 1; +} + - (void)checkIsHotelResults:(search::Results const &)results { self.isHotelResults = search::HotelsClassifier::IsHotelResults(results); @@ -156,8 +177,9 @@ using Observers = NSHashTable; [self updateCallbacks]; [self updateFilters]; auto & f = GetFramework(); - f.SearchEverywhere(m_everywhereParams); - [self onSearchStarted]; + if ([MWMSearch isCianSearch:@(m_everywhereParams.m_query.c_str())]) + f.SearchInViewport(m_viewportParams); + [self searchEverywhere]; } #pragma mark - Add/Remove Observers @@ -251,7 +273,10 @@ using Observers = NSHashTable; { auto manager = [MWMSearch manager]; manager->m_everywhereResults.Clear(); + manager->m_everywhereParams.m_query.clear(); + manager->m_viewportParams.m_query.clear(); manager.suggestionsCount = 0; + [manager.filter reset]; [self reset]; } @@ -263,8 +288,6 @@ using Observers = NSHashTable; if (manager.searchOnMap == searchOnMap) return; manager.searchOnMap = searchOnMap; - if (!IPAD) - [manager update]; } + (NSUInteger)suggestionsCount { return [MWMSearch manager].suggestionsCount; } @@ -288,7 +311,6 @@ using Observers = NSHashTable; MWMSearch * manager = [MWMSearch manager]; [manager.filter reset]; [manager update]; - [manager onSearchCompleted]; } - (void)updateItemsIndexWithBannerReload:(BOOL)reloadBanner @@ -337,18 +359,6 @@ using Observers = NSHashTable; - (void)onSearchCompleted { -// TODO: Uncomment on release with search filters. Update to less annoying behavior. -// -// BOOL allCompleted = self.viewportSearchCompleted; -// BOOL allEmpty = self.viewportResultsEmpty; -// if (IPAD) -// { -// allCompleted = allCompleted && self.everywhereSearchCompleted; -// allEmpty = allEmpty && m_everywhereResults.GetCount() == 0; -// } -// if (allCompleted && allEmpty) -// [[MWMAlertViewController activeAlertController] presentSearchNoResultsAlert]; - [self updateItemsIndexWithBannerReload:YES]; for (Observer observer in self.observers) { @@ -367,4 +377,18 @@ using Observers = NSHashTable; } } +#pragma mark - Properties + +- (void)setSearchCount:(NSInteger)searchCount +{ + NSAssert((searchCount >= 0) && + ((_searchCount == searchCount - 1) || (_searchCount == searchCount + 1)), + @"Invalid search count update"); + if (_searchCount == 0) + [self onSearchStarted]; + else if (searchCount == 0) + [self onSearchCompleted]; + _searchCount = searchCount; +} + @end diff --git a/iphone/Maps/UI/Search/MWMSearchManager.mm b/iphone/Maps/UI/Search/MWMSearchManager.mm index 021fd7eaba..c1d995ddf5 100644 --- a/iphone/Maps/UI/Search/MWMSearchManager.mm +++ b/iphone/Maps/UI/Search/MWMSearchManager.mm @@ -113,7 +113,6 @@ using Observers = NSHashTable; if (self.state != MWMSearchManagerStateHidden) self.state = MWMSearchManagerStateDefault; self.searchTextField.text = @""; - [self clearFilter]; [MWMSearch clear]; } @@ -278,10 +277,7 @@ using Observers = NSHashTable; { [self.navigationController popToRootViewControllerAnimated:NO]; - self.actionBarState = MWMSearchManagerActionBarStateHidden; - [self animateConstraints:^{ - self.actionBarViewBottom.priority = UILayoutPriorityDefaultLow; - }]; + [self updateTableSearchActionBar]; [self viewHidden:NO]; [MWMSearch setSearchOnMap:NO]; [self.tableViewController reloadData]; @@ -327,6 +323,12 @@ using Observers = NSHashTable; #pragma mark - MWMSearchObserver - (void)onSearchCompleted +{ + if (self.state == MWMSearchManagerStateTableSearch) + [self updateTableSearchActionBar]; +} + +- (void)updateTableSearchActionBar { if (self.state != MWMSearchManagerStateTableSearch) return; @@ -340,6 +342,8 @@ using Observers = NSHashTable; hideActionBar = ([MWMSearch suggestionsCount] != 0); self.actionBarState = hideActionBar ? MWMSearchManagerActionBarStateHidden : MWMSearchManagerActionBarStateModeFilter; + + self.actionBarViewBottom.priority = UILayoutPriorityDefaultLow; }]; } @@ -370,7 +374,7 @@ using Observers = NSHashTable; switch (self.state) { case MWMSearchManagerStateTableSearch: self.state = MWMSearchManagerStateMapSearch; break; - case MWMSearchManagerStateMapSearch: self.state = MWMSearchManagerStateTableSearch; + case MWMSearchManagerStateMapSearch: self.state = MWMSearchManagerStateTableSearch; break; default: break; } }