DALI_TEST_CHECK(Dali::Accessibility::TestStateChangedResult("showing", 1));
DALI_TEST_CHECK(Accessibility::Bridge::GetCurrentBridge()->GetDefaultLabel(rootAccessible) != buttonAccessible);
+ Dali::Accessibility::TestEnableSC(false);
+
+ END_TEST;
+}
+
+int UtcDaliGetAcessibleTestWithSceneConnection(void)
+{
+ ToolkitTestApplication application;
+
+ Dali::Accessibility::TestEnableSC(true);
+
+ auto layer = Layer::New();
+
+ auto control = Control::New();
+
+ std::weak_ptr<Accessibility::Accessible> layerAccessible = Accessibility::Accessible::GetOwningPtr(layer); // AdaptorAccessible
+ std::weak_ptr<Accessibility::Accessible> controlAccessible = Accessibility::Accessible::GetOwningPtr(control); // ControlAccessible
+ DALI_TEST_CHECK(layerAccessible.lock());
+ DALI_TEST_CHECK(controlAccessible.lock());
+
+ // Test Getting already added accessible from the map
+ DALI_TEST_CHECK(!layerAccessible.expired());
+ DALI_TEST_CHECK(!controlAccessible.expired());
+ DALI_TEST_CHECK(Accessibility::Accessible::Get(layer) == layerAccessible.lock().get());
+ DALI_TEST_CHECK(Accessibility::Accessible::Get(control) == controlAccessible.lock().get());
+
+ // Test ControlAccessible Removal
+ control.Reset();
+ DALI_TEST_CHECK(controlAccessible.expired());
+ DALI_TEST_CHECK(Accessibility::Accessible::Get(control) == nullptr);
+
+ // Test AdaptorAccessible Removal
+ layer.Reset();
+ DALI_TEST_CHECK(layerAccessible.expired());
+ DALI_TEST_CHECK(Accessibility::Accessible::Get(layer) == nullptr);
+
+ Dali::Accessibility::TestEnableSC(false);
+
END_TEST;
}
// Core needs to be initialized next before we start the adaptor
InitializeCore();
- Accessibility::Accessible::SetObjectRegistry(mCore->GetObjectRegistry());
// This will also emit the window created signals
AdaptorImpl::GetImpl(*mAdaptor).Start(*mMainWindow);
Dali::Toolkit::DevelControl::ControlAccessible* GetControlAccessible(Dali::Toolkit::Control control)
{
- auto* controlAccessible = GetControlImplementation(control).GetAccessibleObject();
+ auto controlAccessible = GetControlImplementation(control).GetAccessibleObject();
if(DALI_UNLIKELY(!controlAccessible))
{
DALI_LOG_ERROR("Accessibility API used on Control without an Accessible");
}
- return controlAccessible;
+ return controlAccessible.get();
}
} // unnamed namespace
bool ClearAccessibilityHighlight(Toolkit::Control control)
{
- auto* controlAccessible = GetControlAccessible(control);
+ auto controlAccessible = GetControlImplementation(control).GetAccessibleObject();
if(DALI_LIKELY(controlAccessible))
{
return controlAccessible->ClearHighlight();
bool GrabAccessibilityHighlight(Toolkit::Control control)
{
- auto* controlAccessible = GetControlAccessible(control);
+ auto controlAccessible = GetControlImplementation(control).GetAccessibleObject();
if(DALI_LIKELY(controlAccessible))
{
return controlAccessible->GrabHighlight();
Dali::Accessibility::States GetAccessibilityStates(Toolkit::Control control)
{
- auto* controlAccessible = GetControlAccessible(control);
+ auto controlAccessible = GetControlImplementation(control).GetAccessibleObject();
if(DALI_LIKELY(controlAccessible))
{
return controlAccessible->GetStates();
void NotifyAccessibilityStateChange(Toolkit::Control control, Dali::Accessibility::States states, bool recurse)
{
- auto* controlAccessible = GetControlAccessible(control);
+ auto controlAccessible = GetControlImplementation(control).GetAccessibleObject();
if(DALI_LIKELY(controlAccessible))
{
controlAccessible->NotifyAccessibilityStateChange(std::move(states), recurse);
void EmitAccessibilityStateChanged(Dali::Actor actor, Accessibility::State state, int newValue)
{
- auto accessible = Accessibility::Accessible::Get(actor);
+ auto accessible = Accessibility::Accessible::GetOwningPtr(actor);
if(DALI_LIKELY(accessible))
{
auto control = Toolkit::Control::DownCast(actor);
/*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
// TODO: replace it with OnPropertySet hook once Button::Property::SELECTED will be consistently used
if((Dali::Accessibility::Accessible::GetCurrentlyHighlightedActor() == Self()) && (newState == SELECTED_STATE || newState == UNSELECTED_STATE))
{
- auto* accessible = GetAccessibleObject();
+ auto accessible = GetAccessibleObject();
if(DALI_LIKELY(accessible))
{
accessible->EmitStateChanged(Dali::Accessibility::State::CHECKED, newState == SELECTED_STATE ? 1 : 0, 0);
/*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
// TODO: replace it with OnPropertySet hook once Button::Property::SELECTED will be consistently used
if((Dali::Accessibility::Accessible::GetCurrentlyHighlightedActor() == Self()) && (newState == SELECTED_STATE || newState == UNSELECTED_STATE))
{
- auto* accessible = GetAccessibleObject();
+ auto accessible = GetAccessibleObject();
if(DALI_LIKELY(accessible))
{
accessible->EmitStateChanged(Dali::Accessibility::State::PRESSED, newState == SELECTED_STATE ? 1 : 0, 0);
// TODO: replace it with OnPropertySet hook once Button::Property::SELECTED will be consistently used
if((Dali::Accessibility::Accessible::GetCurrentlyHighlightedActor() == Self()) && (newState == SELECTED_STATE || newState == UNSELECTED_STATE))
{
- auto* accessible = GetAccessibleObject();
+ auto accessible = GetAccessibleObject();
if(DALI_LIKELY(accessible))
{
accessible->EmitStateChanged(Dali::Accessibility::State::CHECKED, newState == SELECTED_STATE ? 1 : 0, 0);
// TODO: replace it with OnPropertySet hook once Button::Property::SELECTED will be consistently used
if((Self() == Dali::Accessibility::Accessible::GetCurrentlyHighlightedActor()) && (newState == SELECTED_STATE || newState == UNSELECTED_STATE))
{
- auto* accessible = GetAccessibleObject();
+ auto accessible = GetAccessibleObject();
if(DALI_LIKELY(accessible))
{
accessible->EmitStateChanged(Dali::Accessibility::State::CHECKED, mCurrentToggleIndex ? 1 : 0, 0);
return rect.width > 0 && rect.height > 0;
}
-Dali::Accessibility::Accessible* ExternalAccessibleGetter(Dali::Actor actor)
-{
- auto control = Toolkit::Control::DownCast(actor);
- if(!control)
- {
- return nullptr;
- }
-
- auto& controlImpl = Toolkit::Internal::GetImplementation(control);
-
- return controlImpl.GetAccessibleObject();
-}
-
} // unnamed namespace
// clang-format off
mNeedToEmitResourceReady(false),
mDispatchKeyEvents(true)
{
- Dali::Accessibility::Accessible::RegisterExternalAccessibleGetter(&ExternalAccessibleGetter);
+ Accessibility::Accessible::RegisterExternalAccessibleGetter([](Dali::Actor actor) -> std::pair<std::shared_ptr<Accessibility::Accessible>, bool> {
+ auto control = Toolkit::Control::DownCast(actor);
+ if(!control)
+ {
+ return {nullptr, true};
+ }
+
+ auto& controlImpl = Toolkit::Internal::GetImplementation(control);
+ if(controlImpl.mImpl->IsCreateAccessibleEnabled())
+ {
+ return {std::shared_ptr<DevelControl::ControlAccessible>(controlImpl.CreateAccessibleObject()), true};
+ }
+
+ return {nullptr, false};
+ });
mAccessibilityProps.states[DevelControl::AccessibilityState::ENABLED] = true;
}
{
auto lastPosition = accessible->GetLastPosition();
auto accessibleRect = accessible->GetExtents(Dali::Accessibility::CoordinateType::WINDOW);
- auto rect = GetShowingGeometry(accessibleRect, accessible);
+ auto rect = GetShowingGeometry(accessibleRect, accessible.get());
switch(mAccessibilityLastScreenRelativeMoveType)
{
{
controlImpl.mImpl->mAccessibilityProps.isHidden = hidden;
- auto* accessible = controlImpl.GetAccessibleObject();
+ auto accessible = controlImpl.GetAccessibleObject();
if(DALI_LIKELY(accessible))
{
auto* parent = dynamic_cast<Dali::Accessibility::ActorAccessible*>(accessible->GetParent());
mIdleCallback = nullptr;
}
-Toolkit::DevelControl::ControlAccessible* Control::Impl::GetAccessibleObject()
+std::shared_ptr<Toolkit::DevelControl::ControlAccessible> Control::Impl::GetAccessibleObject()
{
- if(mAccessibleCreatable && !mAccessibleObject)
- {
- mAccessibleObject.reset(mControlImpl.CreateAccessibleObject());
- }
-
- return mAccessibleObject.get();
+ return std::dynamic_pointer_cast<DevelControl::ControlAccessible>(Accessibility::Accessible::GetOwningPtr(mControlImpl.Self()));
}
bool Control::Impl::IsAccessibleCreated() const
{
- return !!mAccessibleObject;
+ return !!Accessibility::Bridge::GetCurrentBridge()->GetAccessible(mControlImpl.Self());
}
void Control::Impl::EnableCreateAccessible(bool enable)
/**
* @copydoc Dali::Toolkit::Internal::Control::GetAccessibleObject()
*/
- Toolkit::DevelControl::ControlAccessible* GetAccessibleObject();
+ std::shared_ptr<Toolkit::DevelControl::ControlAccessible> GetAccessibleObject();
/**
* @copydoc Dali::Toolkit::DevelControl::IsAccessibleCreated()
bool isModal{false};
} mAccessibilityProps;
- bool mAccessibleCreatable = true;
- std::unique_ptr<Toolkit::DevelControl::ControlAccessible> mAccessibleObject;
+ bool mAccessibleCreatable = true;
// Gesture Detection
PinchGestureDetector mPinchGestureDetector;
/*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include <dali-toolkit/devel-api/controls/control-depth-index-ranges.h>
#include <dali-toolkit/devel-api/controls/control-devel.h>
#include <dali-toolkit/devel-api/focus-manager/keyinput-focus-manager.h>
-#include <dali-toolkit/devel-api/visuals/visual-actions-devel.h>
#include <dali-toolkit/devel-api/visuals/color-visual-properties-devel.h>
+#include <dali-toolkit/devel-api/visuals/visual-actions-devel.h>
#include <dali-toolkit/internal/controls/control/control-data-impl.h>
#include <dali-toolkit/internal/styling/style-manager-impl.h>
#include <dali-toolkit/internal/visuals/color/color-visual.h>
controlDataImpl.ResourceReady(relayoutRequest);
}
-Toolkit::DevelControl::ControlAccessible* Control::GetAccessibleObject()
+std::shared_ptr<Toolkit::DevelControl::ControlAccessible> Control::GetAccessibleObject()
{
return mImpl->GetAccessibleObject();
}
auto parent = accessible->GetParent();
if(parent && !accessible->GetStates()[Dali::Accessibility::State::MANAGES_DESCENDANTS])
{
- parent->EmitActiveDescendantChanged(accessible);
+ parent->EmitActiveDescendantChanged(accessible.get());
}
}
}
}
case Actor::Property::VISIBLE:
{
- auto* accessible = GetAccessibleObject();
+ auto accessible = GetAccessibleObject();
if(DALI_LIKELY(accessible))
{
accessible->EmitVisible(Self().GetProperty<bool>(Actor::Property::VISIBLE));
case DevelActor::Property::USER_INTERACTION_ENABLED:
{
const bool enabled = propertyValue.Get<bool>();
- if (!enabled && Self() == Dali::Toolkit::KeyboardFocusManager::Get().GetCurrentFocusActor())
+ if(!enabled && Self() == Dali::Toolkit::KeyboardFocusManager::Get().GetCurrentFocusActor())
{
Dali::Toolkit::KeyboardFocusManager::Get().ClearFocus();
}
mImpl->SignalDisconnected(slotObserver, callback);
}
-void Control::MakeVisualTransition(Dali::Property::Map& sourcePropertyMap, Dali::Property::Map& destinationPropertyMap,
- Dali::Toolkit::Control source, Dali::Toolkit::Control destination, Dali::Property::Index visualIndex)
+void Control::MakeVisualTransition(Dali::Property::Map& sourcePropertyMap, Dali::Property::Map& destinationPropertyMap, Dali::Toolkit::Control source, Dali::Toolkit::Control destination, Dali::Property::Index visualIndex)
{
sourcePropertyMap.Clear();
destinationPropertyMap.Clear();
sourceVisual.CreatePropertyMap(sourceMap);
destinationVisual.CreatePropertyMap(destinationMap);
- static auto findValueVector4 = [](const Property::Map& map, Property::Index index, const Vector4& defaultValue = Vector4()) -> Vector4
- {
+ static auto findValueVector4 = [](const Property::Map& map, Property::Index index, const Vector4& defaultValue = Vector4()) -> Vector4 {
Property::Value* propertyValue = map.Find(index);
if(propertyValue)
{
return defaultValue;
};
- static auto findValueFloat = [](const Property::Map& map, Property::Index index, const float& defaultValue = 0.0f) -> float
- {
+ static auto findValueFloat = [](const Property::Map& map, Property::Index index, const float& defaultValue = 0.0f) -> float {
Property::Value* propertyValue = map.Find(index);
if(propertyValue)
{
#define DALI_TOOLKIT_CONTROL_IMPL_H
/*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
namespace Internal
{
-
/**
* @brief This is the internal base class for all controls.
*
*
* @see CreateAccessibleObject()
*/
- Toolkit::DevelControl::ControlAccessible* GetAccessibleObject();
+ std::shared_ptr<Toolkit::DevelControl::ControlAccessible> GetAccessibleObject();
// Gesture Detection
DALI_INTERNAL void KeyboardEnter();
/// @endcond
-
// Signals
/**
void OnLayoutNegotiated(float size, Dimension::Type dimension) override;
public: // Helpers for deriving classes
-
/**
* @brief Flags for the constructor.
* @SINCE_1_0.0
* @param[in] destination Destination control of the animation.
* @param[in] visualIndex Property::Index to make animation.
*/
- void MakeVisualTransition(Dali::Property::Map& sourcePropertyMap, Dali::Property::Map& destinationPropertyMap,
- Dali::Toolkit::Control source, Dali::Toolkit::Control destination, Dali::Property::Index visualIndex);
+ void MakeVisualTransition(Dali::Property::Map& sourcePropertyMap, Dali::Property::Map& destinationPropertyMap, Dali::Toolkit::Control source, Dali::Toolkit::Control destination, Dali::Property::Index visualIndex);
/**
* @brief Retrieves source and destination visual properties for the Transition of this Control.