From 2596420e63466db95b9a0cb5b85e6280261ae47a Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Fri, 4 Oct 2019 20:39:48 +0300 Subject: [PATCH 1/2] Media scrubbing improvements --- .../ChatVideoGalleryItemScrubberView.swift | 2 +- .../Sources/InstantPageAudioNode.swift | 2 +- .../Sources/MediaPlayerScrubbingNode.swift | 98 +++++++++++++++--- .../Sources/MediaPlayerTimeTextNode.swift | 35 ++++--- .../MediaNavigationAccessoryHeaderNode.swift | 4 +- .../Resources/PresentationResourceKey.swift | 9 +- .../PresentationResourcesRootController.swift | 56 +++------- .../Next.imageset/Contents.json | 12 +-- .../MusicPlayerControlForward@2x.png | Bin 1061 -> 0 bytes .../MusicPlayerControlForward@3x.png | Bin 1469 -> 0 bytes .../Next.imageset/ic_musicnext.pdf | Bin 0 -> 4180 bytes .../OrderRandom.imageset/Contents.json | 12 +-- .../MusicPlayerControlShuffle@2x.png | Bin 549 -> 0 bytes .../MusicPlayerControlShuffle@3x.png | Bin 497 -> 0 bytes .../OrderRandom.imageset/ic_musicshuffle.pdf | Bin 0 -> 4572 bytes .../OrderReverse.imageset/Contents.json | 12 +-- .../MusicPlayerControlReverse@2x.png | Bin 316 -> 0 bytes .../MusicPlayerControlReverse@3x.png | Bin 381 -> 0 bytes .../ic_musicflipover.pdf | Bin 0 -> 4327 bytes .../Pause.imageset/Contents.json | 12 +-- .../MusicPlayerControlPause@2x.png | Bin 371 -> 0 bytes .../MusicPlayerControlPause@3x.png | Bin 273 -> 0 bytes .../Pause.imageset/ic_musicpause.pdf | Bin 0 -> 3970 bytes .../Play.imageset/Contents.json | 12 +-- .../MusicPlayerControlPlay@2x.png | Bin 565 -> 0 bytes .../MusicPlayerControlPlay@3x.png | Bin 704 -> 0 bytes .../Play.imageset/ic_musicplay.pdf | Bin 0 -> 4039 bytes .../Previous.imageset/Contents.json | 12 +-- .../MusicPlayerControlBack@2x.png | Bin 683 -> 0 bytes .../MusicPlayerControlBack@3x.png | Bin 591 -> 0 bytes .../Previous.imageset/ic_musicprevious.pdf | Bin 0 -> 4237 bytes .../Repeat.imageset/Contents.json | 12 +-- .../MusicPlayerControlRepeat@2x.png | Bin 391 -> 0 bytes .../MusicPlayerControlRepeat@3x.png | Bin 429 -> 0 bytes .../Repeat.imageset/ic_musicrepeat.pdf | Bin 0 -> 4426 bytes .../RepeatOne.imageset/Contents.json | 12 +-- .../MusicPlayerControlRepeatOne@2x.png | Bin 437 -> 0 bytes .../MusicPlayerControlRepeatOne@3x.png | Bin 515 -> 0 bytes .../RepeatOne.imageset/ic_musicrepeatone.pdf | Bin 0 -> 4641 bytes .../Share.imageset/Contents.json | 12 +++ .../Share.imageset/ic_musicshare.pdf | Bin 0 -> 4375 bytes .../Shuffle.imageset/Contents.json | 22 ---- .../MusicPlayerControlShuffle@2x.png | Bin 549 -> 0 bytes .../MusicPlayerControlShuffle@3x.png | Bin 497 -> 0 bytes .../OverlayPlayerControllerNode.swift | 6 +- .../OverlayPlayerControlsNode.swift | 79 ++++++++++---- .../WalletUI/Sources/WalletQrScanScreen.swift | 4 +- .../WalletUI/Sources/WalletQrViewScreen.swift | 2 +- 48 files changed, 213 insertions(+), 214 deletions(-) delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Next.imageset/MusicPlayerControlForward@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Next.imageset/MusicPlayerControlForward@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Next.imageset/ic_musicnext.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderRandom.imageset/MusicPlayerControlShuffle@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderRandom.imageset/MusicPlayerControlShuffle@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderRandom.imageset/ic_musicshuffle.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderReverse.imageset/MusicPlayerControlReverse@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderReverse.imageset/MusicPlayerControlReverse@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderReverse.imageset/ic_musicflipover.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Pause.imageset/MusicPlayerControlPause@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Pause.imageset/MusicPlayerControlPause@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Pause.imageset/ic_musicpause.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Play.imageset/MusicPlayerControlPlay@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Play.imageset/MusicPlayerControlPlay@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Play.imageset/ic_musicplay.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Previous.imageset/MusicPlayerControlBack@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Previous.imageset/MusicPlayerControlBack@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Previous.imageset/ic_musicprevious.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Repeat.imageset/MusicPlayerControlRepeat@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Repeat.imageset/MusicPlayerControlRepeat@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Repeat.imageset/ic_musicrepeat.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/RepeatOne.imageset/MusicPlayerControlRepeatOne@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/RepeatOne.imageset/MusicPlayerControlRepeatOne@3x.png create mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/RepeatOne.imageset/ic_musicrepeatone.pdf create mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Share.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Share.imageset/ic_musicshare.pdf delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Shuffle.imageset/Contents.json delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Shuffle.imageset/MusicPlayerControlShuffle@2x.png delete mode 100644 submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Shuffle.imageset/MusicPlayerControlShuffle@3x.png diff --git a/submodules/GalleryUI/Sources/ChatVideoGalleryItemScrubberView.swift b/submodules/GalleryUI/Sources/ChatVideoGalleryItemScrubberView.swift index d890460689..98bcebc3cf 100644 --- a/submodules/GalleryUI/Sources/ChatVideoGalleryItemScrubberView.swift +++ b/submodules/GalleryUI/Sources/ChatVideoGalleryItemScrubberView.swift @@ -52,7 +52,7 @@ final class ChatVideoGalleryItemScrubberView: UIView { var seek: (Double) -> Void = { _ in } override init(frame: CGRect) { - self.scrubberNode = MediaPlayerScrubbingNode(content: .standard(lineHeight: 5.0, lineCap: .round, scrubberHandle: .circle, backgroundColor: UIColor(white: 1.0, alpha: 0.42), foregroundColor: .white)) + self.scrubberNode = MediaPlayerScrubbingNode(content: .standard(lineHeight: 5.0, lineCap: .round, scrubberHandle: .circle, backgroundColor: UIColor(white: 1.0, alpha: 0.42), foregroundColor: .white, bufferingColor: UIColor(rgb: 0xffffff, alpha: 0.5))) self.leftTimestampNode = MediaPlayerTimeTextNode(textColor: .white) self.rightTimestampNode = MediaPlayerTimeTextNode(textColor: .white) diff --git a/submodules/InstantPageUI/Sources/InstantPageAudioNode.swift b/submodules/InstantPageUI/Sources/InstantPageAudioNode.swift index 47257e0f98..e81b89878a 100644 --- a/submodules/InstantPageUI/Sources/InstantPageAudioNode.swift +++ b/submodules/InstantPageUI/Sources/InstantPageAudioNode.swift @@ -98,7 +98,7 @@ final class InstantPageAudioNode: ASDisplayNode, InstantPageNode { if brightness > 0.5 { backgroundAlpha = 0.4 } - self.scrubbingNode = MediaPlayerScrubbingNode(content: .standard(lineHeight: 3.0, lineCap: .round, scrubberHandle: .line, backgroundColor: theme.textCategories.paragraph.color.withAlphaComponent(backgroundAlpha), foregroundColor: theme.textCategories.paragraph.color)) + self.scrubbingNode = MediaPlayerScrubbingNode(content: .standard(lineHeight: 3.0, lineCap: .round, scrubberHandle: .line, backgroundColor: theme.textCategories.paragraph.color.withAlphaComponent(backgroundAlpha), foregroundColor: theme.textCategories.paragraph.color, bufferingColor: theme.textCategories.paragraph.color.withAlphaComponent(0.5))) let playlistType: MediaManagerPlayerType if let file = self.media.media as? TelegramMediaFile { diff --git a/submodules/MediaPlayer/Sources/MediaPlayerScrubbingNode.swift b/submodules/MediaPlayer/Sources/MediaPlayerScrubbingNode.swift index 29e1a9d966..695c50bdf5 100644 --- a/submodules/MediaPlayer/Sources/MediaPlayerScrubbingNode.swift +++ b/submodules/MediaPlayer/Sources/MediaPlayerScrubbingNode.swift @@ -18,20 +18,40 @@ private func generateHandleBackground(color: UIColor) -> UIImage? { })?.stretchableImage(withLeftCapWidth: 0, topCapHeight: 2) } -private final class MediaPlayerScrubbingNodeButton: ASDisplayNode { +private final class MediaPlayerScrubbingNodeButton: ASDisplayNode, UIGestureRecognizerDelegate { var beginScrubbing: (() -> Void)? var endScrubbing: ((Bool) -> Void)? - var updateScrubbing: ((CGFloat) -> Void)? + var updateScrubbing: ((CGFloat, Double) -> Void)? + var updateMultiplier: ((Double) -> Void)? var highlighted: ((Bool) -> Void)? + var verticalPanEnabled = false + var hapticFeedback = HapticFeedback() + + private var scrubbingMultiplier: Double = 1.0 private var scrubbingStartLocation: CGPoint? override func didLoad() { super.didLoad() self.view.disablesInteractiveTransitionGestureRecognizer = true - self.view.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.panGesture(_:)))) + + let gestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.panGesture(_:))) + gestureRecognizer.delegate = self + self.view.addGestureRecognizer(gestureRecognizer) + } + + override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { + guard let gestureRecognizer = gestureRecognizer as? UIPanGestureRecognizer else { + return !self.verticalPanEnabled + } + let translation = gestureRecognizer.translation(in: gestureRecognizer.view) + if self.verticalPanEnabled { + return abs(translation.x) > abs(translation.y) || translation.y > 0.0 + } else { + return abs(translation.x) > abs(translation.y) + } } override func touchesBegan(_ touches: Set, with event: UIEvent?) { @@ -66,15 +86,38 @@ private final class MediaPlayerScrubbingNodeButton: ASDisplayNode { case .changed: if let scrubbingStartLocation = self.scrubbingStartLocation { let delta = location.x - scrubbingStartLocation.x - self.updateScrubbing?(delta / self.bounds.size.width) + var multiplier: Double = 1.0 + var skipUpdate = false + if self.verticalPanEnabled, location.y > scrubbingStartLocation.y { + let verticalDelta = abs(location.y - scrubbingStartLocation.y) + if verticalDelta > 150.0 { + multiplier = 0.01 + } else if verticalDelta > 100.0 { + multiplier = 0.25 + } else if verticalDelta > 50.0 { + multiplier = 0.5 + } + if multiplier != self.scrubbingMultiplier { + skipUpdate = true + self.scrubbingMultiplier = multiplier + self.scrubbingStartLocation = CGPoint(x: location.x, y: scrubbingStartLocation.y) + self.updateMultiplier?(multiplier) + + self.hapticFeedback.impact() + } + } + if !skipUpdate { + self.updateScrubbing?(delta / self.bounds.size.width, multiplier) + } } case .ended, .cancelled: if let scrubbingStartLocation = self.scrubbingStartLocation { self.scrubbingStartLocation = nil let delta = location.x - scrubbingStartLocation.x - self.updateScrubbing?(delta / self.bounds.size.width) + self.updateScrubbing?(delta / self.bounds.size.width, self.scrubbingMultiplier) self.endScrubbing?(recognizer.state == .ended) self.highlighted?(false) + self.scrubbingMultiplier = 1.0 } default: break @@ -106,7 +149,7 @@ public enum MediaPlayerScrubbingNodeHandle { } public enum MediaPlayerScrubbingNodeContent { - case standard(lineHeight: CGFloat, lineCap: MediaPlayerScrubbingNodeCap, scrubberHandle: MediaPlayerScrubbingNodeHandle, backgroundColor: UIColor, foregroundColor: UIColor) + case standard(lineHeight: CGFloat, lineCap: MediaPlayerScrubbingNodeCap, scrubberHandle: MediaPlayerScrubbingNodeHandle, backgroundColor: UIColor, foregroundColor: UIColor, bufferingColor: UIColor) case custom(backgroundNode: ASDisplayNode, foregroundContentNode: ASDisplayNode) } @@ -194,10 +237,12 @@ private final class MediaPlayerScrubbingBufferingNode: ASDisplayNode { for range in ranges.0.rangeView { let rangeWidth = min(size.width, (CGFloat(range.count) / CGFloat(ranges.1)) * size.width) transition.updateFrame(node: self.containerNode, frame: CGRect(origin: CGPoint(), size: CGSize(width: rangeWidth, height: size.height))) + transition.updateAlpha(node: self.foregroundNode, alpha: abs(size.width - rangeWidth) < 1.0 ? 0.0 : 1.0) break } } else { transition.updateFrame(node: self.containerNode, frame: CGRect(origin: CGPoint(), size: CGSize(width: 0.0, height: size.height))) + transition.updateAlpha(node: self.foregroundNode, alpha: 0.0) } } } @@ -240,6 +285,17 @@ public final class MediaPlayerScrubbingNode: ASDisplayNode { } } + public var enableFineScrubbing: Bool = false { + didSet { + switch self.contentNodes { + case let .standard(node): + node.handleNodeContainer?.verticalPanEnabled = self.enableFineScrubbing + case let .custom(node): + node.handleNodeContainer?.verticalPanEnabled = self.enableFineScrubbing + } + } + } + private var _statusValue: MediaPlayerStatus? private var statusValue: MediaPlayerStatus? { get { @@ -293,13 +349,13 @@ public final class MediaPlayerScrubbingNode: ASDisplayNode { private static func contentNodesFromContent(_ content: MediaPlayerScrubbingNodeContent, enableScrubbing: Bool) -> MediaPlayerScrubbingNodeContentNodes { switch content { - case let .standard(lineHeight, lineCap, scrubberHandle, backgroundColor, foregroundColor): + case let .standard(lineHeight, lineCap, scrubberHandle, backgroundColor, foregroundColor, bufferingColor): let backgroundNode = ASImageNode() backgroundNode.isLayerBacked = true backgroundNode.displaysAsynchronously = false backgroundNode.displayWithoutProcessing = true - let bufferingNode = MediaPlayerScrubbingBufferingNode(color: foregroundColor.withAlphaComponent(0.5), lineCap: lineCap, lineHeight: lineHeight) + let bufferingNode = MediaPlayerScrubbingBufferingNode(color: bufferingColor, lineCap: lineCap, lineHeight: lineHeight) let foregroundContentNode = ASImageNode() foregroundContentNode.isLayerBacked = true @@ -421,7 +477,7 @@ public final class MediaPlayerScrubbingNode: ASDisplayNode { strongSelf.displayLink?.isPaused = true var timestamp = statusValue.timestamp - if statusValue.generationTimestamp > 0 { + if statusValue.generationTimestamp > 0 && statusValue.status == .playing { let currentTimestamp = CACurrentMediaTime() timestamp = timestamp + (currentTimestamp - statusValue.generationTimestamp) * statusValue.baseRate } @@ -437,7 +493,6 @@ public final class MediaPlayerScrubbingNode: ASDisplayNode { strongSelf.updateProgressAnimations() highlightedHandleNode.layer.animateSpring(from: 1.0 as NSNumber, to: 0.1875 as NSNumber, keyPath: "transform.scale", duration: 0.65, initialVelocity: 0.0, damping: 120.0, removeOnCompletion: false) - } } } @@ -453,10 +508,11 @@ public final class MediaPlayerScrubbingNode: ASDisplayNode { } } } - handleNodeContainer.updateScrubbing = { [weak self] addedFraction in + handleNodeContainer.updateScrubbing = { [weak self] addedFraction, multiplier in if let strongSelf = self { if let statusValue = strongSelf.statusValue, let scrubbingBeginTimestamp = strongSelf.scrubbingBeginTimestamp, Double(0.0).isLess(than: statusValue.duration) { - let timestampValue = max(0.0, min(statusValue.duration, scrubbingBeginTimestamp + statusValue.duration * Double(addedFraction))) + let delta: Double = (statusValue.duration * Double(addedFraction)) * multiplier + let timestampValue = max(0.0, min(statusValue.duration, scrubbingBeginTimestamp + delta)) strongSelf.scrubbingTimestampValue = timestampValue strongSelf._scrubbingTimestamp.set(.single(strongSelf.scrubbingTimestampValue)) strongSelf._scrubbingPosition.set(.single(strongSelf.scrubbingTimestampValue.flatMap { $0 / statusValue.duration })) @@ -465,6 +521,13 @@ public final class MediaPlayerScrubbingNode: ASDisplayNode { } } } + handleNodeContainer.updateMultiplier = { [weak self] multiplier in + if let strongSelf = self { + if let statusValue = strongSelf.statusValue, let scrubbingBeginTimestamp = strongSelf.scrubbingBeginTimestamp, Double(0.0).isLess(than: statusValue.duration) { + strongSelf.scrubbingBeginTimestamp = strongSelf.scrubbingTimestampValue + } + } + } handleNodeContainer.endScrubbing = { [weak self] apply in if let strongSelf = self { strongSelf.scrubbingBeginTimestamp = nil @@ -513,14 +576,21 @@ public final class MediaPlayerScrubbingNode: ASDisplayNode { } } } - handleNodeContainer.updateScrubbing = { [weak self] addedFraction in + handleNodeContainer.updateScrubbing = { [weak self] addedFraction, multiplier in if let strongSelf = self { if let statusValue = strongSelf.statusValue, let scrubbingBeginTimestamp = strongSelf.scrubbingBeginTimestamp, Double(0.0).isLess(than: statusValue.duration) { - strongSelf.scrubbingTimestampValue = scrubbingBeginTimestamp + statusValue.duration * Double(addedFraction) + strongSelf.scrubbingTimestampValue = scrubbingBeginTimestamp + (statusValue.duration * Double(addedFraction)) * multiplier strongSelf.updateProgressAnimations() } } } + handleNodeContainer.updateMultiplier = { [weak self] multiplier in + if let strongSelf = self { + if let statusValue = strongSelf.statusValue, let scrubbingBeginTimestamp = strongSelf.scrubbingBeginTimestamp, Double(0.0).isLess(than: statusValue.duration) { + strongSelf.scrubbingBeginTimestamp = strongSelf.scrubbingTimestampValue + } + } + } handleNodeContainer.endScrubbing = { [weak self] apply in if let strongSelf = self { strongSelf.scrubbingBeginTimestamp = nil diff --git a/submodules/MediaPlayer/Sources/MediaPlayerTimeTextNode.swift b/submodules/MediaPlayer/Sources/MediaPlayerTimeTextNode.swift index e69b7de216..ef3381062f 100644 --- a/submodules/MediaPlayer/Sources/MediaPlayerTimeTextNode.swift +++ b/submodules/MediaPlayer/Sources/MediaPlayerTimeTextNode.swift @@ -35,6 +35,20 @@ private struct MediaPlayerTimeTextNodeState: Equatable { } } +private extension MediaPlayerTimeTextNodeState { + var string: String { + if let hours = self.hours, let minutes = self.minutes, let seconds = self.seconds { + if hours != 0 { + return String(format: "%d:%02d:%02d", hours, minutes, seconds) + } else { + return String(format: "%d:%02d", minutes, seconds) + } + } else { + return "-:--" + } + } +} + private final class MediaPlayerTimeTextNodeParameters: NSObject { let state: MediaPlayerTimeTextNodeState let alignment: NSTextAlignment @@ -160,6 +174,14 @@ public final class MediaPlayerTimeTextNode: ASDisplayNode { } } + private let digitsSet = CharacterSet(charactersIn: "0123456789") + private func widthForString(_ string: String) -> CGFloat { + let convertedString = string.components(separatedBy: digitsSet).joined(separator: "8") + let text = NSAttributedString(string: convertedString, font: textFont, textColor: .black) + let size = text.boundingRect(with: CGSize(width: 200.0, height: 100.0), options: NSStringDrawingOptions.usesLineFragmentOrigin, context: nil).size + return size.width + } + override public func drawParameters(forAsyncLayer layer: _ASDisplayLayer) -> NSObjectProtocol? { return MediaPlayerTimeTextNodeParameters(state: self.state, alignment: self.alignment, mode: self.mode, textColor: self.textColor) } @@ -174,19 +196,8 @@ public final class MediaPlayerTimeTextNode: ASDisplayNode { } if let parameters = parameters as? MediaPlayerTimeTextNodeParameters { - let text: String - if let hours = parameters.state.hours, let minutes = parameters.state.minutes, let seconds = parameters.state.seconds { - if hours != 0 { - text = String(format: "%d:%02d:%02d", hours, minutes, seconds) - } else { - text = String(format: "%d:%02d", minutes, seconds) - } - } else { - text = "-:--" - } - let string = NSAttributedString(string: text, font: textFont, textColor: parameters.textColor) + let string = NSAttributedString(string: parameters.state.string, font: textFont, textColor: parameters.textColor) let size = string.boundingRect(with: CGSize(width: 200.0, height: 100.0), options: NSStringDrawingOptions.usesLineFragmentOrigin, context: nil).size - if parameters.alignment == .left { string.draw(at: CGPoint()) } else { diff --git a/submodules/TelegramBaseController/Sources/MediaNavigationAccessoryHeaderNode.swift b/submodules/TelegramBaseController/Sources/MediaNavigationAccessoryHeaderNode.swift index b8da7e768e..799a8f14d2 100644 --- a/submodules/TelegramBaseController/Sources/MediaNavigationAccessoryHeaderNode.swift +++ b/submodules/TelegramBaseController/Sources/MediaNavigationAccessoryHeaderNode.swift @@ -258,7 +258,7 @@ final class MediaNavigationAccessoryHeaderNode: ASDisplayNode, UIScrollViewDeleg self.actionPlayNode.image = PresentationResourcesRootController.navigationPlayerPlayIcon(self.theme) self.actionPlayNode.isHidden = true - self.scrubbingNode = MediaPlayerScrubbingNode(content: .standard(lineHeight: 2.0, lineCap: .square, scrubberHandle: .none, backgroundColor: .clear, foregroundColor: self.theme.rootController.navigationBar.accentTextColor)) + self.scrubbingNode = MediaPlayerScrubbingNode(content: .standard(lineHeight: 2.0, lineCap: .square, scrubberHandle: .none, backgroundColor: .clear, foregroundColor: self.theme.rootController.navigationBar.accentTextColor, bufferingColor: self.theme.rootController.navigationBar.accentTextColor.withAlphaComponent(0.5))) self.separatorNode = ASDisplayNode() self.separatorNode.isLayerBacked = true @@ -371,7 +371,7 @@ final class MediaNavigationAccessoryHeaderNode: ASDisplayNode, UIScrollViewDeleg self.actionPlayNode.image = PresentationResourcesRootController.navigationPlayerPlayIcon(self.theme) self.actionPauseNode.image = PresentationResourcesRootController.navigationPlayerPauseIcon(self.theme) self.separatorNode.backgroundColor = self.theme.rootController.navigationBar.separatorColor - self.scrubbingNode.updateContent(.standard(lineHeight: 2.0, lineCap: .square, scrubberHandle: .none, backgroundColor: .clear, foregroundColor: self.theme.rootController.navigationBar.accentTextColor)) + self.scrubbingNode.updateContent(.standard(lineHeight: 2.0, lineCap: .square, scrubberHandle: .none, backgroundColor: .clear, foregroundColor: self.theme.rootController.navigationBar.accentTextColor, bufferingColor: self.theme.rootController.navigationBar.accentTextColor.withAlphaComponent(0.5))) if let playbackBaseRate = self.playbackBaseRate { switch playbackBaseRate { diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift index 6378d155ee..a598a1dfa3 100644 --- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift +++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourceKey.swift @@ -26,15 +26,10 @@ public enum PresentationResourceKey: Int32 { case navigationPlayerPlayIcon case navigationPlayerPauseIcon - case navigationPlayerMaximizedPlayIcon - case navigationPlayerMaximizedPauseIcon - case navigationPlayerMaximizedPreviousIcon - case navigationPlayerMaximizedNextIcon - case navigationPlayerMaximizedShuffleIcon - case navigationPlayerMaximizedRepeatIcon - case navigationPlayerHandleIcon case navigationPlayerRateActiveIcon case navigationPlayerRateInactiveIcon + case navigationPlayerMaximizedRateActiveIcon + case navigationPlayerMaximizedRateInactiveIcon case itemListDisclosureArrow case itemListCheckIcon diff --git a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesRootController.swift b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesRootController.swift index 0e31cd52d3..c85f665ed2 100644 --- a/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesRootController.swift +++ b/submodules/TelegramPresentationData/Sources/Resources/PresentationResourcesRootController.swift @@ -120,6 +120,18 @@ public struct PresentationResourcesRootController { }) } + public static func navigationPlayerMaximizedRateActiveIcon(_ theme: PresentationTheme) -> UIImage? { + return theme.image(PresentationResourceKey.navigationPlayerMaximizedRateActiveIcon.rawValue, { theme in + return generatePlayerRateIcon(theme.list.itemAccentColor) + }) + } + + public static func navigationPlayerMaximizedRateInactiveIcon(_ theme: PresentationTheme) -> UIImage? { + return theme.image(PresentationResourceKey.navigationPlayerMaximizedRateInactiveIcon.rawValue, { theme in + return generatePlayerRateIcon(theme.list.itemSecondaryTextColor) + }) + } + public static func navigationPlayerPauseIcon(_ theme: PresentationTheme) -> UIImage? { return theme.image(PresentationResourceKey.navigationPlayerPauseIcon.rawValue, { theme in return generateTintedImage(image: UIImage(bundleImageName: "GlobalMusicPlayer/MinimizedPause"), color: theme.rootController.navigationBar.accentTextColor) @@ -131,49 +143,7 @@ public struct PresentationResourcesRootController { return generateTintedImage(image: UIImage(bundleImageName: "Chat List/LiveLocationPanelIcon"), color: theme.rootController.navigationBar.accentTextColor) }) } - - public static func navigationPlayerMaximizedPlayIcon(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.navigationPlayerMaximizedPlayIcon.rawValue, { theme in - return generateTintedImage(image: UIImage(bundleImageName: "GlobalMusicPlayer/Play"), color: theme.rootController.navigationBar.primaryTextColor) - }) - } - - public static func navigationPlayerMaximizedPauseIcon(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.navigationPlayerMaximizedPauseIcon.rawValue, { theme in - return generateTintedImage(image: UIImage(bundleImageName: "GlobalMusicPlayer/Pause"), color: theme.rootController.navigationBar.primaryTextColor) - }) - } - - public static func navigationPlayerMaximizedPreviousIcon(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.navigationPlayerMaximizedPreviousIcon.rawValue, { theme in - return generateTintedImage(image: UIImage(bundleImageName: "GlobalMusicPlayer/Previous"), color: theme.rootController.navigationBar.primaryTextColor) - }) - } - - public static func navigationPlayerMaximizedNextIcon(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.navigationPlayerMaximizedNextIcon.rawValue, { theme in - return generateTintedImage(image: UIImage(bundleImageName: "GlobalMusicPlayer/Next"), color: theme.rootController.navigationBar.primaryTextColor) - }) - } - - public static func navigationPlayerMaximizedShuffleIcon(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.navigationPlayerMaximizedShuffleIcon.rawValue, { theme in - return generateTintedImage(image: UIImage(bundleImageName: "GlobalMusicPlayer/Shuffle"), color: theme.rootController.navigationBar.primaryTextColor) - }) - } - - public static func navigationPlayerMaximizedRepeatIcon(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.navigationPlayerMaximizedRepeatIcon.rawValue, { theme in - return generateTintedImage(image: UIImage(bundleImageName: "GlobalMusicPlayer/Repeat"), color: theme.rootController.navigationBar.primaryTextColor) - }) - } - - public static func navigationPlayerHandleIcon(_ theme: PresentationTheme) -> UIImage? { - return theme.image(PresentationResourceKey.navigationPlayerHandleIcon.rawValue, { theme in - return generateStretchableFilledCircleImage(diameter: 7.0, color: theme.rootController.navigationBar.controlColor) - }) - } - + public static func inAppNotificationBackground(_ theme: PresentationTheme) -> UIImage? { return theme.image(PresentationResourceKey.inAppNotificationBackground.rawValue, { theme in let inset: CGFloat = 16.0 diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Next.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Next.imageset/Contents.json index 8ff41ed473..a8da1d8952 100644 --- a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Next.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Next.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "MusicPlayerControlForward@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "MusicPlayerControlForward@3x.png", - "scale" : "3x" + "filename" : "ic_musicnext.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Next.imageset/MusicPlayerControlForward@2x.png b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Next.imageset/MusicPlayerControlForward@2x.png deleted file mode 100644 index 03bf295608f4ca07a125847539233fc8b0240b0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1061 zcmeAS@N?(olHy`uVBq!ia0vp^5g^RL1|$oo8khhn#^NA%Cx&(BWL`2bFyHrdaSW+o zd^_8=$2U-<`Tfr3`!}CISADIb{r#Nn^SPV9nH!g1v;Kbej*K+t1O{T!7r}_j z*Bf8&UZ8!U@WtOv1uL#S+xRKa|@xqTtSX{TSg7(%!Q_M)=q99_PNaK7P^rj^j#gmh;&D z^juKi-gmX_=PG_)#;^}G8>bd0}8NDa!l`|y{1l{2G`1d2nBhJvqktcz* zmOJ<@kAL`nbFmF#Uj?W6JFPZ~+|D58AHU%9g%la_B~3cKJP@iXAlD{b`+Okwux z4X<9Ddim;pBi#f|pQO9ICycN8az{9ti@y$H$PS#hQBQP3MV8jJN`|ltavRSvZ}=t2 zSoSsIIcEg7cW3FmhO7QpBc?NN5HZVLbDA;2F}$;MCs3QvYd^=08}-x^KB{bd#}uM- z?J3)u1=c?VuCk65G48o||lb1jf^Oz$sMWy}s-7!fYDq2iR(>nxx(lape354=ie zx$$n}I<*AdHPWxMfbLwkaUJV{pc%(@rCVHg%9dBX_O@YCly-yYGyjmq&vj+)A3T3g z@zCZkEDMe$uM)7onZHj$N}+Z$OT~(5Qh%e{#Z(_CIz9Zi`{BESeDCiGou2s%#NO?F z^iX;Whw4@_2JZ{|xpJGLIx?BQ^KD`G%G=6#I{GT}T&*nTI!1kNS^JaAw=$egJH3(f zT{h!C7X9Z7E*w9jc0+bwh}4E0aj!QoZ|mvs{xIJY)4t6iGRpJ7_Q1v`rvkJ&e;D@2 z@XY-9LYwi%r+fQY9&BeQKg1k&M#hq{Kj8sS%E^b8jNWf{v8-+H+A7nqd*kUS54{6< zKx%^dgO4{-zdq)@VOti-{fX(0`0h1zdl=HYW3M#@F;?3z^<~xB_*!a;ZrM~88DXGY z5QBIpP;S{z&TU8ZR?p95@P0F?{!!+pNQVA^M$@v$?rjX~gm$lCJ<8zM85?H5u|c)$ z?KZ!-LdCF{R?kDZZB3L gHaksl5NiBitCUjzX#TZsV7_PYboFyt=akR{07n7Q-~a#s diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Next.imageset/MusicPlayerControlForward@3x.png b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Next.imageset/MusicPlayerControlForward@3x.png deleted file mode 100644 index e616776ed6ff95e9fc688e4461076d76c9d8fa00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1469 zcmeAS@N?(olHy`uVBq!ia0vp^Eg;On1|$PrnwJA9#^NA%Cx&(BWL`2bu$FteIEGX( zzMZpiooJ{?Tc8lPa5b0JqJD+e-YFLXB)!+$HUHq@_$b=YG)+h=&Oyjp*I=4jm|2O* zqg!WB>d&k`_viN;+s)U%%}!D8F1|i5^8WU=!?EhcJBnJFnI#S|uo*Nk@+2@&ndy=I zU{&DDyC?R_zkVGdf8>|$HJ;;ZVq&X{1=H)l-}`0xuf{m+*<+=y`4d-H``1MZguDC` zejT_bd!v!u=AzQ~u9<&+*H8X(KL644`^SH+s8-F@H_#4`_U2B%{7k+({`kGy+`rvx zUrKcU(~%A@zps_<`^QG>*Ouzg=kW==-Oo}UTHQa>X}n^}){nO>p7(FGvn+gPTfb+T z>t~~a((+YKcYds2@osiRYKZLHf=HA4ly&dsg}UU%9J_LUclfK=1=C!=_nvqfx#C0^ zY=eB#Buiwi@y+_=5ygYKiiV^_p(V?0FZKqFr*j;(g&d)$V!O z`RlsGs-s1=xyKyad4A8NSt;KWE*8H#de!CJ#>pBf>nr*T*NJz}+g@PXVfyJu?V9i1 z_Q414eVq0Ym#Dov z#b)35Zmr$Q2&fI-%$25p4t>Buh zIj4^-+B)x%QB?HwRYy~L^rfF0ZOS-1z3^)3%^OQyQ+lT#+qp(3>bubNi??=#=qgmN zc^p$Fwl;p}t6e#7E^(h1nqHVECiYY##=Pg=KlReLi$6YXlBwkRBf0cm*Vp#wPwns6 zJ_SqckPH1660G@N!1P+t8_oSWbuz1KR&4$CKsIUXs*=v9ZX5F2oKEmgTz7socim2_ zV4C&TmG5l`h{FD9&WFKQsxmIAgckQXO1;SILPO}^OC$0U<@0s?L zi?z0&=TVlN+uW(E-`^ETmye8*+^z?doS+-T56md+2jUKPJc{ax-dyx`7eC)~S>Kq| zh1p^2oF7-QF7C*-%{zPQ>T5fTIpz6XEsnm)y z`L)hpq?BX#MDC2?FRRlo+ z3&VaNnrnXM)YZt@|80)MB`?uFv{!Lc!A`k1f3`mQCZ`;`0b=S*zP^*vsc?tvk1ulW zF>~9Mu(=4N^u1VKhal8e=g@z5Z+z9cb~z&c=&H&UrrUVS&zv%ylfiX}Mr9YUOq7!T aAs%tlSZm43b%nt4n8DN4&t;ucLK6U}AG1CH diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Next.imageset/ic_musicnext.pdf b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Next.imageset/ic_musicnext.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fe01ad1d5541af9e711663cc7eb1f26b42296c8b GIT binary patch literal 4180 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderRandom.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderRandom.imageset/Contents.json index a76057444b..7ad9a33dde 100644 --- a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderRandom.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderRandom.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "MusicPlayerControlShuffle@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "MusicPlayerControlShuffle@3x.png", - "scale" : "3x" + "filename" : "ic_musicshuffle.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderRandom.imageset/MusicPlayerControlShuffle@2x.png b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderRandom.imageset/MusicPlayerControlShuffle@2x.png deleted file mode 100644 index 4516f9ff66ee2037b9c2cfddde4df7be83d3f46a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 549 zcmV+=0^0qFP)D%stx7DCk#SJxLXdK zg!0f1d}|t%i>@FcT&){yP+ssyI2c**5Xwalkrs{$fH6>B@svA3PK8*p)@Wb8{8@=7K;IWKxxg)ZV7$e^xE{LJ0>E z5tb=0-a!c~5EPcEEIvZ%U@Jo7zg8c9V!{^Sf%xnQBEwlRa1ZSe5T?{tvlI0K83}Mr ze0LFX+&Db#Lt=Q~FEBzNP0{~k>d0B#i?v&F!CPy@QcVYm4GQxtbH zq0%^{;ZG3AIl#8At2V5yIWNk^rfli$)aoL>CzC0sZwc zSMXrF>=mC4*vFeA@Y3(>{`u0Y1a_bUR9&FQ#I3%$*&Bo`&>7w_ z=$3U+T5D-qLc`-E+pR6nObF_rndUV*!u*WU#l>r)yjb4Mt00000NkvXXu0mjfV#wi| diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderRandom.imageset/ic_musicshuffle.pdf b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderRandom.imageset/ic_musicshuffle.pdf new file mode 100644 index 0000000000000000000000000000000000000000..8577c2444e9380deec39080b1ad4b12b3c1f45a7 GIT binary patch literal 4572 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 CZsPO+ literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderReverse.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderReverse.imageset/Contents.json index f840cc796b..92240b91b6 100644 --- a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderReverse.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderReverse.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "MusicPlayerControlReverse@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "MusicPlayerControlReverse@3x.png", - "scale" : "3x" + "filename" : "ic_musicflipover.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderReverse.imageset/MusicPlayerControlReverse@2x.png b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/OrderReverse.imageset/MusicPlayerControlReverse@2x.png deleted file mode 100644 index ba2550c1e6673b5b10a2317b70645d76273f15b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 316 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 lKVxL$sgQl(G?&wTf9paskcSmy9TC_7l;A1} z@(X5WVqi=?@%g{x-l-SE)PbTiJY5_^Dj1UzM3x9}7;tC?a)`8d2`+Z)kxCQ_>thL; z%h{PMwa{>{3~PwlL!slDEvc4LGkUybmJ7an;pJV>`Pf8BCN@)3uW*jrlEvD(hgJJ7 zcNFn7#LHY*Co9azaKM4%^ZQ+D5moZch724mOpOi-0;rUKhr&jdh3Y4K9lvm0iWXo< euhL=?>``H_dsxn~^0BEs$V;BCelF{r5}E+%{7!}d diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Pause.imageset/ic_musicpause.pdf b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Pause.imageset/ic_musicpause.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2054e2ce4693a0eb1f300e9484a58c860ba7412f GIT binary patch literal 3970 zcmai1c{o&k8@5bg2$dyLPO>Co#>`+U`!Yz4C9-SA48}GZJ6W@2%bqACvSumD7P6CG zlWeJw7_vvQCf`iU_x8Sh*Y%z2TyuVN|DN-l=XXEPANMVyr>=PlDg^_Jv{F_mbNQd| zzHDs=!vP3D#5#b_o&}_J@h*1m_5gwk8359n1SfYqiTZTHxZ~CFHbfjAP*eoFxs&i1 zXRtTDM!X6*6vC#luFz&pZhm;)aD>ca@fSV#8slkTRB%enSfdlI8n7}O&T=?W+3$f? zjf9!z`kbMP?~12}kK|_Pp&6YjM7AqWl=Z8co5Hm8B z_by^4EvL;P$NlUyq~r)kiB%L$9S?&(PlUzMSFUkM&t2oAMspLTIV9x_ijvZ0U%C2p zb}C%({lqu39W1z2`aXKvF|Oc@@9r9yT_Uh*#q{}fG3cNtpWRi+4n4byo(>rAg8O+Q z>WW4L?ew%K6p5s5(v~v6adgqg6%R=3VeG#DlJG9>0PF`}26#832gwHS2FU&Z)QB$b z)O|OA#<2m7yPx@J`@cBXBN1&3@$P^*HL1ELUy% z4*B15{OlX@dzADAYC+N}wBET;8wW_M<2?yBcmtH`|8Hr=O|OfF!#ok>db#?S2ZR8T zReoO<;MEx|ZjgSYc90%Jc&MnS`W{WL{o=;Bi_hp$5kfW^T&&kZutO{>oO{s-a=KCI6vXI=!zUpk{Xy`XG3=3D@FWlf{99-L2~khdAlk zP3WJE+uDLq8|n=GU+Wdp(h9WNE7lgJf^c2Ur7vEy!3IiQ;ax3yF zi9LD~X`e~woo6>01&Y+h=ItN4MWB4_wB1^+Fx)Cugd}WSWjS%|DQ?=b>8@HoJYK zq9MhIuF`q0GG+V$dI_Lg*+W-3dgt@ea3`z8)(>oAtkLuHPHyyBj#3gI<+igzh|e3t zk?U#Qi`&L$@_3bkk85+o@EVl7{JeAOFJ7>*r;>3y>zun2&ya+_x>_XfWIf|u4*O`N z|1p^*G}68<>};?}yc7-`8aOZ>ct}=^i7z0-k;~r0n$ABAsaLJd)JasJQ#;Nm?4sn$ z;6G>12?cjHJhd-LD07RG@%=WvCCF+K_dW1CuJ zJZGZv=1b9nLnp5lWvl5atR8pguVuEpwsn{3B>>;ML+>BD{}w|ZX5VYNCqcvIX9Sp0 z&E4}4)VDEUw_d&olp!$%7j0>U^RK+nA zQx`PXvTs~;+573qQLd#BjwZKH*sI4Hz<~mRN5|p>+Z)B=SVzh7diQv zreMLvDEp}0H`rI;(r;39t2V<7 zU9ax1<1dX$f~9^=o#-k_Do$`rnM?H(K_?HTdZk)RWrCxoS+C$_$d|74fZxeE^ojL`0mFf#ni>beTGlf zkSEA*Wy=UwyHCYaHcz^oyqY4EVw*yr5?7>aL>%B6$S86yLia-)L>({=!w%a6QpK_4 ze6m+2Il~&hJNY$Yw!Ajdw|dLrOUtanY!ZJue*-@szY%{bydA-p?vmb>PD!7JcU0P& zu|5WwQOu?vTR~FN7GGSn6{(0uW|x#MubnHKA?MZ77pMgm*+e`}%8l&l7c_{sa5x zK8{!SEXPbRiTQ~=?9@U56*V=+Y59GtD&yeTBjA) z`Kl8Y9m{i$$4j#d)uu6kIDqMdxaxP+G z{sVYoQ3_^pvts@Y=`p3Sn_L=i-DG;@o|pR7EgR}j6-4kx6wsp5|eAE4+6(f9G&BdlP=vyx;}Sp2Ow+_ULJN0p5Ma1HX#-r*-OF(OD*2kT=24N zsvZB*Fc;?xIBN}m>elRz#UCDXi5l(KzpG!~aM`|MX{uedMpb{j{#1`SyHlGJx6{Ii zZAFR0+f*T|-Y?kh4^bb`BJUFC#!US$ZH~NH3tgzczjlAy>%Awl*SnFK+Rr9wSW~Ov zm!Eo8ju zcstZM<{a2ZAIsRrqp=Adt>pwVDhzeM zqdCrF;7tFJT!CD&Y;$a4`@@MV9mJjYU)1~#7SHIxa%wg}^2dw8p=;6L| z8=2)5u%g-?wj3SF8*%!QyJBtS5M~}PIoHp)R_xrID7n$F$A5aua$9jb4WAxswMX3hA zU8{ErGybDHy-bB1R!T2?<#+6NZ00BKiGk54GmDf;b_O;3r*HxCU zE8e2cwo_y4p`W+^)Xy{(`du{3LS=plUYdTTVN{W;t)`}mal_*Pnt(L`EPsX2MD#CB z{I|w-1EkO6aRiJi(Hk&_P(x&C_ji%(K~>&RK>8d3=SCIJG>J~l_M1S4(!&3lQ4Qmc zaU$CNkne6kb^G74918vU#tCPP4cZVe#*^F#L>B-Gk%Gdd5P-!ARS$v_4uHyQ%0OTi z;()#fhUD%GP<8uvsqgJB{_8Z*UzXv7`e_*m6bXeu;83Ux0)a4tK*Xr`-;uvnN%aCa z4;!lI`d$guf~irhmOHfsb()a>o|6imC*pqp|9Ab~B)lyc0zhG4$bTKf z<^ISAgVFf-=Qm(5**`HjjOwg@#krF(1SdS{yRkJS_)__!+9CrYkvcWB$)FOc?P5!$ zj?j;_I(3N7;$<)x2wWBik%!Ae;dm?t4@JTd2wNK{R-U?+R|Nn6kRLK$DS$m5YHzgh3>b!-bL2p*56Yg#v>FQ-EQB;0d47y$??q z&c6L!%0}Lw;m5&yf2Vt$2+~UUyHVzQJCDHuhGGV0n;Xm$4^&H6&kKpY`k_Vcuc!`WnMG#@Xqz2aZOTznWdj@Egcn7RkP${u<+( z`K1ifajzN7&R8|{0@eRt!+gX3HN&^_Rt+$o)YUK~un&kpDePEFnKX3&_&f zV!d&j>A<~djNh(?1vC7%dggrY@^-5r%>y58S5)rHIC4E?w${VhF*&-WD~?sZ>3r{Y z_Ct*1{l!ra58CeI-@4fC$4QO4vbifg>%M$BuLrcAJK^{nCW{5HJ8rUWC@*7-nGt(C zYexNnZxG1`9XCU5z^eYgVY*?z8|Y?;CJ@(hH$&b^=JP<7$!-R-vw97@K+_HbO-m?a zyz?TlEO*5u_78Q_Z<;RqWzpas`d9u<|E{jtu?)|{LsuutCxD`Z$ABFeFRNQ@{xa?8 XdA){1BjPJCIWTy-`njxgN@xNAPlf-H diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Play.imageset/MusicPlayerControlPlay@3x.png b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Play.imageset/MusicPlayerControlPlay@3x.png deleted file mode 100644 index db259c519aac550dfd8d98961edf6b93d7d01a8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 704 zcmeAS@N?(olHy`uVBq!ia0vp^Eg;On1|$PrnwK*$FtvNSIEGX(zP-!5A|jWe{p0Vu z{>ig8O}Bg&c~k21rx|NCrGsbXD!)B;^d?X8ob&&#zkjp(^Y81E?+VXr{+_#H)vNax zBpUY5Zq3LsI6W(N#dHBT4&@fXLmY`M22K)+Js|Fp7aMeAc(xyIGcdeT&=MiBN`HfW z509y&qFSr@!e3nahgTU`eEBH&s9?pu$?S=7KeWGG6ns>;qHaQQV$O?ZWtXp$_i(>H z)REBg;z4DE&_72HZ;$~GlThnG8vRJ?Wqk+zcMxMAfQ@e%E#_Y8z-D!HidG^an?!41)74PUK z)W*c(9a8UF vZ4-Rp7Y$#ANM0-pspzegCM{nEtF--T>i@a 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 literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Previous.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Previous.imageset/Contents.json index cfbea176c4..83009540a1 100644 --- a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Previous.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Previous.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "MusicPlayerControlBack@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "MusicPlayerControlBack@3x.png", - "scale" : "3x" + "filename" : "ic_musicprevious.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Previous.imageset/MusicPlayerControlBack@2x.png b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Previous.imageset/MusicPlayerControlBack@2x.png deleted file mode 100644 index 1b2acef78010166677642fe311461ce96a93974d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 683 zcmeAS@N?(olHy`uVBq!ia0vp^5g^RL1|$oo8kjIJFco>aIEGX(zB$+k6k}*u@OP#7 zN+u8!$hoSnx|(q%R@I#r&<*bM@LVMjFaLE940b}glIH1iMk{# zNMPtb#E{5gGF@T&!kM4H9p~F{RQdk7;%EE*Fg!T;(Y|K)Bese@ev9U1>-*Uw4uo#` zwyc0Z`N*>S77c3anzMg2-UxZf5>+m~q3OmU%{O1>9uZ37-hN@0^dsd*@)a{{LL)) zRs)G0{l|YaH)!2X3qQ7tuU zPv5(_)Y}y(4^vZ}8ve8KcSV!cZZAx^^yzw{XZ2#gozsiGwE1-T1HNYlPBV5aPM`k% zzB$2 z;V16NT;C19$w#d3c5QBaE&V`N>wn|c-97Kwn6FR&aJ4?+ZB<3f);9Ka>$_)5`~+%J z++!}WV_&At;a&d^+?soI)4>B@c|V@aP58dXJ7E1etM10LoBiZ>6kJO+sXD$P!=Rv+ zd5>$V!G`2(FPX*9?c$mJ`k~@A9=3Ix^Z1mT8)G;5$w!>t^@(|RdhDkv@8$eC^Gbgm zXx*&0Sk$~({Dy%<#0jg~gwJa(v+K<%m0Y{W`*zA*flH$2c4-?}+rB==amINcQ{?up z14309f8QQ<+z}(*e(~u2Zx0+mNiAW*{;#(CK*ILV+SzU#Ciu%><-o5Gj{O0c6-*@ik|Nj2>{@hRY z-}gR0qXRS%74#{UE3H?~S32H)yIXo<|HM>n^(xtE+!NC$`r2)n;$J1(Ry>h?;`@oI z?q+|h3ynWnZu;Z>>)WHEC$%X*=fAjm{^yCuC)S_Xq*P@(E4o}cUfEl*%Cx}t?Ao9& zv+CXK{EJu1?2S5mqUy^lGv(J8vxUMx-H{UA`)tNUe;{KfXWElhGbX-X9DZCfvLjA5 zJw>r<>+FfGFSgci|8(b8{g*6DW$ufsANT0EtnV}4B(T@&+zF>IuPl_gGjC=8H~y43 zE82Kzs=jeiZPYg-OI?eRVTKZw^;L2>MrJqiTC^}B#chnJmKH|y75Gv zMGU{ow{s7x6gFi~%;&qoJTcbP`oEa|vUjGnhM{ksUj2G`+4^{W;%=Y0;-epb{yb2h z@!m5bdyR}s7l)@UoA+w!%$48yw~M<^yghOH#PEs9dzUey#vB8~AGV}ja&@)4U)=@C Nc)I$ztaD0e0sx-=85#fp diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Previous.imageset/ic_musicprevious.pdf b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Previous.imageset/ic_musicprevious.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5ff206330952fe1caf42c05f2b9751047a272d83 GIT binary patch literal 4237 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 YenRL)rlaxWKoAOYFfat7h1CZCAB+hxy8r+H literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Repeat.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Repeat.imageset/Contents.json index 211465d7b5..3439cb66ea 100644 --- a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Repeat.imageset/Contents.json +++ b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Repeat.imageset/Contents.json @@ -2,17 +2,7 @@ "images" : [ { "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "MusicPlayerControlRepeat@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "MusicPlayerControlRepeat@3x.png", - "scale" : "3x" + "filename" : "ic_musicrepeat.pdf" } ], "info" : { diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Repeat.imageset/MusicPlayerControlRepeat@2x.png b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Repeat.imageset/MusicPlayerControlRepeat@2x.png deleted file mode 100644 index cf02cc72dade6d5536cef60e5b58fcdc0907d2df..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 391 zcmV;20eJq2P)_RIz zy4Db+VLI|S{Gb4Cp|SH13Z!5XazRtoF&b;J+aO0EVO&NXC@v4CAPr)%56G$XkQX2} zd4~ds+BArd4BW?IgIt1y@es`swOUAnxI98b3zjJZ3y>d*8V_+vM*|DC{yEx0Rhu9# zw?U>IGz%+H5UN`WaajX1DvcxP0?n1eMr=V@BukboPHK&LXbW8p#{ig7A^d>gFG@jm zm2nh;(=em<5FZVos=@dUG5Mf#ATH@B3`Ld0UI<|7LAxUr;&Kd%>V?mc5ME)4L001e z#77DmBWishHktrMjfB|XGx|Vrd9fN+EiJQPkw>t!+E>_Z1Y0e&$&1*#*hwHZ7V!Z>O3C7`#JI9! zE;AVr|I?l`A9Fc>4uPkVNkboeONgTjp8UiTOCLPpz)&Cj9CO0vk*ffq!Exf~!TxbVUcQ5-q%Q^X9JCIN0^Qb~ls! zfl+UtdzoDu68n6S$Km`m-KpQ(ua;sRzE$Q=4 zpO;>G>1kA|sT;-3LzbO6glr|i3mdt`@={V&cKQK}@)Zm@q$O45q$~N4liSR1hJ$J{ zSf?v_kCF%M{|rUd(4U!=Tv2L^8K=8pu>4&+nO!FYqR#2DQ#wkI{zrF+m7=GjLmDea z3+LmmvYiK_16OtD5k4MnUW1nV+Dk}opBGk}g+91!Z!aN>l|J}cZyed^{Gr=?s&Vcc X1%#lk=w|kH00000NkvXXu0mjf8~(tj diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Repeat.imageset/ic_musicrepeat.pdf b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Repeat.imageset/ic_musicrepeat.pdf new file mode 100644 index 0000000000000000000000000000000000000000..fdf35e62846b0ef577dab583aadadf117fd086ed GIT binary patch literal 4426 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 diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/RepeatOne.imageset/MusicPlayerControlRepeatOne@3x.png b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/RepeatOne.imageset/MusicPlayerControlRepeatOne@3x.png deleted file mode 100644 index 8aed4cde1cc295e7b0ba53522b6a38e57d823b72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 515 zcmV+e0{s1nP)0)-CUgzl}Yi;G|f5yuD}y1Ntvaq<;(5sF(Kb;%Rx6LePu2Pw2mkrZ4@ z1_iwijWN~Qc$0I}g8A=~;pET9$-U>C3yakbPbd_x=00Il_+w;|bKX&=f$s5e{t&m$ zLjYqKX!3ze%5$T(c|oCg<~kc7#gN@OQTr$qH>`4)6_7&Fq4X<|&jCQTK#BqNnNgdp z1y30RDc)#PoD&}dWYff@$M}bFn)S#=GN1;1QIN0YQ`H5sI5Pw@SuI^4vp7CAJ)nkB z9PK@1Pwky94wc28vS!5K1S^9&6a(Z&vSSI>p^INDbqr81v~V)&WidcsWw0UybQRO> zV}QKC#uI2AcZ{_1JQL_B06G!?TEUiRiCY}AMXp@Aav6|VfhmX-Jh2k&;BhYiB+{hH zTn092RSBE;IJwC#!_X#uo$qY(#rUtHbvgn3RZW4n!gKq@nhYxkgW$m47*Me*g?T@h)N4pdSDL002ovPDHLk FV1fcO-^2g_ diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/RepeatOne.imageset/ic_musicrepeatone.pdf b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/RepeatOne.imageset/ic_musicrepeatone.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a201422b5d57864c24a9aede9d5c5cf83883770f GIT binary patch literal 4641 zcmai22{=@3`?rj26_q7RHHksQjG4h?Uxz4bvNJQrzGWsv)+}LUUkh2XZ#Bx+*w^x! zBqSj*WRFBhzR~i3d%yR8UEjIRHRqY%bD!V2&vWkkzJB*3q_3`d0U`lq5$d3E#R3C@fgWgQ7I}G~q%PLo0q+QeQz1j3q^6TA9_vNDx}xw{bu7li4hvLNWWnLR zuqZbcUs|hVi)gIOVU2yVhLa>?Go-|^kQn@ z>{?PxeaDw$^Y194F}i$JYsk!`DW9!7#D^N(S?9d{Hj3Tkbw+A#J7`SY%WId(L7 zJ)xaZZ!{pX@&tuBCweX`5^Bsy2v;TWZOgNJ;LbaYYnr4#cM}f2@#O8xY{5_WM7JaO z?m(WhGK=VsLwe0oCdbRKi@xs|6QJOyohyg@v{2l4G5~sP@vNbLJ=zP2dv0lr=B(dd z#+7mvt;lU_Ma`_1?Y$qQ+$SZiAIlw3JacR7mSO`leDjIyS+gWB5v=lwwiIzbBt9yh zUN40!?udlKMfWe)b>j$9JDJd8p3~{X4R$s~DT3xO!*f>-mvkAqE;F`K*8AlgniVr# z-d0mH{>+!GJZD04YJl{Y^X<;>Oz`0H_Qn}NA?>@}hKXr)CaIBgk4xplC3JM;gE7G^ zbE=L{tONLAif3}McViwa*@An8!_L9zhVvwD3t(n&5@ImVSH>Nd-ltdZb`inE5chh< zPxeRyu#vBf`V^v@X5E?puWAOlL5>AVDH*_-|3Kt%e8S%KE@fNK*^qc^`6F^wYb*Pv z5n5GbegE@muSW|++iJ@*#MB?xF3~Ew0@)+Yy0uQf8~Fn0q{a2FY+v&h)lAG*FaRuj zb&Vq4^wh%~PKv%%r+L_R=wX{_U`u~bl9Qa2rFU$hgIhszdVJQJyd~ZzwPnZLVX~eH zK3@%hWcb#l(uExq;E28< zQI=68F8Ev_Nwg0X=pe$SO6T0`K)6^XVVtY&$lwY2@a*D8Wq|TY{XTPvSKcedVTmj9 z*%4Sb6^5w-iq(=Ev@{~Jp6s+dd%Hf{0y)^jFY<9>HzkYiigXU(50dlXDk}p%m^>It{gJ}PH$AaHNqv;Vk6$mWJ01xAna+k-oW~6>3>F8J{t2jg zxZ|nwIN(7EFg!@@UwjAize|F?mj}iOiw9azN!2xhRzOKL4_6N_BTp0t3p}V9YB&f` z<`=;q9I}6K{3i@1dS*bq8Mx$JjWReW& z<#7R^&<3v`Gw_w17AL?UN;_DeE+P!%tp) zHBi@}j1yd#S1aJ3Co=cC%_c|ZYDY#LRs%*FX!O5@0^0DVw85}kQ;wCzR?FijUUY2H zon)syYD(KOWp58aepRP?{f(rMkx{JGMciDG2)1h+6K~cB;fD8v5(H$_1P{@$Xbefq z2ZFdMbje1Av3oO$Asky{^ez};aSJ+=F!R1fkt}@J$}1a*Fa0;Y!yPb*`(`Ixg?2;W>e7o z-YH^J%2k>gw?oR5sdBwlAk8`hP0hsp&!;0?trI&w92RDcSz2<%(dM{Fh<%jV%?b5* z-W-A0%6PG|Ya&<3trT)jn-hxFpcEDr>Ztei9X^^yw%glc-=A(lIQ`YzE`C3!g?lah z<5h!?$;@F>$DkrJQQfu&e03H zEBVm{ELyNbSbCbCIaVZ8;o_wHzR&HPVYQ5QpVCzkFq+*w9B1bxlqb%UKN;rQN_RY- z5&wV%79s(r6SqCW9}M-Rp8(Q?1#7X>r_xJk(K#st9;+z6phfK z;7X{p=OIhLwU#5EtcQb<$}ADBI$+v~5GSV4Pwbp|Dy8vU1#B6r!|Z(KOgGh3^kq5d zJJq7%*%OtwUxJEHp1)n1tER88aSqShz+`oM=KSMJMuFudPip)i&pXBP|nT|9gOrcFs!{|%kp>#~Ti7xl7v^_gC zWIOaBdgxK1sc^ZHH?#Dyd$AWfOl;$9EvnNV(Z4}0$?+fUZsGaB?-^Kk(o)JDUJ0mW z8zD3XFSZ|<0g`dJpAwD-e)CRWw3N_?;NJt_y65>9? zX6wn*Q<`v8te>mMmdiu6f`57ErOo6yac|rjZwMRTAUl5+lUGczmK z9Daakm+!fifAik97^^~zX-pQ^IG2t1vbfQOMe#FcqGk-HZZ!+lJMC{fGF_}N0o@VK z(->lZ;rQ&6ijoVH-p$Jaa+y}u<6Mnb8p)eSHwAV9bSD=j&GC|1t?#5&T}!xDRhzhlUUgnA zQoN`br5LMtqRG3dEI{%rYL9NuduROf$fvoTkzGB2ETEkEBTE556JWxq$STEroZ$wb zy_L4LG4zb&D;q(}*Iaa}-_*Rr<(c7!tvGjZCndyT<)EdTbys}@eSH8I&>HG$9gSLX zJ+FF@F|k}aTt1q;$WDzRyC3iUia$mALfQ>j|ag1-UZbrq%5F`O|!7PEE4!N1bRZq3Bj_*wp(_03%6_k-Ld= zU1D>wYgS*e-x2_6VUNQG)YCewqA=Q(+ML?cbb2aJ-rsm^vmP>2k{q9$FA6OgDEZ4N ztmbRYpsElmx?0Q%svt~~Y=`B8)f%2V4Xs=~k*7S6peuqivu{kl`(5{o7D4cy&}}nT zqVwYk2P8J2Ey&(J~teiyuU|$YlW}49IXf+uCyGhzv5%n z+A#H{X)(?X=%zLL>4oNtSS;V9d-TL>g9irHO}382)!8o9dR2od(uIDDqpqE!MXfx~4 zmzD3WDky#HdF!=}*Or=0P!`v1*_`6+;%cOdACoRsIU|RP777+Zc;hl>Nelk9%UN%` z$3~hb-GT;bW9d5?6;E^UKMU&F(s!v)aqC3An<{T7FXk;YG&=;@1gS4;ttF6=;mC*G zZE-h-{-OxhwiUuRHtW*7`E-2mGzqLWw%*Z4@chDgx^mE?7 zhsf~>TvzQ1UyF(2j=Xpcuh>vC^D3*dx^m)0NLrQkTD@1v7-{$0)wD8)N`#eMKvn>0 zIbtt%_;h1-s?AcM)BKZFH`2T(aW8ec;%*Z|z}$}2uH?jKLjdLOeik2n%%PnXi6;Mj z>vszC0TX)zj3sQ=N_~E^dyadUrRh9j7QOS?rAifhLtjViOGq0_4@PXs#5)dg5p`;k z`zhO1dhHD460(?PjphQf0!b!p6UO}>ZFGKmK}Z{%4sRCy{&Xv4pe!fQXP4xF?(O*G zGO(DTbZMfv39&Q0={9Hgac0oRX|=E@dZMgJX)|OmcNeqKoiM+o_f;~K`^d?3-OY<~!3$btDk8P!mD zl&gosPx+4frQ83O2{_PFMD>P~s~r#`t0@JB zT8aV}vpBNY{MSZRR!VuEbZswmD1T6h;KH2}r zj=CWKeJ@lN_AfptLiS(Jg@K{}#vov7p#Am*?}c)5#d`hNcQJDEqplydEi&}*phnF> zWKb7U+uh!S8bUwE>eL{TN5ipbu#7ZX3L*=`pzOgY4BQ@!1NY| z1f)n2E|D%GV5BO&2uQj7!K?rEe)n7Jn>8zQvd^A(ojLRFwVpk~hU%K&;{o=k$C+BXT0>cPHY8p#3?}XL_+3dXll-LeGV(dc(~z0CIRcBEmHczjY%)A) zl{~hBT7R6h=g3(aQhs~%GLJzXdRC!D$+o#!*V5$RA{+D+i`Iz}1x_;bvwjJdkCy{4 zHeO~mAR?DNP=LPelM)&lwWRXACp7@zR1Tg#R~}Ph#2?D+nP}PJex7Wo&6B5JZrEv~ z!()AqPTaGWQCR}?k;ot~am6e?-P}RA$XgLyb@JKKAvG2Kc@;GlhC<&yzBl7|H-dx! z)`*ydT6orTwp5g1VPPwDj#(w$;^WIRHw$O@m4f?X&6t#a)r^f@YrcQTu6h1b(6#QYPX%llNIs2Wyl}Zf zxw(ht8YkNsjh0(_ep{>F<`>WAGu`>s(I6qKG4;i#*3ap8X~FW?5+V?(P{ zFHmDVA7@>%i}ND7w$F6uiwbsFbgokyP7Y2UhdnR2x`aW)JgDXRg*X*gBq|~qL1u97 zcTr5_U=~YBY)}!^v1JTiihow|VRy!y|D-i{%_-}8Cib@7nZP4wDn{TJpZXr1)8i%s zDsBec_(pm4&h^eS(WClVF~yQ&61P_@u9Ax7wMoV4I^WC>QXUZMq9brB1q1YQ4f#&x zn(v2ZV|&sTFuMFX)}w5!2qa>2%)Y{}D_m?835X3JO_VC)YkE?hA6rhvMI=tiO_0Y{ z>#aK4>Q@tTa+1m@rm&D4j<%KtWU2XbwE#r@^LAVP%5cbsCtMz2oTtN2o6$!5?%cQJ z{#6zN-=Ewc%KT_o`tgg$c@hEGUnVxj5xjixSR4V6{VRa<@+8vc3BbPb zjrR@xQ*VF%S0NbUy|5-YB49}qRo4Wp0coU{yBFTX8-v9G`;~$uKmoa*0>5d<|EBS? zm=u0wN$b-VB(1t%P@c4E0;JV(zAjjtF-q-!*ICwWKU0$-?i-X^x!QL}1OeeSzCaeB z=YrNTkWsXDs3AjCgov;D0ZlGWaWe;f%L)XLY2U%7)3|ktE)HNnY;@nsk zOAxE0nY*p%v7zY~gF{Y>q`_)B!<}$YBhj2b6rO9&wJ_UYb>wJA^9I9l4th3o`qxxP zM-XaLouO~1Rxu-^NUNn{eL*VJp=MaJ-cW=vuoprWltT&~qyua8%U%o?;hAJeF{yaN zE3*fByOt_069tvw&SlAaEI8g==DuDyb+)EGJxydHmk-^=`wE^NS7SJuDNN0e1Laz! z3x9ITzs7{CHPz0fo7@oV?cKbqM+f1`u(_fFWR>^t`!V_BNbz6g8810ea zOr9?hn4d=vOgVqA9~wIuY_hA^7Px(RS!9lqts0k&9&?|2EM3b@w=QIH=R`$a>Sel0 zkAo_c)W-&k0Nu&~y2{bJt0$w}ZIYTlvx**yottwf(C4^Got=@}&I$K=TOXyck*___AwYvW3r&IKv%u9la(!v;;_5Hu{Zu&!R3$kCds=wuX&auXD%Dfq_9Lp zJJ&>B3^PxZasWq!^ixBQ%Zf7b24}f(Is4esks=igtF)QgycFq>XBdS%l>-?_vz8oC za9iCg=Mr)mAweea&*`mGhpb{esd}n{CR6LI2@ZJSJW1aCu?Y7Dh9ikg#Cu?Pm=uIT z((bT8D9oF26rhU;)#6~h%_ybC;GzP0s;cy!4y+1&Pw#u()tjy_EbtvjKU~)PpcUxK z>%-oMSVK`N;HU;&2>oc73v>7q$FV%shl$+x*)!AzIQT7?1CXkQ@?4B>kkN@8Nh;sp zi4+}|xc)E~X{fk%hR9dVY<+#}9@9GjesGtb6v3I!(2F_zp6+?*Q27M`W>jOxCw2d0 zcbRxz4^wrjxRuymH1bgSm*^xTZ5xxBRoa*tyEV<3`Iptz63vC^IZwNh1@AKyYh)&} z-RFN9uSLE(!FcdSE++jrcMI?M4RjpU-V8HfuLJ2%$EKU<@l44&a=^mAhd;3Ie^OvB z`dHbQMV9kU{JCZ`y97JS^0X(6?=f>11lU?%^L`fa4z4MLyl5&dK??ID5^l2DR!W9g;LE z8J4!1Hr`&6{D|z9I-3?GY>+aT=9gwGl_P3z@&CjD%k$g(bZ>VoV)OJsukLL0m;#F|I?d+x=3H;wgm`zidjD zEqrfc=f>Ca>gd3#E!S^NUlqS5^JVhY@$vFq=1YUOAb2x9GutyKGpFILmChE2o`EbT zEvBE@KvFXnI!zsgD`FLLOG@Vp&vh%^A9;*_eDP_RK@_qi%_Oi~I{M z^4RBBW0sZ1Ek(+sv$T`6ul?S+alXgCdC{6H)`27-V=SrY9dJeoU=33s;=d@ zaVF6q(I>syg=1OhF7d9zUHOMtd6szk&K<{hU!_(F;K@=BQgOEa-no63hf~KbX16*o z4aQIVHhVOWyjL9Bt=c}zuFFnF#kQstCQtKG4%ysHE4xCzQuZQg!+z0qu~6x}QnXUM z($PBKx<@4GP0TLCuJ6{!>fqA!*5I}QNFMZ5 zm)lRX9rZ?|A9YD1NFz-{H_coUT`{2-Rf!0*3nq)Qte~f;|vC>&p!D)wOt9DC{9UC$rpzecNhQR5>dHX*{ddu zi77v84O0}Ym2QIPLy*;PUHTU;AI($gChLh2(2h0fxBk@orWGf2NBBDWP=)K$Q705G z=dDpE=hWIn=7eX*iT2g@?O=o>!q3O4&iBu#od(2$8(T@_K&jR6OMO4+iC88g~vbkC@~&d#}FajHe_rJ517_FR`GoBJF0WA5`Kjuj=Y!)byx z-QVmxKF54E5dN4nJBB7*`99LQ9x-40VEw_i-zQ&YzmFqds#nc3?9nzu?@B*emrQo9 zA%o7 zC|4wxBHI|B)beEfYOB}or*FuhqmRBA!t!5kg5*ytEPrm@Jhhn3dT}TqhV<}@=x)yX z^LG|87P$i-2cn%=+bJA2pG;?^@VE8aTkQpjD$?%q+z@e5v2 zYl&Qrjpn&={t8j4x^ki?tF*jyv?DC7%x3u|zIeEHd*^c6Bd1aY>kFhTQtf=yZv4Q> zn(W)QbHOfOo-KORe(|o@y**xXtL^}4ddqrSdUU;-G;K0=AdJ7?b_VEK|4ytO{avYDx~yY>i05( zrUR5>%2~}y&9A5u6eaF^+(_V)wKq#0acRBdk@ez#KHo^~ev}jJw_WRG-`>3B);*h{ ztTS3vr?54!?lJ8!GtukkvRF_UGy14bc|B}5cN@FbO8zouuxXH*6R+%djb&%WU&O<4 zYHTB7b^G7^yicJ&pjj3w^9y+Q`E@@=gIsMSQVm1EIRN_rYYbTbO4*0#UrhWrV-o=B zOE?D?jGC7}U*7G5!Sg<%)6{+gWaxhSKNXP}BF5dz=`VaI z{N(n(u^bBhd54$>25VpfnBnjQ7cWl$3Xy`sr4WFXn3|7^y8{4~*OY<4ti%B$9}J!t z2++9w2kQG1#eY2w^jFIurhZ-q0#$%QAaE#D1_6g#Kp>*D^Y6^xR!Qpx9DJ~}M)=1{ zXniq~*8dV|OHkhj`5&6J;3Y4I-~a!;et$g95exyKFfio*4?q@yfFS@!;AadbFHhU) z{R8m)6@$n@X)o=cF_^p&1g3zH M2MY^p7-)k350EN@F#rGn literal 0 HcmV?d00001 diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Shuffle.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Shuffle.imageset/Contents.json deleted file mode 100644 index a76057444b..0000000000 --- a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Shuffle.imageset/Contents.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "MusicPlayerControlShuffle@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "MusicPlayerControlShuffle@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Shuffle.imageset/MusicPlayerControlShuffle@2x.png b/submodules/TelegramUI/Images.xcassets/GlobalMusicPlayer/Shuffle.imageset/MusicPlayerControlShuffle@2x.png deleted file mode 100644 index 4516f9ff66ee2037b9c2cfddde4df7be83d3f46a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 549 zcmV+=0^0qFP)D%stx7DCk#SJxLXdK zg!0f1d}|t%i>@FcT&){yP+ssyI2c**5Xwalkrs{$fH6>B@svA3PK8*p)@Wb8{8@=7K;IWKxxg)ZV7$e^xE{LJ0>E z5tb=0-a!c~5EPcEEIvZ%U@Jo7zg8c9V!{^Sf%xnQBEwlRa1ZSe5T?{tvlI0K83}Mr ze0LFX+&Db#Lt=Q~FEBzNP0{~k>d0B#i?v&F!CPy@QcVYm4GQxtbH zq0%^{;ZG3AIl#8At2V5yIW5CLDv;R98Y=k>wLM%(YFdxOksyj_P{mM#0D(a8 zkq`nj6q@b<$9*hxn{-C8yK_&to1J-g;rQm}1ZCEs!?h~-;>#cLtAj6SbEOWx^asw> z!54gRsSdti#yw}>lecuX7R>2Uqd?FGBuIf8J?2|a+x8}jWk_=Gq9J*U=sZIU&>tUh z0e7a$p7EG~J-pZgul&aBpRc@vZx7l>#Q}Om)aaXUdYym)IzZh4di~9Jn~NAlUFy6O z-mxxBQk>Dua3!Z*Eka9|Fi*^c-z_40qu=Pt_45!7 zgH6*QWD%kDugS1?J@}`DV^oEnv`_jEHYUjYrDue zlFkat>!BNq4e6|?r7p#U=0HqncEyAh8TEP`8Kq7@{%z@e%tJ#|@o`Dr)yFhgZl00000NkvXXu0mjfa!=k6 diff --git a/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift b/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift index ae30637840..890ab1ff82 100644 --- a/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift +++ b/submodules/TelegramUI/TelegramUI/OverlayPlayerControllerNode.swift @@ -352,8 +352,10 @@ final class OverlayAudioPlayerControllerNode: ViewControllerTracingNode, UIGestu if let gestureRecognizers = view.gestureRecognizers, view != self.view { for gestureRecognizer in gestureRecognizers { if let panGestureRecognizer = gestureRecognizer as? UIPanGestureRecognizer, gestureRecognizer.isEnabled { - panGestureRecognizer.isEnabled = false - panGestureRecognizer.isEnabled = true + if panGestureRecognizer.state != .began { + panGestureRecognizer.isEnabled = false + panGestureRecognizer.isEnabled = true + } } } } diff --git a/submodules/TelegramUI/TelegramUI/OverlayPlayerControlsNode.swift b/submodules/TelegramUI/TelegramUI/OverlayPlayerControlsNode.swift index 5d15e61911..401e567312 100644 --- a/submodules/TelegramUI/TelegramUI/OverlayPlayerControlsNode.swift +++ b/submodules/TelegramUI/TelegramUI/OverlayPlayerControlsNode.swift @@ -21,16 +21,41 @@ private func generateBackground(theme: PresentationTheme) -> UIImage? { })?.stretchableImage(withLeftCapWidth: 10, topCapHeight: 10 + 8) } -private func generateShareIcon(theme: PresentationTheme) -> UIImage? { - return generateImage(CGSize(width: 19.0, height: 5.0), rotatedContext: { size, context in - context.clear(CGRect(origin: CGPoint(), size: size)) - context.setFillColor(theme.list.itemAccentColor.cgColor) - for i in 0 ..< 3 { - context.fillEllipse(in: CGRect(origin: CGPoint(x: CGFloat(i) * (5.0 + 2.0), y: 0.0), size: CGSize(width: 5.0, height: 5.0))) - } +private func generateCollapseIcon(theme: PresentationTheme) -> UIImage? { + return generateImage(CGSize(width: 38.0, height: 5.0), rotatedContext: { size, context in + let bounds = CGRect(origin: CGPoint(), size: size) + context.clear(bounds) + + let path = UIBezierPath(roundedRect: bounds, cornerRadius: 2.5) + context.setFillColor(theme.list.controlSecondaryColor.cgColor) + context.addPath(path.cgPath) + context.fillPath() }) } +private let digitsSet = CharacterSet(charactersIn: "0123456789") +private func timestampLabelWidthForDuration(_ timestamp: Double) -> CGFloat { + let text: String + if timestamp > 0 { + let timestamp = Int32(timestamp) + let hours = timestamp / (60 * 60) + let minutes = timestamp % (60 * 60) / 60 + let seconds = timestamp % 60 + if hours != 0 { + text = String(format: "%d:%02d:%02d", hours, minutes, seconds) + } else { + text = String(format: "%d:%02d", minutes, seconds) + } + } else { + text = "-:--" + } + + let convertedString = text.components(separatedBy: digitsSet).joined(separator: "8") + let string = NSAttributedString(string: convertedString, font: Font.regular(13.0), textColor: .black) + let size = string.boundingRect(with: CGSize(width: 200.0, height: 100.0), options: NSStringDrawingOptions.usesLineFragmentOrigin, context: nil).size + return size.width +} + private let titleFont = Font.semibold(17.0) private let descriptionFont = Font.regular(17.0) @@ -112,6 +137,7 @@ final class OverlayPlayerControlsNode: ASDisplayNode { private var scrubbingDisposable: Disposable? private var leftDurationLabelPushed = false private var rightDurationLabelPushed = false + private var currentDuration: Double = 0.0 private var validLayout: (width: CGFloat, leftInset: CGFloat, rightInset: CGFloat, maxHeight: CGFloat)? @@ -128,7 +154,7 @@ final class OverlayPlayerControlsNode: ASDisplayNode { self.collapseNode = HighlightableButtonNode() self.collapseNode.displaysAsynchronously = false - self.collapseNode.setImage(generateTintedImage(image: UIImage(bundleImageName: "GlobalMusicPlayer/CollapseArrow"), color: theme.list.controlSecondaryColor), for: []) + self.collapseNode.setImage(generateCollapseIcon(theme: theme), for: []) self.albumArtNode = TransformImageNode() @@ -141,9 +167,9 @@ final class OverlayPlayerControlsNode: ASDisplayNode { self.descriptionNode.displaysAsynchronously = false self.shareNode = HighlightableButtonNode() - self.shareNode.setImage(generateShareIcon(theme: theme), for: []) + self.shareNode.setImage(generateTintedImage(image: UIImage(bundleImageName: "GlobalMusicPlayer/Share"), color: theme.list.itemAccentColor), for: []) - self.scrubberNode = MediaPlayerScrubbingNode(content: .standard(lineHeight: 3.0, lineCap: .round, scrubberHandle: .circle, backgroundColor: theme.list.controlSecondaryColor, foregroundColor: theme.list.itemAccentColor)) + self.scrubberNode = MediaPlayerScrubbingNode(content: .standard(lineHeight: 3.0, lineCap: .round, scrubberHandle: .circle, backgroundColor: theme.list.controlSecondaryColor, foregroundColor: theme.list.itemAccentColor, bufferingColor: theme.list.itemAccentColor.withAlphaComponent(0.4))) self.leftDurationLabel = MediaPlayerTimeTextNode(textColor: theme.list.itemSecondaryTextColor) self.leftDurationLabel.displaysAsynchronously = false self.rightDurationLabel = MediaPlayerTimeTextNode(textColor: theme.list.itemSecondaryTextColor) @@ -264,6 +290,8 @@ final class OverlayPlayerControlsNode: ASDisplayNode { strongSelf.currentItemId = valueItemId strongSelf.scrubberNode.ignoreSeekId = nil } + + var rateButtonIsHidden = true strongSelf.shareNode.isHidden = false var displayData: SharedMediaPlaybackDisplayData? if let (_, valueOrLoading) = value, case let .state(value) = valueOrLoading { @@ -310,10 +338,22 @@ final class OverlayPlayerControlsNode: ASDisplayNode { } if let displayData = displayData, case let .music(_, _, _, long) = displayData, long { - strongSelf.rateButton.isHidden = false + strongSelf.scrubberNode.enableFineScrubbing = true + rateButtonIsHidden = false } else { - strongSelf.rateButton.isHidden = true + strongSelf.scrubberNode.enableFineScrubbing = false + rateButtonIsHidden = true } + + let duration = value.status.duration + if duration != strongSelf.currentDuration { + strongSelf.currentDuration = duration + if let layout = strongSelf.validLayout { + strongSelf.updateLayout(width: layout.0, leftInset: layout.1, rightInset: layout.2, maxHeight: layout.3, transition: .immediate) + } + } + + strongSelf.rateButton.isHidden = rateButtonIsHidden && strongSelf.currentDuration.isZero } else { strongSelf.playPauseButton.isEnabled = false strongSelf.backwardButton.isEnabled = false @@ -324,7 +364,7 @@ final class OverlayPlayerControlsNode: ASDisplayNode { if strongSelf.displayData != displayData { strongSelf.displayData = displayData - + if let (_, valueOrLoading) = value, case let .state(value) = valueOrLoading, let source = value.item.playbackData?.source { switch source { case let .telegramFile(fileReference): @@ -377,8 +417,8 @@ final class OverlayPlayerControlsNode: ASDisplayNode { self.theme = theme self.backgroundNode.image = generateBackground(theme: theme) - self.collapseNode.setImage(generateTintedImage(image: UIImage(bundleImageName: "GlobalMusicPlayer/CollapseArrow"), color: theme.list.controlSecondaryColor), for: []) - self.shareNode.setImage(generateShareIcon(theme: theme), for: []) + self.collapseNode.setImage(generateCollapseIcon(theme: theme), for: []) + self.shareNode.setImage(generateTintedImage(image: UIImage(bundleImageName: "GlobalMusicPlayer/Share"), color: theme.list.itemAccentColor), for: []) self.scrubberNode.updateColors(backgroundColor: theme.list.controlSecondaryColor, foregroundColor: theme.list.itemAccentColor) self.leftDurationLabel.textColor = theme.list.itemSecondaryTextColor self.rightDurationLabel.textColor = theme.list.itemSecondaryTextColor @@ -479,9 +519,9 @@ final class OverlayPlayerControlsNode: ASDisplayNode { private func updateRateButton(_ baseRate: AudioPlaybackRate) { switch baseRate { case .x2: - self.rateButton.setImage(PresentationResourcesRootController.navigationPlayerRateActiveIcon(self.theme), for: []) + self.rateButton.setImage(PresentationResourcesRootController.navigationPlayerMaximizedRateActiveIcon(self.theme), for: []) default: - self.rateButton.setImage(PresentationResourcesRootController.navigationPlayerRateInactiveIcon(self.theme), for: []) + self.rateButton.setImage(PresentationResourcesRootController.navigationPlayerMaximizedRateInactiveIcon(self.theme), for: []) } } @@ -506,7 +546,7 @@ final class OverlayPlayerControlsNode: ASDisplayNode { transition.updateFrame(node: self.collapseNode, frame: CGRect(origin: CGPoint(x: 0.0, y: 2.0), size: CGSize(width: width, height: 30.0))) let sideInset: CGFloat = 20.0 - let sideButtonsInset: CGFloat = sideInset + 30.0 + let sideButtonsInset: CGFloat = sideInset + 36.0 let infoVerticalOrigin: CGFloat = panelHeight - OverlayPlayerControlsNode.basePanelHeight + 36.0 @@ -598,7 +638,8 @@ final class OverlayPlayerControlsNode: ASDisplayNode { var rightLabelVerticalOffset: CGFloat = self.rightDurationLabelPushed ? 6.0 : 0.0 transition.updateFrame(node: self.rightDurationLabel, frame: CGRect(origin: CGPoint(x: width - sideInset - rightInset - 100.0, y: scrubberVerticalOrigin + 14.0 + rightLabelVerticalOffset), size: CGSize(width: 100.0, height: 20.0))) - transition.updateFrame(node: self.rateButton, frame: CGRect(origin: CGPoint(x: width - sideInset - rightInset - 100.0 + 24.0, y: scrubberVerticalOrigin + 10.0 + rightLabelVerticalOffset), size: CGSize(width: 24.0, height: 24.0))) + let rateRightOffset = timestampLabelWidthForDuration(self.currentDuration) + transition.updateFrame(node: self.rateButton, frame: CGRect(origin: CGPoint(x: width - sideInset - rightInset - rateRightOffset - 28.0, y: scrubberVerticalOrigin + 10.0 + rightLabelVerticalOffset), size: CGSize(width: 24.0, height: 24.0))) transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(x: 0.0, y: -8.0), size: CGSize(width: width, height: panelHeight + 8.0))) diff --git a/submodules/WalletUI/Sources/WalletQrScanScreen.swift b/submodules/WalletUI/Sources/WalletQrScanScreen.swift index 15f52fc4b1..a993224f56 100644 --- a/submodules/WalletUI/Sources/WalletQrScanScreen.swift +++ b/submodules/WalletUI/Sources/WalletQrScanScreen.swift @@ -297,9 +297,9 @@ private final class WalletQrScanScreenNode: ViewControllerTracingNode, UIScrollV if case .tablet = layout.deviceMetrics.type { if UIDevice.current.orientation == .landscapeLeft { - self.previewNode.transform = CATransform3DMakeRotation(CGFloat.pi / 2.0, 0.0, 0.0, 1.0) - } else if UIDevice.current.orientation == .landscapeRight { self.previewNode.transform = CATransform3DMakeRotation(-CGFloat.pi / 2.0, 0.0, 0.0, 1.0) + } else if UIDevice.current.orientation == .landscapeRight { + self.previewNode.transform = CATransform3DMakeRotation(CGFloat.pi / 2.0, 0.0, 0.0, 1.0) } else { self.previewNode.transform = CATransform3DIdentity } diff --git a/submodules/WalletUI/Sources/WalletQrViewScreen.swift b/submodules/WalletUI/Sources/WalletQrViewScreen.swift index c2dba3e0eb..8df02d1081 100644 --- a/submodules/WalletUI/Sources/WalletQrViewScreen.swift +++ b/submodules/WalletUI/Sources/WalletQrViewScreen.swift @@ -129,7 +129,7 @@ private final class WalletQrViewScreenNode: ViewControllerTracingNode { self.iconNode = AnimatedStickerNode() if let path = getAppBundle().path(forResource: "WalletIntroStatic", ofType: "tgs") { - self.iconNode.setup(account: context.account, resource: .localFile(path), width: 120, height: 120, mode: .direct) + self.iconNode.setup(account: context.account, resource: .localFile(path), width: 240, height: 240, mode: .direct) self.iconNode.visibility = true } From 5096007237c539212955a9e15f9d58b31ac814ad Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Fri, 4 Oct 2019 20:40:33 +0300 Subject: [PATCH 2/2] Don't play notification sound for non-scheduled incoming Saved Messages --- .../TelegramUI/TelegramUI/ApplicationContext.swift | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/submodules/TelegramUI/TelegramUI/ApplicationContext.swift b/submodules/TelegramUI/TelegramUI/ApplicationContext.swift index f08b8ca648..f69e40eaa6 100644 --- a/submodules/TelegramUI/TelegramUI/ApplicationContext.swift +++ b/submodules/TelegramUI/TelegramUI/ApplicationContext.swift @@ -402,11 +402,14 @@ final class AuthorizedApplicationContext { } }) if !isMuted { - if inAppNotificationSettings.playSounds { - serviceSoundManager.playIncomingMessageSound() - } - if inAppNotificationSettings.vibrate { - serviceSoundManager.playVibrationSound() + if firstMessage.id.peerId == context.account.peerId, !firstMessage.flags.contains(.WasScheduled) { + } else { + if inAppNotificationSettings.playSounds { + serviceSoundManager.playIncomingMessageSound() + } + if inAppNotificationSettings.vibrate { + serviceSoundManager.playVibrationSound() + } } } }