Various UI fixes

This commit is contained in:
Ilya Laktyushin 2019-09-09 16:10:16 +03:00
parent c5136bb97e
commit edafa2e961
16 changed files with 2786 additions and 2749 deletions

View File

@ -4724,3 +4724,6 @@ Any member of this group will be able to see messages in the channel.";
"Theme.UsersCount_0" = "%@ people are using this theme"; "Theme.UsersCount_0" = "%@ people are using this theme";
"Conversation.SendMessageErrorTooMuchScheduled" = "Sorry, you can not schedule more than 100 messages."; "Conversation.SendMessageErrorTooMuchScheduled" = "Sorry, you can not schedule more than 100 messages.";
"Channel.EditAdmin.PermissionDeleteMessagesOfOthers" = "Delete Messages of Others";
"Channel.AdminLog.CanDeleteMessagesOfOthers" = "Delete Messages of Others";

View File

@ -159,7 +159,6 @@ private func checkIsPreviewingView(_ view: UIView) -> Bool {
private func applyThemeToPreviewingView(_ view: UIView, accentColor: UIColor, darkBlur: Bool) { private func applyThemeToPreviewingView(_ view: UIView, accentColor: UIColor, darkBlur: Bool) {
if let previewingActionGroupClass = previewingActionGroupClass, view.isKind(of: previewingActionGroupClass) { if let previewingActionGroupClass = previewingActionGroupClass, view.isKind(of: previewingActionGroupClass) {
view.tintColor = accentColor view.tintColor = accentColor
testZoomBlurEffect((view.superview?.superview?.subviews[1] as? UIVisualEffectView)?.effect)
if darkBlur { if darkBlur {
applyThemeToPreviewingEffectView(view) applyThemeToPreviewingEffectView(view)
} }

View File

@ -461,7 +461,7 @@ private func stringForRight(strings: PresentationStrings, right: TelegramChatAdm
} else if right.contains(.canEditMessages) { } else if right.contains(.canEditMessages) {
return strings.Channel_EditAdmin_PermissionEditMessages return strings.Channel_EditAdmin_PermissionEditMessages
} else if right.contains(.canDeleteMessages) { } else if right.contains(.canDeleteMessages) {
return strings.Channel_EditAdmin_PermissionDeleteMessages return isGroup ? strings.Channel_EditAdmin_PermissionDeleteMessages : strings.Channel_EditAdmin_PermissionDeleteMessagesOfOthers
} else if right.contains(.canBanUsers) { } else if right.contains(.canBanUsers) {
return strings.Channel_EditAdmin_PermissionBanUsers return strings.Channel_EditAdmin_PermissionBanUsers
} else if right.contains(.canInviteUsers) { } else if right.contains(.canInviteUsers) {

View File

@ -380,7 +380,7 @@ private func channelAdminsControllerEntries(presentationData: PresentationData,
switch participant.participant { switch participant.participant {
case .creator: case .creator:
canEdit = false canEdit = false
canOpen = false canOpen = isGroup && peer.flags.contains(.isCreator)
case let .member(id, _, adminInfo, _, _): case let .member(id, _, adminInfo, _, _):
if id == accountPeerId { if id == accountPeerId {
canEdit = false canEdit = false

View File

@ -718,7 +718,7 @@ public final class MessageHistoryView {
for entry in state.entries { for entry in state.entries {
if mutableView.namespaces.contains(entry.message.id.namespace) { if mutableView.namespaces.contains(entry.message.id.namespace) {
let read: Bool let read: Bool
if !entry.message.flags.intersection(.IsIncomingMask).isEmpty { if entry.message.flags.contains(.Incoming) {
read = false read = false
} else if let readState = states[entry.message.id.peerId] { } else if let readState = states[entry.message.id.peerId] {
read = readState.isOutgoingMessageIndexRead(entry.message.index) read = readState.isOutgoingMessageIndexRead(entry.message.index)

View File

@ -335,9 +335,9 @@ func generateThemeName(accentColor: UIColor) -> String {
if let color = nearest?.color, let colorName = colors[color]?.capitalized { if let color = nearest?.color, let colorName = colors[color]?.capitalized {
if arc4random() % 2 == 0 { if arc4random() % 2 == 0 {
return "\(adjectives[Int(arc4random()) % adjectives.count].capitalized) \(colorName)" return "\((adjectives.randomElement() ?? "").capitalized) \(colorName)"
} else { } else {
return "\(colorName) \(subjectives[Int(arc4random()) % subjectives.count].capitalized)" return "\(colorName) \((subjectives.randomElement() ?? "").capitalized)"
} }
} else { } else {
return "" return ""

View File

@ -83,6 +83,8 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate {
self.chatListBackgroundNode = ASDisplayNode() self.chatListBackgroundNode = ASDisplayNode()
self.chatContainerNode = ASDisplayNode() self.chatContainerNode = ASDisplayNode()
self.chatContainerNode.clipsToBounds = true
self.instantChatBackgroundNode = WallpaperBackgroundNode() self.instantChatBackgroundNode = WallpaperBackgroundNode()
self.instantChatBackgroundNode.displaysAsynchronously = false self.instantChatBackgroundNode.displaysAsynchronously = false
self.instantChatBackgroundNode.image = chatControllerBackgroundImage(theme: previewTheme, wallpaper: previewTheme.chat.defaultWallpaper, mediaBox: context.sharedContext.accountManager.mediaBox, knockoutMode: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper) self.instantChatBackgroundNode.image = chatControllerBackgroundImage(theme: previewTheme, wallpaper: previewTheme.chat.defaultWallpaper, mediaBox: context.sharedContext.accountManager.mediaBox, knockoutMode: context.sharedContext.immediateExperimentalUISettings.knockoutWallpaper)
@ -94,7 +96,6 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate {
self.remoteChatBackgroundNode.view.contentMode = .scaleAspectFill self.remoteChatBackgroundNode.view.contentMode = .scaleAspectFill
self.blurredNode = BlurredImageNode() self.blurredNode = BlurredImageNode()
self.blurredNode.clipsToBounds = true
self.blurredNode.blurView.contentMode = .scaleAspectFill self.blurredNode.blurView.contentMode = .scaleAspectFill
self.toolbarNode = WallpaperGalleryToolbarNode(theme: self.previewTheme, strings: self.presentationData.strings) self.toolbarNode = WallpaperGalleryToolbarNode(theme: self.previewTheme, strings: self.presentationData.strings)

View File

@ -519,6 +519,10 @@ public func updatedPresentationData(accountManager: AccountManager, applicationI
switch effectiveChatWallpaper { switch effectiveChatWallpaper {
case .builtin, .color: case .builtin, .color:
effectiveChatWallpaper = themeValue.chat.defaultWallpaper effectiveChatWallpaper = themeValue.chat.defaultWallpaper
case let .file(file):
if file.isPattern {
effectiveChatWallpaper = themeValue.chat.defaultWallpaper
}
default: default:
break break
} }

View File

@ -30,7 +30,7 @@ func canEditMessage(context: AccountContext, limitsConfiguration: LimitsConfigur
if let peer = message.peers[message.id.peerId], let channel = peer as? TelegramChannel { if let peer = message.peers[message.id.peerId], let channel = peer as? TelegramChannel {
switch channel.info { switch channel.info {
case .broadcast: case .broadcast:
if channel.hasPermission(.editAllMessages) { if channel.hasPermission(.editAllMessages) || !message.flags.contains(.Incoming) {
hasEditRights = true hasEditRights = true
} }
default: default:
@ -47,7 +47,7 @@ func canEditMessage(context: AccountContext, limitsConfiguration: LimitsConfigur
if let peer = peer as? TelegramChannel { if let peer = peer as? TelegramChannel {
switch peer.info { switch peer.info {
case .broadcast: case .broadcast:
if peer.hasPermission(.editAllMessages) { if peer.hasPermission(.editAllMessages) || !message.flags.contains(.Incoming) {
hasEditRights = true hasEditRights = true
} }
case .group: case .group:

View File

@ -31,6 +31,7 @@ struct ChatMessageItemBubbleLayoutConstants {
let minimumSize: CGSize let minimumSize: CGSize
let contentInsets: UIEdgeInsets let contentInsets: UIEdgeInsets
let borderInset: CGFloat let borderInset: CGFloat
let strokeInsets: UIEdgeInsets
} }
struct ChatMessageItemTextLayoutConstants { struct ChatMessageItemTextLayoutConstants {
@ -81,7 +82,7 @@ struct ChatMessageItemLayoutConstants {
self.avatarDiameter = 37.0 self.avatarDiameter = 37.0
self.timestampHeaderHeight = 34.0 self.timestampHeaderHeight = 34.0
self.bubble = ChatMessageItemBubbleLayoutConstants(edgeInset: 4.0, defaultSpacing: 2.0 + UIScreenPixel, mergedSpacing: 1.0, maximumWidthFill: ChatMessageItemWidthFill(compactInset: 36.0, compactWidthBoundary: 500.0, freeMaximumFillFactor: 0.85), minimumSize: CGSize(width: 40.0, height: 35.0), contentInsets: UIEdgeInsets(top: 0.0, left: 6.0, bottom: 0.0, right: 0.0), borderInset: UIScreenPixel) self.bubble = ChatMessageItemBubbleLayoutConstants(edgeInset: 4.0, defaultSpacing: 2.0 + UIScreenPixel, mergedSpacing: 1.0, maximumWidthFill: ChatMessageItemWidthFill(compactInset: 36.0, compactWidthBoundary: 500.0, freeMaximumFillFactor: 0.85), minimumSize: CGSize(width: 40.0, height: 35.0), contentInsets: UIEdgeInsets(top: 0.0, left: 6.0, bottom: 0.0, right: 0.0), borderInset: UIScreenPixel, strokeInsets: UIEdgeInsets(top: 1.0 - UIScreenPixel, left: 1.0 - UIScreenPixel, bottom: 1.0 - UIScreenPixel, right: 1.0 - UIScreenPixel))
self.text = ChatMessageItemTextLayoutConstants(bubbleInsets: UIEdgeInsets(top: 6.0 + UIScreenPixel, left: 12.0, bottom: 6.0 - UIScreenPixel, right: 12.0)) self.text = ChatMessageItemTextLayoutConstants(bubbleInsets: UIEdgeInsets(top: 6.0 + UIScreenPixel, left: 12.0, bottom: 6.0 - UIScreenPixel, right: 12.0))
self.image = ChatMessageItemImageLayoutConstants(bubbleInsets: UIEdgeInsets(top: 1.0 + UIScreenPixel, left: 1.0 + UIScreenPixel, bottom: 1.0 + UIScreenPixel, right: 1.0 + UIScreenPixel), statusInsets: UIEdgeInsets(top: 0.0, left: 0.0, bottom: 6.0, right: 6.0), defaultCornerRadius: 17.0, mergedCornerRadius: 5.0, contentMergedCornerRadius: 5.0, maxDimensions: CGSize(width: 300.0, height: 300.0), minDimensions: CGSize(width: 170.0, height: 74.0)) self.image = ChatMessageItemImageLayoutConstants(bubbleInsets: UIEdgeInsets(top: 1.0 + UIScreenPixel, left: 1.0 + UIScreenPixel, bottom: 1.0 + UIScreenPixel, right: 1.0 + UIScreenPixel), statusInsets: UIEdgeInsets(top: 0.0, left: 0.0, bottom: 6.0, right: 6.0), defaultCornerRadius: 17.0, mergedCornerRadius: 5.0, contentMergedCornerRadius: 5.0, maxDimensions: CGSize(width: 300.0, height: 300.0), minDimensions: CGSize(width: 170.0, height: 74.0))
self.video = ChatMessageItemVideoLayoutConstants(maxHorizontalHeight: 250.0, maxVerticalHeight: 360.0) self.video = ChatMessageItemVideoLayoutConstants(maxHorizontalHeight: 250.0, maxVerticalHeight: 360.0)

View File

@ -6,6 +6,7 @@ import SwiftSignalKit
import Postbox import Postbox
import TelegramCore import TelegramCore
import TelegramUIPreferences import TelegramUIPreferences
import TelegramPresentationData
import AccountContext import AccountContext
import GridMessageSelectionNode import GridMessageSelectionNode
@ -115,7 +116,17 @@ class ChatMessageMediaBubbleContentNode: ChatMessageBubbleContentNode {
switch preparePosition { switch preparePosition {
case .linear: case .linear:
if case .color = item.presentationData.theme.wallpaper { if case .color = item.presentationData.theme.wallpaper {
bubbleInsets = UIEdgeInsets() let colors: PresentationThemeBubbleColorComponents
if item.message.effectivelyIncoming(item.context.account.peerId) {
colors = item.presentationData.theme.theme.chat.message.incoming.bubble.withoutWallpaper
} else {
colors = item.presentationData.theme.theme.chat.message.outgoing.bubble.withoutWallpaper
}
if colors.fill == colors.stroke {
bubbleInsets = UIEdgeInsets()
} else {
bubbleInsets = layoutConstants.bubble.strokeInsets
}
} else { } else {
bubbleInsets = layoutConstants.image.bubbleInsets bubbleInsets = layoutConstants.image.bubbleInsets
} }

View File

@ -670,7 +670,7 @@ struct ChatRecentActionsEntry: Comparable, Identifiable {
order = [ order = [
(.canChangeInfo, self.presentationData.strings.Channel_AdminLog_CanChangeInfo), (.canChangeInfo, self.presentationData.strings.Channel_AdminLog_CanChangeInfo),
(.canPostMessages, self.presentationData.strings.Channel_AdminLog_CanSendMessages), (.canPostMessages, self.presentationData.strings.Channel_AdminLog_CanSendMessages),
(.canDeleteMessages, self.presentationData.strings.Channel_AdminLog_CanDeleteMessages), (.canDeleteMessages, self.presentationData.strings.Channel_AdminLog_CanDeleteMessagesOfOthers),
(.canEditMessages, self.presentationData.strings.Channel_AdminLog_CanEditMessages), (.canEditMessages, self.presentationData.strings.Channel_AdminLog_CanEditMessages),
(.canInviteUsers, self.presentationData.strings.Channel_AdminLog_CanInviteUsers), (.canInviteUsers, self.presentationData.strings.Channel_AdminLog_CanInviteUsers),
(.canPinMessages, self.presentationData.strings.Channel_AdminLog_CanPinMessages), (.canPinMessages, self.presentationData.strings.Channel_AdminLog_CanPinMessages),

View File

@ -273,7 +273,7 @@ func openResolvedUrlImpl(_ resolvedUrl: ResolvedUrl, context: AccountContext, ur
} }
})) }))
} else { } else {
subscriber.putError(.generic) subscriber.putError(.unsupported)
} }
return disposables return disposables

View File

@ -8,6 +8,7 @@ import Postbox
import TelegramPresentationData import TelegramPresentationData
import RadialStatusNode import RadialStatusNode
import PhotoResources import PhotoResources
import StickerResources
final class VerticalListContextResultsChatInputPanelItem: ListViewItem { final class VerticalListContextResultsChatInputPanelItem: ListViewItem {
fileprivate let account: Account fileprivate let account: Account
@ -165,7 +166,6 @@ final class VerticalListContextResultsChatInputPanelItemNode: ListViewItemNode {
var textString: NSAttributedString? var textString: NSAttributedString?
var iconText: NSAttributedString? var iconText: NSAttributedString?
var iconImageRepresentation: TelegramMediaImageRepresentation?
var updateIconImageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>? var updateIconImageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>?
var updatedStatusSignal: Signal<MediaResourceStatus, NoError>? var updatedStatusSignal: Signal<MediaResourceStatus, NoError>?
@ -178,8 +178,9 @@ final class VerticalListContextResultsChatInputPanelItemNode: ListViewItemNode {
} }
var imageResource: TelegramMediaResource? var imageResource: TelegramMediaResource?
var stickerFile: TelegramMediaFile?
switch item.result { switch item.result {
case let .externalReference(_, _, _, title, _, url, content, thumbnail, _): case let .externalReference(_, _, _, _, _, url, content, thumbnail, _):
if let thumbnail = thumbnail { if let thumbnail = thumbnail {
imageResource = thumbnail.resource imageResource = thumbnail.resource
} }
@ -198,11 +199,16 @@ final class VerticalListContextResultsChatInputPanelItemNode: ListViewItemNode {
iconText = NSAttributedString(string: host.substring(to: host.index(after: host.startIndex)).uppercased(), font: iconFont, textColor: UIColor.white) iconText = NSAttributedString(string: host.substring(to: host.index(after: host.startIndex)).uppercased(), font: iconFont, textColor: UIColor.white)
} }
} }
case let .internalReference(_, _, _, title, _, image, file, _): case let .internalReference(_, _, _, _, _, image, file, _):
if let image = image { if let image = image {
imageResource = imageRepresentationLargerThan(image.representations, size: CGSize(width: 200.0, height: 200.0))?.resource imageResource = imageRepresentationLargerThan(image.representations, size: CGSize(width: 200.0, height: 200.0))?.resource
} else if let file = file { } else if let file = file {
imageResource = smallestImageRepresentation(file.previewRepresentations)?.resource if file.isSticker {
stickerFile = file
imageResource = file.resource
} else {
imageResource = smallestImageRepresentation(file.previewRepresentations)?.resource
}
} }
} }
@ -215,9 +221,15 @@ final class VerticalListContextResultsChatInputPanelItemNode: ListViewItemNode {
var iconImageApply: (() -> Void)? var iconImageApply: (() -> Void)?
if let imageResource = imageResource { if let imageResource = imageResource {
let iconSize = CGSize(width: 55.0, height: 55.0) let boundingSize = CGSize(width: 55.0, height: 55.0)
let iconSize: CGSize
if let stickerFile = stickerFile, let dimensions = stickerFile.dimensions {
iconSize = dimensions.fitted(boundingSize)
} else {
iconSize = boundingSize
}
let imageCorners = ImageCorners(topLeft: .Corner(2.0), topRight: .Corner(2.0), bottomLeft: .Corner(2.0), bottomRight: .Corner(2.0)) let imageCorners = ImageCorners(topLeft: .Corner(2.0), topRight: .Corner(2.0), bottomLeft: .Corner(2.0), bottomRight: .Corner(2.0))
let arguments = TransformImageArguments(corners: imageCorners, imageSize: iconSize, boundingSize: iconSize, intrinsicInsets: UIEdgeInsets()) let arguments = TransformImageArguments(corners: imageCorners, imageSize: iconSize, boundingSize: boundingSize, intrinsicInsets: UIEdgeInsets())
iconImageApply = iconImageLayout(arguments) iconImageApply = iconImageLayout(arguments)
updatedStatusSignal = item.account.postbox.mediaBox.resourceStatus(imageResource) updatedStatusSignal = item.account.postbox.mediaBox.resourceStatus(imageResource)
@ -235,9 +247,13 @@ final class VerticalListContextResultsChatInputPanelItemNode: ListViewItemNode {
if updatedIconImageResource { if updatedIconImageResource {
if let imageResource = imageResource { if let imageResource = imageResource {
let tmpRepresentation = TelegramMediaImageRepresentation(dimensions: CGSize(width: 55.0, height: 55.0), resource: imageResource) if let stickerFile = stickerFile {
let tmpImage = TelegramMediaImage(imageId: MediaId(namespace: 0, id: 0), representations: [tmpRepresentation], immediateThumbnailData: nil, reference: nil, partialReference: nil) updateIconImageSignal = chatMessageSticker(account: item.account, file: stickerFile, small: false, fetched: true)
updateIconImageSignal = chatWebpageSnippetPhoto(account: item.account, photoReference: .standalone(media: tmpImage)) } else {
let tmpRepresentation = TelegramMediaImageRepresentation(dimensions: CGSize(width: 55.0, height: 55.0), resource: imageResource)
let tmpImage = TelegramMediaImage(imageId: MediaId(namespace: 0, id: 0), representations: [tmpRepresentation], immediateThumbnailData: nil, reference: nil, partialReference: nil)
updateIconImageSignal = chatWebpageSnippetPhoto(account: item.account, photoReference: .standalone(media: tmpImage))
}
} else { } else {
updateIconImageSignal = .complete() updateIconImageSignal = .complete()
} }
@ -398,6 +414,6 @@ final class VerticalListContextResultsChatInputPanelItemNode: ListViewItemNode {
guard let item = self.item else { guard let item = self.item else {
return return
} }
item.resultSelected(item.result, self, self.bounds) let _ = item.resultSelected(item.result, self, self.bounds)
} }
} }