diff --git a/iphone/Maps/Bookmarks/BookmarksTabViewController.swift b/iphone/Maps/Bookmarks/BookmarksTabViewController.swift new file mode 100644 index 0000000000..86547085c9 --- /dev/null +++ b/iphone/Maps/Bookmarks/BookmarksTabViewController.swift @@ -0,0 +1,34 @@ +@objc(MWMBookmarksTabViewController) +class BookmarksTabViewController: TabViewController { + private static let selectedIndexKey = "BookmarksTabViewController_selectedIndexKey" + private var selectedIndex: Int { + get { + return UserDefaults.standard.integer(forKey: BookmarksTabViewController.selectedIndexKey) + } + set { + UserDefaults.standard.set(newValue, forKey: BookmarksTabViewController.selectedIndexKey) + } + } + + override func viewDidLoad() { + super.viewDidLoad() + + let bookmarks = BMCViewController() + let catalog = DownloadedBookmarksViewController() + bookmarks.title = L("bookmarks_page_my") + catalog.title = L("bookmarks_page_downloaded") + viewControllers = [bookmarks, catalog] + + title = L("bookmarks"); + tabView.barTintColor = .primary() + tabView.tintColor = .white() + tabView.headerTextAttributes = [.foregroundColor: UIColor.whitePrimaryText(), + .font: UIFont.medium14()] + tabView.selectedIndex = selectedIndex + } + + override func viewDidDisappear(_ animated: Bool) { + super.viewDidDisappear(animated) + selectedIndex = tabView.selectedIndex + } +} diff --git a/iphone/Maps/Bookmarks/Catalog/CatalogWebViewController.swift b/iphone/Maps/Bookmarks/Catalog/CatalogWebViewController.swift index be73ad5c41..d30cc7bad8 100644 --- a/iphone/Maps/Bookmarks/Catalog/CatalogWebViewController.swift +++ b/iphone/Maps/Bookmarks/Catalog/CatalogWebViewController.swift @@ -86,6 +86,16 @@ class CatalogWebViewController: WebViewController { } }) + if MWMBookmarksManager.isCategoryDownloading(id) { + //TODO: add alert + return + } + + if MWMBookmarksManager.hasCategoryDownloaded(id) { + //TODO: add alert + return + } + MWMBookmarksManager.downloadItem(withId: id, name: name, progress: { (progress) in self.updateProgress() }) { (error) in @@ -112,8 +122,8 @@ class CatalogWebViewController: WebViewController { } else { Toast.toast(withText: L("bookmarks_webview_success_toast")).show() } + self.updateProgress() } - self.updateProgress() } private func showDiskError() { @@ -134,7 +144,8 @@ class CatalogWebViewController: WebViewController { } private func showImportError() { - // TODO: add import error alert + MWMAlertViewController.activeAlert().presentInfoAlert(L("title_error_downloading_bookmarks"), + text: L("subtitle_error_downloading_bookmarks")) } private func updateProgress() { diff --git a/iphone/Maps/Bookmarks/Catalog/DownloadedBookmarksViewController.swift b/iphone/Maps/Bookmarks/Catalog/DownloadedBookmarksViewController.swift index f36c9051cf..fe36f71260 100644 --- a/iphone/Maps/Bookmarks/Catalog/DownloadedBookmarksViewController.swift +++ b/iphone/Maps/Bookmarks/Catalog/DownloadedBookmarksViewController.swift @@ -1,16 +1,14 @@ -class DownloadedBookmarksViewController: MWMTableViewController { +class DownloadedBookmarksViewController: MWMViewController { - @IBOutlet var topView: UIView! @IBOutlet var bottomView: UIView! - + @IBOutlet weak var noDataView: UIView! + @IBOutlet weak var tableView: UITableView! + let dataSource = DownloadedBookmarksDataSource() override func viewDidLoad() { super.viewDidLoad() - if dataSource.categoriesCount == 0 { - tableView.tableHeaderView = topView - } tableView.tableFooterView = bottomView tableView.registerNib(cell: CatalogCategoryCell.self) tableView.registerNibForHeaderFooterView(BMCCategoriesHeader.self) @@ -20,43 +18,10 @@ class DownloadedBookmarksViewController: MWMTableViewController { super.viewWillAppear(animated) dataSource.reload() + noDataView.isHidden = dataSource.categoriesCount > 0 tableView.reloadData() } - override func numberOfSections(in tableView: UITableView) -> Int { - return dataSource.categoriesCount > 0 ? 1 : 0 - } - - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return dataSource.categoriesCount - } - - override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(cell: CatalogCategoryCell.self, indexPath: indexPath) - cell.update(with: dataSource.category(at: indexPath.row), delegate: self) - return cell - } - - override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { - return 48 - } - - override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { - let headerView = tableView.dequeueReusableHeaderFooterView(BMCCategoriesHeader.self) - headerView.isShowAll = !dataSource.allCategoriesVisible - headerView.delegate = self - return headerView - } - - override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { - tableView.deselectRow(at: indexPath, animated: true) - let category = dataSource.category(at: indexPath.row) - if let bmViewController = BookmarksVC(category: category.categoryId) { - MapViewController.topViewController().navigationController?.pushViewController(bmViewController, - animated: true) - } - } - @IBAction func onDownloadBookmarks(_ sender: Any) { if MWMPlatform.networkConnectionType() == .none { MWMAlertViewController.activeAlert().presentNoConnectionAlert(); @@ -85,12 +50,51 @@ class DownloadedBookmarksViewController: MWMTableViewController { } private func deleteCategory(at index: Int) { - self.dataSource.deleteCategory(at: index) - if self.dataSource.categoriesCount > 0 { - self.tableView.deleteRows(at: [IndexPath(row: index, section: 0)], with: .automatic) + dataSource.deleteCategory(at: index) + if dataSource.categoriesCount > 0 { + tableView.deleteRows(at: [IndexPath(row: index, section: 0)], with: .automatic) } else { - self.tableView.tableHeaderView = self.topView - self.tableView.reloadData() + noDataView.isHidden = false + tableView.reloadData() + } + } +} + +extension DownloadedBookmarksViewController: UITableViewDataSource { + func numberOfSections(in tableView: UITableView) -> Int { + return dataSource.categoriesCount > 0 ? 1 : 0 + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return dataSource.categoriesCount + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(cell: CatalogCategoryCell.self, indexPath: indexPath) + cell.update(with: dataSource.category(at: indexPath.row), delegate: self) + return cell + } +} + +extension DownloadedBookmarksViewController: UITableViewDelegate { + + func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + return 48 + } + + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { + let headerView = tableView.dequeueReusableHeaderFooterView(BMCCategoriesHeader.self) + headerView.isShowAll = !dataSource.allCategoriesVisible + headerView.delegate = self + return headerView + } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + tableView.deselectRow(at: indexPath, animated: true) + let category = dataSource.category(at: indexPath.row) + if let bmViewController = BookmarksVC(category: category.categoryId) { + MapViewController.topViewController().navigationController?.pushViewController(bmViewController, + animated: true) } } } diff --git a/iphone/Maps/Bookmarks/Catalog/DownloadedBookmarksViewController.xib b/iphone/Maps/Bookmarks/Catalog/DownloadedBookmarksViewController.xib index 76ad00c819..e94cf05b87 100644 --- a/iphone/Maps/Bookmarks/Catalog/DownloadedBookmarksViewController.xib +++ b/iphone/Maps/Bookmarks/Catalog/DownloadedBookmarksViewController.xib @@ -13,27 +13,18 @@ - - + + + - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/iphone/Maps/Classes/Components/TabView/TabView.swift b/iphone/Maps/Classes/Components/TabView/TabView.swift index fad7221209..e2e206cab0 100644 --- a/iphone/Maps/Classes/Components/TabView/TabView.swift +++ b/iphone/Maps/Classes/Components/TabView/TabView.swift @@ -75,7 +75,8 @@ class TabView: UIView { private let slidingView = UIView() private var slidingViewLeft: NSLayoutConstraint! private var slidingViewWidth: NSLayoutConstraint! - private var pageCount = 0 + private lazy var pageCount = { return self.dataSource?.numberOfPages(in: self) ?? 0; }() + var selectedIndex = -1 weak var dataSource: TabViewDataSource? @@ -191,17 +192,16 @@ class TabView: UIView { slidingView.addConstraint(slidingViewWidth) } - override func willMove(toSuperview newSuperview: UIView?) { - super.willMove(toSuperview: newSuperview) - pageCount = dataSource?.numberOfPages(in: self) ?? 0 - } - override func layoutSubviews() { super.layoutSubviews() - slidingViewWidth.constant = bounds.width / CGFloat(pageCount) + slidingViewWidth.constant = pageCount > 0 ? bounds.width / CGFloat(pageCount) : 0 tabsLayout.invalidateLayout() tabsContentLayout.invalidateLayout() + tabsContentCollectionView.layoutIfNeeded() + if selectedIndex >= 0 { + tabsContentCollectionView.scrollToItem(at: IndexPath(item: selectedIndex, section: 0), at: .left, animated: false) + } } } @@ -237,8 +237,13 @@ extension TabView : UICollectionViewDelegateFlowLayout { slidingViewLeft.constant = scrollOffset * bounds.width } + func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { + selectedIndex = Int(round(scrollView.contentOffset.x / scrollView.bounds.width)) + } + func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { if (collectionView == tabsCollectionView) { + selectedIndex = indexPath.item tabsContentCollectionView.scrollToItem(at: indexPath, at: .left, animated: true) } } diff --git a/iphone/Maps/Classes/Components/TabView/TabViewController.swift b/iphone/Maps/Classes/Components/TabView/TabViewController.swift index 9a3fa97308..c983eedcb2 100644 --- a/iphone/Maps/Classes/Components/TabView/TabViewController.swift +++ b/iphone/Maps/Classes/Components/TabView/TabViewController.swift @@ -1,8 +1,13 @@ -@objcMembers -@objc(MWMTabViewController) class TabViewController: MWMViewController { - var viewControllers: [UIViewController] = [] - var selectedIndex = 0 + var viewControllers: [UIViewController] = [] { + didSet { + viewControllers.forEach { + self.addChildViewController($0) + $0.didMove(toParentViewController: self) + } + } + } + var tabView: TabView { get { return view as! TabView @@ -14,15 +19,6 @@ class TabViewController: MWMViewController { v.dataSource = self view = v } - - override func viewDidLoad() { - super.viewDidLoad() - - viewControllers.forEach { (vc) in - self.addChildViewController(vc) - vc.didMove(toParentViewController: self) - } - } } extension TabViewController: TabViewDataSource { diff --git a/iphone/Maps/Classes/MapViewController.mm b/iphone/Maps/Classes/MapViewController.mm index 0693ecdb4a..51ac5d5439 100644 --- a/iphone/Maps/Classes/MapViewController.mm +++ b/iphone/Maps/Classes/MapViewController.mm @@ -358,19 +358,8 @@ BOOL gIsFirstMyPositionMode = YES; - (void)openMigration { [self performSegueWithIdentifier:kMigrationSegue sender:self]; } - (void)openBookmarks { - BMCViewController * bookmarks = [[BMCViewController alloc] init]; - DownloadedBookmarksViewController * catalog = [[DownloadedBookmarksViewController alloc] init]; - bookmarks.title = L(@"bookmarks_page_my"); - catalog.title = L(@"bookmarks_page_downloaded"); - - MWMTabViewController * tvc = [[MWMTabViewController alloc] init]; - tvc.title = L(@"bookmarks"); - tvc.tabView.barTintColor = [UIColor primary]; - tvc.tabView.tintColor = [UIColor white]; - tvc.tabView.headerTextAttributes = @{NSForegroundColorAttributeName: [UIColor whitePrimaryText], - NSFontAttributeName: [UIFont medium14]}; - tvc.viewControllers = @[bookmarks, catalog]; - [self.navigationController pushViewController:tvc animated:YES]; + [self.navigationController pushViewController:[[MWMBookmarksTabViewController alloc] init] + animated:YES]; } - (void)openMapsDownloader:(MWMMapDownloaderMode)mode diff --git a/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.h b/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.h index dfc5172fc4..f34d3b10ff 100644 --- a/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.h +++ b/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.h @@ -55,6 +55,8 @@ + (BOOL)isCategoryFromCatalog:(MWMMarkGroupID)groupId; + (NSArray * _Nonnull)categoriesFromCatalog; + (NSInteger)getCatalogDownloadsCount; ++ (BOOL)isCategoryDownloading:(NSString * _Nonnull)itemId; ++ (BOOL)hasCategoryDownloaded:(NSString * _Nonnull)itemId; - (instancetype)init __attribute__((unavailable("call +manager instead"))); - (instancetype)copy __attribute__((unavailable("call +manager instead"))); diff --git a/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.mm b/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.mm index 6521401239..f9c4484808 100644 --- a/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.mm +++ b/iphone/Maps/Core/Bookmarks/MWMBookmarksManager.mm @@ -540,4 +540,14 @@ NSString * const CloudErrorToString(Cloud::SynchronizationResult result) return GetFramework().GetBookmarkManager().GetCatalog().GetDownloadingCount(); } ++ (BOOL)isCategoryDownloading:(NSString *)itemId +{ + return GetFramework().GetBookmarkManager().GetCatalog().IsDownloading(itemId.UTF8String); +} + ++ (BOOL)hasCategoryDownloaded:(NSString *)itemId +{ + return GetFramework().GetBookmarkManager().GetCatalog().HasDownloaded(itemId.UTF8String); +} + @end diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj index 94292bc59c..dfbb3c24b6 100644 --- a/iphone/Maps/Maps.xcodeproj/project.pbxproj +++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj @@ -470,6 +470,7 @@ B33D21AD20DA515800BAD749 /* MWMCategoryInfoCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = B33D21AB20DA515800BAD749 /* MWMCategoryInfoCell.xib */; }; B33D21AF20DAF9F000BAD749 /* Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = B33D21AE20DAF9F000BAD749 /* Toast.swift */; }; B33D21B220DBCC5E00BAD749 /* MWMCatalogObserver.mm in Sources */ = {isa = PBXBuildFile; fileRef = B33D21B120DBCC5D00BAD749 /* MWMCatalogObserver.mm */; }; + B33D21B820E130D000BAD749 /* BookmarksTabViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B33D21B720E130D000BAD749 /* BookmarksTabViewController.swift */; }; B366130420D5D9BC00E7DC3E /* MWMCatalogCategory.m in Sources */ = {isa = PBXBuildFile; fileRef = B366130320D5D9BC00E7DC3E /* MWMCatalogCategory.m */; }; B366130720D5DD2300E7DC3E /* MWMCatalogCategory+Convenience.mm in Sources */ = {isa = PBXBuildFile; fileRef = B366130620D5DD2300E7DC3E /* MWMCatalogCategory+Convenience.mm */; }; B366130A20D5E2E000E7DC3E /* CatalogCategoryCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B366130820D5E2E000E7DC3E /* CatalogCategoryCell.swift */; }; @@ -1399,6 +1400,7 @@ B33D21B020DBCC5D00BAD749 /* MWMCatalogObserver.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMCatalogObserver.h; sourceTree = ""; }; B33D21B120DBCC5D00BAD749 /* MWMCatalogObserver.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMCatalogObserver.mm; sourceTree = ""; }; B33D21B320DBF3EB00BAD749 /* MWMCatalogCommon.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMCatalogCommon.h; sourceTree = ""; }; + B33D21B720E130D000BAD749 /* BookmarksTabViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BookmarksTabViewController.swift; sourceTree = ""; }; B366130220D5D9BC00E7DC3E /* MWMCatalogCategory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMCatalogCategory.h; sourceTree = ""; }; B366130320D5D9BC00E7DC3E /* MWMCatalogCategory.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MWMCatalogCategory.m; sourceTree = ""; }; B366130520D5DD2300E7DC3E /* MWMCatalogCategory+Convenience.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "MWMCatalogCategory+Convenience.h"; sourceTree = ""; }; @@ -4114,6 +4116,7 @@ 3404F4A02028A6C00090E401 /* Categories */, FA054610155C465E001F4E37 /* SelectSetVC.h */, FA054611155C465E001F4E37 /* SelectSetVC.mm */, + B33D21B720E130D000BAD749 /* BookmarksTabViewController.swift */, ); path = Bookmarks; sourceTree = ""; @@ -4721,6 +4724,7 @@ 34BBD65C1F826FD30070CA50 /* AuthorizationiPhonePresentationController.swift in Sources */, 56C74C391C74A3BC00B71B9F /* MWMInputEmailValidator.mm in Sources */, 6741A9F51BF340DE002C974C /* BookmarksVC.mm in Sources */, + B33D21B820E130D000BAD749 /* BookmarksTabViewController.swift in Sources */, 3404754A1E081A4600C92850 /* AppInfo.mm in Sources */, 34AB662F1FC5AA330078E451 /* RouteManageriPhonePresentationController.swift in Sources */, 34AB66201FC5AA330078E451 /* RouteStartButton.swift in Sources */,