Tizen 2.1 base
[apps/core/preloaded/sat-ui.git] / src / get-inkey-view.c
1 /*
2  * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Flora License, Version 1.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://floralicense.org/license/
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 #include <stdio.h>
18 #include "stdlib.h"
19 #include <string.h>
20 #include <appcore-efl.h>
21 #include <TelSat.h>
22 #include <Elementary.h>
23 #include <Ecore.h>
24 #include <Ecore_IMF.h>
25 #include "sat-ui-debug.h"
26 #include "get-inkey-view.h"
27 #include "sat-ui.h"
28 #include "setup-menu-view.h"
29 #include "sat-ui-icon.h"
30 #include "tel-request.h"
31 #include "winset.h"
32 #include "common_string.h"
33 #include <libintl.h>
34
35
36 static Elm_Entry_Filter_Accept_Set digits_filter_data;
37 static Elm_Entry_Filter_Limit_Size limit_filter_data;
38 static TelSatGetInkeyInd_t get_inkey_info;
39
40 Evas_Object * _create_conformant( Evas_Object *parent , SatUiAppData_t *ad);
41
42 /* This callback is for showing(hiding) X marked button. */
43 static void _changed_cb(void *data, Evas_Object *obj, void *event_info)
44 {
45         if (elm_object_focus_get(data)) {
46                 if (elm_entry_is_empty(obj))
47                         elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
48                 else
49                         elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
50         }
51 }
52
53 /* Focused callback will show X marked button and hide guidetext. */
54 static void _focused_cb(void *data, Evas_Object *obj, void *event_info)
55 {
56         if (!elm_entry_is_empty(obj))
57                 elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
58         elm_object_signal_emit(data, "elm,state,guidetext,hide", "elm");
59 }
60
61 /* Unfocused callback will show guidetext and hide X marked button. */
62 static void _unfocused_cb(void *data, Evas_Object *obj, void *event_info)
63 {
64         if (elm_entry_is_empty(obj))
65                 elm_object_signal_emit(data, "elm,state,guidetext,show", "elm");
66         elm_object_signal_emit(data, "elm,state,eraser,hide", "elm");
67 }
68
69 /* When X marked button clicked, make string as empty. */
70 static void _eraser_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
71 {
72         elm_entry_entry_set(data, "");
73 }
74
75 static void on_clicked_ok_btn(void *data, Evas_Object *obj, void *event_info)
76 {
77         char *entry_string = NULL;
78         SatUiAppData_t *ad = (SatUiAppData_t *)data;
79         Evas_Object *waiting_bar;
80
81         if (ad->timer)
82                 ecore_timer_del(ad->timer);
83         ad->timer= NULL;
84
85         ret_if(NULL == ad->entry);
86
87         entry_string = (char *)elm_entry_entry_get(ad->entry);
88
89         ret_if(NULL == entry_string);
90         ret_if(0 == strlen(entry_string));
91
92         DBG(" %s", entry_string);
93
94         if (ad->entry) {
95                 elm_object_focus_set(ad->entry, EINA_FALSE);
96                 elm_object_focus_allow_set(ad->entry, EINA_FALSE);
97         }
98
99         send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INKEY,TAPI_SAT_USER_CONFIRM_YES, sizeof(unsigned char),(unsigned char*)entry_string, ad);
100         waiting_bar = create_waiting_notify(ad->content);
101         ad->waiting_bar = waiting_bar;
102         if (ad->timer) {
103                 ecore_timer_del(ad->timer);
104                 ad->timer = NULL;
105         }
106 }
107
108 static void on_clicked_yes_btn(void *data, Evas_Object *obj, void *event_info)
109 {
110         SatUiAppData_t *ad = (SatUiAppData_t *)data;
111         Evas_Object *waiting_bar;
112
113         if (ad->timer)
114                 ecore_timer_del(ad->timer);
115
116         ad->timer = NULL;
117         send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INKEY, TAPI_SAT_USER_CONFIRM_YES, 0, NULL, ad);
118         waiting_bar = create_waiting_notify(ad->content);
119         ad->waiting_bar = waiting_bar;
120         if (ad->timer) {
121                 ecore_timer_del(ad->timer);
122                 ad->timer = NULL;
123         }
124 }
125
126 static void on_clicked_no_btn(void *data, Evas_Object *obj, void *event_info)
127 {
128         SatUiAppData_t *ad = (SatUiAppData_t *)data;
129         Evas_Object *waiting_bar;
130
131         if (ad->timer)
132                 ecore_timer_del(ad->timer);
133         ad->timer = NULL;
134         send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INKEY, TAPI_SAT_USER_CONFIRM_NO_OR_CANCEL, 0, NULL, ad);
135
136         waiting_bar = create_waiting_notify(ad->content);
137         ad->waiting_bar = waiting_bar;
138         if (ad->timer) {
139                 ecore_timer_del(ad->timer);
140                 ad->timer = NULL;
141         }
142 }
143
144 static void on_clicked_back_btn( void *data, Evas_Object* obj, void* event_info )
145 {
146         SatUiAppData_t *ad = (SatUiAppData_t *)data;
147
148         if (ad->timer)
149                 ecore_timer_del(ad->timer);
150         ad->timer = NULL;
151
152         if (ad->entry) {
153                 elm_object_focus_set(ad->entry, EINA_FALSE);
154                 elm_object_focus_allow_set(ad->entry, EINA_FALSE);
155         }
156         send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INKEY, TAPI_SAT_USER_CONFIRM_NO_OR_CANCEL, 0, NULL, ad);
157 }
158
159 static Eina_Bool on_timer_expired(void *data)
160 {
161         SatUiAppData_t *ad = (SatUiAppData_t *)data;
162
163         if (NULL == ad->timer)  {
164                 DBG("Cancel timout w/o user_confirm");
165         } else {
166                 send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INKEY, TAPI_SAT_USER_CONFIRM_TIMEOUT, 0, NULL, ad);
167                 ad->timer = NULL;
168         }
169         return ECORE_CALLBACK_CANCEL;
170 }
171
172 static void on_clicked_help_button(void *data, Evas_Object *obj, void *event_info)
173 {
174         Evas_Object *waiting_bar;
175         SatUiAppData_t *ad = (SatUiAppData_t *)data;
176
177         if (ad->timer)
178                 ecore_timer_del(ad->timer);
179         ad->timer = NULL;
180
181         if (ad->entry) {
182                 elm_object_focus_set(ad->entry, EINA_FALSE);
183                 elm_object_focus_allow_set(ad->entry, EINA_FALSE);
184         }
185
186         send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INKEY, TAPI_SAT_USER_CONFIRM_HELP_INFO, 0, NULL, ad);
187
188         waiting_bar = create_waiting_notify(ad->content);
189         ad->waiting_bar = waiting_bar;
190         if (ad->timer) {
191                 ecore_timer_del(ad->timer);
192                 ad->timer = NULL;
193         }
194 }
195
196 void _inkey_panel_event_callback(void *data, Ecore_IMF_Context *imf_context, int value)
197 {
198         int x, y, w, h;
199         if (value == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
200                 // ISE state has changed to ISE_STATE_SHOW status
201                 // Get ISE position of current active ISE
202                 ecore_imf_context_input_panel_geometry_get(imf_context, &x, &y, &w, &h);
203                 printf("keypad is shown\n");
204                 printf("The coordination of inkey panel. x : %d, y : %d, w : %d, h : %d\n", x, y, w, h);
205         } else if (value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
206                 // ISE state has changed to ISE_STATE_HIDE status
207                 printf("keypad is hided\n");
208         }
209 }
210
211 static Evas_Object *_gl_ok_button_content_get(void *data, Evas_Object *obj, const char *part)
212 {
213         retv_if(NULL == data, NULL);
214
215         if (!strcmp(part, "elm.slide.swallow.1")) {
216                 SatUiAppData_t *ad = (SatUiAppData_t *)data;
217
218                 ad->r_button  = elm_button_add(obj);
219                 elm_object_text_set(ad->r_button, SAT_STR_OK);
220                 evas_object_show(ad->r_button);
221                 evas_object_smart_callback_add(ad->r_button, "clicked", on_clicked_ok_btn, ad);
222
223                 return ad->r_button;
224         }
225         return NULL;
226 }
227
228 static Evas_Object *_gl_help_button_content_get(void *data, Evas_Object *obj, const char *part)
229 {
230         retv_if(NULL == data, NULL);
231
232         if (!strcmp(part, "elm.slide.swallow.1")) {
233                 Evas_Object *help_btn = NULL;
234                 Evas_Object *help_icon = NULL;
235
236                 SatUiAppData_t *ad = (SatUiAppData_t *)data;
237
238                 help_btn = elm_button_add(obj);
239
240                 retv_if(NULL == help_btn, NULL);
241
242                 ad->help_btn = help_btn;
243
244                 help_icon = elm_icon_add(help_btn);
245                 elm_image_file_set(help_icon, HELP_ICON_FILE, NULL);
246                 evas_object_size_hint_weight_set(help_icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
247                 evas_object_size_hint_align_set(help_icon, EVAS_HINT_FILL, EVAS_HINT_FILL);
248                 elm_object_part_content_set(help_btn, "icon", help_icon);
249                 evas_object_show(help_btn);
250                 evas_object_smart_callback_add(help_btn, "clicked", on_clicked_help_button, ad);
251
252                 return help_btn;
253         }
254         return NULL;
255 }
256
257 static Evas_Object *_gl_yes_no_button_content_get(void *data, Evas_Object *obj, const char *part)
258 {
259         Evas_Object *yes_no_btn = NULL;
260
261         retv_if(NULL == data, NULL);
262
263         SatUiAppData_t *ad = (SatUiAppData_t *)data;
264
265         if (!strcmp(part, "elm.slide.swallow.1")) {
266                 yes_no_btn = elm_button_add(obj);
267                 evas_object_show(yes_no_btn);
268                 elm_object_text_set(yes_no_btn, SAT_STR_YES);
269                 evas_object_smart_callback_add(yes_no_btn, "clicked", on_clicked_yes_btn, ad);
270         } else if (!strcmp(part, "elm.slide.swallow.2")) {
271                 yes_no_btn = elm_button_add(obj);
272                 evas_object_show(yes_no_btn);
273                 elm_object_text_set(yes_no_btn, SAT_STR_NO);
274                 evas_object_smart_callback_add(yes_no_btn, "clicked", on_clicked_no_btn, ad);
275         }
276
277         return yes_no_btn;
278 }
279
280 static Evas_Object *_gl_text_content_get(void *data, Evas_Object *obj, const char *part)
281 {
282         retv_if(NULL == data, NULL);
283
284         if (!strcmp(part, "elm.icon")) {
285                 Evas_Object *layout = NULL;
286                 Evas_Object *en = NULL;
287                 char *info = NULL;
288
289                 TelSatGetInkeyInd_t *get_inkey_data =  (TelSatGetInkeyInd_t  *)data;
290
291                 layout = elm_layout_add(obj);
292                 elm_layout_theme_set(layout, "layout", "editfield", "default");
293                 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
294
295                 en = elm_entry_add(obj);
296                 elm_object_part_content_set(layout, "elm.swallow.content", en);
297                 elm_object_signal_emit(layout, "elm,state,eraser,hide", "elm");
298
299                 if (get_inkey_data->text.stringLen >0) {
300                         DBG("string=%s",(char *)get_inkey_data->text.string);
301                         info = elm_entry_utf8_to_markup((char *)get_inkey_data->text.string);
302                         elm_entry_entry_set(en, info);
303                         free(info);
304                         elm_entry_single_line_set(en, EINA_FALSE);
305                         elm_entry_editable_set(en, EINA_FALSE);
306                 }
307                 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
308
309                 return layout;
310         }
311         return NULL;
312 }
313
314 static Evas_Object *_gl_editfield_content_get(void *data, Evas_Object *obj, const char *part)
315 {
316         retv_if(NULL == data, NULL);
317
318         if (!strcmp(part, "elm.icon")) {
319                 Evas_Object *layout = NULL;
320                 Evas_Object *en = NULL;
321                 Ecore_IMF_Input_Panel_Layout imf_layout;
322
323                 TelSatGetInkeyInd_t *get_inkey_data = (TelSatGetInkeyInd_t  *)data;
324
325                 SatUiAppData_t *ad;
326                 ad = (SatUiAppData_t *)evas_object_data_get(obj, "app_data");
327
328
329                 layout = elm_layout_add(obj);
330                 elm_layout_theme_set(layout, "layout", "editfield", "default");
331                 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
332
333                 en = elm_entry_add(obj);
334                 evas_object_smart_callback_add(en, "changed", _changed_cb, layout);
335                 evas_object_smart_callback_add(en, "focused", _focused_cb, layout);
336                 evas_object_smart_callback_add(en, "unfocused", _unfocused_cb, layout);
337
338                 elm_object_part_content_set(layout, "elm.swallow.content", en);
339                 elm_object_part_text_set(layout, "elm.guidetext", _(SAT_STR_TAP_TO_ENTER));
340                 elm_object_signal_callback_add(layout, "elm,eraser,clicked", "elm", _eraser_clicked_cb, en);
341
342                 retv_if(NULL == en, NULL);
343                 ad->entry = en;
344                 elm_entry_cursor_end_set(en);
345
346                 Ecore_IMF_Context *imf_context = elm_entry_imf_context_get(en);
347                 ad->imf_context = imf_context;
348                 ecore_imf_context_input_panel_event_callback_add(imf_context, ECORE_IMF_INPUT_PANEL_STATE_EVENT, _inkey_panel_event_callback, NULL);
349
350                 if (get_inkey_data->bIsNumeric == EINA_TRUE) {
351                         imf_layout = ECORE_IMF_INPUT_PANEL_LAYOUT_NUMBER;
352                         digits_filter_data.accepted = "0123456789*#+";
353                         digits_filter_data.rejected = NULL;
354                         elm_entry_markup_filter_append(en, elm_entry_filter_accept_set, &digits_filter_data);
355                 } else {
356                         imf_layout = ECORE_IMF_INPUT_PANEL_LAYOUT_EMAIL;
357                 }
358
359                 limit_filter_data.max_char_count = 0;
360                 limit_filter_data.max_byte_count = 1;
361                 elm_entry_markup_filter_append(en, elm_entry_filter_limit_size, &limit_filter_data);
362                 elm_entry_input_panel_enabled_set(en, EINA_TRUE);
363                 elm_entry_input_panel_layout_set(ad->entry, imf_layout);
364
365                 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
366                 elm_object_signal_emit(layout, "clicked", "elm");
367
368                 return layout;
369         }
370
371         return NULL;
372 }
373
374 static void __sat_ui_gl_sel_cb(void *data, Evas_Object *obj, void *event_info)
375 {
376         if (event_info)
377                 elm_genlist_item_selected_set(event_info, EINA_FALSE);
378 }
379
380 int draw_content_get_inkey(Evas_Object* content, void *tapi_data, void *data)
381 {
382         retv_if(NULL == content, -1);
383         retv_if(NULL == tapi_data, -1);
384         retv_if(NULL == data, -1);
385
386         Evas_Object *genlist = NULL;
387         Evas_Object *image = NULL;
388         Evas_Object *l_button = NULL;
389         Elm_Object_Item *item = NULL;
390
391         memcpy(&(get_inkey_info), tapi_data, sizeof(TelSatGetInkeyInd_t));
392
393         SatUiAppData_t *ad = (SatUiAppData_t *)data;
394
395         ad->entry = NULL;
396
397         l_button  = elm_button_add(ad->nf);
398         elm_object_style_set(l_button, "naviframe/end_btn/default");
399         evas_object_smart_callback_add(l_button, "clicked", on_clicked_back_btn, ad);
400         elm_object_item_part_content_set(ad->navi_it, "prev_btn", l_button);
401         ad->back_btn = l_button;
402
403         /* Icon */
404         if (get_inkey_info.iconId.bIsPresent == EINA_TRUE) {
405                 image = convert_iconinfo_to_evas_object((void *)ad, &get_inkey_info.iconId.iconInfo);
406
407                 if (get_inkey_info.iconId.iconQualifier == TAPI_SAT_ICON_QUALI_SELF_EXPLANATORY) {
408                         elm_object_item_text_set(ad->navi_it, " ");
409                 }
410                 evas_object_size_hint_align_set(image, 0,0);
411                 evas_object_show(image);
412         }
413
414         ad->itc_no_edit_text->item_style = "dialogue/1icon";
415         ad->itc_no_edit_text->func.content_get = _gl_text_content_get;
416
417         ad->itc_editfield_icon->item_style = "1icon";
418         ad->itc_editfield_icon->func.content_get = _gl_editfield_content_get;
419
420         ad->itc_ok_icon->item_style = "mode/slide";
421         ad->itc_ok_icon->func.content_get = _gl_ok_button_content_get;
422
423         ad->itc_help_icon->item_style = "mode/slide";
424         ad->itc_help_icon->func.content_get = _gl_help_button_content_get;
425
426         ad->itc_2icon->item_style = "mode/slide2";
427         ad->itc_2icon->func.content_get = _gl_yes_no_button_content_get;
428
429         genlist = elm_genlist_add(content);
430         elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
431         evas_object_data_set(genlist, "app_data", (void *)ad);
432
433         item = elm_genlist_item_append(genlist, ad->itc_no_edit_text, &(get_inkey_info), NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
434         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);
435
436         if (get_inkey_info.keyType == TAPI_SAT_INKEY_TYPE_YES_NO_REQUESTED) {
437
438                 elm_genlist_item_append(genlist, ad->itc_2icon, (void *)ad, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
439         } else {
440                 elm_genlist_item_append(genlist, ad->itc_editfield_icon, &(get_inkey_info), NULL, ELM_GENLIST_ITEM_NONE, __sat_ui_gl_sel_cb, NULL);
441
442                 elm_genlist_item_append(genlist, ad->itc_ok_icon, (void *)ad, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
443         }
444
445         if (get_inkey_info.bIsHelpInfoAvailable ==  EINA_TRUE) {
446                 elm_genlist_item_append(genlist, ad->itc_help_icon, (void *)ad, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
447         }
448
449         elm_object_part_content_set(content, "body", genlist);
450
451         DBG("duration=%d", get_inkey_info.duration);
452
453         if (get_inkey_info.duration > 0)
454                 ad->timer = ecore_timer_add((double)get_inkey_info.duration/1000.0f, on_timer_expired, ad);
455         else
456                 ad->timer = ecore_timer_add(GET_INKEY_DURATION, on_timer_expired, ad);
457
458         DBG("Leave");
459
460         return 0;
461 }
462