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;
207 * @copydoc Toolkit::AccessibilityManager::EnableAccessibility
209 void EnableAccessibility( bool enabled );
212 * @copydoc Toolkit::AccessibilityManager::IsEnabled
214 bool IsEnabled() const;
219 * @copydoc Toolkit::AccessibilityManager::FocusChangedSignal()
221 Toolkit::AccessibilityManager::FocusChangedSignalType& FocusChangedSignal();
224 * @copydoc Toolkit::AccessibilityManager::FocusOvershotSignal()
226 Toolkit::AccessibilityManager::FocusOvershotSignalType& FocusOvershotSignal();
229 * @copydoc Toolkit::AccessibilityManager::FocusedActorActivatedSignal()
231 Toolkit::AccessibilityManager::FocusedActorActivatedSignalType& FocusedActorActivatedSignal();
236 * @copydoc Dali::Toolkit::AccessibilityManager::StatusChangedSignal
238 AccessibilityActionSignalType& StatusChangedSignal()
240 return mStatusChangedSignal;
244 * @copydoc Dali::Toolkit::AccessibilityManager::AccessibilityAdaptor::ActionNextSignal
246 AccessibilityActionSignalType& ActionNextSignal()
248 return mActionNextSignal;
252 * @copydoc Dali::Toolkit::AccessibilityManager::ActionPreviousSignal
254 AccessibilityActionSignalType& ActionPreviousSignal()
256 return mActionPreviousSignal;
260 * @copydoc Dali::Toolkit::AccessibilityManager::ActionActivateSignal
262 AccessibilityActionSignalType& ActionActivateSignal()
264 return mActionActivateSignal;
268 * @copydoc Dali::Toolkit::AccessibilityManager::ActionOverSignal
270 AccessibilityActionSignalType& ActionOverSignal()
272 return mActionOverSignal;
276 * @copydoc Dali::Toolkit::AccessibilityManager::ActionReadSignal
278 AccessibilityActionSignalType& ActionReadSignal()
280 return mActionReadSignal;
284 * @copydoc Dali::Toolkit::AccessibilityManager::ActionReadNextSignal
286 AccessibilityActionSignalType& ActionReadNextSignal()
288 return mActionReadNextSignal;
292 * @copydoc Dali::Toolkit::AccessibilityManager::ActionReadPreviousSignal
294 AccessibilityActionSignalType& ActionReadPreviousSignal()
296 return mActionReadPreviousSignal;
300 * @copydoc Dali::Toolkit::AccessibilityManager::ActionUpSignal
302 AccessibilityActionSignalType& ActionUpSignal()
304 return mActionUpSignal;
308 * @copydoc Dali::Toolkit::AccessibilityManager::ActionDownSignal
310 AccessibilityActionSignalType& ActionDownSignal()
312 return mActionDownSignal;
316 * @copydoc Dali::Toolkit::AccessibilityManager::ActionClearFocusSignal
318 AccessibilityActionSignalType& ActionClearFocusSignal()
320 return mActionClearFocusSignal;
324 * @copydoc Dali::Toolkit::AccessibilityManager::ActionBackSignal
326 AccessibilityActionSignalType& ActionBackSignal()
328 return mActionBackSignal;
332 * @copydoc Dali::Toolkit::AccessibilityManager::ActionScrollUpSignal
334 AccessibilityActionSignalType& ActionScrollUpSignal()
336 return mActionScrollUpSignal;
340 * @copydoc Dali::Toolkit::AccessibilityManager::ActionScrollDownSignal
342 AccessibilityActionSignalType& ActionScrollDownSignal()
344 return mActionScrollDownSignal;
348 * @copydoc Dali::Toolkit::AccessibilityManager::ActionPageLeftSignal
350 AccessibilityActionSignalType& ActionPageLeftSignal()
352 return mActionPageLeftSignal;
356 * @copydoc Dali::Toolkit::AccessibilityManager::ActionPageRightSignal
358 AccessibilityActionSignalType& ActionPageRightSignal()
360 return mActionPageRightSignal;
364 * @copydoc Dali::Toolkit::AccessibilityManager::ActionPageUpSignal
366 AccessibilityActionSignalType& ActionPageUpSignal()
368 return mActionPageUpSignal;
372 * @copydoc Dali::Toolkit::AccessibilityManager::ActionPageDownSignal
374 AccessibilityActionSignalType& ActionPageDownSignal()
376 return mActionPageDownSignal;
380 * @copydoc Dali::Toolkit::AccessibilityManager::ActionMoveToFirstSignal
382 AccessibilityActionSignalType& ActionMoveToFirstSignal()
384 return mActionMoveToFirstSignal;
388 * @copydoc Dali::Toolkit::AccessibilityManager::ActionMoveToLastSignal
390 AccessibilityActionSignalType& ActionMoveToLastSignal()
392 return mActionMoveToLastSignal;
396 * @copydoc Dali::Toolkit::AccessibilityManager::ActionReadFromTopSignal
398 AccessibilityActionSignalType& ActionReadFromTopSignal()
400 return mActionReadFromTopSignal;
404 * @copydoc Dali::Toolkit::AccessibilityManager::ActionReadFromNextSignal
406 AccessibilityActionSignalType& ActionReadFromNextSignal()
408 return mActionReadFromNextSignal;
412 * @copydoc Dali::Toolkit::AccessibilityManager::ActionZoomSignal
414 AccessibilityActionSignalType& ActionZoomSignal()
416 return mActionZoomSignal;
420 * @copydoc Dali::Toolkit::AccessibilityManager::ActionReadPauseResumeSignal
422 AccessibilityActionSignalType& ActionReadPauseResumeSignal()
424 return mActionReadPauseResumeSignal;
428 * @copydoc Dali::Toolkit::AccessibilityManager::ActionStartStopSignal
430 AccessibilityActionSignalType& ActionStartStopSignal()
432 return mActionStartStopSignal;
436 * @copydoc Dali::Toolkit::AccessibilityManager::ActionScrollSignal
438 AccessibilityActionScrollSignalType& ActionScrollSignal()
440 return mActionScrollSignal;
448 virtual ~AccessibilityManager();
453 * Get the additional information (e.g. focus order and description) of the given actor.
454 * @param actorID The ID of the actor to be queried
455 * @return The additional information of the actor
457 ActorAdditionalInfo GetActorAdditionalInfo(const unsigned int actorID) const;
460 * Synchronize the actor's additional information to reflect its latest focus order
461 * @param actorID The ID of the actor
462 * @param order The focus order of the actor
463 * @return The additional information of the actor
465 void SynchronizeActorAdditionalInfo(const unsigned int actorID, const unsigned int order);
468 * Move the focus to the specified actor and send notification for the focus change.
469 * @param actorID The ID of the actor to be queried
470 * @return Whether the focus is successful or not
472 bool DoSetCurrentFocusActor(const unsigned int actorID);
475 * Move the focus to the next actor in the focus chain towards the specified direction.
476 * @param focusIDIter The iterator pointing to the current focused actor
477 * @param forward Whether the focus movement is forward or not. The focus movement will be backward if this is false.
478 * @param wrapped Whether the focus shoule be moved wrapped around or not
479 * @return Whether the focus is successful or not
481 bool DoMoveFocus(FocusIDIter focusIDIter, bool forward, bool wrapped);
484 * Activate the actor. If the actor is control, call OnAccessibilityActivated virtual function.
485 * This function will emit FocusedActorActivatedSignal.
486 * @param actor The actor to activate
488 void DoActivate(Actor actor);
491 * Set whether the actor is focusable or not. A focusable property will be registered for
492 * the actor if not yet.
493 * @param actor The actor to be focused
494 * @param focusable Whether the actor is focusable or not
496 void SetFocusable(Actor actor, bool focusable);
499 * Handle the accessibility pan gesture.
500 * @param[in] panEvent The pan event to be handled.
501 * @return whether the gesture is handled successfully or not.
503 bool HandlePanGesture(const AccessibilityGestureEvent& panEvent) override;
506 * Change the accessibility status when Accessibility feature(screen-reader) turned on or off.
507 * @return whether the status is changed or not.
509 bool ChangeAccessibilityStatus() override;
512 * Clear the accessibility focus from the current focused actor.
513 * @return whether the focus is cleared or not.
515 bool ClearAccessibilityFocus() override;
518 * Perform the accessibility action associated with a scroll event.
519 * @param touch The touch point (and time) of the event.
520 * @return whether the focus is cleared or not.
522 bool AccessibilityActionScroll( Dali::TouchEvent& touch ) override;
525 * Perform the accessibility action to move focus to the previous focusable actor (by one finger flick up).
526 * @param allowEndFeedback true if end of list feedback should be played when the focus is alread reached to the end
527 * @return whether the accessibility action is performed or not.
529 bool AccessibilityActionPrevious(bool allowEndFeedback) override;
532 * Perform the accessibility action to move focus to the next focusable actor (by one finger flick down).
533 * @param allowEndFeedback true if end of list feedback should be played when the focus is alread reached to the end
534 * @return whether the accessibility action is performed or not.
536 bool AccessibilityActionNext(bool allowEndFeedback) override;
539 * Perform the accessibility action to move focus to the previous focusable actor (by one finger flick left).
540 * @param allowEndFeedback true if end of list feedback should be played when the focus is alread reached to the end
541 * @return whether the accessibility action is performed or not.
543 bool AccessibilityActionReadPrevious(bool allowEndFeedback) override;
546 * Perform the accessibility action to move focus to the next focusable actor (by one finger flick right).
547 * @param allowEndFeedback true if end of list feedback should be played when the focus is alread reached to the end
548 * @return whether the accessibility action is performed or not.
550 bool AccessibilityActionReadNext(bool allowEndFeedback) override;
553 * Perform the accessibility action to focus and read the actor (by one finger tap or move).
554 * @param allowReadAgain true if the action read again the same object (i.e. read action)
555 * false if the action just read when the focus object is changed (i.e. over action)
556 * @return whether the accessibility action is performed or not.
558 bool AccessibilityActionRead(bool allowReadAgain) override;
561 * Perform the accessibility action to activate the current focused actor (by one finger double tap).
562 * @return whether the accessibility action is performed or not.
564 bool AccessibilityActionActivate() override;
567 * Perform the accessibility action to change the value when the current focused actor is a slider
568 * (by double finger down and move up and right).
569 * @return whether the accessibility action is performed or not.
571 bool AccessibilityActionUp() override;
574 * Perform the accessibility action to change the value when the current focused actor is a slider
575 * (by double finger down and move down and left).
576 * @return whether the accessibility action is performed or not.
578 bool AccessibilityActionDown() override;
581 * Perform the accessibility action to navigate back (by two fingers circle draw).
582 * @return whether the accessibility action is performed or not.
584 bool AccessibilityActionBack() override;
587 * Perform the accessibility action to scroll up the list and focus on the first item on the list
588 * after the scrolling and read the item (by two finger swipe up).
589 * @return whether the accessibility action is performed or not.
591 bool AccessibilityActionScrollUp() override;
594 * Perform the accessibility action to scroll down the list and focus on the first item on the list
595 * after the scrolling and read the item (by two finger swipe down).
596 * @return whether the accessibility action is performed or not.
598 bool AccessibilityActionScrollDown() override;
601 * Perform the accessibility action to scroll left to the previous page (by two finger swipe left).
602 * @return whether the accessibility action is performed or not.
604 bool AccessibilityActionPageLeft() override;
607 * Perform the accessibility action to scroll right to the next page (by two finger swipe right).
608 * @return whether the accessibility action is performed or not.
610 bool AccessibilityActionPageRight() override;
613 * Perform the accessibility action to scroll up to the previous page (by one finger swipe left and right).
614 * @return whether the accessibility action is performed or not.
616 bool AccessibilityActionPageUp() override;
619 * Perform the accessibility action to scroll down to the next page (by one finger swipe right and left).
620 * @return whether the accessibility action is performed or not.
622 bool AccessibilityActionPageDown() override;
625 * Perform the accessibility action to move the focus to the first item on the screen
626 * (by one finger swipe up and down).
627 * @return whether the accessibility action is performed or not.
629 bool AccessibilityActionMoveToFirst() override;
632 * Perform the accessibility action to move the focus to the last item on the screen
633 * (by one finger swipe down and up).
634 * @return whether the accessibility action is performed or not.
636 bool AccessibilityActionMoveToLast() override;
639 * Perform the accessibility action to move the focus to the first item on the top
640 * and read from the top item continuously (by three fingers single tap).
641 * @return whether the accessibility action is performed or not.
643 bool AccessibilityActionReadFromTop() override;
646 * Perform the accessibility action to move the focus to and read from the next item
647 * continuously (by three fingers double tap).
648 * @return whether the accessibility action is performed or not.
650 bool AccessibilityActionReadFromNext() override;
653 * Perform the accessibility action to move the focus to do the zooming (by one finger triple tap).
654 * @return whether the accessibility action is performed or not.
656 bool AccessibilityActionZoom() override;
659 * Perform the accessibility action to pause/resume the current read out (by two fingers single tap).
660 * @return whether the accessibility action is performed or not.
662 bool AccessibilityActionReadPauseResume() override;
665 * Perform the accessibility action to start/stop the current action (by two fingers double tap).
666 * @return whether the accessibility action is performed or not.
668 bool AccessibilityActionStartStop() override;
671 * This function is connected to the TtsPlayer StateChangeSignal.
672 * It is called when the TTS players state changes.
673 * @param previousState The previous state of the TTS player (for comparison)
674 * @param currentState The current state of the TTS player
676 void TtsStateChanged( const Dali::TtsPlayer::State previousState, const Dali::TtsPlayer::State currentState );
681 AccessibilityManager(const AccessibilityManager&);
683 AccessibilityManager& operator=(const AccessibilityManager& rhs);
687 Toolkit::AccessibilityManager::FocusChangedSignalType mFocusChangedSignal; ///< The signal to notify the focus change
688 Toolkit::AccessibilityManager::FocusOvershotSignalType mFocusOvershotSignal; ///< The signal to notify the focus overshooted
689 Toolkit::AccessibilityManager::FocusedActorActivatedSignalType mFocusedActorActivatedSignal; ///< The signal to notify the activation of focused actor
692 AccessibilityActionSignalType mStatusChangedSignal;
693 AccessibilityActionSignalType mActionNextSignal;
694 AccessibilityActionSignalType mActionPreviousSignal;
695 AccessibilityActionSignalType mActionActivateSignal;
696 AccessibilityActionSignalType mActionOverSignal;
697 AccessibilityActionSignalType mActionReadSignal;
698 AccessibilityActionSignalType mActionReadNextSignal;
699 AccessibilityActionSignalType mActionReadPreviousSignal;
700 AccessibilityActionSignalType mActionUpSignal;
701 AccessibilityActionSignalType mActionDownSignal;
702 AccessibilityActionSignalType mActionClearFocusSignal;
703 AccessibilityActionSignalType mActionBackSignal;
704 AccessibilityActionSignalType mActionScrollUpSignal;
705 AccessibilityActionSignalType mActionScrollDownSignal;
706 AccessibilityActionSignalType mActionPageLeftSignal;
707 AccessibilityActionSignalType mActionPageRightSignal;
708 AccessibilityActionSignalType mActionPageUpSignal;
709 AccessibilityActionSignalType mActionPageDownSignal;
710 AccessibilityActionSignalType mActionMoveToFirstSignal;
711 AccessibilityActionSignalType mActionMoveToLastSignal;
712 AccessibilityActionSignalType mActionReadFromTopSignal;
713 AccessibilityActionSignalType mActionReadFromNextSignal;
714 AccessibilityActionSignalType mActionZoomSignal;
715 AccessibilityActionSignalType mActionReadPauseResumeSignal;
716 AccessibilityActionSignalType mActionStartStopSignal;
717 AccessibilityActionScrollSignalType mActionScrollSignal;
719 FocusIDContainer mFocusIDContainer; ///< The container to look up actor ID by focus order
720 IDAdditionalInfoContainer mIDAdditionalInfoContainer; ///< The container to look up additional information by actor ID
721 FocusIDPair mCurrentFocusActor; ///< The focus order and actor ID of current focused actor
722 Actor mCurrentGesturedActor; ///< The actor that will handle the gesture
723 Actor mFocusIndicatorActor; ///< The focus indicator actor shared by all the focusable actors for highlight
724 Vector2 mPreviousPosition; ///< The previous pan position; useful for calculating velocity for GestureState::FINISHED events
725 unsigned int mRecursiveFocusMoveCounter; ///< The counter to count the number of recursive focus movement attempted before the focus movement is successful.
726 std::string mFocusSoundFilePath; ///< The path of the focus sound file
727 std::string mFocusChainEndSoundFilePath; ///< The path of the focus chain end sound file
729 bool mIsWrapped:1; ///< Whether the focus movement is wrapped around or not
730 bool mIsFocusWithinGroup:1; ///< Whether the focus movement is limited to the current focus group or not
731 bool mIsEndcapFeedbackEnabled:1; ///< Whether the endcap feedback need to be played when the focus leaves the end or vice versa
732 bool mIsEndcapFeedbackPlayed:1; ///< Whether the endcap feedback was played or not
733 bool mIsAccessibilityTtsEnabled:1; ///< Whether accessibility feature(screen-reader) turned on/off
734 bool mTtsCreated:1; ///< Whether the TTS Player has been accessed
735 bool mIsFocusIndicatorEnabled:1; ///< Whether indicator should be shown / hidden. It could be enabled when TTS enabled or 'Tab' key operated.
736 bool mContinuousPlayMode:1; ///< Keeps track of whether or not we are in continuous play mode
737 bool mIsFocusSoundFilePathSet:1; ///< Whether the path of the focus sound file has been set
738 bool mIsFocusChainEndSoundFilePathSet:1; ///< Whether the path of the focus chain end sound file has been set
742 } // namespace Internal
744 inline Internal::AccessibilityManager& GetImpl(Dali::Toolkit::AccessibilityManager& obj)
746 DALI_ASSERT_ALWAYS(obj);
748 Dali::BaseObject& handle = obj.GetBaseObject();
750 return static_cast<Internal::AccessibilityManager&>(handle);
753 inline const Internal::AccessibilityManager& GetImpl(const Dali::Toolkit::AccessibilityManager& obj)
755 DALI_ASSERT_ALWAYS(obj);
757 const Dali::BaseObject& handle = obj.GetBaseObject();
759 return static_cast<const Internal::AccessibilityManager&>(handle);
762 } // namespace Toolkit
766 #endif // DALI_TOOLKIT_INTERNAL_ACCESSIBILITY_MANAGER_H