2 * Copyright 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.
24 #include <ui-gadget.h>
26 #include "smartsearch.h"
27 #include "search_bar.h"
28 #include "ps_makeupviews.h"
29 #include "ps_searcher.h"
32 #include <app_manager.h>
34 struct search_content_object_default {
37 char name[DEF_BUF_LEN];
41 char def_pkg_name[DEF_BUF_LEN];
44 struct search_category_info_default {
45 char btn_icon_path[MAX_LENGTH_PER_PATH];
46 char btn_icon_press_path[MAX_LENGTH_PER_PATH];
49 static struct search_content_object_default def_obj[SEARCH_CONT_MAX] = {
50 { 0, EINA_TRUE, "IDS_COM_BODY_CONTACTS", SEARCH_STR_TYPE_SYSTEM_STRING,
51 SEARCH_CONT_PHONE_CONTACTS, SEARCH_OBJ_PHONE_CONTENTS, "org.tizen.contacts" },
52 { 1, EINA_TRUE, "IDS_COM_BODY_MESSAGES", SEARCH_STR_TYPE_SYSTEM_STRING,
53 SEARCH_CONT_PHONE_MSG, SEARCH_OBJ_PHONE_CONTENTS, "org.tizen.message" },
54 { 2, EINA_TRUE, "IDS_COM_BODY_EMAIL", SEARCH_STR_TYPE_SYSTEM_STRING,
55 SEARCH_CONT_PHONE_EMAIL, SEARCH_OBJ_PHONE_CONTENTS, "org.tizen.email" },
56 { 3, EINA_TRUE, "IDS_COM_BODY_IMAGES", SEARCH_STR_TYPE_SYSTEM_STRING,
57 SEARCH_CONT_PHONE_IMAGES, SEARCH_OBJ_PHONE_CONTENTS, "org.tizen.image-viewer"},
58 { 4, EINA_TRUE, "IDS_COM_BODY_MUSIC", SEARCH_STR_TYPE_SYSTEM_STRING,
59 SEARCH_CONT_PHONE_MUSIC, SEARCH_OBJ_PHONE_CONTENTS, "org.tizen.music-player"},
60 { 5, EINA_TRUE, "IDS_COM_BODY_VIDEOS", SEARCH_STR_TYPE_SYSTEM_STRING,
61 SEARCH_CONT_PHONE_VIDEO, SEARCH_OBJ_PHONE_CONTENTS, "org.tizen.video-player"},
62 { 6, EINA_TRUE, "IDS_COM_BODY_CALENDAR", SEARCH_STR_TYPE_SYSTEM_STRING,
63 SEARCH_CONT_PHONE_CALENDAR, SEARCH_OBJ_PHONE_CONTENTS, "org.tizen.calendar"},
64 { 7, EINA_TRUE, "IDS_COM_BODY_MEMO", SEARCH_STR_TYPE_SYSTEM_STRING,
65 SEARCH_CONT_PHONE_MEMO, SEARCH_OBJ_PHONE_CONTENTS, "org.tizen.memo"},
66 { 8, EINA_TRUE, "IDS_COM_BODY_APPLICATIONS", SEARCH_STR_TYPE_SYSTEM_STRING,
67 SEARCH_CONT_PHONE_MENU, SEARCH_OBJ_PHONE_CONTENTS, {0} },
68 { 9, EINA_TRUE, "IDS_COM_BODY_INTERNET", SEARCH_STR_TYPE_SYSTEM_STRING,
69 SEARCH_CONT_PHONE_BROWSER, SEARCH_OBJ_PHONE_CONTENTS, "org.tizen.browser"},
72 static struct search_category_info_default def_category[SEARCH_CATE_MAX] = {
73 { "B10_btn_icon_Phone.png", "B10_btn_icon_Phone_press.png" },
76 static void __search_win_delete_cb(void *data, Evas_Object * obj,
86 static Eina_Bool __search_mousedown_event(void *data, int type, void *event)
90 struct appdata *ad = (struct appdata *)data;
91 Ecore_Event_Mouse_Button *ev = NULL;
92 SEARCH_RETV_IF(ad == NULL, ECORE_CALLBACK_CANCEL);
93 SEARCH_RETV_IF(event == NULL, ECORE_CALLBACK_CANCEL);
95 ev = (Ecore_Event_Mouse_Button *) event;
97 SEARCH_RETV_IF(ev == NULL, ECORE_CALLBACK_CANCEL);
101 return ECORE_CALLBACK_CANCEL;
105 static Eina_Bool __search_keydown_event(void *data, int type, void *event)
109 Ecore_Event_Key *ev = (Ecore_Event_Key *) event;
110 SEARCH_RETV_IF(ev == NULL, EINA_FALSE);
112 if (!SEARCH_STRCMP(ev->keyname, KEY_END)) {
113 //end key concept is close.
122 static void __search_delete_layout_main(void *data)
125 SEARCH_RET_IF(data == NULL);
127 struct appdata *ad = (struct appdata *)data;
129 SEARCH_EVAS_OBJECT_FREE(ad->layout_main);
130 SEARCH_EVAS_OBJECT_FREE(ad->navi_bar);
131 SEARCH_EVAS_OBJECT_FREE(ad->back_btn);
133 search_delete_searchbar_layout(ad);
137 static Evas_Object *__search_create_bg(Evas_Object * parent) {
140 Evas_Object *bg = NULL;
141 SEARCH_RETV_IF(parent == NULL, NULL);
143 bg = elm_bg_add(parent);
144 SEARCH_RETV_IF(bg == NULL, NULL);
146 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
147 elm_win_resize_object_add(parent, bg);
148 evas_object_show(bg);
154 static Evas_Object *__search_create_conformant(Evas_Object * parent) {
157 Evas_Object *conformant = NULL;
158 SEARCH_RETV_IF(parent == NULL, NULL);
160 conformant = elm_conformant_add(parent);
162 SEARCH_RETV_IF(conformant == NULL, NULL);
164 evas_object_size_hint_weight_set(conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
165 elm_win_resize_object_add(parent, conformant);
166 evas_object_show(conformant);
173 static Evas_Object *__search_create_layout_main(Evas_Object *parent, Evas_Object *bg)
176 Evas_Object *layout = NULL;
178 SEARCH_RETV_IF(parent == NULL, NULL);
180 layout = elm_layout_add(parent);
182 SEARCH_RETV_IF(layout == NULL, NULL);
184 //elm_layout_theme_set(layout, "standard", "window", "integration");
185 elm_layout_theme_set(layout, "layout", "application", "default");
187 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
188 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
189 elm_object_part_content_set(layout, "elm.swallow.bg", bg);
191 edje_object_signal_emit(_EDJ(layout), "elm,state,show,indicator","elm");
192 edje_object_signal_emit(_EDJ(layout), "elm,state,show,content", "elm");
193 evas_object_show(layout);
200 static Evas_Object *__search_create_navigation_layout(Evas_Object * parent)
204 Evas_Object *navi_bar; //, *sd;
206 SEARCH_RETV_IF(parent == NULL, NULL);
208 navi_bar = elm_naviframe_add(parent);
210 elm_object_part_content_set(parent, "elm.swallow.content", navi_bar);
212 evas_object_show(navi_bar);
219 static void __search_back_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
223 struct appdata *ad = (struct appdata *)data;
224 SEARCH_RET_IF(ad == NULL);
226 elm_win_lower(ad->win_main);
228 if(ad->back_btn_type == BACK_BTN_TYPE_CLOSE)
234 static Evas_Object* __search_add_back_btn(struct appdata *ad)
237 SEARCH_RETV_IF(ad == NULL, NULL);
240 Evas_Object *btn = elm_button_add(ad->conformant);
241 elm_object_style_set(btn, "naviframe/end_btn/default");
242 evas_object_smart_callback_add(btn, "clicked", __search_back_btn_clicked_cb, ad);
249 static int __search_init_smartsearch(struct appdata *ad)
253 SEARCH_RETV_IF(ad == NULL, -1);
256 ad->bg = __search_create_bg(ad->win_main);
257 ad->conformant = __search_create_conformant(ad->win_main);
258 ad->layout_main = __search_create_layout_main(ad->conformant, ad->bg);
259 SEARCH_RETV_IF(ad->layout_main == NULL, -1);
260 elm_object_content_set(ad->conformant, ad->layout_main);
263 elm_win_indicator_mode_set(ad->win_main, ELM_WIN_INDICATOR_SHOW);
266 ad->navi_bar = __search_create_navigation_layout(ad->layout_main);
269 ad->back_btn = __search_add_back_btn(ad);
272 search_create_searchbar_layout(ad->conformant, ad);
274 ad->navi_it = elm_naviframe_item_push(ad->navi_bar,
275 dgettext("sys_string", "IDS_COM_BODY_SEARCH"),
276 ad->back_btn, NULL, ad->sb_layout, NULL);
278 ad->search_category = SEARCH_CATE_PHONE;
285 static void __search_init_category_object(struct appdata *ad)
290 SEARCH_RET_IF(ad == NULL);
292 /* Initialize Category */
293 for( i = 0 ; i < SEARCH_CATE_MAX; ++i ) {
294 ad->category_info[i].btn_icon_path = strdup(def_category[i].btn_icon_path);
295 ad->category_info[i].btn_icon_press_path = strdup(def_category[i].btn_icon_press_path);
301 static void __search_init_result_object(struct appdata *ad)
307 int ret = SEARCH_RET_SEARCH_NONE;
311 sqlite3_stmt *sql_load = NULL;
312 sqlite3_stmt *sql_insert = NULL;
314 char *imgpath = NULL;
317 sql_load = ad->search_db_sql[SEARCH_STMT_GET_CATEGORY_LIST_ALL];
319 rc = sqlite3_step(sql_load);
320 if (rc != SQLITE_ROW) {
321 if (rc == SQLITE_DONE) {
322 SEARCH_DEBUG_WARNING("SELECT STEP : SQLITE_DONE. No result");
323 ret = SEARCH_RET_SEARCH_NONE;
325 SEARCH_DEBUG_ERROR("SELECT STEP FAIL : (%d)", rc);
326 ret = SEARCH_RET_SEARCH_FAIL;
329 SEARCH_DEBUG_LOG("SELECT STEP SUCCESS");
330 ret = SEARCH_RET_SEARCH_SUCCESS;
333 if( ret != SEARCH_RET_SEARCH_SUCCESS ) {
334 /* If db result is NULL, initialize to default setting and insert this data to DB */
335 for( i = 0; i < SEARCH_CONT_MAX ; ++i ) {
336 sql_insert = ad->search_db_sql[SEARCH_STMT_INSERT_OBJECT_INFO];
337 ad->result_obj[i].order = def_obj[i].order;
338 ad->result_obj[i].visible = def_obj[i].visible;
339 ad->result_obj[i].contents_type = def_obj[i].contents_type;
340 ad->result_obj[i].category_type = def_obj[i].category_type;
341 ad->result_obj[i].name = strdup(def_obj[i].name);
342 ad->result_obj[i].string_type = def_obj[i].string_type;
343 ad->result_obj[i].def_pkg_name = strdup(def_obj[i].def_pkg_name);
344 ail_ret = app_manager_get_app_icon_path(def_obj[i].def_pkg_name, &imgpath);
346 if (ail_ret == APP_MANAGER_ERROR_NONE && imgpath) {
347 ad->result_obj[i].obj_icon_path = strdup(imgpath);
348 SEARCH_FREE(imgpath);
352 search_sql_bind_text(ad->search_db_hd, sql_insert, 1, ad->result_obj[i].name);
353 search_sql_bind_int(ad->search_db_hd, sql_insert, 2, ad->result_obj[i].string_type);
354 search_sql_bind_int(ad->search_db_hd, sql_insert, 3, ad->result_obj[i].visible);
355 search_sql_bind_int(ad->search_db_hd, sql_insert, 4, ad->result_obj[i].order);
356 search_sql_bind_int(ad->search_db_hd, sql_insert, 5, ad->result_obj[i].contents_type);
357 search_sql_bind_int(ad->search_db_hd, sql_insert, 6, ad->result_obj[i].category_type);
358 search_sql_bind_text(ad->search_db_hd, sql_insert, 7, ad->result_obj[i].def_pkg_name);
360 rc = sqlite3_step(sql_insert);
362 if( sql_insert != NULL )
363 search_sql_stmt_init(sql_insert);
366 /* Copy db data to structure */
367 for(i = 0; i < SEARCH_CONT_MAX && rc == SQLITE_ROW; ++i) {
368 char *name = (char *)sqlite3_column_text(sql_load, 0);
369 int string_type = sqlite3_column_int(sql_load, 1);
370 int visible = sqlite3_column_int(sql_load, 2);
371 int order = sqlite3_column_int(sql_load, 3);
372 int contents_type = sqlite3_column_int(sql_load, 4);
373 int category_type = sqlite3_column_int(sql_load, 5);
374 char *def_pkg_name = (char *)sqlite3_column_text(sql_load, 6);
376 ad->result_obj[i].order = order;
377 ad->result_obj[i].contents_type = contents_type;
378 ad->result_obj[i].string_type = string_type;
379 ad->result_obj[i].category_type = category_type;
380 ad->result_obj[i].name = ( name != NULL ) ? strdup(name): NULL;
381 ad->result_obj[i].visible = ( visible > 0 ) ? EINA_TRUE : EINA_FALSE;
382 ad->result_obj[i].def_pkg_name = ( def_pkg_name != NULL) ?
383 strdup(def_pkg_name) : NULL;
386 ail_ret = app_manager_get_app_icon_path(def_obj[i].def_pkg_name, &imgpath);
388 if (ail_ret == APP_MANAGER_ERROR_NONE && imgpath) {
389 ad->result_obj[i].obj_icon_path = strdup(imgpath);
390 SEARCH_FREE(imgpath);
394 rc = sqlite3_step(sql_load);
398 if( sql_load != NULL )
399 search_sql_stmt_init(sql_load);
400 if( sql_insert != NULL )
401 search_sql_stmt_init(sql_insert);
406 static Evas_Object *__search_create_win(const char *name, void *data)
410 struct appdata *ad = (struct appdata *)data;
414 SEARCH_RETV_IF(ad == NULL, NULL);
416 eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
417 elm_win_conformant_set(eo, EINA_TRUE);
420 elm_win_title_set(eo, name);
421 evas_object_smart_callback_add(eo, "delete,request",
422 __search_win_delete_cb, ad);
423 ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h);
424 evas_object_resize(eo, w, h);
432 static int __search_init_db_connect(struct appdata *ad)
437 int ret = SEARCH_RET_FAIL;
439 SEARCH_RETV_IF(ad == NULL, SEARCH_RET_FAIL);
441 rc = db_util_open(SEARCH_DB_PATH,
444 if (rc != SQLITE_OK) {
446 ("db_util_open error : %d (%s)\n",
448 ret = SEARCH_RET_FAIL;
451 const char *query_list[SEARCH_STMT_MAX] = { SEARCH_DB_SQL_GET_CATEGORY_LIST_ALL,
452 SEARCH_DB_SQL_INSERT_OBJECT_IFNO,
453 SEARCH_DB_SQL_UPDATE_OBJECT_INFO
456 for (i = SEARCH_STMT_GET_CATEGORY_LIST_ALL; i < SEARCH_STMT_MAX ; ++i ) {
457 SEARCH_DEBUG_LOG("query : %s\n", query_list[i]);
459 ret = search_sql_prepare_stmt(ad->search_db_hd, query_list[i],
460 &(ad->search_db_sql[i]));
469 static void __search_deinit_db_connect(struct appdata *ad)
475 SEARCH_RET_IF(ad == NULL);
477 for (i = SEARCH_STMT_GET_CATEGORY_LIST_ALL; i < SEARCH_STMT_MAX ; ++i ) {
478 if (ad->search_db_sql[i]) {
479 search_sql_stmt_finalize(ad->search_db_sql[i]);
480 ad->search_db_sql[i] = NULL;
484 if (ad->search_db_hd) {
485 rc = db_util_close(ad->search_db_hd);
486 if (rc != SQLITE_OK) {
488 ("db_util_close error : %d / %s",
491 SEARCH_DEBUG_LOG("db_util_close success");
493 ad->search_db_hd = NULL;
495 SEARCH_DEBUG_WARNING("db_handle(%s) is null", SEARCH_DB_PATH);
501 static Eina_Bool __search_init_after_ui_create(gpointer data)
505 struct appdata *ad = (struct appdata *)data;
506 SEARCH_RETV_IF(ad == NULL, ECORE_CALLBACK_CANCEL);
508 ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
509 __search_keydown_event,
512 ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN,
513 __search_mousedown_event,
516 __search_init_db_connect(ad);
517 __search_init_result_object(ad);
519 UG_INIT_EFL(ad->win_main, UG_OPT_INDICATOR_ENABLE);
523 return ECORE_CALLBACK_CANCEL;
527 static void __search_update_lang(void *data)
530 struct appdata *ad = (struct appdata *)data;
533 SEARCH_RET_IF(ad == NULL);
535 /* Update Text for match to current language */
537 elm_object_item_text_set(ad->navi_it,
538 dgettext("sys_string", "IDS_COM_BODY_SEARCH"));
541 elm_object_part_text_set(ad->search_bar,
543 dgettext("sys_string", "IDS_COM_BODY_SEARCH"));
544 if (ad->noresult_view)
545 elm_object_part_text_set(ad->noresult_view,
547 dgettext("sys_string", "IDS_COM_BODY_NO_SEARCH_RESULTS"));
549 if (ad->search_cancel_btn)
550 elm_object_text_set(ad->search_cancel_btn,
551 dgettext("sys_string",
552 "IDS_COM_SK_CANCEL"));
554 for (i = 0; i < SEARCH_CONT_MAX; i++) {
555 Elm_Object_Item *it = ad->result_obj[i].gl_result_grp;
556 const char *item_name = ad->result_obj[i].name;
559 elm_genlist_item_fields_update(it, "elm.text", ELM_GENLIST_ITEM_FIELD_TEXT);
565 static bool __search_app_create(void *data)
569 struct appdata *ad = (struct appdata *)data;
571 SEARCH_RETV_IF(ad == NULL, false);
573 ad->win_main = __search_create_win(SEARCH_PACKAGE, ad);
574 SEARCH_RETV_IF(ad->win_main == NULL, -1);
576 evas_object_show(ad->win_main);
578 ad->scale_factor = elm_config_scale_get();
580 __search_init_category_object(ad);
581 __search_init_smartsearch(ad);
583 ad->first_search = true;
584 ad->idler_create_ui = ecore_idler_add(__search_init_after_ui_create, ad);
585 evas_object_show(ad->win_main);
592 static void __search_app_terminate(void *data)
596 struct appdata *ad = (struct appdata *)data;
599 SEARCH_RET_IF(ad == NULL);
601 if (ad->layout_main) {
602 evas_object_del(ad->layout_main);
603 ad->layout_main = NULL;
607 evas_object_del(ad->win_main);
611 if(ad->idler_create_ui)
612 ecore_idler_del(ad->idler_create_ui);
614 search_result_gl_deinit(ad);
616 search_app_disconnect(ad);
617 __search_deinit_db_connect(ad);
619 search_util_date_time_format_deinit();
621 for ( i = 0 ; i < SEARCH_CONT_MAX ; ++i ) {
622 SEARCH_FREE(ad->result_obj[i].name);
623 SEARCH_FREE(ad->result_obj[i].obj_icon_path);
624 SEARCH_FREE(ad->result_obj[i].def_pkg_name);
627 for ( i = 0 ; i < SEARCH_CATE_MAX ; ++i ) {
628 SEARCH_FREE(ad->category_info[i].btn_icon_path);
629 SEARCH_FREE(ad->category_info[i].btn_icon_press_path);
632 SEARCH_FREE(ad->search_word);
633 SEARCH_FREE(ad->not_markup_search_word);
638 static void __search_app_pause(void *data)
645 static void __search_app_resume(void *data)
649 struct appdata *ad = (struct appdata *)data;
650 SEARCH_RET_IF(ad == NULL);
653 elm_object_focus_set(ad->back_btn, EINA_FALSE);
656 elm_genlist_select_mode_set(ad->search_gl, ELM_OBJECT_SELECT_MODE_DEFAULT);
658 if (elm_object_scroll_freeze_get(ad->search_gl) > 0) {
659 elm_object_scroll_freeze_pop(ad->search_gl);
665 static void __search_app_service(service_h service, void *data)
669 struct appdata *ad = (struct appdata *)data;
672 char *keyword = NULL;
673 char *operation = NULL;
675 Evas_Object *cate_icon;
677 char *icon_path = NULL;
679 ad->back_btn_type = BACK_BTN_TYPE_LOWER;
680 SEARCH_FREE(ad->search_word);
682 ret = service_get_operation(service, &operation);
685 SEARCH_DEBUG_WARNING("Cannot get operation!");
689 if(operation == NULL ) {
690 SEARCH_DEBUG_WARNING("Operation is NULL!");
694 SEARCH_DEBUG_LOG("SERVICE OPERATION TYPE : %s", operation);
695 if (SEARCH_STRCMP(operation, SERVICE_OPERATION_SEARCH) == 0) {
696 ret = service_get_extra_data(service, "http://tizen.org/appcontrol/data/keyword", &query);
699 SEARCH_DEBUG_WARNING("Fail to Get Keyword data!");
703 if( (query) && (strlen(query) > 0) ) {
704 keyword = (char*)malloc(strlen(query)+1);
705 memset(keyword, 0x00, strlen(query)+1);
706 strncpy(keyword, query, strlen(query));
709 ad->search_category = SEARCH_CATE_PHONE;
710 ad->back_btn_type = BACK_BTN_TYPE_CLOSE;
713 /* If Operation type is not SEARCH, Initializae valute to default */
714 keyword = vconf_get_str(SMARTSEARCH_KEY_KEYWORD);
717 SEARCH_DEBUG_WARNING("Error(%d) : get current key from vconf", ret);
719 ad->search_category = SEARCH_CATE_PHONE;
722 SEARCH_DEBUG_LOG("current category : %d", ad->search_category);
724 icon_path = ad->category_info[ad->search_category].btn_icon_path;
725 cate_icon = search_searchbar_category_icon_add(icon_path,
727 SEARCH_CATEGORY_BTN_ICON_SIZE_WIDTH,
728 SEARCH_CATEGORY_BTN_ICON_SIZE_HEIGHT,
730 elm_object_content_set(ad->cate_btn, cate_icon);
732 /* set current category to vconf */
733 ad->search_category = SEARCH_CATE_PHONE;
735 if ((keyword) && (strlen(keyword) > 0)) {
736 elm_object_text_set(ad->search_entry, keyword);
738 SEARCH_DEBUG_LOG("keyword is NULL");
740 elm_object_text_set(ad->search_entry, "");
741 elm_object_signal_emit(ad->search_bar, "cancel,hide", "");
743 search_set_result_list(ad);
745 /* set focus to entry for launching ime */
746 evas_object_show(ad->search_entry);
747 elm_object_focus_set(ad->search_entry,EINA_TRUE);
748 elm_object_signal_emit(ad->search_bar, "cancel,in", "");
751 SEARCH_FREE(keyword);
752 SEARCH_FREE(operation);
755 elm_entry_cursor_end_set(ad->search_entry);
758 elm_win_activate(ad->win_main);
763 static void __search_app_device_orientation_cb(app_device_orientation_e orientation, void *data)
766 struct appdata *ad = (struct appdata *)data;
767 SEARCH_RET_IF(ad == NULL);
768 SEARCH_RET_IF(ad->win_main == NULL);
770 if (orientation >= 0) {
771 elm_win_rotation_with_resize_set(ad->win_main, orientation);
777 static void __search_app_lang_change(void *data)
780 struct appdata *ad = (struct appdata *)data;
782 __search_update_lang(ad);
787 int main(int argc, char *argv[])
795 app_event_callback_s event_callback;
797 event_callback.create = __search_app_create;
798 event_callback.terminate = __search_app_terminate;
799 event_callback.pause = __search_app_pause;
800 event_callback.resume = __search_app_resume;
801 event_callback.service = __search_app_service;
802 event_callback.low_memory = NULL;
803 event_callback.low_battery = NULL;
804 event_callback.device_orientation = __search_app_device_orientation_cb;
805 event_callback.language_changed = __search_app_lang_change;
806 event_callback.region_format_changed = search_region_format_cb;
808 memset(&ad, 0x0, sizeof(struct appdata));
810 for (i = 0; i < argc; i++)
811 SEARCH_DEBUG_LOG("argv[%d] = [%s]\n", i, argv[i]);
815 return app_efl_main(&argc, &argv, &event_callback, &ad);