2 * Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "accessibility-manager-impl.h"
23 #include <dali/public-api/dali-core.h>
24 #include <dali/integration-api/debug.h>
25 #include <dali/integration-api/events/touch-event-integ.h>
26 #include <dali/integration-api/events/gesture-requests.h>
27 #include "system-settings.h"
40 #if defined(DEBUG_ENABLED)
41 Debug::Filter* gAccessibilityManagerLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_ACCESSIBILITY_MANAGER");
46 BaseHandle handle( AccessibilityManager::Get() );
48 if ( !handle && Adaptor::IsAvailable() )
50 Adaptor& adaptorImpl( Adaptor::GetImplementation( Adaptor::Get() ) );
51 Dali::AccessibilityManager manager = Dali::AccessibilityManager( new AccessibilityManager() );
52 adaptorImpl.RegisterSingleton( typeid( manager ), manager );
58 TypeRegistration ACCESSIBILITY_MANAGER_TYPE( typeid(Dali::AccessibilityManager), typeid(Dali::BaseHandle), Create, true /* Create Instance At Startup */ );
60 } // unnamed namespace
62 Dali::AccessibilityManager AccessibilityManager::Get()
64 Dali::AccessibilityManager manager;
66 if ( Adaptor::IsAvailable() )
68 // Check whether the singleton is already created
69 Dali::BaseHandle handle = Dali::Adaptor::Get().GetSingleton( typeid( Dali::AccessibilityManager ) );
72 // If so, downcast the handle
73 manager = Dali::AccessibilityManager( dynamic_cast< AccessibilityManager* >( handle.GetObjectPtr() ) );
80 Vector2 AccessibilityManager::GetReadPosition() const
85 void AccessibilityManager::SetActionHandler(AccessibilityActionHandler& handler)
87 mActionHandler = &handler;
90 void AccessibilityManager::SetGestureHandler(AccessibilityGestureHandler& handler)
92 if( mAccessibilityGestureDetector )
94 mAccessibilityGestureDetector->SetGestureHandler(handler);
98 bool AccessibilityManager::HandleActionClearFocusEvent()
102 Dali::AccessibilityManager handle( this );
105 * In order to application decide reading action first,
106 * emit ActionClearFocus signal in first, ClearAccessibilityFocus for handler in next
108 if ( !mIndicatorFocused )
110 if( !mActionClearFocusSignalV2.Empty() )
112 mActionClearFocusSignalV2.Emit( handle );
118 ret = mActionHandler->ClearAccessibilityFocus();
121 DALI_LOG_INFO(gAccessibilityManagerLogFilter, Debug::General, "[%s:%d] %s\n", __FUNCTION__, __LINE__, ret?"TRUE":"FALSE");
126 bool AccessibilityManager::HandleActionScrollEvent(const TouchPoint& point, unsigned long timeStamp)
130 Dali::AccessibilityManager handle( this );
132 Dali::TouchEvent touchEvent(timeStamp);
133 touchEvent.points.push_back(point);
136 * In order to application decide touch action first,
137 * emit ActionScroll signal in first, AccessibilityActionScroll for handler in next
139 if ( !mIndicatorFocused )
141 if( !mActionScrollSignalV2.Empty() )
143 mActionScrollSignalV2.Emit( handle, touchEvent );
147 Integration::TouchEvent event;
148 if (mCombiner.GetNextTouchEvent(point, timeStamp, event))
150 // Process the touch event in accessibility gesture detector
151 if( mAccessibilityGestureDetector )
153 mAccessibilityGestureDetector->SendEvent(event);
161 bool AccessibilityManager::HandleActionTouchEvent(const TouchPoint& point, unsigned long timeStamp)
165 Dali::TouchEvent touchEvent(timeStamp);
166 touchEvent.points.push_back(point);
170 ret = mActionHandler->AccessibilityActionTouch(touchEvent);
175 bool AccessibilityManager::HandleActionBackEvent()
179 Dali::AccessibilityManager handle( this );
182 * In order to application decide reading action first,
183 * emit ActionBack signal in first, AccessibilityActionBack for handler in next
185 if ( !mIndicatorFocused )
187 if( !mActionBackSignalV2.Empty() )
189 mActionBackSignalV2.Emit( handle );
195 ret = mActionHandler->AccessibilityActionBack();
198 DALI_LOG_INFO(gAccessibilityManagerLogFilter, Debug::General, "[%s:%d] %s\n", __FUNCTION__, __LINE__, ret?"TRUE":"FALSE");
203 void AccessibilityManager::HandleActionEnableEvent()
205 EnableAccessibility();
208 void AccessibilityManager::HandleActionDisableEvent()
210 DisableAccessibility();
213 void AccessibilityManager::EnableAccessibility()
215 if(mIsEnabled == false)
221 mActionHandler->ChangeAccessibilityStatus();
224 //emit status changed signal
225 Dali::AccessibilityManager handle( this );
226 mStatusChangedSignalV2.Emit( handle );
230 void AccessibilityManager::DisableAccessibility()
232 if(mIsEnabled == true)
238 mActionHandler->ChangeAccessibilityStatus();
241 //emit status changed signal
242 Dali::AccessibilityManager handle( this );
243 mStatusChangedSignalV2.Emit( handle );
245 // Destroy the TtsPlayer if exists.
246 Dali::Adaptor& adaptor = Dali::Adaptor::Get();
247 Adaptor::GetImplementation(adaptor).DestroyTtsPlayer(Dali::TtsPlayer::SCREEN_READER);
251 bool AccessibilityManager::IsEnabled() const
256 void AccessibilityManager::SetIndicator(Indicator* indicator)
258 mIndicator = indicator;
261 AccessibilityManager::AccessibilityManager()
263 mActionHandler(NULL),
265 mIndicatorFocused(false)
268 DALI_LOG_INFO(gAccessibilityManagerLogFilter, Debug::General, "[%s:%d] %s\n", __FUNCTION__, __LINE__, isEnabled?"ENABLED":"DISABLED");
279 mAccessibilityGestureDetector = new AccessibilityGestureDetector();
282 AccessibilityManager::~AccessibilityManager()
286 bool AccessibilityManager::HandleActionNextEvent(bool allowEndFeedback)
289 Dali::AccessibilityManager handle( this );
292 * In order to application decide reading action first,
293 * emit ActionNext signal in first, AccessibilityActionNext for handler in next
295 if( !mIndicatorFocused )
297 if( !mActionNextSignalV2.Empty() )
299 mActionNextSignalV2.Emit( handle );
305 ret = mActionHandler->AccessibilityActionNext(allowEndFeedback);
308 DALI_LOG_INFO(gAccessibilityManagerLogFilter, Debug::General, "[%s:%d] %s\n", __FUNCTION__, __LINE__, ret?"TRUE":"FALSE");
313 bool AccessibilityManager::HandleActionPreviousEvent(bool allowEndFeedback)
317 Dali::AccessibilityManager handle( this );
320 * In order to application decide reading action first,
321 * emit ActionPrevious signal in first, AccessibilityActionPrevious for handler in next
323 if ( !mIndicatorFocused )
325 if( !mActionPreviousSignalV2.Empty() )
327 mActionPreviousSignalV2.Emit( handle );
333 ret = mActionHandler->AccessibilityActionPrevious(allowEndFeedback);
336 DALI_LOG_INFO(gAccessibilityManagerLogFilter, Debug::General, "[%s:%d] %s\n", __FUNCTION__, __LINE__, ret?"TRUE":"FALSE");
341 bool AccessibilityManager::HandleActionActivateEvent()
345 Dali::AccessibilityManager handle( this );
348 * In order to application decide reading action first,
349 * emit ActionActivate signal in first, AccessibilityActionActivate for handler in next
351 if ( !mIndicatorFocused )
353 if( !mActionActivateSignalV2.Empty() )
355 mActionActivateSignalV2.Emit( handle );
361 ret = mActionHandler->AccessibilityActionActivate();
364 DALI_LOG_INFO(gAccessibilityManagerLogFilter, Debug::General, "[%s:%d] %s\n", __FUNCTION__, __LINE__, ret?"TRUE":"FALSE");
369 bool AccessibilityManager::HandleActionReadEvent(unsigned int x, unsigned int y, bool allowReadAgain)
373 DALI_LOG_INFO(gAccessibilityManagerLogFilter, Debug::General, "[%s:%d] %d , %d\n", __FUNCTION__, __LINE__, x, y);
378 Dali::AccessibilityManager handle( this );
380 bool indicatorFocused = false;
382 // Check whether the Indicator is focused
383 if( mIndicator && mIndicator->IsConnected() )
385 // Check the position and size of Indicator actor
386 Dali::Actor indicatorActor = mIndicator->GetActor();
387 Vector3 position = Vector3(0.0f, 0.0f, 0.0f);
388 Vector3 size = indicatorActor.GetCurrentSize();
390 if(mReadPosition.x >= position.x &&
391 mReadPosition.x <= position.x + size.width &&
392 mReadPosition.y >= position.y &&
393 mReadPosition.y <= position.y + size.height)
395 indicatorFocused = true;
396 DALI_LOG_INFO(gAccessibilityManagerLogFilter, Debug::General, "[%s:%d] Indicator area!!!!\n", __FUNCTION__, __LINE__);
402 if( !mIndicatorFocused && indicatorFocused )
404 // If Indicator is focused, the focus should be cleared in Dali focus chain.
407 mActionHandler->ClearAccessibilityFocus();
411 mIndicatorFocused = indicatorFocused;
413 // Send accessibility READ action information to Indicator
414 if( mIndicatorFocused )
416 DALI_LOG_INFO(gAccessibilityManagerLogFilter, Debug::General, "[%s:%d] Send READ message to indicator!!!!\n", __FUNCTION__, __LINE__);
423 * In order to application decide reading action first,
424 * emit ActionRead signal in first, AccessibilityActionRead for handler in next
426 if( !mIndicatorFocused )
428 if ( !mActionReadSignalV2.Empty() )
430 mActionReadSignalV2.Emit( handle );
437 * In order to application decide reading action first,
438 * emit ActionRead signal in first, AccessibilityActionRead for handler in next
440 if( !mIndicatorFocused )
442 if ( !mActionOverSignalV2.Empty() )
444 mActionOverSignalV2.Emit( handle );
449 if( mActionHandler && !mIndicatorFocused)
451 // If Indicator is not focused, the accessibility actions should be handled by the registered
452 // accessibility action handler (e.g. focus manager)
453 ret = mActionHandler->AccessibilityActionRead(allowReadAgain);
454 DALI_LOG_INFO(gAccessibilityManagerLogFilter, Debug::General, "[%s:%d] %s\n", __FUNCTION__, __LINE__, ret?"TRUE":"FALSE");
460 bool AccessibilityManager::HandleActionReadNextEvent(bool allowEndFeedback)
464 Dali::AccessibilityManager handle( this );
467 * In order to application decide reading action first,
468 * emit ActionReadNext signal in first, AccessibilityActionReadNext for handler in next
470 if ( !mIndicatorFocused )
472 if( !mActionReadNextSignalV2.Empty() )
474 mActionReadNextSignalV2.Emit( handle );
480 ret = mActionHandler->AccessibilityActionReadNext(allowEndFeedback);
483 DALI_LOG_INFO(gAccessibilityManagerLogFilter, Debug::General, "[%s:%d] %s\n", __FUNCTION__, __LINE__, ret?"TRUE":"FALSE");
488 bool AccessibilityManager::HandleActionReadPreviousEvent(bool allowEndFeedback)
492 Dali::AccessibilityManager handle( this );
495 * In order to application decide reading action first,
496 * emit ActionReadPrevious signal in first, AccessibilityActionReadPrevious for handler in next
498 if ( !mIndicatorFocused )
500 if( !mActionReadPreviousSignalV2.Empty() )
502 mActionReadPreviousSignalV2.Emit( handle );
508 ret = mActionHandler->AccessibilityActionReadPrevious(allowEndFeedback);
511 DALI_LOG_INFO(gAccessibilityManagerLogFilter, Debug::General, "[%s:%d] %s\n", __FUNCTION__, __LINE__, ret?"TRUE":"FALSE");
516 bool AccessibilityManager::HandleActionUpEvent()
520 Dali::AccessibilityManager handle( this );
523 * In order to application decide reading action first,
524 * emit ActionUp signal in first, AccessibilityActionUp for handler in next
526 if ( !mIndicatorFocused )
528 if( !mActionUpSignalV2.Empty() )
530 mActionUpSignalV2.Emit( handle );
536 ret = mActionHandler->AccessibilityActionUp();
539 DALI_LOG_INFO(gAccessibilityManagerLogFilter, Debug::General, "[%s:%d] %s\n", __FUNCTION__, __LINE__, ret?"TRUE":"FALSE");
544 bool AccessibilityManager::HandleActionDownEvent()
548 Dali::AccessibilityManager handle( this );
551 * In order to application decide reading action first,
552 * emit ActionDown signal in first, AccessibilityActionDown for handler in next
554 if ( !mIndicatorFocused )
556 if( !mActionDownSignalV2.Empty() )
558 mActionDownSignalV2.Emit( handle );
564 ret = mActionHandler->AccessibilityActionDown();
567 DALI_LOG_INFO(gAccessibilityManagerLogFilter, Debug::General, "[%s:%d] %s\n", __FUNCTION__, __LINE__, ret?"TRUE":"FALSE");
572 } // namespace Adaptor
574 } // namespace Internal