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.
24 #include <ui-gadget.h>
26 #include "smartsearch.h"
27 #include "search_bar.h"
28 #include "ps_makeupviews.h"
29 #include "ps_searcher.h"
31 #include <contacts-svc.h>
32 #include <calendar-svc-provider.h>
35 #include <aul_service.h>
37 static int __search_app_terminate(void *data);
39 static void __search_win_delete_cb(void *data, Evas_Object * obj,
49 static Eina_Bool __search_mousedown_event(void *data, int type, void *event)
53 struct appdata *ad = (struct appdata *)data;
55 Ecore_Event_Mouse_Button *ev = (Ecore_Event_Mouse_Button *) event;
58 return ECORE_CALLBACK_CANCEL;
62 static Eina_Bool __search_keydown_event(void *data, int type, void *event)
66 Ecore_Event_Key *ev = (Ecore_Event_Key *) event;
68 if (!SEARCH_STRCMP(ev->keyname, KEY_END)) {
69 //end key concept is close.
78 static Evas_Object *__search_create_layout_main(Evas_Object * parent)
85 SEARCH_RETV_IF(parent == NULL, NULL);
87 layout = elm_layout_add(parent);
89 SEARCH_RETV_IF(layout == NULL, NULL);
91 //elm_layout_theme_set(layout, "standard", "window", "integration");
92 elm_layout_theme_set(layout, "layout", "application", "default");
94 evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
95 evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL);
96 elm_win_resize_object_add(parent, layout);
98 bg = elm_bg_add(parent);
99 evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
100 elm_win_resize_object_add(parent, bg);
101 elm_object_part_content_set(layout, "elm.swallow.bg", bg);
103 evas_object_show(bg);
105 edje_object_signal_emit(_EDJ(layout), "elm,state,show,indicator","elm");
106 edje_object_signal_emit(_EDJ(layout), "elm,state,show,content", "elm");
107 evas_object_show(layout);
114 static Evas_Object *__search_create_navigation_layout(Evas_Object * parent)
118 Evas_Object *navi_bar; //, *sd;
120 SEARCH_RETV_IF(parent == NULL, NULL);
122 navi_bar = elm_naviframe_add(parent);
124 elm_object_part_content_set(parent, "elm.swallow.content", navi_bar);
126 evas_object_show(navi_bar);
133 static void __search_back_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
137 struct appdata *ad = (struct appdata *)data;
139 elm_win_lower(ad->win_main);
141 if(ad->back_btn_type == BACK_BTN_TYPE_CLOSE)
147 static void __search_add_back_btn(struct appdata *ad)
151 Elm_Object_Item *navi_it;
154 Evas_Object *btn = elm_button_add(ad->navi_bar);
155 elm_object_style_set(btn, "naviframe/end_btn/default");
156 evas_object_smart_callback_add(btn, "clicked", __search_back_btn_clicked_cb, ad);
158 #ifdef __ENABLE_TOP_BACK_BTN
159 navi_it = elm_naviframe_item_push(ad->navi_bar,
160 dgettext("sys_string", "IDS_COM_BODY_SEARCH"),
161 NULL, NULL, ad->sb_layout, NULL);
163 elm_object_item_part_content_set(navi_it, "title_right_btn", btn);
164 elm_object_item_signal_emit(navi_it, "elm,state,controlbar,close", "");
166 elm_naviframe_item_push(ad->navi_bar,
167 dgettext("sys_string", "IDS_COM_BODY_SEARCH"),
168 btn, NULL, ad->sb_layout, NULL);
176 static int __search_init_smartsearch(struct appdata *ad)
180 SEARCH_RETV_IF(ad == NULL, -1);
183 ad->layout_main = __search_create_layout_main(ad->win_main);
184 SEARCH_RETV_IF(ad->layout_main == NULL, -1);
187 elm_win_indicator_mode_set(ad->win_main, ELM_WIN_INDICATOR_SHOW);
190 ad->navi_bar = __search_create_navigation_layout(ad->layout_main);
192 search_result_gl_init(ad);
194 search_searchbar_cb(ad, NULL, NULL);
196 __search_add_back_btn(ad);
202 static int __search_deinit_smartsearch(struct appdata *ad)
206 SEARCH_RETV_IF(ad == NULL, -1);
208 search_result_gl_deinit(ad);
215 static Evas_Object *__search_create_win(const char *name)
222 eo = elm_win_add(NULL, name, ELM_WIN_BASIC);
224 elm_win_title_set(eo, name);
225 elm_win_borderless_set(eo, EINA_TRUE);
226 evas_object_smart_callback_add(eo, "delete,request",
227 __search_win_delete_cb, NULL);
228 ecore_x_window_size_get(ecore_x_window_root_first_get(), &w,
230 evas_object_resize(eo, w, h);
238 static int __search_init_app_connect(struct appdata *ad)
242 int rc = 0, conn_ret = 0, type = 0;
243 char sql_query[DB_QUERY_LEN] = { 0, };
244 int ret = SEARCH_RET_SUCCESS;
246 for (type = 0; type < PHONE_CATEGORY_LIST_CNT; type++) {
250 case SEARCH_TYPE_PHONE_CONTACTS:
252 rc = contacts_svc_connect();
253 if (rc != CTS_SUCCESS) {
255 ("contacts svc connect fail : %d",
261 case SEARCH_TYPE_PHONE_MSG:
263 MSG_ERROR_T err = MSG_SUCCESS;
264 err = msg_open_msg_handle(&ad->msg_handle);
266 if (err != MSG_SUCCESS) {
267 SEARCH_DEBUG_WARNING("msg_open_msg_handle error : %d", err);
268 ad->msg_handle = NULL;
272 case SEARCH_TYPE_PHONE_EMAIL:
275 /* IMAGE, MUSIC, VIDEO use common handle */
276 case SEARCH_TYPE_PHONE_IMAGES:
277 case SEARCH_TYPE_PHONE_MUSIC:
278 case SEARCH_TYPE_PHONE_VIDEO:
279 if( ad->media_handle == NULL ) {
280 conn_ret = media_svc_connect(&ad->media_handle);
282 SEARCH_DEBUG_WARNING("media_svc_connect failed : %d\n", conn_ret);
283 ad->media_handle = NULL;
287 case SEARCH_TYPE_PHONE_CALENDAR:
289 rc = calendar_svc_connect();
290 if (rc != CAL_SUCCESS) {
292 ("calendar svc connect fail : %d",
297 case SEARCH_TYPE_PHONE_MEMO:
299 rc = memo_init(NULL);
302 ("memo svc connect fail : %d", rc);
314 static int __search_deinit_app_disconnect(void *data)
318 struct appdata *ad = (struct appdata *)data;
320 int rc = 0, conn_ret = 0, type = 0;
322 for (type = 0; type < PHONE_CATEGORY_LIST_CNT; type++) {
325 case SEARCH_TYPE_PHONE_CONTACTS:
327 rc = contacts_svc_disconnect();
328 if (rc != CTS_SUCCESS) {
330 ("contacts svc disconnect fail : %d",
335 case SEARCH_TYPE_PHONE_MSG:
337 MSG_ERROR_T err = MSG_SUCCESS;
338 err = msg_close_msg_handle(&ad->msg_handle);
340 if (err != MSG_SUCCESS) {
341 SEARCH_DEBUG_WARNING("msg_close_msg_handle error : %d", err);
344 ad->msg_handle = NULL;
347 case SEARCH_TYPE_PHONE_EMAIL:
349 case SEARCH_TYPE_PHONE_IMAGES:
350 case SEARCH_TYPE_PHONE_MUSIC:
351 case SEARCH_TYPE_PHONE_VIDEO:
353 conn_ret = media_svc_disconnect(ad->media_handle);
355 SEARCH_DEBUG_WARNING("media_svc_disconnect failed : %d\n", conn_ret);
357 ad->media_handle = NULL;
360 case SEARCH_TYPE_PHONE_CALENDAR:
362 rc = calendar_svc_close();
363 if (rc != CAL_SUCCESS) {
365 ("calendar svc disconnect fail : %d",
370 case SEARCH_TYPE_PHONE_MEMO:
383 static Eina_Bool __search_init_after_ui_create(gpointer data)
387 struct appdata *ad = (struct appdata *)data;
389 ecore_event_handler_add(ECORE_EVENT_KEY_DOWN,
390 __search_keydown_event,
393 ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN,
394 __search_mousedown_event,
397 /* add system event callback */
398 appcore_set_event_callback(APPCORE_EVENT_REGION_CHANGE,
399 search_util_date_time_format_init,
402 UG_INIT_EFL(ad->win_main, UG_OPT_INDICATOR_ENABLE);
406 return ECORE_CALLBACK_CANCEL;
409 static int __search_app_create(void *data)
413 struct appdata *ad = (struct appdata *)data;
415 appcore_set_i18n(SEARCH_PACKAGE, LOCALEDIR);
417 ad->win_main = __search_create_win(SEARCH_PACKAGE);
419 SEARCH_RETV_IF(ad->win_main == NULL, -1);
421 evas_object_show(ad->win_main);
423 ad->scale_factor = elm_config_scale_get();
425 __search_init_smartsearch(ad);
427 search_util_date_time_format_init(NULL);
429 __search_init_app_connect(ad);
431 ad->idler_create_ui = ecore_idler_add(__search_init_after_ui_create, ad);
438 static int __search_app_terminate(void *data)
442 struct appdata *ad = (struct appdata *)data;
444 if (ad->layout_main) {
445 evas_object_del(ad->layout_main);
446 ad->layout_main = NULL;
450 evas_object_del(ad->win_main);
454 if(ad->idler_create_ui)
455 ecore_idler_del(ad->idler_create_ui);
458 ecore_idler_del(ad->idler_search);
460 __search_deinit_smartsearch(ad);
462 __search_deinit_app_disconnect(ad);
464 search_util_date_time_format_deinit();
466 SEARCH_FREE(ad->search_word);
467 SEARCH_FREE(ad->not_markup_search_word);
474 static int __search_app_pause(void *data)
483 static int __search_app_resume(void *data)
487 struct appdata *ad = (struct appdata *)data;
490 elm_object_focus_set(ad->back_btn, EINA_FALSE);
497 static int __search_app_reset(bundle * b, void *data)
501 struct appdata *ad = (struct appdata *)data;
502 const char *query = NULL;
503 const char *svcname = NULL;
504 const char *category = NULL;
505 char* keyword = NULL;
507 Evas_Object *cate_icon;
510 ad->back_btn_type = BACK_BTN_TYPE_LOWER;
513 keyword = vconf_get_str(SMARTSEARCH_KEY_KEYWORD);
515 svcname = appsvc_get_operation(b);
517 if(SEARCH_STRCMP(svcname, APPSVC_OPERATION_SEARCH) == 0) {
518 query = appsvc_get_data(b, APPSVC_DATA_KEYWORD);
520 SEARCH_DEBUG_WARNING("wrong app service name : %s", svcname);
523 ad->back_btn_type = BACK_BTN_TYPE_CLOSE;
525 svcname = bundle_get_val(b, AUL_K_SERVICE_NAME);
528 if(SEARCH_STRCMP(svcname, SEARCH_SVC) == 0) {
529 query = bundle_get_val(b, "query");
531 SEARCH_DEBUG_WARNING("wrong aul service name : %s", svcname);
536 cate_icon = search_searchbar_category_icon_add(SEARCH_TYPE_PHONE, SEARCH_CATE_BTN_IMG_TYPE_UNPRESSED, ad->sb_layout);
537 elm_object_content_set(ad->cate_btn, cate_icon);
540 * keyword input param is only enabled for phone search
541 * if there is no keyword input param, set latest search keyword for phone search
543 if( (query) && (strlen(query) > 0) ) {
544 keyword = (char*)malloc(strlen(query)+1);
545 memset(keyword, 0x00, strlen(query)+1);
546 strncpy(keyword, query, strlen(query));
548 keyword = vconf_get_str(SMARTSEARCH_KEY_KEYWORD);
553 if ((keyword) && (strlen(keyword) > 0)) {
554 elm_object_text_set(ad->search_entry, keyword);
556 elm_object_text_set(ad->search_entry, "");
557 elm_object_signal_emit(ad->search_bar, "cancel,hide", "");
559 search_set_result_list(ad);
561 /* set focus to entry for launching ime */
562 evas_object_show(ad->search_entry);
563 elm_object_focus_set(ad->search_entry,EINA_TRUE);
564 elm_object_signal_emit(ad->search_bar, "cancel,in", "");
567 SEARCH_FREE(keyword);
569 elm_entry_cursor_end_set(ad->search_entry);
572 elm_win_activate(ad->win_main);
579 int main(int argc, char *argv[])
584 struct appcore_ops ops;
588 ops.create = &__search_app_create;
589 ops.terminate = &__search_app_terminate;
590 ops.pause = &__search_app_pause;
591 ops.resume = &__search_app_resume;
592 ops.reset = &__search_app_reset;
594 memset(&ad, 0x0, sizeof(struct appdata));
597 for (i = 0; i < argc; i++)
598 SEARCH_DEBUG_LOG("argv[%d] = [%s]\n", i, argv[i]);
600 ret = appcore_efl_main(SEARCH_PACKAGE, &argc, &argv, &ops);