[iOS] implement update guides

This commit is contained in:
Aleksey Belouosv 2019-02-12 15:35:22 +03:00 committed by Vlad Mihaylenko
parent a92639b19d
commit da41558057
6 changed files with 264 additions and 27 deletions

View file

@ -350,6 +350,7 @@
</tableView>
<connections>
<outlet property="directLinkInstructionsLabel" destination="XQh-26-CNo" id="0mF-Ta-Odg"/>
<outlet property="editOnWebButton" destination="ULn-RX-CjB" id="EBo-eG-874"/>
<outlet property="getDirectLinkCell" destination="90b-ef-VUJ" id="L7h-0r-eSe"/>
<outlet property="licenseAgreementTextView" destination="dsV-Vs-oCo" id="TtB-Uw-WGR"/>
<outlet property="updateDirectLinkCell" destination="aAa-cf-kTL" id="Gaz-h4-0E6"/>

View file

@ -27,18 +27,23 @@ final class BookmarksSharingViewController: MWMTableViewController {
private let publishUpdateRowIndex = 2
private var rowsInPublicSection: Int {
return category.accessStatus == .public ? 3 : 2
return category.accessStatus == .public ? (uploadAndPublishCell.cellState == .updating ? 2 : 3) : 2
}
private var rowsInPrivateSection: Int {
return category.accessStatus == .private ? 3 : 2
return category.accessStatus == .private ? (getDirectLinkCell.cellState == .updating ? 2 : 3) : 2
}
@IBOutlet private weak var uploadAndPublishCell: UploadActionCell!
@IBOutlet private weak var getDirectLinkCell: UploadActionCell!
@IBOutlet private weak var updatePublishCell: UITableViewCell!
@IBOutlet private weak var updateDirectLinkCell: UITableViewCell!
@IBOutlet private weak var directLinkInstructionsLabel: UILabel!
@IBOutlet weak var uploadAndPublishCell: UploadActionCell!
@IBOutlet weak var getDirectLinkCell: UploadActionCell!
@IBOutlet weak var updatePublishCell: UITableViewCell!
@IBOutlet weak var updateDirectLinkCell: UITableViewCell!
@IBOutlet weak var directLinkInstructionsLabel: UILabel!
@IBOutlet weak var editOnWebButton: UIButton! {
didSet {
editOnWebButton.setTitle(L("edit_on_web").uppercased(), for: .normal)
}
}
@IBOutlet private weak var licenseAgreementTextView: UITextView! {
didSet {
@ -82,11 +87,13 @@ final class BookmarksSharingViewController: MWMTableViewController {
private func configureActionCells() {
uploadAndPublishCell.config(titles: [ .normal : L("upload_and_publish"),
.inProgress : L("upload_and_publish_progress_text"),
.updating : L("direct_link_updating_text"),
.completed : L("upload_and_publish_success") ],
image: UIImage(named: "ic24PxGlobe"),
delegate: self)
getDirectLinkCell.config(titles: [ .normal : L("upload_and_get_direct_link"),
.inProgress : L("direct_link_progress_text"),
.updating : L("direct_link_updating_text"),
.completed : L("direct_link_success") ],
image: UIImage(named: "ic24PxLink"),
delegate: self)
@ -142,7 +149,7 @@ final class BookmarksSharingViewController: MWMTableViewController {
if cell == uploadAndPublishCell {
startUploadAndPublishFlow()
} else if cell == getDirectLinkCell {
uploadAndGetDirectLink()
uploadAndGetDirectLink(update: false)
} else if cell == updatePublishCell {
updatePublic()
} else if cell == updateDirectLinkCell {
@ -151,11 +158,21 @@ final class BookmarksSharingViewController: MWMTableViewController {
}
private func updatePublic() {
MWMAlertViewController.activeAlert().presentDefaultAlert(withTitle: L("any_access_update_alert_title"),
message: L("any_access_update_alert_message"),
rightButtonTitle: L("any_access_update_alert_update"),
leftButtonTitle: L("cancel")) {
self.uploadAndPublish(update: true)
}
}
private func updateDirectLink() {
MWMAlertViewController.activeAlert().presentDefaultAlert(withTitle: L("any_access_update_alert_title"),
message: L("any_access_update_alert_message"),
rightButtonTitle: L("any_access_update_alert_update"),
leftButtonTitle: L("cancel")) {
self.uploadAndGetDirectLink(update: true)
}
}
private func startUploadAndPublishFlow() {
@ -167,16 +184,25 @@ final class BookmarksSharingViewController: MWMTableViewController {
}
}
private func uploadAndPublish() {
guard let tags = sharingTags, let userStatus = sharingUserStatus else {
assert(false, "not enough data for public sharing")
return
private func uploadAndPublish(update: Bool) {
if !update {
guard let tags = sharingTags, let userStatus = sharingUserStatus else {
assert(false, "not enough data for public sharing")
return
}
manager.setCategory(category.categoryId, authorType: userStatus)
manager.setCategory(category.categoryId, tags: tags)
}
manager.setCategory(category.categoryId, authorType: userStatus)
manager.setCategory(category.categoryId, tags: tags)
uploadAndPublishCell.cellState = update ? .updating : .inProgress
if update {
self.tableView.deleteRows(at: [IndexPath(row: self.publishUpdateRowIndex,
section: self.publicSectionIndex)],
with: .automatic)
}
manager.uploadAndPublishCategory(withId: category.categoryId, progress: { (progress) in
self.uploadAndPublishCell.cellState = .inProgress
}) { (_, error) in
if let error = error as NSError? {
self.uploadAndPublishCell.cellState = .normal
@ -200,11 +226,14 @@ final class BookmarksSharingViewController: MWMTableViewController {
section: self.publicSectionIndex)],
with: .automatic)
self.tableView.endUpdates()
if update {
Toast.toast(withText: L("direct_link_updating_success")).show()
}
}
}
}
private func uploadAndGetDirectLink() {
private func uploadAndGetDirectLink(update: Bool) {
Statistics.logEvent(kStatSharingOptionsClick, withParameters: [kStatItem : kStatPrivate])
performAfterValidation(anchor: getDirectLinkCell) { [weak self] in
guard let s = self else {
@ -212,10 +241,13 @@ final class BookmarksSharingViewController: MWMTableViewController {
return
}
s.getDirectLinkCell.cellState = update ? .updating : .inProgress
if update {
s.tableView.deleteRows(at: [IndexPath(item: s.directLinkUpdateRowIndex,
section: s.privateSectionIndex)],
with: .automatic)
}
s.manager.uploadAndGetDirectLinkCategory(withId: s.category.categoryId, progress: { (progress) in
if progress == .uploadStarted {
s.getDirectLinkCell.cellState = .inProgress
}
}, completion: { (_, error) in
if let error = error as NSError? {
s.getDirectLinkCell.cellState = .normal
@ -229,6 +261,9 @@ final class BookmarksSharingViewController: MWMTableViewController {
s.tableView.insertRows(at: [IndexPath(item: s.directLinkUpdateRowIndex,
section: s.privateSectionIndex)],
with: .automatic)
if update {
Toast.toast(withText: L("direct_link_updating_success")).show()
}
}
})
}
@ -291,13 +326,34 @@ final class BookmarksSharingViewController: MWMTableViewController {
}
private func showMalformedDataError() {
MWMAlertViewController.activeAlert().presentInfoAlert(L("unable_upload_errorr_title"),
text: L("unable_upload_error_subtitle_broken"))
let alert = EditOnWebAlertViewController(with: L("html_format_error_title"),
message: L("html_format_error_subtitle"))
alert.onAcceptBlock = {
self.dismiss(animated: true, completion: {
self.performSegue(withIdentifier: self.kEditOnWebSegueIdentifier, sender: nil)
})
}
alert.onCancelBlock = {
self.dismiss(animated: true)
}
navigationController?.present(alert, animated: true)
}
private func showAccessError() {
MWMAlertViewController.activeAlert().presentInfoAlert(L("unable_upload_errorr_title"),
text: L("unable_upload_error_subtitle_edited"))
let alert = EditOnWebAlertViewController(with: L("public_or_limited_access_after_edit_online_error_title"),
message: L("public_or_limited_access_after_edit_online_error_message"))
alert.onAcceptBlock = {
self.dismiss(animated: true, completion: {
self.performSegue(withIdentifier: self.kEditOnWebSegueIdentifier, sender: nil)
})
}
alert.onCancelBlock = {
self.dismiss(animated: true)
}
navigationController?.present(alert, animated: true)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
@ -346,7 +402,7 @@ extension BookmarksSharingViewController: SharingTagsViewControllerDelegate {
func sharingTagsViewController(_ viewController: SharingTagsViewController, didSelect tags: [MWMTag]) {
navigationController?.popViewController(animated: true)
sharingTags = tags
uploadAndPublish()
uploadAndPublish(update: false)
}
func sharingTagsViewControllerDidCancel(_ viewController: SharingTagsViewController) {

View file

@ -0,0 +1,48 @@
class EditOnWebAlertViewController: UIViewController {
private let transitioning = FadeTransitioning<AlertPresentationController>()
private var alertTitle = ""
private var alertMessage = ""
var onAcceptBlock: MWMVoidBlock?
var onCancelBlock: MWMVoidBlock?
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var messageLabel: UILabel!
@IBOutlet weak var cancelButton: UIButton!
@IBOutlet weak var acceptButton: UIButton! {
didSet {
acceptButton.setTitle(L("edit_on_web").uppercased(), for: .normal)
}
}
convenience init(with title: String, message: String) {
self.init()
alertTitle = title
alertMessage = message
}
override func viewDidLoad() {
super.viewDidLoad()
titleLabel.text = alertTitle
messageLabel.text = alertMessage
}
override var transitioningDelegate: UIViewControllerTransitioningDelegate? {
get { return transitioning }
set { }
}
override var modalPresentationStyle: UIModalPresentationStyle {
get { return .custom }
set { }
}
@IBAction func onAccept(_ sender: UIButton) {
onAcceptBlock?()
}
@IBAction func onCancel(_ sender: UIButton) {
onCancelBlock?()
}
}

View file

@ -0,0 +1,115 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
<device id="retina4_7" orientation="portrait">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
<placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="EditOnWebAlertViewController" customModule="maps_me" customModuleProvider="target">
<connections>
<outlet property="acceptButton" destination="VKv-gq-AkS" id="kY8-gy-8bh"/>
<outlet property="cancelButton" destination="ims-sO-qtH" id="hu3-Zu-NSd"/>
<outlet property="messageLabel" destination="UlE-bL-cfg" id="ttA-Qk-Ocu"/>
<outlet property="titleLabel" destination="z4t-Nz-dPi" id="khc-WY-B8p"/>
<outlet property="view" destination="i5M-Pr-FkT" id="sfx-zR-JGt"/>
</connections>
</placeholder>
<placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
<view clearsContextBeforeDrawing="NO" contentMode="scaleToFill" id="i5M-Pr-FkT">
<rect key="frame" x="0.0" y="0.0" width="307" height="257"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="You have edited you bookmarks online" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="z4t-Nz-dPi">
<rect key="frame" x="16" y="24" width="275" height="43"/>
<fontDescription key="fontDescription" type="system" weight="semibold" pointSize="18"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="bold17"/>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackPrimaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="public_or_limited_access_after_edit_online_error_title"/>
</userDefinedRuntimeAttributes>
</label>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Further on please edit, publish or share the guide with you friends via out website" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="UlE-bL-cfg">
<rect key="frame" x="16" y="77" width="275" height="33.5"/>
<fontDescription key="fontDescription" type="system" pointSize="14"/>
<color key="textColor" white="0.0" alpha="0.5442155393835616" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<nil key="highlightedColor"/>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="regular14"/>
<userDefinedRuntimeAttribute type="string" keyPath="colorName" value="blackSecondaryText"/>
<userDefinedRuntimeAttribute type="string" keyPath="localizedText" value="public_or_limited_access_after_edit_online_error_message"/>
</userDefinedRuntimeAttributes>
</label>
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" verticalCompressionResistancePriority="751" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ims-sO-qtH" userLabel="Cancel">
<rect key="frame" x="16" y="188.5" width="275" height="48"/>
<color key="backgroundColor" red="0.0" green="0.0" blue="0.0" alpha="0.0" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="height" constant="48" id="lvW-2n-I6Q"/>
</constraints>
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
<state key="normal" title="Cancel">
<color key="titleColor" white="0.0" alpha="0.38328339041095888" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="textColorHighlightedName" value="linkBlueHighlighted"/>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium16"/>
<userDefinedRuntimeAttribute type="string" keyPath="textColorName" value="blackSecondaryText"/>
</userDefinedRuntimeAttributes>
<connections>
<action selector="onCancel:" destination="-1" eventType="touchUpInside" id="YMO-gu-PBi"/>
</connections>
</button>
<button opaque="NO" clipsSubviews="YES" contentMode="scaleToFill" verticalCompressionResistancePriority="751" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="VKv-gq-AkS" customClass="MWMButton">
<rect key="frame" x="16" y="130.5" width="275" height="48"/>
<color key="backgroundColor" red="0.1176470588" green="0.58823529409999997" blue="0.94117647059999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstAttribute="width" constant="275" id="E1D-6z-eho"/>
<constraint firstAttribute="height" constant="48" id="KpB-i9-dRs"/>
</constraints>
<fontDescription key="fontDescription" type="system" weight="medium" pointSize="16"/>
<state key="normal" title="EDIT ON WEB">
<color key="titleColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</state>
<userDefinedRuntimeAttributes>
<userDefinedRuntimeAttribute type="string" keyPath="fontName" value="medium16"/>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundColorName" value="linkBlue"/>
<userDefinedRuntimeAttribute type="string" keyPath="backgroundHighlightedColorName" value="linkBlueHighlighted"/>
<userDefinedRuntimeAttribute type="number" keyPath="layer.cornerRadius">
<integer key="value" value="8"/>
</userDefinedRuntimeAttribute>
<userDefinedRuntimeAttribute type="string" keyPath="tintColorName" value="white"/>
</userDefinedRuntimeAttributes>
<connections>
<action selector="onAccept:" destination="-1" eventType="touchUpInside" id="2Fj-t8-3OH"/>
</connections>
</button>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="ims-sO-qtH" firstAttribute="trailing" secondItem="VKv-gq-AkS" secondAttribute="trailing" id="4eC-CL-lkC"/>
<constraint firstItem="UlE-bL-cfg" firstAttribute="trailing" secondItem="z4t-Nz-dPi" secondAttribute="trailing" id="CMm-Wn-MLd"/>
<constraint firstItem="ims-sO-qtH" firstAttribute="top" secondItem="VKv-gq-AkS" secondAttribute="bottom" constant="10" id="CdB-n2-LbK"/>
<constraint firstItem="z4t-Nz-dPi" firstAttribute="top" secondItem="i5M-Pr-FkT" secondAttribute="top" constant="24" id="JCY-6N-QfB"/>
<constraint firstItem="VKv-gq-AkS" firstAttribute="top" secondItem="UlE-bL-cfg" secondAttribute="bottom" constant="20" id="NLz-BD-7D6"/>
<constraint firstItem="VKv-gq-AkS" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="16" id="Nqc-hN-IjG"/>
<constraint firstAttribute="bottom" secondItem="ims-sO-qtH" secondAttribute="bottom" constant="20.5" id="SdP-ZG-W3U"/>
<constraint firstItem="UlE-bL-cfg" firstAttribute="top" secondItem="z4t-Nz-dPi" secondAttribute="bottom" constant="10" id="UQO-SJ-iZX"/>
<constraint firstAttribute="trailing" secondItem="VKv-gq-AkS" secondAttribute="trailing" constant="16" id="fMP-8P-b6v"/>
<constraint firstAttribute="trailing" secondItem="z4t-Nz-dPi" secondAttribute="trailing" constant="16" id="npB-Ao-XgR"/>
<constraint firstItem="UlE-bL-cfg" firstAttribute="leading" secondItem="z4t-Nz-dPi" secondAttribute="leading" id="oHJ-L5-BLD"/>
<constraint firstItem="z4t-Nz-dPi" firstAttribute="leading" secondItem="i5M-Pr-FkT" secondAttribute="leading" constant="16" id="w3r-vc-ZIQ"/>
<constraint firstItem="ims-sO-qtH" firstAttribute="leading" secondItem="VKv-gq-AkS" secondAttribute="leading" id="xB2-ch-cgh"/>
</constraints>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
<viewLayoutGuide key="safeArea" id="fnl-2z-Ty3"/>
<point key="canvasLocation" x="128.80000000000001" y="-31.03448275862069"/>
</view>
</objects>
</document>

View file

@ -5,6 +5,7 @@ protocol UploadActionCellDelegate: AnyObject {
enum UploadActionCellState: String {
case normal
case inProgress
case updating
case completed
case disabled
}
@ -48,6 +49,14 @@ final class UploadActionCell: MWMTableViewCell {
actionTitle.text = titles?[.inProgress]
shareButton.isHidden = true
selectionStyle = .none
case .updating:
progressView.isHidden = false
actionImage.tintColor = .blackSecondaryText()
actionTitle.textColor = .blackSecondaryText()
actionTitle.font = .italic16()
actionTitle.text = titles?[.updating]
shareButton.isHidden = true
selectionStyle = .none
case .completed:
progressView.isHidden = true
actionImage.tintColor = .blackSecondaryText()

View file

@ -382,6 +382,8 @@
471BBD942130390F00EB17C9 /* TutorialViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 471BBD932130390F00EB17C9 /* TutorialViewController.swift */; };
4726254921C27D4B00C7BAAD /* PlacePageDescriptionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4726254821C27D4B00C7BAAD /* PlacePageDescriptionViewController.swift */; };
47289E532209BE3D002ABFC0 /* MWMActivityIndicator.m in Sources */ = {isa = PBXBuildFile; fileRef = 47289E522209BE3D002ABFC0 /* MWMActivityIndicator.m */; };
47289E5A2212DFFF002ABFC0 /* EditOnWebAlertViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47289E582212DFFF002ABFC0 /* EditOnWebAlertViewController.swift */; };
47289E5B2212DFFF002ABFC0 /* EditOnWebAlertViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 47289E592212DFFF002ABFC0 /* EditOnWebAlertViewController.xib */; };
472E3F472146BCD30020E412 /* SubscriptionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472E3F462146BCD30020E412 /* SubscriptionManager.swift */; };
472E3F4A2146C4CD0020E412 /* MWMPurchaseManager.mm in Sources */ = {isa = PBXBuildFile; fileRef = 472E3F492146C4CD0020E412 /* MWMPurchaseManager.mm */; };
472E3F4C2147D5700020E412 /* Subscription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472E3F4B2147D5700020E412 /* Subscription.swift */; };
@ -1413,6 +1415,8 @@
4726254821C27D4B00C7BAAD /* PlacePageDescriptionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlacePageDescriptionViewController.swift; sourceTree = "<group>"; };
47289E512209BE3D002ABFC0 /* MWMActivityIndicator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MWMActivityIndicator.h; path = CustomViews/MWMActivityIndicator.h; sourceTree = "<group>"; };
47289E522209BE3D002ABFC0 /* MWMActivityIndicator.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MWMActivityIndicator.m; path = CustomViews/MWMActivityIndicator.m; sourceTree = "<group>"; };
47289E582212DFFF002ABFC0 /* EditOnWebAlertViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditOnWebAlertViewController.swift; sourceTree = "<group>"; };
47289E592212DFFF002ABFC0 /* EditOnWebAlertViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = EditOnWebAlertViewController.xib; sourceTree = "<group>"; };
472E3F462146BCD30020E412 /* SubscriptionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SubscriptionManager.swift; sourceTree = "<group>"; };
472E3F482146C4CD0020E412 /* MWMPurchaseManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMPurchaseManager.h; sourceTree = "<group>"; };
472E3F492146C4CD0020E412 /* MWMPurchaseManager.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMPurchaseManager.mm; sourceTree = "<group>"; };
@ -2229,6 +2233,8 @@
33603C84219F0F6300B11FFE /* SharingPropertiesViewController.swift */,
33F7668E21A57CDF00A88B16 /* EditOnWebViewController.swift */,
33F8BA3B2199858B00ECA8EE /* Tags */,
47289E582212DFFF002ABFC0 /* EditOnWebAlertViewController.swift */,
47289E592212DFFF002ABFC0 /* EditOnWebAlertViewController.xib */,
);
path = Sharing;
sourceTree = "<group>";
@ -4699,6 +4705,7 @@
34BBD6471F82649D0070CA50 /* GoogleSignIn.bundle in Resources */,
F6E2FE851E097BA00083EBEC /* MWMPlacePageOpeningHoursWeekDayView.xib in Resources */,
F6E2FE941E097BA00083EBEC /* PlacePageTaxiCell.xib in Resources */,
47289E5B2212DFFF002ABFC0 /* EditOnWebAlertViewController.xib in Resources */,
F6E2FEA61E097BA00083EBEC /* MWMPPView.xib in Resources */,
47E3C72221108E9F008B3B27 /* BookmarksLoadedViewController.xib in Resources */,
6741A9811BF340DE002C974C /* MWMRateAlert.xib in Resources */,
@ -5193,6 +5200,7 @@
B32FE74020D2844600EF7446 /* DownloadedBookmarksViewController.swift in Sources */,
340416541E7C09C200E2B6D6 /* PhotoScalingView.swift in Sources */,
4767CDA820AB401000BD8166 /* LinkTextView.swift in Sources */,
47289E5A2212DFFF002ABFC0 /* EditOnWebAlertViewController.swift in Sources */,
34763EE71F2F392300F4D2D3 /* MWMTextToSpeech.mm in Sources */,
34ABA6251C2D551900FE1BEC /* MWMInputValidatorFactory.mm in Sources */,
F6E2FD861E097BA00083EBEC /* MWMBaseMapDownloaderViewController.mm in Sources */,