1 #ifndef DALI_TOOLKIT_INTERNAL_ACCESSIBILITY_MANAGER_H
2 #define DALI_TOOLKIT_INTERNAL_ACCESSIBILITY_MANAGER_H
5 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
23 #include <dali/devel-api/common/map-wrapper.h>
24 #include <dali/devel-api/adaptor-framework/accessibility-action-handler.h>
25 #include <dali/devel-api/adaptor-framework/accessibility-gesture-handler.h>
26 #include <dali/devel-api/adaptor-framework/accessibility-gesture-event.h>
27 #include <dali/public-api/object/base-object.h>
30 #include <dali-toolkit/devel-api/accessibility-manager/accessibility-manager.h>
31 #include <dali/public-api/adaptor-framework/tts-player.h>
42 class AccessibilityManager;
45 * @copydoc Toolkit::AccessibilityManager
47 class AccessibilityManager : public Dali::BaseObject, Dali::AccessibilityActionHandler, Dali::AccessibilityGestureHandler, public Dali::ConnectionTracker
51 typedef Dali::Toolkit::AccessibilityManager::AccessibilityActionSignalType AccessibilityActionSignalType;
52 typedef Dali::Toolkit::AccessibilityManager::AccessibilityActionScrollSignalType AccessibilityActionScrollSignalType;
54 struct ActorAdditionalInfo
61 unsigned int mFocusOrder; ///< The focus order of the actor. It is undefined by default.
63 std::string mAccessibilityAttributes[Toolkit::AccessibilityManager::ACCESSIBILITY_ATTRIBUTE_NUM]; ///< The array of attribute texts
66 typedef std::pair<unsigned int, unsigned int> FocusIDPair;
67 typedef std::map<unsigned int, unsigned int> FocusIDContainer;
68 typedef FocusIDContainer::iterator FocusIDIter;
69 typedef FocusIDContainer::const_iterator FocusIDConstIter;
71 typedef std::pair<unsigned int, ActorAdditionalInfo> IDAdditionalInfoPair;
72 typedef std::map<unsigned int, ActorAdditionalInfo> IDAdditionalInfoContainer;
73 typedef IDAdditionalInfoContainer::iterator IDAdditionalInfoIter;
74 typedef IDAdditionalInfoContainer::const_iterator IDAdditionalInfoConstIter;
77 * Construct a new AccessibilityManager.
79 AccessibilityManager();
82 * Initialise the AccessibilityManager
87 * @copydoc Toolkit::AccessibilityManager::SetAccessibilityAttribute
89 void SetAccessibilityAttribute(Actor actor, Toolkit::AccessibilityManager::AccessibilityAttribute type, const std::string& text);
92 * @copydoc Toolkit::AccessibilityManager::GetAccessibilityAttribute
94 std::string GetAccessibilityAttribute(Actor actor, Toolkit::AccessibilityManager::AccessibilityAttribute type) const;
97 * @copydoc Toolkit::AccessibilityManager::SetFocusOrder
99 void SetFocusOrder(Actor actor, const unsigned int order);
102 * @copydoc Toolkit::AccessibilityManager::GetFocusOrder
104 unsigned int GetFocusOrder(Actor actor) const;
107 * @copydoc Toolkit::AccessibilityManager::GenerateNewFocusOrder
109 unsigned int GenerateNewFocusOrder() const;
112 * @copydoc Toolkit::AccessibilityManager::GetActorByFocusOrder
114 Actor GetActorByFocusOrder(const unsigned int order);
117 * @copydoc Toolkit::AccessibilityManager::SetCurrentFocusActor
119 bool SetCurrentFocusActor(Actor actor);
122 * @copydoc Toolkit::AccessibilityManager::GetCurrentFocusActor
124 Actor GetCurrentFocusActor();
127 * @copydoc Toolkit::AccessibilityManager::GetCurrentFocusGroup
129 Actor GetCurrentFocusGroup();
132 * @copydoc Toolkit::AccessibilityManager::GetCurrentFocusOrder
134 unsigned int GetCurrentFocusOrder();
137 * @copydoc Toolkit::AccessibilityManager::MoveFocusForward
139 bool MoveFocusForward();
142 * @copydoc Toolkit::AccessibilityManager::MoveFocusBackward
144 bool MoveFocusBackward();
147 * @copydoc Toolkit::AccessibilityManager::ClearFocus
152 * @copydoc Toolkit::AccessibilityManager::Reset
157 * @copydoc Toolkit::AccessibilityManager::SetFocusGroup
159 void SetFocusGroup(Actor actor, bool isFocusGroup);
162 * @copydoc Toolkit::AccessibilityManager::IsFocusGroup
164 bool IsFocusGroup(Actor actor) const;
167 * @copydoc Toolkit::AccessibilityManager::SetGroupMode
169 void SetGroupMode(bool enabled);
172 * @copydoc Toolkit::AccessibilityManager::GetGroupMode
174 bool GetGroupMode() const;
177 * @copydoc Toolkit::AccessibilityManager::SetWrapMode
179 void SetWrapMode(bool wrapped);
182 * @copydoc Toolkit::AccessibilityManager::GetWrapMode
184 bool GetWrapMode() const;
187 * @copydoc Toolkit::AccessibilityManager::SetFocusIndicatorActor
189 void SetFocusIndicatorActor(Actor indicator);
192 * @copydoc Toolkit::AccessibilityManager::GetFocusIndicatorActor
194 Actor GetFocusIndicatorActor();
197 * @copydoc Toolkit::AccessibilityManager::GetFocusGroup
199 Actor GetFocusGroup(Actor actor);
202 * @copydoc Toolkit::AccessibilityManager::GetReadPosition
204 Vector2 GetReadPosition() const;
209 * @copydoc Toolkit::AccessibilityManager::FocusChangedSignal()
211 Toolkit::AccessibilityManager::FocusChangedSignalType& FocusChangedSignal();
214 * @copydoc Toolkit::AccessibilityManager::FocusOvershotSignal()
216 Toolkit::AccessibilityManager::FocusOvershotSignalType& FocusOvershotSignal();
219 * @copydoc Toolkit::AccessibilityManager::FocusedActorActivatedSignal()
221 Toolkit::AccessibilityManager::FocusedActorActivatedSignalType& FocusedActorActivatedSignal();
226 * @copydoc Dali::Toolkit::AccessibilityManager::StatusChangedSignal
228 AccessibilityActionSignalType& StatusChangedSignal()
230 return mStatusChangedSignal;
234 * @copydoc Dali::Toolkit::AccessibilityManager::AccessibilityAdaptor::ActionNextSignal
236 AccessibilityActionSignalType& ActionNextSignal()
238 return mActionNextSignal;
242 * @copydoc Dali::Toolkit::AccessibilityManager::ActionPreviousSignal
244 AccessibilityActionSignalType& ActionPreviousSignal()
246 return mActionPreviousSignal;
250 * @copydoc Dali::Toolkit::AccessibilityManager::ActionActivateSignal
252 AccessibilityActionSignalType& ActionActivateSignal()
254 return mActionActivateSignal;
258 * @copydoc Dali::Toolkit::AccessibilityManager::ActionOverSignal
260 AccessibilityActionSignalType& ActionOverSignal()
262 return mActionOverSignal;
266 * @copydoc Dali::Toolkit::AccessibilityManager::ActionReadSignal
268 AccessibilityActionSignalType& ActionReadSignal()
270 return mActionReadSignal;
274 * @copydoc Dali::Toolkit::AccessibilityManager::ActionReadNextSignal
276 AccessibilityActionSignalType& ActionReadNextSignal()
278 return mActionReadNextSignal;
282 * @copydoc Dali::Toolkit::AccessibilityManager::ActionReadPreviousSignal
284 AccessibilityActionSignalType& ActionReadPreviousSignal()
286 return mActionReadPreviousSignal;
290 * @copydoc Dali::Toolkit::AccessibilityManager::ActionUpSignal
292 AccessibilityActionSignalType& ActionUpSignal()
294 return mActionUpSignal;
298 * @copydoc Dali::Toolkit::AccessibilityManager::ActionDownSignal
300 AccessibilityActionSignalType& ActionDownSignal()
302 return mActionDownSignal;
306 * @copydoc Dali::Toolkit::AccessibilityManager::ActionClearFocusSignal
308 AccessibilityActionSignalType& ActionClearFocusSignal()
310 return mActionClearFocusSignal;
314 * @copydoc Dali::Toolkit::AccessibilityManager::ActionBackSignal
316 AccessibilityActionSignalType& ActionBackSignal()
318 return mActionBackSignal;
322 * @copydoc Dali::Toolkit::AccessibilityManager::ActionScrollUpSignal
324 AccessibilityActionSignalType& ActionScrollUpSignal()
326 return mActionScrollUpSignal;
330 * @copydoc Dali::Toolkit::AccessibilityManager::ActionScrollDownSignal
332 AccessibilityActionSignalType& ActionScrollDownSignal()
334 return mActionScrollDownSignal;
338 * @copydoc Dali::Toolkit::AccessibilityManager::ActionPageLeftSignal
340 AccessibilityActionSignalType& ActionPageLeftSignal()
342 return mActionPageLeftSignal;
346 * @copydoc Dali::Toolkit::AccessibilityManager::ActionPageRightSignal
348 AccessibilityActionSignalType& ActionPageRightSignal()
350 return mActionPageRightSignal;
354 * @copydoc Dali::Toolkit::AccessibilityManager::ActionPageUpSignal
356 AccessibilityActionSignalType& ActionPageUpSignal()
358 return mActionPageUpSignal;
362 * @copydoc Dali::Toolkit::AccessibilityManager::ActionPageDownSignal
364 AccessibilityActionSignalType& ActionPageDownSignal()
366 return mActionPageDownSignal;
370 * @copydoc Dali::Toolkit::AccessibilityManager::ActionMoveToFirstSignal
372 AccessibilityActionSignalType& ActionMoveToFirstSignal()
374 return mActionMoveToFirstSignal;
378 * @copydoc Dali::Toolkit::AccessibilityManager::ActionMoveToLastSignal
380 AccessibilityActionSignalType& ActionMoveToLastSignal()
382 return mActionMoveToLastSignal;
386 * @copydoc Dali::Toolkit::AccessibilityManager::ActionReadFromTopSignal
388 AccessibilityActionSignalType& ActionReadFromTopSignal()
390 return mActionReadFromTopSignal;
394 * @copydoc Dali::Toolkit::AccessibilityManager::ActionReadFromNextSignal
396 AccessibilityActionSignalType& ActionReadFromNextSignal()
398 return mActionReadFromNextSignal;
402 * @copydoc Dali::Toolkit::AccessibilityManager::ActionZoomSignal
404 AccessibilityActionSignalType& ActionZoomSignal()
406 return mActionZoomSignal;
410 * @copydoc Dali::Toolkit::AccessibilityManager::ActionReadPauseResumeSignal
412 AccessibilityActionSignalType& ActionReadPauseResumeSignal()
414 return mActionReadPauseResumeSignal;
418 * @copydoc Dali::Toolkit::AccessibilityManager::ActionStartStopSignal
420 AccessibilityActionSignalType& ActionStartStopSignal()
422 return mActionStartStopSignal;
426 * @copydoc Dali::Toolkit::AccessibilityManager::ActionScrollSignal
428 AccessibilityActionScrollSignalType& ActionScrollSignal()
430 return mActionScrollSignal;
438 virtual ~AccessibilityManager();
443 * Get the additional information (e.g. focus order and description) of the given actor.
444 * @param actorID The ID of the actor to be queried
445 * @return The additional information of the actor
447 ActorAdditionalInfo GetActorAdditionalInfo(const unsigned int actorID) const;
450 * Synchronize the actor's additional information to reflect its latest focus order
451 * @param actorID The ID of the actor
452 * @param order The focus order of the actor
453 * @return The additional information of the actor
455 void SynchronizeActorAdditionalInfo(const unsigned int actorID, const unsigned int order);
458 * Move the focus to the specified actor and send notification for the focus change.
459 * @param actorID The ID of the actor to be queried
460 * @return Whether the focus is successful or not
462 bool DoSetCurrentFocusActor(const unsigned int actorID);
465 * Move the focus to the next actor in the focus chain towards the specified direction.
466 * @param focusIDIter The iterator pointing to the current focused actor
467 * @param forward Whether the focus movement is forward or not. The focus movement will be backward if this is false.
468 * @param wrapped Whether the focus shoule be moved wrapped around or not
469 * @return Whether the focus is successful or not
471 bool DoMoveFocus(FocusIDIter focusIDIter, bool forward, bool wrapped);
474 * Activate the actor. If the actor is control, call OnAccessibilityActivated virtual function.
475 * This function will emit FocusedActorActivatedSignal.
476 * @param actor The actor to activate
478 void DoActivate(Actor actor);
481 * Set whether the actor is focusable or not. A focusable property will be registered for
482 * the actor if not yet.
483 * @param actor The actor to be focused
484 * @param focusable Whether the actor is focusable or not
486 void SetFocusable(Actor actor, bool focusable);
489 * Handle the accessibility pan gesture.
490 * @param[in] panEvent The pan event to be handled.
491 * @return whether the gesture is handled successfully or not.
493 bool HandlePanGesture(const AccessibilityGestureEvent& panEvent) override;
496 * Change the accessibility status when Accessibility feature(screen-reader) turned on or off.
497 * @return whether the status is changed or not.
499 bool ChangeAccessibilityStatus() override;
502 * Clear the accessibility focus from the current focused actor.
503 * @return whether the focus is cleared or not.
505 bool ClearAccessibilityFocus() override;
508 * Perform the accessibility action associated with a scroll event.
509 * @param touch The touch point (and time) of the event.
510 * @return whether the focus is cleared or not.
512 bool AccessibilityActionScroll( Dali::TouchEvent& touch ) override;
515 * Perform the accessibility action to move focus to the previous focusable actor (by one finger flick up).
516 * @param allowEndFeedback true if end of list feedback should be played when the focus is alread reached to the end
517 * @return whether the accessibility action is performed or not.
519 bool AccessibilityActionPrevious(bool allowEndFeedback) override;
522 * Perform the accessibility action to move focus to the next focusable actor (by one finger flick down).
523 * @param allowEndFeedback true if end of list feedback should be played when the focus is alread reached to the end
524 * @return whether the accessibility action is performed or not.
526 bool AccessibilityActionNext(bool allowEndFeedback) override;
529 * Perform the accessibility action to move focus to the previous focusable actor (by one finger flick left).
530 * @param allowEndFeedback true if end of list feedback should be played when the focus is alread reached to the end
531 * @return whether the accessibility action is performed or not.
533 bool AccessibilityActionReadPrevious(bool allowEndFeedback) override;
536 * Perform the accessibility action to move focus to the next focusable actor (by one finger flick right).
537 * @param allowEndFeedback true if end of list feedback should be played when the focus is alread reached to the end
538 * @return whether the accessibility action is performed or not.
540 bool AccessibilityActionReadNext(bool allowEndFeedback) override;
543 * Perform the accessibility action to focus and read the actor (by one finger tap or move).
544 * @param allowReadAgain true if the action read again the same object (i.e. read action)
545 * false if the action just read when the focus object is changed (i.e. over action)
546 * @return whether the accessibility action is performed or not.
548 bool AccessibilityActionRead(bool allowReadAgain) override;
551 * Perform the accessibility action to activate the current focused actor (by one finger double tap).
552 * @return whether the accessibility action is performed or not.
554 bool AccessibilityActionActivate() override;
557 * Perform the accessibility action to change the value when the current focused actor is a slider
558 * (by double finger down and move up and right).
559 * @return whether the accessibility action is performed or not.
561 bool AccessibilityActionUp() override;
564 * Perform the accessibility action to change the value when the current focused actor is a slider
565 * (by double finger down and move down and left).
566 * @return whether the accessibility action is performed or not.
568 bool AccessibilityActionDown() override;
571 * Perform the accessibility action to navigate back (by two fingers circle draw).
572 * @return whether the accessibility action is performed or not.
574 bool AccessibilityActionBack() override;
577 * Perform the accessibility action to scroll up the list and focus on the first item on the list
578 * after the scrolling and read the item (by two finger swipe up).
579 * @return whether the accessibility action is performed or not.
581 bool AccessibilityActionScrollUp() override;
584 * Perform the accessibility action to scroll down the list and focus on the first item on the list
585 * after the scrolling and read the item (by two finger swipe down).
586 * @return whether the accessibility action is performed or not.
588 bool AccessibilityActionScrollDown() override;
591 * Perform the accessibility action to scroll left to the previous page (by two finger swipe left).
592 * @return whether the accessibility action is performed or not.
594 bool AccessibilityActionPageLeft() override;
597 * Perform the accessibility action to scroll right to the next page (by two finger swipe right).
598 * @return whether the accessibility action is performed or not.
600 bool AccessibilityActionPageRight() override;
603 * Perform the accessibility action to scroll up to the previous page (by one finger swipe left and right).
604 * @return whether the accessibility action is performed or not.
606 bool AccessibilityActionPageUp() override;
609 * Perform the accessibility action to scroll down to the next page (by one finger swipe right and left).
610 * @return whether the accessibility action is performed or not.
612 bool AccessibilityActionPageDown() override;
615 * Perform the accessibility action to move the focus to the first item on the screen
616 * (by one finger swipe up and down).
617 * @return whether the accessibility action is performed or not.
619 bool AccessibilityActionMoveToFirst() override;
622 * Perform the accessibility action to move the focus to the last item on the screen
623 * (by one finger swipe down and up).
624 * @return whether the accessibility action is performed or not.
626 bool AccessibilityActionMoveToLast() override;
629 * Perform the accessibility action to move the focus to the first item on the top
630 * and read from the top item continuously (by three fingers single tap).
631 * @return whether the accessibility action is performed or not.
633 bool AccessibilityActionReadFromTop() override;
636 * Perform the accessibility action to move the focus to and read from the next item
637 * continuously (by three fingers double tap).
638 * @return whether the accessibility action is performed or not.
640 bool AccessibilityActionReadFromNext() override;
643 * Perform the accessibility action to move the focus to do the zooming (by one finger triple tap).
644 * @return whether the accessibility action is performed or not.
646 bool AccessibilityActionZoom() override;
649 * Perform the accessibility action to pause/resume the current read out (by two fingers single tap).
650 * @return whether the accessibility action is performed or not.
652 bool AccessibilityActionReadPauseResume() override;
655 * Perform the accessibility action to start/stop the current action (by two fingers double tap).
656 * @return whether the accessibility action is performed or not.
658 bool AccessibilityActionStartStop() override;
661 * This function is connected to the TtsPlayer StateChangeSignal.
662 * It is called when the TTS players state changes.
663 * @param previousState The previous state of the TTS player (for comparison)
664 * @param currentState The current state of the TTS player
666 void TtsStateChanged( const Dali::TtsPlayer::State previousState, const Dali::TtsPlayer::State currentState );
671 AccessibilityManager(const AccessibilityManager&);
673 AccessibilityManager& operator=(const AccessibilityManager& rhs);
677 Toolkit::AccessibilityManager::FocusChangedSignalType mFocusChangedSignal; ///< The signal to notify the focus change
678 Toolkit::AccessibilityManager::FocusOvershotSignalType mFocusOvershotSignal; ///< The signal to notify the focus overshooted
679 Toolkit::AccessibilityManager::FocusedActorActivatedSignalType mFocusedActorActivatedSignal; ///< The signal to notify the activation of focused actor
682 AccessibilityActionSignalType mStatusChangedSignal;
683 AccessibilityActionSignalType mActionNextSignal;
684 AccessibilityActionSignalType mActionPreviousSignal;
685 AccessibilityActionSignalType mActionActivateSignal;
686 AccessibilityActionSignalType mActionOverSignal;
687 AccessibilityActionSignalType mActionReadSignal;
688 AccessibilityActionSignalType mActionReadNextSignal;
689 AccessibilityActionSignalType mActionReadPreviousSignal;
690 AccessibilityActionSignalType mActionUpSignal;
691 AccessibilityActionSignalType mActionDownSignal;
692 AccessibilityActionSignalType mActionClearFocusSignal;
693 AccessibilityActionSignalType mActionBackSignal;
694 AccessibilityActionSignalType mActionScrollUpSignal;
695 AccessibilityActionSignalType mActionScrollDownSignal;
696 AccessibilityActionSignalType mActionPageLeftSignal;
697 AccessibilityActionSignalType mActionPageRightSignal;
698 AccessibilityActionSignalType mActionPageUpSignal;
699 AccessibilityActionSignalType mActionPageDownSignal;
700 AccessibilityActionSignalType mActionMoveToFirstSignal;
701 AccessibilityActionSignalType mActionMoveToLastSignal;
702 AccessibilityActionSignalType mActionReadFromTopSignal;
703 AccessibilityActionSignalType mActionReadFromNextSignal;
704 AccessibilityActionSignalType mActionZoomSignal;
705 AccessibilityActionSignalType mActionReadPauseResumeSignal;
706 AccessibilityActionSignalType mActionStartStopSignal;
707 AccessibilityActionScrollSignalType mActionScrollSignal;
709 FocusIDContainer mFocusIDContainer; ///< The container to look up actor ID by focus order
710 IDAdditionalInfoContainer mIDAdditionalInfoContainer; ///< The container to look up additional information by actor ID
711 FocusIDPair mCurrentFocusActor; ///< The focus order and actor ID of current focused actor
712 Actor mCurrentGesturedActor; ///< The actor that will handle the gesture
713 Actor mFocusIndicatorActor; ///< The focus indicator actor shared by all the focusable actors for highlight
714 Vector2 mPreviousPosition; ///< The previous pan position; useful for calculating velocity for GestureState::FINISHED events
715 unsigned int mRecursiveFocusMoveCounter; ///< The counter to count the number of recursive focus movement attempted before the focus movement is successful.
716 std::string mFocusSoundFilePath; ///< The path of the focus sound file
717 std::string mFocusChainEndSoundFilePath; ///< The path of the focus chain end sound file
719 bool mIsWrapped:1; ///< Whether the focus movement is wrapped around or not
720 bool mIsFocusWithinGroup:1; ///< Whether the focus movement is limited to the current focus group or not
721 bool mIsEndcapFeedbackEnabled:1; ///< Whether the endcap feedback need to be played when the focus leaves the end or vice versa
722 bool mIsEndcapFeedbackPlayed:1; ///< Whether the endcap feedback was played or not
723 bool mIsAccessibilityTtsEnabled:1; ///< Whether accessibility feature(screen-reader) turned on/off
724 bool mTtsCreated:1; ///< Whether the TTS Player has been accessed
725 bool mIsFocusIndicatorEnabled:1; ///< Whether indicator should be shown / hidden. It could be enabled when TTS enabled or 'Tab' key operated.
726 bool mContinuousPlayMode:1; ///< Keeps track of whether or not we are in continuous play mode
727 bool mIsFocusSoundFilePathSet:1; ///< Whether the path of the focus sound file has been set
728 bool mIsFocusChainEndSoundFilePathSet:1; ///< Whether the path of the focus chain end sound file has been set
732 } // namespace Internal
734 inline Internal::AccessibilityManager& GetImpl(Dali::Toolkit::AccessibilityManager& obj)
736 DALI_ASSERT_ALWAYS(obj);
738 Dali::BaseObject& handle = obj.GetBaseObject();
740 return static_cast<Internal::AccessibilityManager&>(handle);
743 inline const Internal::AccessibilityManager& GetImpl(const Dali::Toolkit::AccessibilityManager& obj)
745 DALI_ASSERT_ALWAYS(obj);
747 const Dali::BaseObject& handle = obj.GetBaseObject();
749 return static_cast<const Internal::AccessibilityManager&>(handle);
752 } // namespace Toolkit
756 #endif // DALI_TOOLKIT_INTERNAL_ACCESSIBILITY_MANAGER_H