From 4ca3b5c6fb90e6a4e380e946ec11e7acf9b033e8 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Mon, 25 Nov 2019 14:33:30 +0400 Subject: [PATCH] Fix build --- submodules/LocationUI/BUCK | 1 + .../Sources/LocationActionListItem.swift | 13 +++++++---- .../Sources/LocationMapHeaderNode.swift | 16 +++++++++---- .../Sources/LocationPickerController.swift | 13 +++++++---- .../LocationPickerControllerNode.swift | 10 +++++--- .../LiveLocationIcon.imageset/Contents.json | 22 ------------------ .../LocationMessageLiveIcon@2x.png | Bin 2078 -> 0 bytes .../LocationMessageLiveIcon@3x.png | Bin 2587 -> 0 bytes .../Contents.json | 12 ++++++++++ .../ic_mappinlive.pdf | Bin 0 -> 5084 bytes .../SendLocationIcon.imageset/Contents.json | 12 ++++++++++ .../SendLocationIcon.imageset/ic_mappin.pdf | Bin 0 -> 4023 bytes 12 files changed, 61 insertions(+), 38 deletions(-) delete mode 100644 submodules/TelegramUI/Images.xcassets/Location/LiveLocationIcon.imageset/Contents.json delete mode 100644 submodules/TelegramUI/Images.xcassets/Location/LiveLocationIcon.imageset/LocationMessageLiveIcon@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/Location/LiveLocationIcon.imageset/LocationMessageLiveIcon@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/Location/SendLiveLocationIcon.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Location/SendLiveLocationIcon.imageset/ic_mappinlive.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/Location/SendLocationIcon.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Location/SendLocationIcon.imageset/ic_mappin.pdf diff --git a/submodules/LocationUI/BUCK b/submodules/LocationUI/BUCK index d43367add4..81ccd85fdc 100644 --- a/submodules/LocationUI/BUCK +++ b/submodules/LocationUI/BUCK @@ -30,5 +30,6 @@ static_library( "$SDKROOT/System/Library/Frameworks/Foundation.framework", "$SDKROOT/System/Library/Frameworks/UIKit.framework", "$SDKROOT/System/Library/Frameworks/CoreLocation.framework", + "$SDKROOT/System/Library/Frameworks/MapKit.framework", ], ) diff --git a/submodules/LocationUI/Sources/LocationActionListItem.swift b/submodules/LocationUI/Sources/LocationActionListItem.swift index a2cf5664d9..c605ebfd52 100644 --- a/submodules/LocationUI/Sources/LocationActionListItem.swift +++ b/submodules/LocationUI/Sources/LocationActionListItem.swift @@ -8,7 +8,6 @@ import TelegramCore import SyncCore import TelegramPresentationData import ItemListUI -import PresentationDataUtils import LocationResources import AppBundle @@ -58,7 +57,7 @@ private func generateLocationIcon(theme: PresentationTheme) -> UIImage { context.scaleBy(x: 1.0, y: -1.0) context.translateBy(x: -size.width / 2.0, y: -size.height / 2.0) - if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/LocationPinForeground"), color: theme.chat.inputPanel.actionControlForegroundColor) { + if let image = generateTintedImage(image: UIImage(bundleImageName: "Location/SendLocationIcon"), color: theme.chat.inputPanel.actionControlForegroundColor) { context.draw(image.cgImage!, in: CGRect(origin: CGPoint(x: floor((size.width - image.size.width) / 2.0), y: floor((size.height - image.size.height) / 2.0)), size: image.size)) } }! @@ -74,7 +73,7 @@ private func generateLiveLocationIcon(theme: PresentationTheme) -> UIImage { context.scaleBy(x: 1.0, y: -1.0) context.translateBy(x: -size.width / 2.0, y: -size.height / 2.0) - if let image = generateTintedImage(image: UIImage(bundleImageName: "Location/LiveLocationIcon"), color: theme.chat.inputPanel.actionControlForegroundColor) { + if let image = generateTintedImage(image: UIImage(bundleImageName: "Location/SendLiveLocationIcon"), color: theme.chat.inputPanel.actionControlForegroundColor) { context.draw(image.cgImage!, in: CGRect(origin: CGPoint(x: floor((size.width - image.size.width) / 2.0), y: floor((size.height - image.size.height) / 2.0)), size: image.size)) } }! @@ -87,14 +86,16 @@ public class LocationActionListItem: ListViewItem { let subtitle: String let icon: LocationActionListItemIcon let action: () -> Void + let highlighted: (Bool) -> Void - public init(presentationData: ItemListPresentationData, account: Account, title: String, subtitle: String, icon: LocationActionListItemIcon, action: @escaping () -> Void) { + public init(presentationData: ItemListPresentationData, account: Account, title: String, subtitle: String, icon: LocationActionListItemIcon, action: @escaping () -> Void, highlighted: @escaping (Bool) -> Void = { _ in }) { self.presentationData = presentationData self.account = account self.title = title self.subtitle = subtitle self.icon = icon self.action = action + self.highlighted = highlighted } public func nodeConfiguredForParams(async: @escaping (@escaping () -> Void) -> Void, params: ListViewItemLayoutParams, synchronousLoads: Bool, previousItem: ListViewItem?, nextItem: ListViewItem?, completion: @escaping (ListViewItemNode, @escaping () -> (Signal?, (ListViewItemApply) -> Void)) -> Void) { @@ -130,7 +131,7 @@ public class LocationActionListItem: ListViewItem { } public func selected(listView: ListView) { - listView.clearHighlightAnimated(true) + listView.clearHighlightAnimated(false) self.action() } } @@ -184,6 +185,8 @@ class LocationActionListItemNode: ListViewItemNode { override func setHighlighted(_ highlighted: Bool, at point: CGPoint, animated: Bool) { super.setHighlighted(highlighted, at: point, animated: animated) + self.item?.highlighted(highlighted) + if highlighted { self.highlightedBackgroundNode.alpha = 1.0 if self.highlightedBackgroundNode.supernode == nil { diff --git a/submodules/LocationUI/Sources/LocationMapHeaderNode.swift b/submodules/LocationUI/Sources/LocationMapHeaderNode.swift index fd525773a6..30123cce26 100644 --- a/submodules/LocationUI/Sources/LocationMapHeaderNode.swift +++ b/submodules/LocationUI/Sources/LocationMapHeaderNode.swift @@ -22,12 +22,12 @@ private func generateBackgroundImage(theme: PresentationTheme) -> UIImage? { } } -private func generateShadowImage(theme: PresentationTheme) -> UIImage? { +private func generateShadowImage(theme: PresentationTheme, highlighted: Bool) -> UIImage? { return generateImage(CGSize(width: 26.0, height: 14.0)) { size, context in context.clear(CGRect(origin: CGPoint(), size: size)) context.setShadow(offset: CGSize(), blur: 10.0, color: UIColor(rgb: 0x000000, alpha: 0.2).cgColor) - context.setFillColor(theme.list.plainBackgroundColor.cgColor) + context.setFillColor(highlighted ? theme.list.itemHighlightedBackgroundColor.cgColor : theme.list.plainBackgroundColor.cgColor) let path = UIBezierPath(roundedRect: CGRect(origin: CGPoint(x: 0.0, y: 4.0), size: CGSize(width: 26.0, height: 20.0)), cornerRadius: 9.0) context.addPath(path.cgPath) context.fillPath() @@ -35,6 +35,7 @@ private func generateShadowImage(theme: PresentationTheme) -> UIImage? { } final class LocationMapHeaderNode: ASDisplayNode { + private var presentationData: PresentationData private let interaction: LocationPickerInteraction let mapNode: LocationMapNode @@ -44,6 +45,7 @@ final class LocationMapHeaderNode: ASDisplayNode { private let shadowNode: ASImageNode init(presentationData: PresentationData, interaction: LocationPickerInteraction) { + self.presentationData = presentationData self.interaction = interaction self.mapNode = LocationMapNode() @@ -66,7 +68,7 @@ final class LocationMapHeaderNode: ASDisplayNode { self.shadowNode.contentMode = .scaleToFill self.shadowNode.displaysAsynchronously = false self.shadowNode.displayWithoutProcessing = true - self.shadowNode.image = generateShadowImage(theme: presentationData.theme) + self.shadowNode.image = generateShadowImage(theme: presentationData.theme, highlighted: false) super.init() @@ -88,12 +90,14 @@ final class LocationMapHeaderNode: ASDisplayNode { } func updatePresentationData(_ presentationData: PresentationData) { + self.presentationData = presentationData + self.optionsBackgroundNode.image = generateBackgroundImage(theme: presentationData.theme) self.infoButtonNode.setImage(generateTintedImage(image: UIImage(bundleImageName: "Location/InfoIcon"), color: presentationData.theme.rootController.navigationBar.buttonColor), for: .normal) self.infoButtonNode.setImage(generateTintedImage(image: UIImage(bundleImageName: "Location/InfoActiveIcon"), color: presentationData.theme.rootController.navigationBar.buttonColor), for: .selected) self.infoButtonNode.setImage(generateTintedImage(image: UIImage(bundleImageName: "Location/InfoActiveIcon"), color: presentationData.theme.rootController.navigationBar.buttonColor), for: [.selected, .highlighted]) self.locationButtonNode.setImage(generateTintedImage(image: UIImage(bundleImageName: "Location/TrackIcon"), color: presentationData.theme.rootController.navigationBar.buttonColor), for: .normal) - self.shadowNode.image = generateShadowImage(theme: presentationData.theme) + self.shadowNode.image = generateShadowImage(theme: presentationData.theme, highlighted: false) } func updateLayout(layout: ContainerViewLayout, navigationBarHeight: CGFloat, padding: CGFloat, size: CGSize, transition: ContainedViewLayoutTransition) { @@ -112,6 +116,10 @@ final class LocationMapHeaderNode: ASDisplayNode { alphaTransition.updateAlpha(node: self.optionsBackgroundNode, alpha: optionsAlpha) } + func updateHighlight(_ highlighted: Bool) { + self.shadowNode.image = generateShadowImage(theme: self.presentationData.theme, highlighted: highlighted) + } + @objc private func infoPressed() { self.interaction.toggleMapModeSelection() } diff --git a/submodules/LocationUI/Sources/LocationPickerController.swift b/submodules/LocationUI/Sources/LocationPickerController.swift index 640ac42f8c..563664517a 100644 --- a/submodules/LocationUI/Sources/LocationPickerController.swift +++ b/submodules/LocationUI/Sources/LocationPickerController.swift @@ -31,7 +31,9 @@ class LocationPickerInteraction { let dismissInput: () -> Void - init(sendLocation: @escaping (CLLocationCoordinate2D) -> Void, sendLiveLocation: @escaping (CLLocationCoordinate2D) -> Void, sendVenue: @escaping (TelegramMediaMap) -> Void, toggleMapModeSelection: @escaping () -> Void, updateMapMode: @escaping (LocationMapMode) -> Void, goToUserLocation: @escaping () -> Void, openSearch: @escaping () -> Void, updateSearchQuery: @escaping (String) -> Void, dismissSearch: @escaping () -> Void, dismissInput: @escaping () -> Void) { + let updateSendActionHighlight: (Bool) -> Void + + init(sendLocation: @escaping (CLLocationCoordinate2D) -> Void, sendLiveLocation: @escaping (CLLocationCoordinate2D) -> Void, sendVenue: @escaping (TelegramMediaMap) -> Void, toggleMapModeSelection: @escaping () -> Void, updateMapMode: @escaping (LocationMapMode) -> Void, goToUserLocation: @escaping () -> Void, openSearch: @escaping () -> Void, updateSearchQuery: @escaping (String) -> Void, dismissSearch: @escaping () -> Void, dismissInput: @escaping () -> Void, updateSendActionHighlight: @escaping (Bool) -> Void) { self.sendLocation = sendLocation self.sendLiveLocation = sendLiveLocation self.sendVenue = sendVenue @@ -42,6 +44,7 @@ class LocationPickerInteraction { self.updateSearchQuery = updateSearchQuery self.dismissSearch = dismissSearch self.dismissInput = dismissInput + self.updateSendActionHighlight = updateSendActionHighlight } } @@ -212,6 +215,11 @@ public final class LocationPickerController: ViewController { return } strongSelf.searchNavigationContentNode?.deactivate() + }, updateSendActionHighlight: { [weak self] highlighted in + guard let strongSelf = self else { + return + } + strongSelf.controllerNode.updateSendActionHighlight(highlighted) }) self.scrollToTop = { [weak self] in @@ -235,9 +243,6 @@ public final class LocationPickerController: ViewController { } self.displayNode = LocationPickerControllerNode(context: self.context, presentationData: self.presentationData, mode: self.mode, interaction: interaction) - self.controllerNode.present = { [weak self] c, a in - self?.present(c, in: .window(.root), with: a) - } self.displayNodeDidLoad() self._ready.set(.single(true)) diff --git a/submodules/LocationUI/Sources/LocationPickerControllerNode.swift b/submodules/LocationUI/Sources/LocationPickerControllerNode.swift index 9a6338f9d3..583f33e044 100644 --- a/submodules/LocationUI/Sources/LocationPickerControllerNode.swift +++ b/submodules/LocationUI/Sources/LocationPickerControllerNode.swift @@ -138,6 +138,8 @@ private enum LocationPickerEntry: Comparable, Identifiable { if let coordinate = coordinate { interaction?.sendLocation(coordinate) } + }, highlighted: { highlighted in + interaction?.updateSendActionHighlight(highlighted) }) case let .liveLocation(theme, title, subtitle, coordinate): return LocationActionListItem(presentationData: ItemListPresentationData(presentationData), account: account, title: title, subtitle: subtitle, icon: .liveLocation, action: { @@ -218,9 +220,7 @@ final class LocationPickerControllerNode: ViewControllerTracingNode { private var validLayout: (layout: ContainerViewLayout, navigationHeight: CGFloat)? private var listOffset: CGFloat? - - var present: ((ViewController, Any?) -> Void)? - + init(context: AccountContext, presentationData: PresentationData, mode: LocationPickerMode, interaction: LocationPickerInteraction) { self.context = context self.presentationData = presentationData @@ -606,4 +606,8 @@ final class LocationPickerControllerNode: ViewControllerTracingNode { searchContainerNode.containerLayoutUpdated(ContainerViewLayout(size: layout.size, metrics: LayoutMetrics(), deviceMetrics: layout.deviceMetrics, intrinsicInsets: layout.intrinsicInsets, safeInsets: layout.safeInsets, statusBarHeight: nil, inputHeight: layout.inputHeight, inputHeightIsInteractivellyChanging: layout.inputHeightIsInteractivellyChanging, inVoiceOver: layout.inVoiceOver), navigationBarHeight: navigationHeight, transition: transition) } } + + func updateSendActionHighlight(_ highlighted: Bool) { + self.headerNode.updateHighlight(highlighted) + } } diff --git a/submodules/TelegramUI/Images.xcassets/Location/LiveLocationIcon.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Location/LiveLocationIcon.imageset/Contents.json deleted file mode 100644 index 3afe81c36f..0000000000 --- a/submodules/TelegramUI/Images.xcassets/Location/LiveLocationIcon.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "LocationMessageLiveIcon@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "LocationMessageLiveIcon@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/Location/LiveLocationIcon.imageset/LocationMessageLiveIcon@2x.png b/submodules/TelegramUI/Images.xcassets/Location/LiveLocationIcon.imageset/LocationMessageLiveIcon@2x.png deleted file mode 100644 index 92170e69ac4c7b021de8b2c0f2fdaa52db5c50f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2078 zcmaJ?c~ld37oD&PD6TB6;ouNb5rr%WAqfN%2myp3g%l~u5|R;9NG2x3T1q2pSV~!% zx&URZjkZ#iMJOVOxWod26r>(eL|dsvDqv9&r4uXm`$NAuXXdw@ckjFJy?f5&1_pSW z7_T=50Kml8haH5jO!Rd$G(f+T8Kb7?@;>4fiUh-ZkVL)=0$4&g8UlUA{1_+*;tP}a zX&^TM(A^~Bg(9I`f4Tq`6ZqN~LXudDq5;5dTauJ7h=mX^8j2A~7`VUMI&h#!$iVG% z=90KlPiU{mCq)JYrv&f>DX{{Y5Vy@8bW5V61Y!u`gGu5ziJYFqz`f$7qkHW&5eL2s zL1G!We?^6I13^z%27%55ii3c>l?uAh2xMm()zQfwbR>}}L=ufic5)z*=_DGRL@ zEPfL$M}naL^uCo?&P$d;#2`ox$IArh;P%*PQ%UKbGKi1BG9C=aEp;()FO0zQy|5JY z^wf6E1>D5t3q%s_rQItOmrM7R$PvCo0Qs^RIFyGV5(()ZZ0c5$mlumhrLxFmFBg`F zmlMmALgr9NY>J}`WeLlM1@U4?f-GT$|6x7eiPaiHEJZW3A(zlkYWF_!cc%tP6=mdMB2MiXm#p`#D^hMM~Y z^70n|&@1p|vv^52Cd0ygcr4SipE@s&E`00kz;nt^Bd@LjyOe3nO~y5+4RI4kzj@G} zb1OZuhfi?RI(i4*c2y%VtPXs~A;mW|~*6dIU)IAN3Cm80uJdiFOV=E4S@7g3 zvaI=~wZdZPdezKY=25TPf@!PWKk4dCf`88fm2S6fG5PlM#@mW?4=S&Zl}pnf3WsW& z%&ys8yiiWn`Kj!ZdRJ-$@ig2t?wayZx+z%I-vOL3Ibl|0VS;g1$e0_WRMgGJ87<%U zKQRL9`a3uQH@8^)BFIs=B~Ptbu2Ct6>M>p9xpsBS^R%j&Xo-tl?+3hpdx&Lb|Famu z#1l*D$J3)5Fn84vezhw<05=3?KVT@}#m?*Hn5VUPF)@lW-CpzgvSaz0ondPNv#vBK z2)|d06b}`QnT;`*x*O(n`!uIi3?-J3jM;2UZ^ThWiTQAgw^wgg-b-5$a(Ngg9~ zVwmfqBES0HI`b->*-&0}XBP+KP*T_XVM^Max-WqQox(Eeq=aXlAJS!aZmrC{#cXv2 z_Ctniw)odve0@@+0qwhiFp9?6Fg>!ElA*ABM&Me_f}@xZ)b{H?ha#GNw+ElMvioL0 zbU}mNE;k**avygC#}3H6s|-~+T#wrv-b>-Q&EyR`ni_M#z6hMQD(-vc-^SU;`gvxRS(k9XpZZ$lS$oK0U6EaT8(+|)yIGm>NB>R1 zc*|VvyzB_~VCImUKhu2hU>I$B4XZbN*v~wFR+oD0MZDfbMQUC$;EuDQjJFP&r%^$TG#ZEPx_~Mb9r(VS$Vv^(4-hCId^w`lF>j|G@L9N*3=W`qFv93JZ znbfI_$U5r--(hWY4NiYttqFBbnJP{@XcKj9{LI}p%t~vC4aWOu8n#VXvUYVfxn#s5 z=tud$y$0XO``4t0gfTk;H;_1|Y|Bf!dWPGS3X^U)-cdYJeo-CVIdggh=O-9R>7DmB zu{~ZKx5zqT(mu%z)XB~bxZlmj8t=C%Ejut6V*BH{?54wwvums^s`XYBOGEiJt(7+d zcLy9k5cenL2zUQ(-g$$T%*&1Vb2$Xl@Pdif!unDN0yvh{_Wdh%o}J=*)h~|v zD2nP5>pa?2YF3@?Q^Wb+aG60WMOkh_dWZgdz(_9Ry_4^csI-45~KcL7+ AiU0rr diff --git a/submodules/TelegramUI/Images.xcassets/Location/LiveLocationIcon.imageset/LocationMessageLiveIcon@3x.png b/submodules/TelegramUI/Images.xcassets/Location/LiveLocationIcon.imageset/LocationMessageLiveIcon@3x.png deleted file mode 100644 index 40f071a3b0f1aa3e00030e94e8fe820c6d4db328..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2587 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