mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Various improvements
This commit is contained in:
parent
17390d9067
commit
6700f1af2a
@ -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)
|
UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
|
||||||
let context = UIGraphicsGetCurrentContext()
|
let context = UIGraphicsGetCurrentContext()
|
||||||
|
|
||||||
context?.beginPath()
|
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()
|
context?.clip()
|
||||||
|
|
||||||
source.draw(in: CGRect(origin: CGPoint(), size: size))
|
source.draw(in: CGRect(origin: CGPoint(), size: size))
|
||||||
@ -1214,8 +1223,8 @@ private func avatarViewLettersImage(size: CGSize, peerId: Int64, accountPeerId:
|
|||||||
return image
|
return image
|
||||||
}
|
}
|
||||||
|
|
||||||
private func avatarImage(path: String?, peerId: Int64, accountPeerId: Int64, letters: [String], size: CGSize) -> UIImage {
|
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) {
|
if let path = path, let image = UIImage(contentsOfFile: path), let roundImage = avatarRoundImage(size: size, source: image, style: style) {
|
||||||
return roundImage
|
return roundImage
|
||||||
} else {
|
} else {
|
||||||
return avatarViewLettersImage(size: size, peerId: peerId, accountPeerId: accountPeerId, letters: letters)!
|
return avatarViewLettersImage(size: size, peerId: peerId, accountPeerId: accountPeerId, letters: letters)!
|
||||||
@ -1297,6 +1306,11 @@ private func mapPeersToFriends(accountId: AccountRecordId, accountPeerId: PeerId
|
|||||||
autoreleasepool {
|
autoreleasepool {
|
||||||
var profileImage: INImage?
|
var profileImage: INImage?
|
||||||
|
|
||||||
|
var isForum = false
|
||||||
|
if let peer = peer as? TelegramChannel, peer.flags.contains(.isForum) {
|
||||||
|
isForum = true
|
||||||
|
}
|
||||||
|
|
||||||
if peer.id == accountPeerId {
|
if peer.id == accountPeerId {
|
||||||
let cachedPath = mediaBox.cachedRepresentationPathForId("savedMessagesAvatar50x50", representationId: "intents.png", keepDuration: .shortLived)
|
let cachedPath = mediaBox.cachedRepresentationPathForId("savedMessagesAvatar50x50", representationId: "intents.png", keepDuration: .shortLived)
|
||||||
if let _ = fileSize(cachedPath) {
|
if let _ = fileSize(cachedPath) {
|
||||||
@ -1325,7 +1339,7 @@ private func mapPeersToFriends(accountId: AccountRecordId, accountPeerId: PeerId
|
|||||||
} catch {
|
} catch {
|
||||||
}
|
}
|
||||||
} else {
|
} 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() {
|
if let data = image.pngData() {
|
||||||
let _ = try? data.write(to: URL(fileURLWithPath: cachedPath), options: .atomic)
|
let _ = try? data.write(to: URL(fileURLWithPath: cachedPath), options: .atomic)
|
||||||
}
|
}
|
||||||
@ -1345,7 +1359,7 @@ private func mapPeersToFriends(accountId: AccountRecordId, accountPeerId: PeerId
|
|||||||
} catch {
|
} catch {
|
||||||
}
|
}
|
||||||
} else {
|
} 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() {
|
if let data = image.pngData() {
|
||||||
let _ = try? data.write(to: URL(fileURLWithPath: cachedPath), options: .atomic)
|
let _ = try? data.write(to: URL(fileURLWithPath: cachedPath), options: .atomic)
|
||||||
}
|
}
|
||||||
|
@ -8277,3 +8277,6 @@ Sorry for the inconvenience.";
|
|||||||
|
|
||||||
"Premium.ChatManagement.Proceed" = "About Telegram Premium";
|
"Premium.ChatManagement.Proceed" = "About Telegram Premium";
|
||||||
"Premium.FasterSpeed.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.";
|
||||||
|
@ -23,12 +23,22 @@ private let gradientColors: [NSArray] = [
|
|||||||
[UIColor(rgb: 0xd669ed).cgColor, UIColor(rgb: 0xe0a2f3).cgColor],
|
[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)
|
UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
|
||||||
let context = UIGraphicsGetCurrentContext()
|
let context = UIGraphicsGetCurrentContext()
|
||||||
|
|
||||||
context?.beginPath()
|
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()
|
context?.clip()
|
||||||
|
|
||||||
source.draw(in: CGRect(origin: CGPoint(), size: size))
|
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)
|
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 {
|
if let peer = peer, let accountPeerId = accountPeerId, peer.id == accountPeerId {
|
||||||
return savedMessagesImage(size: size)!
|
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
|
return roundImage
|
||||||
} else {
|
} else {
|
||||||
return avatarViewLettersImage(size: size, peerId: peer?.id ?? 1, accountPeerId: accountPeerId ?? 1, letters: peer?.letters ?? [" "])!
|
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 {
|
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())
|
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
|
self.image = roundImage
|
||||||
} else {
|
} else {
|
||||||
self.image = avatarViewLettersImage(size: size, peerId: peer.id, accountPeerId: accountPeerId, letters: peer.letters)
|
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) {
|
init(primaryColor: UIColor, accountPeerId: Int64, peer: WidgetDataPeer, tapped: @escaping () -> Void) {
|
||||||
self.peer = peer
|
self.peer = peer
|
||||||
self.tapped = tapped
|
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()
|
self.titleLabel = UILabel()
|
||||||
var title = peer.name
|
var title = peer.name
|
||||||
|
@ -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
|
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)
|
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))
|
result.append(ParsedPeer(accountId: accountId, accountPeerId: state.peerId.toInt64(), peer: widgetPeer))
|
||||||
}
|
}
|
||||||
@ -271,8 +276,8 @@ struct AvatarItemView: View {
|
|||||||
var body: some View {
|
var body: some View {
|
||||||
return ZStack {
|
return ZStack {
|
||||||
if let peer = peer {
|
if let peer = peer {
|
||||||
Image(uiImage: avatarImage(accountPeerId: peer.accountPeerId, peer: peer.peer, size: CGSize(width: itemSize, height: itemSize)))
|
Image(uiImage: avatarImage(accountPeerId: peer.accountPeerId, peer: peer.peer, size: CGSize(width: itemSize, height: itemSize), style: peer.peer.isForum ? .roundedRect : .round))
|
||||||
.clipShape(Circle())
|
.mask(peer.peer.isForum ? AnyView(RoundedRectangle(cornerRadius: itemSize * 0.25)) : AnyView(Circle()))
|
||||||
} else {
|
} else {
|
||||||
Circle()
|
Circle()
|
||||||
.fill(placeholderColor)
|
.fill(placeholderColor)
|
||||||
|
@ -174,6 +174,7 @@ private final class ChannelOwnershipTransferPasswordFieldNode: ASDisplayNode, UI
|
|||||||
|
|
||||||
public final class ChannelOwnershipTransferAlertContentNode: AlertContentNode {
|
public final class ChannelOwnershipTransferAlertContentNode: AlertContentNode {
|
||||||
private let strings: PresentationStrings
|
private let strings: PresentationStrings
|
||||||
|
private let bot: Bool
|
||||||
|
|
||||||
private let titleNode: ASTextNode
|
private let titleNode: ASTextNode
|
||||||
private let textNode: ASTextNode
|
private let textNode: ASTextNode
|
||||||
@ -205,9 +206,10 @@ public final class ChannelOwnershipTransferAlertContentNode: AlertContentNode {
|
|||||||
return self.isUserInteractionEnabled
|
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.strings = strings
|
||||||
self.theme = ptheme
|
self.theme = ptheme
|
||||||
|
self.bot = bot
|
||||||
|
|
||||||
self.titleNode = ASTextNode()
|
self.titleNode = ASTextNode()
|
||||||
self.titleNode.maximumNumberOfLines = 2
|
self.titleNode.maximumNumberOfLines = 2
|
||||||
@ -277,8 +279,18 @@ public final class ChannelOwnershipTransferAlertContentNode: AlertContentNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public override func updateTheme(_ theme: AlertControllerTheme) {
|
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)
|
let title: String
|
||||||
self.textNode.attributedText = NSAttributedString(string: self.strings.Channel_OwnershipTransfer_EnterPasswordText, font: Font.regular(13.0), textColor: theme.primaryColor, paragraphAlignment: .center)
|
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
|
self.actionNodesSeparator.backgroundColor = theme.separatorColor
|
||||||
for actionNode in self.actionNodes {
|
for actionNode in self.actionNodes {
|
||||||
|
@ -23,7 +23,7 @@ private func commitOwnershipTransferController(context: AccountContext, updatedP
|
|||||||
|
|
||||||
let disposable = MetaDisposable()
|
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?()
|
dismissImpl?()
|
||||||
}), TextAlertAction(type: .defaultAction, title: presentationData.strings.OwnershipTransfer_Transfer, action: {
|
}), TextAlertAction(type: .defaultAction, title: presentationData.strings.OwnershipTransfer_Transfer, action: {
|
||||||
proceedImpl?()
|
proceedImpl?()
|
||||||
|
@ -228,7 +228,12 @@ final class WidgetDataContext {
|
|||||||
name = peer.debugDisplayTitle
|
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
|
result.sort(by: { lhs, rhs in
|
||||||
return lhs.id < rhs.id
|
return lhs.id < rhs.id
|
||||||
|
@ -249,8 +249,9 @@ public struct WidgetDataPeer: Codable, Equatable {
|
|||||||
public var avatarPath: String?
|
public var avatarPath: String?
|
||||||
public var badge: Badge?
|
public var badge: Badge?
|
||||||
public var message: Message?
|
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.id = id
|
||||||
self.name = name
|
self.name = name
|
||||||
self.lastName = lastName
|
self.lastName = lastName
|
||||||
@ -258,6 +259,7 @@ public struct WidgetDataPeer: Codable, Equatable {
|
|||||||
self.avatarPath = avatarPath
|
self.avatarPath = avatarPath
|
||||||
self.badge = badge
|
self.badge = badge
|
||||||
self.message = message
|
self.message = message
|
||||||
|
self.isForum = isForum
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user