1 /* 2 * Copyright (c) 2022-2023 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef FOUNDATION_ACE_FRAMEWORKS_COMPONENTS_NG_PROPERTIES_ACCESSIBILITY_PROPERTY_H 17 #define FOUNDATION_ACE_FRAMEWORKS_COMPONENTS_NG_PROPERTIES_ACCESSIBILITY_PROPERTY_H 18 19 #include <cstdint> 20 #include <string> 21 #include <unordered_set> 22 23 #include "base/memory/ace_type.h" 24 #include "core/accessibility/accessibility_utils.h" 25 #include "core/components_ng/base/ui_node.h" 26 27 namespace OHOS::Ace::NG { 28 using ActionNoParam = std::function<void()>; 29 using ActionSetTextImpl = std::function<void(const std::string&)>; 30 using ActionScrollForwardImpl = ActionNoParam; 31 using ActionScrollBackwardImpl = ActionNoParam; 32 using ActionSetSelectionImpl = std::function<void(int32_t start, int32_t end)>; 33 using ActionCopyImpl = ActionNoParam; 34 using ActionCutImpl = ActionNoParam; 35 using ActionPasteImpl = ActionNoParam; 36 using ActionSelectImpl = ActionNoParam; 37 using ActionClearSelectionImpl = ActionNoParam; 38 using ActionMoveTextImpl = std::function<void(int32_t moveUnit, bool forward)>; 39 40 class FrameNode; 41 class ACE_EXPORT AccessibilityProperty : public virtual AceType { 42 DECLARE_ACE_TYPE(AccessibilityProperty, AceType); 43 44 public: 45 AccessibilityProperty() = default; 46 47 ~AccessibilityProperty() override = default; 48 GetText()49 virtual std::string GetText() const 50 { 51 return propText_.value_or(""); 52 } 53 SetText(const std::string & text)54 virtual void SetText(const std::string& text) 55 { 56 propText_ = text; 57 } 58 IsCheckable()59 virtual bool IsCheckable() const 60 { 61 return false; 62 } 63 IsChecked()64 virtual bool IsChecked() const 65 { 66 return false; 67 } 68 IsSelected()69 virtual bool IsSelected() const 70 { 71 return false; 72 } 73 IsPassword()74 virtual bool IsPassword() const 75 { 76 return false; 77 } 78 IsEditable()79 virtual bool IsEditable() const 80 { 81 return false; 82 } 83 IsMultiLine()84 virtual bool IsMultiLine() const 85 { 86 return false; 87 } 88 IsDeletable()89 virtual bool IsDeletable() const 90 { 91 return false; 92 } 93 IsHint()94 virtual bool IsHint() const 95 { 96 return false; 97 } 98 IsScrollable()99 virtual bool IsScrollable() const 100 { 101 return false; 102 } 103 GetCurrentIndex()104 virtual int32_t GetCurrentIndex() const 105 { 106 return -1; 107 } 108 GetBeginIndex()109 virtual int32_t GetBeginIndex() const 110 { 111 return -1; 112 } 113 GetEndIndex()114 virtual int32_t GetEndIndex() const 115 { 116 return -1; 117 } 118 ToJsonValue(std::unique_ptr<JsonValue> & json)119 virtual void ToJsonValue(std::unique_ptr<JsonValue>& json) const 120 { 121 json->Put("scrollable", IsScrollable()); 122 } 123 FromJson(const std::unique_ptr<JsonValue> & json)124 virtual void FromJson(const std::unique_ptr<JsonValue>& json) {} 125 HasRange()126 virtual bool HasRange() const 127 { 128 return false; 129 } 130 GetAccessibilityValue()131 virtual AccessibilityValue GetAccessibilityValue() const 132 { 133 return AccessibilityValue(); 134 } 135 SetHost(const WeakPtr<FrameNode> & host)136 void SetHost(const WeakPtr<FrameNode>& host) 137 { 138 host_ = host; 139 } 140 GetHintText()141 virtual std::string GetHintText() const 142 { 143 return ""; 144 } 145 GetTextLengthLimit()146 virtual int32_t GetTextLengthLimit() const 147 { 148 return -1; 149 } 150 GetCollectionInfo()151 virtual AceCollectionInfo GetCollectionInfo() const 152 { 153 return AceCollectionInfo(); 154 } 155 GetCollectionItemInfo()156 virtual AceCollectionItemInfo GetCollectionItemInfo() const 157 { 158 return AceCollectionItemInfo(); 159 } 160 GetErrorText()161 virtual std::string GetErrorText() const 162 { 163 return ""; 164 } 165 GetTextSelectionStart()166 virtual int32_t GetTextSelectionStart() const 167 { 168 return 0; 169 } 170 GetTextSelectionEnd()171 virtual int32_t GetTextSelectionEnd() const 172 { 173 return 0; 174 } 175 GetTextInputType()176 virtual AceTextCategory GetTextInputType() const 177 { 178 return AceTextCategory::INPUT_TYPE_DEFAULT; 179 } 180 GetCollectionItemCounts()181 virtual int32_t GetCollectionItemCounts() const 182 { 183 return 0; 184 } 185 GetContentInvalid()186 virtual bool GetContentInvalid() const 187 { 188 return true; 189 } 190 AddSupportAction(AceAction action)191 void AddSupportAction(AceAction action) 192 { 193 supportActions_ |= (1UL << static_cast<uint32_t>(action)); 194 } 195 196 std::unordered_set<AceAction> GetSupportAction() const; 197 ResetSupportAction()198 void ResetSupportAction() 199 { 200 supportActions_ = 0; 201 SetSpecificSupportAction(); 202 }; 203 SetActionSetText(const ActionSetTextImpl & actionSetTextImpl)204 void SetActionSetText(const ActionSetTextImpl& actionSetTextImpl) 205 { 206 actionSetTextImpl_ = actionSetTextImpl; 207 } 208 ActActionSetText(const std::string & text)209 bool ActActionSetText(const std::string& text) 210 { 211 if (actionSetTextImpl_) { 212 actionSetTextImpl_(text); 213 return true; 214 } 215 return false; 216 } 217 SetActionSetSelection(const ActionSetSelectionImpl & actionSetSelection)218 void SetActionSetSelection(const ActionSetSelectionImpl& actionSetSelection) 219 { 220 actionSetSelectionImpl_ = actionSetSelection; 221 } 222 ActActionSetSelection(int32_t start,int32_t end)223 bool ActActionSetSelection(int32_t start, int32_t end) 224 { 225 if (actionSetSelectionImpl_) { 226 actionSetSelectionImpl_(start, end); 227 return true; 228 } 229 return false; 230 } 231 SetActionMoveText(const ActionMoveTextImpl & actionMoveText)232 void SetActionMoveText(const ActionMoveTextImpl& actionMoveText) 233 { 234 actionMoveTextImpl_ = actionMoveText; 235 } 236 ActActionMoveText(int32_t moveUnit,bool forward)237 bool ActActionMoveText(int32_t moveUnit, bool forward) 238 { 239 if (actionMoveTextImpl_) { 240 actionMoveTextImpl_(moveUnit, forward); 241 return true; 242 } 243 return false; 244 } 245 SetActionScrollForward(const ActionScrollForwardImpl & actionScrollForwardImpl)246 void SetActionScrollForward(const ActionScrollForwardImpl& actionScrollForwardImpl) 247 { 248 actionScrollForwardImpl_ = actionScrollForwardImpl; 249 } 250 ActActionScrollForward()251 bool ActActionScrollForward() 252 { 253 if (actionScrollForwardImpl_) { 254 actionScrollForwardImpl_(); 255 return true; 256 } 257 return false; 258 } 259 SetActionScrollBackward(const ActionScrollBackwardImpl & actionScrollBackwardImpl)260 void SetActionScrollBackward(const ActionScrollBackwardImpl& actionScrollBackwardImpl) 261 { 262 actionScrollBackwardImpl_ = actionScrollBackwardImpl; 263 } 264 ActActionScrollBackward()265 bool ActActionScrollBackward() 266 { 267 if (actionScrollBackwardImpl_) { 268 actionScrollBackwardImpl_(); 269 return true; 270 } 271 return false; 272 } 273 SetActionCopy(const ActionCopyImpl & actionCopyImpl)274 void SetActionCopy(const ActionCopyImpl& actionCopyImpl) 275 { 276 actionCopyImpl_ = actionCopyImpl; 277 } 278 ActActionCopy()279 bool ActActionCopy() 280 { 281 if (actionCopyImpl_) { 282 actionCopyImpl_(); 283 return true; 284 } 285 return false; 286 } 287 SetActionCut(const ActionCutImpl & actionCutImpl)288 void SetActionCut(const ActionCutImpl& actionCutImpl) 289 { 290 actionCutImpl_ = actionCutImpl; 291 } 292 ActActionCut()293 bool ActActionCut() 294 { 295 if (actionCutImpl_) { 296 actionCutImpl_(); 297 return true; 298 } 299 return false; 300 } 301 SetActionPaste(const ActionPasteImpl & actionPasteImpl)302 void SetActionPaste(const ActionPasteImpl& actionPasteImpl) 303 { 304 actionPasteImpl_ = actionPasteImpl; 305 } 306 ActActionPaste()307 bool ActActionPaste() 308 { 309 if (actionPasteImpl_) { 310 actionPasteImpl_(); 311 return true; 312 } 313 return false; 314 } 315 SetActionSelect(const ActionSelectImpl & actionSelectImpl)316 void SetActionSelect(const ActionSelectImpl& actionSelectImpl) 317 { 318 actionSelectImpl_ = actionSelectImpl; 319 } 320 ActActionSelect()321 bool ActActionSelect() 322 { 323 if (actionSelectImpl_) { 324 actionSelectImpl_(); 325 return true; 326 } 327 return false; 328 } 329 SetActionClearSelection(const ActionClearSelectionImpl & actionClearSelectionImpl)330 void SetActionClearSelection(const ActionClearSelectionImpl& actionClearSelectionImpl) 331 { 332 actionClearSelectionImpl_ = actionClearSelectionImpl; 333 } 334 ActActionClearSelection()335 bool ActActionClearSelection() 336 { 337 if (actionClearSelectionImpl_) { 338 actionClearSelectionImpl_(); 339 return true; 340 } 341 return false; 342 } 343 SetAccessibilityGroup(bool accessibilityGroup)344 void SetAccessibilityGroup(bool accessibilityGroup) 345 { 346 accessibilityGroup_ = accessibilityGroup; 347 } 348 SetAccessibilityText(const std::string & text)349 void SetAccessibilityText(const std::string& text) 350 { 351 accessibilityText_ = text; 352 } 353 SetAccessibilityDescription(const std::string & accessibilityDescription)354 void SetAccessibilityDescription(const std::string& accessibilityDescription) 355 { 356 accessibilityDescription_ = accessibilityDescription; 357 } 358 SetAccessibilityLevel(const std::string & accessibilityLevel)359 void SetAccessibilityLevel(const std::string& accessibilityLevel) 360 { 361 if (accessibilityLevel == "auto" || accessibilityLevel == "yes" || accessibilityLevel == "no" || 362 accessibilityLevel == "no-hide-descendants") { 363 accessibilityLevel_ = accessibilityLevel; 364 } else { 365 accessibilityLevel_ = "auto"; 366 } 367 } 368 IsAccessibilityGroup()369 bool IsAccessibilityGroup() const 370 { 371 return accessibilityGroup_; 372 } 373 SaveAccessibilityVirtualNode(const RefPtr<UINode> & node)374 void SaveAccessibilityVirtualNode(const RefPtr<UINode>& node) 375 { 376 accessibilityVirtualNode_ = node; 377 } 378 GetAccessibilityVirtualNode()379 RefPtr<UINode> GetAccessibilityVirtualNode() 380 { 381 return accessibilityVirtualNode_; 382 } 383 384 std::string GetAccessibilityText(bool isParentGroup = false); 385 GetAccessibilityDescription()386 std::string GetAccessibilityDescription() 387 { 388 return accessibilityDescription_.value_or(""); 389 } 390 GetAccessibilityLevel()391 virtual std::string GetAccessibilityLevel() 392 { 393 if (!accessibilityLevel_.has_value()) { 394 return "yes"; 395 } 396 accessibilityLevel_ = accessibilityLevel_ == "auto" ? "yes" : accessibilityLevel_; 397 return accessibilityLevel_.value(); 398 } 399 400 protected: SetSpecificSupportAction()401 virtual void SetSpecificSupportAction() {} 402 std::optional<std::string> propText_; 403 WeakPtr<FrameNode> host_; 404 uint64_t supportActions_ = 0; 405 ActionSetTextImpl actionSetTextImpl_; 406 ActionSetSelectionImpl actionSetSelectionImpl_; 407 ActionMoveTextImpl actionMoveTextImpl_; 408 ActionScrollForwardImpl actionScrollForwardImpl_; 409 ActionScrollBackwardImpl actionScrollBackwardImpl_; 410 ActionCopyImpl actionCopyImpl_; 411 ActionCutImpl actionCutImpl_; 412 ActionPasteImpl actionPasteImpl_; 413 ActionSelectImpl actionSelectImpl_; 414 ActionClearSelectionImpl actionClearSelectionImpl_; 415 bool accessibilityGroup_ = false; 416 RefPtr<UINode> accessibilityVirtualNode_; 417 std::optional<std::string> accessibilityText_; 418 std::optional<std::string> accessibilityDescription_; 419 std::optional<std::string> accessibilityLevel_; 420 ACE_DISALLOW_COPY_AND_MOVE(AccessibilityProperty); 421 }; 422 } // namespace OHOS::Ace::NG 423 424 #endif 425