diff options
Diffstat (limited to 'src/smartsearch.cpp')
-rwxr-xr-x | src/smartsearch.cpp | 605 |
1 files changed, 605 insertions, 0 deletions
diff --git a/src/smartsearch.cpp b/src/smartsearch.cpp new file mode 100755 index 0000000..f37725e --- /dev/null +++ b/src/smartsearch.cpp @@ -0,0 +1,605 @@ +/* + * 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 <stdio.h> +#include <utilX.h> +#include <ui-gadget.h> + +#include "smartsearch.h" +#include "search_bar.h" +#include "ps_makeupviews.h" +#include "ps_searcher.h" + +#include <contacts-svc.h> +#include <calendar-svc-provider.h> +#include <memo-db.h> +#include <appsvc.h> +#include <aul_service.h> + +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; +} |