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,
97 if (result_info->itemlist) {
98 GList *node = g_list_first(result_info->itemlist);
100 while (node != NULL) {
101 item = (struct search_genlist_item_info *)node->data;
104 elm_genlist_item_append(ad->search_gl,
108 ELM_GENLIST_ITEM_NONE,
109 search_gl_phone_result_sel,
113 node = g_list_next(node);
115 g_list_free(result_info->itemlist);
116 result_info->itemlist = NULL;
119 if (result_info->more) {
120 item = result_info->more;
122 elm_genlist_item_append(ad->search_gl,
126 ELM_GENLIST_ITEM_NONE,
127 search_gl_result_more_item_append_cb,
132 SEARCH_FREE(result_info);
137 SEARCH_FREE(pipe_data);
141 static Evas_Object *__search_gl_content_get_search_item_type(void *data, Evas_Object *obj, const char *part)
143 Evas_Object *icon = NULL;
146 struct search_item_sel *sel_mem_info = (struct search_item_sel *)data;
148 if (!SEARCH_STRCMP(part, "elm.icon") || !SEARCH_STRCMP(part, "elm.icon.1")) {
149 if (strlen(sel_mem_info->icon1_path) > 0 ) {
150 icon = elm_icon_add(obj);
151 icon_size = (int)(SEARCH_THUMBNAIL_SIZE * elm_scale_get());
152 elm_icon_prescale_set(icon, icon_size);
153 elm_icon_file_set(icon, sel_mem_info->icon1_path, NULL);
154 evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
156 } else if(!strcmp(part, "elm.icon.2")) {
157 if (strlen(sel_mem_info->icon2_path) > 0 ) {
158 icon = elm_icon_add(obj);
159 icon_size = (int)(SEARCH_ICON_SIZE * elm_scale_get());
160 elm_icon_prescale_set(icon, icon_size);
161 elm_icon_file_set(icon, sel_mem_info->icon2_path, NULL);
162 evas_object_size_hint_aspect_set(icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
168 static Eina_Bool __search_gl_state_get(void *data, Evas_Object * obj,
174 static char *__search_gl_label_get_search_item_type(void *data, Evas_Object * obj,
182 struct search_item_sel *sel_mem_info = (struct search_item_sel *)data;
184 if (!SEARCH_STRCMP(part, "elm.text") || !SEARCH_STRCMP(part, "elm.text.1")) {
185 buf = g_strdup(sel_mem_info->main_buf);
186 } else if (!SEARCH_STRCMP(part, "elm.text.sub") || !SEARCH_STRCMP(part, "elm.text.2")) {
187 buf = g_strdup(sel_mem_info->sub_buf);
195 static char *__search_gl_label_get_normal_type(void *data, Evas_Object * obj,
198 char *title_string = (char*)data;
200 return strdup(dgettext("sys_string", title_string));
205 static char *__search_gl_label_get_group(void *data, Evas_Object * obj,
208 struct search_content_object *object = (struct search_content_object*)data;
209 SEARCH_DEBUG_WARNING("%s %d", object->name, object->string_type);
211 if (object->string_type == SEARCH_STR_TYPE_APP_STRING)
212 return strdup(gettext(object->name));
214 return strdup(dgettext("sys_string", object->name));
220 static char *__search_gl_label_get_more(void *data, Evas_Object * obj,
223 return strdup(gettext("IDS_SSEARCH_BODY_MORE_RESULTS"));
226 static void __search_gl_del_grouptitle(void *data, Evas_Object * obj)
234 static void __search_gl_del(void *data, Evas_Object * obj)
236 struct search_item_sel *sel_mem_info = (struct search_item_sel *)data;
238 SEARCH_FREE(sel_mem_info);
243 static void __search_gl_del_more_button(void *data, Evas_Object * obj)
245 struct search_item_more_sel *sel_mem_more = (struct search_item_more_sel *)data;
247 SEARCH_FREE(sel_mem_more);
252 int search_app_connect(void *data)
256 struct appdata *ad = (struct appdata *)data;
258 int rc = 0, conn_ret = 0;
259 int ret = SEARCH_RET_SUCCESS;
262 for (i = 0; i < SEARCH_CONT_MAX ; ++i) {
263 switch (ad->result_obj[i].contents_type) {
264 case SEARCH_CONT_PHONE_CONTACTS:
266 if (ad->result_obj[i].visible == EINA_TRUE) {
267 rc = contacts_svc_connect();
268 if (rc != CTS_SUCCESS) {
269 SEARCH_DEBUG_WARNING("contacts svc connect fail : %d",rc);
272 rc = contacts_svc_disconnect();
273 if (rc != CTS_SUCCESS) {
274 SEARCH_DEBUG_WARNING("contacts svc disconnect fail : %d",rc);
280 /* Contact-service should be conneted for display Message result.
281 Because We should display message with contact photo
282 if user have contact photo which have matched to tel-number of sender or receiver */
283 case SEARCH_CONT_PHONE_MSG:
285 msg_error_t err = MSG_SUCCESS;
287 if (ad->result_obj[i].visible == EINA_TRUE) {
289 /* Connect Contact-service if contact category status is invisible */
290 if (ad->result_obj[SEARCH_CONT_PHONE_CONTACTS].visible == EINA_FALSE) {
291 rc = contacts_svc_connect();
292 if (rc != CTS_SUCCESS) {
293 /* If we fail to connect contact-service, display message-app icon */
294 SEARCH_DEBUG_WARNING("contacts svc connect fail : %d",rc);
298 /* Connect Message-Service */
299 err = msg_open_msg_handle(&ad->msg_handle);
301 if (err != MSG_SUCCESS) {
302 SEARCH_DEBUG_WARNING("msg_open_msg_handle error : %d", err);
303 ad->msg_handle = NULL;
306 /* Disconnect Contact-service if contact category status is invisible */
307 if (ad->result_obj[SEARCH_CONT_PHONE_CONTACTS].visible == EINA_FALSE) {
308 rc = contacts_svc_disconnect();
309 if (rc != CTS_SUCCESS)
310 SEARCH_DEBUG_WARNING("contacts svc connect fail : %d",rc);
313 /* Disconnect Message-Service */
314 if (ad->msg_handle != NULL ) {
315 err = msg_close_msg_handle(&ad->msg_handle);
317 if (err != MSG_SUCCESS)
318 SEARCH_DEBUG_WARNING("msg_close_msg_handle error : %d", err);
319 ad->msg_handle = NULL;
324 case SEARCH_CONT_PHONE_EMAIL:
326 /* IMAGE, MUSIC, VIDEO use common handle */
327 case SEARCH_CONT_PHONE_IMAGES:
328 case SEARCH_CONT_PHONE_MUSIC:
329 case SEARCH_CONT_PHONE_VIDEO:
331 if (ad->result_obj[SEARCH_CONT_PHONE_IMAGES].visible == EINA_TRUE
332 || ad->result_obj[SEARCH_CONT_PHONE_MUSIC].visible == EINA_TRUE
333 || ad->result_obj[SEARCH_CONT_PHONE_VIDEO].visible == EINA_TRUE ) {
334 conn_ret = media_content_connect();
337 SEARCH_DEBUG_WARNING("media_content_connect failed : %d\n", conn_ret);
339 conn_ret = media_content_disconnect();
342 SEARCH_DEBUG_WARNING("media_content_disconnect failed : %d\n", conn_ret);
346 case SEARCH_CONT_PHONE_CALENDAR:
348 if (ad->result_obj[i].visible == EINA_TRUE) {
349 rc = calendar_svc_connect();
350 if (rc != CAL_SUCCESS) {
352 ("calendar svc connect fail : %d",
356 rc = calendar_svc_close();
357 if (rc != CAL_SUCCESS) {
359 ("calendar svc disconnect fail : %d",
365 case SEARCH_CONT_PHONE_MEMO:
367 if (ad->result_obj[i].visible == EINA_TRUE) {
368 rc = memo_init(NULL);
371 ("memo svc connect fail : %d", rc);
385 int search_app_disconnect(void *data)
389 struct appdata *ad = (struct appdata *)data;
391 int rc = 0, conn_ret = 0;
394 for (i = 0; i < SEARCH_CONT_MAX ; ++i) {
395 switch (ad->result_obj[i].contents_type) {
396 case SEARCH_CONT_PHONE_CONTACTS:
398 rc = contacts_svc_disconnect();
399 if (rc != CTS_SUCCESS) {
401 ("contacts svc disconnect fail : %d",
406 case SEARCH_CONT_PHONE_MSG:
408 if (ad->msg_handle != NULL ) {
409 msg_error_t err = MSG_SUCCESS;
410 err = msg_close_msg_handle(&ad->msg_handle);
412 if (err != MSG_SUCCESS) {
413 SEARCH_DEBUG_WARNING("msg_close_msg_handle error : %d", err);
416 ad->msg_handle = NULL;
420 case SEARCH_CONT_PHONE_EMAIL:
422 case SEARCH_CONT_PHONE_IMAGES:
423 case SEARCH_CONT_PHONE_MUSIC:
424 case SEARCH_CONT_PHONE_VIDEO:
426 conn_ret = media_content_disconnect();
428 SEARCH_DEBUG_WARNING("media_content_disconnect failed : %d\n", conn_ret);
431 case SEARCH_CONT_PHONE_CALENDAR:
433 rc = calendar_svc_close();
434 if (rc != CAL_SUCCESS) {
436 ("calendar svc disconnect fail : %d",
441 case SEARCH_CONT_PHONE_MEMO:
454 void search_gl_phone_result_sel(void *data, Evas_Object * obj, void *event_info)
458 struct appdata *ad = (struct appdata *)data;
459 struct search_item_sel *cur_category_mem;
460 Elm_Object_Item *it = (Elm_Object_Item *) event_info;
463 (struct search_item_sel *)elm_object_item_data_get(it);
464 if (cur_category_mem == NULL) {
468 SEARCH_DEBUG_LOG("cur_category_mem->type : %d", cur_category_mem->type);
470 switch (cur_category_mem->type) {
471 case SEARCH_CONT_PHONE_CONTACTS:
472 search_launch_contact_view(ad, cur_category_mem);
475 case SEARCH_CONT_PHONE_MSG:
476 search_launch_msg_view(ad, cur_category_mem);
479 case SEARCH_CONT_PHONE_EMAIL:
480 search_launch_email_view(ad, cur_category_mem);
483 case SEARCH_CONT_PHONE_IMAGES:
484 search_launch_image_view(ad, cur_category_mem);
487 case SEARCH_CONT_PHONE_VIDEO:
488 search_launch_video_view(ad, cur_category_mem);
491 case SEARCH_CONT_PHONE_MUSIC:
492 search_launch_music_view(ad, cur_category_mem);
495 case SEARCH_CONT_PHONE_CALENDAR:
496 search_launch_calendar_view(ad, cur_category_mem);
499 case SEARCH_CONT_PHONE_MEMO:
500 search_launch_memo_view(ad, cur_category_mem);
503 case SEARCH_CONT_PHONE_MENU:
504 search_launch_menu_view(ad, cur_category_mem);
507 case SEARCH_CONT_PHONE_BROWSER:
508 search_launch_browser_view(ad, cur_category_mem);
514 elm_genlist_item_selected_set(it, EINA_FALSE);
519 static int __search_gl_set_phone_search_result(struct search_content_object *obj,
523 struct search_genlist_info *result_info)
527 int sel_cnt = SEARCH_CATEGORY_LIST_MORE_CNT + 1;
530 struct appdata *ad = (struct appdata *)data;
532 obj->mr_info.offset = offset;
534 if (obj->mr_info.offset == 0) {
535 obj->mr_info.next_point = 0;
538 SEARCH_DEBUG_LOG("offset : %d, limit : %d keyword : %s", offset, sel_cnt, keyword);
540 if (obj->visible == EINA_TRUE ) {
541 switch (obj->contents_type) {
542 case SEARCH_CONT_PHONE_CONTACTS:
545 search_sql_contact_search_result_by_api(obj,
554 case SEARCH_CONT_PHONE_MSG:
556 if (ad->msg_handle != NULL) {
558 search_sql_msg_search_result_by_api(obj,
568 case SEARCH_CONT_PHONE_EMAIL:
571 search_sql_email_search_result_by_api(obj,
579 case SEARCH_CONT_PHONE_IMAGES:
582 search_sql_image_search_result_by_api(obj,
590 case SEARCH_CONT_PHONE_MUSIC:
593 search_sql_music_search_result_by_api(obj,
601 case SEARCH_CONT_PHONE_VIDEO:
604 search_sql_video_search_result_by_api(obj,
612 case SEARCH_CONT_PHONE_CALENDAR:
615 search_sql_calendar_search_result_by_api(obj,
623 case SEARCH_CONT_PHONE_MEMO:
626 search_sql_memo_search_result_by_api(obj,
634 case SEARCH_CONT_PHONE_MENU:
637 search_sql_menu_search_result_by_api(obj,
645 case SEARCH_CONT_PHONE_BROWSER:
648 search_sql_browser_search_result_by_api(obj,
662 static void __search_thread_heavy_cb(void *data, Ecore_Thread *th)
666 struct search_thread_data *thread_data = (struct search_thread_data*)data;
667 struct appdata *ad = thread_data->ad;
668 struct search_content_object *obj = NULL;
669 struct search_genlist_info *result_info = NULL;
673 int i = SEARCH_CONT_PHONE_MIN;
674 int category_type = 0;
676 SEARCH_DEBUG_LOG("Thread ID : %p Keyword : %s", th, thread_data->keyword);
678 thread_data->ad = ad;
679 thread_data->is_search_result = SEARCH_RET_SEARCH_NONE;
681 while (i <= SEARCH_CONT_PHONE_MAX) {
683 obj = &ad->result_obj[i];
684 category_type = obj->category_type;
686 if (category_type == SEARCH_OBJ_PHONE_CONTENTS) {
687 if (ecore_thread_check(th) != EINA_TRUE) {
688 result_info = (struct search_genlist_info *)calloc(1, sizeof(struct search_genlist_info));
689 ret = __search_gl_set_phone_search_result(obj,
691 thread_data->keyword,
695 if (ret == SEARCH_RET_SEARCH_SUCCESS) {
696 SEARCH_DEBUG_LOG("Succes to Matched result : %s %d", obj->name, ret);
697 thread_data->is_search_result = SEARCH_RET_SEARCH_SUCCESS;
698 ecore_thread_feedback(th, result_info);
700 SEARCH_FREE(result_info);
710 static void __search_thread_feedback_cb(void *data, Ecore_Thread *th, void *msg_data)
714 struct search_thread_data *thread_data = (struct search_thread_data *)data;
715 struct appdata *ad = thread_data->ad;
716 struct search_genlist_info *result_list = (struct search_genlist_info *)msg_data;
717 struct search_pipe_data *pdata = NULL;
719 pdata = (struct search_pipe_data *)calloc(1,sizeof(struct search_pipe_data));
720 pdata->cmd = SEARCH_PIPE_CMD_ADD_GENLIST_PHONE;
722 pdata->result_list = result_list;
723 pdata->search_ret = thread_data->is_search_result;
725 if (ecore_thread_check(th) == EINA_TRUE)
728 ecore_pipe_write(ad->pipe, &pdata, sizeof(struct search_pipe_data));
733 static void __search_thread_end_cb(void *data, Ecore_Thread *th)
737 struct search_thread_data *thread_data = (struct search_thread_data *)data;
738 struct appdata *ad = thread_data->ad;
739 struct search_pipe_data *pdata = NULL;
741 pdata = (struct search_pipe_data *)calloc(1,sizeof(struct search_pipe_data));
742 pdata->cmd = SEARCH_PIPE_CMD_SET_LAYOUT;
743 pdata->search_ret = thread_data->is_search_result;
745 if (ecore_thread_check(th) == EINA_TRUE)
748 ecore_pipe_write(ad->pipe, &pdata, sizeof(struct search_pipe_data));
750 SEARCH_FREE(thread_data->keyword);
751 SEARCH_FREE(thread_data);
756 static void __search_thread_cancel_cb(void *data, Ecore_Thread *th)
760 struct search_thread_data *thread_data = (struct search_thread_data *)data;
762 SEARCH_FREE(thread_data->keyword);
763 SEARCH_FREE(thread_data);
768 void search_stop_search(void *data)
772 struct appdata *ad = (struct appdata *)data;
774 if (ad->search_thread) {
775 ecore_thread_cancel(ad->search_thread);
776 ad->search_thread = NULL;
779 if (ad->search_timer) {
780 ecore_timer_del(ad->search_timer);
781 ad->search_timer = NULL;
787 Ecore_Thread* search_make_result_thread(void *data)
792 Ecore_Thread *th = NULL;
793 struct appdata *ad = (struct appdata *)data;
794 struct search_thread_data *thread_data = NULL;
796 /* set keyword to vconf for save last search histroy */
797 ret = vconf_set_str(SMARTSEARCH_KEY_KEYWORD, ad->not_markup_search_word);
800 SEARCH_DEBUG_WARNING("Error : set keyword to vconf");
802 /* Create Thread for Phone Search */
803 thread_data = (struct search_thread_data *)calloc(1, sizeof(struct search_thread_data));
804 thread_data->ad = ad;
805 thread_data->is_search_result = SEARCH_RET_SEARCH_NONE;
806 thread_data->keyword = strdup(ad->search_word);
808 th = ecore_thread_feedback_run(__search_thread_heavy_cb,
809 __search_thread_feedback_cb,
810 __search_thread_end_cb,
811 __search_thread_cancel_cb,
820 void search_result_gl_init(void *data)
824 struct appdata *ad = (struct appdata *)data;
826 ad->pipe = ecore_pipe_add(ecore_exe_pipe_cb, ad);
827 eina_lock_new(&ad->mutex);
828 eina_condition_new(&ad->condition, &ad->mutex);
830 Evas_Object *genlist;
832 if (ad->itc_pslist_1line == NULL) {
833 ad->itc_pslist_1line = elm_genlist_item_class_new();
834 ad->itc_pslist_1line->item_style = "1text.2";
835 ad->itc_pslist_1line->func.text_get = __search_gl_label_get_search_item_type;
836 ad->itc_pslist_1line->func.content_get = __search_gl_content_get_search_item_type;
837 ad->itc_pslist_1line->func.state_get = __search_gl_state_get;
838 ad->itc_pslist_1line->func.del = __search_gl_del;
841 if (ad->itc_pslist_1line_1icon == NULL) {
842 ad->itc_pslist_1line_1icon = elm_genlist_item_class_new();
843 ad->itc_pslist_1line_1icon->item_style = "1text.1icon.2.tb";
844 ad->itc_pslist_1line_1icon->func.text_get = __search_gl_label_get_search_item_type;
845 ad->itc_pslist_1line_1icon->func.content_get = __search_gl_content_get_search_item_type;
846 ad->itc_pslist_1line_1icon->func.state_get = __search_gl_state_get;
847 ad->itc_pslist_1line_1icon->func.del = __search_gl_del;
850 if (ad->itc_pslist_1line_2icon == NULL) {
851 ad->itc_pslist_1line_2icon = elm_genlist_item_class_new();
852 ad->itc_pslist_1line_2icon->item_style = "1text.2icon.6.tb";
853 ad->itc_pslist_1line_2icon->func.text_get = __search_gl_label_get_search_item_type;
854 ad->itc_pslist_1line_2icon->func.content_get = __search_gl_content_get_search_item_type;
855 ad->itc_pslist_1line_2icon->func.state_get = __search_gl_state_get;
856 ad->itc_pslist_1line_2icon->func.del = __search_gl_del;
859 if (ad->itc_pslist_2line_1icon == NULL) {
860 ad->itc_pslist_2line_1icon = elm_genlist_item_class_new();
861 ad->itc_pslist_2line_1icon->item_style = "2text.1icon.4.tb";
862 ad->itc_pslist_2line_1icon->func.text_get = __search_gl_label_get_search_item_type;
863 ad->itc_pslist_2line_1icon->func.content_get = __search_gl_content_get_search_item_type;
864 ad->itc_pslist_2line_1icon->func.state_get = __search_gl_state_get;
865 ad->itc_pslist_2line_1icon->func.del = __search_gl_del;
868 if (ad->itc_pslist_2line_2icon == NULL) {
869 ad->itc_pslist_2line_2icon = elm_genlist_item_class_new();
870 ad->itc_pslist_2line_2icon->item_style = "2text.2icon.4.tb";
871 ad->itc_pslist_2line_2icon->func.text_get = __search_gl_label_get_search_item_type;
872 ad->itc_pslist_2line_2icon->func.content_get = __search_gl_content_get_search_item_type;
873 ad->itc_pslist_2line_2icon->func.state_get = __search_gl_state_get;
874 ad->itc_pslist_2line_2icon->func.del = __search_gl_del;
877 if (ad->itc_grouptitle == NULL) {
878 ad->itc_grouptitle = elm_genlist_item_class_new();
879 ad->itc_grouptitle->item_style = "grouptitle";
880 ad->itc_grouptitle->func.text_get = __search_gl_label_get_group;
881 ad->itc_grouptitle->func.state_get = __search_gl_state_get;
882 ad->itc_grouptitle->func.del = __search_gl_del_grouptitle;
885 if (ad->itc_label == NULL) {
886 ad->itc_label = elm_genlist_item_class_new();
887 ad->itc_label->item_style = "grouptitle";
888 ad->itc_label->func.text_get = __search_gl_label_get_normal_type;
889 ad->itc_label->func.state_get = __search_gl_state_get;
890 ad->itc_label->func.del = __search_gl_del_grouptitle;
893 if (ad->itc_listmore == NULL) {
894 ad->itc_listmore = elm_genlist_item_class_new();
895 ad->itc_listmore->item_style = "1text.2";
896 ad->itc_listmore->func.text_get = __search_gl_label_get_more;
897 ad->itc_listmore->func.state_get = __search_gl_state_get;
898 ad->itc_listmore->func.del = __search_gl_del_more_button;
901 ad->search_gl = NULL;
903 genlist = elm_genlist_add(ad->navi_bar);
905 // To use multiline textblock/entry/editfield in genlist, set height_for_width mode
906 // then the item's height is calculated while the item's width fits to genlist width.
907 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
908 elm_genlist_tree_effect_enabled_set(genlist, EINA_TRUE);
910 ad->search_gl = genlist;
912 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND,
914 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL,
919 void search_result_gl_deinit(void *data)
923 struct appdata *ad = (struct appdata *)data;
925 ecore_pipe_del(ad->pipe);
926 eina_condition_free(&ad->condition);
927 eina_lock_free(&ad->mutex);
929 if (ad->itc_pslist_1line != NULL)
930 elm_genlist_item_class_free(ad->itc_pslist_1line);
932 if (ad->itc_pslist_1line_1icon != NULL)
933 elm_genlist_item_class_free(ad->itc_pslist_1line_1icon);
935 if (ad->itc_pslist_1line_2icon != NULL)
936 elm_genlist_item_class_free(ad->itc_pslist_2line_1icon);
938 if (ad->itc_pslist_2line_1icon != NULL)
939 elm_genlist_item_class_free(ad->itc_pslist_2line_1icon);
941 if (ad->itc_pslist_2line_2icon != NULL)
942 elm_genlist_item_class_free(ad->itc_pslist_2line_2icon);
944 if (ad->itc_grouptitle != NULL)
945 elm_genlist_item_class_free(ad->itc_grouptitle);
947 if (ad->itc_label != NULL)
948 elm_genlist_item_class_free(ad->itc_label);
950 if (ad->itc_listmore != NULL)
951 elm_genlist_item_class_free(ad->itc_listmore);
957 void search_gl_result_more_item_append_cb(void *data, Evas_Object * obj,
962 struct appdata *ad = (struct appdata *)data;
963 Elm_Object_Item *it = (Elm_Object_Item *) event_info;
964 struct search_pipe_data *pdata = NULL;
965 struct search_genlist_info *result_info = NULL;
966 struct search_item_more_sel *sel_more =
967 (search_item_more_sel *)elm_object_item_data_get(it);
969 struct search_content_object *content_obj = sel_more->obj;
970 int offset = content_obj->mr_info.next_point;
971 int ret = SEARCH_RET_SEARCH_NONE;
973 elm_object_item_del(it);
975 result_info = (struct search_genlist_info *)calloc(1, sizeof(struct search_genlist_info));
976 ret = __search_gl_set_phone_search_result(content_obj,
982 pdata = (struct search_pipe_data *)calloc(1,sizeof(struct search_pipe_data));
983 pdata->cmd = SEARCH_PIPE_CMD_ADD_GENLIST_PHONE;
985 pdata->result_list = result_info;
986 pdata->search_ret = ret;
987 ecore_pipe_write(ad->pipe, &pdata, sizeof(struct search_pipe_data));
989 pdata = (struct search_pipe_data *)calloc(1,sizeof(struct search_pipe_data));
990 pdata->cmd = SEARCH_PIPE_CMD_SET_LAYOUT;
991 pdata->search_ret = ret;
992 ecore_pipe_write(ad->pipe, &pdata, sizeof(struct search_pipe_data));
997 void search_set_result_list(void *data)
999 struct appdata *ad = (struct appdata *)data;
1000 int category = ad->search_category;
1002 bool is_input_keyword = false;
1003 struct search_pipe_data *pipe_data = NULL;
1006 search_stop_search(ad);
1008 text = elm_entry_markup_to_utf8(elm_object_text_get(ad->search_entry));
1009 SEARCH_FREE(ad->not_markup_search_word);
1010 SEARCH_FREE(ad->search_word);
1012 if((text) && (strlen(text) > 0)) {
1013 ad->not_markup_search_word = strdup(elm_object_text_get(ad->search_entry));
1014 ad->search_word = text;
1015 is_input_keyword = true;
1016 } else if ( category == SEARCH_CATE_PHONE) {
1017 pipe_data = (struct search_pipe_data *)calloc(1, sizeof(struct search_pipe_data));
1018 pipe_data->cmd = SEARCH_PIPE_CMD_SET_LAYOUT;
1019 pipe_data->search_ret = SEARCH_RET_SEARCH_NONE;
1020 ecore_pipe_write(ad->pipe, &pipe_data, sizeof(struct search_pipe_data));
1024 /* If category is Phone, make a thread for search */
1025 pipe_data = (struct search_pipe_data *)calloc(1, sizeof(struct search_pipe_data));
1026 pipe_data->cmd = SEARCH_PIPE_CMD_CLEAR_GENLIST;
1027 ecore_pipe_write(ad->pipe, &pipe_data, sizeof(struct search_pipe_data));
1030 case SEARCH_CATE_PHONE:
1031 ad->search_thread = search_make_result_thread(ad);
1036 void search_layout_set_search_list(void* data)
1040 struct appdata *ad = (struct appdata *)data;
1042 if (elm_object_part_content_get(ad->result_layout,"list_noresult")) {
1043 elm_object_part_content_unset(ad->result_layout,"list_noresult");
1044 evas_object_hide(ad->noresult_view);
1046 if (ad->search_gl) {
1047 elm_object_part_content_set(ad->result_layout, "list", ad->search_gl);
1048 evas_object_show(ad->search_gl);
1053 elm_genlist_item_show(elm_genlist_first_item_get(ad->search_gl), ELM_GENLIST_ITEM_SCROLLTO_TOP);
1059 void search_layout_set_search_no_result(void* data)
1063 struct appdata *ad = (struct appdata *)data;
1065 if (elm_object_part_content_get(ad->result_layout, "list")) {
1066 elm_object_part_content_unset(ad->result_layout, "list");
1069 evas_object_hide(ad->search_gl);
1071 elm_object_part_content_set(ad->result_layout,"list_noresult", ad->noresult_view);
1072 evas_object_show(ad->noresult_view);
1080 int search_layout_get_content_list_set_status(void* data)
1084 struct appdata *ad = (struct appdata *)data;
1087 if (elm_object_part_content_get(ad->result_layout, "list")) {
1088 ret = SEARCH_RET_SUCCESS;
1090 ret = SEARCH_RET_FAIL;