1 #ifndef DALI_TOOLKIT_INTERNAL_ACCESSIBILITY_MANAGER_H
2 #define DALI_TOOLKIT_INTERNAL_ACCESSIBILITY_MANAGER_H
5 * Copyright (c) 2019 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::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 * Set whether the actor is focusable or not. A focusable property will be registered for
490 * the actor if not yet.
491 * @param actor The actor to be focused
492 * @param focusable Whether the actor is focusable or not
494 void SetFocusable(Actor actor, bool focusable);
497 * Handle the accessibility pan gesture.
498 * @param[in] panEvent The pan event to be handled.
499 * @return whether the gesture is handled successfully or not.
501 virtual bool HandlePanGesture(const AccessibilityGestureEvent& panEvent);
504 * Change the accessibility status when Accessibility feature(screen-reader) turned on or off.
505 * @return whether the status is changed or not.
507 virtual bool ChangeAccessibilityStatus();
510 * Clear the accessibility focus from the current focused actor.
511 * @return whether the focus is cleared or not.
513 virtual bool ClearAccessibilityFocus();
516 * Perform the accessibility action associated with a scroll event.
517 * @param touchEvent The touch point (and time) of the event.
518 * @return whether the focus is cleared or not.
520 virtual bool AccessibilityActionScroll( Dali::TouchEvent& touchEvent );
523 * Perform the accessibility action to move focus to the previous focusable actor (by one finger flick up).
524 * @param allowEndFeedback true if end of list feedback should be played when the focus is alread reached to the end
525 * @return whether the accessibility action is performed or not.
527 virtual bool AccessibilityActionPrevious(bool allowEndFeedback);
530 * Perform the accessibility action to move focus to the next focusable actor (by one finger flick down).
531 * @param allowEndFeedback true if end of list feedback should be played when the focus is alread reached to the end
532 * @return whether the accessibility action is performed or not.
534 virtual bool AccessibilityActionNext(bool allowEndFeedback);
537 * Perform the accessibility action to move focus to the previous focusable actor (by one finger flick left).
538 * @param allowEndFeedback true if end of list feedback should be played when the focus is alread reached to the end
539 * @return whether the accessibility action is performed or not.
541 virtual bool AccessibilityActionReadPrevious(bool allowEndFeedback);
544 * Perform the accessibility action to move focus to the next focusable actor (by one finger flick right).
545 * @param allowEndFeedback true if end of list feedback should be played when the focus is alread reached to the end
546 * @return whether the accessibility action is performed or not.
548 virtual bool AccessibilityActionReadNext(bool allowEndFeedback);
551 * Perform the accessibility action to focus and read the actor (by one finger tap or move).
552 * @param allowReadAgain true if the action read again the same object (i.e. read action)
553 * false if the action just read when the focus object is changed (i.e. over action)
554 * @return whether the accessibility action is performed or not.
556 virtual bool AccessibilityActionRead(bool allowReadAgain);
559 * Perform the accessibility action to activate the current focused actor (by one finger double tap).
560 * @return whether the accessibility action is performed or not.
562 virtual bool AccessibilityActionActivate();
565 * Perform the accessibility action to change the value when the current focused actor is a slider
566 * (by double finger down and move up and right).
567 * @return whether the accessibility action is performed or not.
569 virtual bool AccessibilityActionUp();
572 * Perform the accessibility action to change the value when the current focused actor is a slider
573 * (by double finger down and move down and left).
574 * @return whether the accessibility action is performed or not.
576 virtual bool AccessibilityActionDown();
579 * Perform the accessibility action to navigate back (by two fingers circle draw).
580 * @return whether the accessibility action is performed or not.
582 virtual bool AccessibilityActionBack();
585 * Perform the accessibility action to scroll up the list and focus on the first item on the list
586 * after the scrolling and read the item (by two finger swipe up).
587 * @return whether the accessibility action is performed or not.
589 virtual bool AccessibilityActionScrollUp();
592 * Perform the accessibility action to scroll down the list and focus on the first item on the list
593 * after the scrolling and read the item (by two finger swipe down).
594 * @return whether the accessibility action is performed or not.
596 virtual bool AccessibilityActionScrollDown();
599 * Perform the accessibility action to scroll left to the previous page (by two finger swipe left).
600 * @return whether the accessibility action is performed or not.
602 virtual bool AccessibilityActionPageLeft();
605 * Perform the accessibility action to scroll right to the next page (by two finger swipe right).
606 * @return whether the accessibility action is performed or not.
608 virtual bool AccessibilityActionPageRight();
611 * Perform the accessibility action to scroll up to the previous page (by one finger swipe left and right).
612 * @return whether the accessibility action is performed or not.
614 virtual bool AccessibilityActionPageUp();
617 * Perform the accessibility action to scroll down to the next page (by one finger swipe right and left).
618 * @return whether the accessibility action is performed or not.
620 virtual bool AccessibilityActionPageDown();
623 * Perform the accessibility action to move the focus to the first item on the screen
624 * (by one finger swipe up and down).
625 * @return whether the accessibility action is performed or not.
627 virtual bool AccessibilityActionMoveToFirst();
630 * Perform the accessibility action to move the focus to the last item on the screen
631 * (by one finger swipe down and up).
632 * @return whether the accessibility action is performed or not.
634 virtual bool AccessibilityActionMoveToLast();
637 * Perform the accessibility action to move the focus to the first item on the top
638 * and read from the top item continuously (by three fingers single tap).
639 * @return whether the accessibility action is performed or not.
641 virtual bool AccessibilityActionReadFromTop();
644 * Perform the accessibility action to move the focus to and read from the next item
645 * continuously (by three fingers double tap).
646 * @return whether the accessibility action is performed or not.
648 virtual bool AccessibilityActionReadFromNext();
651 * Perform the accessibility action to move the focus to do the zooming (by one finger triple tap).
652 * @return whether the accessibility action is performed or not.
654 virtual bool AccessibilityActionZoom();
657 * Perform the accessibility action to pause/resume the current read out (by two fingers single tap).
658 * @return whether the accessibility action is performed or not.
660 virtual bool AccessibilityActionReadPauseResume();
663 * Perform the accessibility action to start/stop the current action (by two fingers double tap).
664 * @return whether the accessibility action is performed or not.
666 virtual bool AccessibilityActionStartStop();
669 * Perform the accessibility action to mouse move (by one finger tap & hold and move).
670 * @param touchEvent touch event structure
671 * @return whether the accessibility action is performed or not.
673 virtual bool AccessibilityActionTouch(const TouchEvent& touchEvent);
676 * This function is connected to the TtsPlayer StateChangeSignal.
677 * It is called when the TTS players state changes.
678 * @param previousState The previous state of the TTS player (for comparison)
679 * @param currentState The current state of the TTS player
681 void TtsStateChanged( const Dali::TtsPlayer::State previousState, const Dali::TtsPlayer::State currentState );
686 AccessibilityManager(const AccessibilityManager&);
688 AccessibilityManager& operator=(const AccessibilityManager& rhs);
692 Toolkit::AccessibilityManager::FocusChangedSignalType mFocusChangedSignal; ///< The signal to notify the focus change
693 Toolkit::AccessibilityManager::FocusOvershotSignalType mFocusOvershotSignal; ///< The signal to notify the focus overshooted
694 Toolkit::AccessibilityManager::FocusedActorActivatedSignalType mFocusedActorActivatedSignal; ///< The signal to notify the activation of focused actor
697 AccessibilityActionSignalType mStatusChangedSignal;
698 AccessibilityActionSignalType mActionNextSignal;
699 AccessibilityActionSignalType mActionPreviousSignal;
700 AccessibilityActionSignalType mActionActivateSignal;
701 AccessibilityActionSignalType mActionOverSignal;
702 AccessibilityActionSignalType mActionReadSignal;
703 AccessibilityActionSignalType mActionReadNextSignal;
704 AccessibilityActionSignalType mActionReadPreviousSignal;
705 AccessibilityActionSignalType mActionUpSignal;
706 AccessibilityActionSignalType mActionDownSignal;
707 AccessibilityActionSignalType mActionClearFocusSignal;
708 AccessibilityActionSignalType mActionBackSignal;
709 AccessibilityActionSignalType mActionScrollUpSignal;
710 AccessibilityActionSignalType mActionScrollDownSignal;
711 AccessibilityActionSignalType mActionPageLeftSignal;
712 AccessibilityActionSignalType mActionPageRightSignal;
713 AccessibilityActionSignalType mActionPageUpSignal;
714 AccessibilityActionSignalType mActionPageDownSignal;
715 AccessibilityActionSignalType mActionMoveToFirstSignal;
716 AccessibilityActionSignalType mActionMoveToLastSignal;
717 AccessibilityActionSignalType mActionReadFromTopSignal;
718 AccessibilityActionSignalType mActionReadFromNextSignal;
719 AccessibilityActionSignalType mActionZoomSignal;
720 AccessibilityActionSignalType mActionReadIndicatorInformationSignal;
721 AccessibilityActionSignalType mActionReadPauseResumeSignal;
722 AccessibilityActionSignalType mActionStartStopSignal;
723 AccessibilityActionScrollSignalType mActionScrollSignal;
725 FocusIDContainer mFocusIDContainer; ///< The container to look up actor ID by focus order
726 IDAdditionalInfoContainer mIDAdditionalInfoContainer; ///< The container to look up additional information by actor ID
727 FocusIDPair mCurrentFocusActor; ///< The focus order and actor ID of current focused actor
728 Actor mCurrentGesturedActor; ///< The actor that will handle the gesture
729 Actor mFocusIndicatorActor; ///< The focus indicator actor shared by all the focusable actors for highlight
730 Vector2 mPreviousPosition; ///< The previous pan position; useful for calculating velocity for Gesture::Finished events
731 unsigned int mRecursiveFocusMoveCounter; ///< The counter to count the number of recursive focus movement attempted before the focus movement is successful.
732 std::string mFocusSoundFilePath; ///< The path of the focus sound file
733 std::string mFocusChainEndSoundFilePath; ///< The path of the focus chain end sound file
735 bool mIsWrapped:1; ///< Whether the focus movement is wrapped around or not
736 bool mIsFocusWithinGroup:1; ///< Whether the focus movement is limited to the current focus group or not
737 bool mIsEndcapFeedbackEnabled:1; ///< Whether the endcap feedback need to be played when the focus leaves the end or vice versa
738 bool mIsEndcapFeedbackPlayed:1; ///< Whether the endcap feedback was played or not
739 bool mIsAccessibilityTtsEnabled:1; ///< Whether accessibility feature(screen-reader) turned on/off
740 bool mTtsCreated:1; ///< Whether the TTS Player has been accessed
741 bool mIsFocusIndicatorEnabled:1; ///< Whether indicator should be shown / hidden. It could be enabled when TTS enabled or 'Tab' key operated.
742 bool mContinuousPlayMode:1; ///< Keeps track of whether or not we are in continuous play mode
743 bool mIsFocusSoundFilePathSet:1; ///< Whether the path of the focus sound file has been set
744 bool mIsFocusChainEndSoundFilePathSet:1; ///< Whether the path of the focus chain end sound file has been set
748 } // namespace Internal
750 inline Internal::AccessibilityManager& GetImpl(Dali::Toolkit::AccessibilityManager& obj)
752 DALI_ASSERT_ALWAYS(obj);
754 Dali::BaseObject& handle = obj.GetBaseObject();
756 return static_cast<Internal::AccessibilityManager&>(handle);
759 inline const Internal::AccessibilityManager& GetImpl(const Dali::Toolkit::AccessibilityManager& obj)
761 DALI_ASSERT_ALWAYS(obj);
763 const Dali::BaseObject& handle = obj.GetBaseObject();
765 return static_cast<const Internal::AccessibilityManager&>(handle);
768 } // namespace Toolkit
772 #endif // DALI_TOOLKIT_INTERNAL_ACCESSIBILITY_MANAGER_H