mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-09-03 11:21:06 +00:00
no message
This commit is contained in:
parent
c55d7615a3
commit
97fc5d83e1
@ -11,8 +11,8 @@ private final class ChannelMembersControllerArguments {
|
||||
let setPeerIdWithRevealedOptions: (PeerId?, PeerId?) -> Void
|
||||
let removePeer: (PeerId) -> Void
|
||||
let openPeer: (Peer) -> Void
|
||||
let inviteViaLink:()->Void
|
||||
init(account: Account, addMember: @escaping () -> Void, setPeerIdWithRevealedOptions: @escaping (PeerId?, PeerId?) -> Void, removePeer: @escaping (PeerId) -> Void, openPeer: @escaping (Peer) -> Void, inviteViaLink:@escaping()->Void) {
|
||||
let inviteViaLink: ()->Void
|
||||
init(account: Account, addMember: @escaping () -> Void, setPeerIdWithRevealedOptions: @escaping (PeerId?, PeerId?) -> Void, removePeer: @escaping (PeerId) -> Void, openPeer: @escaping (Peer) -> Void, inviteViaLink: @escaping()->Void) {
|
||||
self.account = account
|
||||
self.addMember = addMember
|
||||
self.setPeerIdWithRevealedOptions = setPeerIdWithRevealedOptions
|
||||
@ -243,7 +243,6 @@ private func ChannelMembersControllerEntries(account: Account, presentationData:
|
||||
var entries: [ChannelMembersEntry] = []
|
||||
|
||||
if let participants = participants {
|
||||
|
||||
var canAddMember: Bool = false
|
||||
if let peer = view.peers[view.peerId] as? TelegramChannel {
|
||||
canAddMember = peer.hasAdminRights(.canInviteUsers)
|
||||
@ -251,7 +250,9 @@ private func ChannelMembersControllerEntries(account: Account, presentationData:
|
||||
|
||||
if canAddMember {
|
||||
entries.append(.addMember(presentationData.theme, presentationData.strings.Channel_Members_AddMembers))
|
||||
entries.append(.inviteLink(presentationData.theme, presentationData.strings.Channel_Members_InviteLink))
|
||||
if let peer = view.peers[view.peerId] as? TelegramChannel, peer.addressName == nil {
|
||||
entries.append(.inviteLink(presentationData.theme, presentationData.strings.Channel_Members_InviteLink))
|
||||
}
|
||||
entries.append(.addMemberInfo(presentationData.theme, presentationData.strings.Channel_Members_AddMembersHelp))
|
||||
}
|
||||
|
||||
|
@ -572,7 +572,7 @@ class ChatListItemNode: ItemListRevealOptionsItemNode {
|
||||
}
|
||||
|
||||
if let message = message, message.author?.id == account.peerId && !hasDraft {
|
||||
if message.flags.isSending {
|
||||
if message.flags.isSending && !message.isSentOrAcknowledged {
|
||||
statusImage = PresentationResourcesChatList.pendingImage(item.presentationData.theme)
|
||||
} else {
|
||||
if let combinedReadState = combinedReadState, combinedReadState.isOutgoingMessageIndexRead(MessageIndex(message)) {
|
||||
|
@ -400,7 +400,7 @@ final class ChatMessageAttachedContentNode: ASDisplayNode {
|
||||
} else {
|
||||
if message.flags.contains(.Failed) {
|
||||
statusType = .BubbleOutgoing(.Failed)
|
||||
} else if message.flags.isSending {
|
||||
} else if message.flags.isSending && !message.isSentOrAcknowledged {
|
||||
statusType = .BubbleOutgoing(.Sending)
|
||||
} else {
|
||||
statusType = .BubbleOutgoing(.Sent(read: messageRead))
|
||||
@ -482,7 +482,7 @@ final class ChatMessageAttachedContentNode: ASDisplayNode {
|
||||
} else {
|
||||
statusType = .BubbleOutgoing(.Failed)
|
||||
}
|
||||
} else if message.flags.isSending {
|
||||
} else if message.flags.isSending && !message.isSentOrAcknowledged {
|
||||
if imageMode {
|
||||
statusType = .ImageOutgoing(.Sending)
|
||||
} else {
|
||||
|
@ -697,7 +697,7 @@ class ChatMessageBubbleItemNode: ChatMessageItemView {
|
||||
} else {
|
||||
if message.flags.contains(.Failed) {
|
||||
statusType = .ImageOutgoing(.Failed)
|
||||
} else if message.flags.isSending {
|
||||
} else if message.flags.isSending && !message.isSentOrAcknowledged {
|
||||
statusType = .ImageOutgoing(.Sending)
|
||||
} else {
|
||||
statusType = .ImageOutgoing(.Sent(read: item.read))
|
||||
|
@ -161,7 +161,7 @@ class ChatMessageContactBubbleContentNode: ChatMessageBubbleContentNode {
|
||||
} else {
|
||||
if item.message.flags.contains(.Failed) {
|
||||
statusType = .BubbleOutgoing(.Failed)
|
||||
} else if item.message.flags.isSending {
|
||||
} else if item.message.flags.isSending && !item.message.isSentOrAcknowledged {
|
||||
statusType = .BubbleOutgoing(.Sending)
|
||||
} else {
|
||||
statusType = .BubbleOutgoing(.Sent(read: item.read))
|
||||
|
@ -48,7 +48,7 @@ class ChatMessageFileBubbleContentNode: ChatMessageBubbleContentNode {
|
||||
} else {
|
||||
if item.message.flags.contains(.Failed) {
|
||||
statusType = .BubbleOutgoing(.Failed)
|
||||
} else if item.message.flags.isSending {
|
||||
} else if item.message.flags.isSending && !item.message.isSentOrAcknowledged {
|
||||
statusType = .BubbleOutgoing(.Sending)
|
||||
} else {
|
||||
statusType = .BubbleOutgoing(.Sent(read: item.read))
|
||||
|
@ -208,7 +208,7 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode {
|
||||
case .free:
|
||||
if item.message.flags.contains(.Failed) {
|
||||
statusType = .FreeOutgoing(.Failed)
|
||||
} else if item.message.flags.isSending {
|
||||
} else if item.message.flags.isSending && !item.message.isSentOrAcknowledged {
|
||||
statusType = .FreeOutgoing(.Sending)
|
||||
} else {
|
||||
statusType = .FreeOutgoing(.Sent(read: item.read))
|
||||
@ -216,7 +216,7 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode {
|
||||
case .bubble:
|
||||
if item.message.flags.contains(.Failed) {
|
||||
statusType = .BubbleOutgoing(.Failed)
|
||||
} else if item.message.flags.isSending {
|
||||
} else if item.message.flags.isSending && !item.message.isSentOrAcknowledged {
|
||||
statusType = .BubbleOutgoing(.Sending)
|
||||
} else {
|
||||
statusType = .BubbleOutgoing(.Sent(read: item.read))
|
||||
|
@ -435,7 +435,7 @@ public final class ChatMessageItem: ListViewItem, CustomStringConvertible {
|
||||
apply(animation)
|
||||
if let nodeValue = node() as? ChatMessageItemView {
|
||||
nodeValue.updateSelectionState(animated: false)
|
||||
nodeValue.updateHighlightedState(animated: false)
|
||||
nodeValue.updateHighlightedState(animated: false)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
@ -199,7 +199,7 @@ class ChatMessageMapBubbleContentNode: ChatMessageBubbleContentNode {
|
||||
} else {
|
||||
if item.message.flags.contains(.Failed) {
|
||||
statusType = .BubbleOutgoing(.Failed)
|
||||
} else if item.message.flags.isSending {
|
||||
} else if item.message.flags.isSending && !item.message.isSentOrAcknowledged {
|
||||
statusType = .BubbleOutgoing(.Sending)
|
||||
} else {
|
||||
statusType = .BubbleOutgoing(.Sent(read: item.read))
|
||||
@ -211,7 +211,7 @@ class ChatMessageMapBubbleContentNode: ChatMessageBubbleContentNode {
|
||||
} else {
|
||||
if item.message.flags.contains(.Failed) {
|
||||
statusType = .ImageOutgoing(.Failed)
|
||||
} else if item.message.flags.isSending {
|
||||
} else if item.message.flags.isSending && !item.message.isSentOrAcknowledged {
|
||||
statusType = .ImageOutgoing(.Sending)
|
||||
} else {
|
||||
statusType = .ImageOutgoing(.Sent(read: item.read))
|
||||
|
@ -129,7 +129,7 @@ class ChatMessageMediaBubbleContentNode: ChatMessageBubbleContentNode {
|
||||
} else {
|
||||
if item.message.flags.contains(.Failed) {
|
||||
statusType = .ImageOutgoing(.Failed)
|
||||
} else if item.message.flags.isSending {
|
||||
} else if item.message.flags.isSending && !item.message.isSentOrAcknowledged {
|
||||
statusType = .ImageOutgoing(.Sending)
|
||||
} else {
|
||||
statusType = .ImageOutgoing(.Sent(read: item.read))
|
||||
|
@ -201,7 +201,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
|
||||
} else {
|
||||
if item.message.flags.contains(.Failed) {
|
||||
statusType = .FreeOutgoing(.Failed)
|
||||
} else if item.message.flags.isSending {
|
||||
} else if item.message.flags.isSending && !item.message.isSentOrAcknowledged {
|
||||
statusType = .FreeOutgoing(.Sending)
|
||||
} else {
|
||||
statusType = .FreeOutgoing(.Sent(read: item.read))
|
||||
|
@ -97,7 +97,7 @@ class ChatMessageTextBubbleContentNode: ChatMessageBubbleContentNode {
|
||||
} else {
|
||||
if message.flags.contains(.Failed) {
|
||||
statusType = .BubbleOutgoing(.Failed)
|
||||
} else if message.flags.isSending {
|
||||
} else if message.flags.isSending && !message.isSentOrAcknowledged {
|
||||
statusType = .BubbleOutgoing(.Sending)
|
||||
} else {
|
||||
statusType = .BubbleOutgoing(.Sent(read: item.read))
|
||||
|
@ -745,8 +745,13 @@ private func groupInfoEntries(account: Account, presentationData: PresentationDa
|
||||
}
|
||||
|
||||
if let editingState = state.editingState {
|
||||
if let group = view.peers[view.peerId] as? TelegramGroup, case .creator = group.role {
|
||||
entries.append(.adminManagement(presentationData.theme, presentationData.strings.GroupInfo_ChatAdmins))
|
||||
if let group = view.peers[view.peerId] as? TelegramGroup {
|
||||
if case .creator = group.role {
|
||||
entries.append(.adminManagement(presentationData.theme, presentationData.strings.GroupInfo_ChatAdmins))
|
||||
}
|
||||
|
||||
entries.append(GroupInfoEntry.notifications(presentationData.theme, presentationData.strings.GroupInfo_Notifications, notificationsText))
|
||||
entries.append(GroupInfoEntry.notificationSound(presentationData.theme, presentationData.strings.GroupInfo_Sound, localizedPeerNotificationSoundString(strings: presentationData.strings, sound: peerNotificationSettings.messageSound, default: globalNotificationSettings.effective.groupChats.sound)))
|
||||
} else if let cachedChannelData = view.cachedData as? CachedChannelData {
|
||||
if isCreator {
|
||||
entries.append(GroupInfoEntry.groupTypeSetup(presentationData.theme, presentationData.strings.GroupInfo_GroupType, isPublic ? presentationData.strings.Channel_Setup_TypePublic : presentationData.strings.Channel_Setup_TypePrivate))
|
||||
|
@ -24,6 +24,26 @@ func presentedLegacyCamera(account: Account, peer: Peer, cameraView: TGAttachmen
|
||||
controller = TGCameraController()
|
||||
}
|
||||
|
||||
if #available(iOSApplicationExtension 10.0, *) {
|
||||
} else {
|
||||
controller.customPresentOverlayController = { [weak legacyController] overlayController in
|
||||
guard let legacyController = legacyController, let overlayController = overlayController else {
|
||||
return
|
||||
}
|
||||
|
||||
let presentationData = account.telegramApplicationContext.currentPresentationData.with { $0 }
|
||||
let overlayLegacyController = LegacyController(presentation: .custom, theme: presentationData.theme)
|
||||
overlayLegacyController.supportedOrientations = ViewControllerSupportedOrientations(regularSize: .portrait, compactSize: .portrait)
|
||||
overlayLegacyController.statusBar.statusBarStyle = .Hide
|
||||
overlayLegacyController.bind(controller: overlayController)
|
||||
overlayController.customDismissSelf = { [weak overlayLegacyController] in
|
||||
overlayLegacyController?.dismiss()
|
||||
}
|
||||
|
||||
legacyController.present(overlayLegacyController, in: .window(.root))
|
||||
}
|
||||
}
|
||||
|
||||
controller.isImportant = true
|
||||
controller.shouldStoreCapturedAssets = saveCapturedPhotos && !isSecretChat
|
||||
controller.allowCaptions = true
|
||||
|
@ -615,6 +615,7 @@ public final class ManagedAudioSession {
|
||||
}
|
||||
|
||||
private func setupOutputMode(_ outputMode: AudioSessionOutputMode, type: ManagedAudioSessionType) throws {
|
||||
print("ManagedAudioSession setup \(outputMode) for \(type)")
|
||||
var resetToBuiltin = false
|
||||
switch outputMode {
|
||||
case .system:
|
||||
@ -625,6 +626,16 @@ public final class ManagedAudioSession {
|
||||
resetToBuiltin = true
|
||||
case .speaker:
|
||||
try AVAudioSession.sharedInstance().overrideOutputAudioPort(.speaker)
|
||||
if type == .voiceCall {
|
||||
if let routes = AVAudioSession.sharedInstance().availableInputs {
|
||||
for route in routes {
|
||||
if route.portType == AVAudioSessionPortBuiltInMic {
|
||||
let _ = try? AVAudioSession.sharedInstance().setPreferredInput(route)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
case .headphones:
|
||||
break
|
||||
case let .port(port):
|
||||
|
@ -161,6 +161,9 @@ final class NetworkStatusTitleView: UIView, NavigationBarTitleView, NavigationBa
|
||||
alignedTitleWidth -= 20.0
|
||||
proxyPadding += 39.0
|
||||
}
|
||||
if !self.lockView.isHidden {
|
||||
maxTitleWidth -= 10.0
|
||||
}
|
||||
|
||||
let titleSize = self.titleNode.updateLayout(CGSize(width: max(1.0, maxTitleWidth), height: size.height))
|
||||
|
||||
|
@ -77,7 +77,7 @@ func stringForUserPresence(strings: PresentationStrings, day: RelativeTimestampF
|
||||
case .today:
|
||||
dayString = strings.LastSeen_AtDate(strings.Time_TodayAt(stringForShortTimestamp(hours: hours, minutes: minutes, timeFormat: timeFormat)).0).0
|
||||
case .yesterday:
|
||||
dayString = strings.LastSeen_AtDate(strings.Time_YesterdayAt(stringForShortTimestamp(hours: hours, minutes: minutes, timeFormat: timeFormat)).0).0
|
||||
dayString = strings.LastSeen_YesterdayAt(stringForShortTimestamp(hours: hours, minutes: minutes, timeFormat: timeFormat)).0
|
||||
}
|
||||
return dayString
|
||||
}
|
||||
@ -269,7 +269,8 @@ func stringAndActivityForUserPresence(strings: PresentationStrings, timeFormat:
|
||||
if dayDifference == 0 || dayDifference == -1 {
|
||||
let day: RelativeTimestampFormatDay
|
||||
if dayDifference == 0 {
|
||||
day = .today
|
||||
let minutes = difference / (60 * 60)
|
||||
return (strings.LastSeen_HoursAgo(minutes), false)
|
||||
} else {
|
||||
day = .yesterday
|
||||
}
|
||||
|
@ -29,7 +29,6 @@ private final class PresentationCallToneRenderer {
|
||||
self.queue = queue
|
||||
|
||||
self.tone = tone
|
||||
let data = presentationCallToneData(tone)
|
||||
|
||||
var controlImpl: ((MediaPlayerAudioSessionCustomControl) -> Disposable)?
|
||||
|
||||
@ -52,18 +51,28 @@ private final class PresentationCallToneRenderer {
|
||||
|
||||
let toneDataOffset = Atomic<Int>(value: 0)
|
||||
|
||||
let toneDataMaxOffset: Int?
|
||||
if let loopCount = tone.loopCount {
|
||||
toneDataMaxOffset = (data?.count ?? 0) * loopCount
|
||||
} else {
|
||||
toneDataMaxOffset = nil
|
||||
}
|
||||
let toneData = Atomic<Data?>(value: nil)
|
||||
|
||||
self.toneRenderer.beginRequestingFrames(queue: DispatchQueue.global(), takeFrame: {
|
||||
var data = toneData.with { $0 }
|
||||
if data == nil {
|
||||
data = presentationCallToneData(tone)
|
||||
if data != nil {
|
||||
let _ = toneData.swap(data)
|
||||
}
|
||||
}
|
||||
|
||||
guard let toneData = data else {
|
||||
return .finished
|
||||
}
|
||||
|
||||
let toneDataMaxOffset: Int?
|
||||
if let loopCount = tone.loopCount {
|
||||
toneDataMaxOffset = (data?.count ?? 0) * loopCount
|
||||
} else {
|
||||
toneDataMaxOffset = nil
|
||||
}
|
||||
|
||||
let frameSize = 44100
|
||||
|
||||
var takeOffset: Int?
|
||||
|
@ -2186,6 +2186,9 @@ final class SecureIdDocumentFormControllerNode: FormControllerNode<SecureIdDocum
|
||||
case .postcode:
|
||||
valueKey = .address
|
||||
errorKey = .field(.address(.postCode))
|
||||
case .city:
|
||||
valueKey = .address
|
||||
errorKey = .field(.address(.city))
|
||||
default:
|
||||
break
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user