/* * Copyright 2012 Samsung Electronics Co., Ltd * * Licensed under the Flora License, Version 1.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.tizenopensource.org/license * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include #include #include "smartsearch.h" #include "search_bar.h" #include "ps_makeupviews.h" #include "ps_searcher.h" #include #include #include #include #include static int __search_app_terminate(void *data); static void __search_win_delete_cb(void *data, Evas_Object * obj, void *event_info) { SEARCH_FUNC_START; elm_exit(); SEARCH_FUNC_END; } static Eina_Bool __search_mousedown_event(void *data, int type, void *event) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; Ecore_Event_Mouse_Button *ev = (Ecore_Event_Mouse_Button *) event; ad->touch_x = ev->x; ad->touch_y = ev->y; return ECORE_CALLBACK_CANCEL; } static Eina_Bool __search_keydown_event(void *data, int type, void *event) { SEARCH_FUNC_START; Ecore_Event_Key *ev = (Ecore_Event_Key *) event; if (!SEARCH_STRCMP(ev->keyname, KEY_END)) { //end key concept is close. elm_exit(); } SEARCH_FUNC_END; return EINA_FALSE; } static Evas_Object *__search_create_layout_main(Evas_Object * parent) { SEARCH_FUNC_START; Evas_Object *layout; Evas_Object *bg; SEARCH_RETV_IF(parent == NULL, NULL); layout = elm_layout_add(parent); SEARCH_RETV_IF(layout == NULL, NULL); //elm_layout_theme_set(layout, "standard", "window", "integration"); elm_layout_theme_set(layout, "layout", "application", "default"); evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(layout, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_win_resize_object_add(parent, layout); bg = elm_bg_add(parent); evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); elm_win_resize_object_add(parent, bg); elm_object_part_content_set(layout, "elm.swallow.bg", bg); evas_object_show(bg); edje_object_signal_emit(_EDJ(layout), "elm,state,show,indicator","elm"); edje_object_signal_emit(_EDJ(layout), "elm,state,show,content", "elm"); evas_object_show(layout); SEARCH_FUNC_END; return layout; } static Evas_Object *__search_create_navigation_layout(Evas_Object * parent) { SEARCH_FUNC_START; Evas_Object *navi_bar; //, *sd; SEARCH_RETV_IF(parent == NULL, NULL); navi_bar = elm_naviframe_add(parent); elm_object_part_content_set(parent, "elm.swallow.content", navi_bar); evas_object_show(navi_bar); SEARCH_FUNC_END; return navi_bar; } static void __search_back_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; elm_win_lower(ad->win_main); if(ad->back_btn_type == BACK_BTN_TYPE_CLOSE) elm_exit(); SEARCH_FUNC_END; } static void __search_add_back_btn(struct appdata *ad) { SEARCH_FUNC_START; Elm_Object_Item *navi_it; /* add back key */ Evas_Object *btn = elm_button_add(ad->navi_bar); elm_object_style_set(btn, "naviframe/end_btn/default"); evas_object_smart_callback_add(btn, "clicked", __search_back_btn_clicked_cb, ad); #ifdef __ENABLE_TOP_BACK_BTN navi_it = elm_naviframe_item_push(ad->navi_bar, dgettext("sys_string", "IDS_COM_BODY_SEARCH"), NULL, NULL, ad->sb_layout, NULL); elm_object_item_part_content_set(navi_it, "title_right_btn", btn); elm_object_item_signal_emit(navi_it, "elm,state,controlbar,close", ""); #else elm_naviframe_item_push(ad->navi_bar, dgettext("sys_string", "IDS_COM_BODY_SEARCH"), btn, NULL, ad->sb_layout, NULL); #endif ad->back_btn = btn; SEARCH_FUNC_END; } static int __search_init_smartsearch(struct appdata *ad) { SEARCH_FUNC_START; SEARCH_RETV_IF(ad == NULL, -1); // Base Layout ad->layout_main = __search_create_layout_main(ad->win_main); SEARCH_RETV_IF(ad->layout_main == NULL, -1); // Indicator elm_win_indicator_mode_set(ad->win_main, ELM_WIN_INDICATOR_SHOW); // Navigation Bar ad->navi_bar = __search_create_navigation_layout(ad->layout_main); search_result_gl_init(ad); search_searchbar_cb(ad, NULL, NULL); __search_add_back_btn(ad); SEARCH_FUNC_END; return 0; } static int __search_deinit_smartsearch(struct appdata *ad) { SEARCH_FUNC_START; SEARCH_RETV_IF(ad == NULL, -1); search_result_gl_deinit(ad); SEARCH_FUNC_END; return 0; } static Evas_Object *__search_create_win(const char *name) { SEARCH_FUNC_START; Evas_Object *eo; int w, h; eo = elm_win_add(NULL, name, ELM_WIN_BASIC); if (eo) { elm_win_title_set(eo, name); elm_win_borderless_set(eo, EINA_TRUE); evas_object_smart_callback_add(eo, "delete,request", __search_win_delete_cb, NULL); ecore_x_window_size_get(ecore_x_window_root_first_get(), &w, &h); evas_object_resize(eo, w, h); } SEARCH_FUNC_END; return eo; } static int __search_init_app_connect(struct appdata *ad) { SEARCH_FUNC_START; int rc = 0, conn_ret = 0, type = 0; char sql_query[DB_QUERY_LEN] = { 0, }; int ret = SEARCH_RET_SUCCESS; for (type = 0; type < PHONE_CATEGORY_LIST_CNT; type++) { switch(type) { case SEARCH_TYPE_PHONE_CONTACTS: { rc = contacts_svc_connect(); if (rc != CTS_SUCCESS) { SEARCH_DEBUG_WARNING ("contacts svc connect fail : %d", rc); } } break; case SEARCH_TYPE_PHONE_MSG: { MSG_ERROR_T err = MSG_SUCCESS; err = msg_open_msg_handle(&ad->msg_handle); if (err != MSG_SUCCESS) { SEARCH_DEBUG_WARNING("msg_open_msg_handle error : %d", err); ad->msg_handle = NULL; } } break; case SEARCH_TYPE_PHONE_EMAIL: break; /* IMAGE, MUSIC, VIDEO use common handle */ case SEARCH_TYPE_PHONE_IMAGES: case SEARCH_TYPE_PHONE_MUSIC: case SEARCH_TYPE_PHONE_VIDEO: if( ad->media_handle == NULL ) { conn_ret = media_svc_connect(&ad->media_handle); if(conn_ret < 0) { SEARCH_DEBUG_WARNING("media_svc_connect failed : %d\n", conn_ret); ad->media_handle = NULL; } } break; case SEARCH_TYPE_PHONE_CALENDAR: { rc = calendar_svc_connect(); if (rc != CAL_SUCCESS) { SEARCH_DEBUG_WARNING ("calendar svc connect fail : %d", rc); } } break; case SEARCH_TYPE_PHONE_MEMO: { rc = memo_init(NULL); if (rc == -1) { SEARCH_DEBUG_WARNING ("memo svc connect fail : %d", rc); } } break; } } SEARCH_FUNC_END; return ret; } static int __search_deinit_app_disconnect(void *data) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; int rc = 0, conn_ret = 0, type = 0; for (type = 0; type < PHONE_CATEGORY_LIST_CNT; type++) { switch (type) { case SEARCH_TYPE_PHONE_CONTACTS: { rc = contacts_svc_disconnect(); if (rc != CTS_SUCCESS) { SEARCH_DEBUG_WARNING ("contacts svc disconnect fail : %d", rc); } } break; case SEARCH_TYPE_PHONE_MSG: { MSG_ERROR_T err = MSG_SUCCESS; err = msg_close_msg_handle(&ad->msg_handle); if (err != MSG_SUCCESS) { SEARCH_DEBUG_WARNING("msg_close_msg_handle error : %d", err); } ad->msg_handle = NULL; } break; case SEARCH_TYPE_PHONE_EMAIL: break; case SEARCH_TYPE_PHONE_IMAGES: case SEARCH_TYPE_PHONE_MUSIC: case SEARCH_TYPE_PHONE_VIDEO: { conn_ret = media_svc_disconnect(ad->media_handle); if(conn_ret < 0) { SEARCH_DEBUG_WARNING("media_svc_disconnect failed : %d\n", conn_ret); } ad->media_handle = NULL; } break; case SEARCH_TYPE_PHONE_CALENDAR: { rc = calendar_svc_close(); if (rc != CAL_SUCCESS) { SEARCH_DEBUG_WARNING ("calendar svc disconnect fail : %d", rc); } } break; case SEARCH_TYPE_PHONE_MEMO: { memo_fini(); } break; } } SEARCH_FUNC_END; return 0; } static Eina_Bool __search_init_after_ui_create(gpointer data) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; ecore_event_handler_add(ECORE_EVENT_KEY_DOWN, __search_keydown_event, ad); ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, __search_mousedown_event, ad); /* add system event callback */ appcore_set_event_callback(APPCORE_EVENT_REGION_CHANGE, search_util_date_time_format_init, NULL); UG_INIT_EFL(ad->win_main, UG_OPT_INDICATOR_ENABLE); SEARCH_FUNC_END; return ECORE_CALLBACK_CANCEL; } static int __search_app_create(void *data) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; appcore_set_i18n(SEARCH_PACKAGE, LOCALEDIR); ad->win_main = __search_create_win(SEARCH_PACKAGE); SEARCH_RETV_IF(ad->win_main == NULL, -1); evas_object_show(ad->win_main); ad->scale_factor = elm_config_scale_get(); __search_init_smartsearch(ad); search_util_date_time_format_init(NULL); __search_init_app_connect(ad); ad->idler_create_ui = ecore_idler_add(__search_init_after_ui_create, ad); SEARCH_FUNC_END; return 0; } static int __search_app_terminate(void *data) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; if (ad->layout_main) { evas_object_del(ad->layout_main); ad->layout_main = NULL; } if (ad->win_main) { evas_object_del(ad->win_main); ad->win_main = NULL; } if(ad->idler_create_ui) ecore_idler_del(ad->idler_create_ui); if(ad->idler_search) ecore_idler_del(ad->idler_search); __search_deinit_smartsearch(ad); __search_deinit_app_disconnect(ad); search_util_date_time_format_deinit(); SEARCH_FREE(ad->search_word); SEARCH_FREE(ad->not_markup_search_word); SEARCH_FUNC_END; return 0; } static int __search_app_pause(void *data) { SEARCH_FUNC_START; SEARCH_FUNC_END; return 0; } static int __search_app_resume(void *data) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; if (ad->win_main) { elm_object_focus_set(ad->back_btn, EINA_FALSE); } SEARCH_FUNC_END; return 0; } static int __search_app_reset(bundle * b, void *data) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; const char *query = NULL; const char *svcname = NULL; const char *category = NULL; char* keyword = NULL; Evas_Object *cate_icon; int ret; ad->back_btn_type = BACK_BTN_TYPE_LOWER; if (b == NULL) { keyword = vconf_get_str(SMARTSEARCH_KEY_KEYWORD); } else { svcname = appsvc_get_operation(b); if(svcname) { if(SEARCH_STRCMP(svcname, APPSVC_OPERATION_SEARCH) == 0) { query = appsvc_get_data(b, APPSVC_DATA_KEYWORD); } else { SEARCH_DEBUG_WARNING("wrong app service name : %s", svcname); } ad->back_btn_type = BACK_BTN_TYPE_CLOSE; } else { svcname = bundle_get_val(b, AUL_K_SERVICE_NAME); if(svcname) { if(SEARCH_STRCMP(svcname, SEARCH_SVC) == 0) { query = bundle_get_val(b, "query"); } else { SEARCH_DEBUG_WARNING("wrong aul service name : %s", svcname); } } } cate_icon = search_searchbar_category_icon_add(SEARCH_TYPE_PHONE, SEARCH_CATE_BTN_IMG_TYPE_UNPRESSED, ad->sb_layout); elm_object_content_set(ad->cate_btn, cate_icon); /* * keyword input param is only enabled for phone search * if there is no keyword input param, set latest search keyword for phone search */ if( (query) && (strlen(query) > 0) ) { keyword = (char*)malloc(strlen(query)+1); memset(keyword, 0x00, strlen(query)+1); strncpy(keyword, query, strlen(query)); } else { keyword = vconf_get_str(SMARTSEARCH_KEY_KEYWORD); } } if ((keyword) && (strlen(keyword) > 0)) { elm_object_text_set(ad->search_entry, keyword); } else { elm_object_text_set(ad->search_entry, ""); elm_object_signal_emit(ad->search_bar, "cancel,hide", ""); search_set_result_list(ad); /* set focus to entry for launching ime */ evas_object_show(ad->search_entry); elm_object_focus_set(ad->search_entry,EINA_TRUE); elm_object_signal_emit(ad->search_bar, "cancel,in", ""); } SEARCH_FREE(keyword); elm_entry_cursor_end_set(ad->search_entry); if (ad->win_main) elm_win_activate(ad->win_main); SEARCH_FUNC_END; return 0; } int main(int argc, char *argv[]) { SEARCH_FUNC_START; struct appdata ad; struct appcore_ops ops; int ret = 0; int i = 0; ops.create = &__search_app_create; ops.terminate = &__search_app_terminate; ops.pause = &__search_app_pause; ops.resume = &__search_app_resume; ops.reset = &__search_app_reset; memset(&ad, 0x0, sizeof(struct appdata)); ops.data = &ad; for (i = 0; i < argc; i++) SEARCH_DEBUG_LOG("argv[%d] = [%s]\n", i, argv[i]); ret = appcore_efl_main(SEARCH_PACKAGE, &argc, &argv, &ops); SEARCH_FUNC_END; return ret; }