[ATSPI] Introduce SetListenPostRender interface
[platform/core/uifw/dali-adaptor.git] / dali / internal / accessibility / bridge / accessible.cpp
1 /*
2  * Copyright (c) 2023 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 // CLASS HEADER
19
20 //INTERNAL INCLUDES
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>
25
26 using namespace Dali::Accessibility;
27
28 Accessible::Accessible()
29 {
30 }
31
32 Accessible::~Accessible() noexcept
33 {
34   auto handle = mBridgeData.lock();
35   if(handle)
36   {
37     handle->mKnownObjects.erase(this);
38   }
39 }
40
41 void Accessible::EmitActiveDescendantChanged(Accessible* child)
42 {
43   if(auto bridgeData = GetBridgeData())
44   {
45     bridgeData->mBridge->EmitActiveDescendantChanged(this, child);
46   }
47 }
48
49 void Accessible::EmitStateChanged(State state, int newValue, int reserved)
50 {
51   if(auto bridgeData = GetBridgeData())
52   {
53     bridgeData->mBridge->EmitStateChanged(this, state, newValue, reserved);
54   }
55 }
56
57 void Accessible::EmitShowing(bool isShowing)
58 {
59   if(auto bridgeData = GetBridgeData())
60   {
61     bridgeData->mBridge->EmitStateChanged(this, State::SHOWING, isShowing ? 1 : 0, 0);
62   }
63 }
64
65 void Accessible::EmitVisible(bool isVisible)
66 {
67   if(auto bridgeData = GetBridgeData())
68   {
69     bridgeData->mBridge->EmitStateChanged(this, State::VISIBLE, isVisible ? 1 : 0, 0);
70   }
71 }
72
73 void Accessible::EmitHighlighted(bool isHighlighted)
74 {
75   if(auto bridgeData = GetBridgeData())
76   {
77     bridgeData->mBridge->EmitStateChanged(this, State::HIGHLIGHTED, isHighlighted ? 1 : 0, 0);
78   }
79 }
80
81 void Accessible::EmitFocused(bool isFocused)
82 {
83   if(auto bridgeData = GetBridgeData())
84   {
85     bridgeData->mBridge->EmitStateChanged(this, State::FOCUSED, isFocused ? 1 : 0, 0);
86   }
87 }
88 void Accessible::EmitTextInserted(unsigned int position, unsigned int length, const std::string& content)
89 {
90   if(auto bridgeData = GetBridgeData())
91   {
92     bridgeData->mBridge->EmitTextChanged(this, TextChangedState::INSERTED, position, length, content);
93   }
94 }
95 void Accessible::EmitTextDeleted(unsigned int position, unsigned int length, const std::string& content)
96 {
97   if(auto bridgeData = GetBridgeData())
98   {
99     bridgeData->mBridge->EmitTextChanged(this, TextChangedState::DELETED, position, length, content);
100   }
101 }
102 void Accessible::EmitTextCursorMoved(unsigned int cursorPosition)
103 {
104   if(auto bridgeData = GetBridgeData())
105   {
106     bridgeData->mBridge->EmitCursorMoved(this, cursorPosition);
107   }
108 }
109
110 void Accessible::EmitMovedOutOfScreen(ScreenRelativeMoveType type)
111 {
112   if(auto bridgeData = GetBridgeData())
113   {
114     bridgeData->mBridge->EmitMovedOutOfScreen(this, type);
115   }
116 }
117
118 void Accessible::EmitSocketAvailable()
119 {
120   DALI_ASSERT_DEBUG(Socket::DownCast(this));
121
122   if(auto bridgeData = GetBridgeData())
123   {
124     bridgeData->mBridge->EmitSocketAvailable(this);
125   }
126 }
127
128 void Accessible::Emit(WindowEvent event, unsigned int detail)
129 {
130   if(auto bridgeData = GetBridgeData())
131   {
132     bridgeData->mBridge->Emit(this, event, detail);
133   }
134 }
135 void Accessible::Emit(ObjectPropertyChangeEvent event)
136 {
137   if(auto bridgeData = GetBridgeData())
138   {
139     bridgeData->mBridge->Emit(this, event);
140   }
141 }
142
143 void Accessible::EmitBoundsChanged(Rect<> rect)
144 {
145   if(auto bridgeData = GetBridgeData())
146   {
147     bridgeData->mBridge->EmitBoundsChanged(this, rect);
148   }
149 }
150
151 std::shared_ptr<Bridge::Data> Accessible::GetBridgeData() const
152 {
153   auto handle = mBridgeData.lock();
154   if(!handle)
155   {
156     auto bridge = Bridge::GetCurrentBridge();
157     handle      = bridge->mData;
158   }
159   return handle;
160 }
161
162 Address Accessible::GetAddress() const
163 {
164   auto handle = mBridgeData.lock();
165   if(!handle)
166   {
167     handle = GetBridgeData();
168     if(handle)
169     {
170       handle->mBridge->RegisterOnBridge(this);
171     }
172   }
173   std::ostringstream tmp;
174   tmp << this;
175   return {handle ? handle->mBusName : "", tmp.str()};
176 }
177
178 void Bridge::RegisterOnBridge(const Accessible* object)
179 {
180   assert(!object->mBridgeData.lock() || object->mBridgeData.lock() == mData);
181   if(!object->mBridgeData.lock())
182   {
183     assert(mData);
184     mData->mKnownObjects.insert(object);
185     object->mBridgeData = mData;
186   }
187 }
188
189 bool Accessible::IsHidden() const
190 {
191   return false;
192 }
193
194 void Accessible::SetListenPostRender(bool enabled)
195 {
196 }
197
198 bool Accessible::IsProxy() const
199 {
200   return false;
201 }
202
203 void Accessible::NotifyAccessibilityStateChange(Dali::Accessibility::States states, bool isRecursive)
204 {
205   if(auto data = GetBridgeData())
206   {
207     for(auto i = 0u; i < static_cast<unsigned int>(Dali::Accessibility::State::MAX_COUNT); i++)
208     {
209       auto index = static_cast<Dali::Accessibility::State>(i);
210       if(states[index])
211       {
212         data->mBridge->EmitStateChanged(this, index, GetStates()[index], 0);
213       }
214     }
215
216     if(isRecursive)
217     {
218       auto children = GetChildren();
219       for(auto iter : children)
220       {
221         iter->NotifyAccessibilityStateChange(states, isRecursive);
222       }
223     }
224   }
225 }