Crash issue is fixed.
authorBumseung Cho <bumseung.cho@samsung.com>
Tue, 7 May 2013 14:18:26 +0000 (23:18 +0900)
committerBumseung Cho <bumseung.cho@samsung.com>
Tue, 7 May 2013 14:18:26 +0000 (23:18 +0900)
Change-Id: Iae5c2e4b6804836c5c9594b9a6561cbe8fee579a
Signed-off-by: Bumseung Cho <bumseung.cho@samsung.com>
src/ui/FUi_AccessibilityContainer.cpp
src/ui/FUi_AccessibilityElementImpl.cpp
src/ui/FUi_AccessibilityManager.cpp
src/ui/inc/FUi_AccessibilityContainer.h

index 109aead..31c1513 100644 (file)
@@ -101,6 +101,19 @@ _AccessibilityContainer::~_AccessibilityContainer(void)
        {
                _AccessibilityManager::GetInstance()->Unregister(__handle);
        }
+       int count = __childContainerList.GetCount();
+       _AccessibilityContainer* pContainer = null;
+       for (int i = 0; i< count;i++)
+       {
+               if(__childContainerList.GetAt(i, pContainer) == E_SUCCESS)
+               {
+                       pContainer->SetParent(null);
+               }
+       }
+       if(__pParent)
+       {
+               __pParent->RemoveChildContainer(*this);
+       }
 }
 
 _Control&
@@ -125,7 +138,7 @@ _AccessibilityContainer::AddChildContainer(const _AccessibilityContainer& child)
 
        result r = E_SYSTEM;
        _AccessibilityContainer* _child = &const_cast<_AccessibilityContainer&>(child);
-       _child->SetParent(*this);
+       _child->SetParent(this);
        __childContainerList.Add(_child);
        return r;
 }
@@ -150,7 +163,7 @@ _AccessibilityContainer::AddElement(const _AccessibilityElement& element)
        {
                return E_SUCCESS;
        }
-    _AccessibilityManager::GetInstance()->NeedRefreshItem();
+       _AccessibilityManager::GetInstance()->NeedRefreshItem();
        return __elementList.Add(&const_cast<_AccessibilityElement&>(element));
 }
 
@@ -166,7 +179,7 @@ _AccessibilityContainer::AddElements(const IListT<_AccessibilityElement*>& eleme
                        pElement->SetParent(*this);
                }
        }
-    _AccessibilityManager::GetInstance()->NeedRefreshItem();
+       _AccessibilityManager::GetInstance()->NeedRefreshItem();
        return __elementList.AddItems(elementList);
 }
 
@@ -174,7 +187,7 @@ result
 _AccessibilityContainer::InsertElement(const _AccessibilityElement& element, int index)
 {
        const_cast<_AccessibilityElement&>(element).SetParent(*this);
-    _AccessibilityManager::GetInstance()->NeedRefreshItem();
+       _AccessibilityManager::GetInstance()->NeedRefreshItem();
        return __elementList.InsertAt(&const_cast<_AccessibilityElement&>(element), index);
 }
 
@@ -207,7 +220,7 @@ _AccessibilityContainer::RemoveAllElement()
                }
        }
        __elementList.RemoveAll();
-    _AccessibilityManager::GetInstance()->NeedRefreshItem();
+       _AccessibilityManager::GetInstance()->NeedRefreshItem();
        return E_SUCCESS;
 }
 
@@ -441,17 +454,9 @@ _AccessibilityContainer::GetPriority(void)
 }
 
 bool
-_AccessibilityContainer::SetParent(const _AccessibilityContainer& parent)
+_AccessibilityContainer::SetParent(const _AccessibilityContainer* pParent)
 {
-       if (__pParent == null)
-       {
-               __pParent = &const_cast<_AccessibilityContainer&>(parent);
-               return true;
-       }
-       else
-       {
-               return false;
-       }
+       __pParent = const_cast<_AccessibilityContainer*>(pParent);
 }
 
 _AccessibilityContainer*
@@ -459,7 +464,16 @@ _AccessibilityContainer::GetParent(void) const
 {
        return __pParent;
 }
-
+_AccessibilityContainer*
+_AccessibilityContainer::GetRootParent(void) const
+{
+       _AccessibilityContainer* pParent = __pParent;
+       while(pParent != null && pParent->GetParent() != null)
+       {
+               pParent = pParent->GetParent();
+       }
+       return pParent;
+}
 void
 _AccessibilityContainer::SetCurrentFocusedElement(_AccessibilityElement*pElement)
 {
index 0d0de7b..8033b39 100644 (file)
@@ -29,7 +29,7 @@ _AccessibilityElementImpl::_AccessibilityElementImpl(const AccessibilityElement&
        , __pCore(null)
 {
        __pPublic = &const_cast<AccessibilityElement&>(element);
-       __pCore = new (std::nothrow) _AccessibilityElement();
+       __pCore = new (std::nothrow) _AccessibilityElement(false);
        SysTryReturn(NID_UI, __pCore, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed");
        __pCore->SetUserData(this);
 }
@@ -47,15 +47,23 @@ _AccessibilityElementImpl::~_AccessibilityElementImpl(void)
 {
        if (__pCore)
        {
-               if(__pCore->GetParent() == null)
+               if(__pCore->IsSystemElement())
                {
-                       delete __pCore;
+                       __pCore->Activate(false);
+                       __pCore->SetUserData(null);
                        __pCore = null;
                }
                else
                {
-                       __pCore->Activate(false);
-                       __pCore->SetUserData(null);
+                       _AccessibilityContainer* pContainer = __pCore->GetParent();
+                       if(pContainer != null)
+                       {
+                               pContainer->RemoveElement(*__pCore);
+                       }
+                       else
+                       {
+                               delete __pCore;
+                       }
                        __pCore = null;
                }
        }
index b63a2ea..742889b 100644 (file)
@@ -31,6 +31,7 @@
 #include <FGrpBitmap.h>
 #include <FBase_StringConverter.h>
 #include <FGrp_BitmapImpl.h>
+#include <FSys_SystemTimeImpl.h>
 #include "FUi_AccessibilityGesture.h"
 #include "FUi_AccessibilitySystemSettingLoader.h"
 #include "FUi_AccessibilityTtsPlayer.h"
@@ -54,7 +55,7 @@ using namespace Tizen::Base::Runtime;
 using namespace Tizen::Graphics;
 using namespace Tizen::Ui::Animations;
 using namespace Tizen::Ui::Controls;
-
+using namespace Tizen::System;
 namespace
 {
 class GuidePopupTimer
@@ -520,7 +521,6 @@ _AccessibilityManager::ShowPopup(const String& content)
        }
 
        pFrame = UiApp::GetInstance()->GetAppFrame()->GetFrame();
-
        if (pFrame != null)
        {
                int accesibilityVisualElementLevel = 3000;
@@ -1287,8 +1287,52 @@ _AccessibilityManager::MakeList(void)
                controlList.Add(pControl);
        }
        DownVisitor(*pControl, controlList);
-       _AccessibilityItemComparer<_Control*> controlComparer;
-       //controlList.Sort(controlComparer);
+       count = controlList.GetCount();
+       Dimension screen = _ResourceManager::GetInstance()->GetLogicalScreenSizen();
+       int margin = _ControlManager::GetInstance()->GetOrientation() == _CONTROL_ORIENTATION_PORTRAIT ? screen.width : screen.height;
+
+       for(int i = 0 ; i < count ; i++)
+       {
+               if (controlList.GetAt(i, pControl) == E_SUCCESS)
+               {
+                       FloatRectangle rect = pControl->GetAbsoluteBoundsF();
+                       if (rect.x + rect.width <= 0.0f || (rect.x) >= margin)
+                       {
+                               bool inside = false;
+                               _Control* _pControl = pControl;
+                               while(_pControl)
+                               {
+                                       if(dynamic_cast<_IScrollableContainer*>(_pControl))
+                                       {
+                                               if (rect.x + rect.width > 0.0f && (rect.x) < margin)
+                                               {
+                                                       inside = true;
+                                                       break;
+                                               }
+                                       }
+                                       _pControl = _pControl->GetParent();
+                               }
+                               if(!inside)
+                               {
+                                       _AccessibilityContainer* pContainer = pControl->GetAccessibilityContainer()->GetRootParent();
+                                       if(pContainer != null)
+                                       {
+                                               rect = pContainer->GetAbsoluteBounds();
+                                               if (rect.x + rect.width > 0.0f && (rect.x) < margin)
+                                               {
+                                                       inside = true;
+                                               }
+                                       }
+                               }
+                               if(!inside)
+                               {
+                                       controlList.Remove(pControl);
+                                       i--;
+                                       count--;
+                               }
+                       }
+               }
+       }
        for (int i = 0; i < controlList.GetCount() ; i++)
        {
                if (controlList.GetAt(i, pControl) == E_SUCCESS)
@@ -1447,10 +1491,6 @@ _AccessibilityManager::MakeList(void)
        }
 
        _AccessibilityElement* pElement = null;
-
-       Dimension screen = _ResourceManager::GetInstance()->GetLogicalScreenSizen();
-       int margin = _ControlManager::GetInstance()->GetOrientation() == _CONTROL_ORIENTATION_PORTRAIT ? screen.width : screen.height;
-
        for (int i = 0 ; i < count ; i++)
        {
                r = __candidateList.GetAt(i, pElement);
@@ -1463,13 +1503,6 @@ _AccessibilityManager::MakeList(void)
                        __candidateList.Remove(pElement);
                        __candidateList.InsertAt(pElement, 0);
                }
-               if (pElement->GetAbsoluteBounds().x + pElement->GetAbsoluteBounds().width <= 1.0
-                       || (int)(pElement->GetAbsoluteBounds().x) >= margin - 1)
-               {
-                       __candidateList.Remove(pElement);
-                       i--;
-                       count--;
-               }
        }
        return;
 }
@@ -1826,8 +1859,21 @@ _AccessibilityManager::ProcessGesture(_AccessibilityGestureType type, const Floa
                                SetGestureMode(MODE_TAP);
                                __candidateList.RemoveAll();
                        }
+                       _Control* pControl = null;
                        Point pt((int)point.x, (int)point.y);
-                       _Control* pControl = _ControlManager::GetInstance()->GetTopmostTouchedControl(pt);
+                       _TouchManager* pTouchManager = _TouchManager::GetInstance();
+                       _Control* pCapturedControl = pTouchManager->GetCapturedControl();
+                       if (pCapturedControl)
+                       {
+                               if(pCapturedControl->GetAbsoluteBounds().Contains(pt))
+                               {
+                                       pControl = pCapturedControl;
+                               }
+                       }
+                       else
+                       {
+                               pControl = _ControlManager::GetInstance()->GetTopmostTouchedControl(pt);
+                       }
                        if (pControl == null)
                        {
                                return false;
@@ -1954,13 +2000,17 @@ _AccessibilityManager::ProcessGesture(_AccessibilityGestureType type, const Floa
                                ReadContent(L"Unavailable");
                                return true;
                        }
-
                        if (__pTargetElement->GetSupportOperatingGesture())
                        {
+                               long long tick = 0;
+                               if (_SystemTimeImpl::GetTicks(tick) != E_SUCCESS)
+                               {
+                                       tick = 0;
+                               }
                                FloatRectangle rect = __pTargetElement->GetAbsoluteBounds();
                                Point _point((int)(rect.x + rect.width/2), (int)(rect.y + rect.height/2));
-                               _UiTouchEvent pressedEvent(_pControl->GetHandle(), _TouchInfo(0, _TOUCH_PRESSED, _point, false, 0));
-                               _UiTouchEvent releasedEvent(_pControl->GetHandle(), _TouchInfo(0, _TOUCH_RELEASED, _point, false, 0));
+                               _UiTouchEvent pressedEvent(_pControl->GetHandle(), _TouchInfo(0, _TOUCH_PRESSED, _point, false, tick));
+                               _UiTouchEvent releasedEvent(_pControl->GetHandle(), _TouchInfo(0, _TOUCH_RELEASED, _point, false, tick+1));
                                pressedEvent.SetAccessibilityEvent(true);
                                releasedEvent.SetAccessibilityEvent(true);
 
@@ -2066,32 +2116,42 @@ _AccessibilityManager::ProcessGesture(_AccessibilityGestureType type, const Floa
                        _Control* pControl = _ControlManager::GetInstance()->GetTopmostTouchedControl(pt);
                        if (pControl == null)
                        {
+                               SysLog(NID_UI, "Two finger panning is started. but control is null");
                                return false;
                        }
-
-                       _UiTouchEvent pressedEvent(pControl->GetHandle(), _TouchInfo(0, _TOUCH_PRESSED, pt, false, 0));
+                       long long tick = 0;
+                       if (_SystemTimeImpl::GetTicks(tick) != E_SUCCESS)
+                       {
+                               tick = 0;
+                       }
+                       _UiTouchEvent pressedEvent(pControl->GetHandle(), _TouchInfo(0, _TOUCH_PRESSED, pt, false, tick));
                        unsigned int pointId = 0;
                        pointId = _TouchManager::GetInstance()->GeneratePointId(0);
                        _UiEventManager::GetInstance()->SendEvent(pressedEvent);
                        __pPanningControl = pControl;
-                       _UiTouchEvent movedEvent(__pPanningControl->GetHandle(), _TouchInfo(0, _TOUCH_MOVED, pt, false, 0));
-                       pointId = _TouchManager::GetInstance()->GetPointId(0);
-                       _UiEventManager::GetInstance()->SendEvent(movedEvent);
                        SetGestureMode(MODE_PANNING);
-               }
+                       SysLog(NID_UI, "Two finger panning is started. x:%d, y:%d", pt.x, pt.y);
+                       }
                        break;
                case _ACCESSIBILITY_GESTURE_TYPE_TWO_FINGER_PANNING_CHANGED:
                {
                        if (__pPanningControl == null || GetGestureMode() != MODE_PANNING)
                        {
                                SetGestureMode(MODE_TAP);
+                               SysLog(NID_UI, "Two finger panning is started. but control is null");
                                return false;
                        }
+                       long long tick = 0;
+                       if (_SystemTimeImpl::GetTicks(tick) != E_SUCCESS)
+                       {
+                               tick = 0;
+                       }
                        Point pt((int)point.x, (int)point.y);
-                       _UiTouchEvent movedEvent(__pPanningControl->GetHandle(), _TouchInfo(0, _TOUCH_MOVED, pt, false, 0));
+                       _UiTouchEvent movedEvent(__pPanningControl->GetHandle(), _TouchInfo(0, _TOUCH_MOVED, pt, false, tick));
                        unsigned int pointId = 0;
                        pointId = _TouchManager::GetInstance()->GetPointId(0);
                        _UiEventManager::GetInstance()->SendEvent(movedEvent);
+                       SysLog(NID_UI, "Two finger panning is moved. x:%d, y:%d", pt.x, pt.y);
                }
                        break;
                case _ACCESSIBILITY_GESTURE_TYPE_TWO_FINGER_PANNING_FINISHED:
@@ -2099,15 +2159,22 @@ _AccessibilityManager::ProcessGesture(_AccessibilityGestureType type, const Floa
                        if (__pPanningControl == null || GetGestureMode() != MODE_PANNING)
                        {
                                SetGestureMode(MODE_TAP);
+                               SysLog(NID_UI, "Two finger panning is started. but control is null");
                                return false;
                        }
+                       long long tick = 0;
+                       if (_SystemTimeImpl::GetTicks(tick) != E_SUCCESS)
+                       {
+                               tick = 0;
+                       }
                        Point pt((int)point.x, (int)point.y);
-                       _UiTouchEvent releasedEvent(__pPanningControl->GetHandle(), _TouchInfo(0, _TOUCH_RELEASED, pt, false, 0));
+                       _UiTouchEvent releasedEvent(__pPanningControl->GetHandle(), _TouchInfo(0, _TOUCH_RELEASED, pt, false, tick));
                        unsigned int pointId = 0;
                        pointId = _TouchManager::GetInstance()->GetPointId(0);
                        _UiEventManager::GetInstance()->SendEvent(releasedEvent);
                        __pPanningControl = null;
                        SetGestureMode(MODE_TAP);
+                       SysLog(NID_UI, "Two finger panning is finished. x:%d, y:%d", pt.x, pt.y);
                }
                        break;
                default:
index 112b4c4..c73980d 100644 (file)
@@ -154,8 +154,9 @@ public:
        void ResetFocus(void);
        void SortElements(void);
 
-       bool SetParent(const _AccessibilityContainer& parent);
+       bool SetParent(const _AccessibilityContainer* pParent);
        _AccessibilityContainer* GetParent(void) const;
+       _AccessibilityContainer* GetRootParent(void) const;
        void SetPriority(int level);
        int GetPriority(void);
        void SetEnableState(bool enabledState);