diff --git a/iphone/Maps/Bookmarks/Categories/BMCView/BMCViewController.swift b/iphone/Maps/Bookmarks/Categories/BMCView/BMCViewController.swift index c7381b9319..736b3202fb 100644 --- a/iphone/Maps/Bookmarks/Categories/BMCView/BMCViewController.swift +++ b/iphone/Maps/Bookmarks/Categories/BMCView/BMCViewController.swift @@ -42,27 +42,23 @@ final class BMCViewController: MWMViewController { private func updateCategoryName(category: BMCCategory?) { let isNewCategory = (category == nil) - let alert = UIAlertController(title: L(isNewCategory ? "bookmarks_create_new_group" : "rename"), message: nil, preferredStyle: .alert) + alertController.presentCreateBookmarkCategoryAlert(withMaxCharacterNum: viewModel.maxCategoryNameLength, + minCharacterNum: viewModel.minCategoryNameLength, + isNewCategory: isNewCategory) + { [weak viewModel] (name: String!) -> Bool in + guard let model = viewModel else { return false } + if model.checkCategory(name: name) { + if isNewCategory { + model.addCategory(name: name) + } else { + model.renameCategory(category: category!, name: name) + } - alert.addTextField { textField in - textField.placeholder = L("bookmark_set_name") - if let category = category { - textField.text = category.title + return true } + + return false } - - alert.addAction(UIAlertAction(title: L("cancel").capitalized, style: .cancel, handler: nil)) - alert.addAction(UIAlertAction(title: L(isNewCategory ? "create" : "ok").capitalized, style: .default) { [weak alert, viewModel] _ in - guard let categoryName = alert?.textFields?.first?.text, !categoryName.isEmpty, - let viewModel = viewModel else { return } - if let category = category { - viewModel.renameCategory(category: category, name: categoryName) - } else { - viewModel.addCategory(name: categoryName) - } - }) - - present(alert, animated: true, completion: nil) } private func shareCategory(category: BMCCategory, anchor: UIView) { diff --git a/iphone/Maps/Bookmarks/Categories/BMCViewModel/BMCDefaultViewModel.swift b/iphone/Maps/Bookmarks/Categories/BMCViewModel/BMCDefaultViewModel.swift index dd50f76339..1d99d1e117 100644 --- a/iphone/Maps/Bookmarks/Categories/BMCViewModel/BMCDefaultViewModel.swift +++ b/iphone/Maps/Bookmarks/Categories/BMCViewModel/BMCDefaultViewModel.swift @@ -1,5 +1,10 @@ final class BMCDefaultViewModel: NSObject { var view: BMCView! + private enum Const + { + static let minCategoryNameLength: UInt = 0 + static let maxCategoryNameLength: UInt = 60 + } private var sections: [BMCSection] = [] private var permissions: [BMCPermission] = [] @@ -10,6 +15,9 @@ final class BMCDefaultViewModel: NSObject { private(set) var isPendingPermission = false private var isAuthenticated = false + var minCategoryNameLength: UInt = Const.minCategoryNameLength + var maxCategoryNameLength: UInt = Const.maxCategoryNameLength + typealias BM = MWMBookmarksManager override init() { @@ -147,6 +155,10 @@ extension BMCDefaultViewModel: BMCViewModel { view.delete(at: IndexPath(row: row, section: section)) } + func checkCategory(name: String) -> Bool { + return BM.checkCategoryName(name) + } + func beginShareCategory(category: BMCCategory) -> BMCShareCategoryStatus { switch BM.beginShareCategory(category.identifier) { case .success: diff --git a/iphone/Maps/Bookmarks/Categories/BMCViewModel/BMCViewModel.swift b/iphone/Maps/Bookmarks/Categories/BMCViewModel/BMCViewModel.swift index ae09b23d7e..9321db2aa9 100644 --- a/iphone/Maps/Bookmarks/Categories/BMCViewModel/BMCViewModel.swift +++ b/iphone/Maps/Bookmarks/Categories/BMCViewModel/BMCViewModel.swift @@ -12,6 +12,8 @@ enum BMCShareCategoryStatus { protocol BMCViewModel: AnyObject { var view: BMCView! { get set } var isPendingPermission: Bool { get } + var minCategoryNameLength: UInt { get } + var maxCategoryNameLength: UInt { get } func numberOfSections() -> Int func sectionType(section: Int) -> BMCSection @@ -28,6 +30,7 @@ protocol BMCViewModel: AnyObject { func addCategory(name: String) func renameCategory(category: BMCCategory, name: String) func deleteCategory(category: BMCCategory) + func checkCategory(name: String) -> Bool func beginShareCategory(category: BMCCategory) -> BMCShareCategoryStatus func endShareCategory(category: BMCCategory) diff --git a/iphone/Maps/Categories/UIFont+MapsMeFonts.h b/iphone/Maps/Categories/UIFont+MapsMeFonts.h index e9a951d80a..85c2376178 100644 --- a/iphone/Maps/Categories/UIFont+MapsMeFonts.h +++ b/iphone/Maps/Categories/UIFont+MapsMeFonts.h @@ -1,6 +1,7 @@ @interface UIFont (MapsMeFonts) + (UIFont *)regular10; ++ (UIFont *)regular11; + (UIFont *)regular12; + (UIFont *)regular13; + (UIFont *)regular14; diff --git a/iphone/Maps/Categories/UIFont+MapsMeFonts.mm b/iphone/Maps/Categories/UIFont+MapsMeFonts.mm index 6d8e5ae4e8..6211015014 100644 --- a/iphone/Maps/Categories/UIFont+MapsMeFonts.mm +++ b/iphone/Maps/Categories/UIFont+MapsMeFonts.mm @@ -6,6 +6,7 @@ NSString * const kLightFontName = @"HelveticaNeue-Light"; @implementation UIFont (MapsMeFonts) + (UIFont *)regular10 { return [UIFont systemFontOfSize:10]; } ++ (UIFont *)regular11 { return [UIFont systemFontOfSize:11]; } + (UIFont *)regular12 { return [UIFont systemFontOfSize:12]; } + (UIFont *)regular13 { return [UIFont systemFontOfSize:13]; } + (UIFont *)regular14 { return [UIFont systemFontOfSize:14]; } diff --git a/iphone/Maps/Classes/CustomAlert/AlertController/MWMAlertViewController.h b/iphone/Maps/Classes/CustomAlert/AlertController/MWMAlertViewController.h index 6681724051..c9d27318f5 100644 --- a/iphone/Maps/Classes/CustomAlert/AlertController/MWMAlertViewController.h +++ b/iphone/Maps/Classes/CustomAlert/AlertController/MWMAlertViewController.h @@ -44,6 +44,11 @@ - (void)presentSearchNoResultsAlert; - (void)presentMobileInternetAlertWithBlock:(nonnull MWMVoidBlock)block; - (void)presentInfoAlert:(nonnull NSString *)title text:(nonnull NSString *)text; +- (void)presentCreateBookmarkCategoryAlertWithMaxCharacterNum:(NSUInteger)max + minCharacterNum:(NSUInteger)min + isNewCategory:(BOOL)isNewCategory + callback:(nonnull MWMCheckStringBlock)callback; + - (void)closeAlert:(nullable MWMVoidBlock)completion; - (nonnull instancetype)init __attribute__((unavailable("call -initWithViewController: instead!"))); diff --git a/iphone/Maps/Classes/CustomAlert/AlertController/MWMAlertViewController.mm b/iphone/Maps/Classes/CustomAlert/AlertController/MWMAlertViewController.mm index a3519058c1..b07b3a5772 100644 --- a/iphone/Maps/Classes/CustomAlert/AlertController/MWMAlertViewController.mm +++ b/iphone/Maps/Classes/CustomAlert/AlertController/MWMAlertViewController.mm @@ -215,6 +215,23 @@ static NSString * const kAlertControllerNibIdentifier = @"MWMAlertViewController - (void)presentEditorViralAlert { [self displayAlert:[MWMAlert editorViralAlert]]; } - (void)presentOsmAuthAlert { [self displayAlert:[MWMAlert osmAuthAlert]]; } + +- (void)presentCreateBookmarkCategoryAlertWithMaxCharacterNum:(NSUInteger)max + minCharacterNum:(NSUInteger)min + isNewCategory:(BOOL)isNewCategory + callback:(nonnull MWMCheckStringBlock)callback +{ + auto alert = static_cast([MWMAlert + createBookmarkCategoryAlertWithMaxCharacterNum:max + minCharacterNum:min + isNewCategory:isNewCategory + callback:callback]); + [self displayAlert:alert]; + dispatch_async(dispatch_get_main_queue(), ^{ + [alert.textField becomeFirstResponder]; + }); +} + - (void)displayAlert:(MWMAlert *)alert { // TODO(igrechuhin): Remove this check on location manager refactoring. diff --git a/iphone/Maps/Classes/CustomAlert/BaseAlert/MWMAlert.h b/iphone/Maps/Classes/CustomAlert/BaseAlert/MWMAlert.h index 7d4da48a1e..3f94622ce4 100644 --- a/iphone/Maps/Classes/CustomAlert/BaseAlert/MWMAlert.h +++ b/iphone/Maps/Classes/CustomAlert/BaseAlert/MWMAlert.h @@ -35,6 +35,10 @@ + (MWMAlert *)personalInfoWarningAlertWithBlock:(MWMVoidBlock)block; + (MWMAlert *)trackWarningAlertWithCancelBlock:(MWMVoidBlock)block; + (MWMAlert *)infoAlert:(NSString *)title text:(NSString *)text; ++ (MWMAlert *)createBookmarkCategoryAlertWithMaxCharacterNum:(NSUInteger)max + minCharacterNum:(NSUInteger)min + isNewCategory:(BOOL)isNewCategory + callback:(MWMCheckStringBlock)callback; - (void)close:(MWMVoidBlock)completion; - (void)setNeedsCloseAlertAfterEnterBackground; diff --git a/iphone/Maps/Classes/CustomAlert/BaseAlert/MWMAlert.mm b/iphone/Maps/Classes/CustomAlert/BaseAlert/MWMAlert.mm index 49c72314b2..04709c3b47 100644 --- a/iphone/Maps/Classes/CustomAlert/BaseAlert/MWMAlert.mm +++ b/iphone/Maps/Classes/CustomAlert/BaseAlert/MWMAlert.mm @@ -11,6 +11,8 @@ #import "MWMRateAlert.h" #import "MWMRoutingDisclaimerAlert.h" +#import "SwiftBridge.h" + @implementation MWMAlert + (MWMAlert *)rateAlert { return [MWMRateAlert alert]; } @@ -157,6 +159,17 @@ return [MWMDefaultAlert infoAlert:title text:text]; } ++ (MWMAlert *)createBookmarkCategoryAlertWithMaxCharacterNum:(NSUInteger)max + minCharacterNum:(NSUInteger)min + isNewCategory:(BOOL)isNewCategory + callback:(MWMCheckStringBlock)callback +{ + return [MWMBCCreateCategoryAlert alertWithMaxCharachersNum:max + minCharactersNum:min + isNewCategory:isNewCategory + callback:callback]; +} + - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)orientation { // Should override this method if you want custom relayout after rotation. diff --git a/iphone/Maps/Classes/CustomAlert/CreateBookmarkCategory/BCCreateCategoryAlert.swift b/iphone/Maps/Classes/CustomAlert/CreateBookmarkCategory/BCCreateCategoryAlert.swift new file mode 100644 index 0000000000..06efc162da --- /dev/null +++ b/iphone/Maps/Classes/CustomAlert/CreateBookmarkCategory/BCCreateCategoryAlert.swift @@ -0,0 +1,156 @@ +@objc(MWMBCCreateCategoryAlert) +final class BCCreateCategoryAlert: MWMAlert { + private enum State { + case valid + case tooFewSymbols + case tooManySymbols + case nameAlreadyExists + } + + @IBOutlet private(set) weak var textField: UITextField! + @IBOutlet private weak var titleLabel: UILabel! + @IBOutlet private weak var textFieldContainer: UIView! + @IBOutlet private weak var centerHorizontaly: NSLayoutConstraint! + @IBOutlet private weak var errorLabel: UILabel! + @IBOutlet private weak var charactersCountLabel: UILabel! + @IBOutlet private weak var rightButton: UIButton! { + didSet { + rightButton.setTitleColor(UIColor.blackHintText(), for: .disabled) + } + } + + private var maxCharactersNum: UInt? + private var minCharactersNum: UInt? + private var callback: MWMCheckStringBlock? + + @objc static func alert(maxCharachersNum: UInt, + minCharactersNum: UInt, + isNewCategory: Bool, + callback: @escaping MWMCheckStringBlock) -> BCCreateCategoryAlert? { + guard let alert = Bundle.main.loadNibNamed(className(), owner: nil, options: nil)?.first + as? BCCreateCategoryAlert else { + assertionFailure() + return nil + } + + alert.titleLabel.text = L(isNewCategory ? "bookmarks_create_new_group" : "rename") + let text = L(isNewCategory ? "create" : "ok").capitalized + for s in [.normal, .highlighted, .disabled] as [UIControlState] { + alert.rightButton.setTitle(text, for: s) + } + + alert.maxCharactersNum = maxCharachersNum + alert.minCharactersNum = minCharactersNum + alert.callback = callback + alert.process(state: .tooFewSymbols) + alert.formatCharactersCountText() + MWMKeyboard.add(alert) + return alert + } + + @IBAction private func leftButtonTap() { + MWMKeyboard.remove(self) + close(nil) + } + + @IBAction private func rightButtonTap() { + guard let callback = callback, let text = textField.text else { + assertionFailure() + return + } + + if callback(text) { + MWMKeyboard.remove(self) + close(nil) + } else { + process(state: .nameAlreadyExists) + } + } + + @IBAction private func editingChanged(sender: UITextField) { + formatCharactersCountText() + process(state: checkState()) + } + + private func checkState() -> State { + let count = textField.text!.count + if count <= minCharactersNum! { + return .tooFewSymbols + } + + if count > maxCharactersNum! { + return .tooManySymbols + } + + return .valid + } + + private func process(state: State) { + let color: UIColor + switch state { + case .valid: + color = UIColor.blackHintText() + rightButton.isEnabled = true + errorLabel.isHidden = true + case .tooFewSymbols: + color = UIColor.blackHintText() + errorLabel.isHidden = true + rightButton.isEnabled = false + case .tooManySymbols: + color = UIColor.buttonRed() + errorLabel.isHidden = false + errorLabel.text = L("bookmarks_error_title_list_name_too_long") + rightButton.isEnabled = false + case .nameAlreadyExists: + color = UIColor.buttonRed() + errorLabel.isHidden = false + errorLabel.text = L("bookmarks_error_title_list_name_already_taken") + rightButton.isEnabled = false + } + + charactersCountLabel.textColor = color + textFieldContainer.layer.borderColor = color.cgColor + } + + private func formatCharactersCountText() { + let count = textField.text!.count + charactersCountLabel.text = String(count) + " / " + String(maxCharactersNum!) + } +} + +extension BCCreateCategoryAlert: UITextFieldDelegate { + func textFieldShouldReturn(_ textField: UITextField) -> Bool { + if checkState() == .valid { + rightButtonTap() + } + + return true + } + + func textField(_ textField: UITextField, + shouldChangeCharactersIn range: NSRange, + replacementString string: String) -> Bool { + let str = textField.text as NSString? + let newStr = str?.replacingCharacters(in: range, with: string) + guard let count = newStr?.count else { + return true + } + + if count > maxCharactersNum! + 1 { + return false + } + + return true + } +} + +extension BCCreateCategoryAlert: MWMKeyboardObserver { + func onKeyboardAnimation() { + centerHorizontaly.constant -= MWMKeyboard.keyboardHeight() / 2 + layoutIfNeeded() + } + + func onKeyboardWillAnimate() { + setNeedsLayout() + } +} diff --git a/iphone/Maps/Classes/CustomAlert/CreateBookmarkCategory/MWMBCCreateCategoryAlert.xib b/iphone/Maps/Classes/CustomAlert/CreateBookmarkCategory/MWMBCCreateCategoryAlert.xib new file mode 100644 index 0000000000..cf490f40a9 --- /dev/null +++ b/iphone/Maps/Classes/CustomAlert/CreateBookmarkCategory/MWMBCCreateCategoryAlert.xib @@ -0,0 +1,239 @@ + + + + + + + + + + + + + + HelveticaNeue + HelveticaNeue-Medium + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iphone/Maps/Common/MWMTypes.h b/iphone/Maps/Common/MWMTypes.h index 90ae775926..0ad5dbbb3f 100644 --- a/iphone/Maps/Common/MWMTypes.h +++ b/iphone/Maps/Common/MWMTypes.h @@ -1,6 +1,7 @@ typedef void (^MWMVoidBlock)(void); typedef void (^MWMStringBlock)(NSString *); typedef void (^MWMURLBlock)(NSURL *); +typedef BOOL (^MWMCheckStringBlock)(NSString *); typedef NS_ENUM(NSUInteger, MWMDayTime) { MWMDayTimeDay, MWMDayTimeNight }; diff --git a/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.h b/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.h index ee3378847b..2ee5ca2542 100644 --- a/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.h +++ b/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.h @@ -22,6 +22,7 @@ + (void)deleteCategory:(MWMMarkGroupID)groupId; + (void)deleteBookmark:(MWMMarkID)bookmarkId; ++ (BOOL)checkCategoryName:(NSString *)name; + (MWMBookmarksShareStatus)beginShareCategory:(MWMMarkGroupID)groupId; + (NSURL *)shareCategoryURL; diff --git a/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.mm b/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.mm index ed08f3c226..17ade6d106 100644 --- a/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.mm +++ b/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.mm @@ -183,6 +183,11 @@ using TLoopBlock = void (^)(Observer observer); }]; } ++ (BOOL)checkCategoryName:(NSString *)name +{ + return !GetFramework().GetBookmarkManager().IsUsedCategoryName(name.UTF8String); +} + + (MWMBookmarksShareStatus)beginShareCategory:(MWMMarkGroupID)groupId { auto const sharingResult = GetFramework().GetBookmarkManager().BeginSharing(groupId); diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj index 4938a4285f..b190cb9bde 100644 --- a/iphone/Maps/Maps.xcodeproj/project.pbxproj +++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj @@ -512,6 +512,8 @@ F6BD1D211CA412920047B8E8 /* MWMOsmAuthAlert.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6BD1D1F1CA412920047B8E8 /* MWMOsmAuthAlert.mm */; }; F6BD1D241CA412E40047B8E8 /* MWMOsmAuthAlert.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6BD1D221CA412E30047B8E8 /* MWMOsmAuthAlert.xib */; }; F6C16A671F9626B2000FE296 /* ReviewsViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 3430291B1F87BC3000D0A07C /* ReviewsViewController.xib */; }; + F6D67CDC2062B9C00032FD38 /* BCCreateCategoryAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = F6D67CDB2062B9C00032FD38 /* BCCreateCategoryAlert.swift */; }; + F6D67CDE2062BBA60032FD38 /* MWMBCCreateCategoryAlert.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6D67CDD2062BBA60032FD38 /* MWMBCCreateCategoryAlert.xib */; }; F6E2FD501E097BA00083EBEC /* MWMMapDownloaderAdsTableViewCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FBFF1E097B9F0083EBEC /* MWMMapDownloaderAdsTableViewCell.mm */; }; F6E2FD531E097BA00083EBEC /* MWMMapDownloaderAdsTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = F6E2FC001E097B9F0083EBEC /* MWMMapDownloaderAdsTableViewCell.xib */; }; F6E2FD561E097BA00083EBEC /* MWMMapDownloaderButtonTableViewCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6E2FC021E097B9F0083EBEC /* MWMMapDownloaderButtonTableViewCell.mm */; }; @@ -1433,6 +1435,8 @@ F6BD1D1E1CA412920047B8E8 /* MWMOsmAuthAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMOsmAuthAlert.h; sourceTree = ""; }; F6BD1D1F1CA412920047B8E8 /* MWMOsmAuthAlert.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = MWMOsmAuthAlert.mm; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; F6BD1D221CA412E30047B8E8 /* MWMOsmAuthAlert.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMOsmAuthAlert.xib; sourceTree = ""; }; + F6D67CDB2062B9C00032FD38 /* BCCreateCategoryAlert.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BCCreateCategoryAlert.swift; sourceTree = ""; }; + F6D67CDD2062BBA60032FD38 /* MWMBCCreateCategoryAlert.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MWMBCCreateCategoryAlert.xib; sourceTree = ""; }; F6DF5F321CD1136800A87154 /* LocaleTranslator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocaleTranslator.h; sourceTree = ""; }; F6E2FBFE1E097B9F0083EBEC /* MWMMapDownloaderAdsTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMMapDownloaderAdsTableViewCell.h; sourceTree = ""; }; F6E2FBFF1E097B9F0083EBEC /* MWMMapDownloaderAdsTableViewCell.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMMapDownloaderAdsTableViewCell.mm; sourceTree = ""; }; @@ -3054,6 +3058,7 @@ F64F195F1AB8125C006EAF7E /* CustomAlert */ = { isa = PBXGroup; children = ( + F6D67CDA2062B9810032FD38 /* CreateBookmarkCategory */, 349B92691DF0516C007779DD /* Toast */, 349A137E1DEC138C00C7DB60 /* MobileInternetAlert */, 3462258B1DDC5D76001E8752 /* SearchAlert */, @@ -3241,6 +3246,15 @@ name = AuthAlert; sourceTree = ""; }; + F6D67CDA2062B9810032FD38 /* CreateBookmarkCategory */ = { + isa = PBXGroup; + children = ( + F6D67CDB2062B9C00032FD38 /* BCCreateCategoryAlert.swift */, + F6D67CDD2062BBA60032FD38 /* MWMBCCreateCategoryAlert.xib */, + ); + path = CreateBookmarkCategory; + sourceTree = ""; + }; F6E2FBFB1E097B9F0083EBEC /* UI */ = { isa = PBXGroup; children = ( @@ -4190,6 +4204,7 @@ F6E2FF421E097BA00083EBEC /* MWMSearchTableViewController.xib in Resources */, 34AB66681FC5AA330078E451 /* TransportTransitPedestrian.xib in Resources */, F6E2FEEE1E097BA00083EBEC /* MWMSearchView.xib in Resources */, + F6D67CDE2062BBA60032FD38 /* MWMBCCreateCategoryAlert.xib in Resources */, 344532511F714FD70059FBCC /* UGCAddReviewController.xib in Resources */, 3490D2E31CE9DD2500D0B838 /* MWMSideButtonsView.xib in Resources */, 346DB82B1E5C4F6700E3123E /* GalleryCell.xib in Resources */, @@ -4634,6 +4649,7 @@ 3430291D1F87BF4400D0A07C /* ReviewsViewController.swift in Sources */, F6E2FE731E097BA00083EBEC /* MWMOpeningHours.mm in Sources */, 3404F4842028908C0090E401 /* AddSetTableViewCell.mm in Sources */, + F6D67CDC2062B9C00032FD38 /* BCCreateCategoryAlert.swift in Sources */, F6E2FF601E097BA00083EBEC /* MWMSettingsViewController.mm in Sources */, F6E2FE2B1E097BA00083EBEC /* MWMStreetEditorEditTableViewCell.mm in Sources */, 34AB66891FC5AA330078E451 /* NavigationControlView.swift in Sources */,