Flutter iOS Embedder
accessibility_bridge.h
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_ACCESSIBILITY_BRIDGE_H_
6 #define FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_ACCESSIBILITY_BRIDGE_H_
7 
8 #import <UIKit/UIKit.h>
9 
10 #include <memory>
11 #include <unordered_map>
12 #include <unordered_set>
13 #include <vector>
14 
15 #include "flutter/fml/macros.h"
16 #include "flutter/fml/memory/weak_ptr.h"
17 #include "flutter/fml/platform/darwin/scoped_nsobject.h"
18 #include "flutter/lib/ui/semantics/custom_accessibility_action.h"
19 #include "flutter/lib/ui/semantics/semantics_node.h"
26 #include "third_party/skia/include/core/SkRect.h"
27 
28 namespace flutter {
29 class PlatformViewIOS;
30 
31 /**
32  * An accessibility instance is bound to one `FlutterViewController` and
33  * `FlutterView` instance.
34  *
35  * It helps populate the UIView's accessibilityElements property from Flutter's
36  * semantics nodes.
37  */
39  public:
40  /** Delegate for handling iOS operations. */
41  class IosDelegate {
42  public:
43  virtual ~IosDelegate() = default;
44  /// Returns true when the FlutterViewController associated with the `view`
45  /// is presenting a modal view controller.
47  FlutterViewController* view_controller) = 0;
48  virtual void PostAccessibilityNotification(UIAccessibilityNotifications notification,
49  id argument) = 0;
50  };
51 
54  std::shared_ptr<PlatformViewsController> platform_views_controller,
55  std::unique_ptr<IosDelegate> ios_delegate = nullptr);
57 
58  void UpdateSemantics(flutter::SemanticsNodeUpdates nodes,
59  const flutter::CustomAccessibilityActionUpdates& actions);
60  void HandleEvent(NSDictionary<NSString*, id>* annotatedEvent);
61  void DispatchSemanticsAction(int32_t id, flutter::SemanticsAction action) override;
62  void DispatchSemanticsAction(int32_t id,
63  flutter::SemanticsAction action,
64  fml::MallocMapping args) override;
65  void AccessibilityObjectDidBecomeFocused(int32_t id) override;
66  void AccessibilityObjectDidLoseFocus(int32_t id) override;
67 
68  UIView<UITextInput>* textInputView() override;
69 
70  UIView* view() const override { return view_controller_.view; }
71 
72  bool isVoiceOverRunning() const override { return view_controller_.isVoiceOverRunning; }
73 
74  fml::WeakPtr<AccessibilityBridge> GetWeakPtr();
75 
76  std::shared_ptr<PlatformViewsController> GetPlatformViewsController() const override {
77  return platform_views_controller_;
78  };
79 
80  void clearState();
81 
82  private:
83  SemanticsObject* GetOrCreateObject(int32_t id, flutter::SemanticsNodeUpdates& updates);
84  SemanticsObject* FindNextFocusableIfNecessary();
85  // Finds the first focusable SemanticsObject rooted at the parent. This includes the parent itself
86  // if it is a focusable SemanticsObject.
87  //
88  // If the parent is nil, this function use the root SemanticsObject as the parent.
89  SemanticsObject* FindFirstFocusable(SemanticsObject* parent);
90  void VisitObjectsRecursivelyAndRemove(SemanticsObject* object,
91  NSMutableArray<NSNumber*>* doomed_uids);
92 
93  FlutterViewController* view_controller_;
94  PlatformViewIOS* platform_view_;
95  const std::shared_ptr<PlatformViewsController> platform_views_controller_;
96  // If the this id is kSemanticObjectIdInvalid, it means either nothing has
97  // been focused or the focus is currently outside of the flutter application
98  // (i.e. the status bar or keyboard)
99  int32_t last_focused_semantics_object_id_;
100 
101  // TODO(cbracken): https://github.com/flutter/flutter/issues/137801
102  // Eliminate use of fml::scoped_* wrappers here.
103  fml::scoped_nsobject<NSMutableDictionary<NSNumber*, SemanticsObject*>> objects_;
104  fml::scoped_nsprotocol<FlutterBasicMessageChannel*> accessibility_channel_;
105  int32_t previous_route_id_ = 0;
106  std::unordered_map<int32_t, flutter::CustomAccessibilityAction> actions_;
107  std::vector<int32_t> previous_routes_;
108  std::unique_ptr<IosDelegate> ios_delegate_;
109  fml::WeakPtrFactory<AccessibilityBridge> weak_factory_; // Must be the last member.
110  FML_DISALLOW_COPY_AND_ASSIGN(AccessibilityBridge);
111 };
112 
113 } // namespace flutter
114 
115 #endif // FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_ACCESSIBILITY_BRIDGE_H_
accessibility_bridge_ios.h
FlutterViewController
Definition: FlutterViewController.h:57
flutter::AccessibilityBridge::AccessibilityObjectDidLoseFocus
void AccessibilityObjectDidLoseFocus(int32_t id) override
FlutterTextInputPlugin.h
flutter::AccessibilityBridge::textInputView
UIView< UITextInput > * textInputView() override
FlutterChannels.h
flutter::AccessibilityBridge::clearState
void clearState()
flutter::AccessibilityBridge::IosDelegate::PostAccessibilityNotification
virtual void PostAccessibilityNotification(UIAccessibilityNotifications notification, id argument)=0
flutter::AccessibilityBridge::IosDelegate
Definition: accessibility_bridge.h:41
platform_view
std::unique_ptr< flutter::PlatformViewIOS > platform_view
Definition: FlutterEnginePlatformViewTest.mm:65
flutter::PlatformViewIOS
Definition: platform_view_ios.h:41
flutter::AccessibilityBridge::view
UIView * view() const override
Definition: accessibility_bridge.h:70
flutter::AccessibilityBridge
Definition: accessibility_bridge.h:38
flutter::AccessibilityBridge::isVoiceOverRunning
bool isVoiceOverRunning() const override
Definition: accessibility_bridge.h:72
flutter::AccessibilityBridge::AccessibilityBridge
AccessibilityBridge()
Creates a new instance of a accessibility bridge.
Definition: accessibility_bridge.cc:23
flutter
Definition: accessibility_bridge.h:28
flutter::AccessibilityBridge::GetPlatformViewsController
std::shared_ptr< PlatformViewsController > GetPlatformViewsController() const override
Definition: accessibility_bridge.h:76
flutter::AccessibilityBridge::IosDelegate::IsFlutterViewControllerPresentingModalViewController
virtual bool IsFlutterViewControllerPresentingModalViewController(FlutterViewController *view_controller)=0
flutter::AccessibilityBridgeIos
Interface that represents an accessibility bridge for iOS.
Definition: accessibility_bridge_ios.h:20
flutter::AccessibilityBridge::AccessibilityObjectDidBecomeFocused
void AccessibilityObjectDidBecomeFocused(int32_t id) override
FlutterViewController_Internal.h
SemanticsObject.h
flutter::AccessibilityBridge::DispatchSemanticsAction
void DispatchSemanticsAction(int32_t id, flutter::SemanticsAction action) override
flutter::AccessibilityBridge::IosDelegate::~IosDelegate
virtual ~IosDelegate()=default
flutter::AccessibilityBridge::UpdateSemantics
void UpdateSemantics(flutter::SemanticsNodeUpdates nodes, const flutter::CustomAccessibilityActionUpdates &actions)
FlutterView.h
flutter::AccessibilityBridge::GetWeakPtr
fml::WeakPtr< AccessibilityBridge > GetWeakPtr()
flutter::AccessibilityBridge::HandleEvent
void HandleEvent(NSDictionary< NSString *, id > *annotatedEvent)
SemanticsObject
Definition: SemanticsObject.h:30
flutter::AccessibilityBridge::~AccessibilityBridge
~AccessibilityBridge()
Definition: accessibility_bridge.cc:34