summaryrefslogtreecommitdiff
path: root/src/smartsearch.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/smartsearch.cpp')
-rwxr-xr-xsrc/smartsearch.cpp605
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;
+}