From 39ca940eafa74bde288e82075d0b390467978b62 Mon Sep 17 00:00:00 2001 From: Aleksey Belousov Date: Mon, 27 Jan 2020 16:29:15 +0300 Subject: [PATCH] [iOS] fix display of working hours in PP --- iphone/CoreApi/CoreApi/CoreApi-swift.h | 2 + .../Common/IOpeningHoursLocalization.h | 2 +- .../PlacePageData/Common/OpeningHours.h | 6 +- .../PlacePageData/Common/OpeningHours.mm | 8 +- .../Common/PlacePageInfoData+Core.h | 4 +- .../PlacePageData/Common/PlacePageInfoData.h | 3 + .../PlacePageData/Common/PlacePageInfoData.mm | 4 +- .../CoreApi/PlacePageData/PlacePageData.h | 4 + .../CoreApi/PlacePageData/PlacePageData.mm | 4 +- iphone/Maps/Classes/MapViewController.mm | 3 +- iphone/Maps/Maps.xcodeproj/project.pbxproj | 12 + .../OpeningHoursViewController.swift | 111 ++++- .../PlacePageInfoViewController.swift | 14 +- iphone/Maps/UI/PlacePage/PlacePage.storyboard | 432 ++++++++++++++---- .../Maps/UI/PlacePage/PlacePageBuilder.swift | 3 +- .../Controllers/FacilitiesController.swift | 10 +- .../PlacePageManager/MWMPlacePageManager.mm | 3 +- .../Util/OpeinigHoursLocalization.swift | 31 ++ 18 files changed, 523 insertions(+), 133 deletions(-) create mode 100644 iphone/Maps/UI/PlacePage/Util/OpeinigHoursLocalization.swift diff --git a/iphone/CoreApi/CoreApi/CoreApi-swift.h b/iphone/CoreApi/CoreApi/CoreApi-swift.h index 519614d5bb..594dd68fd9 100644 --- a/iphone/CoreApi/CoreApi/CoreApi-swift.h +++ b/iphone/CoreApi/CoreApi/CoreApi-swift.h @@ -53,3 +53,5 @@ FOUNDATION_EXPORT const unsigned char CoreApiVersionString[]; #import #import #import +#import +#import diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/IOpeningHoursLocalization.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/IOpeningHoursLocalization.h index ad4226a3bb..30881e2b1d 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/Common/IOpeningHoursLocalization.h +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/IOpeningHoursLocalization.h @@ -2,7 +2,7 @@ NS_ASSUME_NONNULL_BEGIN -@protocol IOpeningHoursLocalization +@protocol IOpeningHoursLocalization @property(nonatomic, readonly) NSString *closedString; @property(nonatomic, readonly) NSString *breakString; diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/OpeningHours.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/OpeningHours.h index 4e086c2e78..8b6965e676 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/Common/OpeningHours.h +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/OpeningHours.h @@ -1,6 +1,6 @@ #import -#import "IOpeningHoursLocalization.h" +@protocol IOpeningHoursLocalization; NS_ASSUME_NONNULL_BEGIN @@ -8,13 +8,15 @@ NS_ASSUME_NONNULL_BEGIN @property(nonatomic, readonly) NSString *workingDays; @property(nonatomic, readonly) NSString *workingTimes; -@property(nonatomic, readonly) NSString *breaks; +@property(nonatomic, readonly, nullable) NSString *breaks; +@property(nonatomic, readonly) BOOL isOpen; @end @interface OpeningHours : NSObject @property(nonatomic, readonly) NSArray *days; +@property(nonatomic, readonly) BOOL isClosedNow; - (instancetype)initWithRawString:(NSString *)rawString localization:(id)localization; diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/OpeningHours.mm b/iphone/CoreApi/CoreApi/PlacePageData/Common/OpeningHours.mm index 4f85bd79b5..862504a9d8 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/Common/OpeningHours.mm +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/OpeningHours.mm @@ -1,12 +1,14 @@ #import "OpeningHours.h" #import "MWMOpeningHours.h" +#include "3party/opening_hours/opening_hours.hpp" @interface WorkingDay () @property(nonatomic, copy) NSString *workingDays; @property(nonatomic, copy) NSString *workingTimes; @property(nonatomic, copy) NSString *breaks; +@property(nonatomic) BOOL isOpen; @end @@ -17,6 +19,7 @@ @interface OpeningHours () @property(nonatomic, strong) NSArray *days; +@property(nonatomic) BOOL isClosedNow; @end @@ -25,12 +28,15 @@ - (instancetype)initWithRawString:(NSString *)rawString localization:(id)localization { self = [super init]; if (self) { + osmoh::OpeningHours oh(rawString.UTF8String); + _isClosedNow = oh.IsClosed(time(nullptr)); auto days = osmoh::processRawString(rawString, localization); NSMutableArray *array = [NSMutableArray arrayWithCapacity:days.size()]; for (auto day : days) { WorkingDay *wd = [[WorkingDay alloc] init]; + wd.isOpen = day.m_isOpen; wd.workingDays = day.m_workingDays; - wd.workingTimes = day.m_workingTimes.length > 0 ? day.m_workingTimes : localization.closedString; + wd.workingTimes = day.m_isOpen ? day.m_workingTimes : localization.closedString; wd.breaks = day.m_breaks; [array addObject:wd]; } diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData+Core.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData+Core.h index d50f4c5057..a9763670b7 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData+Core.h +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData+Core.h @@ -2,11 +2,13 @@ #include +@protocol IOpeningHoursLocalization; + NS_ASSUME_NONNULL_BEGIN @interface PlacePageInfoData (Core) -- (instancetype)initWithRawData:(place_page::Info const &)rawData; +- (instancetype)initWithRawData:(place_page::Info const &)rawData ohLocalization:(id)localization; @end diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.h b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.h index b25668c579..03e676437c 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.h +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.h @@ -7,11 +7,14 @@ typedef NS_ENUM(NSInteger, PlacePageDataLocalAdsStatus) { PlacePageDataLocalAdsStatusHidden }; +@class OpeningHours; + NS_ASSUME_NONNULL_BEGIN @interface PlacePageInfoData : NSObject @property(nonatomic, readonly, nullable) NSString *openingHoursString; +@property(nonatomic, readonly, nullable) OpeningHours *openingHours; @property(nonatomic, readonly, nullable) NSString *phone; @property(nonatomic, readonly, nullable) NSURL *phoneUrl; @property(nonatomic, readonly, nullable) NSString *website; diff --git a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.mm b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.mm index d9b9b76279..69aaf1047a 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.mm +++ b/iphone/CoreApi/CoreApi/PlacePageData/Common/PlacePageInfoData.mm @@ -26,7 +26,7 @@ static PlacePageDataLocalAdsStatus convertLocalAdsStatus(LocalAdsStatus status) @implementation PlacePageInfoData (Core) -- (instancetype)initWithRawData:(Info const &)rawData { +- (instancetype)initWithRawData:(Info const &)rawData ohLocalization:(id)localization { self = [super init]; if (self) { auto availableProperties = rawData.AvailableProperties(); @@ -34,6 +34,8 @@ static PlacePageDataLocalAdsStatus convertLocalAdsStatus(LocalAdsStatus status) switch (property) { case Props::OpeningHours: _openingHoursString = @(rawData.GetOpeningHours().c_str()); + _openingHours = [[OpeningHours alloc] initWithRawString:@(rawData.GetOpeningHours().c_str()) + localization:localization]; break; case Props::Phone: { _phone = @(rawData.GetPhone().c_str()); diff --git a/iphone/CoreApi/CoreApi/PlacePageData/PlacePageData.h b/iphone/CoreApi/CoreApi/PlacePageData/PlacePageData.h index 5bc0222512..7f73a7dbfa 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/PlacePageData.h +++ b/iphone/CoreApi/CoreApi/PlacePageData/PlacePageData.h @@ -32,6 +32,8 @@ typedef NS_ENUM(NSInteger, PlacePageTaxiProvider) { PlacePageTaxiProviderRutaxi }; +@protocol IOpeningHoursLocalization; + NS_ASSUME_NONNULL_BEGIN @interface PlacePageData : NSObject @@ -68,6 +70,8 @@ NS_ASSUME_NONNULL_BEGIN @property(nonatomic, readonly, nullable) NSString *sponsoredReviewURL; @property(nonatomic, readonly, nullable) NSString *sponsoredDeeplink; +- (instancetype)initWithLocalizationProvider:(id)localization; +- (instancetype)init NS_UNAVAILABLE; - (void)loadOnlineDataWithCompletion:(MWMVoidBlock)completion; - (void)loadUgcWithCompletion:(MWMVoidBlock)completion; diff --git a/iphone/CoreApi/CoreApi/PlacePageData/PlacePageData.mm b/iphone/CoreApi/CoreApi/PlacePageData/PlacePageData.mm index 580ff8f638..88a17cd32d 100644 --- a/iphone/CoreApi/CoreApi/PlacePageData/PlacePageData.mm +++ b/iphone/CoreApi/CoreApi/PlacePageData/PlacePageData.mm @@ -53,12 +53,12 @@ static PlacePageTaxiProvider convertTaxiProvider(taxi::Provider::Type providerTy @implementation PlacePageData -- (instancetype)init { +- (instancetype)initWithLocalizationProvider:(id)localization { self = [super init]; if (self) { _buttonsData = [[PlacePageButtonsData alloc] initWithRawData:rawData()]; _previewData = [[PlacePagePreviewData alloc] initWithRawData:rawData()]; - _infoData = [[PlacePageInfoData alloc] initWithRawData:rawData()]; + _infoData = [[PlacePageInfoData alloc] initWithRawData:rawData() ohLocalization:localization]; if (rawData().IsBookmark()) { _bookmarkData = [[PlacePageBookmarkData alloc] initWithRawData:rawData()]; diff --git a/iphone/Maps/Classes/MapViewController.mm b/iphone/Maps/Classes/MapViewController.mm index ce3b27edda..ceb55508d4 100644 --- a/iphone/Maps/Classes/MapViewController.mm +++ b/iphone/Maps/Classes/MapViewController.mm @@ -71,6 +71,7 @@ NSString * const kPP2BookmarkEditingSegue = @"PP2BookmarkEditing"; } - (BOOL)isEqual:(id)anObject { return [anObject isMemberOfClass:[NSValueWrapper class]]; } + @end @interface MapViewController () OpeningHoursDayViewController { + let vc = storyboard!.instantiateViewController(ofType: OpeningHoursDayViewController.self) + vc.workingDay = workingDay + vc.view.isHidden = true + return vc + } + + private func addToStack(_ viewController: UIViewController) { + addChild(viewController) + stackView.addArrangedSubview(viewController.view) + viewController.didMove(toParent: self) + } } diff --git a/iphone/Maps/UI/PlacePage/Components/PlacePageInfoViewController.swift b/iphone/Maps/UI/PlacePage/Components/PlacePageInfoViewController.swift index f759754179..930383d1c1 100644 --- a/iphone/Maps/UI/PlacePage/Components/PlacePageInfoViewController.swift +++ b/iphone/Maps/UI/PlacePage/Components/PlacePageInfoViewController.swift @@ -65,7 +65,10 @@ class PlacePageInfoViewController: UIViewController { @IBOutlet var stackView: UIStackView! - private var openingHoursView: InfoItemViewController? + private lazy var openingHoursView: OpeningHoursViewController = { + storyboard!.instantiateViewController(ofType: OpeningHoursViewController.self) + }() + private var phoneView: InfoItemViewController? private var websiteView: InfoItemViewController? private var emailView: InfoItemViewController? @@ -90,12 +93,9 @@ class PlacePageInfoViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - if let openingHoursString = placePageInfoData.openingHoursString { - openingHoursView = createInfoItem(openingHoursString, icon: UIImage(named: "ic_placepage_open_hours")) { - - } - openingHoursView?.accessoryImage.image = UIImage(named: "ic_arrow_gray_down") - openingHoursView?.accessoryImage.isHidden = false + if let openingHours = placePageInfoData.openingHours { + openingHoursView.openingHours = openingHours + addToStack(openingHoursView) } if let phone = placePageInfoData.phone { diff --git a/iphone/Maps/UI/PlacePage/PlacePage.storyboard b/iphone/Maps/UI/PlacePage/PlacePage.storyboard index e953673443..9390276200 100644 --- a/iphone/Maps/UI/PlacePage/PlacePage.storyboard +++ b/iphone/Maps/UI/PlacePage/PlacePage.storyboard @@ -1,9 +1,9 @@ - - + + - + @@ -15,20 +15,20 @@ - + - + - + - + - + @@ -71,7 +71,7 @@ - + @@ -81,7 +81,7 @@ - + @@ -130,7 +130,7 @@ - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + - + @@ -1973,7 +2126,7 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -3045,11 +3289,13 @@ + + diff --git a/iphone/Maps/UI/PlacePage/PlacePageBuilder.swift b/iphone/Maps/UI/PlacePage/PlacePageBuilder.swift index e330a0519c..4dbbae1c29 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageBuilder.swift +++ b/iphone/Maps/UI/PlacePage/PlacePageBuilder.swift @@ -1,9 +1,10 @@ @objc class PlacePageBuilder: NSObject { - @objc static func build(data: PlacePageData) -> UIViewController { + @objc static func build() -> UIViewController { let storyboard = UIStoryboard.instance(.placePage) guard let viewController = storyboard.instantiateInitialViewController() as? PlacePageViewController else { fatalError() } + let data = PlacePageData(localizationProvider: OpeinigHoursLocalization()) let interactor = PlacePageInteractor(viewController: viewController, data: data) let layout:IPlacePageLayout if data.elevationProfileData != nil { diff --git a/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/Controllers/FacilitiesController.swift b/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/Controllers/FacilitiesController.swift index ad8019a022..6e5215e7b2 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/Controllers/FacilitiesController.swift +++ b/iphone/Maps/UI/PlacePage/PlacePageLayout/Content/Controllers/FacilitiesController.swift @@ -3,12 +3,20 @@ final class FacilitiesController: MWMTableViewController { @objc var name: String? @objc var facilities: [HotelFacility]? + init() { + super.init(style: .grouped) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + override func viewDidLoad() { super.viewDidLoad() tableView.estimatedRowHeight = 44 tableView.rowHeight = UITableView.automaticDimension - tableView.register(cell: FacilityCell.self) + tableView.registerNib(cell: FacilityCell.self) title = name } diff --git a/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManager.mm b/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManager.mm index 17625d0e9a..00bf3735c5 100644 --- a/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManager.mm +++ b/iphone/Maps/UI/PlacePage/PlacePageManager/MWMPlacePageManager.mm @@ -426,8 +426,7 @@ void RegisterEventIfPossible(eye::MapObject::Event::Type const type) [[MapViewController sharedController].navigationController pushViewController:vc animated:YES]; } -- (void)openLocalAdsURL:(PlacePageData *)data -{ +- (void)openLocalAdsURL:(PlacePageData *)data { NSURL *url = [NSURL URLWithString:data.infoData.localAdsUrl]; if (!url) return; diff --git a/iphone/Maps/UI/PlacePage/Util/OpeinigHoursLocalization.swift b/iphone/Maps/UI/PlacePage/Util/OpeinigHoursLocalization.swift new file mode 100644 index 0000000000..bf107300ce --- /dev/null +++ b/iphone/Maps/UI/PlacePage/Util/OpeinigHoursLocalization.swift @@ -0,0 +1,31 @@ +import Foundation + +class OpeinigHoursLocalization: IOpeningHoursLocalization { + var closedString: String { + L("closed") + } + + var breakString: String { + L("editor_hours_closed") + } + + var twentyFourSevenString: String { + L("twentyfour_seven") + } + + var allDayString: String { + L("editor_time_allday") + } + + var dailyString: String { + L("daily") + } + + var todayString: String { + L("today") + } + + var dayOffString: String { + L("day_off_today") + } +}