2 * Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
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
8 * http://floralicense.org/license/
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.
20 #include <appcore-efl.h>
22 #include <Elementary.h>
24 #include <Ecore_IMF.h>
25 #include "sat-ui-debug.h"
26 #include "get-input-view.h"
28 #include "setup-menu-view.h"
29 #include "sat-ui-icon.h"
30 #include "tel-request.h"
32 #include "common_string.h"
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;
39 /* This callback is for showing(hiding) X marked button. */
40 static void _changed_cb(void *data, Evas_Object *obj, void *event_info)
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");
46 elm_object_signal_emit(data, "elm,state,eraser,show", "elm");
50 /* Focused callback will show X marked button and hide guidetext. */
51 static void _focused_cb(void *data, Evas_Object *obj, void *event_info)
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");
58 /* Unfocused callback will show guidetext and hide X marked button. */
59 static void _unfocused_cb(void *data, Evas_Object *obj, void *event_info)
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");
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)
69 elm_entry_entry_set(data, "");
72 static void on_clicked_ok_btn(void *data, Evas_Object *obj, void *event_info)
74 Evas_Object *waiting_bar;
75 char *entry_string = NULL;
76 unsigned int string_len = 0;
78 SatUiAppData_t *ad = (SatUiAppData_t *)data;
80 ecore_timer_del(ad->timer);
83 ret_if(NULL == ad->entry);
85 entry_string = (char *)elm_entry_entry_get(ad->entry);
87 ret_if(NULL == entry_string);
89 string_len = strlen(entry_string);
91 if (string_len == 0) {
93 DBG("Minimum entry length is %d",ad->min);
94 return; // Need to wait the user input
96 DBG("Entry Length is zero");
99 DBG("Entry string is %s", entry_string);
103 elm_object_focus_set(ad->entry, EINA_FALSE);
104 elm_object_focus_allow_set(ad->entry, EINA_FALSE);
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);
108 waiting_bar = create_waiting_notify(ad->content);
109 ad->waiting_bar = waiting_bar;
111 ecore_timer_del(ad->timer);
116 static void on_clicked_back_btn( void *data, Evas_Object* obj, void* event_info )
118 SatUiAppData_t *ad = (SatUiAppData_t *)data;
121 ecore_timer_del(ad->timer);
124 elm_object_focus_set(ad->entry, EINA_FALSE);
125 elm_object_focus_allow_set(ad->entry, EINA_FALSE);
127 send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INPUT, TAPI_SAT_USER_CONFIRM_NO_OR_CANCEL, 0, NULL, ad);
131 static Eina_Bool on_expired_input_timer(void *data)
133 SatUiAppData_t *ad = (SatUiAppData_t *)data;
135 if (NULL == ad->timer) {
136 DBG("Cancel timout w/o user_confirm");
139 elm_object_focus_set(ad->entry, EINA_FALSE);
140 elm_object_focus_allow_set(ad->entry, EINA_FALSE);
142 send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INPUT, TAPI_SAT_USER_CONFIRM_TIMEOUT, 0, NULL, ad);
146 return ECORE_CALLBACK_CANCEL;
149 static void on_clicked_help_button(void *data, Evas_Object *obj, void *event_info)
151 Evas_Object *waiting_bar;
152 SatUiAppData_t *ad = (SatUiAppData_t *)data;
155 ecore_timer_del(ad->timer);
159 elm_object_focus_set(ad->entry, EINA_FALSE);
160 elm_object_focus_allow_set(ad->entry, EINA_FALSE);
163 send_ui_user_confirm(ad->cmd_id, TAPI_SAT_CMD_TYPE_GET_INPUT, TAPI_SAT_USER_CONFIRM_HELP_INFO, 0, NULL, ad);
165 waiting_bar = create_waiting_notify(ad->content);
166 ad->waiting_bar = waiting_bar;
168 ecore_timer_del(ad->timer);
173 void _input_panel_event_callback(void *data, Ecore_IMF_Context *imf_context, int value)
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");
188 Evas_Object * _create_conformant( Evas_Object *parent , SatUiAppData_t *ad)
190 Evas_Object *conform ;
192 elm_win_conformant_set(ad->win_main, EINA_TRUE);
193 conform = elm_conformant_add(parent);
195 retv_if(NULL == conform, NULL);
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);
204 static Evas_Object *_gl_ok_button_content_get(void *data, Evas_Object *obj, const char *part)
206 retv_if(NULL == data, NULL);
208 if (!strcmp(part, "elm.slide.swallow.1")) {
209 SatUiAppData_t *ad = (SatUiAppData_t *)data;
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);
221 static Evas_Object *_gl_help_button_content_get(void *data, Evas_Object *obj, const char *part)
223 retv_if(NULL == data, NULL);
225 if (!strcmp(part, "elm.slide.swallow.1")) {
226 Evas_Object *help_btn;
227 Evas_Object *help_icon;
229 SatUiAppData_t *ad = (SatUiAppData_t *)data;
231 help_btn = elm_button_add(obj);
233 retv_if(NULL == help_btn, NULL);
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);
249 static Evas_Object *_gl_text_content_get(void *data, Evas_Object *obj, const char *part)
251 retv_if(NULL == data, NULL);
253 if (!strcmp(part, "elm.icon")) {
254 Evas_Object *layout = NULL;
255 Evas_Object *en = NULL;
257 char buf[TAPI_SAT_DEF_TEXT_STRING_LEN_MAX];
259 TelSatGetInputInd_t *get_input_data = (TelSatGetInputInd_t *)data;
262 ad = (SatUiAppData_t *)evas_object_data_get(obj, "app_data");
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);
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");
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);
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);
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);
287 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
295 static Evas_Object *_gl_editfield_content_get(void *data, Evas_Object *obj, const char *part)
297 retv_if(NULL == data, NULL);
299 if (!strcmp(part, "elm.icon")) {
300 Evas_Object *layout = NULL;
301 Evas_Object *en = NULL;
302 Ecore_IMF_Input_Panel_Layout imf_layout;
304 TelSatGetInputInd_t *get_input_data = (TelSatGetInputInd_t *)data;
307 ad = (SatUiAppData_t *)evas_object_data_get(obj, "app_data");
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);
313 en = elm_entry_add(obj);
314 retv_if(NULL == en, NULL);
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);
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);
326 elm_entry_cursor_end_set(ad->entry);
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);
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);
338 imf_layout = ECORE_IMF_INPUT_PANEL_LAYOUT_EMAIL;
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);
348 elm_entry_input_panel_enabled_set(ad->entry, EINA_TRUE);
349 elm_entry_input_panel_layout_set(ad->entry, imf_layout);
351 if (get_input_data->defaultText.stringLen > 0)
352 elm_entry_entry_set(ad->entry, (char *)get_input_data->defaultText.string);
354 if (get_input_data->bIsEchoInput == FALSE)
355 elm_entry_password_set(ad->entry, EINA_TRUE);
357 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
358 elm_object_signal_emit(layout, "clicked", "elm");
365 static void __sat_ui_gl_sel_cb(void *data, Evas_Object *obj, void *event_info)
368 elm_genlist_item_selected_set(event_info, EINA_FALSE);
371 int draw_content_get_input(Evas_Object* content, void *tapi_data, void *data)
373 retv_if(NULL == content, -1);
374 retv_if(NULL == tapi_data, -1);
375 retv_if(NULL == data, -1);
377 Evas_Object *genlist = NULL;
378 Evas_Object *image = NULL;
379 Evas_Object *l_button = NULL;
380 Elm_Object_Item *item = NULL;
382 memcpy(&(get_input_info), tapi_data, sizeof(TelSatGetInputInd_t));
384 SatUiAppData_t *ad = (SatUiAppData_t *)data;
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;
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, " ");
401 evas_object_size_hint_align_set(image, 0,0);
402 evas_object_show(image);
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);
409 ad->itc_no_edit_text->item_style = "dialogue/1icon";
410 ad->itc_no_edit_text->func.content_get = _gl_text_content_get;
412 ad->itc_editfield_icon->item_style = "1icon";
413 ad->itc_editfield_icon->func.content_get = _gl_editfield_content_get;
415 ad->itc_ok_icon->item_style = "mode/slide";
416 ad->itc_ok_icon->func.content_get = _gl_ok_button_content_get;
418 ad->itc_help_icon->item_style = "mode/slide";
419 ad->itc_help_icon->func.content_get = _gl_help_button_content_get;
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);
424 elm_genlist_item_append(genlist, ad->itc_editfield_icon, &(get_input_info), NULL, ELM_GENLIST_ITEM_NONE, __sat_ui_gl_sel_cb, NULL);
426 elm_genlist_item_append(genlist, ad->itc_ok_icon, (void *)ad, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);
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);
432 elm_object_part_content_set(content, "body", genlist);
434 ad->timer = ecore_timer_add(GET_INPUT_DURATION, on_expired_input_timer, ad);