Various fixes

This commit is contained in:
Ilya Laktyushin 2020-10-19 12:54:46 +04:00
parent b44f3d62eb
commit b074831fd3
14 changed files with 764 additions and 701 deletions

View File

@ -552,6 +552,7 @@ public protocol SharedAccountContext: class {
func makeChatRecentActionsController(context: AccountContext, peer: Peer, adminPeerId: PeerId?) -> ViewController
func makePrivacyAndSecurityController(context: AccountContext) -> ViewController
func navigateToChatController(_ params: NavigateToChatControllerParams)
func openLocationScreen(context: AccountContext, messageId: MessageId, navigationController: NavigationController)
func openExternalUrl(context: AccountContext, urlContext: OpenURLContext, url: String, forceExternal: Bool, presentationData: PresentationData, navigationController: NavigationController?, dismissInput: @escaping () -> Void)
func chatAvailableMessageActions(postbox: Postbox, accountPeerId: PeerId, messageIds: Set<MessageId>) -> Signal<ChatAvailableMessageActions, NoError>
func chatAvailableMessageActions(postbox: Postbox, accountPeerId: PeerId, messageIds: Set<MessageId>, messages: [MessageId: Message], peers: [PeerId: Peer]) -> Signal<ChatAvailableMessageActions, NoError>

View File

@ -43,7 +43,7 @@ class LocationPinAnnotation: NSObject, MKAnnotation {
let peer: Peer?
let message: Message?
let forcedSelection: Bool
var heading: Int32? {
var heading: Double? {
willSet {
self.willChangeValue(forKey: "heading")
}
@ -78,7 +78,7 @@ class LocationPinAnnotation: NSObject, MKAnnotation {
super.init()
}
init(context: AccountContext, theme: PresentationTheme, message: Message, selfPeer: Peer?, heading: Int32?) {
init(context: AccountContext, theme: PresentationTheme, message: Message, selfPeer: Peer?, heading: Double?) {
self.context = context
self.theme = theme
self.location = nil

View File

@ -17,11 +17,11 @@ import DeviceAccess
public class LocationViewParams {
let sendLiveLocation: (TelegramMediaMap) -> Void
let stopLiveLocation: () -> Void
let stopLiveLocation: (MessageId?) -> Void
let openUrl: (String) -> Void
let openPeer: (Peer) -> Void
public init(sendLiveLocation: @escaping (TelegramMediaMap) -> Void, stopLiveLocation: @escaping () -> Void, openUrl: @escaping (String) -> Void, openPeer: @escaping (Peer) -> Void) {
public init(sendLiveLocation: @escaping (TelegramMediaMap) -> Void, stopLiveLocation: @escaping (MessageId?) -> Void, openUrl: @escaping (String) -> Void, openPeer: @escaping (Peer) -> Void) {
self.sendLiveLocation = sendLiveLocation
self.stopLiveLocation = stopLiveLocation
self.openUrl = openUrl
@ -72,7 +72,7 @@ public final class LocationViewController: ViewController {
return self.displayNode as! LocationViewControllerNode
}
private let context: AccountContext
private var subject: Message
public var subject: Message
private var presentationData: PresentationData
private var presentationDataDisposable: Disposable?
@ -286,7 +286,7 @@ public final class LocationViewController: ViewController {
})
}
}, stopLiveLocation: { [weak self] in
params.stopLiveLocation()
params.stopLiveLocation(nil)
self?.dismiss()
}, updateRightBarButton: { [weak self] action in
guard let strongSelf = self else {
@ -318,6 +318,10 @@ public final class LocationViewController: ViewController {
self.presentationDataDisposable?.dispose()
}
public func goToUserLocation(visibleRadius: Double? = nil) {
}
override public func loadDisplayNode() {
super.loadDisplayNode()
guard let interaction = self.interaction else {

View File

@ -42,7 +42,7 @@ private struct LocationViewTransaction {
private enum LocationViewEntryId: Hashable {
case info
case toggleLiveLocation
case liveLocation(PeerId)
case liveLocation(UInt32)
}
private enum LocationViewEntry: Comparable, Identifiable {
@ -57,11 +57,7 @@ private enum LocationViewEntry: Comparable, Identifiable {
case .toggleLiveLocation:
return .toggleLiveLocation
case let .liveLocation(_, message, _, _):
if let author = message.author {
return .liveLocation(author.id)
} else {
return .liveLocation(message.id.peerId)
}
return .liveLocation(message.stableId)
}
}
@ -379,7 +375,7 @@ final class LocationViewControllerNode: ViewControllerTracingNode, CLLocationMan
var effectiveSubject: Message?
for message in effectiveLiveLocations {
if message.id.peerId == subject.id.peerId {
if message.id == subject.id {
effectiveSubject = message
} else {
sortedLiveLocations.append(message)
@ -408,9 +404,9 @@ final class LocationViewControllerNode: ViewControllerTracingNode, CLLocationMan
entries.append(.liveLocation(presentationData.theme, message, distance, index))
if message.localTags.contains(.OutgoingLiveLocation), let selfPeer = selfPeer {
userAnnotation = LocationPinAnnotation(context: context, theme: presentationData.theme, message: message, selfPeer: selfPeer, heading: nil)
userAnnotation = LocationPinAnnotation(context: context, theme: presentationData.theme, message: message, selfPeer: selfPeer, heading: location.heading)
} else {
annotations.append(LocationPinAnnotation(context: context, theme: presentationData.theme, message: message, selfPeer: nil, heading: nil))
annotations.append(LocationPinAnnotation(context: context, theme: presentationData.theme, message: message, selfPeer: selfPeer, heading: location.heading))
}
index += 1
}

View File

@ -25,6 +25,7 @@ public enum RequestEditMessageError {
case generic
case restricted
case textTooLong
case invalidGrouping
}
public func requestEditMessage(account: Account, messageId: MessageId, text: String, media: RequestEditMessageMedia, entities: TextEntitiesMessageAttribute? = nil, disableUrlPreview: Bool = false, scheduleTime: Int32? = nil) -> Signal<RequestEditMessageResult, RequestEditMessageError> {
@ -176,6 +177,8 @@ private func requestEditMessageInternal(postbox: Postbox, network: Network, stat
return .invalidReference
} else if error.errorDescription.hasSuffix("_TOO_LONG") {
return .error(.textTooLong)
} else if error.errorDescription.hasPrefix("MEDIA_GROUPED_INVALID") {
return .error(.invalidGrouping)
} else if error.errorDescription.hasPrefix("CHAT_SEND_") && error.errorDescription.hasSuffix("_FORBIDDEN") {
return .error(.restricted)
}

View File

@ -359,7 +359,18 @@ final class AuthorizedApplicationContext {
strongSelf.notificationController.removeItemsWithGroupingKey(firstMessage.id.peerId)
strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: strongSelf.rootController, context: strongSelf.context, chatLocation: .peer(firstMessage.id.peerId)))
var processed = false
for media in firstMessage.media {
if let action = media as? TelegramMediaAction, case let .geoProximityReached(distance) = action.action {
strongSelf.context.sharedContext.openLocationScreen(context: strongSelf.context, messageId: firstMessage.id, navigationController: strongSelf.rootController)
processed = true
break
}
}
if !processed {
strongSelf.context.sharedContext.navigateToChatController(NavigateToChatControllerParams(navigationController: strongSelf.rootController, context: strongSelf.context, chatLocation: .peer(firstMessage.id.peerId)))
}
}
return false
}, expandAction: { expandData in

View File

@ -5824,7 +5824,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
let text: String
switch error {
case .generic, .textTooLong:
case .generic, .textTooLong, .invalidGrouping:
text = strongSelf.presentationData.strings.Channel_EditMessageErrorGeneric
case .restricted:
text = strongSelf.presentationData.strings.Group_ErrorSendRestrictedMedia
@ -7149,17 +7149,18 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
let replyMessageId = strongSelf.presentationInterfaceState.interfaceState.replyMessageId
var groupingKey: Int64?
var allItemsAreSame = true
var fileTypes: (music: Bool, other: Bool) = (false, false)
for item in results {
if let item = item {
let pathExtension = (item.fileName as NSString).pathExtension.lowercased()
if !["mp3", "m4a"].contains(pathExtension) {
allItemsAreSame = false
if ["mp3", "m4a"].contains(pathExtension) {
fileTypes.music = true
} else {
fileTypes.other = true
}
}
}
allItemsAreSame = true
if allItemsAreSame {
if fileTypes.music != fileTypes.other {
groupingKey = arc4random64()
}

View File

@ -223,7 +223,11 @@ func messageMediaEditingOptions(message: Message) -> MessageMediaEditingOptions
if audio.isVoice {
return []
} else {
options.formUnion([.imageOrVideo, .file])
if let _ = message.groupingKey {
return []
} else {
options.formUnion([.imageOrVideo, .file])
}
}
default:
break

View File

@ -3019,9 +3019,14 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
var tapMessage: Message? = item.content.firstMessage
var selectAll = true
var hasFiles = false
loop: for contentNode in self.contentNodes {
let convertedLocation = self.view.convert(location, to: contentNode.view)
if contentNode is ChatMessageFileBubbleContentNode {
hasFiles = true
}
let convertedNodeFrame = contentNode.view.convert(contentNode.bounds, to: self.view)
if !convertedNodeFrame.contains(location) {
continue loop
@ -3029,6 +3034,8 @@ class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewItemNode
selectAll = false
} else if contentNode is ChatMessageFileBubbleContentNode {
selectAll = false
} else if contentNode is ChatMessageTextBubbleContentNode, hasFiles {
selectAll = false
}
tapMessage = contentNode.item?.message
let tapAction = contentNode.tapActionAtPoint(convertedLocation, gesture: gesture, isEstimating: false)

View File

@ -982,7 +982,7 @@ final class ChatMessageInteractiveFileNode: ASDisplayNode {
cutoutNode.removeFromSupernode()
}
}
} else if let statusNode = self.statusNode {
} else if let statusNode = self.statusNode, (self.iconNode?.isHidden ?? true) {
if let _ = self.cutoutNode {
} else {
let cutoutNode = ASImageNode()

View File

@ -69,8 +69,8 @@ func openChatMessageImpl(_ params: OpenChatMessageParams) -> Bool {
let controllerParams = LocationViewParams(sendLiveLocation: { location in
let outMessage: EnqueueMessage = .message(text: "", attributes: [], mediaReference: .standalone(media: location), replyToMessageId: nil, localGroupingKey: nil)
params.enqueueMessage(outMessage)
}, stopLiveLocation: {
params.context.liveLocationManager?.cancelLiveLocation(peerId: params.message.id.peerId)
}, stopLiveLocation: { messageId in
params.context.liveLocationManager?.cancelLiveLocation(peerId: messageId?.peerId ?? params.message.id.peerId)
}, openUrl: params.openUrl, openPeer: { peer in
params.openPeer(peer, .info)
})

View File

@ -26,6 +26,7 @@ import LocalMediaResources
import OverlayStatusController
import AlertUI
import PresentationDataUtils
import LocationUI
private enum CallStatusText: Equatable {
case none
@ -1080,6 +1081,41 @@ public final class SharedAccountContextImpl: SharedAccountContext {
navigateToChatControllerImpl(params)
}
public func openLocationScreen(context: AccountContext, messageId: MessageId, navigationController: NavigationController) {
var found = false
for controller in navigationController.viewControllers.reversed() {
if let controller = controller as? LocationViewController, controller.subject.id.peerId == messageId.peerId {
controller.goToUserLocation(visibleRadius: nil)
found = true
break
}
}
if !found {
let controllerParams = LocationViewParams(sendLiveLocation: { location in
let outMessage: EnqueueMessage = .message(text: "", attributes: [], mediaReference: .standalone(media: location), replyToMessageId: nil, localGroupingKey: nil)
// params.enqueueMessage(outMessage)
}, stopLiveLocation: { messageId in
if let messageId = messageId {
context.liveLocationManager?.cancelLiveLocation(peerId: messageId.peerId)
}
}, openUrl: { _ in }, openPeer: { peer in
// params.openPeer(peer, .info)
})
let _ = ((context.account.postbox.transaction { transaction -> Message? in
return transaction.getMessage(messageId)
}) |> deliverOnMainQueue).start(next: { message in
guard let message = message else {
return
}
let controller = LocationViewController(context: context, subject: message, params: controllerParams)
controller.navigationPresentation = .modal
navigationController.pushViewController(controller)
})
}
}
public func resolveUrl(account: Account, url: String) -> Signal<ResolvedUrl, NoError> {
return resolveUrlImpl(account: account, url: url)
}