Fix gesture issue caused by screen reader
authorSangYong Park <sy302.park@samsung.com>
Wed, 29 May 2013 05:04:29 +0000 (14:04 +0900)
committerGerrit Code Review <gerrit@gerrit.vlan144.tizendev.org>
Tue, 2 Jul 2013 06:20:14 +0000 (06:20 +0000)
[Title] Fix gesture issue caused by screen reader
[Issue#] P130510-6314
[Problem] Sometimes does not work gesture.
[Cause] Condition was wrong which check screen reader enabling
[Solution] Change checking condition code

Change-Id: If63495da6d94030cd155d5fb4aec6bce1c4bbc2b

Conflicts:

Source/WebKit2/UIProcess/API/efl/ewk_view.cpp

Source/WebKit2/UIProcess/API/efl/ewk_view.cpp
Source/WebKit2/UIProcess/API/efl/tizen/ScreenReaderProxy.cpp
Source/WebKit2/UIProcess/API/efl/tizen/ScreenReaderProxy.h

index 33931ee..13fd85b 100755 (executable)
@@ -775,7 +775,7 @@ Eina_Bool _ewk_view_screen_reader_action_execute(Ewk_View_Smart_Data* smartData,
 {
     EWK_VIEW_IMPL_GET_OR_RETURN(smartData, impl, false);
 
-    return ScreenReaderProxy::screenReader().executeAction(impl, static_cast<Elm_Access_Action_Info*>(actionInfo));
+    return ScreenReaderProxy::executeAction(impl, 0, static_cast<Elm_Access_Action_Info*>(actionInfo));
 }
 #endif
 #endif // #if OS(TIZEN)
@@ -862,7 +862,7 @@ static void _ewk_view_smart_del(Evas_Object* ewkView)
     EwkViewImpl::removeFromPageViewMap(ewkView);
     EWK_VIEW_SD_GET(ewkView, smartData);
 #if ENABLE(TIZEN_SCREEN_READER)
-    ScreenReaderProxy::screenReader().disable(smartData->priv);
+    ScreenReaderProxy::screenReader().remove(smartData->priv);
 #endif
 #if ENABLE(TIZEN_INPUT_COLOR_PICKER)
     // Close color picker if it's opened.
@@ -1005,7 +1005,7 @@ static void _ewk_view_smart_show(Evas_Object* ewkView)
     evas_object_show(smartData->image);
 
 #if ENABLE(TIZEN_SCREEN_READER)
-    ScreenReaderProxy::screenReader().enable(impl);
+    ScreenReaderProxy::screenReader().initialize(impl);
 #endif
 }
 
index d14f37c..da08a40 100755 (executable)
@@ -46,10 +46,14 @@ ScreenReaderProxy& ScreenReaderProxy::screenReader()
 ScreenReaderProxy::ScreenReaderProxy()
     : m_ttsHandle(0)
 {
+    int enabled;
+    m_enabled = (!vconf_get_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, &enabled) && enabled);
+    vconf_notify_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, didSettingsChanged, this);
 }
 
 ScreenReaderProxy::~ScreenReaderProxy()
 {
+    vconf_ignore_key_changed(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, didSettingsChanged);
 }
 
 void ScreenReaderProxy::addViewImpl(EwkViewImpl* viewImpl)
@@ -78,28 +82,26 @@ void ScreenReaderProxy::removeViewImpl(EwkViewImpl* viewImpl)
     m_ttsHandle = 0;
 }
 
-void ScreenReaderProxy::enable(EwkViewImpl* viewImpl)
+void ScreenReaderProxy::initialize(EwkViewImpl* viewImpl)
 {
     Evas_Object* accessObject = elm_access_object_get(viewImpl->view());
     if (!accessObject)
         return;
 
-    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_HIGHLIGHT, highlightHandler, viewImpl);
-    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_UNHIGHLIGHT, unhighlightHandler, viewImpl);
-    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_HIGHLIGHT_NEXT, highlightNextHandler, viewImpl);
-    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_HIGHLIGHT_PREV, highlightPrevHandler, viewImpl);
-    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_ACTIVATE, activateHandler, viewImpl);
-    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_SCROLL, scrollHandler, viewImpl);
-    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_MOUSE, mouseHandler, viewImpl);
-    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_UP, upHandler, viewImpl);
-    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_DOWN, downHandler, viewImpl);
-    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_BACK, backHandler, viewImpl);
-    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_READ, readHandler, viewImpl);
-
-    addViewImpl(viewImpl);
+    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_HIGHLIGHT, executeAction, viewImpl);
+    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_UNHIGHLIGHT, executeAction, viewImpl);
+    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_HIGHLIGHT_NEXT, executeAction, viewImpl);
+    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_HIGHLIGHT_PREV, executeAction, viewImpl);
+    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_ACTIVATE, executeAction, viewImpl);
+    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_SCROLL, executeAction, viewImpl);
+    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_MOUSE, executeAction, viewImpl);
+    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_UP, executeAction, viewImpl);
+    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_DOWN, executeAction, viewImpl);
+    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_BACK, executeAction, viewImpl);
+    elm_access_action_cb_set(accessObject, ELM_ACCESS_ACTION_READ, executeAction, viewImpl);
 }
 
-void ScreenReaderProxy::disable(EwkViewImpl* viewImpl)
+void ScreenReaderProxy::remove(EwkViewImpl* viewImpl)
 {
     Evas_Object* accessObject = elm_access_object_get(viewImpl->view());
     if (accessObject) {
@@ -148,145 +150,96 @@ void ScreenReaderProxy::setText(const String& text)
     }
 }
 
-bool ScreenReaderProxy::executeAction(EwkViewImpl* viewImpl, Elm_Access_Action_Info* actionInfo)
+Eina_Bool ScreenReaderProxy::executeAction(void* data, Evas_Object*, Elm_Access_Action_Info* actionInfo)
 {
-    addViewImpl(viewImpl);
-
-    if (actionInfo->action_type == ELM_ACCESS_ACTION_UNHIGHLIGHT)
-        unhighlightHandler(viewImpl, 0, 0);
-    else if (actionInfo->action_type == ELM_ACCESS_ACTION_HIGHLIGHT_NEXT)
-        return highlightNextHandler(viewImpl, 0, 0);
-    else if (actionInfo->action_type == ELM_ACCESS_ACTION_HIGHLIGHT_PREV)
-        return highlightPrevHandler(viewImpl, 0, 0);
-    else if (actionInfo->action_type == ELM_ACCESS_ACTION_ACTIVATE)
-        activateHandler(viewImpl, 0, 0);
-    else if (actionInfo->action_type == ELM_ACCESS_ACTION_SCROLL)
-        scrollHandler(viewImpl, 0, actionInfo);
-    else if (actionInfo->action_type == ELM_ACCESS_ACTION_MOUSE)
-        mouseHandler(viewImpl, 0, actionInfo);
-    else if (actionInfo->action_type == ELM_ACCESS_ACTION_UP)
-        upHandler(viewImpl, 0, 0);
-    else if (actionInfo->action_type == ELM_ACCESS_ACTION_DOWN)
-        downHandler(viewImpl, 0, 0);
-    else if (actionInfo->action_type == ELM_ACCESS_ACTION_BACK)
-        backHandler(viewImpl, 0, 0);
-    else if (actionInfo->action_type == ELM_ACCESS_ACTION_READ)
-        readHandler(viewImpl, 0, actionInfo);
-
-    return true;
-}
-
-Eina_Bool ScreenReaderProxy::highlightHandler(void* data, Evas_Object*, Elm_Access_Action_Info* actionInfo)
-{
-    if (!actionInfo)
+    if (!screenReader().m_enabled || !actionInfo)
         return false;
 
-    if (actionInfo->action_by == ELM_ACCESS_ACTION_HIGHLIGHT_NEXT)
-        return highlightNextHandler(data, 0, 0);
-    if (actionInfo->action_by == ELM_ACCESS_ACTION_HIGHLIGHT_PREV)
-        return highlightPrevHandler(data, 0, 0);
-
-    return true;
-}
-
-Eina_Bool ScreenReaderProxy::unhighlightHandler(void* data, Evas_Object*, Elm_Access_Action_Info*)
-{
     EwkViewImpl* viewImpl = static_cast<EwkViewImpl*>(data);
+    screenReader().addViewImpl(viewImpl);
+
+    switch (actionInfo->action_type) {
+    case ELM_ACCESS_ACTION_HIGHLIGHT:
+        if (actionInfo->action_by == ELM_ACCESS_ACTION_HIGHLIGHT_NEXT)
+            return viewImpl->page()->moveScreenReaderFocus(true);
+        if (actionInfo->action_by == ELM_ACCESS_ACTION_HIGHLIGHT_PREV)
+            return viewImpl->page()->moveScreenReaderFocus(false);
+        break;
+
+    case ELM_ACCESS_ACTION_UNHIGHLIGHT:
+        viewImpl->page()->clearScreenReader();
+        viewImpl->focusRing->hide(false);
+        tts_stop(screenReader().m_ttsHandle);
+        break;
+
+    case ELM_ACCESS_ACTION_HIGHLIGHT_NEXT:
+        return viewImpl->page()->moveScreenReaderFocus(true);
+
+    case ELM_ACCESS_ACTION_HIGHLIGHT_PREV:
+        return viewImpl->page()->moveScreenReaderFocus(false);
+
+    case ELM_ACCESS_ACTION_ACTIVATE: {
+        IntPoint point(viewImpl->focusRing->centerPointInScreen());
+        if (point.x() < 0 || point.y() < 0)
+            return false;
+
+        if (viewImpl->page()->raiseTapEvent(viewImpl->transformFromScene().mapPoint(point)) && viewImpl->page()->isViewVisible())
+            evas_object_focus_set(viewImpl->view(), true);
+        break;
+    }
 
-    viewImpl->page()->clearScreenReader();
-    viewImpl->focusRing->hide(false);
-    tts_stop(screenReader().m_ttsHandle);
-
-    return true;
-}
-
-Eina_Bool ScreenReaderProxy::highlightNextHandler(void* data, Evas_Object*, Elm_Access_Action_Info*)
-{
-    EwkViewImpl* viewImpl = static_cast<EwkViewImpl*>(data);
-    return viewImpl->page()->moveScreenReaderFocus(true);
-}
-
-Eina_Bool ScreenReaderProxy::highlightPrevHandler(void* data, Evas_Object*, Elm_Access_Action_Info*)
-{
-    EwkViewImpl* viewImpl = static_cast<EwkViewImpl*>(data);
-    return viewImpl->page()->moveScreenReaderFocus(false);
-}
-
-Eina_Bool ScreenReaderProxy::activateHandler(void* data, Evas_Object*, Elm_Access_Action_Info*)
-{
-    EwkViewImpl* viewImpl = static_cast<EwkViewImpl*>(data);
-    IntPoint point(viewImpl->focusRing->centerPointInScreen());
-    if (point.x() < 0 || point.y() < 0)
-        return false;
-
-    if (viewImpl->page()->raiseTapEvent(viewImpl->transformFromScene().mapPoint(point)) && viewImpl->page()->isViewVisible())
-        evas_object_focus_set(viewImpl->view(), true);
-
-    return true;
-}
-
-Eina_Bool ScreenReaderProxy::scrollHandler(void* data, Evas_Object*, Elm_Access_Action_Info* actionInfo)
-{
-    if (!actionInfo)
-        return false;
-
-    EwkViewImpl* viewImpl = static_cast<EwkViewImpl*>(data);
-
-    if (actionInfo->mouse_type == 0) {
-        viewImpl->gestureClient->reset();
-        viewImpl->gestureClient->setGestureEnabled(true);
-        viewImpl->gestureClient->setMovingEnabled(true);
-        viewImpl->gestureClient->startPan(IntPoint(actionInfo->x, actionInfo->y));
-    } else if (actionInfo->mouse_type == 1)
-        viewImpl->gestureClient->movePan(IntPoint(actionInfo->x, actionInfo->y));
-    else if (actionInfo->mouse_type == 2)
-        viewImpl->gestureClient->endPan(IntPoint(actionInfo->x, actionInfo->y));
-
-    return true;
-}
-
-Eina_Bool ScreenReaderProxy::mouseHandler(void* data, Evas_Object*, Elm_Access_Action_Info* actionInfo)
-{
-    return scrollHandler(data, 0, actionInfo);
-}
-
-Eina_Bool ScreenReaderProxy::upHandler(void* data, Evas_Object*, Elm_Access_Action_Info*)
-{
-    EwkViewImpl* viewImpl = static_cast<EwkViewImpl*>(data);
-    viewImpl->page()->adjustScreenReaderFocusedObjectValue(true);
-
-    return true;
-}
-
-Eina_Bool ScreenReaderProxy::downHandler(void* data, Evas_Object*, Elm_Access_Action_Info*)
-{
-    EwkViewImpl* viewImpl = static_cast<EwkViewImpl*>(data);
-    viewImpl->page()->adjustScreenReaderFocusedObjectValue(false);
-
-    return true;
-}
+    case ELM_ACCESS_ACTION_SCROLL:
+    case ELM_ACCESS_ACTION_MOUSE:
+        if (actionInfo->mouse_type == 0) {
+            viewImpl->gestureClient->reset();
+            viewImpl->gestureClient->setGestureEnabled(true);
+            viewImpl->gestureClient->setMovingEnabled(true);
+            viewImpl->gestureClient->startPan(IntPoint(actionInfo->x, actionInfo->y));
+        } else if (actionInfo->mouse_type == 1)
+            viewImpl->gestureClient->movePan(IntPoint(actionInfo->x, actionInfo->y));
+        else if (actionInfo->mouse_type == 2)
+            viewImpl->gestureClient->endPan(IntPoint(actionInfo->x, actionInfo->y));
+        break;
+
+    case ELM_ACCESS_ACTION_UP:
+        viewImpl->page()->adjustScreenReaderFocusedObjectValue(true);
+        break;
+
+    case ELM_ACCESS_ACTION_DOWN:
+        viewImpl->page()->adjustScreenReaderFocusedObjectValue(false);
+        break;
+
+    case ELM_ACCESS_ACTION_BACK:
+        if (!viewImpl->pageProxy->canGoBack())
+            return false;
+
+        viewImpl->pageProxy->goBack();
+        break;
+
+    case ELM_ACCESS_ACTION_READ: {
+        IntPoint localPoint = viewImpl->transformFromScene().mapPoint(IntPoint(actionInfo->x, actionInfo->y));
+        viewImpl->page()->moveScreenReaderFocusByPoint(localPoint);
+        break;
+    }
 
-Eina_Bool ScreenReaderProxy::backHandler(void* data, Evas_Object*, Elm_Access_Action_Info*)
-{
-    EwkViewImpl* viewImpl = static_cast<EwkViewImpl*>(data);
-    if (!viewImpl->pageProxy->canGoBack())
-        return false;
+    default:
+        break;
+    }
 
-    viewImpl->pageProxy->goBack();
     return true;
 }
 
-Eina_Bool ScreenReaderProxy::readHandler(void* data, Evas_Object*, Elm_Access_Action_Info* actionInfo)
+void ScreenReaderProxy::didSettingsChanged(keynode_t* keynode, void* data)
 {
-    if (!actionInfo)
-        return false;
+    ScreenReaderProxy* screenReader = static_cast<ScreenReaderProxy*>(data);
 
-    EwkViewImpl* viewImpl = static_cast<EwkViewImpl*>(data);
-    IntPoint localPoint = viewImpl->transformFromScene().mapPoint(IntPoint(actionInfo->x, actionInfo->y));
-
-    viewImpl->page()->moveScreenReaderFocusByPoint(localPoint);
+    int enabled;
+    screenReader->m_enabled = (!vconf_get_bool(VCONFKEY_SETAPPL_ACCESSIBILITY_TTS, &enabled) && enabled);
 
-    return true;
+    if (!screenReader->m_enabled) {
+        while (!screenReader->m_viewImplSet.isEmpty())
+            screenReader->removeViewImpl(screenReader->m_viewImplSet[0]);
+    }
 }
 
 void ScreenReaderProxy::didTTSStateChanged(tts_h, tts_state_e, tts_state_e currentState, void*)
index b07f001..8eed23d 100755 (executable)
@@ -31,6 +31,7 @@
 #include <Ecore.h>
 #include <Evas.h>
 #include <tts.h>
+#include <vconf.h>
 #include <wtf/Vector.h>
 
 class EwkViewImpl;
@@ -43,14 +44,14 @@ public:
 
     virtual ~ScreenReaderProxy();
 
-    bool isEnabled() { return !m_viewImplSet.isEmpty(); }
+    bool isEnabled() { return m_enabled; }
 
-    void enable(EwkViewImpl*);
-    void disable(EwkViewImpl*);
+    void initialize(EwkViewImpl*);
+    void remove(EwkViewImpl*);
 
     void setText(const String&);
 
-    bool executeAction(EwkViewImpl*, Elm_Access_Action_Info*);
+    static Eina_Bool executeAction(void*, Evas_Object*, Elm_Access_Action_Info*);
 
 private:
     ScreenReaderProxy();
@@ -58,19 +59,10 @@ private:
     void addViewImpl(EwkViewImpl*);
     void removeViewImpl(EwkViewImpl*);
 
-    static Eina_Bool highlightHandler(void*, Evas_Object*, Elm_Access_Action_Info*);
-    static Eina_Bool unhighlightHandler(void*, Evas_Object*, Elm_Access_Action_Info*);
-    static Eina_Bool highlightNextHandler(void*, Evas_Object*, Elm_Access_Action_Info*);
-    static Eina_Bool highlightPrevHandler(void*, Evas_Object*, Elm_Access_Action_Info*);
-    static Eina_Bool activateHandler(void*, Evas_Object*, Elm_Access_Action_Info*);
-    static Eina_Bool scrollHandler(void*, Evas_Object*, Elm_Access_Action_Info*);
-    static Eina_Bool mouseHandler(void*, Evas_Object*, Elm_Access_Action_Info*);
-    static Eina_Bool upHandler(void*, Evas_Object*, Elm_Access_Action_Info*);
-    static Eina_Bool downHandler(void*, Evas_Object*, Elm_Access_Action_Info*);
-    static Eina_Bool backHandler(void*, Evas_Object*, Elm_Access_Action_Info*);
-    static Eina_Bool readHandler(void*, Evas_Object*, Elm_Access_Action_Info*);
+    static void didSettingsChanged(keynode_t*, void*);
     static void didTTSStateChanged(tts_h, tts_state_e, tts_state_e, void*);
 
+    bool m_enabled;
     Vector<EwkViewImpl*> m_viewImplSet;
 
     tts_h m_ttsHandle;