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