diff --git a/MVMCoreUI/Accessibility/AccessibilityHandler.swift b/MVMCoreUI/Accessibility/AccessibilityHandler.swift index 3ee9c3f7..c1376437 100644 --- a/MVMCoreUI/Accessibility/AccessibilityHandler.swift +++ b/MVMCoreUI/Accessibility/AccessibilityHandler.swift @@ -8,10 +8,11 @@ import Foundation import Combine +import MVMCore -public enum AccessibilityNotificationType { +public enum AccessibilityNotificationType: String, Codable { - case controllerChanged, layoutChanged, screenChanged, announcement + case controllerChanged, layoutChanged, screenChanged, announcement, webPageChanged //TODO: - Foucs is shifting to respective element only if we add delay only on new viewcontroller appear. Need to investigate futher. //https://developer.apple.com/forums/thread/132699, @@ -36,6 +37,8 @@ public enum AccessibilityNotificationType { return .screenChanged case .layoutChanged, .controllerChanged: return .layoutChanged + case .webPageChanged: + return .layoutChanged } } } @@ -94,14 +97,13 @@ open class AccessibilityHandler { private var anyCancellable: Set = [] private weak var delegate: MVMCoreViewControllerProtocol? private var accessibilityId: String? - private var operationType: UINavigationController.Operation? private var previousAccessiblityElement: Any? public init() { registerWithNotificationCenter() registerForPageChanges() registerForFocusChanges() -// registerForTopNotificationsChanges() + registerForTopNotificationsChanges() registerForWebpageNavigation() } @@ -141,7 +143,7 @@ open class AccessibilityHandler { private func registerForWebpageNavigation() { webPageNavigated.sink { [weak self] _ in - self?.post(notification: .controllerChanged, argument: self?.getFirstFocusedElementOnScreen()) + self?.post(notification: .layoutChanged, argument: self?.getFirstFocusedElementOnScreen()) }.store(in: &anyCancellable) } @@ -153,7 +155,7 @@ open class AccessibilityHandler { accessibilityOperationQueue.cancelAllOperations() } - public func post(notification type: AccessibilityNotificationType, argument: Any?) { + public func post(notification type: AccessibilityNotificationType, argument: Any? = nil) { guard UIAccessibility.isVoiceOverRunning else { return } let accessbilityOperation = AccessbilityOperation(notificationType: type, argument: argument) add(operation: accessbilityOperation) @@ -168,16 +170,17 @@ extension AccessibilityHandler: MVMCorePresentationDelegateProtocol { public func navigationController(_ navigationController: UINavigationController, prepareDisplayFor viewController: UIViewController) { delegate = viewController as? MVMCoreViewControllerProtocol - operationType = navigationController.viewControllers.contains(viewController) ? .pop : .push } public func navigationController(_ navigationController: UINavigationController, displayedViewController viewController: UIViewController) { - //TODO: - For push operation we are posting accessibility notification to the top left item or the identified accessibility element from pageJSON. Need to check the logic for pop operation guard UIAccessibility.isVoiceOverRunning, - operationType == .push, canPostAccessbilityNotification(for: viewController) else { return } + var navigationOperationType: NavigationType = .push + if let presentationStyle = delegate?.loadObject??.pageJSON?.optionalStringForKey(KeyPresentationStyle) ?? delegate?.loadObject??.requestParameters?.actionMap?.optionalStringForKey(KeyPresentationStyle), presentationStyle == "root" { + navigationOperationType = .set //TODO: - For Tabbar change: adding 1.5 sec delay to shift focus to the top. + } let accessbilityElement = getAccessbilityFocusedElement() - post(notification: .controllerChanged, argument: accessbilityElement ?? getFirstFocusedElementOnScreen()) + post(notification: navigationOperationType == .set ? .controllerChanged : .layoutChanged, argument: accessbilityElement ?? getFirstFocusedElementOnScreen()) } } @@ -190,7 +193,6 @@ extension AccessibilityHandler { return nil } return (delegate as? UIViewController)?.view?.getMoleculeViews { (subView: MoleculeViewProtocol) in - print("subview: \(subView)") guard let moleculeModel = (subView as? MoleculeViewModelProtocol)?.getMoleculeModel() as? (any AccessibilityElementProtocol), moleculeModel.id == (accessibilityModel as? (any AccessibilityElementProtocol))?.id else { return false