diff --git a/submodules/ChatListUI/Sources/Node/ChatListItem.swift b/submodules/ChatListUI/Sources/Node/ChatListItem.swift index ece82bcec1..f2b27b142a 100644 --- a/submodules/ChatListUI/Sources/Node/ChatListItem.swift +++ b/submodules/ChatListUI/Sources/Node/ChatListItem.swift @@ -1136,6 +1136,7 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { } var online = false + var animateOnline = false let peerRevealOptions: [ItemListRevealOption] let peerLeftRevealOptions: [ItemListRevealOption] @@ -1146,6 +1147,7 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { if case .online = relativeStatus { online = true } + animateOnline = true } let isPinned = item.index.pinningIndex != nil @@ -1335,14 +1337,14 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { onlineIcon = PresentationResourcesChatList.recentStatusOnlineIcon(item.presentationData.theme, state: .regular) } strongSelf.onlineNode.setImage(onlineIcon) - + let _ = dateApply() let _ = textApply() let _ = authorApply() let _ = titleApply() let _ = badgeApply(animateBadges, !isMuted) let _ = mentionBadgeApply(animateBadges, true) - let _ = onlineApply(animateContent) + let _ = onlineApply(animateContent && animateOnline) let contentRect = rawContentRect.offsetBy(dx: editingOffset + leftInset + revealOffset, dy: 0.0) diff --git a/submodules/ShareController/Sources/ShareController.swift b/submodules/ShareController/Sources/ShareController.swift index 86e198e81d..c7ffe3dde0 100644 --- a/submodules/ShareController/Sources/ShareController.swift +++ b/submodules/ShareController/Sources/ShareController.swift @@ -162,6 +162,8 @@ private func collectExternalShareItems(strings: PresentationStrings, postbox: Po text.append("\n\(strings.MessagePoll_VotedCount(totalVoters))") } signals.append(.single(.done(.text(text)))) + } else if let mediaReference = item.mediaReference, let contact = mediaReference.media as? TelegramMediaContact { + } if let url = item.url, let parsedUrl = URL(string: url) { if signals.isEmpty { diff --git a/submodules/TelegramUI/TelegramUI/AppDelegate.swift b/submodules/TelegramUI/TelegramUI/AppDelegate.swift index 813cbf4f50..b3aac78c4a 100644 --- a/submodules/TelegramUI/TelegramUI/AppDelegate.swift +++ b/submodules/TelegramUI/TelegramUI/AppDelegate.swift @@ -1671,15 +1671,18 @@ final class SharedApplicationContext { self.registerForNotifications(replyString: presentationData.strings.Notification_Reply, messagePlaceholderString: presentationData.strings.Conversation_InputTextPlaceholder, hiddenContentString: presentationData.strings.Watch_MessageView_Title, includeNames: displayNames, authorize: authorize, completion: completion) }) } - - + private func registerForNotifications(replyString: String, messagePlaceholderString: String, hiddenContentString: String, includeNames: Bool, authorize: Bool = true, completion: @escaping (Bool) -> Void = { _ in }) { if #available(iOS 10.0, *) { let notificationCenter = UNUserNotificationCenter.current() notificationCenter.getNotificationSettings(completionHandler: { settings in switch (settings.authorizationStatus, authorize) { case (.authorized, _), (.notDetermined, true): - notificationCenter.requestAuthorization(options: [.badge, .sound, .alert, .carPlay], completionHandler: { result, _ in + var authorizationOptions: UNAuthorizationOptions = [.badge, .sound, .alert, .carPlay] + if #available(iOS 12.0, *) { + authorizationOptions.insert(.providesAppNotificationSettings) + } + notificationCenter.requestAuthorization(options: authorizationOptions, completionHandler: { result, _ in completion(result) if result { Queue.mainQueue().async { @@ -1795,6 +1798,11 @@ final class SharedApplicationContext { }) } + @available(iOS 12.0, *) + func userNotificationCenter(_ center: UNUserNotificationCenter, openSettingsFor notification: UNNotification?) { + + } + func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) { Logger.shared.log("App \(self.episodeId)", "handleEventsForBackgroundURLSession \(identifier)") completionHandler() diff --git a/submodules/TelegramUI/TelegramUI/ChatController.swift b/submodules/TelegramUI/TelegramUI/ChatController.swift index 1ad7055bed..61df0a1ae0 100644 --- a/submodules/TelegramUI/TelegramUI/ChatController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatController.swift @@ -2776,8 +2776,8 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G self?.displayPasteMenu(images) case let .gif(data): self?.enqueueGifData(data) - case let .sticker(image): - self?.enqueueStickerImage(image) + case let .sticker(image, isMemoji): + self?.enqueueStickerImage(image, isMemoji: isMemoji) } } self.chatDisplayNode.updateTypingActivity = { [weak self] value in @@ -5666,9 +5666,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G })) } - private func enqueueStickerImage(_ image: UIImage) { + private func enqueueStickerImage(_ image: UIImage, isMemoji: Bool) { let size = image.size.aspectFitted(CGSize(width: 512.0, height: 512.0)) - self.enqueueMediaMessageDisposable.set((convertToWebP(image: image, targetSize: size, quality: 0.85) |> deliverOnMainQueue).start(next: { [weak self] data in + self.enqueueMediaMessageDisposable.set((convertToWebP(image: image, targetSize: size, quality: 0.9) |> deliverOnMainQueue).start(next: { [weak self] data in if let strongSelf = self, !data.isEmpty { let resource = LocalFileMediaResource(fileId: arc4random64()) strongSelf.context.account.postbox.mediaBox.storeResourceData(resource.id, data: data) diff --git a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift index 8358db5816..4dd27ddb77 100644 --- a/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatMessageInteractiveInstantVideoNode.swift @@ -388,7 +388,7 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode { } } } - }), content: NativeVideoContent(id: .message(item.message.stableId, telegramFile.fileId), fileReference: .message(message: MessageReference(item.message), media: telegramFile), streamVideo: streamVideo ? .earlierStart : .none, enableSound: false, fetchAutomatically: false), priority: .embedded, autoplay: true) + }), content: NativeVideoContent(id: .message(item.message.stableId, telegramFile.fileId), fileReference: .message(message: MessageReference(item.message), media: telegramFile), streamVideo: streamVideo ? .conservative : .none, enableSound: false, fetchAutomatically: false), priority: .embedded, autoplay: true) let previousVideoNode = strongSelf.videoNode strongSelf.videoNode = videoNode strongSelf.insertSubnode(videoNode, belowSubnode: previousVideoNode ?? strongSelf.dateAndStatusNode) diff --git a/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift b/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift index 57027fec62..93654d5c69 100644 --- a/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatTextInputPanelNode.swift @@ -199,7 +199,7 @@ private func textInputBackgroundImage(backgroundColor: UIColor, strokeColor: UIC enum ChatTextInputPanelPasteData { case images([UIImage]) case gif(Data) - case sticker(UIImage) + case sticker(UIImage, Bool) } class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { @@ -1589,8 +1589,13 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { return false } else { var isPNG = false + var isMemoji = false for item in pasteboard.items { - if let image = item[kUTTypePNG as String] as? UIImage { + if let image = item["com.apple.png-sticker"] as? UIImage { + images.append(image) + isPNG = true + isMemoji = true + } else eif let image = item[kUTTypePNG as String] as? UIImage { images.append(image) isPNG = true } else if let image = item["com.apple.uikit.image"] as? UIImage { @@ -1609,8 +1614,8 @@ class ChatTextInputPanelNode: ChatInputPanelNode, ASEditableTextNodeDelegate { return false } let aspectRatio = min(image.size.width, image.size.height) / maxSide - if imageHasTransparency(cgImage), aspectRatio > 0.85 { - self.paste(.sticker(image)) + if isMemoji || (imageHasTransparency(cgImage) && aspectRatio > 0.85) { + self.paste(.sticker(image, isMemoji)) return false } } diff --git a/submodules/TelegramUI/TelegramUI/ConvertToWebP.swift b/submodules/TelegramUI/TelegramUI/ConvertToWebP.swift index 029f42b8f7..f5d0375a35 100644 --- a/submodules/TelegramUI/TelegramUI/ConvertToWebP.swift +++ b/submodules/TelegramUI/TelegramUI/ConvertToWebP.swift @@ -8,7 +8,7 @@ import WebPImage import WebP #endif -private func scaleImage(_ image: UIImage, dimensions: CGSize) -> UIImage? { +private func scaleImage(_ image: UIImage, size: CGSize, boundiingSize: CGSize) -> UIImage? { if #available(iOSApplicationExtension 10.0, iOS 10.0, *) { let format = UIGraphicsImageRendererFormat() format.scale = 1.0 @@ -21,7 +21,7 @@ private func scaleImage(_ image: UIImage, dimensions: CGSize) -> UIImage? { } } -func convertToWebP(image: UIImage, targetSize: CGSize?, quality: CGFloat) -> Signal { +func convertToWebP(image: UIImage, targetSize: CGSize?, targetBoundingSize: CGSize?, quality: CGFloat) -> Signal { var image = image if let targetSize = targetSize, let scaledImage = scaleImage(image, dimensions: targetSize) { image = scaledImage diff --git a/submodules/TelegramUI/TelegramUI/ListMessageFileItemNode.swift b/submodules/TelegramUI/TelegramUI/ListMessageFileItemNode.swift index e9d709a1e8..c819d5472e 100644 --- a/submodules/TelegramUI/TelegramUI/ListMessageFileItemNode.swift +++ b/submodules/TelegramUI/TelegramUI/ListMessageFileItemNode.swift @@ -613,9 +613,9 @@ final class ListMessageFileItemNode: ListMessageNode { } let statusSize = CGSize(width: 28.0, height: 28.0) - transition.updateFrame(node: strongSelf.statusNode, frame: CGRect(origin: CGPoint(x: params.width - params.rightInset - rightInset - statusSize.width, y: floor((nodeLayout.contentSize.height - statusSize.height) / 2.0)), size: statusSize)) + transition.updateFrame(node: strongSelf.statusNode, frame: CGRect(origin: CGPoint(x: params.width - params.rightInset - rightInset - statusSize.width + leftOffset, y: floor((nodeLayout.contentSize.height - statusSize.height) / 2.0)), size: statusSize)) - strongSelf.statusButtonNode.frame = CGRect(origin: CGPoint(x: params.width - params.rightInset - rightInset - 40.0, y: 0.0), size: CGSize(width: 40.0, height: nodeLayout.contentSize.height)) + strongSelf.statusButtonNode.frame = CGRect(origin: CGPoint(x: params.width - params.rightInset - rightInset - 40.0 + leftOffset, y: 0.0), size: CGSize(width: 40.0, height: nodeLayout.contentSize.height)) if let updatedStatusSignal = updatedStatusSignal { strongSelf.statusDisposable.set((updatedStatusSignal