Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/iphone
diff options
context:
space:
mode:
authorIlya Grechuhin <i.grechuhin@mapswithme.com>2015-07-13 15:55:49 +0300
committerAlex Zolotarev <alex@maps.me>2015-09-23 02:55:43 +0300
commit30f952d5993f26bc787a40a5e1a175e5c6897605 (patch)
tree7c03af8ff59bed74ba658dc95db492793623fce3 /iphone
parentc063b8cf6bd3d76009bd2282efbe85fc632b5378 (diff)
[ios] Added download on search.
Diffstat (limited to 'iphone')
-rw-r--r--iphone/Maps/Classes/Common.h11
-rw-r--r--iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequest.h38
-rw-r--r--iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequest.m163
-rw-r--r--iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequest.xib160
-rw-r--r--iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequestView.h17
-rw-r--r--iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequestView.m82
-rw-r--r--iphone/Maps/Classes/CustomViews/MapViewControls/SideMenu/MWMSideMenuManager.mm5
-rw-r--r--iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequest.h25
-rw-r--r--iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequest.m112
-rw-r--r--iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequest.xib78
-rw-r--r--iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequestView.h19
-rw-r--r--iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequestView.m58
-rw-r--r--iphone/Maps/Classes/MWMNavigationDelegate.h13
-rw-r--r--iphone/Maps/Classes/MapViewController.h9
-rw-r--r--iphone/Maps/Classes/MapViewController.mm107
-rw-r--r--iphone/Maps/Classes/SearchView.h20
-rw-r--r--iphone/Maps/Classes/SearchView.mm120
-rw-r--r--iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOff.imageset/Contents.json23
-rw-r--r--iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOff.imageset/radioBtnOff@1x.pngbin0 -> 444 bytes
-rw-r--r--iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOff.imageset/radioBtnOff@2x.pngbin0 -> 907 bytes
-rw-r--r--iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOff.imageset/radioBtnOff@3x.pngbin0 -> 1599 bytes
-rw-r--r--iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOn.imageset/Contents.json23
-rw-r--r--iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOn.imageset/radioBtnOn@1x.pngbin0 -> 703 bytes
-rw-r--r--iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOn.imageset/radioBtnOn@2x.pngbin0 -> 1424 bytes
-rw-r--r--iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOn.imageset/radioBtnOn@3x.pngbin0 -> 2292 bytes
-rw-r--r--iphone/Maps/Maps.xcodeproj/project.pbxproj50
26 files changed, 1116 insertions, 17 deletions
diff --git a/iphone/Maps/Classes/Common.h b/iphone/Maps/Classes/Common.h
index eee722dc78..294388c15e 100644
--- a/iphone/Maps/Classes/Common.h
+++ b/iphone/Maps/Classes/Common.h
@@ -58,3 +58,14 @@ static inline BOOL isIOSVersionLessThan(NSUInteger version)
{
return isIOSVersionLessThan([NSString stringWithFormat:@"%@", @(version)]);
}
+
+static inline NSString * formattedSize(uint64_t size)
+{
+ uint64_t const mb = 1024 * 1024;
+ NSString * sizeString;
+ if (size > mb)
+ sizeString = [NSString stringWithFormat:@"%llu %@", (size + 512 * 1024) / mb, NSLocalizedString(@"mb", nil)];
+ else
+ sizeString = [NSString stringWithFormat:@"%llu %@", (size + 1023) / 1024, NSLocalizedString(@"kb", nil)];
+ return [sizeString uppercaseString];
+}
diff --git a/iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequest.h b/iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequest.h
new file mode 100644
index 0000000000..bcfc175856
--- /dev/null
+++ b/iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequest.h
@@ -0,0 +1,38 @@
+//
+// MWMDownloadMapRequest.h
+// Maps
+//
+// Created by Ilya Grechuhin on 10.07.15.
+// Copyright (c) 2015 MapsWithMe. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "MWMCircularProgress.h"
+
+typedef void (^MWMDownloadMapRequestDownloadCallback)(BOOL);
+typedef void (^MWMDownloadMapRequestSelectCallback)();
+
+NS_ENUM(NSUInteger, MWMDownloadMapRequestState)
+{
+ MWMDownloadMapRequestHidden,
+ MWMDownloadMapRequestLocation,
+ MWMDownloadMapRequestUnknownLocation,
+ MWMDownloadMapRequestProgress
+};
+
+@interface MWMDownloadMapRequest : NSObject
+
+@property (nonatomic, readonly) enum MWMDownloadMapRequestState state;
+
+- (nonnull instancetype)init __attribute__((unavailable("init is not available")));
+- (nonnull instancetype)initWithParentView:(nonnull UIView *)parentView delegate:(nonnull id <MWMCircularProgressDelegate>)delegate;
+
+- (void)showForLocationWithName:(nonnull NSString *)countryName mapSize:(nonnull NSString *)mapSize mapAndRouteSize:(nonnull NSString *)mapAndRouteSize download:(nonnull MWMDownloadMapRequestDownloadCallback)download select:(nonnull MWMDownloadMapRequestSelectCallback)select;
+- (void)showForUnknownLocation:(nonnull MWMDownloadMapRequestSelectCallback)select;
+
+- (void)startDownload;
+- (void)stopDownload;
+- (void)downloadProgress:(CGFloat)progress countryName:(nonnull NSString *)countryName;
+- (void)setDownloadFailed;
+
+@end
diff --git a/iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequest.m b/iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequest.m
new file mode 100644
index 0000000000..30f5f89806
--- /dev/null
+++ b/iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequest.m
@@ -0,0 +1,163 @@
+//
+// MWMDownloadMapRequest.m
+// Maps
+//
+// Created by Ilya Grechuhin on 10.07.15.
+// Copyright (c) 2015 MapsWithMe. All rights reserved.
+//
+
+#import "Macros.h"
+#import "MWMDownloadMapRequest.h"
+#import "MWMDownloadMapRequestView.h"
+#import "MWMCircularProgress.h"
+#import "UIButton+RuntimeAttributes.h"
+#import "UIColor+MapsMeColor.h"
+
+@interface MWMDownloadMapRequest ()
+
+@property (nonatomic) IBOutlet MWMDownloadMapRequestView * rootView;
+@property (nonatomic) IBOutlet UILabel * mapTitleLabel;
+@property (nonatomic) IBOutlet UIButton * downloadMapButton;
+@property (nonatomic) IBOutlet UIButton * downloadRoutesButton;
+@property (nonatomic) IBOutlet UILabel * undefinedLocationLabel;
+@property (nonatomic) IBOutlet UIButton * selectAnotherMapButton;
+@property (nonatomic) IBOutlet UIView * progressViewWrapper;
+
+@property (nonatomic) MWMCircularProgress * progressView;
+
+@property (copy, nonatomic) MWMDownloadMapRequestDownloadCallback downloadBlock;
+@property (copy, nonatomic) MWMDownloadMapRequestSelectCallback selectBlock;
+
+@property (copy, nonatomic) NSString * mapSize;
+@property (copy, nonatomic) NSString * mapAndRouteSize;
+
+@property (nonatomic) enum MWMDownloadMapRequestState state;
+
+@property (nonnull, weak, nonatomic) id <MWMCircularProgressDelegate> delegate;
+
+@end
+
+@implementation MWMDownloadMapRequest
+
+- (nonnull instancetype)initWithParentView:(nonnull UIView *)parentView delegate:(nonnull id <MWMCircularProgressDelegate>)delegate
+{
+ self = [super init];
+ if (self)
+ {
+ [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil];
+ [parentView addSubview:self.rootView];
+ self.rootView.hidden = YES;
+ self.downloadRoutesButton.selected = YES;
+ self.delegate = delegate;
+ }
+ return self;
+}
+
+- (void)dealloc
+{
+ [self.rootView removeFromSuperview];
+}
+
+- (void)showForLocationWithName:(nonnull NSString *)countryName mapSize:(nonnull NSString *)mapSize mapAndRouteSize:(nonnull NSString *)mapAndRouteSize download:(nonnull MWMDownloadMapRequestDownloadCallback)download select:(nonnull MWMDownloadMapRequestSelectCallback)select
+{
+ [self stopDownload];
+ self.mapTitleLabel.text = countryName;
+ [self.downloadMapButton setTitle:[NSString stringWithFormat:@"%@ (%@)", L(@"downloader_download_map"), mapAndRouteSize] forState:UIControlStateNormal];
+ [self.downloadRoutesButton setTitle:L(@"search_vehicle_routes") forState:UIControlStateNormal];
+
+ [self.selectAnotherMapButton setTitle:L(@"search_select_other_map") forState:UIControlStateNormal];
+ [self.selectAnotherMapButton setTitleColor:[UIColor primary] forState:UIControlStateNormal];
+ [self.selectAnotherMapButton setTitleColor:[UIColor whiteColor] forState:UIControlStateHighlighted];
+ [self.selectAnotherMapButton setBackgroundColor:[UIColor whiteColor] forState:UIControlStateNormal];
+ [self.selectAnotherMapButton setBackgroundColor:[UIColor primary] forState:UIControlStateHighlighted];
+
+ self.mapSize = mapSize;
+ self.mapAndRouteSize = mapAndRouteSize;
+ self.downloadBlock = download;
+ self.selectBlock = select;
+}
+
+- (void)showForUnknownLocation:(nonnull MWMDownloadMapRequestSelectCallback)select
+{
+ self.rootView.hidden = NO;
+ self.progressViewWrapper.hidden = YES;
+ self.mapTitleLabel.hidden = YES;
+ self.downloadMapButton.hidden = YES;
+ self.downloadRoutesButton.hidden = YES;
+ self.undefinedLocationLabel.hidden = NO;
+ [self.selectAnotherMapButton setTitle:L(@"search_select_map") forState:UIControlStateNormal];
+
+ [self.selectAnotherMapButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
+ [self.selectAnotherMapButton setBackgroundColor:[UIColor primary] forState:UIControlStateNormal];
+ [self.selectAnotherMapButton setBackgroundColor:[UIColor primaryDark] forState:UIControlStateHighlighted];
+
+ self.selectBlock = select;
+ self.state = MWMDownloadMapRequestUnknownLocation;
+}
+
+#pragma mark - Process control
+
+- (void)startDownload
+{
+ self.progressView = [[MWMCircularProgress alloc] initWithParentView:self.progressViewWrapper delegate:self.delegate];
+ self.rootView.hidden = NO;
+ self.progressViewWrapper.hidden = NO;
+ self.mapTitleLabel.hidden = NO;
+ self.downloadMapButton.hidden = YES;
+ self.downloadRoutesButton.hidden = YES;
+ self.undefinedLocationLabel.hidden = YES;
+ self.selectAnotherMapButton.hidden = YES;
+ self.state = MWMDownloadMapRequestProgress;
+}
+
+- (void)stopDownload
+{
+ self.rootView.hidden = NO;
+ self.progressViewWrapper.hidden = YES;
+ self.mapTitleLabel.hidden = NO;
+ self.downloadMapButton.hidden = NO;
+ self.downloadRoutesButton.hidden = NO;
+ self.undefinedLocationLabel.hidden = YES;
+ self.selectAnotherMapButton.hidden = NO;
+ self.state = MWMDownloadMapRequestLocation;
+}
+
+- (void)downloadProgress:(CGFloat)progress countryName:(nonnull NSString *)countryName
+{
+ self.progressView.failed = NO;
+ self.progressView.progress = progress;
+ self.mapTitleLabel.text = countryName;
+}
+
+- (void)setDownloadFailed
+{
+ self.progressView.failed = YES;
+}
+
+#pragma mark - Actions
+
+- (IBAction)downloadMapTouchUpInside:(nonnull UIButton *)sender
+{
+ self.downloadBlock(self.downloadRoutesButton.selected);
+}
+
+- (IBAction)downloadRoutesTouchUpInside:(nonnull UIButton *)sender
+{
+ sender.selected = !sender.selected;
+ [self.downloadMapButton setTitle:[NSString stringWithFormat:@"%@ (%@)", L(@"downloader_download_map"), sender.selected ? self.mapAndRouteSize : self.mapSize] forState:UIControlStateNormal];
+}
+
+- (IBAction)selectMapTouchUpInside:(nonnull UIButton *)sender
+{
+ self.selectBlock();
+}
+
+#pragma mark - Properties
+
+- (void)setState:(enum MWMDownloadMapRequestState)state
+{
+ _state = state;
+ [self.rootView layoutSubviews];
+}
+
+@end
diff --git a/iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequest.xib b/iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequest.xib
new file mode 100644
index 0000000000..7795927db9
--- /dev/null
+++ b/iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequest.xib
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MWMDownloadMapRequest">
+ <connections>
+ <outlet property="downloadMapButton" destination="ANW-J1-K9x" id="oE3-7R-Pyf"/>
+ <outlet property="downloadRoutesButton" destination="Ns9-3f-AnX" id="lxd-NO-JwR"/>
+ <outlet property="mapTitleLabel" destination="ldF-A5-Jo3" id="r20-cg-aHn"/>
+ <outlet property="progressViewWrapper" destination="Axo-F2-0Xb" id="8PW-T9-Wav"/>
+ <outlet property="rootView" destination="wdy-tr-47e" id="vKe-K9-3Io"/>
+ <outlet property="selectAnotherMapButton" destination="q7R-7R-aMD" id="StJ-Aq-Jo7"/>
+ <outlet property="undefinedLocationLabel" destination="0HQ-hc-mvu" id="H7G-lT-OqQ"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view contentMode="scaleToFill" id="wdy-tr-47e" customClass="MWMDownloadMapRequestView">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="251"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Moscow &amp; Central" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="288" translatesAutoresizingMaskIntoConstraints="NO" id="ldF-A5-Jo3">
+ <rect key="frame" x="16" y="10" width="288" height="21"/>
+ <fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="18"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ <userDefinedRuntimeAttributes>
+ <userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular18"/>
+ <userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
+ </userDefinedRuntimeAttributes>
+ </label>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Axo-F2-0Xb" userLabel="ProgressViewWrapper">
+ <rect key="frame" x="144" y="55" width="32" height="32"/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstAttribute="width" constant="32" id="CcH-aB-wPy"/>
+ <constraint firstAttribute="height" constant="32" id="j9b-F2-Mcs"/>
+ </constraints>
+ </view>
+ <button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ANW-J1-K9x">
+ <rect key="frame" x="40" y="51" width="240" height="44"/>
+ <color key="backgroundColor" red="0.12156862745098039" green="0.59999999999999998" blue="0.32156862745098036" alpha="1" colorSpace="calibratedRGB"/>
+ <constraints>
+ <constraint firstAttribute="width" constant="240" id="Nrd-CA-zhn"/>
+ <constraint firstAttribute="height" constant="44" id="tID-44-te5"/>
+ </constraints>
+ <fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="16"/>
+ <state key="normal" title="Скачать карту">
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <userDefinedRuntimeAttributes>
+ <userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="whiteColor"/>
+ <userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="primary"/>
+ <userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular16"/>
+ <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+ <integer key="value" value="8"/>
+ </userDefinedRuntimeAttribute>
+ <userDefinedRuntimeAttribute type="string" keyPath="backgroundHighlightedColorName" value="primaryDark"/>
+ </userDefinedRuntimeAttributes>
+ <connections>
+ <action selector="downloadMapTouchUpInside:" destination="-1" eventType="touchUpInside" id="tMi-t3-4NI"/>
+ </connections>
+ </button>
+ <button opaque="NO" contentMode="scaleToFill" selected="YES" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Ns9-3f-AnX">
+ <rect key="frame" x="40" y="115" width="240" height="24"/>
+ <constraints>
+ <constraint firstAttribute="height" constant="24" id="FMy-No-TLl"/>
+ </constraints>
+ <fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="14"/>
+ <inset key="titleEdgeInsets" minX="8" minY="0.0" maxX="0.0" maxY="0.0"/>
+ <state key="normal" title="Автомобильные маршруты" image="radioBtnOff">
+ <color key="titleColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <state key="selected" image="radioBtnOn"/>
+ <connections>
+ <action selector="downloadRoutesTouchUpInside:" destination="-1" eventType="touchUpInside" id="0Zh-cL-WYE"/>
+ </connections>
+ </button>
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Ваше местоположение не определено" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="288" translatesAutoresizingMaskIntoConstraints="NO" id="0HQ-hc-mvu">
+ <rect key="frame" x="16" y="145" width="288" height="17"/>
+ <fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="14"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="0.54000000000000004" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ <userDefinedRuntimeAttributes>
+ <userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular14"/>
+ <userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackSecondaryText"/>
+ <userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="unknown_current_position"/>
+ </userDefinedRuntimeAttributes>
+ </label>
+ <button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="q7R-7R-aMD">
+ <rect key="frame" x="40" y="183" width="240" height="44"/>
+ <fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="16"/>
+ <state key="normal" title="Выбрать другую карту">
+ <color key="titleColor" red="0.1215686275" green="0.59999999999999998" blue="0.32156862749999998" alpha="1" colorSpace="calibratedRGB"/>
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <userDefinedRuntimeAttributes>
+ <userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="primary"/>
+ <userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular16"/>
+ <userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
+ <integer key="value" value="8"/>
+ </userDefinedRuntimeAttribute>
+ <userDefinedRuntimeAttribute type="string" keyPath="layer.borderColorName" value="primary"/>
+ <userDefinedRuntimeAttribute type="number" keyPath="layer.borderWidth">
+ <integer key="value" value="1"/>
+ </userDefinedRuntimeAttribute>
+ <userDefinedRuntimeAttribute type="string" keyPath="textColorHighlightedName" value="whiteColor"/>
+ <userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="whiteColor"/>
+ <userDefinedRuntimeAttribute type="string" keyPath="backgroundHighlightedColorName" value="primary"/>
+ </userDefinedRuntimeAttributes>
+ <connections>
+ <action selector="selectMapTouchUpInside:" destination="-1" eventType="touchUpInside" id="RXu-BP-tNk"/>
+ </connections>
+ </button>
+ </subviews>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstItem="ANW-J1-K9x" firstAttribute="top" secondItem="ldF-A5-Jo3" secondAttribute="bottom" constant="20" id="8ct-NO-wGh"/>
+ <constraint firstAttribute="trailing" secondItem="ldF-A5-Jo3" secondAttribute="trailing" constant="16" id="KsU-Ev-FCI"/>
+ <constraint firstItem="q7R-7R-aMD" firstAttribute="top" secondItem="Ns9-3f-AnX" secondAttribute="bottom" constant="44" id="SM5-r0-AS2"/>
+ <constraint firstItem="Axo-F2-0Xb" firstAttribute="top" secondItem="ldF-A5-Jo3" secondAttribute="bottom" constant="24" id="SnX-Nf-mt9"/>
+ <constraint firstAttribute="bottom" secondItem="q7R-7R-aMD" secondAttribute="bottom" constant="24" id="d8R-jg-AMN"/>
+ <constraint firstItem="ANW-J1-K9x" firstAttribute="height" secondItem="q7R-7R-aMD" secondAttribute="height" id="eXG-Oy-6Vx"/>
+ <constraint firstItem="Ns9-3f-AnX" firstAttribute="centerX" secondItem="ANW-J1-K9x" secondAttribute="centerX" id="fir-kl-M8E"/>
+ <constraint firstItem="ANW-J1-K9x" firstAttribute="width" secondItem="q7R-7R-aMD" secondAttribute="width" id="gY4-nk-yaY"/>
+ <constraint firstItem="ANW-J1-K9x" firstAttribute="centerX" secondItem="q7R-7R-aMD" secondAttribute="centerX" id="gfS-3M-5zg"/>
+ <constraint firstItem="Ns9-3f-AnX" firstAttribute="width" secondItem="ANW-J1-K9x" secondAttribute="width" id="hQI-Kw-RlX"/>
+ <constraint firstItem="ldF-A5-Jo3" firstAttribute="centerX" secondItem="ANW-J1-K9x" secondAttribute="centerX" id="lWc-tH-1Oi"/>
+ <constraint firstItem="ldF-A5-Jo3" firstAttribute="leading" secondItem="wdy-tr-47e" secondAttribute="leading" constant="16" id="mFv-Dr-2pb"/>
+ <constraint firstAttribute="trailing" secondItem="0HQ-hc-mvu" secondAttribute="trailing" constant="16" id="o8v-fv-loA"/>
+ <constraint firstItem="0HQ-hc-mvu" firstAttribute="leading" secondItem="wdy-tr-47e" secondAttribute="leading" constant="16" id="tED-fC-gYF"/>
+ <constraint firstItem="q7R-7R-aMD" firstAttribute="top" secondItem="0HQ-hc-mvu" secondAttribute="bottom" constant="22" id="u95-8m-bpq"/>
+ <constraint firstItem="Ns9-3f-AnX" firstAttribute="top" secondItem="ANW-J1-K9x" secondAttribute="bottom" constant="20" id="uJa-y4-6sW"/>
+ <constraint firstItem="ldF-A5-Jo3" firstAttribute="centerX" secondItem="Axo-F2-0Xb" secondAttribute="centerX" id="w4N-6B-zSQ"/>
+ </constraints>
+ <nil key="simulatedStatusBarMetrics"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ <connections>
+ <outlet property="bottomSpacing" destination="d8R-jg-AMN" id="NKs-4Y-gl7"/>
+ <outlet property="mapTitleLabel" destination="ldF-A5-Jo3" id="SCT-Zb-Xxq"/>
+ <outlet property="owner" destination="-1" id="uiR-Xb-rRc"/>
+ <outlet property="unknownPositionLabelBottomOffset" destination="u95-8m-bpq" id="qXZ-7m-zS1"/>
+ <outlet property="verticalFreeSpace" destination="SM5-r0-AS2" id="aXL-lW-az3"/>
+ </connections>
+ <point key="canvasLocation" x="71" y="376"/>
+ </view>
+ </objects>
+ <resources>
+ <image name="radioBtnOff" width="22" height="22"/>
+ <image name="radioBtnOn" width="22" height="22"/>
+ </resources>
+ <simulatedMetricsContainer key="defaultSimulatedMetrics">
+ <simulatedStatusBarMetrics key="statusBar"/>
+ <simulatedOrientationMetrics key="orientation"/>
+ <simulatedScreenMetrics key="destination" type="retina4"/>
+ </simulatedMetricsContainer>
+</document>
diff --git a/iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequestView.h b/iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequestView.h
new file mode 100644
index 0000000000..ef20a750f9
--- /dev/null
+++ b/iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequestView.h
@@ -0,0 +1,17 @@
+//
+// MWMDownloadMapRequestView.h
+// Maps
+//
+// Created by Ilya Grechuhin on 10.07.15.
+// Copyright (c) 2015 MapsWithMe. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import "UIKitCategories.h"
+
+@interface MWMDownloadMapRequestView : SolidTouchView
+
+- (instancetype)initWithFrame:(CGRect)frame __attribute__((unavailable("initWithFrame is not available")));
+- (instancetype)init __attribute__((unavailable("init is not available")));
+
+@end
diff --git a/iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequestView.m b/iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequestView.m
new file mode 100644
index 0000000000..23c19a0e03
--- /dev/null
+++ b/iphone/Maps/Classes/CustomViews/DownloadMapRequest/MWMDownloadMapRequestView.m
@@ -0,0 +1,82 @@
+//
+// MWMDownloadMapRequestView.m
+// Maps
+//
+// Created by Ilya Grechuhin on 10.07.15.
+// Copyright (c) 2015 MapsWithMe. All rights reserved.
+//
+
+#import "MWMDownloadMapRequest.h"
+#import "MWMDownloadMapRequestView.h"
+#import "UIKitCategories.h"
+
+@interface MWMDownloadMapRequestView ()
+
+@property (weak, nonatomic) IBOutlet UILabel * mapTitleLabel;
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint * verticalFreeSpace;
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint * bottomSpacing;
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint * unknownPositionLabelBottomOffset;
+@property (weak, nonatomic) IBOutlet MWMDownloadMapRequest * owner;
+
+@end
+
+@implementation MWMDownloadMapRequestView
+
+- (void)layoutSubviews
+{
+ [super layoutSubviews];
+ UIView * superview = self.superview;
+ BOOL const isLandscape = superview.height > superview.width;
+ if (IPAD || isLandscape)
+ {
+ self.verticalFreeSpace.constant = 44.0;
+ self.bottomSpacing.constant = 24.0;
+ self.unknownPositionLabelBottomOffset.constant = 22.0;
+ }
+ else
+ {
+ self.verticalFreeSpace.constant = 20.0;
+ self.bottomSpacing.constant = 8.0;
+ self.unknownPositionLabelBottomOffset.constant = 18.0;
+ CGFloat const iPhone6LandscapeHeight = 375.0;
+ if (self.width < iPhone6LandscapeHeight)
+ {
+ self.mapTitleLabel.lineBreakMode = NSLineBreakByTruncatingTail;
+ self.mapTitleLabel.numberOfLines = 1;
+ }
+ else
+ {
+ self.mapTitleLabel.lineBreakMode = NSLineBreakByWordWrapping;
+ self.mapTitleLabel.numberOfLines = 0;
+ }
+ }
+ self.width = superview.width;
+ self.minX = 0.0;
+ if (self.minY > 0.0)
+ {
+ [UIView animateWithDuration:0.3 animations:^
+ {
+ [self move];
+ }];
+ }
+ else
+ {
+ [self move];
+ }
+}
+
+- (void)move
+{
+ if (self.owner.state == MWMDownloadMapRequestProgress)
+ {
+ UIView * superview = self.superview;
+ BOOL const isLandscape = superview.height > superview.width;
+ self.minY = (IPAD || isLandscape) ? 0.3 * self.superview.height : 0.0;
+ }
+ else
+ {
+ self.maxY = self.superview.height;
+ }
+}
+
+@end
diff --git a/iphone/Maps/Classes/CustomViews/MapViewControls/SideMenu/MWMSideMenuManager.mm b/iphone/Maps/Classes/CustomViews/MapViewControls/SideMenu/MWMSideMenuManager.mm
index 2c2c4b2f8b..ff5e2d2f25 100644
--- a/iphone/Maps/Classes/CustomViews/MapViewControls/SideMenu/MWMSideMenuManager.mm
+++ b/iphone/Maps/Classes/CustomViews/MapViewControls/SideMenu/MWMSideMenuManager.mm
@@ -7,7 +7,6 @@
//
#import "BookmarksRootVC.h"
-#import "CountryTreeVC.h"
#import "Framework.h"
#import "LocationManager.h"
#import "MapsAppDelegate.h"
@@ -76,9 +75,7 @@ extern NSString * const kAlohalyticsTapEventKey;
- (IBAction)menuActionDownloadMaps
{
self.state = MWMSideMenuStateInactive;
- [Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"downloader"];
- CountryTreeVC * const vc = [[CountryTreeVC alloc] initWithNodePosition:-1];
- [self.controller.navigationController pushViewController:vc animated:YES];
+ [self.controller pushDownloadMaps];
}
- (IBAction)menuActionOpenSettings
diff --git a/iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequest.h b/iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequest.h
new file mode 100644
index 0000000000..f375059dd5
--- /dev/null
+++ b/iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequest.h
@@ -0,0 +1,25 @@
+//
+// MWMSearchDownloadMapRequest.h
+// Maps
+//
+// Created by Ilya Grechuhin on 10.07.15.
+// Copyright (c) 2015 MapsWithMe. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "MWMDownloadMapRequest.h"
+
+@interface MWMSearchDownloadMapRequest : NSObject
+
+- (nonnull instancetype)init __attribute__((unavailable("init is not available")));
+- (nonnull instancetype)initWithParentView:(nonnull UIView *)parentView delegate:(nonnull id <MWMCircularProgressDelegate>)delegate;
+
+- (void)showForLocationWithName:(nonnull NSString *)locationName mapSize:(nonnull NSString *)mapSize mapAndRouteSize:(nonnull NSString *)mapAndRouteSize download:(nonnull MWMDownloadMapRequestDownloadCallback)download select:(nonnull MWMDownloadMapRequestSelectCallback)select;
+- (void)showForUnknownLocation:(nonnull MWMDownloadMapRequestSelectCallback)select;
+
+- (void)startDownload;
+- (void)stopDownload;
+- (void)downloadProgress:(CGFloat)progress countryName:(nonnull NSString *)countryName;
+- (void)setDownloadFailed;
+
+@end
diff --git a/iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequest.m b/iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequest.m
new file mode 100644
index 0000000000..c1855fb2ea
--- /dev/null
+++ b/iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequest.m
@@ -0,0 +1,112 @@
+//
+// MWMSearchDownloadMapRequest.m
+// Maps
+//
+// Created by Ilya Grechuhin on 10.07.15.
+// Copyright (c) 2015 MapsWithMe. All rights reserved.
+//
+
+#import "MWMSearchDownloadMapRequest.h"
+#import "MWMSearchDownloadMapRequestView.h"
+
+@interface MWMSearchDownloadMapRequest ()
+
+@property (nonatomic) IBOutlet MWMSearchDownloadMapRequestView * rootView;
+@property (nonatomic) IBOutlet UIView * downloadRequestHolder;
+
+@property (nonatomic) MWMDownloadMapRequest * downloadRequest;
+@property (strong, nonatomic) IBOutlet UIButton * dimButton;
+
+@end
+
+@implementation MWMSearchDownloadMapRequest
+
+- (nonnull instancetype)initWithParentView:(nonnull UIView *)parentView delegate:(nonnull id <MWMCircularProgressDelegate>)delegate
+{
+ self = [super init];
+ if (self)
+ {
+ [[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self.class) owner:self options:nil];
+ [parentView addSubview:self.rootView];
+ self.downloadRequest = [[MWMDownloadMapRequest alloc] initWithParentView:self.downloadRequestHolder delegate:delegate];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
+ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillhide:) name:UIKeyboardWillHideNotification object:nil];
+ }
+ return self;
+}
+
+- (void)showForLocationWithName:(nonnull NSString *)locationName mapSize:(nonnull NSString *)mapSize mapAndRouteSize:(nonnull NSString *)mapAndRouteSize download:(nonnull MWMDownloadMapRequestDownloadCallback)download select:(nonnull MWMDownloadMapRequestSelectCallback)select;
+{
+ [self.downloadRequest showForLocationWithName:locationName mapSize:mapSize mapAndRouteSize:mapAndRouteSize download:download select:select];
+}
+
+- (void)showForUnknownLocation:(nonnull MWMDownloadMapRequestSelectCallback)select
+{
+ [self.downloadRequest showForUnknownLocation:select];
+}
+
+- (void)dealloc
+{
+ [[NSNotificationCenter defaultCenter] removeObserver:self];
+ [self.rootView removeFromSuperview];
+}
+
+- (void)keyboardWillShow:(nonnull NSNotification *)aNotification
+{
+ UIButton * dim = self.dimButton;
+ dim.hidden = NO;
+ dim.alpha = 0.0;
+ NSNumber * duration = aNotification.userInfo[UIKeyboardAnimationDurationUserInfoKey];
+ [UIView animateWithDuration:duration.floatValue animations:^
+ {
+ dim.alpha = 1.0;
+ }];
+}
+
+- (void)keyboardWillhide:(nonnull NSNotification *)aNotification
+{
+ UIButton * dim = self.dimButton;
+ dim.alpha = 1.0;
+ NSNumber * duration = aNotification.userInfo[UIKeyboardAnimationDurationUserInfoKey];
+ [UIView animateWithDuration:duration.floatValue animations:^
+ {
+ dim.alpha = 0.0;
+ }
+ completion:^(BOOL finished)
+ {
+ dim.hidden = YES;
+ }];
+}
+
+#pragma mark - Process control
+
+- (void)startDownload
+{
+ self.rootView.hintHidden = YES;
+ [self.downloadRequest startDownload];
+}
+
+- (void)stopDownload
+{
+ self.rootView.hintHidden = NO;
+ [self.downloadRequest stopDownload];
+}
+
+- (void)downloadProgress:(CGFloat)progress countryName:(nonnull NSString *)countryName
+{
+ [self.downloadRequest downloadProgress:progress countryName:countryName];
+}
+
+- (void)setDownloadFailed
+{
+ [self.downloadRequest setDownloadFailed];
+}
+
+#pragma mark - Actions
+
+- (IBAction)dimTouchUpInside:(nonnull UIButton *)sender
+{
+ [[UIApplication sharedApplication].keyWindow endEditing:YES];
+}
+
+@end
diff --git a/iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequest.xib b/iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequest.xib
new file mode 100644
index 0000000000..a2f5efafba
--- /dev/null
+++ b/iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequest.xib
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="7706" systemVersion="14E46" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES">
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="7703"/>
+ </dependencies>
+ <objects>
+ <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MWMSearchDownloadMapRequest">
+ <connections>
+ <outlet property="dimButton" destination="iMA-Nl-9RY" id="deG-kr-rgy"/>
+ <outlet property="downloadRequestHolder" destination="uzQ-gk-yJp" id="NLf-AO-JMD"/>
+ <outlet property="rootView" destination="wP9-g7-AZb" id="w00-AT-5Lz"/>
+ </connections>
+ </placeholder>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+ <view contentMode="scaleToFill" id="wP9-g7-AZb" customClass="MWMSearchDownloadMapRequestView">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
+ <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+ <subviews>
+ <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Для поиска мест, построения маршрута скачайте карту и интернет вам больше не понадобится." textAlignment="center" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="280" translatesAutoresizingMaskIntoConstraints="NO" id="Gwe-nt-eeI" userLabel="Hint">
+ <rect key="frame" x="20" y="40" width="280" height="49"/>
+ <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
+ <fontDescription key="fontDescription" name="HelveticaNeue" family="Helvetica Neue" pointSize="14"/>
+ <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="calibratedRGB"/>
+ <nil key="highlightedColor"/>
+ <userDefinedRuntimeAttributes>
+ <userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular14"/>
+ <userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackSecondaryText"/>
+ <userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="search_without_internet_advertisement"/>
+ </userDefinedRuntimeAttributes>
+ </label>
+ <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="uzQ-gk-yJp" userLabel="DownloadRequestHolder">
+ <rect key="frame" x="0.0" y="89" width="320" height="479"/>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ </view>
+ <button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="iMA-Nl-9RY" userLabel="Dim">
+ <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
+ <color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.26000000000000001" colorSpace="calibratedRGB"/>
+ <state key="normal">
+ <color key="titleShadowColor" white="0.5" alpha="1" colorSpace="calibratedWhite"/>
+ </state>
+ <userDefinedRuntimeAttributes>
+ <userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="blackHintText"/>
+ </userDefinedRuntimeAttributes>
+ <connections>
+ <action selector="dimTouchUpInside:" destination="-1" eventType="touchUpInside" id="bAP-fC-rHH"/>
+ </connections>
+ </button>
+ </subviews>
+ <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
+ <constraints>
+ <constraint firstAttribute="trailing" secondItem="uzQ-gk-yJp" secondAttribute="trailing" id="1sz-bn-Jdf"/>
+ <constraint firstItem="iMA-Nl-9RY" firstAttribute="leading" secondItem="wP9-g7-AZb" secondAttribute="leading" id="7Lk-yw-xOq"/>
+ <constraint firstAttribute="bottom" secondItem="uzQ-gk-yJp" secondAttribute="bottom" id="9jx-hz-YeX"/>
+ <constraint firstItem="iMA-Nl-9RY" firstAttribute="top" secondItem="wP9-g7-AZb" secondAttribute="top" id="IpH-y1-AKW"/>
+ <constraint firstItem="uzQ-gk-yJp" firstAttribute="leading" secondItem="wP9-g7-AZb" secondAttribute="leading" id="NjZ-WD-2h3"/>
+ <constraint firstAttribute="bottom" secondItem="iMA-Nl-9RY" secondAttribute="bottom" id="PEJ-EP-gTU"/>
+ <constraint firstAttribute="trailing" secondItem="iMA-Nl-9RY" secondAttribute="trailing" id="Te8-04-GWH"/>
+ <constraint firstAttribute="trailing" secondItem="Gwe-nt-eeI" secondAttribute="trailing" constant="20" id="YaN-ox-CCC"/>
+ <constraint firstItem="Gwe-nt-eeI" firstAttribute="leading" secondItem="wP9-g7-AZb" secondAttribute="leading" constant="20" id="iNJ-np-5B7"/>
+ <constraint firstItem="uzQ-gk-yJp" firstAttribute="top" secondItem="Gwe-nt-eeI" secondAttribute="bottom" id="rBW-h2-v2z"/>
+ <constraint firstItem="Gwe-nt-eeI" firstAttribute="top" secondItem="wP9-g7-AZb" secondAttribute="top" constant="40" id="y9t-mi-Gpm"/>
+ </constraints>
+ <nil key="simulatedStatusBarMetrics"/>
+ <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+ <connections>
+ <outlet property="hint" destination="Gwe-nt-eeI" id="3Eo-4z-h1w"/>
+ <outlet property="hintTopOffset" destination="y9t-mi-Gpm" id="fpl-Z4-dx8"/>
+ </connections>
+ <point key="canvasLocation" x="162" y="354"/>
+ </view>
+ </objects>
+ <simulatedMetricsContainer key="defaultSimulatedMetrics">
+ <simulatedStatusBarMetrics key="statusBar"/>
+ <simulatedOrientationMetrics key="orientation"/>
+ <simulatedScreenMetrics key="destination" type="retina4"/>
+ </simulatedMetricsContainer>
+</document>
diff --git a/iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequestView.h b/iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequestView.h
new file mode 100644
index 0000000000..bc23c0ffe7
--- /dev/null
+++ b/iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequestView.h
@@ -0,0 +1,19 @@
+//
+// MWMSearchDownloadMapRequestView.h
+// Maps
+//
+// Created by Ilya Grechuhin on 09.07.15.
+// Copyright (c) 2015 MapsWithMe. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+#import "UIKitCategories.h"
+
+@interface MWMSearchDownloadMapRequestView : SolidTouchView
+
+@property (nonatomic) BOOL hintHidden;
+
+- (instancetype)initWithFrame:(CGRect)frame __attribute__((unavailable("initWithFrame is not available")));
+- (instancetype)init __attribute__((unavailable("init is not available")));
+
+@end
diff --git a/iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequestView.m b/iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequestView.m
new file mode 100644
index 0000000000..626cd5e193
--- /dev/null
+++ b/iphone/Maps/Classes/CustomViews/SearchDownloadMapRequest/MWMSearchDownloadMapRequestView.m
@@ -0,0 +1,58 @@
+//
+// MWMSearchDownloadMapRequestView.m
+// Maps
+//
+// Created by Ilya Grechuhin on 09.07.15.
+// Copyright (c) 2015 MapsWithMe. All rights reserved.
+//
+
+#import "Macros.h"
+#import "MWMDownloadMapRequestView.h"
+#import "MWMSearchDownloadMapRequestView.h"
+#import "UIKitCategories.h"
+
+@interface MWMSearchDownloadMapRequestView ()
+
+@property (weak, nonatomic) IBOutlet UILabel * hint;
+@property (weak, nonatomic) IBOutlet NSLayoutConstraint * hintTopOffset;
+
+@end
+
+@implementation MWMSearchDownloadMapRequestView
+
+- (void)layoutSubviews
+{
+ [super layoutSubviews];
+ UIView * superview = self.superview;
+ self.frame = superview.bounds;
+ // @TODO Remove on new search!
+ CGFloat const someCrazyTopOfsetForCurrentSearchViewImplementation = 64.0;
+ CGFloat const topOffset = (IPAD || superview.height > superview.width ? 40.0 : 12.0);
+ self.hintTopOffset.constant = someCrazyTopOfsetForCurrentSearchViewImplementation + topOffset;
+}
+
+#pragma mark - Properties
+
+- (void)setHintHidden:(BOOL)hintHidden
+{
+ if (self.hint.hidden == hintHidden)
+ return;
+ if (!hintHidden)
+ self.hint.hidden = hintHidden;
+ [UIView animateWithDuration:0.3 animations:^
+ {
+ self.hint.alpha = hintHidden ? 0.0 : 1.0;
+ }
+ completion:^(BOOL finished)
+ {
+ if (hintHidden)
+ self.hint.hidden = hintHidden;
+ }];
+}
+
+- (BOOL)hintHidden
+{
+ return self.hint.hidden;
+}
+
+@end
diff --git a/iphone/Maps/Classes/MWMNavigationDelegate.h b/iphone/Maps/Classes/MWMNavigationDelegate.h
new file mode 100644
index 0000000000..883be0dc08
--- /dev/null
+++ b/iphone/Maps/Classes/MWMNavigationDelegate.h
@@ -0,0 +1,13 @@
+//
+// MWMNavigationDelegate.h
+// Maps
+//
+// Created by Ilya Grechuhin on 11.07.15.
+// Copyright (c) 2015 MapsWithMe. All rights reserved.
+//
+
+@protocol MWMNavigationDelegate <NSObject>
+
+- (void)pushDownloadMaps;
+
+@end
diff --git a/iphone/Maps/Classes/MapViewController.h b/iphone/Maps/Classes/MapViewController.h
index 247ee3afb0..666a744928 100644
--- a/iphone/Maps/Classes/MapViewController.h
+++ b/iphone/Maps/Classes/MapViewController.h
@@ -1,9 +1,10 @@
-#import <UIKit/UIKit.h>
-#import "ViewController.h"
#import "LocationManager.h"
-#import "SearchView.h"
#import "LocationPredictor.h"
+#import "MWMNavigationDelegate.h"
+#import "SearchView.h"
+#import "ViewController.h"
+#import <UIKit/UIKit.h>
#include "geometry/point2d.hpp"
#include "geometry/rect2d.hpp"
@@ -14,7 +15,7 @@ namespace search { struct AddressInfo; }
@class MWMMapViewControlsManager, MWMPlacePageViewManager;
@class ShareActionSheet;
-@interface MapViewController : ViewController <LocationObserver, UIPopoverControllerDelegate>
+@interface MapViewController : ViewController <LocationObserver, UIPopoverControllerDelegate, MWMNavigationDelegate>
{
bool m_isSticking;
size_t m_StickyThreshold;
diff --git a/iphone/Maps/Classes/MapViewController.mm b/iphone/Maps/Classes/MapViewController.mm
index d4a82506ac..64e070cbf8 100644
--- a/iphone/Maps/Classes/MapViewController.mm
+++ b/iphone/Maps/Classes/MapViewController.mm
@@ -1,7 +1,9 @@
#import "AppInfo.h"
#import "Common.h"
+#import "CountryTreeVC.h"
#import "EAGLView.h"
#import "MapsAppDelegate.h"
+#import "MapsObservers.h"
#import "MapViewController.h"
#import "MWMAlertViewController.h"
#import "MWMMapViewControlsManager.h"
@@ -84,7 +86,7 @@ typedef NS_OPTIONS(NSUInteger, MapInfoView)
@end
-@interface MapViewController () <RouteViewDelegate, SearchViewDelegate, MWMPlacePageViewManagerDelegate>
+@interface MapViewController () <RouteViewDelegate, SearchViewDelegate, MWMPlacePageViewManagerDelegate, ActiveMapsObserverProtocol>
@property (nonatomic) UIView * routeViewWrapper;
@property (nonatomic) RouteView * routeView;
@@ -103,9 +105,15 @@ typedef NS_OPTIONS(NSUInteger, MapInfoView)
@property (nonatomic) MapInfoView mapInfoView;
+@property (nonatomic) BOOL haveCurrentMap;
+
@end
@implementation MapViewController
+{
+ ActiveMapsObserver * m_mapsObserver;
+ int m_mapsObserverSlotId;
+}
#pragma mark - LocationManager Callbacks
@@ -553,6 +561,10 @@ typedef NS_OPTIONS(NSUInteger, MapInfoView)
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIDeviceOrientationDidChangeNotification object:nil];
[self invalidate];
+
+ m_mapsObserverSlotId = GetFramework().GetCountryTree().GetActiveMapLayout().AddListener(m_mapsObserver);
+ if (self.searchView.state == SearchViewStateFullscreen)
+ [self.searchView setState:SearchViewStateFullscreen animated:NO];
}
- (void)viewDidLoad
@@ -563,6 +575,9 @@ typedef NS_OPTIONS(NSUInteger, MapInfoView)
self.placePageManager = [[MWMPlacePageViewManager alloc] initWithViewController:self];
self.controlsManager = [[MWMMapViewControlsManager alloc] initWithParentController:self];
[self.view addSubview:self.searchView];
+
+ __weak MapViewController * weakSelf = self;
+ m_mapsObserver = new ActiveMapsObserver(weakSelf);
}
- (void)viewDidAppear:(BOOL)animated
@@ -578,10 +593,13 @@ typedef NS_OPTIONS(NSUInteger, MapInfoView)
- (void)viewWillDisappear:(BOOL)animated
{
- GetFramework().SetUpdatesEnabled(false);
+ [super viewWillDisappear:animated];
+
+ Framework & f = GetFramework();
+ f.SetUpdatesEnabled(false);
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:UIDeviceOrientationDidChangeNotification object:nil];
- [super viewWillDisappear:animated];
+ f.GetCountryTree().GetActiveMapLayout().RemoveListener(m_mapsObserverSlotId);
}
- (void)orientationChanged:(NSNotification *)notification
@@ -891,6 +909,56 @@ typedef NS_OPTIONS(NSUInteger, MapInfoView)
[RouteState remove];
}
+#pragma mark - Map state
+
+- (void)checkCurrentLocationMap
+{
+ Framework & f = GetFramework();
+ ActiveMapsLayout & activeMapLayout = f.GetCountryTree().GetActiveMapLayout();
+ int const mapsCount = activeMapLayout.GetCountInGroup(ActiveMapsLayout::TGroup::EOutOfDate) + activeMapLayout.GetCountInGroup(ActiveMapsLayout::TGroup::EUpToDate);
+ if (mapsCount == 0)
+ {
+ self.haveCurrentMap = NO;
+ }
+ else
+ {
+ double lat, lon;
+ if ([[MapsAppDelegate theApp].m_locationManager getLat:lat Lon:lon])
+ {
+ m2::PointD const mercatorLocation = MercatorBounds::FromLatLon(lat, lon);
+ storage::TIndex const countryIndex = f.GetCountryIndex(mercatorLocation);
+ if (countryIndex == storage::TIndex())
+ {
+ self.haveCurrentMap = f.IsCountryLoaded(mercatorLocation);
+ }
+ else
+ {
+ storage::TStatus const countryStatus = activeMapLayout.GetCountryStatus(countryIndex);
+ self.haveCurrentMap = (countryStatus == storage::TStatus::EOnDisk || countryStatus == storage::TStatus::EOnDiskOutOfDate);
+ }
+ }
+ else
+ {
+ self.haveCurrentMap = YES;
+ }
+ }
+}
+
+- (void)startMapDownload:(storage::TIndex const &)index type:(TMapOptions)type
+{
+ GetFramework().GetCountryTree().GetActiveMapLayout().DownloadMap(index, type);
+}
+
+- (void)stopMapsDownload
+{
+ GetFramework().GetCountryTree().GetActiveMapLayout().CancelAll();
+}
+
+- (void)restartMapDownload:(storage::TIndex const &)index
+{
+ GetFramework().GetCountryTree().GetActiveMapLayout().RetryDownloading(index);
+}
+
#pragma mark - RouteViewDelegate
- (void)routeViewDidStartFollowing:(RouteView *)routeView
@@ -925,6 +993,7 @@ typedef NS_OPTIONS(NSUInteger, MapInfoView)
- (void)searchViewWillEnterState:(SearchViewState)state
{
+ [self checkCurrentLocationMap];
switch (state)
{
case SearchViewStateHidden:
@@ -961,6 +1030,15 @@ typedef NS_OPTIONS(NSUInteger, MapInfoView)
[self updateStatusBarStyle];
}
+#pragma mark - MWMNavigationDelegate
+
+- (void)pushDownloadMaps
+{
+ [Alohalytics logEvent:kAlohalyticsTapEventKey withValue:@"downloader"];
+ CountryTreeVC * vc = [[CountryTreeVC alloc] initWithNodePosition:-1];
+ [self.navigationController pushViewController:vc animated:YES];
+}
+
#pragma mark - Layout
- (void)moveRouteViewAnimatedtoOffset:(CGFloat)offset
@@ -991,6 +1069,29 @@ typedef NS_OPTIONS(NSUInteger, MapInfoView)
}];
}
+#pragma mark - ActiveMapsObserverProtocol
+
+- (void)countryStatusChangedAtPosition:(int)position inGroup:(ActiveMapsLayout::TGroup const &)group
+{
+ if (self.searchView.state != SearchViewStateFullscreen)
+ return;
+ TStatus const status = GetFramework().GetCountryTree().GetActiveMapLayout().GetCountryStatus(group, position);
+ if (status == TStatus::EDownloadFailed)
+ [self.searchView downloadFailed];
+ else if (status == TStatus::EOnDisk)
+ [self.searchView downloadComplete];
+}
+
+- (void)countryDownloadingProgressChanged:(LocalAndRemoteSizeT const &)progress atPosition:(int)position inGroup:(ActiveMapsLayout::TGroup const &)group
+{
+ if (self.searchView.state != SearchViewStateFullscreen)
+ return;
+ CGFloat const normProgress = (CGFloat)progress.first / (CGFloat)progress.second;
+ ActiveMapsLayout & activeMapLayout = GetFramework().GetCountryTree().GetActiveMapLayout();
+ NSString * countryName = [NSString stringWithUTF8String:activeMapLayout.GetFormatedCountryName(activeMapLayout.GetCoreIndex(group, position)).c_str()];
+ [self.searchView downloadProgress:normProgress countryName:countryName];
+}
+
#pragma mark - Public methods
- (void)setApiMode:(BOOL)apiMode animated:(BOOL)animated
diff --git a/iphone/Maps/Classes/SearchView.h b/iphone/Maps/Classes/SearchView.h
index 7911bd5431..19edef9b1e 100644
--- a/iphone/Maps/Classes/SearchView.h
+++ b/iphone/Maps/Classes/SearchView.h
@@ -1,6 +1,10 @@
-#import <UIKit/UIKit.h>
+#import "MWMNavigationDelegate.h"
#import "SearchBar.h"
+#import <UIKit/UIKit.h>
+
+#include "platform/country_defines.hpp"
+#include "storage/index.hpp"
typedef NS_ENUM(NSUInteger, SearchViewState) {
SearchViewStateHidden,
@@ -13,21 +17,31 @@ typedef NS_ENUM(NSUInteger, SearchViewState) {
@protocol SearchViewDelegate <NSObject>
+@property (nonatomic, readonly) BOOL haveCurrentMap;
+
- (void)searchViewWillEnterState:(SearchViewState)state;
- (void)searchViewDidEnterState:(SearchViewState)state;
+- (void)startMapDownload:(storage::TIndex const &)index type:(TMapOptions)type;
+- (void)stopMapsDownload;
+- (void)restartMapDownload:(storage::TIndex const &)index;
+
@end
@interface SearchView : UIView
-@property (nonatomic) SearchBar * searchBar;
+@property (nonnull, nonatomic) SearchBar * searchBar;
- (void)setState:(SearchViewState)state animated:(BOOL)animated;
- (CGFloat)defaultSearchBarMinY;
-@property (weak, nonatomic) id <SearchViewDelegate> delegate;
+@property (nonnull, weak, nonatomic) id <SearchViewDelegate, MWMNavigationDelegate> delegate;
@property (nonatomic, readonly) SearchViewState state;
@property (nonatomic, readonly) CGRect infoRect;
+- (void)downloadProgress:(CGFloat)progress countryName:(nonnull NSString *)countryName;
+- (void)downloadComplete;
+- (void)downloadFailed;
+
@end
diff --git a/iphone/Maps/Classes/SearchView.mm b/iphone/Maps/Classes/SearchView.mm
index 25f8c4963e..71b0aea817 100644
--- a/iphone/Maps/Classes/SearchView.mm
+++ b/iphone/Maps/Classes/SearchView.mm
@@ -5,6 +5,7 @@
#import "MapsAppDelegate.h"
#import "MapViewController.h"
#import "MWMMapViewControlsManager.h"
+#import "MWMSearchDownloadMapRequest.h"
#import "SearchCategoryCell.h"
#import "SearchResultCell.h"
#import "SearchShowOnMapCell.h"
@@ -104,12 +105,14 @@ typedef NS_ENUM(NSUInteger, CellType)
};
-@interface SearchView () <UITextFieldDelegate, UITableViewDelegate, UITableViewDataSource, SearchBarDelegate, LocationObserver>
+@interface SearchView () <UITextFieldDelegate, UITableViewDelegate, UITableViewDataSource, SearchBarDelegate, LocationObserver, MWMCircularProgressDelegate>
@property (nonatomic) UITableView * tableView;
@property (nonatomic) SolidTouchView * topBackgroundView;
@property (nonatomic) UILabel * emptyResultLabel;
+@property (nonatomic) MWMSearchDownloadMapRequest * downloadRequest;
+
@property (nonatomic) SearchResultsWrapper * wrapper;
@property (nonatomic) NSArray * categoriesNames;
@@ -170,7 +173,8 @@ static BOOL keyboardLoaded = NO;
GetFramework().PrepareSearch();
- if (keyboardLoaded)
+ [self showDownloadMapRequestIfRequired];
+ if (keyboardLoaded && !self.downloadRequest)
[self.searchBar.textField becomeFirstResponder];
[UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
self.tableView.alpha = 1;
@@ -185,7 +189,7 @@ static BOOL keyboardLoaded = NO;
self.searchBar.textField.width = textFieldWidth;
[self.searchBar.clearButton setImage:[UIImage imageNamed:@"SearchBarClearButton"] forState:UIControlStateNormal];
} completion:^(BOOL) {
- if (!keyboardLoaded)
+ if (!keyboardLoaded && !self.downloadRequest)
{
keyboardLoaded = YES;
[self.searchBar.textField becomeFirstResponder];
@@ -418,10 +422,13 @@ static BOOL keyboardLoaded = NO;
if ([currentText length])
{
+ [self hideDownloadMapRequest];
[self search:currentText];
}
else
{
+ if (sender)
+ [self showDownloadMapRequestIfRequired];
// nil wrapper means "Display Categories" mode
self.wrapper = nil;
[self.searchBar setSearching:NO];
@@ -508,6 +515,7 @@ static BOOL keyboardLoaded = NO;
- (void)layoutSubviews
{
+ [super layoutSubviews];
if (self.state == SearchViewStateFullscreen)
self.searchBar.minY = [self defaultSearchBarMinY];
self.tableView.contentInset = UIEdgeInsetsMake(self.topBackgroundView.height, 0, 0, 0);
@@ -808,8 +816,114 @@ static BOOL keyboardLoaded = NO;
// [super touchesBegan:touches withEvent:event];
}
+#pragma mark - Download request
+
+- (void)showDownloadMapRequestIfRequired
+{
+ if (self.delegate.haveCurrentMap)
+ return;
+ self.downloadRequest = [[MWMSearchDownloadMapRequest alloc] initWithParentView:self.tableView delegate:self];
+ Framework & f = GetFramework();
+ ActiveMapsLayout & activeMapLayout = f.GetCountryTree().GetActiveMapLayout();
+ if (activeMapLayout.IsDownloadingActive())
+ {
+ [self.downloadRequest startDownload];
+ }
+ else
+ {
+ double lat, lon;
+ if ([[MapsAppDelegate theApp].m_locationManager getLat:lat Lon:lon])
+ {
+
+ m2::PointD const mercatorLocation = MercatorBounds::FromLatLon(lat, lon);
+ storage::TIndex const countryIndex = f.GetCountryIndex(mercatorLocation);
+
+ NSString * countryName = [NSString stringWithUTF8String:activeMapLayout.GetFormatedCountryName(countryIndex).c_str()];
+ LocalAndRemoteSizeT const sizes = activeMapLayout.GetRemoteCountrySizes(countryIndex);
+ NSString * mapSize = formattedSize(sizes.first);
+ NSString * mapAndRouteSize = formattedSize(sizes.first + sizes.second);
+
+ __weak SearchView * weakSelf = self;
+ [self.downloadRequest showForLocationWithName:countryName mapSize:mapSize mapAndRouteSize:mapAndRouteSize download:^(BOOL needRoute)
+ {
+ __strong SearchView * self = weakSelf;
+ [self.downloadRequest startDownload];
+ [self.delegate startMapDownload:countryIndex type:needRoute ? TMapOptions::EMapWithCarRouting : TMapOptions::EMap];
+ }
+ select:^
+ {
+ [self selectMapsAction];
+ }];
+ }
+ else
+ {
+ [self.downloadRequest showForUnknownLocation:^
+ {
+ [self selectMapsAction];
+ }];
+ }
+ }
+}
+
+- (void)hideDownloadMapRequest
+{
+ self.downloadRequest = nil;
+}
+
+#pragma mark - Download callbacks
+
+- (void)downloadProgress:(CGFloat)progress countryName:(NSString *)countryName
+{
+ [self.downloadRequest downloadProgress:progress countryName:countryName];
+}
+
+- (void)downloadComplete
+{
+ [self hideDownloadMapRequest];
+}
+
+- (void)downloadFailed
+{
+ [self.downloadRequest setDownloadFailed];
+}
+
+#pragma mark - MWMCircularProgressDelegate
+
+- (void)progressButtonPressed:(nonnull MWMCircularProgress *)progress
+{
+ if (progress.failed)
+ {
+ double lat, lon;
+ if ([[MapsAppDelegate theApp].m_locationManager getLat:lat Lon:lon])
+ {
+ Framework & f = GetFramework();
+ m2::PointD const mercatorLocation = MercatorBounds::FromLatLon(lat, lon);
+ storage::TIndex const countryIndex = f.GetCountryIndex(mercatorLocation);
+ [self.delegate restartMapDownload:countryIndex];
+ }
+ }
+ else
+ {
+ [self.downloadRequest stopDownload];
+ [self.delegate stopMapsDownload];
+ }
+}
+
+#pragma mark - MWMNavigationDelegate
+
+- (void)selectMapsAction
+{
+ [self.delegate pushDownloadMaps];
+}
+
#pragma mark - Properties
+- (void)setDownloadRequest:(MWMSearchDownloadMapRequest *)downloadRequest
+{
+ _downloadRequest = downloadRequest;
+ self.tableView.scrollEnabled = (downloadRequest == nil);
+}
+
- (CGRect)infoRect
{
return [self convertRect:self.topBackgroundView.frame toView:self.superview];
diff --git a/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOff.imageset/Contents.json b/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOff.imageset/Contents.json
new file mode 100644
index 0000000000..0560a762ac
--- /dev/null
+++ b/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOff.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x",
+ "filename" : "radioBtnOff@1x.png"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x",
+ "filename" : "radioBtnOff@2x.png"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x",
+ "filename" : "radioBtnOff@3x.png"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOff.imageset/radioBtnOff@1x.png b/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOff.imageset/radioBtnOff@1x.png
new file mode 100644
index 0000000000..aa26bfe0ac
--- /dev/null
+++ b/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOff.imageset/radioBtnOff@1x.png
Binary files differ
diff --git a/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOff.imageset/radioBtnOff@2x.png b/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOff.imageset/radioBtnOff@2x.png
new file mode 100644
index 0000000000..e838efd549
--- /dev/null
+++ b/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOff.imageset/radioBtnOff@2x.png
Binary files differ
diff --git a/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOff.imageset/radioBtnOff@3x.png b/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOff.imageset/radioBtnOff@3x.png
new file mode 100644
index 0000000000..1b90824262
--- /dev/null
+++ b/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOff.imageset/radioBtnOff@3x.png
Binary files differ
diff --git a/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOn.imageset/Contents.json b/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOn.imageset/Contents.json
new file mode 100644
index 0000000000..4ea1f8b4fe
--- /dev/null
+++ b/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOn.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "scale" : "1x",
+ "filename" : "radioBtnOn@1x.png"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x",
+ "filename" : "radioBtnOn@2x.png"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x",
+ "filename" : "radioBtnOn@3x.png"
+ }
+ ],
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+} \ No newline at end of file
diff --git a/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOn.imageset/radioBtnOn@1x.png b/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOn.imageset/radioBtnOn@1x.png
new file mode 100644
index 0000000000..3ff2408e4f
--- /dev/null
+++ b/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOn.imageset/radioBtnOn@1x.png
Binary files differ
diff --git a/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOn.imageset/radioBtnOn@2x.png b/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOn.imageset/radioBtnOn@2x.png
new file mode 100644
index 0000000000..2eb70f17c0
--- /dev/null
+++ b/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOn.imageset/radioBtnOn@2x.png
Binary files differ
diff --git a/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOn.imageset/radioBtnOn@3x.png b/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOn.imageset/radioBtnOn@3x.png
new file mode 100644
index 0000000000..26a85917e7
--- /dev/null
+++ b/iphone/Maps/Images.xcassets/DownloadMapRequest/radioBtnOn.imageset/radioBtnOn@3x.png
Binary files differ
diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj
index b359ea26a2..a3e6a43980 100644
--- a/iphone/Maps/Maps.xcodeproj/project.pbxproj
+++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj
@@ -41,6 +41,12 @@
349A357A1B53D4C9009677EE /* MWMCircularProgress.m in Sources */ = {isa = PBXBuildFile; fileRef = 349A35761B53D4C9009677EE /* MWMCircularProgress.m */; };
349A357B1B53D4C9009677EE /* MWMCircularProgress.xib in Resources */ = {isa = PBXBuildFile; fileRef = 349A35771B53D4C9009677EE /* MWMCircularProgress.xib */; };
349A357C1B53D4C9009677EE /* MWMCircularProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = 349A35791B53D4C9009677EE /* MWMCircularProgressView.m */; };
+ 349A35831B53E967009677EE /* MWMDownloadMapRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 349A357F1B53E967009677EE /* MWMDownloadMapRequest.m */; };
+ 349A35841B53E967009677EE /* MWMDownloadMapRequest.xib in Resources */ = {isa = PBXBuildFile; fileRef = 349A35801B53E967009677EE /* MWMDownloadMapRequest.xib */; };
+ 349A35851B53E967009677EE /* MWMDownloadMapRequestView.m in Sources */ = {isa = PBXBuildFile; fileRef = 349A35821B53E967009677EE /* MWMDownloadMapRequestView.m */; };
+ 349A358C1B53EABC009677EE /* MWMSearchDownloadMapRequest.m in Sources */ = {isa = PBXBuildFile; fileRef = 349A35881B53EABC009677EE /* MWMSearchDownloadMapRequest.m */; };
+ 349A358D1B53EABC009677EE /* MWMSearchDownloadMapRequest.xib in Resources */ = {isa = PBXBuildFile; fileRef = 349A35891B53EABC009677EE /* MWMSearchDownloadMapRequest.xib */; };
+ 349A358E1B53EABC009677EE /* MWMSearchDownloadMapRequestView.m in Sources */ = {isa = PBXBuildFile; fileRef = 349A358B1B53EABC009677EE /* MWMSearchDownloadMapRequestView.m */; };
34A742FE1AE5461A00CE15EB /* index.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 34A742FD1AE5461A00CE15EB /* index.cpp */; };
34A743001AE5468200CE15EB /* storage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 34A742FF1AE5468200CE15EB /* storage.cpp */; };
34BC72211B0DECAE0012A34B /* MWMLocationButton.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34BC720C1B0DECAE0012A34B /* MWMLocationButton.mm */; };
@@ -388,6 +394,16 @@
349A35771B53D4C9009677EE /* MWMCircularProgress.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMCircularProgress.xib; sourceTree = "<group>"; };
349A35781B53D4C9009677EE /* MWMCircularProgressView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMCircularProgressView.h; sourceTree = "<group>"; };
349A35791B53D4C9009677EE /* MWMCircularProgressView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MWMCircularProgressView.m; sourceTree = "<group>"; };
+ 349A357E1B53E967009677EE /* MWMDownloadMapRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMDownloadMapRequest.h; sourceTree = "<group>"; };
+ 349A357F1B53E967009677EE /* MWMDownloadMapRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MWMDownloadMapRequest.m; sourceTree = "<group>"; };
+ 349A35801B53E967009677EE /* MWMDownloadMapRequest.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMDownloadMapRequest.xib; sourceTree = "<group>"; };
+ 349A35811B53E967009677EE /* MWMDownloadMapRequestView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMDownloadMapRequestView.h; sourceTree = "<group>"; };
+ 349A35821B53E967009677EE /* MWMDownloadMapRequestView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MWMDownloadMapRequestView.m; sourceTree = "<group>"; };
+ 349A35871B53EABC009677EE /* MWMSearchDownloadMapRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSearchDownloadMapRequest.h; sourceTree = "<group>"; };
+ 349A35881B53EABC009677EE /* MWMSearchDownloadMapRequest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MWMSearchDownloadMapRequest.m; sourceTree = "<group>"; };
+ 349A35891B53EABC009677EE /* MWMSearchDownloadMapRequest.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMSearchDownloadMapRequest.xib; sourceTree = "<group>"; };
+ 349A358A1B53EABC009677EE /* MWMSearchDownloadMapRequestView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMSearchDownloadMapRequestView.h; sourceTree = "<group>"; };
+ 349A358B1B53EABC009677EE /* MWMSearchDownloadMapRequestView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MWMSearchDownloadMapRequestView.m; sourceTree = "<group>"; };
34A742FD1AE5461A00CE15EB /* index.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = index.cpp; path = ../../../storage/index.cpp; sourceTree = "<group>"; };
34A742FF1AE5468200CE15EB /* storage.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = storage.cpp; path = ../../../storage/storage.cpp; sourceTree = "<group>"; };
34BC720B1B0DECAE0012A34B /* MWMLocationButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMLocationButton.h; sourceTree = "<group>"; };
@@ -1080,6 +1096,32 @@
path = CustomViews/CircularProgress;
sourceTree = "<group>";
};
+ 349A357D1B53E967009677EE /* DownloadMapRequest */ = {
+ isa = PBXGroup;
+ children = (
+ 349A357E1B53E967009677EE /* MWMDownloadMapRequest.h */,
+ 349A357F1B53E967009677EE /* MWMDownloadMapRequest.m */,
+ 349A35801B53E967009677EE /* MWMDownloadMapRequest.xib */,
+ 349A35811B53E967009677EE /* MWMDownloadMapRequestView.h */,
+ 349A35821B53E967009677EE /* MWMDownloadMapRequestView.m */,
+ );
+ name = DownloadMapRequest;
+ path = CustomViews/DownloadMapRequest;
+ sourceTree = "<group>";
+ };
+ 349A35861B53EABC009677EE /* SearchDownloadMapRequest */ = {
+ isa = PBXGroup;
+ children = (
+ 349A35871B53EABC009677EE /* MWMSearchDownloadMapRequest.h */,
+ 349A35881B53EABC009677EE /* MWMSearchDownloadMapRequest.m */,
+ 349A35891B53EABC009677EE /* MWMSearchDownloadMapRequest.xib */,
+ 349A358A1B53EABC009677EE /* MWMSearchDownloadMapRequestView.h */,
+ 349A358B1B53EABC009677EE /* MWMSearchDownloadMapRequestView.m */,
+ );
+ name = SearchDownloadMapRequest;
+ path = CustomViews/SearchDownloadMapRequest;
+ sourceTree = "<group>";
+ };
34BC72091B0DECAE0012A34B /* MapViewControls */ = {
isa = PBXGroup;
children = (
@@ -1244,6 +1286,8 @@
97B4E9271851DAB300BEC5D7 /* Custom Views */ = {
isa = PBXGroup;
children = (
+ 349A35861B53EABC009677EE /* SearchDownloadMapRequest */,
+ 349A357D1B53E967009677EE /* DownloadMapRequest */,
349A35741B53D4C9009677EE /* CircularProgress */,
34BC72091B0DECAE0012A34B /* MapViewControls */,
B0E1FCD61A23386D00A8E08B /* Route */,
@@ -2009,10 +2053,12 @@
F7E7BA231672328F00B4492E /* atm@2x.png in Resources */,
F7E7BA241672328F00B4492E /* bank.png in Resources */,
34BC72231B0DECAE0012A34B /* MWMLocationButton.xib in Resources */,
+ 349A358D1B53EABC009677EE /* MWMSearchDownloadMapRequest.xib in Resources */,
F7E7BA251672328F00B4492E /* bank@2x.png in Resources */,
349A357B1B53D4C9009677EE /* MWMCircularProgress.xib in Resources */,
F7E7BA261672328F00B4492E /* entertainment.png in Resources */,
F6CB21621AEE902B00FB8963 /* PlacePageLinkCell.xib in Resources */,
+ 349A35841B53E967009677EE /* MWMDownloadMapRequest.xib in Resources */,
F7E7BA271672328F00B4492E /* entertainment@2x.png in Resources */,
F7E7BA281672328F00B4492E /* food.png in Resources */,
F7E7BA291672328F00B4492E /* food@2x.png in Resources */,
@@ -2145,6 +2191,7 @@
B08AA8CE1A24C7BC00810B1C /* LocalNotificationInfoProvider.m in Sources */,
1D3623260D0F684500981E51 /* MapsAppDelegate.mm in Sources */,
F67BBB571AC54A7800D162C7 /* MWMFeedbackAlert.mm in Sources */,
+ 349A35831B53E967009677EE /* MWMDownloadMapRequest.m in Sources */,
A32B6D4C1A14980500E54A65 /* iosOGLContext.mm in Sources */,
B0E1FCDF1A2343BC00A8E08B /* NextTurnPhoneView.m in Sources */,
46F26CD810F623BA00ECCA39 /* EAGLView.mm in Sources */,
@@ -2168,6 +2215,7 @@
EE7F29821219ECA300EB67A9 /* RenderContext.mm in Sources */,
34BC72251B0DECAE0012A34B /* MWMSideMenuButton.mm in Sources */,
F6ED13911B1EF96B0095C6DE /* MWMBookmarkDescriptionViewController.mm in Sources */,
+ 349A35851B53E967009677EE /* MWMDownloadMapRequestView.m in Sources */,
F64F19991AB81A00006EAF7E /* MWMAlertViewController.mm in Sources */,
FAFCB63613366E78001A5C59 /* WebViewController.mm in Sources */,
F6FE2C0F1B03A006009814AA /* MWMPlacePageNavigationBar.mm in Sources */,
@@ -2201,6 +2249,7 @@
FA36B80D15403A4F004560CC /* BookmarksVC.mm in Sources */,
F6ED135B1B18AA930095C6DE /* MWMExtendedPlacePageView.m in Sources */,
F6588E2F1B15D2BC00EE1E58 /* MWMBookmarkColorViewController.mm in Sources */,
+ 349A358E1B53EABC009677EE /* MWMSearchDownloadMapRequestView.m in Sources */,
A32B6D4D1A14980500E54A65 /* iosOGLContextFactory.mm in Sources */,
FAF457E715597D4600DCCC49 /* Framework.cpp in Sources */,
97CC93BB19599F4700369B42 /* SearchSuggestCell.m in Sources */,
@@ -2230,6 +2279,7 @@
B0FBFA271A515AFD0086819E /* ViewController.m in Sources */,
3472EC051B4D44BE0085CB79 /* UIFont+MapsMeFonts.mm in Sources */,
342AD76F1B53D30C00E0B997 /* UIButton+RuntimeAttributes.m in Sources */,
+ 349A358C1B53EABC009677EE /* MWMSearchDownloadMapRequest.m in Sources */,
F63732961AE9431E00A03764 /* MWMBasePlacePageView.mm in Sources */,
97A8001018B21395000C07A2 /* SearchBar.mm in Sources */,
EDC5C543175F2CA600420E92 /* ShareActionSheet.mm in Sources */,