Merge commit '22b5379d9cc71fc4154432522bc5391242c0bf7e'

This commit is contained in:
Ali 2021-08-27 18:46:36 +04:00
commit 3ee7c76820
44 changed files with 1478 additions and 193 deletions

View File

@ -6605,6 +6605,7 @@ Sorry for the inconvenience.";
"Conversation.ForwardOptions.SendMessages" = "Send Messages";
"Conversation.ForwardOptions.TapForOptions" = "Tap here for forwarding options";
"Conversation.ForwardOptions.TapForOptionsShort" = "Tap here for options";
"Conversation.ForwardOptions.UserMessageForwardVisible" = "%@ will see that it was forwarded";
"Conversation.ForwardOptions.UserMessageForwardHidden" = "%@ won't see that it was forwarded";
@ -6671,6 +6672,9 @@ Sorry for the inconvenience.";
"Notification.YouChangedTheme" = "You changed chat theme to %@";
"Notification.YouDisabledTheme" = "You disabled chat theme";
"Notification.ChannelChangedTheme" = "Channel theme changed to %2$@";
"Notification.ChannelDisabledTheme" = "Channel theme disabled";
"Appstore.Cloud" = "**Cloud-based**\nUnlimited storage for chats,\nmedia and documents.";
"Appstore.Cloud.Profile" = "**Jennifer**\n23 y.o. designer from San Francisco.";
"Appstore.Creative" = "**Creative**\nColor themes, stickers, GIFs,\nvideo messages and more.";

View File

@ -367,10 +367,20 @@ public struct ChatTextInputStateText: Codable, Equatable {
}
public enum ChatControllerSubject: Equatable {
public struct ForwardOptions: Equatable {
public let hideNames: Bool
public let hideCaptions: Bool
public init(hideNames: Bool, hideCaptions: Bool) {
self.hideNames = hideNames
self.hideCaptions = hideCaptions
}
}
case message(id: EngineMessage.Id, highlight: Bool, timecode: Double?)
case scheduledMessages
case pinnedMessages(id: EngineMessage.Id?)
case forwardedMessages(ids: [EngineMessage.Id], hideNames: Signal<Bool, NoError>, hideCaptions: Signal<Bool, NoError>)
case forwardedMessages(ids: [EngineMessage.Id], options: Signal<ForwardOptions, NoError>)
public static func ==(lhs: ChatControllerSubject, rhs: ChatControllerSubject) -> Bool {
switch lhs {
@ -392,8 +402,8 @@ public enum ChatControllerSubject: Equatable {
} else {
return false
}
case let .forwardedMessages(lhsIds, _, _):
if case let .forwardedMessages(rhsIds, _, _) = rhs, lhsIds == rhsIds {
case let .forwardedMessages(lhsIds, _):
if case let .forwardedMessages(rhsIds, _) = rhs, lhsIds == rhsIds {
return true
} else {
return false

View File

@ -120,6 +120,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
private let reactionSelected: (ReactionContextItem.Reaction) -> Void
private let beganAnimatingOut: () -> Void
private let attemptTransitionControllerIntoNavigation: () -> Void
fileprivate var dismissedForCancel: (() -> Void)?
private let getController: () -> ContextControllerProtocol?
private weak var gesture: ContextGesture?
private var displayTextSelectionTip: Bool
@ -478,6 +479,7 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
}
@objc private func dimNodeTapped() {
self.dismissedForCancel?()
self.beginDismiss(.default)
}
@ -1817,6 +1819,11 @@ public final class ContextController: ViewController, StandalonePresentableContr
public var reactionSelected: ((ReactionContextItem.Reaction) -> Void)?
public var dismissed: (() -> Void)?
public var dismissedForCancel: (() -> Void)? {
didSet {
self.controllerNode.dismissedForCancel = self.dismissedForCancel
}
}
public var useComplexItemsTransitionAnimation = false
public var immediateItemsTransitionAnimation = false
@ -1872,7 +1879,7 @@ public final class ContextController: ViewController, StandalonePresentableContr
override public func loadDisplayNode() {
self.displayNode = ContextControllerNode(account: self.account, controller: self, presentationData: self.presentationData, source: self.source, items: self.items, reactionItems: self.reactionItems, beginDismiss: { [weak self] result in
self?.dismiss(result: result, completion: nil)
}, recognizer: self.recognizer, gesture: self.gesture, reactionSelected: { [weak self] value in
}, recognizer: self.recognizer, gesture: self.gesture, reactionSelected: { [weak self] value in
guard let strongSelf = self else {
return
}
@ -1893,7 +1900,7 @@ public final class ContextController: ViewController, StandalonePresentableContr
break
}
}, displayTextSelectionTip: self.displayTextSelectionTip)
self.controllerNode.dismissedForCancel = self.dismissedForCancel
self.displayNodeDidLoad()
self._ready.set(combineLatest(queue: .mainQueue(), self.controllerNode.itemsReady.get(), self.controllerNode.contentReady.get())

View File

@ -4258,7 +4258,7 @@ public final class VoiceChatController: ViewController {
childrenSafeInsets.right = childrenSafeInsets.left + (size.width - contentLeftInset)
}
} else if !self.isLandscape, case .fullscreen = effectiveDisplayMode {
childrenInsets.bottom += self.effectiveBottomAreaHeight + fullscreenListHeight + 30.0
childrenInsets.bottom += self.effectiveBottomAreaHeight + fullscreenListHeight + 36.0
}
childrenLayout.safeInsets = childrenSafeInsets
childrenLayout.intrinsicInsets = childrenInsets

View File

@ -389,7 +389,7 @@ class VoiceChatFullscreenParticipantItemNode: ItemListRevealOptionsItemNode {
profileNode.frame = CGRect(origin: CGPoint(), size: extractedRect.size)
self.profileNode = profileNode
self.contextSourceNode.contentNode.addSubnode(profileNode)
profileNode.animateIn(from: self, targetRect: extractedRect, transition: transition)
var appearenceTransition = transition
if transition.isAnimated {
@ -706,20 +706,28 @@ class VoiceChatFullscreenParticipantItemNode: ItemListRevealOptionsItemNode {
audioLevelView.layer.mask = playbackMaskLayer
audioLevelView.setColor(wavesColor)
audioLevelView.alpha = strongSelf.isExtracted ? 0.0 : 1.0
strongSelf.audioLevelView = audioLevelView
strongSelf.offsetContainerNode.view.insertSubview(audioLevelView, at: 0)
if let _ = strongSelf.item, strongSelf.videoNode != nil && !active {
audioLevelView.alpha = 0.0
}
}
let level = min(1.0, max(0.0, CGFloat(value)))
if let audioLevelView = strongSelf.audioLevelView {
audioLevelView.updateLevel(CGFloat(value))
var hasVideo = false
if let videoNode = strongSelf.videoNode, videoNode.supernode == strongSelf.videoContainerNode, !videoNode.alpha.isZero {
hasVideo = true
}
var audioLevelAlpha: CGFloat = 1.0
if strongSelf.isExtracted {
audioLevelAlpha = 0.0
} else {
audioLevelAlpha = hasVideo ? 0.0 : 1.0
}
audioLevelView.alpha = audioLevelAlpha
let avatarScale: CGFloat
if value > 0.02 {
audioLevelView.startAnimating()

View File

@ -35,7 +35,7 @@ public let defaultServiceBackgroundColor = UIColor(rgb: 0x000000, alpha: 0.2)
public let defaultPresentationTheme = makeDefaultDayPresentationTheme(serviceBackgroundColor: defaultServiceBackgroundColor, day: false, preview: false)
public let defaultDayAccentColor = UIColor(rgb: 0x007ee5)
public func customizeDefaultDayTheme(theme: PresentationTheme, editing: Bool, title: String?, accentColor: UIColor?, backgroundColors: [UInt32], bubbleColors: [UInt32], animateBubbleColors: Bool?, wallpaper forcedWallpaper: TelegramWallpaper? = nil, serviceBackgroundColor: UIColor?) -> PresentationTheme {
public func customizeDefaultDayTheme(theme: PresentationTheme, specialMode: Bool = false, editing: Bool, title: String?, accentColor: UIColor?, backgroundColors: [UInt32], bubbleColors: [UInt32], animateBubbleColors: Bool?, wallpaper forcedWallpaper: TelegramWallpaper? = nil, serviceBackgroundColor: UIColor?) -> PresentationTheme {
if (theme.referenceTheme != .day && theme.referenceTheme != .dayClassic) {
return theme
}
@ -52,24 +52,110 @@ public func customizeDefaultDayTheme(theme: PresentationTheme, editing: Bool, ti
var suggestedWallpaper: TelegramWallpaper?
var bubbleColors = bubbleColors
if bubbleColors.isEmpty, editing {
if day {
let accentColor = accentColor ?? defaultDayAccentColor
bubbleColors = [accentColor.withMultiplied(hue: 0.966, saturation: 0.61, brightness: 0.98).rgb, accentColor.rgb]
} else {
if let accentColor = accentColor, !accentColor.alpha.isZero {
let hsb = accentColor.hsb
bubbleColors = [UIColor(hue: hsb.0, saturation: (hsb.1 > 0.0 && hsb.2 > 0.0) ? 0.14 : 0.0, brightness: 0.79 + hsb.2 * 0.21, alpha: 1.0).rgb]
if accentColor.lightness > 0.705 {
outgoingAccent = UIColor(hue: hsb.0, saturation: min(1.0, hsb.1 * 1.1), brightness: min(hsb.2, 0.6), alpha: 1.0)
} else {
outgoingAccent = accentColor
if specialMode, bubbleColors.count < 3, let color = bubbleColors.first.flatMap({ UIColor(rgb: $0) }) {
let colorHSB = color.hsb
if colorHSB.b > 0.9 {
let bubbleColor = color.withMultiplied(hue: 0.93, saturation: 1.0, brightness: 1.0)
bubbleColors = [bubbleColor.rgb]
let colorPairs: [(UInt32, UInt32)] = [
(0xe8f9d7, 0x6cd516),
(0xe7faff, 0x43b6f9),
(0xe3f7f5, 0x4ccbb8),
(0xfff3cf, 0xe8b816),
(0xfffac9, 0xe2c714),
(0xc5a61e, 0xd6b534)
]
func generateAccentColor(color: UIColor) -> UIColor {
var nearest: (color: (UInt32, UInt32), distance: Int32)?
for (sample, accentSample) in colorPairs {
let distance = color.distance(to: UIColor(rgb: sample))
if let currentNearest = nearest {
if distance < currentNearest.distance {
nearest = ((sample, accentSample), distance)
}
} else {
nearest = ((sample, accentSample), distance)
}
}
if let colors = nearest?.color {
let colorHsb = color.hsb
let similarColorHsb = UIColor(rgb: colors.0).hsb
let complementingColorHsb = UIColor(rgb: colors.1).hsb
let correction = (similarColorHsb.0 > 0.0 ? colorHsb.0 / similarColorHsb.0 : 1.0, similarColorHsb.1 > 0.0 ? colorHsb.1 / similarColorHsb.1 : 1.0, similarColorHsb.2 > 0.0 ? colorHsb.2 / similarColorHsb.2 : 1.0)
let correctedComplementingColor = UIColor(hue: min(1.0, complementingColorHsb.0 * correction.0), saturation: min(1.0, complementingColorHsb.1 * correction.1), brightness: min(1.0, complementingColorHsb.2 * correction.2), alpha: 1.0)
return correctedComplementingColor
} else {
return color
}
}
outgoingAccent = generateAccentColor(color: color)
// color.withMultiplied(hue: 1.01, saturation: 7.8, brightness: 0.9)
} else {
let bubbleColor = color.withMultiplied(hue: 1.014, saturation: 0.12, brightness: 1.29)
bubbleColors = [bubbleColor.rgb]
outgoingAccent = color
}
suggestedWallpaper = .gradient(TelegramWallpaper.Gradient(id: nil, colors: defaultBuiltinWallpaperGradientColors.map(\.rgb), settings: WallpaperSettings()))
// float[] colorHsv = getTempHsv(5);
// Color.colorToHSV(color, colorHsv);
//
// final float diffH = Math.min(Math.abs(colorHsv[0] - baseHsv[0]), Math.abs(colorHsv[0] - baseHsv[0] - 360f));
// if (diffH > 30f) {
// return color;
// }
//
// float dist = Math.min(1.5f * colorHsv[1] / baseHsv[1], 1f);
//
// colorHsv[0] = colorHsv[0] + accentHsv[0] - baseHsv[0];
// colorHsv[1] = colorHsv[1] * accentHsv[1] / baseHsv[1];
// colorHsv[2] = colorHsv[2] * (1f - dist + dist * accentHsv[2] / baseHsv[2]);
//
// int newColor = Color.HSVToColor(Color.alpha(color), colorHsv);
//
// float origBrightness = AndroidUtilities.computePerceivedBrightness(color);
// float newBrightness = AndroidUtilities.computePerceivedBrightness(newColor);
//
// // We need to keep colors lighter in dark themes and darker in light themes
// boolean needRevertBrightness = isDarkTheme ? origBrightness > newBrightness : origBrightness < newBrightness;
//
// if (needRevertBrightness) {
// float amountOfNew = 0.6f;
// float fallbackAmount = (1f - amountOfNew) * origBrightness / newBrightness + amountOfNew;
// newColor = changeBrightness(newColor, fallbackAmount);
// }
//
// return newColor;
// outgoingAccent = color.withMultiplied(hue: 1.035, saturation: 4.294, brightness: 1.289)
//
// let bubbleColor = color.withMultiplied(hue: 1.014, saturation: 0.101, brightness: 1.289)
// bubbleColors = [bubbleColor.rgb]
} else {
if bubbleColors.isEmpty, editing {
if day {
let accentColor = accentColor ?? defaultDayAccentColor
bubbleColors = [accentColor.withMultiplied(hue: 0.966, saturation: 0.61, brightness: 0.98).rgb, accentColor.rgb]
} else {
bubbleColors = [UIColor(rgb: 0xe1ffc7).rgb]
suggestedWallpaper = .gradient(TelegramWallpaper.Gradient(id: nil, colors: defaultBuiltinWallpaperGradientColors.map(\.rgb), settings: WallpaperSettings()))
if let accentColor = accentColor, !accentColor.alpha.isZero {
let hsb = accentColor.hsb
bubbleColors = [UIColor(hue: hsb.0, saturation: (hsb.1 > 0.0 && hsb.2 > 0.0) ? 0.14 : 0.0, brightness: 0.79 + hsb.2 * 0.21, alpha: 1.0).rgb]
if accentColor.lightness > 0.705 {
outgoingAccent = UIColor(hue: hsb.0, saturation: min(1.0, hsb.1 * 1.1), brightness: min(hsb.2, 0.6), alpha: 1.0)
} else {
outgoingAccent = accentColor
}
suggestedWallpaper = .gradient(TelegramWallpaper.Gradient(id: nil, colors: defaultBuiltinWallpaperGradientColors.map(\.rgb), settings: WallpaperSettings()))
} else {
bubbleColors = [UIColor(rgb: 0xe1ffc7).rgb]
suggestedWallpaper = .gradient(TelegramWallpaper.Gradient(id: nil, colors: defaultBuiltinWallpaperGradientColors.map(\.rgb), settings: WallpaperSettings()))
}
}
}
}
@ -168,7 +254,7 @@ public func customizeDefaultDayTheme(theme: PresentationTheme, editing: Bool, ti
outgoingLinkTextColor = outgoingAccent
outgoingScamColor = UIColor(rgb: 0xff3b30)
outgoingControlColor = outgoingAccent
outgoingInactiveControlColor = outgoingAccent //1111
outgoingInactiveControlColor = outgoingAccent
outgoingFileTitleColor = outgoingAccent
outgoingPollsProgressColor = accentColor
outgoingSelectionColor = outgoingAccent.withMultiplied(hue: 1.0, saturation: 1.292, brightness: 0.871)

View File

@ -19,13 +19,13 @@ public func makeDefaultPresentationTheme(reference: PresentationBuiltinThemeRefe
return theme
}
public func customizePresentationTheme(_ theme: PresentationTheme, editing: Bool, title: String? = nil, accentColor: UIColor?, backgroundColors: [UInt32], bubbleColors: [UInt32], animateBubbleColors: Bool?, wallpaper: TelegramWallpaper? = nil, baseColor: PresentationThemeBaseColor? = nil) -> PresentationTheme {
public func customizePresentationTheme(_ theme: PresentationTheme, specialMode: Bool = false, editing: Bool, title: String? = nil, accentColor: UIColor?, backgroundColors: [UInt32], bubbleColors: [UInt32], animateBubbleColors: Bool?, wallpaper: TelegramWallpaper? = nil, baseColor: PresentationThemeBaseColor? = nil) -> PresentationTheme {
if accentColor == nil && bubbleColors.isEmpty && backgroundColors.isEmpty && wallpaper == nil {
return theme
}
switch theme.referenceTheme {
case .day, .dayClassic:
return customizeDefaultDayTheme(theme: theme, editing: editing, title: title, accentColor: accentColor, backgroundColors: backgroundColors, bubbleColors: bubbleColors, animateBubbleColors: animateBubbleColors ?? false, wallpaper: wallpaper, serviceBackgroundColor: nil)
return customizeDefaultDayTheme(theme: theme, specialMode: specialMode, editing: editing, title: title, accentColor: accentColor, backgroundColors: backgroundColors, bubbleColors: bubbleColors, animateBubbleColors: animateBubbleColors ?? false, wallpaper: wallpaper, serviceBackgroundColor: nil)
case .night:
return customizeDefaultDarkPresentationTheme(theme: theme, editing: editing, title: title, accentColor: accentColor, backgroundColors: backgroundColors, bubbleColors: bubbleColors, animateBubbleColors: animateBubbleColors ?? false, wallpaper: wallpaper, baseColor: baseColor)
case .nightAccent:
@ -33,17 +33,17 @@ public func customizePresentationTheme(_ theme: PresentationTheme, editing: Bool
}
}
public func makePresentationTheme(settings: TelegramThemeSettings, title: String? = nil, serviceBackgroundColor: UIColor? = nil) -> PresentationTheme? {
public func makePresentationTheme(settings: TelegramThemeSettings, specialMode: Bool = false, title: String? = nil, serviceBackgroundColor: UIColor? = nil) -> PresentationTheme? {
let defaultTheme = makeDefaultPresentationTheme(reference: PresentationBuiltinThemeReference(baseTheme: settings.baseTheme), extendingThemeReference: nil, serviceBackgroundColor: serviceBackgroundColor, preview: false)
return customizePresentationTheme(defaultTheme, editing: true, title: title, accentColor: UIColor(argb: settings.accentColor), backgroundColors: [], bubbleColors: settings.messageColors, animateBubbleColors: settings.animateMessageColors, wallpaper: settings.wallpaper)
return customizePresentationTheme(defaultTheme, specialMode: specialMode, editing: true, title: title, accentColor: UIColor(argb: settings.accentColor), backgroundColors: [], bubbleColors: settings.messageColors, animateBubbleColors: settings.animateMessageColors, wallpaper: settings.wallpaper)
}
public func makePresentationTheme(mediaBox: MediaBox, themeReference: PresentationThemeReference, extendingThemeReference: PresentationThemeReference? = nil, accentColor: UIColor? = nil, backgroundColors: [UInt32] = [], bubbleColors: [UInt32] = [], animateBubbleColors: Bool? = nil, wallpaper: TelegramWallpaper? = nil, baseColor: PresentationThemeBaseColor? = nil, serviceBackgroundColor: UIColor? = nil, preview: Bool = false) -> PresentationTheme? {
public func makePresentationTheme(mediaBox: MediaBox, themeReference: PresentationThemeReference, extendingThemeReference: PresentationThemeReference? = nil, accentColor: UIColor? = nil, backgroundColors: [UInt32] = [], bubbleColors: [UInt32] = [], animateBubbleColors: Bool? = nil, wallpaper: TelegramWallpaper? = nil, baseColor: PresentationThemeBaseColor? = nil, serviceBackgroundColor: UIColor? = nil, specialMode: Bool = false, preview: Bool = false) -> PresentationTheme? {
let theme: PresentationTheme
switch themeReference {
case let .builtin(reference):
let defaultTheme = makeDefaultPresentationTheme(reference: reference, extendingThemeReference: extendingThemeReference, serviceBackgroundColor: serviceBackgroundColor, preview: preview)
theme = customizePresentationTheme(defaultTheme, editing: true, accentColor: accentColor, backgroundColors: backgroundColors, bubbleColors: bubbleColors, animateBubbleColors: animateBubbleColors, wallpaper: wallpaper, baseColor: baseColor)
theme = customizePresentationTheme(defaultTheme, specialMode: specialMode, editing: true, accentColor: accentColor, backgroundColors: backgroundColors, bubbleColors: bubbleColors, animateBubbleColors: animateBubbleColors, wallpaper: wallpaper, baseColor: baseColor)
case let .local(info):
if let path = mediaBox.completedResourcePath(info.resource), let data = try? Data(contentsOf: URL(fileURLWithPath: path), options: .mappedRead), let loadedTheme = makePresentationTheme(data: data, themeReference: themeReference, resolvedWallpaper: info.resolvedWallpaper) {
theme = customizePresentationTheme(loadedTheme, editing: false, accentColor: accentColor, backgroundColors: backgroundColors, bubbleColors: bubbleColors, animateBubbleColors: animateBubbleColors, wallpaper: wallpaper)

View File

@ -258,7 +258,7 @@ public struct PresentationResourcesChat {
public static func chatInputMediaPanelSavedStickersIcon(_ theme: PresentationTheme) -> UIImage? {
return theme.image(PresentationResourceKey.chatInputMediaPanelSavedStickersIconImage.rawValue, { theme in
return generateImage(CGSize(width: 26.0, height: 26.0), contextGenerator: { size, context in
return generateImage(CGSize(width: 42.0, height: 42.0), contextGenerator: { size, context in
context.clear(CGRect(origin: CGPoint(), size: size))
if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Media/SavedStickersTabIcon"), color: theme.chat.inputMediaPanel.panelIconColor) {
context.draw(image.cgImage!, in: CGRect(origin: CGPoint(x: floor((size.width - image.size.width) / 2.0), y: floor((size.height - image.size.height) / 2.0)), size: image.size))
@ -269,7 +269,7 @@ public struct PresentationResourcesChat {
public static func chatInputMediaPanelStickersModeIcon(_ theme: PresentationTheme) -> UIImage? {
return theme.image(PresentationResourceKey.chatInputMediaPanelStickersModeIcon.rawValue, { theme in
return generateImage(CGSize(width: 26.0, height: 26.0), contextGenerator: { size, context in
return generateImage(CGSize(width: 42.0, height: 42.0), contextGenerator: { size, context in
context.clear(CGRect(origin: CGPoint(), size: size))
if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Media/StickersMode"), color: theme.chat.inputMediaPanel.panelIconColor) {
context.draw(image.cgImage!, in: CGRect(origin: CGPoint(x: floor((size.width - image.size.width) / 2.0), y: floor((size.height - image.size.height) / 2.0)), size: image.size))
@ -280,7 +280,7 @@ public struct PresentationResourcesChat {
public static func chatInputMediaPanelTrendingGifsIcon(_ theme: PresentationTheme) -> UIImage? {
return theme.image(PresentationResourceKey.chatInputMediaPanelTrendingGifsIcon.rawValue, { theme in
return generateImage(CGSize(width: 26.0, height: 26.0), contextGenerator: { size, context in
return generateImage(CGSize(width: 42.0, height: 42.0), contextGenerator: { size, context in
context.clear(CGRect(origin: CGPoint(), size: size))
if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Media/TrendingGifs"), color: theme.chat.inputMediaPanel.panelIconColor) {
context.draw(image.cgImage!, in: CGRect(origin: CGPoint(x: floor((size.width - image.size.width) / 2.0), y: floor((size.height - image.size.height) / 2.0)), size: image.size))
@ -291,7 +291,7 @@ public struct PresentationResourcesChat {
public static func chatInputMediaPanelRecentStickersIcon(_ theme: PresentationTheme) -> UIImage? {
return theme.image(PresentationResourceKey.chatInputMediaPanelRecentStickersIconImage.rawValue, { theme in
return generateImage(CGSize(width: 26.0, height: 26.0), contextGenerator: { size, context in
return generateImage(CGSize(width: 42.0, height: 42.0), contextGenerator: { size, context in
context.clear(CGRect(origin: CGPoint(), size: size))
if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Media/RecentTabIcon"), color: theme.chat.inputMediaPanel.panelIconColor) {
context.draw(image.cgImage!, in: CGRect(origin: CGPoint(x: floor((size.width - image.size.width) / 2.0), y: floor((size.height - image.size.height) / 2.0)), size: image.size))
@ -302,7 +302,7 @@ public struct PresentationResourcesChat {
public static func chatInputMediaPanelRecentGifsIconImage(_ theme: PresentationTheme) -> UIImage? {
return theme.image(PresentationResourceKey.chatInputMediaPanelRecentGifsIconImage.rawValue, { theme in
return generateImage(CGSize(width: 26.0, height: 26.0), contextGenerator: { size, context in
return generateImage(CGSize(width: 42.0, height: 42.0), contextGenerator: { size, context in
context.clear(CGRect(origin: CGPoint(), size: size))
if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Input/Media/GifsTabIcon"), color: theme.chat.inputMediaPanel.panelIconColor) {
context.draw(image.cgImage!, in: CGRect(origin: CGPoint(x: floor((size.width - image.size.width) / 2.0), y: floor((size.height - image.size.height) / 2.0)), size: image.size))

View File

@ -531,7 +531,9 @@ public func universalServiceMessageString(presentationData: (PresentationTheme,
attributedString = addAttributesToStringWithRanges(resultTitleString._tuple, body: bodyAttributes, argumentAttributes: peerMentionsAttributes(primaryTextColor: primaryTextColor, peerIds: attributePeerIds))
case let .setChatTheme(emoji):
if emoji.isEmpty {
if message.author?.id == accountPeerId {
if message.author?.id.namespace == Namespaces.Peer.CloudChannel {
attributedString = NSAttributedString(string: strings.Notification_ChannelDisabledTheme, font: titleFont, textColor: primaryTextColor)
} else if message.author?.id == accountPeerId {
attributedString = NSAttributedString(string: strings.Notification_YouDisabledTheme, font: titleFont, textColor: primaryTextColor)
} else {
let attributePeerIds: [(Int, PeerId?)] = [(0, message.author?.id)]
@ -539,7 +541,9 @@ public func universalServiceMessageString(presentationData: (PresentationTheme,
attributedString = addAttributesToStringWithRanges(resultTitleString._tuple, body: bodyAttributes, argumentAttributes: peerMentionsAttributes(primaryTextColor: primaryTextColor, peerIds: attributePeerIds))
}
} else {
if message.author?.id == accountPeerId {
if message.author?.id.namespace == Namespaces.Peer.CloudChannel {
attributedString = NSAttributedString(string: strings.Notification_ChannelChangedTheme(emoji).string, font: titleFont, textColor: primaryTextColor)
} else if message.author?.id == accountPeerId {
attributedString = NSAttributedString(string: strings.Notification_YouChangedTheme(emoji).string, font: titleFont, textColor: primaryTextColor)
} else {
let resultTitleString = strings.Notification_ChangedTheme(authorName, emoji)

View File

@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "ic_input_gifs.pdf",
"filename" : "gif_48.pdf",
"idiom" : "universal"
}
],

View File

@ -0,0 +1,249 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 30.400024 17.342773 cm
0.000000 0.000000 0.000000 scn
-1.328000 2.657227 m
-1.328000 1.923792 -0.733434 1.329226 0.000000 1.329226 c
0.733434 1.329226 1.328000 1.923792 1.328000 2.657227 c
-1.328000 2.657227 l
h
4.000000 9.329226 m
4.733434 9.329226 5.328000 9.923793 5.328000 10.657227 c
5.328000 11.390660 4.733434 11.985227 4.000000 11.985227 c
4.000000 9.329226 l
h
1.328000 2.657227 m
1.328000 9.377226 l
-1.328000 9.377226 l
-1.328000 2.657227 l
1.328000 2.657227 l
h
1.280000 9.329226 m
4.000000 9.329226 l
4.000000 11.985227 l
1.280000 11.985227 l
1.280000 9.329226 l
h
1.328000 9.377226 m
1.328000 9.492270 1.328034 9.578946 1.329198 9.653058 c
1.330364 9.727207 1.332460 9.769691 1.334489 9.794523 c
1.338678 9.845800 1.338141 9.750368 1.270451 9.617519 c
-1.096062 10.823318 l
-1.250946 10.519341 -1.295081 10.226333 -1.312690 10.010806 c
-1.329033 9.810783 -1.328000 9.579334 -1.328000 9.377226 c
1.328000 9.377226 l
h
1.280000 11.985227 m
1.077892 11.985227 0.846443 11.986259 0.646420 11.969916 c
0.430894 11.952308 0.137886 11.908173 -0.166092 11.753288 c
1.039707 9.386775 l
0.906858 9.319085 0.811426 9.318548 0.862703 9.322738 c
0.887536 9.324766 0.930019 9.326862 1.004169 9.328028 c
1.078280 9.329193 1.164957 9.329226 1.280000 9.329226 c
1.280000 11.985227 l
h
1.270451 9.617519 m
1.219830 9.518170 1.139057 9.437396 1.039707 9.386775 c
-0.166092 11.753288 l
-0.566501 11.549270 -0.892043 11.223727 -1.096062 10.823318 c
1.270451 9.617519 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 30.400024 22.144531 cm
0.000000 0.000000 0.000000 scn
0.000000 3.183762 m
-0.733434 3.183762 -1.328000 2.589196 -1.328000 1.855762 c
-1.328000 1.122328 -0.733434 0.527762 0.000000 0.527762 c
0.000000 3.183762 l
h
4.000000 0.527762 m
4.733434 0.527762 5.328000 1.122328 5.328000 1.855762 c
5.328000 2.589196 4.733434 3.183762 4.000000 3.183762 c
4.000000 0.527762 l
h
0.000000 0.527762 m
4.000000 0.527762 l
4.000000 3.183762 l
0.000000 3.183762 l
0.000000 0.527762 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 24.799927 17.343750 cm
0.000000 0.000000 0.000000 scn
2.128000 10.656250 m
2.128000 11.389684 1.533434 11.984250 0.800000 11.984250 c
0.066566 11.984250 -0.528000 11.389684 -0.528000 10.656250 c
2.128000 10.656250 l
h
-0.528000 2.656250 m
-0.528000 1.922815 0.066566 1.328250 0.800000 1.328250 c
1.533434 1.328250 2.128000 1.922815 2.128000 2.656250 c
-0.528000 2.656250 l
h
-0.528000 10.656250 m
-0.528000 2.656250 l
2.128000 2.656250 l
2.128000 10.656250 l
-0.528000 10.656250 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 13.599976 17.343750 cm
0.000000 0.000000 0.000000 scn
5.231635 9.028395 m
5.882138 8.689614 6.684110 8.942316 7.022890 9.592818 c
7.361670 10.243321 7.108968 11.045293 6.458466 11.384073 c
5.231635 9.028395 l
h
7.584592 5.588284 m
8.889243 5.340351 l
8.901488 5.404787 l
8.907325 5.470116 l
7.584592 5.588284 l
h
5.600000 7.984250 m
4.866566 7.984250 4.272000 7.389684 4.272000 6.656250 c
4.272000 5.922816 4.866566 5.328250 5.600000 5.328250 c
5.600000 7.984250 l
h
6.458466 11.384073 m
5.721497 11.767884 4.884068 11.984250 4.000000 11.984250 c
4.000000 9.328250 l
4.446894 9.328250 4.864512 9.219591 5.231635 9.028395 c
6.458466 11.384073 l
h
4.000000 11.984250 m
1.057427 11.984250 -1.328000 9.598824 -1.328000 6.656250 c
1.328000 6.656250 l
1.328000 8.131955 2.524295 9.328250 4.000000 9.328250 c
4.000000 11.984250 l
h
-1.328000 6.656250 m
-1.328000 3.713677 1.057427 1.328250 4.000000 1.328250 c
4.000000 3.984250 l
2.524295 3.984250 1.328000 5.180545 1.328000 6.656250 c
-1.328000 6.656250 l
h
4.000000 1.328250 m
6.144260 1.328250 8.394547 2.737200 8.889243 5.340351 c
6.279942 5.836216 l
6.056704 4.661514 5.055740 3.984250 4.000000 3.984250 c
4.000000 1.328250 l
h
8.907325 5.470116 m
8.956036 6.015371 l
6.310571 6.251707 l
6.261860 5.706451 l
8.907325 5.470116 l
h
7.155208 7.984250 m
5.600000 7.984250 l
5.600000 5.328250 l
7.155208 5.328250 l
7.155208 7.984250 l
h
8.956036 6.015371 m
9.050537 7.073197 8.217244 7.984250 7.155208 7.984250 c
7.155208 5.328250 l
6.657084 5.328250 6.266247 5.755558 6.310571 6.251707 c
8.956036 6.015371 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 5.599976 2.943848 cm
0.000000 0.000000 0.000000 scn
35.472000 21.056055 m
35.472000 11.627451 27.828604 3.984055 18.400000 3.984055 c
18.400000 1.328056 l
29.295473 1.328056 38.127998 10.160582 38.127998 21.056055 c
35.472000 21.056055 l
h
18.400000 3.984055 m
8.971395 3.984055 1.328000 11.627451 1.328000 21.056055 c
-1.328000 21.056055 l
-1.328000 10.160582 7.504526 1.328056 18.400000 1.328056 c
18.400000 3.984055 l
h
1.328000 21.056055 m
1.328000 30.484661 8.971395 38.128056 18.400000 38.128056 c
18.400000 40.784054 l
7.504526 40.784054 -1.328000 31.951529 -1.328000 21.056055 c
1.328000 21.056055 l
h
18.400000 38.128056 m
27.828604 38.128056 35.472000 30.484661 35.472000 21.056055 c
38.127998 21.056055 l
38.127998 31.951529 29.295473 40.784054 18.400000 40.784054 c
18.400000 38.128056 l
h
f
n
Q
endstream
endobj
3 0 obj
5025
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 48.000000 48.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000005115 00000 n
0000005138 00000 n
0000005311 00000 n
0000005385 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
5444
%%EOF

View File

@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "ic_input_recent.pdf",
"filename" : "recent_48.pdf",
"idiom" : "universal"
}
],

View File

@ -0,0 +1,89 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 4.271973 4.271973 cm
0.000000 0.000000 0.000000 scn
2.656000 19.728054 m
2.656000 29.156660 10.299395 36.800056 19.728001 36.800056 c
29.156605 36.800056 36.799999 29.156660 36.799999 19.728054 c
36.799999 10.299450 29.156605 2.656055 19.728001 2.656055 c
10.299395 2.656055 2.656000 10.299450 2.656000 19.728054 c
h
19.728001 39.456055 m
8.832526 39.456055 0.000000 30.623528 0.000000 19.728054 c
0.000000 8.832581 8.832526 0.000057 19.728001 0.000057 c
30.623474 0.000057 39.455997 8.832581 39.455997 19.728054 c
39.455997 30.623528 30.623474 39.456055 19.728001 39.456055 c
h
21.056000 30.928055 m
21.056000 31.661489 20.461435 32.256054 19.728001 32.256054 c
18.994566 32.256054 18.400002 31.661489 18.400002 30.928055 c
18.400002 20.440632 l
18.400002 19.610584 18.752302 18.819542 19.369272 18.264267 c
26.839615 11.540958 l
27.384773 11.050316 28.224453 11.094513 28.715096 11.639668 c
29.205738 12.184826 29.161543 13.024506 28.616386 13.515148 c
21.146042 20.238457 l
21.088728 20.290041 21.056000 20.363525 21.056000 20.440632 c
21.056000 30.928055 l
h
f*
n
Q
endstream
endobj
3 0 obj
1137
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 48.000000 48.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000001227 00000 n
0000001250 00000 n
0000001423 00000 n
0000001497 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
1556
%%EOF

View File

@ -1,22 +1,12 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "StickerKeyboardFavoriteTab@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "StickerKeyboardFavoriteTab@3x.png",
"scale" : "3x"
"filename" : "fave_48.pdf",
"idiom" : "universal"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}

View File

@ -0,0 +1,247 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 5.000000 3.946289 cm
0.000000 0.000000 0.000000 scn
8.635828 2.820679 m
9.321689 1.681164 l
8.635828 2.820679 l
h
9.731453 16.567810 m
10.600920 17.574253 l
9.731453 16.567810 l
h
1.384685 25.091970 m
1.496809 23.766705 l
1.384685 25.091970 l
h
1.051567 24.066368 m
1.921034 25.072811 l
1.051567 24.066368 l
h
20.038393 37.786930 m
18.814356 37.266705 l
20.038393 37.786930 l
h
18.961609 37.786930 m
17.737572 38.307156 l
18.961609 37.786930 l
h
26.180216 26.059437 m
26.292339 27.384703 l
26.180216 26.059437 l
h
24.508167 27.270023 m
23.284132 26.749798 l
24.508167 27.270023 l
h
37.948433 24.066368 m
38.817898 23.059925 l
37.948433 24.066368 l
h
37.615314 25.091970 m
37.503193 23.766705 l
37.615314 25.091970 l
h
28.628592 14.598795 m
27.333555 14.295841 l
28.628592 14.598795 l
h
29.268547 16.567810 m
28.399080 17.574253 l
29.268547 16.567810 l
h
30.364174 2.820679 m
31.050034 3.960194 l
31.050034 3.960194 l
30.364174 2.820679 l
h
31.235470 3.455151 m
32.530506 3.758102 l
31.235470 3.455151 l
h
19.801676 9.178118 m
19.115814 8.038603 l
19.115814 8.038603 l
19.801676 9.178118 l
h
19.115814 8.038603 m
29.678312 1.681164 l
31.050034 3.960194 l
20.487535 10.317635 l
19.115814 8.038603 l
h
32.530506 3.758102 m
29.923628 14.901747 l
27.333555 14.295841 l
29.940432 3.152195 l
32.530506 3.758102 l
h
30.138014 15.561367 m
38.817898 23.059925 l
37.078964 25.072811 l
28.399080 17.574253 l
30.138014 15.561367 l
h
37.727440 26.417236 m
26.292339 27.384703 l
26.068092 24.734173 l
37.503193 23.766705 l
37.727440 26.417236 l
h
25.732204 27.790249 m
21.262428 38.307156 l
18.814356 37.266705 l
23.284132 26.749798 l
25.732204 27.790249 l
h
17.737572 38.307156 m
13.267798 27.790249 l
15.715871 26.749798 l
20.185644 37.266705 l
17.737572 38.307156 l
h
12.707662 27.384703 m
1.272561 26.417236 l
1.496809 23.766705 l
12.931910 24.734173 l
12.707662 27.384703 l
h
0.182100 23.059925 m
8.861986 15.561367 l
10.600920 17.574253 l
1.921034 25.072811 l
0.182100 23.059925 l
h
9.076371 14.901747 m
6.469495 3.758102 l
9.059568 3.152195 l
11.666444 14.295841 l
9.076371 14.901747 l
h
9.321689 1.681164 m
19.884186 8.038603 l
18.512465 10.317635 l
7.949968 3.960194 l
9.321689 1.681164 l
h
6.469495 3.758102 m
6.083770 2.109238 7.870839 0.807915 9.321689 1.681164 c
7.949968 3.960194 l
8.514397 4.299919 9.209628 3.793659 9.059568 3.152195 c
6.469495 3.758102 l
h
8.861986 15.561367 m
9.050550 15.398468 9.133131 15.144379 9.076371 14.901747 c
11.666444 14.295841 l
11.948550 15.501760 11.538106 16.764618 10.600920 17.574253 c
8.861986 15.561367 l
h
1.272561 26.417236 m
-0.416872 26.274302 -1.100905 24.168316 0.182100 23.059925 c
1.921034 25.072811 l
2.420168 24.641609 2.154054 23.822311 1.496809 23.766705 c
1.272561 26.417236 l
h
13.267798 27.790249 m
13.170667 27.561710 12.955100 27.405638 12.707662 27.384703 c
12.931910 24.734173 l
14.161719 24.838221 15.233116 25.613928 15.715871 26.749798 c
13.267798 27.790249 l
h
21.262428 38.307156 m
20.601709 39.861759 18.398293 39.861763 17.737572 38.307156 c
20.185644 37.266705 l
19.928600 36.661911 19.071398 36.661915 18.814356 37.266705 c
21.262428 38.307156 l
h
26.292339 27.384703 m
26.044901 27.405638 25.829334 27.561710 25.732204 27.790249 c
23.284132 26.749798 l
23.766886 25.613926 24.838282 24.838221 26.068092 24.734173 c
26.292339 27.384703 l
h
38.817898 23.059925 m
40.100903 24.168312 39.416878 26.274300 37.727440 26.417236 c
37.503193 23.766705 l
36.845943 23.822311 36.579834 24.641613 37.078964 25.072811 c
38.817898 23.059925 l
h
29.923628 14.901747 m
29.866869 15.144379 29.949450 15.398466 30.138014 15.561367 c
28.399080 17.574253 l
27.461895 16.764618 27.051451 15.501762 27.333555 14.295841 c
29.923628 14.901747 l
h
29.678312 1.681164 m
31.129168 0.807911 32.916229 2.109245 32.530506 3.758102 c
29.940432 3.152195 l
29.790373 3.793655 30.485600 4.299923 31.050034 3.960194 c
29.678312 1.681164 l
h
20.487535 10.317635 m
19.879963 10.683325 19.120041 10.683329 18.512465 10.317635 c
19.884186 8.038603 l
19.647816 7.896336 19.352180 7.896338 19.115814 8.038603 c
20.487535 10.317635 l
h
f
n
Q
endstream
endobj
3 0 obj
4135
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 48.000000 48.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000004225 00000 n
0000004248 00000 n
0000004421 00000 n
0000004495 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
4554
%%EOF

View File

@ -1,22 +1,12 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "StickerKeyboardSettingsIcon@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "StickerKeyboardSettingsIcon@3x.png",
"scale" : "3x"
"filename" : "settings_48.pdf",
"idiom" : "universal"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
"author" : "xcode",
"version" : 1
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,198 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 3.500000 3.500000 cm
0.000000 0.000000 0.000000 scn
22.000000 39.500000 m
22.000000 40.328426 21.328428 41.000000 20.500000 41.000000 c
19.671574 41.000000 19.000000 40.328426 19.000000 39.500000 c
19.000000 38.338337 l
19.000000 37.690460 18.579983 37.117363 17.962181 36.922268 c
17.088881 36.646984 l
16.504770 36.524204 15.932035 36.370529 15.372461 36.187752 c
14.486683 35.991013 l
13.854101 35.851067 13.203807 36.137375 12.879869 36.698452 c
12.299038 37.704483 l
11.884825 38.421921 10.967439 38.667736 10.250000 38.253521 c
9.532561 37.839306 9.286749 36.921921 9.700962 36.204483 c
10.281794 35.198452 l
10.605731 34.637375 10.528535 33.931049 10.091049 33.453190 c
9.444299 32.748505 l
9.026765 32.371395 8.628606 31.973236 8.251495 31.555702 c
7.546809 30.908951 l
7.068950 30.471466 6.362623 30.394268 5.801547 30.718206 c
4.795517 31.299038 l
4.078078 31.713251 3.160693 31.467438 2.746479 30.750000 c
2.332266 30.032562 2.578078 29.115175 3.295517 28.700962 c
4.301547 28.120131 l
4.862623 27.796192 5.148933 27.145899 5.008989 26.513317 c
4.812248 25.627539 l
4.629469 25.067965 4.475796 24.495230 4.353016 23.911119 c
4.077733 23.037819 l
3.882637 22.420017 3.309538 22.000000 2.661662 22.000000 c
1.500000 22.000000 l
0.671573 22.000000 0.000000 21.328426 0.000000 20.500000 c
0.000000 19.671572 0.671573 19.000000 1.500000 19.000000 c
2.661662 19.000000 l
3.309538 19.000000 3.882637 18.579983 4.077733 17.962181 c
4.353333 17.087372 l
4.475950 16.504307 4.629352 15.932577 4.811759 15.373960 c
5.008989 14.486683 l
5.148933 13.854101 4.862623 13.203808 4.301547 12.879869 c
3.295517 12.299038 l
2.578078 11.884825 2.332266 10.967440 2.746479 10.250000 c
3.160693 9.532560 4.078078 9.286747 4.795517 9.700962 c
5.801547 10.281792 l
6.362623 10.605730 7.068950 10.528536 7.546809 10.091049 c
8.250140 9.445797 l
8.627652 9.027718 9.026265 8.629059 9.444299 8.251495 c
10.091049 7.546806 l
10.528535 7.068951 10.605731 6.362625 10.281794 5.801548 c
9.700962 4.795517 l
9.286749 4.078079 9.532561 3.160690 10.250000 2.746479 c
10.967439 2.332264 11.884825 2.578079 12.299038 3.295517 c
12.879869 4.301548 l
13.203807 4.862625 13.854101 5.148933 14.486683 5.008987 c
15.384456 4.808334 l
15.943589 4.626175 16.515841 4.473072 17.099430 4.350803 c
17.962181 4.077732 l
18.125601 4.015381 l
18.652878 3.777821 19.000000 3.250641 19.000000 2.661663 c
19.000000 1.500000 l
19.010092 1.325066 l
19.096739 0.579060 19.730747 0.000000 20.500000 0.000000 c
21.328428 0.000000 22.000000 0.671574 22.000000 1.500000 c
22.000000 2.661663 l
22.010246 2.836273 l
22.078001 3.410614 22.476181 3.900372 23.037819 4.077732 c
23.905090 4.351749 l
24.486071 4.473644 25.055811 4.626099 25.612547 4.807358 c
26.513317 5.008987 l
27.145899 5.148933 27.796192 4.862625 28.120131 4.301548 c
28.700962 3.295517 l
29.115175 2.578079 30.032560 2.332264 30.750000 2.746479 c
31.467440 3.160690 31.713253 4.078079 31.299038 4.795517 c
30.718208 5.801548 l
30.394270 6.362625 30.471464 7.068951 30.908951 7.546806 c
31.555702 8.251495 l
31.973736 8.629059 32.372349 9.027718 32.749863 9.445797 c
33.453194 10.091049 l
33.931049 10.528536 34.637375 10.605730 35.198452 10.281792 c
36.204483 9.700962 l
36.921921 9.286747 37.839310 9.532560 38.253521 10.250000 c
38.667736 10.967440 38.421921 11.884825 37.704483 12.299038 c
36.698452 12.879869 l
36.137375 13.203808 35.851067 13.854101 35.991013 14.486683 c
36.192642 15.387453 l
36.373901 15.944189 36.526356 16.513929 36.648251 17.094910 c
36.922268 17.962181 l
37.117363 18.579983 37.690460 19.000000 38.338337 19.000000 c
39.500000 19.000000 l
40.328426 19.000000 41.000000 19.671572 41.000000 20.500000 c
41.000000 21.328426 40.328426 22.000000 39.500000 22.000000 c
38.338337 22.000000 l
37.690460 22.000000 37.117363 22.420017 36.922268 23.037819 c
36.648884 23.902077 l
36.526775 24.484623 36.373940 25.055870 36.192154 25.614044 c
35.991013 26.513317 l
35.851067 27.145899 36.137375 27.796192 36.698452 28.120131 c
37.704483 28.700962 l
38.421921 29.115175 38.667736 30.032562 38.253521 30.750000 c
37.839310 31.467438 36.921921 31.713251 36.204483 31.299038 c
35.198452 30.718206 l
34.637375 30.394268 33.931049 30.471466 33.453194 30.908951 c
32.748505 31.555702 l
32.370941 31.973736 31.972282 32.372349 31.554203 32.749859 c
30.908951 33.453190 l
30.471464 33.931049 30.394270 34.637375 30.718208 35.198452 c
31.299038 36.204483 l
31.713253 36.921921 31.467440 37.839306 30.750000 38.253521 c
30.032560 38.667736 29.115175 38.421921 28.700962 37.704483 c
28.120131 36.698452 l
27.796192 36.137375 27.145899 35.851067 26.513317 35.991013 c
25.626040 36.188240 l
25.067423 36.370647 24.495693 36.524048 23.912628 36.646667 c
23.037819 36.922268 l
22.420017 37.117363 22.000000 37.690460 22.000000 38.338337 c
22.000000 39.500000 l
h
6.999939 20.500244 m
6.999939 27.956089 13.044094 34.000244 20.499939 34.000244 c
27.955784 34.000244 33.999939 27.956089 33.999939 20.500244 c
33.999939 13.044399 27.955784 7.000244 20.499939 7.000244 c
13.044094 7.000244 6.999939 13.044399 6.999939 20.500244 c
h
14.233011 30.086567 m
14.833106 30.510162 15.662971 30.367085 16.086567 29.766989 c
21.689148 21.830000 l
30.500000 21.830000 l
31.234539 21.830000 31.830000 21.234539 31.830000 20.500000 c
31.830000 19.765461 31.234539 19.170000 30.500000 19.170000 c
21.689148 19.170000 l
16.086567 11.233011 l
15.662971 10.632917 14.833106 10.489836 14.233011 10.913433 c
13.632916 11.337029 13.489837 12.166895 13.913433 12.766989 c
19.372028 20.500000 l
13.913433 28.233011 l
13.489837 28.833107 13.632916 29.662971 14.233011 30.086567 c
h
f*
n
Q
endstream
endobj
3 0 obj
5648
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 48.000000 48.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000005738 00000 n
0000005761 00000 n
0000005934 00000 n
0000006008 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
6067
%%EOF

View File

@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "ic_input_stickers.pdf",
"filename" : "stickers_48.pdf",
"idiom" : "universal"
}
],

View File

@ -0,0 +1,123 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 4.270020 4.152344 cm
0.000000 0.000000 0.000000 scn
16.315697 39.500134 m
17.465136 39.695385 18.643398 39.519531 19.692223 38.997250 c
20.036819 38.810360 l
20.329382 38.633312 l
22.423059 37.333458 25.297297 34.879963 28.991110 31.253437 c
30.068821 30.185352 l
30.611883 29.639896 l
34.713905 25.501024 37.402637 22.349218 38.705769 20.126995 c
39.294643 19.122784 39.547707 17.960588 39.433071 16.802202 c
39.381195 16.416437 l
39.289803 15.914349 l
39.216812 15.566687 l
39.100006 15.079699 l
36.891888 6.359375 29.005989 0.117638 19.853556 0.117638 c
8.888740 0.117638 0.000000 9.006048 0.000000 19.970463 c
0.000000 29.125599 6.246058 37.013073 14.970581 39.218063 c
15.710625 39.388660 l
16.315697 39.500134 l
h
12.798756 35.489426 m
12.631100 35.425148 l
12.241472 35.242031 l
6.578289 32.429054 2.786009 26.584171 2.786009 19.970726 c
2.786009 10.544853 10.427470 2.903671 19.853691 2.903671 c
26.466494 2.903671 32.311123 6.694832 35.134140 12.353510 c
35.125557 12.358789 l
35.308681 12.748402 l
35.384480 12.909666 35.423779 13.085659 35.423779 13.263847 c
35.423779 13.877327 34.967880 14.384329 34.376385 14.464569 c
34.211948 14.475632 l
32.160770 14.475632 l
22.489969 14.475632 14.620218 22.186560 14.364793 31.795357 c
14.358393 32.277351 l
14.358393 34.328457 l
14.358393 34.506645 14.319095 34.682640 14.243299 34.843903 c
13.984495 35.394527 13.364433 35.659653 12.798756 35.489426 c
h
16.782263 36.753235 m
17.411953 36.860195 18.059189 36.741272 18.609720 36.417446 c
18.873783 36.257626 l
19.147327 36.083416 l
21.103546 34.807701 23.928543 32.350906 27.572746 28.738895 c
28.098915 28.215038 l
29.130342 27.174446 l
32.797047 23.440453 35.195877 20.604664 36.302593 18.717381 c
36.625195 18.167248 36.743385 17.520950 36.636360 16.892254 c
36.563797 16.495956 l
35.903824 16.976896 35.090961 17.260666 34.211819 17.260666 c
32.160641 17.260666 l
31.717884 17.267069 l
23.629288 17.501270 17.144138 24.131626 17.144138 32.276615 c
17.144138 34.327721 l
17.128656 34.679214 l
17.087467 35.145836 16.964489 35.602531 16.764452 36.028126 c
16.655125 36.260727 16.526255 36.477886 16.380722 36.678566 c
16.574390 36.716927 l
16.782263 36.753235 l
h
f*
n
Q
endstream
endobj
3 0 obj
2244
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 48.000000 48.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000002334 00000 n
0000002357 00000 n
0000002530 00000 n
0000002604 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
2663
%%EOF

View File

@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "ic_input_trending.pdf",
"filename" : "trending_48.pdf",
"idiom" : "universal"
}
],

View File

@ -0,0 +1,110 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 4.170044 0.499023 cm
0.000000 0.000000 0.000000 scn
32.698776 36.649349 m
33.196007 37.230061 33.128334 38.103909 32.547619 38.601139 c
24.752439 45.275715 13.077241 44.850506 5.778737 37.552002 c
-1.926246 29.847019 -1.926246 17.354773 5.778737 9.649792 c
13.483720 1.944809 25.975967 1.944809 33.680950 9.649792 c
35.733494 11.702333 37.280899 14.138113 38.257706 16.806875 c
38.402122 17.201443 38.533802 17.600437 38.652599 18.003250 c
38.868858 18.736530 38.449730 19.506285 37.716450 19.722542 c
36.983170 19.938799 36.213417 19.519670 35.997158 18.786390 c
35.895077 18.440252 35.781937 18.097435 35.657864 17.758453 c
34.818737 15.465839 33.489719 13.373833 31.723314 11.607428 c
25.099504 4.983616 14.360184 4.983616 7.736373 11.607428 c
1.112563 18.231237 1.112563 28.970556 7.736373 35.594368 c
14.010414 41.868408 24.048201 42.233982 30.746983 36.498192 c
31.327696 36.000961 32.201546 36.068634 32.698776 36.649349 c
h
38.615009 32.391445 m
38.529594 33.073990 37.947231 33.602066 37.241535 33.602066 c
28.902636 33.602066 l
28.728996 33.591278 l
28.046450 33.505859 27.518377 32.923504 27.518377 32.217808 c
27.529161 32.044167 l
27.614580 31.361622 28.196938 30.833549 28.902636 30.833549 c
34.177799 30.834362 l
25.567074 22.223354 l
20.660971 27.129120 l
20.471394 27.300470 l
19.490988 28.100105 18.044804 28.042988 17.130936 27.129120 c
8.744342 18.742527 l
8.620458 18.600773 l
8.207510 18.058197 8.248805 17.280428 8.744342 16.784891 c
8.886098 16.661007 l
9.428673 16.248058 10.206441 16.289354 10.701978 16.784891 c
18.894285 24.980196 l
23.802057 20.072762 l
23.991632 19.901411 l
24.972040 19.101778 26.418222 19.158894 27.332090 20.072762 c
35.857254 28.599537 l
35.857281 23.878904 l
35.868065 23.705265 l
35.953484 23.022720 36.535839 22.494646 37.241535 22.494646 c
38.006042 22.494646 38.625793 23.114401 38.625793 23.878904 c
38.625793 32.217808 l
38.615009 32.391445 l
h
f*
n
Q
endstream
endobj
3 0 obj
1977
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 48.000000 48.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000002067 00000 n
0000002090 00000 n
0000002263 00000 n
0000002337 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
2396
%%EOF

View File

@ -1,7 +1,7 @@
{
"images" : [
{
"filename" : "ic_input_addstickers.pdf",
"filename" : "add_48.pdf",
"idiom" : "universal"
}
],

View File

@ -0,0 +1,95 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 4.272095 4.271973 cm
0.000000 0.000000 0.000000 scn
19.728001 36.800056 m
10.299395 36.800056 2.656000 29.156660 2.656000 19.728054 c
2.656000 10.299450 10.299395 2.656055 19.728001 2.656055 c
29.156605 2.656055 36.799999 10.299450 36.799999 19.728054 c
36.799999 29.156660 29.156605 36.800056 19.728001 36.800056 c
h
0.000000 19.728054 m
0.000000 30.623528 8.832526 39.456055 19.728001 39.456055 c
30.623474 39.456055 39.455997 30.623528 39.455997 19.728054 c
39.455997 8.832581 30.623474 0.000057 19.728001 0.000057 c
8.832526 0.000057 0.000000 8.832581 0.000000 19.728054 c
h
19.728001 29.056055 m
20.461435 29.056055 21.056002 28.461489 21.056002 27.728054 c
21.056002 21.056053 l
27.728001 21.056053 l
28.461435 21.056053 29.056002 20.461487 29.056002 19.728054 c
29.056002 18.994619 28.461435 18.400053 27.728001 18.400053 c
21.056002 18.400053 l
21.056002 11.728054 l
21.056002 10.994619 20.461435 10.400053 19.728001 10.400053 c
18.994568 10.400053 18.400002 10.994619 18.400002 11.728054 c
18.400002 18.400053 l
11.728000 18.400053 l
10.994566 18.400053 10.400000 18.994619 10.400000 19.728054 c
10.400000 20.461487 10.994566 21.056053 11.728000 21.056053 c
18.400002 21.056053 l
18.400002 27.728054 l
18.400002 28.461489 18.994568 29.056055 19.728001 29.056055 c
h
f*
n
Q
endstream
endobj
3 0 obj
1349
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 48.000000 48.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Type /Catalog
/Pages 5 0 R
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000001439 00000 n
0000001462 00000 n
0000001635 00000 n
0000001709 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
1768
%%EOF

View File

@ -3063,7 +3063,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
return message?.totalCount
}
|> distinctUntilChanged
} else if case let .forwardedMessages(messageIds, hideNames, _) = subject {
} else if case let .forwardedMessages(messageIds, options) = subject {
displayedCountSignal = self.presentationInterfaceStatePromise.get()
|> map { state -> Int? in
if let selectionState = state.interfaceState.selectionState {
@ -3074,19 +3074,19 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
|> distinctUntilChanged
subtitleTextSignal = combineLatest(self.presentationInterfaceStatePromise.get(), hideNames, displayedCountSignal)
|> map { state, hideNames, count in
subtitleTextSignal = combineLatest(self.presentationInterfaceStatePromise.get(), options, displayedCountSignal)
|> map { state, options, count in
if let peer = state.renderedPeer?.chatMainPeer {
if let peer = peer as? TelegramUser {
let displayName = peer.compactDisplayTitle
if count == 1 {
if hideNames {
if options.hideNames {
return state.strings.Conversation_ForwardOptions_UserMessageForwardHidden(displayName).string
} else {
return state.strings.Conversation_ForwardOptions_UserMessageForwardVisible(displayName).string
}
} else {
if hideNames {
if options.hideNames {
return state.strings.Conversation_ForwardOptions_UserMessagesForwardHidden(displayName).string
} else {
return state.strings.Conversation_ForwardOptions_UserMessagesForwardVisible(displayName).string
@ -3094,13 +3094,13 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
} else if let peer = peer as? TelegramChannel, case .broadcast = peer.info {
if count == 1 {
if hideNames {
if options.hideNames {
return state.strings.Conversation_ForwardOptions_ChannelMessageForwardHidden
} else {
return state.strings.Conversation_ForwardOptions_ChannelMessageForwardVisible
}
} else {
if hideNames {
if options.hideNames {
return state.strings.Conversation_ForwardOptions_ChannelMessagesForwardHidden
} else {
return state.strings.Conversation_ForwardOptions_ChannelMessagesForwardVisible
@ -3108,13 +3108,13 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
} else {
if count == 1 {
if hideNames {
if options.hideNames {
return state.strings.Conversation_ForwardOptions_GroupMessageForwardHidden
} else {
return state.strings.Conversation_ForwardOptions_GroupMessageForwardVisible
}
} else {
if hideNames {
if options.hideNames {
return state.strings.Conversation_ForwardOptions_GroupMessagesForwardHidden
} else {
return state.strings.Conversation_ForwardOptions_GroupMessagesForwardVisible
@ -3894,7 +3894,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
isDarkAppearance = darkAppearancePreview
}
let customTheme = isDarkAppearance ? theme.darkTheme : theme.theme
if let settings = customTheme.settings, let theme = makePresentationTheme(settings: settings) {
if let settings = customTheme.settings, let theme = makePresentationTheme(settings: settings, specialMode: true) {
presentationData = presentationData.withUpdated(theme: theme)
presentationData = presentationData.withUpdated(chatWallpaper: theme.chat.defaultWallpaper)
}
@ -4648,7 +4648,9 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
if let strongSelf = self {
let (cachedData, messages) = cachedDataAndMessages
strongSelf.cachedDataPromise.set(.single(cachedData))
if cachedData != nil {
strongSelf.cachedDataPromise.set(.single(cachedData))
}
var pinnedMessageId: MessageId?
var peerIsBlocked: Bool = false
@ -5484,71 +5486,47 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
if let strongSelf = self, case let .peer(peerId) = strongSelf.chatLocation {
let presentationData = strongSelf.presentationData
let hideNames = strongSelf.presentationInterfaceStatePromise.get()
|> map { state -> Bool in
return state.interfaceState.forwardOptionsState?.hideNames ?? false
let forwardOptions: Signal<ChatControllerSubject.ForwardOptions, NoError>
if peerId.namespace == Namespaces.Peer.SecretChat {
forwardOptions = .single(ChatControllerSubject.ForwardOptions(hideNames: true, hideCaptions: false))
} else {
forwardOptions = strongSelf.presentationInterfaceStatePromise.get()
|> map { state -> ChatControllerSubject.ForwardOptions in
return ChatControllerSubject.ForwardOptions(hideNames: state.interfaceState.forwardOptionsState?.hideNames ?? false, hideCaptions: state.interfaceState.forwardOptionsState?.hideCaptions ?? false)
}
|> distinctUntilChanged
}
|> distinctUntilChanged
let hideCaptions = strongSelf.presentationInterfaceStatePromise.get()
|> map { state -> Bool in
return state.interfaceState.forwardOptionsState?.hideCaptions ?? false
}
|> distinctUntilChanged
let chatController = strongSelf.context.sharedContext.makeChatController(context: strongSelf.context, chatLocation: .peer(peerId), subject: .forwardedMessages(ids: strongSelf.presentationInterfaceState.interfaceState.forwardMessageIds ?? [], hideNames: hideNames, hideCaptions: hideCaptions), botStart: nil, mode: .standard(previewing: true))
let chatController = strongSelf.context.sharedContext.makeChatController(context: strongSelf.context, chatLocation: .peer(peerId), subject: .forwardedMessages(ids: strongSelf.presentationInterfaceState.interfaceState.forwardMessageIds ?? [], options: forwardOptions), botStart: nil, mode: .standard(previewing: true))
chatController.canReadHistory.set(false)
let items = combineLatest(strongSelf.presentationInterfaceStatePromise.get(), strongSelf.context.account.postbox.messagesAtIds(strongSelf.presentationInterfaceState.interfaceState.forwardMessageIds ?? []))
|> map { presentationInterfaceState, messages -> [ContextMenuItem] in
let items = combineLatest(forwardOptions, strongSelf.context.account.postbox.messagesAtIds(strongSelf.presentationInterfaceState.interfaceState.forwardMessageIds ?? []))
|> map { forwardOptions, messages -> [ContextMenuItem] in
var items: [ContextMenuItem] = []
var hasCaptions = false
loop: for message in messages {
var uniquePeerIds = Set<PeerId>()
for message in messages {
if let author = message.effectiveAuthor, !uniquePeerIds.contains(author.id) {
uniquePeerIds.insert(author.id)
}
if !message.text.isEmpty {
for media in message.media {
if media is TelegramMediaImage || media is TelegramMediaFile {
hasCaptions = true
break loop
}
}
}
}
items.append(.action(ContextMenuActionItem(text: presentationData.strings.Conversation_ForwardOptions_ShowSendersNames, icon: { theme in
if presentationInterfaceState.interfaceState.forwardOptionsState?.hideNames == true {
return nil
} else {
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Check"), color: theme.contextMenu.primaryColor)
}
}, action: { [weak self] _, f in
self?.interfaceInteraction?.updateForwardOptionsState({ current in
var updated = current
updated.hideNames = false
updated.hideCaptions = false
return updated
})
})))
let hideNames = forwardOptions.hideNames
let hideCaptions = forwardOptions.hideCaptions
items.append(.action(ContextMenuActionItem(text: presentationData.strings.Conversation_ForwardOptions_HideSendersNames, icon: { theme in
if presentationInterfaceState.interfaceState.forwardOptionsState?.hideNames == true {
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Check"), color: theme.contextMenu.primaryColor)
} else {
return nil
}
}, action: { _, f in
self?.interfaceInteraction?.updateForwardOptionsState({ current in
var updated = current
updated.hideNames = true
return updated
})
})))
if case let .peer(peerId) = strongSelf.chatLocation, peerId.namespace == Namespaces.Peer.SecretChat {
if hasCaptions {
items.append(.separator)
items.append(.action(ContextMenuActionItem(text: presentationData.strings.Conversation_ForwardOptions_ShowCaption, icon: { theme in
if presentationInterfaceState.interfaceState.forwardOptionsState?.hideCaptions == true {
} else {
items.append(.action(ContextMenuActionItem(text: uniquePeerIds.count == 1 ? presentationData.strings.Conversation_ForwardOptions_ShowSendersName : presentationData.strings.Conversation_ForwardOptions_ShowSendersNames, icon: { theme in
if hideNames {
return nil
} else {
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Check"), color: theme.contextMenu.primaryColor)
@ -5556,14 +5534,14 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}, action: { [weak self] _, f in
self?.interfaceInteraction?.updateForwardOptionsState({ current in
var updated = current
updated.hideNames = false
updated.hideCaptions = false
return updated
})
})))
items.append(.action(ContextMenuActionItem(text: presentationData.strings.Conversation_ForwardOptions_HideCaption, icon: { theme in
if presentationInterfaceState.interfaceState.forwardOptionsState?.hideCaptions == true {
items.append(.action(ContextMenuActionItem(text: uniquePeerIds.count == 1 ? presentationData.strings.Conversation_ForwardOptions_HideSendersName : presentationData.strings.Conversation_ForwardOptions_HideSendersNames, icon: { theme in
if hideNames {
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Check"), color: theme.contextMenu.primaryColor)
} else {
return nil
@ -5571,14 +5549,47 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}, action: { _, f in
self?.interfaceInteraction?.updateForwardOptionsState({ current in
var updated = current
updated.hideCaptions = true
updated.hideNames = true
return updated
})
})))
}
items.append(.separator)
if hasCaptions {
items.append(.separator)
items.append(.action(ContextMenuActionItem(text: presentationData.strings.Conversation_ForwardOptions_ShowCaption, icon: { theme in
if hideCaptions {
return nil
} else {
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Check"), color: theme.contextMenu.primaryColor)
}
}, action: { [weak self] _, f in
self?.interfaceInteraction?.updateForwardOptionsState({ current in
var updated = current
updated.hideCaptions = false
return updated
})
})))
items.append(.action(ContextMenuActionItem(text: presentationData.strings.Conversation_ForwardOptions_HideCaption, icon: { theme in
if hideCaptions {
return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Check"), color: theme.contextMenu.primaryColor)
} else {
return nil
}
}, action: { _, f in
self?.interfaceInteraction?.updateForwardOptionsState({ current in
var updated = current
updated.hideCaptions = true
updated.hideNames = true
return updated
})
})))
}
items.append(.separator)
}
items.append(.action(ContextMenuActionItem(text: presentationData.strings.Conversation_ForwardOptions_ChangeRecipient, icon: { theme in return generateTintedImage(image: UIImage(bundleImageName: "Chat/Context Menu/Forward"), color: theme.contextMenu.primaryColor) }, action: { c, f in
self?.interfaceInteraction?.forwardCurrentForwardMessages()
@ -5605,6 +5616,13 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
let contextController = ContextController(account: strongSelf.context.account, presentationData: strongSelf.presentationData, source: .controller(ContextControllerContentSourceImpl(controller: chatController, sourceNode: sourceNode, passthroughTouches: true)), items: items, reactionItems: [])
contextController.dismissedForCancel = { [weak self, weak chatController] in
if let selectedMessageIds = (chatController as? ChatControllerImpl)?.selectedMessageIds {
var forwardMessageIds = strongSelf.presentationInterfaceState.interfaceState.forwardMessageIds ?? []
forwardMessageIds = forwardMessageIds.filter { selectedMessageIds.contains($0) }
strongSelf.updateChatPresentationInterfaceState(interactive: false, { $0.updatedInterfaceState({ $0.withUpdatedForwardMessageIds(forwardMessageIds) }) })
}
}
contextController.immediateItemsTransitionAnimation = true
strongSelf.presentInGlobalOverlay(contextController)
}
@ -7423,7 +7441,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
}
}
if case let .forwardedMessages(messageIds, _, _) = self.subject, messageIds.count > 1 {
if case let .forwardedMessages(messageIds, _) = self.subject, messageIds.count > 1 {
self.updateChatPresentationInterfaceState(interactive: false, { state in
return state.updatedInterfaceState({ $0.withUpdatedSelectedMessages(messageIds) })
})

View File

@ -252,54 +252,66 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate {
self.inputContextPanelContainer = ChatControllerTitlePanelNodeContainer()
var source: ChatHistoryListSource
if case let .forwardedMessages(messageIds, hideNames, hideCaptions) = subject {
let messages = combineLatest(context.account.postbox.messagesAtIds(messageIds), context.account.postbox.loadedPeerWithId(context.account.peerId))
|> mapToSignal { messages, accountPeer -> Signal<([Message], Int32, Bool), NoError> in
return combineLatest(hideNames, hideCaptions)
|> map { hideNames, hideCaptions -> ([Message], Int32, Bool) in
var messages = messages
messages.sort(by: { lhsMessage, rhsMessage in
return lhsMessage.timestamp > rhsMessage.timestamp
if case let .forwardedMessages(messageIds, options) = subject {
let messages = combineLatest(context.account.postbox.messagesAtIds(messageIds), context.account.postbox.loadedPeerWithId(context.account.peerId), options)
|> map { messages, accountPeer, options -> ([Message], Int32, Bool) in
var messages = messages
messages.sort(by: { lhsMessage, rhsMessage in
return lhsMessage.timestamp > rhsMessage.timestamp
})
messages = messages.map { message in
var flags = message.flags
flags.remove(.Incoming)
var attributes = message.attributes
attributes.append(OutgoingScheduleInfoMessageAttribute(scheduleTime: scheduleWhenOnlineTimestamp))
attributes = attributes.filter({ attribute in
if attribute is EditedMessageAttribute {
return false
}
if attribute is ReplyMessageAttribute {
return false
}
if attribute is ReplyMarkupMessageAttribute {
return false
}
return true
})
messages = messages.map { message in
var flags = message.flags
flags.remove(.Incoming)
var attributes = message.attributes
attributes.append(OutgoingScheduleInfoMessageAttribute(scheduleTime: scheduleWhenOnlineTimestamp))
attributes = attributes.filter({ attribute in
if attribute is EditedMessageAttribute {
return false
}
if attribute is ReplyMessageAttribute {
return false
}
return true
})
var messageText = message.text
var forwardInfo = message.forwardInfo
if forwardInfo == nil {
forwardInfo = MessageForwardInfo(author: message.author, source: nil, sourceMessageId: nil, date: 0, authorSignature: nil, psaType: nil, flags: [])
}
if hideNames {
forwardInfo = nil
}
if hideNames && hideCaptions {
for media in message.media {
var messageText = message.text
var messageMedia = message.media
var hasDice = false
if options.hideNames {
for media in message.media {
if options.hideCaptions {
if media is TelegramMediaImage || media is TelegramMediaFile {
messageText = ""
break
}
}
if let poll = media as? TelegramMediaPoll {
var updatedMedia = message.media.filter { !($0 is TelegramMediaPoll) }
updatedMedia.append(TelegramMediaPoll(pollId: poll.pollId, publicity: poll.publicity, kind: poll.kind, text: poll.text, options: poll.options, correctAnswers: poll.correctAnswers, results: TelegramMediaPollResults(voters: nil, totalVoters: nil, recentVoters: [], solution: nil), isClosed: false, deadlineTimeout: nil))
messageMedia = updatedMedia
}
if let _ = media as? TelegramMediaDice {
hasDice = true
}
}
return message.withUpdatedFlags(flags).withUpdatedText(messageText).withUpdatedTimestamp(scheduleWhenOnlineTimestamp).withUpdatedAttributes(attributes).withUpdatedAuthor(accountPeer).withUpdatedForwardInfo(forwardInfo)
}
return (messages, Int32(messages.count), false)
var forwardInfo = message.forwardInfo
if forwardInfo == nil {
forwardInfo = MessageForwardInfo(author: message.author, source: nil, sourceMessageId: nil, date: 0, authorSignature: nil, psaType: nil, flags: [])
}
if options.hideNames && !hasDice {
forwardInfo = nil
}
return message.withUpdatedFlags(flags).withUpdatedText(messageText).withUpdatedMedia(messageMedia).withUpdatedTimestamp(scheduleWhenOnlineTimestamp).withUpdatedAttributes(attributes).withUpdatedAuthor(accountPeer).withUpdatedForwardInfo(forwardInfo)
}
return (messages, Int32(messages.count), false)
}
source = .custom(messages: messages, messageId: MessageId(peerId: PeerId(0), namespace: 0, id: 0), loadMore: nil)
} else {
@ -556,6 +568,15 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate {
if let _ = strongSelf.chatPresentationInterfaceState.inputTextPanelState.mediaRecordingState {
return true
}
var hasChatThemeScreen = false
strongSelf.controller?.window?.forEachController { c in
if c is ChatThemeScreen {
hasChatThemeScreen = true
}
}
if hasChatThemeScreen {
return true
}
return false
}

View File

@ -2471,7 +2471,14 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
updatedToggledMessageIds = state.toggledMessageIds
let isSelected = (self.controllerInteraction.selectionState?.selectedIds.contains(message.id) ?? false)
if state.selecting != isSelected {
let messageIds = messages.map { $0.id }
let messageIds = messages.filter { message -> Bool in
for media in messages {
if media is TelegramMediaAction {
return false
}
}
return true
}.map { $0.id }
updatedToggledMessageIds.append(messageIds)
self.controllerInteraction.toggleMessagesSelection(messageIds, state.selecting)
}

View File

@ -129,6 +129,7 @@ final class ChatMediaInputMetaSectionItemNode: ListViewItemNode {
self.imageNode = ASImageNode()
self.imageNode.isLayerBacked = true
self.imageNode.contentMode = .scaleAspectFit
self.textNodeContainer = ASDisplayNode()
self.textNodeContainer.isUserInteractionEnabled = false
@ -227,12 +228,6 @@ final class ChatMediaInputMetaSectionItemNode: ListViewItemNode {
default:
break
}
// if emoji == "🥳" {
// if #available(iOSApplicationExtension 12.1, iOS 12.1, *) {
// } else {
// emoji = "🎉"
// }
// }
self.imageNode.image = nil
if let file = file {

View File

@ -86,6 +86,7 @@ final class ChatMediaInputRecentGifsItemNode: ListViewItemNode {
self.imageNode = ASImageNode()
self.imageNode.isLayerBacked = true
self.imageNode.contentMode = .scaleAspectFit
self.titleNode = ImmediateTextNode()

View File

@ -82,6 +82,7 @@ final class ChatMediaInputSettingsItemNode: ListViewItemNode {
self.imageNode = ASImageNode()
self.imageNode.isLayerBacked = true
self.imageNode.contentMode = .scaleAspectFit
self.titleNode = ImmediateTextNode()

View File

@ -91,6 +91,7 @@ final class ChatMediaInputTrendingItemNode: ListViewItemNode {
self.imageNode = ASImageNode()
self.imageNode.isLayerBacked = true
self.imageNode.contentMode = .scaleAspectFit
self.badgeBackground = ASImageNode()
self.badgeBackground.displaysAsynchronously = false

View File

@ -2411,6 +2411,10 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
}
item.controllerInteraction.displayPsa(type, sourceNode)
}
if animation.isAnimated {
forwardInfoNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
}
}
let previousForwardInfoNodeFrame = forwardInfoNode.frame
forwardInfoNode.frame = CGRect(origin: CGPoint(x: contentOrigin.x + layoutConstants.text.bubbleInsets.left, y: layoutConstants.bubble.contentInsets.top + forwardInfoOriginY), size: CGSize(width: bubbleContentWidth, height: forwardInfoSizeApply.0.height))
@ -2420,8 +2424,17 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
}
}
} else {
strongSelf.forwardInfoNode?.removeFromSupernode()
strongSelf.forwardInfoNode = nil
if animation.isAnimated {
if let forwardInfoNode = strongSelf.forwardInfoNode {
strongSelf.forwardInfoNode = nil
forwardInfoNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardInfoNode] _ in
forwardInfoNode?.removeFromSupernode()
})
}
} else {
strongSelf.forwardInfoNode?.removeFromSupernode()
strongSelf.forwardInfoNode = nil
}
}
if let replyInfoNode = replyInfoSizeApply.1() {

View File

@ -440,7 +440,10 @@ final class ChatThemeScreen: ViewController {
return
}
strongSelf.dismiss()
strongSelf.completion(emoticon)
if strongSelf.initiallySelectedEmoticon == nil && emoticon == nil {
} else {
strongSelf.completion(emoticon)
}
}
self.controllerNode.dismiss = { [weak self] in
self?.presentingViewController?.dismiss(animated: false, completion: nil)
@ -456,6 +459,8 @@ final class ChatThemeScreen: ViewController {
override public func loadView() {
super.loadView()
self.view.disablesInteractiveTransitionGestureRecognizer = true
}
override public func viewDidAppear(_ animated: Bool) {

View File

@ -161,7 +161,11 @@ final class ForwardAccessoryPanelNode: AccessoryPanelNode {
if !authors.isEmpty {
authors.append(", ")
}
authors.append(author.compactDisplayTitle)
if author.id == context.account.peerId {
authors.append(strongSelf.strings.DialogList_You)
} else {
authors.append(author.compactDisplayTitle)
}
}
if let peer = message.peers[message.id.peerId] {
sourcePeer = (peer.id.namespace == Namespaces.Peer.CloudUser, peer.displayTitle(strings: strongSelf.strings, displayOrder: strongSelf.nameDisplayOrder))
@ -201,7 +205,14 @@ final class ForwardAccessoryPanelNode: AccessoryPanelNode {
if let strongSelf = self, count < 3 {
Queue.mainQueue().after(3.0) {
if let snapshotView = strongSelf.textNode.view.snapshotContentTree() {
strongSelf.textNode.attributedText = NSAttributedString(string: strongSelf.strings.Conversation_ForwardOptions_TapForOptions, font: Font.regular(15.0), textColor: strongSelf.theme.chat.inputPanel.secondaryTextColor)
let text: String
if let (size, _) = strongSelf.validLayout, size.width > 320.0 {
text = strongSelf.strings.Conversation_ForwardOptions_TapForOptions
} else {
text = strongSelf.strings.Conversation_ForwardOptions_TapForOptionsShort
}
strongSelf.textNode.attributedText = NSAttributedString(string: text, font: Font.regular(15.0), textColor: strongSelf.theme.chat.inputPanel.secondaryTextColor)
strongSelf.view.addSubview(snapshotView)

View File

@ -3491,6 +3491,8 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
canChangeColors = peer.hasPermission(.changeInfo)
} else if let peer = peer as? TelegramGroup, case .member = peer.role {
canChangeColors = !peer.hasBannedPermission(.banChangeInfo)
} else if self.data?.encryptionKeyFingerprint != nil {
canChangeColors = false
}
if canChangeColors {

View File

@ -1310,7 +1310,7 @@ public func themeIconImage(account: Account, accountManager: AccountManager<Tele
themeSignal = .single(makeDefaultPresentationTheme(reference: theme, serviceBackgroundColor: nil))
} else if case let .cloud(theme) = theme, let settings = theme.theme.settings {
themeSignal = Signal { subscriber in
let theme = makePresentationTheme(mediaBox: accountManager.mediaBox, themeReference: .builtin(PresentationBuiltinThemeReference(baseTheme: settings.baseTheme)), accentColor: UIColor(argb: settings.accentColor), backgroundColors: [], bubbleColors: settings.messageColors, wallpaper: settings.wallpaper, serviceBackgroundColor: nil, preview: false)
let theme = makePresentationTheme(mediaBox: accountManager.mediaBox, themeReference: .builtin(PresentationBuiltinThemeReference(baseTheme: settings.baseTheme)), accentColor: UIColor(argb: settings.accentColor), backgroundColors: [], bubbleColors: settings.messageColors, wallpaper: settings.wallpaper, serviceBackgroundColor: nil, specialMode: emoticon, preview: false)
subscriber.putNext(theme)
subscriber.putCompletion()