diff --git a/Telegram/SiriIntents/IntentHandler.swift b/Telegram/SiriIntents/IntentHandler.swift index 3f5f964256..cfb667798e 100644 --- a/Telegram/SiriIntents/IntentHandler.swift +++ b/Telegram/SiriIntents/IntentHandler.swift @@ -1129,12 +1129,21 @@ class AvatarsIntentHandler: NSObject, SelectAvatarFriendsIntentHandling { } } -private func avatarRoundImage(size: CGSize, source: UIImage) -> UIImage? { +enum AvatarClipStyle { + case round + case roundedRect +} +private func avatarRoundImage(size: CGSize, source: UIImage, style: AvatarClipStyle) -> UIImage? { UIGraphicsBeginImageContextWithOptions(size, false, 0.0) let context = UIGraphicsGetCurrentContext() context?.beginPath() - context?.addEllipse(in: CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height)) + switch style { + case .round: + context?.addEllipse(in: CGRect(origin: .zero, size: size)) + case .roundedRect: + context?.addPath(UIBezierPath(roundedRect: CGRect(origin: .zero, size: size), cornerRadius: size.width * 0.25).cgPath) + } context?.clip() source.draw(in: CGRect(origin: CGPoint(), size: size)) @@ -1214,8 +1223,8 @@ private func avatarViewLettersImage(size: CGSize, peerId: Int64, accountPeerId: return image } -private func avatarImage(path: String?, peerId: Int64, accountPeerId: Int64, letters: [String], size: CGSize) -> UIImage { - if let path = path, let image = UIImage(contentsOfFile: path), let roundImage = avatarRoundImage(size: size, source: image) { +private func avatarImage(path: String?, peerId: Int64, accountPeerId: Int64, letters: [String], size: CGSize, style: AvatarClipStyle) -> UIImage { + if let path = path, let image = UIImage(contentsOfFile: path), let roundImage = avatarRoundImage(size: size, source: image, style: style) { return roundImage } else { return avatarViewLettersImage(size: size, peerId: peerId, accountPeerId: accountPeerId, letters: letters)! @@ -1297,6 +1306,11 @@ private func mapPeersToFriends(accountId: AccountRecordId, accountPeerId: PeerId autoreleasepool { var profileImage: INImage? + var isForum = false + if let peer = peer as? TelegramChannel, peer.flags.contains(.isForum) { + isForum = true + } + if peer.id == accountPeerId { let cachedPath = mediaBox.cachedRepresentationPathForId("savedMessagesAvatar50x50", representationId: "intents.png", keepDuration: .shortLived) if let _ = fileSize(cachedPath) { @@ -1325,7 +1339,7 @@ private func mapPeersToFriends(accountId: AccountRecordId, accountPeerId: PeerId } catch { } } else { - let image = avatarImage(path: path, peerId: peer.id.toInt64(), accountPeerId: accountPeerId.toInt64(), letters: peer.displayLetters, size: CGSize(width: 50.0, height: 50.0)) + let image = avatarImage(path: path, peerId: peer.id.toInt64(), accountPeerId: accountPeerId.toInt64(), letters: peer.displayLetters, size: CGSize(width: 50.0, height: 50.0), style: isForum ? .roundedRect : .round) if let data = image.pngData() { let _ = try? data.write(to: URL(fileURLWithPath: cachedPath), options: .atomic) } @@ -1345,7 +1359,7 @@ private func mapPeersToFriends(accountId: AccountRecordId, accountPeerId: PeerId } catch { } } else { - let image = avatarImage(path: nil, peerId: peer.id.toInt64(), accountPeerId: accountPeerId.toInt64(), letters: peer.displayLetters, size: CGSize(width: 50.0, height: 50.0)) + let image = avatarImage(path: nil, peerId: peer.id.toInt64(), accountPeerId: accountPeerId.toInt64(), letters: peer.displayLetters, size: CGSize(width: 50.0, height: 50.0), style: isForum ? .roundedRect : .round) if let data = image.pngData() { let _ = try? data.write(to: URL(fileURLWithPath: cachedPath), options: .atomic) } diff --git a/Telegram/Telegram-iOS/en.lproj/Localizable.strings b/Telegram/Telegram-iOS/en.lproj/Localizable.strings index 458a410e7c..13f16193c1 100644 --- a/Telegram/Telegram-iOS/en.lproj/Localizable.strings +++ b/Telegram/Telegram-iOS/en.lproj/Localizable.strings @@ -8277,3 +8277,6 @@ Sorry for the inconvenience."; "Premium.ChatManagement.Proceed" = "About Telegram Premium"; "Premium.FasterSpeed.Proceed" = "About Telegram Premium"; + +"OwnershipTransfer.EnterPassword" = "Enter Password"; +"OwnershipTransfer.EnterPasswordText" = "Please enter your 2-Step Verification password to confirm the action."; diff --git a/Telegram/WidgetKitWidget/PeerNode.swift b/Telegram/WidgetKitWidget/PeerNode.swift index 7308b76090..80fafa74b5 100644 --- a/Telegram/WidgetKitWidget/PeerNode.swift +++ b/Telegram/WidgetKitWidget/PeerNode.swift @@ -23,12 +23,22 @@ private let gradientColors: [NSArray] = [ [UIColor(rgb: 0xd669ed).cgColor, UIColor(rgb: 0xe0a2f3).cgColor], ] -private func avatarRoundImage(size: CGSize, source: UIImage) -> UIImage? { +enum AvatarClipStyle { + case round + case roundedRect +} +private func avatarRoundImage(size: CGSize, source: UIImage, style: AvatarClipStyle) -> UIImage? { UIGraphicsBeginImageContextWithOptions(size, false, 0.0) let context = UIGraphicsGetCurrentContext() context?.beginPath() - context?.addEllipse(in: CGRect(x: 0.0, y: 0.0, width: size.width, height: size.height)) + switch style { + case .round: + context?.addEllipse(in: CGRect(origin: .zero, size: size)) + case .roundedRect: + context?.addPath(UIBezierPath(roundedRect: CGRect(origin: .zero, size: size), cornerRadius: size.width * 0.25).cgPath) + } + context?.clip() source.draw(in: CGRect(origin: CGPoint(), size: size)) @@ -159,10 +169,10 @@ private func savedMessagesImage(size: CGSize) -> UIImage? { private let avatarSize = CGSize(width: 50.0, height: 50.0) -func avatarImage(accountPeerId: Int64?, peer: WidgetDataPeer?, size: CGSize) -> UIImage { +func avatarImage(accountPeerId: Int64?, peer: WidgetDataPeer?, size: CGSize, style: AvatarClipStyle) -> UIImage { if let peer = peer, let accountPeerId = accountPeerId, peer.id == accountPeerId { return savedMessagesImage(size: size)! - } else if let path = peer?.avatarPath, let image = UIImage(contentsOfFile: path), let roundImage = avatarRoundImage(size: size, source: image) { + } else if let path = peer?.avatarPath, let image = UIImage(contentsOfFile: path), let roundImage = avatarRoundImage(size: size, source: image, style: style) { return roundImage } else { return avatarViewLettersImage(size: size, peerId: peer?.id ?? 1, accountPeerId: accountPeerId ?? 1, letters: peer?.letters ?? [" "])! @@ -170,10 +180,10 @@ func avatarImage(accountPeerId: Int64?, peer: WidgetDataPeer?, size: CGSize) -> } private final class AvatarView: UIImageView { - init(accountPeerId: Int64, peer: WidgetDataPeer, size: CGSize) { + init(accountPeerId: Int64, peer: WidgetDataPeer, size: CGSize, style: AvatarClipStyle) { super.init(frame: CGRect()) - if let path = peer.avatarPath, let image = UIImage(contentsOfFile: path), let roundImage = avatarRoundImage(size: size, source: image) { + if let path = peer.avatarPath, let image = UIImage(contentsOfFile: path), let roundImage = avatarRoundImage(size: size, source: image, style: style) { self.image = roundImage } else { self.image = avatarViewLettersImage(size: size, peerId: peer.id, accountPeerId: accountPeerId, letters: peer.letters) @@ -195,7 +205,7 @@ final class PeerView: UIView { init(primaryColor: UIColor, accountPeerId: Int64, peer: WidgetDataPeer, tapped: @escaping () -> Void) { self.peer = peer self.tapped = tapped - self.avatarView = AvatarView(accountPeerId: accountPeerId, peer: peer, size: avatarSize) + self.avatarView = AvatarView(accountPeerId: accountPeerId, peer: peer, size: avatarSize, style: peer.isForum ? .roundedRect : .round) self.titleLabel = UILabel() var title = peer.name diff --git a/Telegram/WidgetKitWidget/TodayViewController.swift b/Telegram/WidgetKitWidget/TodayViewController.swift index 6753d73b3b..151136e396 100644 --- a/Telegram/WidgetKitWidget/TodayViewController.swift +++ b/Telegram/WidgetKitWidget/TodayViewController.swift @@ -175,9 +175,14 @@ private func getCommonTimeline(friends: [Friend]?, in context: TimelineProviderC } } + var isForum = false + if let peer = peer as? TelegramChannel, peer.flags.contains(.isForum) { + isForum = true + } + let widgetPeer = WidgetDataPeer(id: peer.id.toInt64(), name: name, lastName: lastName, letters: peer.displayLetters, avatarPath: smallestImageRepresentation(peer.profileImageRepresentations).flatMap { representation in return postbox.mediaBox.resourcePath(representation.resource) - }, badge: badge, message: mappedMessage) + }, badge: badge, message: mappedMessage, isForum: isForum) result.append(ParsedPeer(accountId: accountId, accountPeerId: state.peerId.toInt64(), peer: widgetPeer)) } @@ -271,8 +276,8 @@ struct AvatarItemView: View { var body: some View { return ZStack { if let peer = peer { - Image(uiImage: avatarImage(accountPeerId: peer.accountPeerId, peer: peer.peer, size: CGSize(width: itemSize, height: itemSize))) - .clipShape(Circle()) + Image(uiImage: avatarImage(accountPeerId: peer.accountPeerId, peer: peer.peer, size: CGSize(width: itemSize, height: itemSize), style: peer.peer.isForum ? .roundedRect : .round)) + .mask(peer.peer.isForum ? AnyView(RoundedRectangle(cornerRadius: itemSize * 0.25)) : AnyView(Circle())) } else { Circle() .fill(placeholderColor) diff --git a/submodules/PeerInfoUI/Sources/ChannelOwnershipTransferController.swift b/submodules/PeerInfoUI/Sources/ChannelOwnershipTransferController.swift index 0b898dd5a9..ab95da6445 100644 --- a/submodules/PeerInfoUI/Sources/ChannelOwnershipTransferController.swift +++ b/submodules/PeerInfoUI/Sources/ChannelOwnershipTransferController.swift @@ -174,6 +174,7 @@ private final class ChannelOwnershipTransferPasswordFieldNode: ASDisplayNode, UI public final class ChannelOwnershipTransferAlertContentNode: AlertContentNode { private let strings: PresentationStrings + private let bot: Bool private let titleNode: ASTextNode private let textNode: ASTextNode @@ -205,9 +206,10 @@ public final class ChannelOwnershipTransferAlertContentNode: AlertContentNode { return self.isUserInteractionEnabled } - public init(theme: AlertControllerTheme, ptheme: PresentationTheme, strings: PresentationStrings, actions: [TextAlertAction]) { + public init(theme: AlertControllerTheme, ptheme: PresentationTheme, strings: PresentationStrings, bot: Bool = false, actions: [TextAlertAction]) { self.strings = strings self.theme = ptheme + self.bot = bot self.titleNode = ASTextNode() self.titleNode.maximumNumberOfLines = 2 @@ -277,8 +279,18 @@ public final class ChannelOwnershipTransferAlertContentNode: AlertContentNode { } public override func updateTheme(_ theme: AlertControllerTheme) { - self.titleNode.attributedText = NSAttributedString(string: self.strings.Channel_OwnershipTransfer_EnterPassword, font: Font.bold(17.0), textColor: theme.primaryColor, paragraphAlignment: .center) - self.textNode.attributedText = NSAttributedString(string: self.strings.Channel_OwnershipTransfer_EnterPasswordText, font: Font.regular(13.0), textColor: theme.primaryColor, paragraphAlignment: .center) + let title: String + let text: String + if self.bot { + title = self.strings.OwnershipTransfer_EnterPassword + text = self.strings.OwnershipTransfer_EnterPasswordText + } else { + title = self.strings.Channel_OwnershipTransfer_EnterPassword + text = self.strings.Channel_OwnershipTransfer_EnterPasswordText + } + + self.titleNode.attributedText = NSAttributedString(string: title, font: Font.bold(17.0), textColor: theme.primaryColor, paragraphAlignment: .center) + self.textNode.attributedText = NSAttributedString(string: text, font: Font.regular(13.0), textColor: theme.primaryColor, paragraphAlignment: .center) self.actionNodesSeparator.backgroundColor = theme.separatorColor for actionNode in self.actionNodes { diff --git a/submodules/TelegramUI/Sources/OwnershipTransferController.swift b/submodules/TelegramUI/Sources/OwnershipTransferController.swift index d3c52855bc..24cd7beec7 100644 --- a/submodules/TelegramUI/Sources/OwnershipTransferController.swift +++ b/submodules/TelegramUI/Sources/OwnershipTransferController.swift @@ -23,7 +23,7 @@ private func commitOwnershipTransferController(context: AccountContext, updatedP let disposable = MetaDisposable() - let contentNode = ChannelOwnershipTransferAlertContentNode(theme: AlertControllerTheme(presentationData: presentationData), ptheme: presentationData.theme, strings: presentationData.strings, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: { + let contentNode = ChannelOwnershipTransferAlertContentNode(theme: AlertControllerTheme(presentationData: presentationData), ptheme: presentationData.theme, strings: presentationData.strings, bot: true, actions: [TextAlertAction(type: .genericAction, title: presentationData.strings.Common_Cancel, action: { dismissImpl?() }), TextAlertAction(type: .defaultAction, title: presentationData.strings.OwnershipTransfer_Transfer, action: { proceedImpl?() diff --git a/submodules/TelegramUI/Sources/WidgetDataContext.swift b/submodules/TelegramUI/Sources/WidgetDataContext.swift index 40d9b5b36d..87b02168dd 100644 --- a/submodules/TelegramUI/Sources/WidgetDataContext.swift +++ b/submodules/TelegramUI/Sources/WidgetDataContext.swift @@ -228,7 +228,12 @@ final class WidgetDataContext { name = peer.debugDisplayTitle } - result.append(WidgetDataPeer(id: peerId.toInt64(), name: name, lastName: lastName, letters: [], avatarPath: nil, badge: nil, message: WidgetDataPeer.Message(accountPeerId: account.peerId, message: message))) + var isForum = false + if let peer = peer as? TelegramChannel, peer.flags.contains(.isForum) { + isForum = true + } + + result.append(WidgetDataPeer(id: peerId.toInt64(), name: name, lastName: lastName, letters: [], avatarPath: nil, badge: nil, message: WidgetDataPeer.Message(accountPeerId: account.peerId, message: message), isForum: isForum)) } result.sort(by: { lhs, rhs in return lhs.id < rhs.id diff --git a/submodules/WidgetItems/Sources/WidgetItems.swift b/submodules/WidgetItems/Sources/WidgetItems.swift index 4cf5ea1328..548c2c0b5c 100644 --- a/submodules/WidgetItems/Sources/WidgetItems.swift +++ b/submodules/WidgetItems/Sources/WidgetItems.swift @@ -249,8 +249,9 @@ public struct WidgetDataPeer: Codable, Equatable { public var avatarPath: String? public var badge: Badge? public var message: Message? + public var isForum: Bool - public init(id: Int64, name: String, lastName: String?, letters: [String], avatarPath: String?, badge: Badge?, message: Message?) { + public init(id: Int64, name: String, lastName: String?, letters: [String], avatarPath: String?, badge: Badge?, message: Message?, isForum: Bool) { self.id = id self.name = name self.lastName = lastName @@ -258,6 +259,7 @@ public struct WidgetDataPeer: Codable, Equatable { self.avatarPath = avatarPath self.badge = badge self.message = message + self.isForum = isForum } }