mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-11-07 17:30:12 +00:00
VoiceOver fixes
This commit is contained in:
parent
a706c210de
commit
78a463a6d2
@ -2319,8 +2319,6 @@ Unused sets are archived when you add more.";
|
|||||||
"Notification.CallCanceledShort" = "Cancelled";
|
"Notification.CallCanceledShort" = "Cancelled";
|
||||||
"Notification.CallFormat" = "%1$@, %2$@"; // 1 - time, 2 - duration
|
"Notification.CallFormat" = "%1$@, %2$@"; // 1 - time, 2 - duration
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
"Call.ConnectionErrorTitle" = "Unable to Call";
|
"Call.ConnectionErrorTitle" = "Unable to Call";
|
||||||
"Call.ConnectionErrorMessage" = "Please check your internet connection and try again.";
|
"Call.ConnectionErrorMessage" = "Please check your internet connection and try again.";
|
||||||
|
|
||||||
@ -5801,3 +5799,14 @@ Sorry for the inconvenience.";
|
|||||||
|
|
||||||
"VoiceChat.StatusMutedForYou" = "muted for you";
|
"VoiceChat.StatusMutedForYou" = "muted for you";
|
||||||
"VoiceChat.StatusMutedYou" = "put you on mute";
|
"VoiceChat.StatusMutedYou" = "put you on mute";
|
||||||
|
|
||||||
|
"VoiceOver.DismissContextMenu" = "Dismiss Context Menu";
|
||||||
|
|
||||||
|
"Call.VoiceOver.VoiceCallOutgoing" = "Outgoing Voice Call";
|
||||||
|
"Call.VoiceOver.VideoCallOutgoing" = "Outgoing Video Call";
|
||||||
|
"Call.VoiceOver.VoiceCallIncoming" = "Incoming Voice Call";
|
||||||
|
"Call.VoiceOver.VideoCallIncoming" = "Incoming Video Call";
|
||||||
|
"Call.VoiceOver.VoiceCallMissed" = "Missed Voice Call";
|
||||||
|
"Call.VoiceOver.VideoCallMissed" = "Missed Video Call";
|
||||||
|
"Call.VoiceOver.VoiceCallCanceled" = "Cancelled Voice Call";
|
||||||
|
"Call.VoiceOver.VideoCallCanceled" = "Cancelled Video Call";
|
||||||
|
|||||||
@ -255,7 +255,6 @@ class CallListCallItemNode: ItemListRevealOptionsItemNode {
|
|||||||
for media in item.topMessage.media {
|
for media in item.topMessage.media {
|
||||||
if let action = media as? TelegramMediaAction {
|
if let action = media as? TelegramMediaAction {
|
||||||
if case let .phoneCall(_, _, _, isVideoValue) = action.action {
|
if case let .phoneCall(_, _, _, isVideoValue) = action.action {
|
||||||
break
|
|
||||||
isVideo = isVideoValue
|
isVideo = isVideoValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -369,6 +368,8 @@ class CallListCallItemNode: ItemListRevealOptionsItemNode {
|
|||||||
var titleAttributedString: NSAttributedString?
|
var titleAttributedString: NSAttributedString?
|
||||||
var statusAttributedString: NSAttributedString?
|
var statusAttributedString: NSAttributedString?
|
||||||
|
|
||||||
|
var statusAccessibilityString = ""
|
||||||
|
|
||||||
var titleColor = item.presentationData.theme.list.itemPrimaryTextColor
|
var titleColor = item.presentationData.theme.list.itemPrimaryTextColor
|
||||||
var hasMissed = false
|
var hasMissed = false
|
||||||
var hasIncoming = false
|
var hasIncoming = false
|
||||||
@ -431,19 +432,26 @@ class CallListCallItemNode: ItemListRevealOptionsItemNode {
|
|||||||
|
|
||||||
if hasMissed {
|
if hasMissed {
|
||||||
statusAttributedString = NSAttributedString(string: item.presentationData.strings.Notification_CallMissedShort, font: statusFont, textColor: item.presentationData.theme.list.itemSecondaryTextColor)
|
statusAttributedString = NSAttributedString(string: item.presentationData.strings.Notification_CallMissedShort, font: statusFont, textColor: item.presentationData.theme.list.itemSecondaryTextColor)
|
||||||
|
statusAccessibilityString = isVideo ? item.presentationData.strings.Call_VoiceOver_VideoCallMissed : item.presentationData.strings.Call_VoiceOver_VoiceCallMissed
|
||||||
} else if hasIncoming && hasOutgoing {
|
} else if hasIncoming && hasOutgoing {
|
||||||
statusAttributedString = NSAttributedString(string: item.presentationData.strings.Notification_CallOutgoingShort + ", " + item.presentationData.strings.Notification_CallIncomingShort, font: statusFont, textColor: item.presentationData.theme.list.itemSecondaryTextColor)
|
statusAttributedString = NSAttributedString(string: item.presentationData.strings.Notification_CallOutgoingShort + ", " + item.presentationData.strings.Notification_CallIncomingShort, font: statusFont, textColor: item.presentationData.theme.list.itemSecondaryTextColor)
|
||||||
|
statusAccessibilityString = isVideo ? (item.presentationData.strings.Call_VoiceOver_VideoCallOutgoing + ", " + item.presentationData.strings.Call_VoiceOver_VideoCallIncoming) : (item.presentationData.strings.Call_VoiceOver_VoiceCallOutgoing + ", " + item.presentationData.strings.Call_VoiceOver_VoiceCallIncoming)
|
||||||
} else if hasIncoming {
|
} else if hasIncoming {
|
||||||
if let callDuration = callDuration, callDuration != 0 {
|
if let callDuration = callDuration, callDuration != 0 {
|
||||||
statusAttributedString = NSAttributedString(string: item.presentationData.strings.Notification_CallTimeFormat(item.presentationData.strings.Notification_CallIncomingShort, callDurationString(strings: item.presentationData.strings, duration: callDuration)).0, font: statusFont, textColor: item.presentationData.theme.list.itemSecondaryTextColor)
|
statusAttributedString = NSAttributedString(string: item.presentationData.strings.Notification_CallTimeFormat(item.presentationData.strings.Notification_CallIncomingShort, callDurationString(strings: item.presentationData.strings, duration: callDuration)).0, font: statusFont, textColor: item.presentationData.theme.list.itemSecondaryTextColor)
|
||||||
|
statusAccessibilityString = item.presentationData.strings.Notification_CallTimeFormat(isVideo ? item.presentationData.strings.Call_VoiceOver_VideoCallIncoming : item.presentationData.strings.Call_VoiceOver_VoiceCallIncoming, callDurationString(strings: item.presentationData.strings, duration: callDuration)).0
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
statusAttributedString = NSAttributedString(string: item.presentationData.strings.Notification_CallIncomingShort, font: statusFont, textColor: item.presentationData.theme.list.itemSecondaryTextColor)
|
statusAttributedString = NSAttributedString(string: item.presentationData.strings.Notification_CallIncomingShort, font: statusFont, textColor: item.presentationData.theme.list.itemSecondaryTextColor)
|
||||||
|
statusAccessibilityString = isVideo ? item.presentationData.strings.Call_VoiceOver_VideoCallIncoming : item.presentationData.strings.Call_VoiceOver_VoiceCallIncoming
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if let callDuration = callDuration, callDuration != 0 {
|
if let callDuration = callDuration, callDuration != 0 {
|
||||||
statusAttributedString = NSAttributedString(string: item.presentationData.strings.Notification_CallTimeFormat(item.presentationData.strings.Notification_CallOutgoingShort, callDurationString(strings: item.presentationData.strings, duration: callDuration)).0, font: statusFont, textColor: item.presentationData.theme.list.itemSecondaryTextColor)
|
statusAttributedString = NSAttributedString(string: item.presentationData.strings.Notification_CallTimeFormat(item.presentationData.strings.Notification_CallOutgoingShort, callDurationString(strings: item.presentationData.strings, duration: callDuration)).0, font: statusFont, textColor: item.presentationData.theme.list.itemSecondaryTextColor)
|
||||||
|
statusAccessibilityString = item.presentationData.strings.Notification_CallTimeFormat(isVideo ? item.presentationData.strings.Call_VoiceOver_VideoCallOutgoing : item.presentationData.strings.Call_VoiceOver_VoiceCallOutgoing, callDurationString(strings: item.presentationData.strings, duration: callDuration)).0
|
||||||
} else {
|
} else {
|
||||||
statusAttributedString = NSAttributedString(string: item.presentationData.strings.Notification_CallOutgoingShort, font: statusFont, textColor: item.presentationData.theme.list.itemSecondaryTextColor)
|
statusAttributedString = NSAttributedString(string: item.presentationData.strings.Notification_CallOutgoingShort, font: statusFont, textColor: item.presentationData.theme.list.itemSecondaryTextColor)
|
||||||
|
statusAccessibilityString = isVideo ? item.presentationData.strings.Call_VoiceOver_VideoCallOutgoing : item.presentationData.strings.Call_VoiceOver_VoiceCallOutgoing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -610,9 +618,8 @@ class CallListCallItemNode: ItemListRevealOptionsItemNode {
|
|||||||
|
|
||||||
strongSelf.updateLayout(size: nodeLayout.contentSize, leftInset: params.leftInset, rightInset: params.rightInset)
|
strongSelf.updateLayout(size: nodeLayout.contentSize, leftInset: params.leftInset, rightInset: params.rightInset)
|
||||||
|
|
||||||
strongSelf.accessibilityArea.accessibilityTraits = .button
|
|
||||||
strongSelf.accessibilityArea.accessibilityLabel = titleAttributedString?.string
|
strongSelf.accessibilityArea.accessibilityLabel = titleAttributedString?.string
|
||||||
strongSelf.accessibilityArea.accessibilityValue = statusAttributedString?.string
|
strongSelf.accessibilityArea.accessibilityValue = statusAccessibilityString
|
||||||
strongSelf.accessibilityArea.frame = CGRect(origin: CGPoint(), size: nodeLayout.contentSize)
|
strongSelf.accessibilityArea.frame = CGRect(origin: CGPoint(), size: nodeLayout.contentSize)
|
||||||
|
|
||||||
strongSelf.infoButtonNode.accessibilityLabel = item.presentationData.strings.Conversation_Info
|
strongSelf.infoButtonNode.accessibilityLabel = item.presentationData.strings.Conversation_Info
|
||||||
|
|||||||
@ -427,6 +427,8 @@ public func chatListFilterPresetListController(context: AccountContext, mode: Ch
|
|||||||
}
|
}
|
||||||
|
|
||||||
let controller = ItemListController(context: context, state: signal)
|
let controller = ItemListController(context: context, state: signal)
|
||||||
|
controller.isOpaqueWhenInOverlay = true
|
||||||
|
controller.blocksBackgroundWhenInOverlay = true
|
||||||
switch mode {
|
switch mode {
|
||||||
case .default:
|
case .default:
|
||||||
controller.navigationPresentation = .default
|
controller.navigationPresentation = .default
|
||||||
|
|||||||
@ -1113,8 +1113,6 @@ public func createPollController(context: AccountContext, peer: Peer, isQuiz: Bo
|
|||||||
dismissInputImpl = { [weak controller] in
|
dismissInputImpl = { [weak controller] in
|
||||||
controller?.view.endEditing(true)
|
controller?.view.endEditing(true)
|
||||||
}
|
}
|
||||||
controller.isOpaqueWhenInOverlay = true
|
|
||||||
controller.blocksBackgroundWhenInOverlay = true
|
|
||||||
controller.acceptsFocusWhenInOverlay = true
|
controller.acceptsFocusWhenInOverlay = true
|
||||||
controller.experimentalSnapScrollToItem = true
|
controller.experimentalSnapScrollToItem = true
|
||||||
controller.alwaysSynchronous = true
|
controller.alwaysSynchronous = true
|
||||||
|
|||||||
@ -184,6 +184,9 @@ private final class ContextControllerNode: ViewControllerTracingNode, UIScrollVi
|
|||||||
self.withoutBlurDimNode.alpha = 0.0
|
self.withoutBlurDimNode.alpha = 0.0
|
||||||
|
|
||||||
self.dismissNode = ASDisplayNode()
|
self.dismissNode = ASDisplayNode()
|
||||||
|
self.dismissNode.isAccessibilityElement = true
|
||||||
|
self.dismissNode.accessibilityLabel = presentationData.strings.VoiceOver_DismissContextMenu
|
||||||
|
self.dismissNode.accessibilityTraits = .button
|
||||||
|
|
||||||
self.clippingNode = ASDisplayNode()
|
self.clippingNode = ASDisplayNode()
|
||||||
self.clippingNode.clipsToBounds = true
|
self.clippingNode.clipsToBounds = true
|
||||||
|
|||||||
@ -99,7 +99,7 @@ private final class NavigationControllerNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override func accessibilityPerformEscape() -> Bool {
|
override func accessibilityPerformEscape() -> Bool {
|
||||||
print("escape")
|
let _ = self.controller?.popViewController(animated: true)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@ -519,6 +519,7 @@ final class ChatMessageAccessibilityData {
|
|||||||
|
|
||||||
result += "\n\(dateString)"
|
result += "\n\(dateString)"
|
||||||
if !isIncoming && item.read {
|
if !isIncoming && item.read {
|
||||||
|
result += "\n"
|
||||||
if announceIncomingAuthors {
|
if announceIncomingAuthors {
|
||||||
result += item.presentationData.strings.VoiceOver_Chat_SeenByRecipients
|
result += item.presentationData.strings.VoiceOver_Chat_SeenByRecipients
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import TelegramPresentationData
|
|||||||
|
|
||||||
final class PeerInfoScreenSelectableBackgroundNode: ASDisplayNode {
|
final class PeerInfoScreenSelectableBackgroundNode: ASDisplayNode {
|
||||||
private let backgroundNode: ASDisplayNode
|
private let backgroundNode: ASDisplayNode
|
||||||
private let buttonNode: HighlightTrackingButtonNode
|
private let button: HighlightTrackingButton
|
||||||
|
|
||||||
let bringToFrontForHighlight: () -> Void
|
let bringToFrontForHighlight: () -> Void
|
||||||
|
|
||||||
@ -12,7 +12,7 @@ final class PeerInfoScreenSelectableBackgroundNode: ASDisplayNode {
|
|||||||
|
|
||||||
var pressed: (() -> Void)? {
|
var pressed: (() -> Void)? {
|
||||||
didSet {
|
didSet {
|
||||||
self.buttonNode.isUserInteractionEnabled = self.pressed != nil
|
self.button.isUserInteractionEnabled = self.pressed != nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -23,15 +23,16 @@ final class PeerInfoScreenSelectableBackgroundNode: ASDisplayNode {
|
|||||||
self.backgroundNode.isLayerBacked = true
|
self.backgroundNode.isLayerBacked = true
|
||||||
self.backgroundNode.alpha = 0.0
|
self.backgroundNode.alpha = 0.0
|
||||||
|
|
||||||
self.buttonNode = HighlightTrackingButtonNode()
|
self.button = HighlightTrackingButton()
|
||||||
|
self.button.isAccessibilityElement = false
|
||||||
|
|
||||||
super.init()
|
super.init()
|
||||||
|
|
||||||
self.addSubnode(self.backgroundNode)
|
self.addSubnode(self.backgroundNode)
|
||||||
self.addSubnode(self.buttonNode)
|
self.view.addSubview(self.button)
|
||||||
|
|
||||||
self.buttonNode.addTarget(self, action: #selector(self.buttonPressed), forControlEvents: .touchUpInside)
|
self.button.addTarget(self, action: #selector(self.buttonPressed), for: .touchUpInside)
|
||||||
self.buttonNode.highligthedChanged = { [weak self] highlighted in
|
self.button.highligthedChanged = { [weak self] highlighted in
|
||||||
self?.updateIsHighlighted(highlighted)
|
self?.updateIsHighlighted(highlighted)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -57,6 +58,6 @@ final class PeerInfoScreenSelectableBackgroundNode: ASDisplayNode {
|
|||||||
func update(size: CGSize, theme: PresentationTheme, transition: ContainedViewLayoutTransition) {
|
func update(size: CGSize, theme: PresentationTheme, transition: ContainedViewLayoutTransition) {
|
||||||
self.backgroundNode.backgroundColor = theme.list.itemHighlightedBackgroundColor
|
self.backgroundNode.backgroundColor = theme.list.itemHighlightedBackgroundColor
|
||||||
transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(), size: size))
|
transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(), size: size))
|
||||||
transition.updateFrame(node: self.buttonNode, frame: CGRect(origin: CGPoint(), size: size))
|
transition.updateFrame(view: self.button, frame: CGRect(origin: CGPoint(), size: size))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1449,6 +1449,7 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
|
|||||||
|
|
||||||
self.scrollNode = ASScrollNode()
|
self.scrollNode = ASScrollNode()
|
||||||
self.scrollNode.view.delaysContentTouches = false
|
self.scrollNode.view.delaysContentTouches = false
|
||||||
|
self.scrollNode.canCancelAllTouchesInViews = true
|
||||||
|
|
||||||
self.headerNode = PeerInfoHeaderNode(context: context, avatarInitiallyExpanded: avatarInitiallyExpanded, isOpenedFromChat: isOpenedFromChat, isSettings: isSettings)
|
self.headerNode = PeerInfoHeaderNode(context: context, avatarInitiallyExpanded: avatarInitiallyExpanded, isOpenedFromChat: isOpenedFromChat, isSettings: isSettings)
|
||||||
self.paneContainerNode = PeerInfoPaneContainerNode(context: context, peerId: peerId)
|
self.paneContainerNode = PeerInfoPaneContainerNode(context: context, peerId: peerId)
|
||||||
@ -2679,7 +2680,9 @@ private final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewD
|
|||||||
membersUpdated = true
|
membersUpdated = true
|
||||||
}
|
}
|
||||||
|
|
||||||
self.containerLayoutUpdated(layout: layout, navigationHeight: navigationHeight, transition: self.didSetReady && membersUpdated ? .animated(duration: 0.3, curve: .spring) : .immediate)
|
let infoUpdated = false // previousData != nil && (previousData?.cachedData == nil) != (data.cachedData == nil)
|
||||||
|
|
||||||
|
self.containerLayoutUpdated(layout: layout, navigationHeight: navigationHeight, transition: self.didSetReady && (membersUpdated || infoUpdated) ? .animated(duration: 0.3, curve: .spring) : .immediate)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -423,8 +423,6 @@ public func pollResultsController(context: AccountContext, messageId: MessageId,
|
|||||||
dismissImpl = { [weak controller] in
|
dismissImpl = { [weak controller] in
|
||||||
controller?.dismiss()
|
controller?.dismiss()
|
||||||
}
|
}
|
||||||
controller.isOpaqueWhenInOverlay = true
|
|
||||||
controller.blocksBackgroundWhenInOverlay = true
|
|
||||||
controller.acceptsFocusWhenInOverlay = true
|
controller.acceptsFocusWhenInOverlay = true
|
||||||
|
|
||||||
return controller
|
return controller
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user