From 674465dd011d962b778e3489ec69f29c12736a42 Mon Sep 17 00:00:00 2001 From: overtake <> Date: Tue, 11 Sep 2018 17:27:53 +0100 Subject: [PATCH 1/2] no message --- TelegramUI/MultiplexedVideoNode.swift | 65 ++++++++++++++++++++ TelegramUI/SoftwareVideoThumbnailLayer.swift | 4 +- 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/TelegramUI/MultiplexedVideoNode.swift b/TelegramUI/MultiplexedVideoNode.swift index 931a4e9cba..c2cde9939e 100644 --- a/TelegramUI/MultiplexedVideoNode.swift +++ b/TelegramUI/MultiplexedVideoNode.swift @@ -58,6 +58,9 @@ final class MultiplexedVideoNode: UIScrollView, UIScrollViewDelegate { } private var displayItems: [VisibleVideoItem] = [] private var visibleThumbnailLayers: [MediaId: SoftwareVideoThumbnailLayer] = [:] + private var visibleProgressNodes: [MediaId: RadialStatusNode] = [:] + private var statusDisposable: [MediaId : MetaDisposable] = [:] + private var visibleLayers: [MediaId: (SoftwareVideoLayerFrameManager, SampleBufferLayer)] = [:] private var displayLink: CADisplayLink! @@ -139,6 +142,9 @@ final class MultiplexedVideoNode: UIScrollView, UIScrollViewDelegate { deinit { self.displayLink.invalidate() self.displayLink.isPaused = true + for(_, disposable) in statusDisposable { + disposable.dispose() + } } private func displayLinkEvent() { @@ -210,6 +216,65 @@ final class MultiplexedVideoNode: UIScrollView, UIScrollViewDelegate { self.visibleThumbnailLayers[item.fileReference.media.fileId] = thumbnailLayer } + let progressFrame = CGRect(origin: CGPoint(x: item.frame.midX - 37 / 2, y: item.frame.midY - 37 / 2), size: CGSize(width: 37, height: 37)) + + + + let updatedStatusSignal = account.postbox.mediaBox.resourceStatus(item.fileReference.media.resource) + + let statusDisposable: MetaDisposable + if let disposable = self.statusDisposable[item.fileReference.media.fileId] { + statusDisposable = disposable + } else { + statusDisposable = MetaDisposable() + self.statusDisposable[item.fileReference.media.fileId] = statusDisposable + } + + statusDisposable.set((updatedStatusSignal |> deliverOnMainQueue).start(next: { [weak self] status in + displayLinkDispatcher.dispatch { + guard let `self` = self else {return} + + let state: RadialStatusNodeState + + + + + + switch status { + case let .Fetching(_, progress): + state = .progress(color: .white, lineWidth: nil, value: CGFloat(max(progress, 0.2)), cancelEnabled: false) + case .Remote: + state = .progress(color: .white, lineWidth: nil, value: 0, cancelEnabled: false) + case .Local: + state = .none + } + + if state == .none { + if let statusNode = self.visibleProgressNodes[item.fileReference.media.fileId] { + self.visibleProgressNodes.removeValue(forKey: item.fileReference.media.fileId) + statusNode.transitionToState(state, completion: { [weak statusNode] in + statusNode?.removeFromSupernode() + }) + } + } else { + if let visibleProgressNode = self.visibleProgressNodes[item.fileReference.media.fileId] { + if ensureFrames { + visibleProgressNode.frame = progressFrame + } + } else { + let visibleProgressNode = RadialStatusNode(backgroundNodeColor: UIColor(white: 0.0, alpha: 0.5)) + visibleProgressNode.frame = progressFrame + self.visibleProgressNodes[item.fileReference.media.fileId] = visibleProgressNode + } + + let statusNode = self.visibleProgressNodes[item.fileReference.media.fileId]! + statusNode.transitionToState(state, completion: {}) + self.addSubnode(statusNode) + } + } + })) + + if item.frame.maxY < minVisibleY { continue; } diff --git a/TelegramUI/SoftwareVideoThumbnailLayer.swift b/TelegramUI/SoftwareVideoThumbnailLayer.swift index b345a0868d..46f2b7a36a 100644 --- a/TelegramUI/SoftwareVideoThumbnailLayer.swift +++ b/TelegramUI/SoftwareVideoThumbnailLayer.swift @@ -18,7 +18,7 @@ final class SoftwareVideoThumbnailLayer: CALayer { init(account: Account, fileReference: FileMediaReference) { super.init() - self.backgroundColor = UIColor.black.cgColor + self.backgroundColor = UIColor.clear.cgColor self.contentsGravity = "resizeAspectFill" self.masksToBounds = true @@ -28,7 +28,7 @@ final class SoftwareVideoThumbnailLayer: CALayer { let imageSize = boundingSize boundingSize.width = min(200.0, boundingSize.width) - if let image = transform(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: boundingSize, intrinsicInsets: UIEdgeInsets()))?.generateImage() { + if let image = transform(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: boundingSize, intrinsicInsets: UIEdgeInsets(), resizeMode: .fill(.clear)))?.generateImage() { Queue.mainQueue().async { if let strongSelf = self { strongSelf.contents = image.cgImage From 311d9ac073d8c4ffd8bcea7041000ac9e8d03128 Mon Sep 17 00:00:00 2001 From: overtake <> Date: Tue, 11 Sep 2018 19:04:11 +0100 Subject: [PATCH 2/2] no message --- TelegramUI/ChannelInfoController.swift | 2 +- TelegramUI/CreateChannelController.swift | 4 ++-- TelegramUI/GroupInfoController.swift | 2 +- TelegramUI/ItemListMultilineInputItem.swift | 17 +++++++++++++++++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/TelegramUI/ChannelInfoController.swift b/TelegramUI/ChannelInfoController.swift index 5433479f9b..a594a95d72 100644 --- a/TelegramUI/ChannelInfoController.swift +++ b/TelegramUI/ChannelInfoController.swift @@ -315,7 +315,7 @@ private enum ChannelInfoEntry: ItemListNodeEntry { arguments.openChannelTypeSetup() }) case let .channelDescriptionSetup(theme, placeholder, value): - return ItemListMultilineInputItem(theme: theme, text: value, placeholder: placeholder, maxLength: 1000, sectionId: self.section, style: .plain, textUpdated: { updatedText in + return ItemListMultilineInputItem(theme: theme, text: value, placeholder: placeholder, maxLength: 255, sectionId: self.section, style: .plain, textUpdated: { updatedText in arguments.updateEditingDescriptionText(updatedText) }, action: { diff --git a/TelegramUI/CreateChannelController.swift b/TelegramUI/CreateChannelController.swift index 783f759df6..84c820f792 100644 --- a/TelegramUI/CreateChannelController.swift +++ b/TelegramUI/CreateChannelController.swift @@ -132,7 +132,7 @@ private enum CreateChannelEntry: ItemListNodeEntry { arguments.changeProfilePhoto() }) case let .descriptionSetup(theme, text, value): - return ItemListMultilineInputItem(theme: theme, text: value, placeholder: text, maxLength: 1000, sectionId: self.section, style: .blocks, textUpdated: { updatedText in + return ItemListMultilineInputItem(theme: theme, text: value, placeholder: text, maxLength: 255, sectionId: self.section, style: .blocks, textUpdated: { updatedText in arguments.updateEditingDescriptionText(updatedText) }, action: { @@ -214,7 +214,7 @@ public func createChannelController(account: Account) -> ViewController { }, updateEditingDescriptionText: { text in updateState { current in var current = current - current.editingDescriptionText = text + current.editingDescriptionText = String(text.prefix(255)) return current } }, done: { diff --git a/TelegramUI/GroupInfoController.swift b/TelegramUI/GroupInfoController.swift index 47d66e5a54..2fdb504a97 100644 --- a/TelegramUI/GroupInfoController.swift +++ b/TelegramUI/GroupInfoController.swift @@ -480,7 +480,7 @@ private enum GroupInfoEntry: ItemListNodeEntry { arguments.presentController(channelVisibilityController(account: arguments.account, peerId: arguments.peerId, mode: .generic), ViewControllerPresentationArguments(presentationAnimation: ViewControllerPresentationAnimation.modalSheet)) }) case let .groupDescriptionSetup(theme, placeholder, text): - return ItemListMultilineInputItem(theme: theme, text: text, placeholder: placeholder, maxLength: 1000, sectionId: self.section, style: .blocks, textUpdated: { updatedText in + return ItemListMultilineInputItem(theme: theme, text: text, placeholder: placeholder, maxLength: 255, sectionId: self.section, style: .blocks, textUpdated: { updatedText in arguments.updateEditingDescriptionText(updatedText) }, action: { diff --git a/TelegramUI/ItemListMultilineInputItem.swift b/TelegramUI/ItemListMultilineInputItem.swift index ba70c49ca9..0eb744967d 100644 --- a/TelegramUI/ItemListMultilineInputItem.swift +++ b/TelegramUI/ItemListMultilineInputItem.swift @@ -100,6 +100,7 @@ class ItemListMultilineInputItemNode: ListViewItemNode, ASEditableTextNodeDelega self.textClippingNode.addSubnode(self.textNode) self.addSubnode(self.textClippingNode) + } override func didLoad() { @@ -290,6 +291,22 @@ class ItemListMultilineInputItemNode: ListViewItemNode, ASEditableTextNodeDelega } } + func editableTextNodeShouldPaste(_ editableTextNode: ASEditableTextNode) -> Bool { + if let item = self.item { + var text: String? = UIPasteboard.general.string + if let text = text { + if let maxLength = item.maxLength { + let string = self.textNode.attributedText?.string ?? "" + if string.count + text.count > maxLength { + UIPasteboard.general.string = String(text[..