Files
comaps/iphone/Maps/Classes/CustomViews/MapViewControls/MWMMapViewControlsManager.mm
Kiryl Kaveryn b79724f248 [ios] implement TrackRecording place page
1. add an new screen (layout)
2. add TR icon for the bottom tabbar
3. share current location from the TR PP
4. refactor TR manager to properly handle state updates and pass them to the LiveActivityManager and PlacePage
5. add init/update with TrackInfo/EleInfo methods to the PlacePageData and PlacePagePreviewData to update the PP state
Signed-off-by: Kiryl Kaveryn <kirylkaveryn@gmail.com>
2025-06-17 11:36:04 +02:00

335 lines
11 KiB
Plaintext

#import "MWMMapViewControlsManager.h"
#import "MWMAddPlaceNavigationBar.h"
#import "MWMMapDownloadDialog.h"
#import "MWMMapViewControlsManager+AddPlace.h"
#import "MWMNetworkPolicy+UI.h"
#import "MWMPlacePageManager.h"
#import "MWMPlacePageProtocol.h"
#import "MWMSideButtons.h"
#import "MWMTrafficButtonViewController.h"
#import "MWMMapWidgetsHelper.h"
#import "MapViewController.h"
#import "MapsAppDelegate.h"
#import "SwiftBridge.h"
#include <CoreApi/Framework.h>
#import <CoreApi/MWMFrameworkHelper.h>
#include "platform/local_country_file_utils.hpp"
#include "platform/platform.hpp"
#include "storage/storage_helpers.hpp"
#include "map/place_page_info.hpp"
namespace {
NSString *const kMapToCategorySelectorSegue = @"MapToCategorySelectorSegue";
} // namespace
@interface MWMMapViewControlsManager () <BottomMenuDelegate>
@property(nonatomic) MWMSideButtons * sideButtons;
@property(nonatomic) MWMTrafficButtonViewController * trafficButton;
@property(nonatomic) UIButton * promoButton;
@property(nonatomic) UIViewController * menuController;
@property(nonatomic) id<MWMPlacePageProtocol> placePageManager;
@property(nonatomic) MWMNavigationDashboardManager * navigationManager;
@property(nonatomic) SearchOnMapManager * searchManager;
@property(weak, nonatomic) MapViewController * ownerController;
@property(nonatomic) BOOL disableStandbyOnRouteFollowing;
@property(nonatomic) BOOL isAddingPlace;
@end
@implementation MWMMapViewControlsManager
+ (MWMMapViewControlsManager *)manager {
return [MapViewController sharedController].controlsManager;
}
- (instancetype)initWithParentController:(MapViewController *)controller {
if (!controller)
return nil;
self = [super init];
if (!self)
return nil;
self.ownerController = controller;
self.hidden = NO;
self.sideButtonsHidden = NO;
self.trafficButtonHidden = NO;
self.isDirectionViewHidden = YES;
self.menuState = MWMBottomMenuStateInactive;
self.menuRestoreState = MWMBottomMenuStateInactive;
self.isAddingPlace = NO;
self.searchManager = controller.searchManager;
return self;
}
- (UIStatusBarStyle)preferredStatusBarStyle {
BOOL const isNavigationUnderStatusBar = self.navigationManager.state != MWMNavigationDashboardStateHidden &&
self.navigationManager.state != MWMNavigationDashboardStateNavigation;
BOOL const isMenuViewUnderStatusBar = self.menuState == MWMBottomMenuStateActive;
BOOL const isDirectionViewUnderStatusBar = !self.isDirectionViewHidden;
BOOL const isAddPlaceUnderStatusBar =
[self.ownerController.view hasSubviewWithViewClass:[MWMAddPlaceNavigationBar class]];
BOOL const isNightMode = [UIColor isNightMode];
BOOL const isSomethingUnderStatusBar = isNavigationUnderStatusBar ||
isDirectionViewUnderStatusBar || isMenuViewUnderStatusBar ||
isAddPlaceUnderStatusBar;
return isSomethingUnderStatusBar || isNightMode ? UIStatusBarStyleLightContent : UIStatusBarStyleDefault;
}
#pragma mark - Layout
- (UIView *)anchorView {
return self.tabBarController.view;
}
- (void)viewWillTransitionToSize:(CGSize)size
withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
[self.trafficButton viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
[self.trackRecordingButton viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
[self.tabBarController viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
}
#pragma mark - MWMPlacePageViewManager
- (void)searchOnMap:(SearchQuery *)query {
if (![self search:query])
return;
[self.searchManager startSearchingWithIsRouting:NO];
}
- (BOOL)search:(SearchQuery *)query {
if (query.text.length == 0)
return NO;
[self.searchManager startSearchingWithIsRouting:NO];
[self.searchManager searchText:query];
return YES;
}
#pragma mark - BottomMenu
- (void)actionDownloadMaps:(MWMMapDownloaderMode)mode {
[self.ownerController openMapsDownloader:mode];
}
- (void)didFinishAddingPlace {
self.isAddingPlace = NO;
self.trafficButtonHidden = NO;
self.menuState = MWMBottomMenuStateInactive;
}
- (void)addPlace {
[self addPlace:NO position:nullptr];
}
- (void)addPlace:(BOOL)isBusiness position:(m2::PointD const *)optionalPosition {
MapViewController *ownerController = self.ownerController;
self.isAddingPlace = YES;
[self.searchManager close];
self.menuState = MWMBottomMenuStateHidden;
self.trafficButtonHidden = YES;
[ownerController dismissPlacePage];
[MWMAddPlaceNavigationBar showInSuperview:ownerController.view
isBusiness:isBusiness
position:optionalPosition
doneBlock:^{
if ([MWMFrameworkHelper canEditMapAtViewportCenter])
[ownerController performSegueWithIdentifier:kMapToCategorySelectorSegue sender:nil];
else
[ownerController.alertController presentIncorrectFeauturePositionAlert];
[self didFinishAddingPlace];
}
cancelBlock:^{
[self didFinishAddingPlace];
}];
[ownerController setNeedsStatusBarAppearanceUpdate];
}
#pragma mark - MWMNavigationDashboardManager
- (void)setDisableStandbyOnRouteFollowing:(BOOL)disableStandbyOnRouteFollowing {
if (_disableStandbyOnRouteFollowing == disableStandbyOnRouteFollowing)
return;
_disableStandbyOnRouteFollowing = disableStandbyOnRouteFollowing;
if (disableStandbyOnRouteFollowing)
[[MapsAppDelegate theApp] disableStandby];
else
[[MapsAppDelegate theApp] enableStandby];
}
#pragma mark - Routing
- (void)onRoutePrepare {
auto nm = self.navigationManager;
[nm onRoutePrepare];
[nm onRoutePointsUpdated];
[self.ownerController.bookmarksCoordinator close];
self.promoButton.hidden = YES;
}
- (void)onRouteRebuild {
[self.ownerController.bookmarksCoordinator close];
[self.navigationManager onRoutePlanning];
self.promoButton.hidden = YES;
}
- (void)onRouteReady:(BOOL)hasWarnings {
[self.navigationManager onRouteReady:hasWarnings];
self.promoButton.hidden = YES;
}
- (void)onRouteStart {
self.hidden = NO;
self.sideButtons.zoomHidden = self.zoomHidden;
self.sideButtonsHidden = NO;
self.disableStandbyOnRouteFollowing = YES;
self.trafficButtonHidden = YES;
[self.navigationManager onRouteStart];
self.promoButton.hidden = YES;
}
- (void)onRouteStop {
self.sideButtons.zoomHidden = self.zoomHidden;
[self.navigationManager onRouteStop];
self.disableStandbyOnRouteFollowing = NO;
self.trafficButtonHidden = NO;
self.promoButton.hidden = YES;
}
#pragma mark - Properties
- (MWMSideButtons *)sideButtons {
if (!_sideButtons)
_sideButtons = [[MWMSideButtons alloc] initWithParentView:self.ownerController.controlsView];
return _sideButtons;
}
- (MWMTrafficButtonViewController *)trafficButton {
if (!_trafficButton)
_trafficButton = [[MWMTrafficButtonViewController alloc] init];
return _trafficButton;
}
- (BottomTabBarViewController *)tabBarController {
if (!_tabBarController) {
MapViewController * ownerController = _ownerController;
_tabBarController = [BottomTabBarBuilder buildWithMapViewController:ownerController controlsManager:self];
[ownerController addChildViewController:_tabBarController];
UIView * tabBarViewSuperView = ownerController.controlsView;
[tabBarViewSuperView addSubview:_tabBarController.view];
}
return _tabBarController;
}
- (id<MWMPlacePageProtocol>)placePageManager {
if (!_placePageManager)
_placePageManager = [[MWMPlacePageManager alloc] init];
return _placePageManager;
}
- (MWMNavigationDashboardManager *)navigationManager {
if (!_navigationManager)
_navigationManager = [[MWMNavigationDashboardManager alloc] initWithParentView:self.ownerController.controlsView];
return _navigationManager;
}
@synthesize menuState = _menuState;
- (void)setHidden:(BOOL)hidden {
if (_hidden == hidden)
return;
// Do not hide the controls view during the place adding process.
if (!_isAddingPlace)
_hidden = hidden;
self.sideButtonsHidden = _sideButtonsHidden;
self.trafficButtonHidden = _trafficButtonHidden;
self.menuState = hidden ? MWMBottomMenuStateHidden : MWMBottomMenuStateInactive;
}
- (void)setZoomHidden:(BOOL)zoomHidden {
_zoomHidden = zoomHidden;
self.sideButtons.zoomHidden = zoomHidden;
}
- (void)setSideButtonsHidden:(BOOL)sideButtonsHidden {
_sideButtonsHidden = sideButtonsHidden;
self.sideButtons.hidden = self.hidden || sideButtonsHidden;
}
- (void)setTrafficButtonHidden:(BOOL)trafficButtonHidden {
BOOL const isNavigation = self.navigationManager.state == MWMNavigationDashboardStateNavigation;
_trafficButtonHidden = isNavigation || trafficButtonHidden;
self.trafficButton.hidden = self.hidden || _trafficButtonHidden;
}
- (void)setTrackRecordingButtonState:(TrackRecordingButtonState)state {
if (!_trackRecordingButton) {
_trackRecordingButton = [[TrackRecordingButtonViewController alloc] init];
}
[self.trackRecordingButton setState:state completion:^{
[MWMMapWidgetsHelper updateLayoutForAvailableArea];
}];
if (state == TrackRecordingButtonStateClosed)
_trackRecordingButton = nil;
}
- (void)setMenuState:(MWMBottomMenuState)menuState {
_menuState = menuState;
MapViewController * ownerController = _ownerController;
switch (_menuState) {
case MWMBottomMenuStateActive:
_tabBarController.isHidden = NO;
if (_menuController == nil) {
_menuController = [BottomMenuBuilder buildMenuWithMapViewController:ownerController
controlsManager:self
delegate:self];
[ownerController presentViewController:_menuController animated:YES completion:nil];
}
break;
case MWMBottomMenuStateLayers:
_tabBarController.isHidden = NO;
if (_menuController == nil) {
_menuController = [BottomMenuBuilder buildLayersWithMapViewController:ownerController
controlsManager:self
delegate:self];
[ownerController presentViewController:_menuController animated:YES completion:nil];
}
break;
case MWMBottomMenuStateInactive:
_tabBarController.isHidden = NO;
if (_menuController != nil) {
[_menuController dismissViewControllerAnimated:YES completion:nil];
_menuController = nil;
}
break;
case MWMBottomMenuStateHidden:
_tabBarController.isHidden = YES;
if (_menuController != nil) {
[_menuController dismissViewControllerAnimated:YES completion:nil];
_menuController = nil;
}
break;
default:
break;
}
}
#pragma mark - MWMFeatureHolder
- (id<MWMFeatureHolder>)featureHolder {
return self.placePageManager;
}
@end