1 #ifndef __DALI_TOOLKIT_INTERNAL_ACCESSIBILITY_MANAGER_H__
2 #define __DALI_TOOLKIT_INTERNAL_ACCESSIBILITY_MANAGER_H__
5 * Copyright (c) 2015 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/public-api/object/base-object.h>
27 #include <dali/integration-api/events/pan-gesture-event.h>
30 #include <dali-toolkit/public-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::ActionReadIndicatorInformationSignal
412 AccessibilityActionSignalType& ActionReadIndicatorInformationSignal()
414 return mActionReadIndicatorInformationSignal;
418 * @copydoc Dali::Toolkit::AccessibilityManager::ActionReadPauseResumeSignal
420 AccessibilityActionSignalType& ActionReadPauseResumeSignal()
422 return mActionReadPauseResumeSignal;
426 * @copydoc Dali::Toolkit::AccessibilityManager::ActionStartStopSignal
428 AccessibilityActionSignalType& ActionStartStopSignal()
430 return mActionStartStopSignal;
434 * @copydoc Dali::Toolkit::AccessibilityManager::ActionScrollSignal
436 AccessibilityActionScrollSignalType& ActionScrollSignal()
438 return mActionScrollSignal;
446 virtual ~AccessibilityManager();
451 * Get the additional information (e.g. focus order and description) of the given actor.
452 * @param actorID The ID of the actor to be queried
453 * @return The additional information of the actor
455 ActorAdditionalInfo GetActorAdditionalInfo(const unsigned int actorID) const;
458 * Synchronize the actor's additional information to reflect its latest focus order
459 * @param actorID The ID of the actor
460 * @param order The focus order of the actor
461 * @return The additional information of the actor
463 void SynchronizeActorAdditionalInfo(const unsigned int actorID, const unsigned int order);
466 * Move the focus to the specified actor and send notification for the focus change.
467 * @param actorID The ID of the actor to be queried
468 * @return Whether the focus is successful or not
470 bool DoSetCurrentFocusActor(const unsigned int actorID);
473 * Move the focus to the next actor in the focus chain towards the specified direction.
474 * @param focusIDIter The iterator pointing to the current focused actor
475 * @param forward Whether the focus movement is forward or not. The focus movement will be backward if this is false.
476 * @param wrapped Whether the focus shoule be moved wrapped around or not
477 * @return Whether the focus is successful or not
479 bool DoMoveFocus(FocusIDIter focusIDIter, bool forward, bool wrapped);
482 * Activate the actor. If the actor is control, call OnAccessibilityActivated virtual function.
483 * This function will emit FocusedActorActivatedSignal.
484 * @param actor The actor to activate
486 void DoActivate(Actor actor);
489 * Create the default indicator actor to highlight the focused actor.
491 void CreateDefaultFocusIndicatorActor();
494 * Set whether the actor is focusable or not. A focusable property will be registered for
495 * the actor if not yet.
496 * @param actor The actor to be focused
497 * @param focusable Whether the actor is focusable or not
499 void SetFocusable(Actor actor, bool focusable);
502 * Handle the accessibility pan gesture.
503 * @param[in] panEvent The pan event to be handled.
504 * @return whether the gesture is handled successfully or not.
506 virtual bool HandlePanGesture(const Integration::PanGestureEvent& panEvent);
509 * Change the accessibility status when Accessibility feature(screen-reader) turned on or off.
510 * @return whether the status is changed or not.
512 virtual bool ChangeAccessibilityStatus();
515 * Clear the accessibility focus from the current focused actor.
516 * @return whether the focus is cleared or not.
518 virtual bool ClearAccessibilityFocus();
521 * Perform the accessibility action associated with a scroll event.
522 * @param touchEvent The touch point (and time) of the event.
523 * @return whether the focus is cleared or not.
525 virtual bool AccessibilityActionScroll( Dali::TouchEvent& touchEvent );
528 * Perform the accessibility action to move focus to the previous focusable actor (by one finger flick up).
529 * @param allowEndFeedback true if end of list feedback should be played when the focus is alread reached to the end
530 * @return whether the accessibility action is performed or not.
532 virtual bool AccessibilityActionPrevious(bool allowEndFeedback);
535 * Perform the accessibility action to move focus to the next focusable actor (by one finger flick down).
536 * @param allowEndFeedback true if end of list feedback should be played when the focus is alread reached to the end
537 * @return whether the accessibility action is performed or not.
539 virtual bool AccessibilityActionNext(bool allowEndFeedback);
542 * Perform the accessibility action to move focus to the previous focusable actor (by one finger flick left).
543 * @param allowEndFeedback true if end of list feedback should be played when the focus is alread reached to the end
544 * @return whether the accessibility action is performed or not.
546 virtual bool AccessibilityActionReadPrevious(bool allowEndFeedback);
549 * Perform the accessibility action to move focus to the next focusable actor (by one finger flick right).
550 * @param allowEndFeedback true if end of list feedback should be played when the focus is alread reached to the end
551 * @return whether the accessibility action is performed or not.
553 virtual bool AccessibilityActionReadNext(bool allowEndFeedback);
556 * Perform the accessibility action to focus and read the actor (by one finger tap or move).
557 * @param allowReadAgain true if the action read again the same object (i.e. read action)
558 * false if the action just read when the focus object is changed (i.e. over action)
559 * @return whether the accessibility action is performed or not.
561 virtual bool AccessibilityActionRead(bool allowReadAgain);
564 * Perform the accessibility action to activate the current focused actor (by one finger double tap).
565 * @return whether the accessibility action is performed or not.
567 virtual bool AccessibilityActionActivate();
570 * Perform the accessibility action to change the value when the current focused actor is a slider
571 * (by double finger down and move up and right).
572 * @return whether the accessibility action is performed or not.
574 virtual bool AccessibilityActionUp();
577 * Perform the accessibility action to change the value when the current focused actor is a slider
578 * (by double finger down and move down and left).
579 * @return whether the accessibility action is performed or not.
581 virtual bool AccessibilityActionDown();
584 * Perform the accessibility action to navigate back (by two fingers circle draw).
585 * @return whether the accessibility action is performed or not.
587 virtual bool AccessibilityActionBack();
590 * Perform the accessibility action to scroll up the list and focus on the first item on the list
591 * after the scrolling and read the item (by two finger swipe up).
592 * @return whether the accessibility action is performed or not.
594 virtual bool AccessibilityActionScrollUp();
597 * Perform the accessibility action to scroll down the list and focus on the first item on the list
598 * after the scrolling and read the item (by two finger swipe down).
599 * @return whether the accessibility action is performed or not.
601 virtual bool AccessibilityActionScrollDown();
604 * Perform the accessibility action to scroll left to the previous page (by two finger swipe left).
605 * @return whether the accessibility action is performed or not.
607 virtual bool AccessibilityActionPageLeft();
610 * Perform the accessibility action to scroll right to the next page (by two finger swipe right).
611 * @return whether the accessibility action is performed or not.
613 virtual bool AccessibilityActionPageRight();
616 * Perform the accessibility action to scroll up to the previous page (by one finger swipe left and right).
617 * @return whether the accessibility action is performed or not.
619 virtual bool AccessibilityActionPageUp();
622 * Perform the accessibility action to scroll down to the next page (by one finger swipe right and left).
623 * @return whether the accessibility action is performed or not.
625 virtual bool AccessibilityActionPageDown();
628 * Perform the accessibility action to move the focus to the first item on the screen
629 * (by one finger swipe up and down).
630 * @return whether the accessibility action is performed or not.
632 virtual bool AccessibilityActionMoveToFirst();
635 * Perform the accessibility action to move the focus to the last item on the screen
636 * (by one finger swipe down and up).
637 * @return whether the accessibility action is performed or not.
639 virtual bool AccessibilityActionMoveToLast();
642 * Perform the accessibility action to move the focus to the first item on the top
643 * and read from the top item continously (by three fingers single tap).
644 * @return whether the accessibility action is performed or not.
646 virtual bool AccessibilityActionReadFromTop();
649 * Perform the accessibility action to move the focus to and read from the next item
650 * continously (by three fingers double tap).
651 * @return whether the accessibility action is performed or not.
653 virtual bool AccessibilityActionReadFromNext();
656 * Perform the accessibility action to move the focus to do the zooming (by one finger triple tap).
657 * @return whether the accessibility action is performed or not.
659 virtual bool AccessibilityActionZoom();
662 * Perform the accessibility action to read the information in the indicator (by two fingers triple tap).
663 * @return whether the accessibility action is performed or not.
665 virtual bool AccessibilityActionReadIndicatorInformation();
668 * Perform the accessibility action to pause/resume the current read out (by two fingers single tap).
669 * @return whether the accessibility action is performed or not.
671 virtual bool AccessibilityActionReadPauseResume();
674 * Perform the accessibility action to start/stop the current action (by two fingers double tap).
675 * @return whether the accessibility action is performed or not.
677 virtual bool AccessibilityActionStartStop();
680 * Perform the accessibility action to mouse move (by one finger tap & hold and move).
681 * @param touchEvent touch event structure
682 * @return whether the accessibility action is performed or not.
684 virtual bool AccessibilityActionTouch(const TouchEvent& touchEvent);
687 * This function is connected to the TtsPlayer StateChangeSignal.
688 * It is called when the TTS players state changes.
689 * @param previousState The previous state of the TTS player (for comparison)
690 * @param currentState The current state of the TTS player
692 void TtsStateChanged( const Dali::TtsPlayer::State previousState, const Dali::TtsPlayer::State currentState );
697 AccessibilityManager(const AccessibilityManager&);
699 AccessibilityManager& operator=(const AccessibilityManager& rhs);
703 Toolkit::AccessibilityManager::FocusChangedSignalType mFocusChangedSignal; ///< The signal to notify the focus change
704 Toolkit::AccessibilityManager::FocusOvershotSignalType mFocusOvershotSignal; ///< The signal to notify the focus overshooted
705 Toolkit::AccessibilityManager::FocusedActorActivatedSignalType mFocusedActorActivatedSignal; ///< The signal to notify the activation of focused actor
708 AccessibilityActionSignalType mStatusChangedSignal;
709 AccessibilityActionSignalType mActionNextSignal;
710 AccessibilityActionSignalType mActionPreviousSignal;
711 AccessibilityActionSignalType mActionActivateSignal;
712 AccessibilityActionSignalType mActionOverSignal;
713 AccessibilityActionSignalType mActionReadSignal;
714 AccessibilityActionSignalType mActionReadNextSignal;
715 AccessibilityActionSignalType mActionReadPreviousSignal;
716 AccessibilityActionSignalType mActionUpSignal;
717 AccessibilityActionSignalType mActionDownSignal;
718 AccessibilityActionSignalType mActionClearFocusSignal;
719 AccessibilityActionSignalType mActionBackSignal;
720 AccessibilityActionSignalType mActionScrollUpSignal;
721 AccessibilityActionSignalType mActionScrollDownSignal;
722 AccessibilityActionSignalType mActionPageLeftSignal;
723 AccessibilityActionSignalType mActionPageRightSignal;
724 AccessibilityActionSignalType mActionPageUpSignal;
725 AccessibilityActionSignalType mActionPageDownSignal;
726 AccessibilityActionSignalType mActionMoveToFirstSignal;
727 AccessibilityActionSignalType mActionMoveToLastSignal;
728 AccessibilityActionSignalType mActionReadFromTopSignal;
729 AccessibilityActionSignalType mActionReadFromNextSignal;
730 AccessibilityActionSignalType mActionZoomSignal;
731 AccessibilityActionSignalType mActionReadIndicatorInformationSignal;
732 AccessibilityActionSignalType mActionReadPauseResumeSignal;
733 AccessibilityActionSignalType mActionStartStopSignal;
734 AccessibilityActionScrollSignalType mActionScrollSignal;
736 FocusIDContainer mFocusIDContainer; ///< The container to look up actor ID by focus order
737 IDAdditionalInfoContainer mIDAdditionalInfoContainer; ///< The container to look up additional information by actor ID
738 FocusIDPair mCurrentFocusActor; ///< The focus order and actor ID of current focused actor
739 Actor mCurrentGesturedActor; ///< The actor that will handle the gesture
740 Actor mFocusIndicatorActor; ///< The focus indicator actor shared by all the focusable actors for highlight
741 Vector2 mPreviousPosition; ///< The previous pan position; useful for calculating velocity for Gesture::Finished events
742 unsigned int mRecursiveFocusMoveCounter; ///< The counter to count the number of recursive focus movement attempted before the focus movement is successful.
744 bool mIsWrapped:1; ///< Whether the focus movement is wrapped around or not
745 bool mIsFocusWithinGroup:1; ///< Whether the focus movement is limited to the current focus group or not
746 bool mIsEndcapFeedbackEnabled:1; ///< Whether the endcap feedback need to be played when the focus leaves the end or vice versa
747 bool mIsEndcapFeedbackPlayed:1; ///< Whether the endcap feedback was played or not
748 bool mIsAccessibilityTtsEnabled:1; ///< Whether accessibility feature(screen-reader) turned on/off
749 bool mTtsCreated:1; ///< Whether the TTS Player has been accessed
750 bool mIsFocusIndicatorEnabled:1; ///< Whether indicator should be shown / hidden. It could be enabled when TTS enabled or 'Tab' key operated.
751 bool mContinuousPlayMode:1; ///< Keeps track of whether or not we are in continuous play mode
755 } // namespace Internal
757 inline Internal::AccessibilityManager& GetImpl(Dali::Toolkit::AccessibilityManager& obj)
759 DALI_ASSERT_ALWAYS(obj);
761 Dali::BaseObject& handle = obj.GetBaseObject();
763 return static_cast<Internal::AccessibilityManager&>(handle);
766 inline const Internal::AccessibilityManager& GetImpl(const Dali::Toolkit::AccessibilityManager& obj)
768 DALI_ASSERT_ALWAYS(obj);
770 const Dali::BaseObject& handle = obj.GetBaseObject();
772 return static_cast<const Internal::AccessibilityManager&>(handle);
775 } // namespace Toolkit
779 #endif // __DALI_TOOLKIT_INTERNAL_ACCESSIBILITY_MANAGER_H__