Merge commit 'e7772bb581b908355828dc2ca13643c7df6028c5'

This commit is contained in:
Isaac 2025-05-23 00:37:32 +08:00
commit d574855c17
6 changed files with 36 additions and 8 deletions

View File

@ -484,6 +484,17 @@ public extension UIImage {
} }
return result return result
} }
func fixedOrientation() -> UIImage {
if self.imageOrientation == .up { return self }
UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
self.draw(in: CGRect(origin: .zero, size: size))
let normalizedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return normalizedImage ?? self
}
} }
private func makeSubtreeSnapshot(layer: CALayer, keepPortals: Bool = false, keepTransform: Bool = false) -> UIView? { private func makeSubtreeSnapshot(layer: CALayer, keepPortals: Bool = false, keepTransform: Bool = false) -> UIView? {

View File

@ -1259,7 +1259,7 @@ public final class ShareController: ViewController {
var result: [EnginePeer.Id: EnginePeer?] = [:] var result: [EnginePeer.Id: EnginePeer?] = [:]
var requiresStars: [EnginePeer.Id: StarsAmount] = [:] var requiresStars: [EnginePeer.Id: StarsAmount] = [:]
for peerId in peerIds { for peerId in peerIds {
if let view = views.views[PostboxViewKey.basicPeer(peerId)] as? PeerView, let peer = peerViewMainPeer(view) { if let view = views.views[PostboxViewKey.peer(peerId: peerId, components: [])] as? PeerView, let peer = peerViewMainPeer(view) {
result[peerId] = EnginePeer(peer) result[peerId] = EnginePeer(peer)
if peer is TelegramUser, let cachedPeerDataView = views.views[PostboxViewKey.cachedPeerData(peerId: peerId)] as? CachedPeerDataView { if peer is TelegramUser, let cachedPeerDataView = views.views[PostboxViewKey.cachedPeerData(peerId: peerId)] as? CachedPeerDataView {
if let cachedData = cachedPeerDataView.cachedPeerData as? CachedUserData { if let cachedData = cachedPeerDataView.cachedPeerData as? CachedUserData {
@ -1913,7 +1913,7 @@ public final class ShareController: ViewController {
var result: [EnginePeer.Id: EnginePeer?] = [:] var result: [EnginePeer.Id: EnginePeer?] = [:]
var requiresStars: [EnginePeer.Id: StarsAmount] = [:] var requiresStars: [EnginePeer.Id: StarsAmount] = [:]
for peerId in peerIds { for peerId in peerIds {
if let view = views.views[PostboxViewKey.basicPeer(peerId)] as? PeerView, let peer = peerViewMainPeer(view) { if let view = views.views[PostboxViewKey.peer(peerId: peerId, components: [])] as? PeerView, let peer = peerViewMainPeer(view) {
result[peerId] = EnginePeer(peer) result[peerId] = EnginePeer(peer)
if peer is TelegramUser, let cachedPeerDataView = views.views[PostboxViewKey.cachedPeerData(peerId: peerId)] as? CachedPeerDataView { if peer is TelegramUser, let cachedPeerDataView = views.views[PostboxViewKey.cachedPeerData(peerId: peerId)] as? CachedPeerDataView {
if let cachedData = cachedPeerDataView.cachedPeerData as? CachedUserData { if let cachedData = cachedPeerDataView.cachedPeerData as? CachedUserData {
@ -2549,7 +2549,7 @@ public final class ShareController: ViewController {
if let view = views.views[.cachedPeerData(peerId: id)] as? CachedPeerDataView, let data = view.cachedPeerData as? CachedUserData { if let view = views.views[.cachedPeerData(peerId: id)] as? CachedPeerDataView, let data = view.cachedPeerData as? CachedUserData {
requiresPremiumForMessaging[id] = data.flags.contains(.premiumRequired) requiresPremiumForMessaging[id] = data.flags.contains(.premiumRequired)
requiresStars[id] = data.sendPaidMessageStars?.value requiresStars[id] = data.sendPaidMessageStars?.value
} else if let view = views.views[.basicPeer(id)] as? PeerView, let channel = peerViewMainPeer(view) as? TelegramChannel { } else if let view = views.views[.peer(peerId: id, components: [])] as? PeerView, let channel = peerViewMainPeer(view) as? TelegramChannel {
requiresStars[id] = channel.sendPaidMessageStars?.value requiresStars[id] = channel.sendPaidMessageStars?.value
} else { } else {
requiresPremiumForMessaging[id] = false requiresPremiumForMessaging[id] = false

View File

@ -1657,6 +1657,10 @@ private final class GiftViewSheetContent: CombinedComponent {
convertStars = nil convertStars = nil
titleString = "" titleString = ""
} }
if !canUpgrade, let gift = state.starGiftsMap[giftId], let _ = gift.upgradeStars {
canUpgrade = true
}
var showUpgradePreview = false var showUpgradePreview = false
if state.inUpgradePreview, let _ = state.sampleGiftAttributes { if state.inUpgradePreview, let _ = state.sampleGiftAttributes {

View File

@ -1890,8 +1890,8 @@ public class TrimView: UIView {
effectiveHandleWidth = 16.0 effectiveHandleWidth = 16.0
fullTrackHeight = 33.0 fullTrackHeight = 33.0
capsuleOffset = 8.0 capsuleOffset = 8.0
color = .clear color = theme.chat.inputPanel.panelControlAccentColor
highlightColor = .clear highlightColor = theme.chat.inputPanel.panelControlAccentColor
self.zoneView.backgroundColor = UIColor(white: 1.0, alpha: 0.4) self.zoneView.backgroundColor = UIColor(white: 1.0, alpha: 0.4)
@ -1902,7 +1902,19 @@ public class TrimView: UIView {
context.fill(CGRect(origin: .zero, size: CGSize(width: 1.0, height: size.height))) context.fill(CGRect(origin: .zero, size: CGSize(width: 1.0, height: size.height)))
context.fill(CGRect(origin: CGPoint(x: size.width - 1.0, y: 0.0), size: CGSize(width: 1.0, height: size.height))) context.fill(CGRect(origin: CGPoint(x: size.width - 1.0, y: 0.0), size: CGSize(width: 1.0, height: size.height)))
})?.withRenderingMode(.alwaysTemplate).resizableImage(withCapInsets: UIEdgeInsets(top: 0.0, left: 1.0, bottom: 0.0, right: 1.0)) })?.withRenderingMode(.alwaysTemplate).resizableImage(withCapInsets: UIEdgeInsets(top: 0.0, left: 1.0, bottom: 0.0, right: 1.0))
let handleImage = generateImage(CGSize(width: effectiveHandleWidth, height: fullTrackHeight), rotatedContext: { size, context in
context.clear(CGRect(origin: .zero, size: size))
context.setFillColor(UIColor.white.cgColor)
let path = UIBezierPath(roundedRect: CGRect(origin: .zero, size: CGSize(width: size.width * 2.0, height: size.height)), cornerRadius: 16.5)
context.addPath(path.cgPath)
context.fillPath()
})?.withRenderingMode(.alwaysTemplate)
self.leftHandleView.image = handleImage
self.rightHandleView.image = handleImage
self.leftCapsuleView.backgroundColor = .white self.leftCapsuleView.backgroundColor = .white
self.rightCapsuleView.backgroundColor = .white self.rightCapsuleView.backgroundColor = .white
} }

View File

@ -1842,12 +1842,13 @@ public final class MessageInputPanelComponent: Component {
} }
} }
let lightFieldColor = UIColor(white: 1.0, alpha: 0.09) var lightFieldColor = UIColor(white: 1.0, alpha: 0.09)
var fieldBackgroundIsDark = false var fieldBackgroundIsDark = false
if component.useGrayBackground { if component.useGrayBackground {
fieldBackgroundIsDark = false fieldBackgroundIsDark = false
} else if component.style == .media { } else if component.style == .media {
fieldBackgroundIsDark = false fieldBackgroundIsDark = false
lightFieldColor = UIColor(white: 0.2, alpha: 0.45)
} else if self.textFieldExternalState.hasText && component.alwaysDarkWhenHasText { } else if self.textFieldExternalState.hasText && component.alwaysDarkWhenHasText {
fieldBackgroundIsDark = true fieldBackgroundIsDark = true
} else if isEditing || component.style == .story || component.style == .editor { } else if isEditing || component.style == .story || component.style == .editor {

View File

@ -898,7 +898,7 @@ func openResolvedUrlImpl(
func subject(for path: String) -> MediaEditorScreenImpl.Subject? { func subject(for path: String) -> MediaEditorScreenImpl.Subject? {
if path.hasSuffix(".jpg") { if path.hasSuffix(".jpg") {
if let image = UIImage(contentsOfFile: path) { if let image = UIImage(contentsOfFile: path)?.fixedOrientation() {
return .image(image: image, dimensions: PixelDimensions(image.size), additionalImage: nil, additionalImagePosition: .topLeft, fromCamera: false) return .image(image: image, dimensions: PixelDimensions(image.size), additionalImage: nil, additionalImagePosition: .topLeft, fromCamera: false)
} }
} else { } else {