2 * Copyright 2012 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://www.tizenopensource.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.
18 #include "smartsearch.h"
19 #include "ps_searcher.h"
20 #include "ps_app_interface.h"
21 #include <contacts-svc.h>
22 #include <calendar-svc-provider.h>
24 #include <media_content.h>
25 #include <msg_types.h>
26 #include <msg_storage.h>
29 struct search_thread_data {
35 struct search_genlist_item_info* search_add_genlist_item(int type,
36 struct search_content_object *obj, Elm_Genlist_Item_Class *itc_style, void *data,
37 Elm_Object_Item *parent)
39 struct search_genlist_item_info *item = (struct search_genlist_item_info *)
41 sizeof(struct search_genlist_item_info));
46 item->itc_style = itc_style;
48 item->parent = parent;
55 ecore_exe_pipe_cb(void *data, void *buf, unsigned int size)
60 struct appdata *ad = (struct appdata *)data;
61 struct search_pipe_data *pipe_data = *((struct search_pipe_data**)buf);
63 struct search_content_object *obj = NULL;
64 struct search_genlist_item_info *item = NULL;
65 struct search_genlist_info *result_info = pipe_data->result_list;
67 int cmd = pipe_data->cmd;
69 SEARCH_DEBUG_LOG("Pipe Command : %d ret : %d", cmd, pipe_data->search_ret);
72 case SEARCH_PIPE_CMD_CLEAR_GENLIST:
73 elm_genlist_clear(ad->search_gl);
75 case SEARCH_PIPE_CMD_SET_LAYOUT:
76 if (pipe_data->search_ret == SEARCH_RET_SEARCH_SUCCESS)
77 search_layout_set_search_list(ad);
79 search_layout_set_search_no_result(ad);
81 case SEARCH_PIPE_CMD_ADD_GENLIST_PHONE:
83 if (result_info->group) {
84 item = result_info->group;
87 obj->gl_result_grp = elm_genlist_item_append(ad->search_gl,
91 ELM_GENLIST_ITEM_GROUP,
94 elm_genlist_item_select_mode_set(obj->gl_result_grp,
95 ELM_OBJECT_SELECT_MODE_NONE);
99 if (result_info->itemlist) {
100 GList *node = g_list_first(result_info->itemlist);
102 while (node != NULL) {
103 item = (struct search_genlist_item_info *)node->data;
106 elm_genlist_item_append(ad->search_gl,
110 ELM_GENLIST_ITEM_NONE,
111 search_gl_phone_result_sel,
115 node = g_list_next(node);
117 g_list_free(result_info->itemlist);
118 result_info->itemlist = NULL;
121 if (result_info->more) {
122 item = result_info->more;
124 elm_genlist_item_append(ad->search_gl,
128 ELM_GENLIST_ITEM_NONE,
129 search_gl_result_more_item_append_cb,
134 SEARCH_FREE(result_info);
139 SEARCH_FREE(pipe_data);
143 static Evas_Object *__search_gl_content_get_search_item_type(void *data, Evas_Object *obj, const char *part)
145 Evas_Object *icon = NULL;
148 struct search_item_sel *sel_mem_info = (struct search_item_sel *)data;
150 if (!SEARCH_STRCMP(part, "elm.icon") || !SEARCH_STRCMP(part, "elm.icon.1")) {
151 if (strlen(sel_mem_info->icon1_path) > 0 ) {
152 icon = elm_icon_add(obj);
153 icon_size = (int)(SEARCH_THUMBNAIL_SIZE * elm_scale_get());
154 elm_icon_prescale_set(icon, icon_size);
155 elm_icon_file_set(icon, sel_mem_info->icon1_path, NULL);
156 evas_object_size_hint_min_set(icon,
157 SEARCH_THUMBNAIL_SIZE * elm_scale_get(),
158 SEARCH_THUMBNAIL_SIZE * elm_scale_get());
159 evas_object_size_hint_max_set(icon,
160 SEARCH_THUMBNAIL_SIZE * elm_scale_get(),
161 SEARCH_THUMBNAIL_SIZE * elm_scale_get());
162 evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
164 } else if(!strcmp(part, "elm.icon.2")) {
165 if (strlen(sel_mem_info->icon2_path) > 0 ) {
166 icon = elm_icon_add(obj);
167 icon_size = (int)(SEARCH_ICON_SIZE * elm_scale_get());
168 elm_icon_prescale_set(icon, icon_size);
169 elm_icon_file_set(icon, sel_mem_info->icon2_path, NULL);
170 evas_object_size_hint_min_set(icon,
171 SEARCH_ICON_SIZE * elm_scale_get(),
172 SEARCH_ICON_SIZE * elm_scale_get());
173 evas_object_size_hint_max_set(icon,
174 SEARCH_ICON_SIZE * elm_scale_get(),
175 SEARCH_ICON_SIZE * elm_scale_get());
176 evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
182 static Eina_Bool __search_gl_state_get(void *data, Evas_Object * obj,
188 static char *__search_gl_label_get_search_item_type(void *data, Evas_Object * obj,
196 struct search_item_sel *sel_mem_info = (struct search_item_sel *)data;
198 if (!SEARCH_STRCMP(part, "elm.text") || !SEARCH_STRCMP(part, "elm.text.1")) {
199 buf = g_strdup(sel_mem_info->main_buf);
200 } else if (!SEARCH_STRCMP(part, "elm.text.sub") || !SEARCH_STRCMP(part, "elm.text.2")) {
201 buf = g_strdup(sel_mem_info->sub_buf);
209 static char *__search_gl_label_get_normal_type(void *data, Evas_Object * obj,
212 char *title_string = (char*)data;
214 return strdup(title_string);
219 static char *__search_gl_label_get_group(void *data, Evas_Object * obj,
222 struct search_content_object *object = (struct search_content_object*)data;
223 SEARCH_DEBUG_WARNING("%s %d", object->name, object->string_type);
225 if (object->string_type == SEARCH_STR_TYPE_APP_STRING)
226 return strdup(gettext(object->name));
228 return strdup(dgettext("sys_string", object->name));
234 static char *__search_gl_label_get_more(void *data, Evas_Object * obj,
237 return strdup(gettext("IDS_SSEARCH_BODY_MORE_RESULTS"));
240 static void __search_gl_del_grouptitle(void *data, Evas_Object * obj)
248 static void __search_gl_del(void *data, Evas_Object * obj)
250 struct search_item_sel *sel_mem_info = (struct search_item_sel *)data;
252 SEARCH_FREE(sel_mem_info);
257 static void __search_gl_del_more_button(void *data, Evas_Object * obj)
259 struct search_item_more_sel *sel_mem_more = (struct search_item_more_sel *)data;
261 SEARCH_FREE(sel_mem_more);
266 int search_app_connect(void *data)
270 struct appdata *ad = (struct appdata *)data;
272 int rc = 0, conn_ret = 0;
273 int ret = SEARCH_RET_SUCCESS;
276 for (i = 0; i < SEARCH_CONT_MAX ; ++i) {
277 switch (ad->result_obj[i].contents_type) {
278 case SEARCH_CONT_PHONE_CONTACTS:
280 if (ad->result_obj[i].visible == EINA_TRUE) {
281 rc = contacts_svc_connect();
282 if (rc != CTS_SUCCESS) {
283 SEARCH_DEBUG_WARNING("contacts svc connect fail : %d",rc);
286 rc = contacts_svc_disconnect();
287 if (rc != CTS_SUCCESS) {
288 SEARCH_DEBUG_WARNING("contacts svc disconnect fail : %d",rc);
294 /* Contact-service should be conneted for display Message result.
295 Because We should display message with contact photo
296 if user have contact photo which have matched to tel-number of sender or receiver */
297 case SEARCH_CONT_PHONE_MSG:
299 msg_error_t err = MSG_SUCCESS;
301 if (ad->result_obj[i].visible == EINA_TRUE) {
303 /* Connect Contact-service if contact category status is invisible */
304 if (ad->result_obj[SEARCH_CONT_PHONE_CONTACTS].visible == EINA_FALSE) {
305 rc = contacts_svc_connect();
306 if (rc != CTS_SUCCESS) {
307 /* If we fail to connect contact-service, display message-app icon */
308 SEARCH_DEBUG_WARNING("contacts svc connect fail : %d",rc);
312 /* Connect Message-Service */
313 err = msg_open_msg_handle(&ad->msg_handle);
315 if (err != MSG_SUCCESS) {
316 SEARCH_DEBUG_WARNING("msg_open_msg_handle error : %d", err);
317 ad->msg_handle = NULL;
320 /* Disconnect Contact-service if contact category status is invisible */
321 if (ad->result_obj[SEARCH_CONT_PHONE_CONTACTS].visible == EINA_FALSE) {
322 rc = contacts_svc_disconnect();
323 if (rc != CTS_SUCCESS)
324 SEARCH_DEBUG_WARNING("contacts svc connect fail : %d",rc);
327 /* Disconnect Message-Service */
328 if (ad->msg_handle != NULL ) {
329 err = msg_close_msg_handle(&ad->msg_handle);
331 if (err != MSG_SUCCESS)
332 SEARCH_DEBUG_WARNING("msg_close_msg_handle error : %d", err);
333 ad->msg_handle = NULL;
338 case SEARCH_CONT_PHONE_EMAIL:
340 /* IMAGE, MUSIC, VIDEO use common handle */
341 case SEARCH_CONT_PHONE_IMAGES:
342 case SEARCH_CONT_PHONE_MUSIC:
343 case SEARCH_CONT_PHONE_VIDEO:
345 if (ad->result_obj[SEARCH_CONT_PHONE_IMAGES].visible == EINA_TRUE
346 || ad->result_obj[SEARCH_CONT_PHONE_MUSIC].visible == EINA_TRUE
347 || ad->result_obj[SEARCH_CONT_PHONE_VIDEO].visible == EINA_TRUE ) {
348 conn_ret = media_content_connect();
351 SEARCH_DEBUG_WARNING("media_content_connect failed : %d\n", conn_ret);
353 conn_ret = media_content_disconnect();
356 SEARCH_DEBUG_WARNING("media_content_disconnect failed : %d\n", conn_ret);
360 case SEARCH_CONT_PHONE_CALENDAR:
362 if (ad->result_obj[i].visible == EINA_TRUE) {
363 rc = calendar_svc_connect();
364 if (rc != CAL_SUCCESS) {
366 ("calendar svc connect fail : %d",
370 rc = calendar_svc_close();
371 if (rc != CAL_SUCCESS) {
373 ("calendar svc disconnect fail : %d",
379 case SEARCH_CONT_PHONE_MEMO:
381 if (ad->result_obj[i].visible == EINA_TRUE) {
382 rc = memo_init(NULL);
385 ("memo svc connect fail : %d", rc);
399 int search_app_disconnect(void *data)
403 struct appdata *ad = (struct appdata *)data;
405 int rc = 0, conn_ret = 0;
408 for (i = 0; i < SEARCH_CONT_MAX ; ++i) {
409 switch (ad->result_obj[i].contents_type) {
410 case SEARCH_CONT_PHONE_CONTACTS:
412 rc = contacts_svc_disconnect();
413 if (rc != CTS_SUCCESS) {
415 ("contacts svc disconnect fail : %d",
420 case SEARCH_CONT_PHONE_MSG:
422 if (ad->msg_handle != NULL ) {
423 msg_error_t err = MSG_SUCCESS;
424 err = msg_close_msg_handle(&ad->msg_handle);
426 if (err != MSG_SUCCESS) {
427 SEARCH_DEBUG_WARNING("msg_close_msg_handle error : %d", err);
430 ad->msg_handle = NULL;
434 case SEARCH_CONT_PHONE_EMAIL:
436 case SEARCH_CONT_PHONE_IMAGES:
437 case SEARCH_CONT_PHONE_MUSIC:
438 case SEARCH_CONT_PHONE_VIDEO:
440 conn_ret = media_content_disconnect();
442 SEARCH_DEBUG_WARNING("media_content_disconnect failed : %d\n", conn_ret);
445 case SEARCH_CONT_PHONE_CALENDAR:
447 rc = calendar_svc_close();
448 if (rc != CAL_SUCCESS) {
450 ("calendar svc disconnect fail : %d",
455 case SEARCH_CONT_PHONE_MEMO:
468 void search_gl_phone_result_sel(void *data, Evas_Object * obj, void *event_info)
472 struct appdata *ad = (struct appdata *)data;
473 struct search_item_sel *cur_category_mem;
474 Elm_Object_Item *it = (Elm_Object_Item *) event_info;
477 (struct search_item_sel *)elm_object_item_data_get(it);
478 if (cur_category_mem == NULL) {
482 SEARCH_DEBUG_LOG("cur_category_mem->type : %d", cur_category_mem->type);
484 switch (cur_category_mem->type) {
485 case SEARCH_CONT_PHONE_CONTACTS:
486 search_launch_contact_view(ad, cur_category_mem);
489 case SEARCH_CONT_PHONE_MSG:
490 search_launch_msg_view(ad, cur_category_mem);
493 case SEARCH_CONT_PHONE_EMAIL:
494 search_launch_email_view(ad, cur_category_mem);
497 case SEARCH_CONT_PHONE_IMAGES:
498 search_launch_image_view(ad, cur_category_mem);
501 case SEARCH_CONT_PHONE_VIDEO:
502 search_launch_video_view(ad, cur_category_mem);
505 case SEARCH_CONT_PHONE_MUSIC:
506 search_launch_music_view(ad, cur_category_mem);
509 case SEARCH_CONT_PHONE_CALENDAR:
510 search_launch_calendar_view(ad, cur_category_mem);
513 case SEARCH_CONT_PHONE_MEMO:
514 search_launch_memo_view(ad, cur_category_mem);
517 case SEARCH_CONT_PHONE_MENU:
518 search_launch_menu_view(ad, cur_category_mem);
521 case SEARCH_CONT_PHONE_BROWSER:
522 search_launch_browser_view(ad, cur_category_mem);
528 elm_genlist_item_selected_set(it, EINA_FALSE);
533 static int __search_gl_set_phone_search_result(struct search_content_object *obj,
537 struct search_genlist_info *result_info)
541 int sel_cnt = SEARCH_CATEGORY_LIST_MORE_CNT + 1;
542 int func_ret = SEARCH_RET_SEARCH_NONE;
544 struct appdata *ad = (struct appdata *)data;
546 obj->mr_info.offset = offset;
548 if (obj->mr_info.offset == 0) {
549 obj->mr_info.next_point = 0;
552 SEARCH_DEBUG_LOG("offset : %d, limit : %d keyword : %s", offset, sel_cnt, keyword);
554 if (obj->visible == EINA_TRUE ) {
555 switch (obj->contents_type) {
556 case SEARCH_CONT_PHONE_CONTACTS:
559 search_sql_contact_search_result_by_api(obj,
568 case SEARCH_CONT_PHONE_MSG:
570 if (ad->msg_handle != NULL) {
572 search_sql_msg_search_result_by_api(obj,
582 case SEARCH_CONT_PHONE_EMAIL:
585 search_sql_email_search_result_by_api(obj,
593 case SEARCH_CONT_PHONE_IMAGES:
596 search_sql_image_search_result_by_api(obj,
604 case SEARCH_CONT_PHONE_MUSIC:
607 search_sql_music_search_result_by_api(obj,
615 case SEARCH_CONT_PHONE_VIDEO:
618 search_sql_video_search_result_by_api(obj,
626 case SEARCH_CONT_PHONE_CALENDAR:
629 search_sql_calendar_search_result_by_api(obj,
637 case SEARCH_CONT_PHONE_MEMO:
640 search_sql_memo_search_result_by_api(obj,
648 case SEARCH_CONT_PHONE_MENU:
651 search_sql_menu_search_result_by_api(obj,
659 case SEARCH_CONT_PHONE_BROWSER:
662 search_sql_browser_search_result_by_api(obj,
676 static void __search_thread_heavy_cb(void *data, Ecore_Thread *th)
680 struct search_thread_data *thread_data = (struct search_thread_data*)data;
681 struct appdata *ad = thread_data->ad;
682 struct search_content_object *obj = NULL;
683 struct search_genlist_info *result_info = NULL;
687 int i = SEARCH_CONT_PHONE_MIN;
688 int category_type = 0;
690 SEARCH_DEBUG_LOG("Thread ID : %p Keyword : %s", th, thread_data->keyword);
692 thread_data->ad = ad;
693 thread_data->is_search_result = SEARCH_RET_SEARCH_NONE;
695 while (i <= SEARCH_CONT_PHONE_MAX) {
697 obj = &ad->result_obj[i];
698 category_type = obj->category_type;
700 if (category_type == SEARCH_OBJ_PHONE_CONTENTS) {
701 if (ecore_thread_check(th) != EINA_TRUE) {
702 result_info = (struct search_genlist_info *)calloc(1, sizeof(struct search_genlist_info));
703 ret = __search_gl_set_phone_search_result(obj,
705 thread_data->keyword,
709 if (ret == SEARCH_RET_SEARCH_SUCCESS) {
710 SEARCH_DEBUG_LOG("Succes to Matched result : %s %d", obj->name, ret);
711 thread_data->is_search_result = SEARCH_RET_SEARCH_SUCCESS;
712 ecore_thread_feedback(th, result_info);
714 SEARCH_FREE(result_info);
724 static void __search_thread_feedback_cb(void *data, Ecore_Thread *th, void *msg_data)
728 struct search_thread_data *thread_data = (struct search_thread_data *)data;
729 struct appdata *ad = thread_data->ad;
730 struct search_genlist_info *result_list = (struct search_genlist_info *)msg_data;
731 struct search_pipe_data *pdata = NULL;
733 pdata = (struct search_pipe_data *)calloc(1,sizeof(struct search_pipe_data));
734 pdata->cmd = SEARCH_PIPE_CMD_ADD_GENLIST_PHONE;
736 pdata->result_list = result_list;
737 pdata->search_ret = thread_data->is_search_result;
739 if (ecore_thread_check(th) == EINA_TRUE)
742 ecore_pipe_write(ad->pipe, &pdata, sizeof(struct search_pipe_data));
747 static void __search_thread_end_cb(void *data, Ecore_Thread *th)
751 struct search_thread_data *thread_data = (struct search_thread_data *)data;
752 struct appdata *ad = thread_data->ad;
753 struct search_pipe_data *pdata = NULL;
755 pdata = (struct search_pipe_data *)calloc(1,sizeof(struct search_pipe_data));
756 pdata->cmd = SEARCH_PIPE_CMD_SET_LAYOUT;
757 pdata->search_ret = thread_data->is_search_result;
759 if (ecore_thread_check(th) == EINA_TRUE)
762 ecore_pipe_write(ad->pipe, &pdata, sizeof(struct search_pipe_data));
764 SEARCH_FREE(thread_data->keyword);
765 SEARCH_FREE(thread_data);
770 static void __search_thread_cancel_cb(void *data, Ecore_Thread *th)
774 struct search_thread_data *thread_data = (struct search_thread_data *)data;
776 SEARCH_FREE(thread_data->keyword);
777 SEARCH_FREE(thread_data);
782 void search_stop_search(void *data)
786 struct appdata *ad = (struct appdata *)data;
788 if (ad->search_thread) {
789 ecore_thread_cancel(ad->search_thread);
790 ad->search_thread = NULL;
793 if (ad->search_timer) {
794 ecore_timer_del(ad->search_timer);
795 ad->search_timer = NULL;
801 Ecore_Thread* search_make_result_thread(void *data)
806 Ecore_Thread *th = NULL;
807 struct appdata *ad = (struct appdata *)data;
808 struct search_thread_data *thread_data = NULL;
810 /* set keyword to vconf for save last search histroy */
811 ret = vconf_set_str(SMARTSEARCH_KEY_KEYWORD, ad->not_markup_search_word);
814 SEARCH_DEBUG_WARNING("Error : set keyword to vconf");
816 /* Create Thread for Phone Search */
817 thread_data = (struct search_thread_data *)calloc(1, sizeof(struct search_thread_data));
818 thread_data->ad = ad;
819 thread_data->is_search_result = SEARCH_RET_SEARCH_NONE;
820 thread_data->keyword = strdup(ad->search_word);
822 th = ecore_thread_feedback_run(__search_thread_heavy_cb,
823 __search_thread_feedback_cb,
824 __search_thread_end_cb,
825 __search_thread_cancel_cb,
834 void search_result_gl_init(void *data)
838 struct appdata *ad = (struct appdata *)data;
840 ad->pipe = ecore_pipe_add(ecore_exe_pipe_cb, ad);
841 eina_lock_new(&ad->mutex);
842 eina_condition_new(&ad->condition, &ad->mutex);
844 Evas_Object *genlist;
846 if (ad->itc_pslist_1line == NULL) {
847 ad->itc_pslist_1line = elm_genlist_item_class_new();
848 ad->itc_pslist_1line->item_style = "1text.2";
849 ad->itc_pslist_1line->func.text_get = __search_gl_label_get_search_item_type;
850 ad->itc_pslist_1line->func.content_get = __search_gl_content_get_search_item_type;
851 ad->itc_pslist_1line->func.state_get = __search_gl_state_get;
852 ad->itc_pslist_1line->func.del = __search_gl_del;
855 if (ad->itc_pslist_1line_1icon == NULL) {
856 ad->itc_pslist_1line_1icon = elm_genlist_item_class_new();
857 ad->itc_pslist_1line_1icon->item_style = "1text.1icon.2.tb";
858 ad->itc_pslist_1line_1icon->func.text_get = __search_gl_label_get_search_item_type;
859 ad->itc_pslist_1line_1icon->func.content_get = __search_gl_content_get_search_item_type;
860 ad->itc_pslist_1line_1icon->func.state_get = __search_gl_state_get;
861 ad->itc_pslist_1line_1icon->func.del = __search_gl_del;
864 if (ad->itc_pslist_1line_2icon == NULL) {
865 ad->itc_pslist_1line_2icon = elm_genlist_item_class_new();
866 ad->itc_pslist_1line_2icon->item_style = "1text.2icon.6.tb";
867 ad->itc_pslist_1line_2icon->func.text_get = __search_gl_label_get_search_item_type;
868 ad->itc_pslist_1line_2icon->func.content_get = __search_gl_content_get_search_item_type;
869 ad->itc_pslist_1line_2icon->func.state_get = __search_gl_state_get;
870 ad->itc_pslist_1line_2icon->func.del = __search_gl_del;
873 if (ad->itc_pslist_2line_1icon == NULL) {
874 ad->itc_pslist_2line_1icon = elm_genlist_item_class_new();
875 ad->itc_pslist_2line_1icon->item_style = "2text.1icon.4.tb";
876 ad->itc_pslist_2line_1icon->func.text_get = __search_gl_label_get_search_item_type;
877 ad->itc_pslist_2line_1icon->func.content_get = __search_gl_content_get_search_item_type;
878 ad->itc_pslist_2line_1icon->func.state_get = __search_gl_state_get;
879 ad->itc_pslist_2line_1icon->func.del = __search_gl_del;
882 if (ad->itc_pslist_2line_2icon == NULL) {
883 ad->itc_pslist_2line_2icon = elm_genlist_item_class_new();
884 ad->itc_pslist_2line_2icon->item_style = "2text.2icon.4.tb";
885 ad->itc_pslist_2line_2icon->func.text_get = __search_gl_label_get_search_item_type;
886 ad->itc_pslist_2line_2icon->func.content_get = __search_gl_content_get_search_item_type;
887 ad->itc_pslist_2line_2icon->func.state_get = __search_gl_state_get;
888 ad->itc_pslist_2line_2icon->func.del = __search_gl_del;
891 if (ad->itc_grouptitle == NULL) {
892 ad->itc_grouptitle = elm_genlist_item_class_new();
893 ad->itc_grouptitle->item_style = "grouptitle";
894 ad->itc_grouptitle->func.text_get = __search_gl_label_get_group;
895 ad->itc_grouptitle->func.state_get = __search_gl_state_get;
896 ad->itc_grouptitle->func.del = __search_gl_del_grouptitle;
899 if (ad->itc_label == NULL) {
900 ad->itc_label = elm_genlist_item_class_new();
901 ad->itc_label->item_style = "grouptitle";
902 ad->itc_label->func.text_get = __search_gl_label_get_normal_type;
903 ad->itc_label->func.state_get = __search_gl_state_get;
904 ad->itc_label->func.del = __search_gl_del_grouptitle;
907 if (ad->itc_listmore == NULL) {
908 ad->itc_listmore = elm_genlist_item_class_new();
909 ad->itc_listmore->item_style = "1text.2";
910 ad->itc_listmore->func.text_get = __search_gl_label_get_more;
911 ad->itc_listmore->func.state_get = __search_gl_state_get;
912 ad->itc_listmore->func.del = __search_gl_del_more_button;
915 ad->search_gl = NULL;
917 genlist = elm_genlist_add(ad->navi_bar);
919 // To use multiline textblock/entry/editfield in genlist, set height_for_width mode
920 // then the item's height is calculated while the item's width fits to genlist width.
921 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
922 elm_genlist_tree_effect_enabled_set(genlist, EINA_TRUE);
924 ad->search_gl = genlist;
926 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND,
928 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL,
933 void search_result_gl_deinit(void *data)
937 struct appdata *ad = (struct appdata *)data;
939 ecore_pipe_del(ad->pipe);
940 eina_condition_free(&ad->condition);
941 eina_lock_free(&ad->mutex);
943 if (ad->itc_pslist_1line != NULL)
944 elm_genlist_item_class_free(ad->itc_pslist_1line);
946 if (ad->itc_pslist_1line_1icon != NULL)
947 elm_genlist_item_class_free(ad->itc_pslist_1line_1icon);
949 if (ad->itc_pslist_1line_2icon != NULL)
950 elm_genlist_item_class_free(ad->itc_pslist_2line_1icon);
952 if (ad->itc_pslist_2line_1icon != NULL)
953 elm_genlist_item_class_free(ad->itc_pslist_2line_1icon);
955 if (ad->itc_pslist_2line_2icon != NULL)
956 elm_genlist_item_class_free(ad->itc_pslist_2line_2icon);
958 if (ad->itc_grouptitle != NULL)
959 elm_genlist_item_class_free(ad->itc_grouptitle);
961 if (ad->itc_label != NULL)
962 elm_genlist_item_class_free(ad->itc_label);
964 if (ad->itc_listmore != NULL)
965 elm_genlist_item_class_free(ad->itc_listmore);
971 void search_gl_result_more_item_append_cb(void *data, Evas_Object * obj,
976 struct appdata *ad = (struct appdata *)data;
977 Elm_Object_Item *it = (Elm_Object_Item *) event_info;
978 struct search_pipe_data *pdata = NULL;
979 struct search_genlist_info *result_info = NULL;
980 struct search_item_more_sel *sel_more =
981 (search_item_more_sel *)elm_object_item_data_get(it);
983 struct search_content_object *content_obj = sel_more->obj;
984 int offset = content_obj->mr_info.next_point;
985 int ret = SEARCH_RET_SEARCH_NONE;
987 elm_object_item_del(it);
989 result_info = (struct search_genlist_info *)calloc(1, sizeof(struct search_genlist_info));
990 ret = __search_gl_set_phone_search_result(content_obj,
996 pdata = (struct search_pipe_data *)calloc(1,sizeof(struct search_pipe_data));
997 pdata->cmd = SEARCH_PIPE_CMD_ADD_GENLIST_PHONE;
999 pdata->result_list = result_info;
1000 pdata->search_ret = ret;
1001 ecore_pipe_write(ad->pipe, &pdata, sizeof(struct search_pipe_data));
1003 pdata = (struct search_pipe_data *)calloc(1,sizeof(struct search_pipe_data));
1004 pdata->cmd = SEARCH_PIPE_CMD_SET_LAYOUT;
1005 pdata->search_ret = ret;
1006 ecore_pipe_write(ad->pipe, &pdata, sizeof(struct search_pipe_data));
1011 void search_set_result_list(void *data)
1014 struct appdata *ad = (struct appdata *)data;
1015 int category = ad->search_category;
1016 int ret = SEARCH_RET_SEARCH_NONE;
1018 bool is_input_keyword = false;
1019 struct search_pipe_data *pipe_data = NULL;
1022 search_stop_search(ad);
1024 text = elm_entry_markup_to_utf8(elm_object_text_get(ad->search_entry));
1025 SEARCH_FREE(ad->not_markup_search_word);
1026 SEARCH_FREE(ad->search_word);
1028 if((text) && (strlen(text) > 0)) {
1029 ad->not_markup_search_word = strdup(elm_object_text_get(ad->search_entry));
1030 ad->search_word = text;
1031 is_input_keyword = true;
1033 /* set keyword to vconf for save last search histroy */
1034 ret = vconf_set_str(SMARTSEARCH_KEY_KEYWORD, ad->not_markup_search_word);
1037 SEARCH_DEBUG_WARNING("Error : set keyword to vconf");
1039 if (category == SEARCH_CATE_PHONE) {
1040 pipe_data = (struct search_pipe_data *)calloc(1, sizeof(struct search_pipe_data));
1041 pipe_data->cmd = SEARCH_PIPE_CMD_SET_LAYOUT;
1042 pipe_data->search_ret = SEARCH_RET_SEARCH_NONE;
1043 ecore_pipe_write(ad->pipe, &pipe_data, sizeof(struct search_pipe_data));
1045 /* set keyword to vconf for save last search histroy */
1046 ret = vconf_set_str(SMARTSEARCH_KEY_KEYWORD, "");
1049 SEARCH_DEBUG_WARNING("Error : set keyword to vconf");
1052 /* If category is Phone, make a thread for search */
1053 pipe_data = (struct search_pipe_data *)calloc(1, sizeof(struct search_pipe_data));
1054 pipe_data->cmd = SEARCH_PIPE_CMD_CLEAR_GENLIST;
1055 ecore_pipe_write(ad->pipe, &pipe_data, sizeof(struct search_pipe_data));
1058 case SEARCH_CATE_PHONE:
1059 if (is_input_keyword) {
1060 ad->search_thread = search_make_result_thread(ad);
1067 void search_layout_set_search_list(void* data)
1071 struct appdata *ad = (struct appdata *)data;
1073 if (elm_object_part_content_get(ad->sb_layout,"list_noresult")) {
1074 elm_object_part_content_unset(ad->sb_layout,"list_noresult");
1075 evas_object_hide(ad->noresult_view);
1077 if (ad->search_gl) {
1078 elm_object_part_content_set(ad->sb_layout, "list", ad->search_gl);
1079 evas_object_show(ad->search_gl);
1084 elm_genlist_item_show(elm_genlist_first_item_get(ad->search_gl), ELM_GENLIST_ITEM_SCROLLTO_TOP);
1090 void search_layout_set_search_no_result(void* data)
1094 struct appdata *ad = (struct appdata *)data;
1096 if (elm_object_part_content_get(ad->sb_layout,"list")) {
1097 elm_object_part_content_unset(ad->sb_layout, "list");
1100 evas_object_hide(ad->search_gl);
1102 elm_object_part_content_set(ad->sb_layout,"list_noresult", ad->noresult_view);
1103 evas_object_show(ad->noresult_view);
1111 int search_layout_get_content_list_set_status(void* data)
1115 struct appdata *ad = (struct appdata *)data;
1118 if (elm_object_part_content_get(ad->sb_layout,"list")) {
1119 ret = SEARCH_RET_SUCCESS;
1121 ret = SEARCH_RET_FAIL;