2 * Copyright (c) 2023 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.
21 #include <dali/devel-api/adaptor-framework/accessibility-bridge.h>
22 #include <dali/devel-api/atspi-interfaces/accessible.h>
23 #include <dali/devel-api/atspi-interfaces/socket.h>
24 #include <dali/internal/accessibility/bridge/accessibility-common.h>
26 using namespace Dali::Accessibility;
28 Accessible::Accessible()
32 Accessible::~Accessible() noexcept
34 auto handle = mBridgeData.lock();
37 handle->mKnownObjects.erase(this);
41 void Accessible::EmitActiveDescendantChanged(Accessible* child)
43 if(auto bridgeData = GetBridgeData())
45 bridgeData->mBridge->EmitActiveDescendantChanged(this, child);
49 void Accessible::EmitStateChanged(State state, int newValue, int reserved)
51 if(auto bridgeData = GetBridgeData())
53 bridgeData->mBridge->EmitStateChanged(this, state, newValue, reserved);
57 void Accessible::EmitShowing(bool isShowing)
59 if(auto bridgeData = GetBridgeData())
61 bridgeData->mBridge->EmitStateChanged(this, State::SHOWING, isShowing ? 1 : 0, 0);
65 void Accessible::EmitVisible(bool isVisible)
67 if(auto bridgeData = GetBridgeData())
69 bridgeData->mBridge->EmitStateChanged(this, State::VISIBLE, isVisible ? 1 : 0, 0);
73 void Accessible::EmitHighlighted(bool isHighlighted)
75 if(auto bridgeData = GetBridgeData())
77 bridgeData->mBridge->EmitStateChanged(this, State::HIGHLIGHTED, isHighlighted ? 1 : 0, 0);
81 void Accessible::EmitFocused(bool isFocused)
83 if(auto bridgeData = GetBridgeData())
85 bridgeData->mBridge->EmitStateChanged(this, State::FOCUSED, isFocused ? 1 : 0, 0);
88 void Accessible::EmitTextInserted(unsigned int position, unsigned int length, const std::string& content)
90 if(auto bridgeData = GetBridgeData())
92 bridgeData->mBridge->EmitTextChanged(this, TextChangedState::INSERTED, position, length, content);
95 void Accessible::EmitTextDeleted(unsigned int position, unsigned int length, const std::string& content)
97 if(auto bridgeData = GetBridgeData())
99 bridgeData->mBridge->EmitTextChanged(this, TextChangedState::DELETED, position, length, content);
102 void Accessible::EmitTextCursorMoved(unsigned int cursorPosition)
104 if(auto bridgeData = GetBridgeData())
106 bridgeData->mBridge->EmitCursorMoved(this, cursorPosition);
110 void Accessible::EmitMovedOutOfScreen(ScreenRelativeMoveType type)
112 if(auto bridgeData = GetBridgeData())
114 bridgeData->mBridge->EmitMovedOutOfScreen(this, type);
118 void Accessible::EmitSocketAvailable()
120 DALI_ASSERT_DEBUG(Socket::DownCast(this));
122 if(auto bridgeData = GetBridgeData())
124 bridgeData->mBridge->EmitSocketAvailable(this);
128 void Accessible::EmitScrollStarted()
130 if(auto bridgeData = GetBridgeData())
132 bridgeData->mBridge->EmitScrollStarted(this);
136 void Accessible::EmitScrollFinished()
138 if(auto bridgeData = GetBridgeData())
140 bridgeData->mBridge->EmitScrollFinished(this);
144 void Accessible::Emit(WindowEvent event, unsigned int detail)
146 if(auto bridgeData = GetBridgeData())
148 bridgeData->mBridge->Emit(this, event, detail);
151 void Accessible::Emit(ObjectPropertyChangeEvent event)
153 if(auto bridgeData = GetBridgeData())
155 bridgeData->mBridge->Emit(this, event);
159 void Accessible::EmitBoundsChanged(Rect<> rect)
161 if(auto bridgeData = GetBridgeData())
163 bridgeData->mBridge->EmitBoundsChanged(this, rect);
167 std::shared_ptr<Bridge::Data> Accessible::GetBridgeData() const
169 auto handle = mBridgeData.lock();
172 auto bridge = Bridge::GetCurrentBridge();
173 handle = bridge->mData;
178 Address Accessible::GetAddress() const
180 auto handle = mBridgeData.lock();
183 handle = GetBridgeData();
186 handle->mBridge->RegisterOnBridge(this);
189 std::ostringstream tmp;
191 return {handle ? handle->mBusName : "", tmp.str()};
194 void Bridge::RegisterOnBridge(const Accessible* object)
196 assert(!object->mBridgeData.lock() || object->mBridgeData.lock() == mData);
197 if(!object->mBridgeData.lock())
200 mData->mKnownObjects.insert(object);
201 object->mBridgeData = mData;
205 bool Accessible::IsHidden() const
210 void Accessible::SetListenPostRender(bool enabled)
214 bool Accessible::IsProxy() const
219 void Accessible::NotifyAccessibilityStateChange(Dali::Accessibility::States states, bool isRecursive)
221 if(auto data = GetBridgeData())
223 for(auto i = 0u; i < static_cast<unsigned int>(Dali::Accessibility::State::MAX_COUNT); i++)
225 auto index = static_cast<Dali::Accessibility::State>(i);
228 data->mBridge->EmitStateChanged(this, index, GetStates()[index], 0);
234 auto children = GetChildren();
235 for(auto iter : children)
237 iter->NotifyAccessibilityStateChange(states, isRecursive);