[ATSPI] Add ScrollStarted/ScrollFinished interface
[platform/core/uifw/dali-adaptor.git] / dali / internal / accessibility / bridge / accessible.cpp
1 /*
2  * Copyright (c) 2022 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::EmitScrollStarted()
129 {
130   if(auto bridgeData = GetBridgeData())
131   {
132     bridgeData->mBridge->EmitScrollStarted(this);
133   }
134 }
135
136 void Accessible::EmitScrollFinished()
137 {
138   if(auto bridgeData = GetBridgeData())
139   {
140     bridgeData->mBridge->EmitScrollFinished(this);
141   }
142 }
143
144 void Accessible::Emit(WindowEvent event, unsigned int detail)
145 {
146   if(auto bridgeData = GetBridgeData())
147   {
148     bridgeData->mBridge->Emit(this, event, detail);
149   }
150 }
151 void Accessible::Emit(ObjectPropertyChangeEvent event)
152 {
153   if(auto bridgeData = GetBridgeData())
154   {
155     bridgeData->mBridge->Emit(this, event);
156   }
157 }
158
159 void Accessible::EmitBoundsChanged(Rect<> rect)
160 {
161   if(auto bridgeData = GetBridgeData())
162   {
163     bridgeData->mBridge->EmitBoundsChanged(this, rect);
164   }
165 }
166
167 std::shared_ptr<Bridge::Data> Accessible::GetBridgeData() const
168 {
169   auto handle = mBridgeData.lock();
170   if(!handle)
171   {
172     auto bridge = Bridge::GetCurrentBridge();
173     handle      = bridge->mData;
174   }
175   return handle;
176 }
177
178 Address Accessible::GetAddress() const
179 {
180   auto handle = mBridgeData.lock();
181   if(!handle)
182   {
183     handle = GetBridgeData();
184     if(handle)
185     {
186       handle->mBridge->RegisterOnBridge(this);
187     }
188   }
189   std::ostringstream tmp;
190   tmp << this;
191   return {handle ? handle->mBusName : "", tmp.str()};
192 }
193
194 void Bridge::RegisterOnBridge(const Accessible* object)
195 {
196   assert(!object->mBridgeData.lock() || object->mBridgeData.lock() == mData);
197   if(!object->mBridgeData.lock())
198   {
199     assert(mData);
200     mData->mKnownObjects.insert(object);
201     object->mBridgeData = mData;
202   }
203 }
204
205 bool Accessible::IsHidden() const
206 {
207   return false;
208 }
209
210 bool Accessible::IsProxy() const
211 {
212   return false;
213 }
214
215 void Accessible::NotifyAccessibilityStateChange(Dali::Accessibility::States states, bool isRecursive)
216 {
217   if(auto data = GetBridgeData())
218   {
219     for(auto i = 0u; i < static_cast<unsigned int>(Dali::Accessibility::State::MAX_COUNT); i++)
220     {
221       auto index = static_cast<Dali::Accessibility::State>(i);
222       if(states[index])
223       {
224         data->mBridge->EmitStateChanged(this, index, GetStates()[index], 0);
225       }
226     }
227
228     if(isRecursive)
229     {
230       auto children = GetChildren();
231       for(auto iter : children)
232       {
233         iter->NotifyAccessibilityStateChange(states, isRecursive);
234       }
235     }
236   }
237 }