Flutter iOS Embedder
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros
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/lib/ui/semantics/custom_accessibility_action.h"
18 #include "flutter/lib/ui/semantics/semantics_node.h"
25 #include "third_party/skia/include/core/SkRect.h"
26 
27 namespace flutter {
28 class PlatformViewIOS;
29 
30 /**
31  * An accessibility instance is bound to one `FlutterViewController` and
32  * `FlutterView` instance.
33  *
34  * It helps populate the UIView's accessibilityElements property from Flutter's
35  * semantics nodes.
36  */
38  public:
39  /** Delegate for handling iOS operations. */
40  class IosDelegate {
41  public:
42  virtual ~IosDelegate() = default;
43  /// Returns true when the FlutterViewController associated with the `view`
44  /// is presenting a modal view controller.
46  FlutterViewController* view_controller) = 0;
47  virtual void PostAccessibilityNotification(UIAccessibilityNotifications notification,
48  id argument) = 0;
49  };
50 
53  __weak FlutterPlatformViewsController* platform_views_controller,
54  std::unique_ptr<IosDelegate> ios_delegate = nullptr);
56 
57  void UpdateSemantics(flutter::SemanticsNodeUpdates nodes,
58  const flutter::CustomAccessibilityActionUpdates& actions);
59  void HandleEvent(NSDictionary<NSString*, id>* annotatedEvent);
60  void DispatchSemanticsAction(int32_t id, flutter::SemanticsAction action) override;
61  void DispatchSemanticsAction(int32_t id,
62  flutter::SemanticsAction action,
63  fml::MallocMapping args) override;
64  void AccessibilityObjectDidBecomeFocused(int32_t id) override;
65  void AccessibilityObjectDidLoseFocus(int32_t id) override;
66 
67  UIView<UITextInput>* textInputView() override;
68 
69  UIView* view() const override { return view_controller_.view; }
70 
71  bool isVoiceOverRunning() const override { return view_controller_.isVoiceOverRunning; }
72 
73  fml::WeakPtr<AccessibilityBridge> GetWeakPtr();
74 
76  return platform_views_controller_;
77  };
78 
79  void clearState();
80 
81  private:
82  SemanticsObject* GetOrCreateObject(int32_t id, flutter::SemanticsNodeUpdates& updates);
83  SemanticsObject* FindNextFocusableIfNecessary();
84  // Finds the first focusable SemanticsObject rooted at the parent. This includes the parent itself
85  // if it is a focusable SemanticsObject.
86  //
87  // If the parent is nil, this function use the root SemanticsObject as the parent.
88  SemanticsObject* FindFirstFocusable(SemanticsObject* parent);
89  void VisitObjectsRecursivelyAndRemove(SemanticsObject* object,
90  NSMutableArray<NSNumber*>* doomed_uids);
91 
92  FlutterViewController* view_controller_;
93  PlatformViewIOS* platform_view_;
94  __weak FlutterPlatformViewsController* platform_views_controller_;
95  // If the this id is kSemanticObjectIdInvalid, it means either nothing has
96  // been focused or the focus is currently outside of the flutter application
97  // (i.e. the status bar or keyboard)
98  int32_t last_focused_semantics_object_id_;
99 
100  NSMutableDictionary<NSNumber*, SemanticsObject*>* objects_;
101  FlutterBasicMessageChannel* accessibility_channel_;
102  int32_t previous_route_id_ = 0;
103  std::unordered_map<int32_t, flutter::CustomAccessibilityAction> actions_;
104  std::vector<int32_t> previous_routes_;
105  std::unique_ptr<IosDelegate> ios_delegate_;
106  fml::WeakPtrFactory<AccessibilityBridge> weak_factory_; // Must be the last member.
107  FML_DISALLOW_COPY_AND_ASSIGN(AccessibilityBridge);
108 };
109 
110 } // namespace flutter
111 
112 #endif // FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_ACCESSIBILITY_BRIDGE_H_
accessibility_bridge_ios.h
FlutterBasicMessageChannel
Definition: FlutterChannels.h:37
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:40
platform_view
std::unique_ptr< flutter::PlatformViewIOS > platform_view
Definition: FlutterEnginePlatformViewTest.mm:66
flutter::PlatformViewIOS
Definition: platform_view_ios.h:39
flutter::AccessibilityBridge::view
UIView * view() const override
Definition: accessibility_bridge.h:69
flutter::AccessibilityBridge
Definition: accessibility_bridge.h:37
flutter::AccessibilityBridge::isVoiceOverRunning
bool isVoiceOverRunning() const override
Definition: accessibility_bridge.h:71
flutter::AccessibilityBridge::AccessibilityBridge
AccessibilityBridge()
Creates a new instance of a accessibility bridge.
Definition: accessibility_bridge.cc:23
flutter
Definition: accessibility_bridge.h:27
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
FlutterPlatformViewsController
Definition: FlutterPlatformViewsController.h:31
SemanticsObject.h
flutter::AccessibilityBridge::GetPlatformViewsController
FlutterPlatformViewsController * GetPlatformViewsController() const override
Definition: accessibility_bridge.h:75
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:31
flutter::AccessibilityBridge::~AccessibilityBridge
~AccessibilityBridge()
Definition: accessibility_bridge.cc:34