Modified ImfManager to include virtual keyboard APIs
[platform/core/uifw/dali-adaptor.git] / adaptors / ecore / common / ecore-virtual-keyboard.cpp
1 /*
2  * Copyright (c) 2015 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 #include "virtual-keyboard-impl.h"
20
21 // EXTERNAL INCLUDES
22 #include <algorithm>
23
24 #include <dali/integration-api/debug.h>
25
26 // INTERNAL INCLUDES
27 #include "ecore-virtual-keyboard.h"
28 #include <adaptor.h>
29 #include <locale-utils.h>
30 #include <imf-manager-impl.h>
31
32 namespace Dali
33 {
34
35 namespace Internal
36 {
37
38 namespace Adaptor
39 {
40
41 namespace VirtualKeyboard
42 {
43
44 namespace
45 {
46 #if defined(DEBUG_ENABLED)
47 Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_VIRTUAL_KEYBOARD");
48 #endif
49
50 #define TOKEN_STRING(x) #x
51
52 //forward declarations
53 void InputPanelGeometryChangedCallback ( void *data, Ecore_IMF_Context *context, int value );
54 void InputPanelLanguageChangeCallback( void* data, Ecore_IMF_Context* context, int value );
55
56 // Signals
57 Dali::VirtualKeyboard::StatusSignalType gKeyboardStatusSignal;
58 Dali::VirtualKeyboard::VoidSignalType   gKeyboardResizeSignal;
59 Dali::VirtualKeyboard::VoidSignalType   gKeyboardLanguageChangedSignal;
60
61 void InputPanelStateChangeCallback( void* data, Ecore_IMF_Context* context, int value )
62 {
63   switch (value)
64   {
65     case ECORE_IMF_INPUT_PANEL_STATE_SHOW:
66     {
67       DALI_LOG_INFO( gLogFilter, Debug::General, "VKB ECORE_IMF_INPUT_PANEL_STATE_SHOW\n" );
68
69       gKeyboardStatusSignal.Emit( true );
70
71       break;
72     }
73
74     case ECORE_IMF_INPUT_PANEL_STATE_HIDE:
75     {
76       DALI_LOG_INFO( gLogFilter, Debug::General, "VKB ECORE_IMF_INPUT_PANEL_STATE_HIDE\n" );
77
78       gKeyboardStatusSignal.Emit( false );
79
80       break;
81     }
82
83     case ECORE_IMF_INPUT_PANEL_STATE_WILL_SHOW:
84     default:
85     {
86       // Do nothing
87       break;
88     }
89   }
90 }
91
92 void InputPanelLanguageChangeCallback( void* data, Ecore_IMF_Context* context, int value )
93 {
94   DALI_LOG_INFO( gLogFilter, Debug::General, "VKB InputPanelLanguageChangeCallback\n" );
95
96   // Emit the signal that the language has changed
97   gKeyboardLanguageChangedSignal.Emit();
98 }
99
100 void InputPanelGeometryChangedCallback ( void *data, Ecore_IMF_Context *context, int value )
101 {
102   DALI_LOG_INFO( gLogFilter, Debug::General, "VKB InputPanelGeometryChangedCallback\n" );
103
104   // Emit signal that the keyboard is resized
105   gKeyboardResizeSignal.Emit();
106 }
107
108 } // unnamed namespace
109
110 void ConnectCallbacks( Ecore_IMF_Context *imfContext )
111 {
112   if( imfContext )
113   {
114     DALI_LOG_INFO( gLogFilter, Debug::General, "VKB ConnectPanelCallbacks\n" );
115
116     ecore_imf_context_input_panel_event_callback_add( imfContext, ECORE_IMF_INPUT_PANEL_STATE_EVENT,    InputPanelStateChangeCallback,     NULL );
117     ecore_imf_context_input_panel_event_callback_add( imfContext, ECORE_IMF_INPUT_PANEL_LANGUAGE_EVENT, InputPanelLanguageChangeCallback,  NULL );
118     ecore_imf_context_input_panel_event_callback_add( imfContext, ECORE_IMF_INPUT_PANEL_GEOMETRY_EVENT, InputPanelGeometryChangedCallback, NULL );
119   }
120 }
121
122 void DisconnectCallbacks( Ecore_IMF_Context *imfContext )
123 {
124   if( imfContext )
125   {
126     DALI_LOG_INFO( gLogFilter, Debug::General, "VKB DisconnectPanelCallbacks\n" );
127
128     ecore_imf_context_input_panel_event_callback_del( imfContext, ECORE_IMF_INPUT_PANEL_STATE_EVENT,    InputPanelStateChangeCallback     );
129     ecore_imf_context_input_panel_event_callback_del( imfContext, ECORE_IMF_INPUT_PANEL_LANGUAGE_EVENT, InputPanelLanguageChangeCallback  );
130     ecore_imf_context_input_panel_event_callback_del( imfContext, ECORE_IMF_INPUT_PANEL_GEOMETRY_EVENT, InputPanelGeometryChangedCallback );
131   }
132 }
133
134 void Show()
135 {
136   DALI_LOG_WARNING_NOFN("DEPRECATION WARNING: Show() is deprecated and will be removed from next release. Use ImfManager.Activate() instead.\n" );
137
138   Dali::ImfManager imfManager = ImfManager::Get(); // Create ImfManager instance (if required) to show the keyboard
139
140   if( imfManager )
141   {
142     Ecore_IMF_Context* imfContext = ImfManager::GetImplementation( imfManager ).GetContext();
143
144     if( imfContext )
145     {
146       ecore_imf_context_input_panel_show( imfContext );
147     }
148   }
149 }
150
151 void Hide()
152 {
153   DALI_LOG_WARNING_NOFN("DEPRECATION WARNING: Hide() is deprecated and will be removed from next release. Use ImfManager.Deactivate() instead.\n" );
154
155   if( ImfManager::IsAvailable() /* We do not want to create an ImfManager instance*/ )
156   {
157     Dali::ImfManager imfManager = ImfManager::Get();
158     Ecore_IMF_Context* imfContext = ImfManager::GetImplementation( imfManager ).GetContext();
159
160     if( imfContext )
161     {
162       ecore_imf_context_input_panel_hide( imfContext );
163     }
164   }
165 }
166
167 bool IsVisible()
168 {
169   DALI_LOG_WARNING_NOFN("DEPRECATION WARNING: IsVisible() is deprecated and will be removed from next release.\n" );
170
171   if( ImfManager::IsAvailable() /* We do not want to create an ImfManager instance */ )
172   {
173     DALI_LOG_INFO( gLogFilter, Debug::General, "IMF IsVisible\n" );
174
175     Dali::ImfManager imfManager = ImfManager::Get();
176     Ecore_IMF_Context* imfContext = ImfManager::GetImplementation( imfManager ).GetContext();
177
178     if ( imfContext )
179     {
180       if (ecore_imf_context_input_panel_state_get(imfContext) == ECORE_IMF_INPUT_PANEL_STATE_SHOW ||
181           ecore_imf_context_input_panel_state_get(imfContext) == ECORE_IMF_INPUT_PANEL_STATE_WILL_SHOW)
182       {
183         return true;
184       }
185     }
186   }
187
188   return false;
189 }
190
191 void ApplySettings( const Property::Map& settingsMap )
192 {
193   using namespace InputMethod; // Allows exclusion of namespace in TOKEN_STRING.
194
195   for ( unsigned int i = 0, count = settingsMap.Count(); i < count; ++i )
196   {
197     Property::Key key = settingsMap.GetKeyAt( i );
198     if( key.type == Property::Key::INDEX )
199     {
200       continue;
201     }
202
203     Property::Value item = settingsMap.GetValue(i);
204
205     if ( key == TOKEN_STRING( ACTION_BUTTON ) )
206     {
207       if ( item.GetType() == Property::INTEGER )
208       {
209         int value = item.Get< int >();
210         VirtualKeyboard::SetReturnKeyType( static_cast<InputMethod::ActionButton>(value) );
211       }
212     }
213     else
214     {
215       DALI_LOG_INFO( gLogFilter, Debug::General, "Provided Settings Key not supported\n" );
216     }
217   }
218 }
219
220 void EnablePrediction(const bool enable)
221 {
222   Dali::ImfManager imfManager = ImfManager::Get(); // Create ImfManager instance (if required) when enabling prediction
223
224   if( imfManager )
225   {
226     Ecore_IMF_Context* imfContext = ImfManager::GetImplementation( imfManager ).GetContext();
227
228     if ( imfContext )
229     {
230       ecore_imf_context_prediction_allow_set( imfContext, (enable)? EINA_TRUE : EINA_FALSE);
231     }
232   }
233 }
234
235 bool IsPredictionEnabled()
236 {
237   if ( ImfManager::IsAvailable() /* We do not want to create an instance of ImfManger */ )
238   {
239     Dali::ImfManager imfManager = ImfManager::Get();
240     Ecore_IMF_Context* imfContext = ImfManager::GetImplementation( imfManager ).GetContext();
241
242     if ( imfContext )
243     {
244       // predictive text is enabled.
245       if ( ecore_imf_context_input_panel_enabled_get( imfContext ) == EINA_TRUE )
246       {
247         return true;
248       }
249     }
250   }
251
252   return false;
253 }
254
255 Rect<int> GetSizeAndPosition()
256 {
257   int xPos, yPos, width, height;
258
259   DALI_LOG_WARNING_NOFN("DEPRECATION WARNING: GetSizeAndPosition() is deprecated and will be removed from next release. Use ImfManager.GetInputMethodArea() instead.\n" );
260
261   width = height = xPos = yPos = 0;
262   Dali::ImfManager imfManager = ImfManager::Get(); // Create ImfManager instance (if required) as we may need to do some size related setup in the application
263
264   if( imfManager )
265   {
266     Ecore_IMF_Context* imfContext = ImfManager::GetImplementation( imfManager ).GetContext();
267
268     if( imfContext )
269     {
270       ecore_imf_context_input_panel_geometry_get(imfContext, &xPos, &yPos, &width, &height);
271     }
272     else
273     {
274       DALI_LOG_WARNING("VKB Unable to get IMF Context so GetSize unavailable\n");
275     // return 0 as real size unknown.
276     }
277   }
278
279   return Rect<int>(xPos,yPos,width,height);
280 }
281
282 Dali::VirtualKeyboard::StatusSignalType& StatusChangedSignal()
283 {
284   DALI_LOG_WARNING_NOFN("DEPRECATION WARNING: StatusChangedSignal() is deprecated and will be removed from next release. Use ImfManager.StatusChangedSignal() instead.\n" );
285
286   Dali::ImfManager imfManager = ImfManager::Get();
287   return imfManager.StatusChangedSignal();
288 }
289
290 Dali::VirtualKeyboard::VoidSignalType& ResizedSignal()
291 {
292   DALI_LOG_WARNING_NOFN("DEPRECATION WARNING: ResizedSignal() is deprecated and will be removed from next release. Use ImfManager.ResizedSignal() instead.\n" );
293
294   Dali::ImfManager imfManager = ImfManager::Get();
295   return imfManager.ResizedSignal();
296 }
297
298 Dali::VirtualKeyboard::VoidSignalType& LanguageChangedSignal()
299 {
300   DALI_LOG_WARNING_NOFN("DEPRECATION WARNING: LanguageChangedSignal() is deprecated and will be removed from next release. Use ImfManager.LanguageChangedSignal() instead.\n" );
301
302   Dali::ImfManager imfManager = ImfManager::Get();
303   return imfManager.LanguageChangedSignal();
304 }
305
306 Dali::VirtualKeyboard::TextDirection GetTextDirection()
307 {
308   Dali::VirtualKeyboard::TextDirection direction ( Dali::VirtualKeyboard::LeftToRight );
309
310   if ( ImfManager::IsAvailable() /* We do not want to create an instance of ImfManager */ )
311   {
312     Dali::ImfManager imfManager = ImfManager::Get();
313
314     if ( imfManager )
315     {
316       Ecore_IMF_Context* imfContext = ImfManager::GetImplementation( imfManager ).GetContext();
317
318       if ( imfContext )
319       {
320         char* locale( NULL );
321         ecore_imf_context_input_panel_language_locale_get( imfContext, &locale );
322
323         if ( locale )
324         {
325           direction = (Dali::VirtualKeyboard::TextDirection)Locale::GetTextDirection( std::string( locale ) );
326           free( locale );
327         }
328       }
329     }
330   }
331   return direction;
332 }
333
334 } // namespace VirtualKeyboard
335
336 } // namespace Adaptor
337
338 } // namespace Internal
339
340 } // namespace Dali