summaryrefslogtreecommitdiff
path: root/home/src/noti_broker.c
diff options
context:
space:
mode:
Diffstat (limited to 'home/src/noti_broker.c')
-rwxr-xr-xhome/src/noti_broker.c665
1 files changed, 665 insertions, 0 deletions
diff --git a/home/src/noti_broker.c b/home/src/noti_broker.c
new file mode 100755
index 0000000..56667b9
--- /dev/null
+++ b/home/src/noti_broker.c
@@ -0,0 +1,665 @@
+/*
+ * Samsung API
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Flora License, Version 1.1 (the License);
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://floralicense.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 <Elementary.h>
+#include <Evas.h>
+#include <dlfcn.h>
+#include <bundle.h>
+#include <efl_assist.h>
+#include <dlog.h>
+
+#include "conf.h"
+#include "layout.h"
+#include "log.h"
+#include "util.h"
+#include "main.h"
+#include "page_info.h"
+#include "scroller_info.h"
+#include "scroller.h"
+#include "page.h"
+#include "key.h"
+#include "tutorial.h"
+#include "noti_broker.h"
+#include "apps/apps_main.h"
+#include "critical_log.h"
+
+#define NOTI_BROKER_ERROR_NONE 0
+#define NOTI_BROKER_ERROR_FAIL -1
+#define NOTI_BROKER_PLUGIN_PATH "/usr/lib/libnoti-sample.so"
+
+/*
+ * Events, To notify events to plugin
+ */
+const int EVENT_SOURCE_SCROLLER = 0x00000000;
+const int EVENT_SOURCE_VIEW = 0x00000001;
+const int EVENT_SOURCE_EDITING = 0x00000002;
+
+const int EVENT_RET_NONE = 0x00000000;
+const int EVENT_RET_CONTINUE = 0x00000004;
+const int EVENT_RET_STOP = 0x00000008;
+
+#define EVENT_TYPE_ANIM 0x00000000
+const int EVENT_TYPE_ANIM_START = EVENT_TYPE_ANIM | 0x0;
+const int EVENT_TYPE_ANIM_STOP = EVENT_TYPE_ANIM | 0x1;
+#define EVENT_TYPE_DRAG 0x00001000
+const int EVENT_TYPE_DRAG_START = EVENT_TYPE_DRAG | 0x0;
+const int EVENT_TYPE_DRAG_STOP = EVENT_TYPE_DRAG | 0x1;
+#define EVENT_TYPE_EDGE 0x00002000
+const int EVENT_TYPE_EDGE_LEFT = EVENT_TYPE_EDGE | 0x0;
+const int EVENT_TYPE_EDGE_RIGHT = EVENT_TYPE_EDGE | 0x1;
+#define EVENT_TYPE_EDIT 0x00004000
+const int EVENT_TYPE_EDIT_START = EVENT_TYPE_EDIT | 0x0;
+const int EVENT_TYPE_EDIT_STOP = EVENT_TYPE_EDIT | 0x1;
+#define EVENT_TYPE_NOTI 0x00008000
+const int EVENT_TYPE_NOTI_DELETE = EVENT_TYPE_NOTI | 0x0;
+const int EVENT_TYPE_NOTI_DELETE_ALL = EVENT_TYPE_NOTI | 0x1;
+#define EVENT_TYPE_MOUSE 0x00010000
+const int EVENT_TYPE_MOUSE_DOWN = EVENT_TYPE_MOUSE | 0x0;
+const int EVENT_TYPE_MOUSE_UP = EVENT_TYPE_MOUSE | 0x1;
+#define EVENT_TYPE_SCROLL 0x00020000
+const int EVENT_TYPE_SCROLLING = EVENT_TYPE_SCROLL | 0x0;
+#define EVENT_TYPE_KEY 0x00040000
+const int EVENT_TYPE_KEY_BACK = EVENT_TYPE_KEY | 0x0;
+#define EVENT_TYPE_APPS 0x00080000
+const int EVENT_TYPE_APPS_SHOW = EVENT_TYPE_APPS | 0x0;
+const int EVENT_TYPE_APPS_HIDE = EVENT_TYPE_APPS | 0x1;
+
+/*
+ * Categories, To discrete views
+ */
+const int CATEGORY_NOTIFICATION = 0x00000001;
+const int CATEGORY_DASHBOARD = 0x00000002;
+
+/*
+ * Functions, To handle requests from plugin
+ */
+#define FUNCTION_DEF(X) const int X = E_##X
+#define FUNCTION_VAL(X) E_##X
+enum {
+ FUNCTION_VAL(FUNCTION_NONE) = 0x0,
+ FUNCTION_VAL(FUNCTION_PAGE_CREATE) = 0x00000001,
+ FUNCTION_VAL(FUNCTION_PAGE_DESTROY) = 0x00000002,
+ FUNCTION_VAL(FUNCTION_PAGE_ADD) = 0x00000004,
+ FUNCTION_VAL(FUNCTION_PAGE_REMOVE) = 0x00000008,
+ FUNCTION_VAL(FUNCTION_PAGE_SHOW) = 0x00000010,
+ FUNCTION_VAL(FUNCTION_PAGE_RELOAD) = 0x00000020,
+ FUNCTION_VAL(FUNCTION_PAGE_ITEM_SET) = 0x00000040,
+ FUNCTION_VAL(FUNCTION_PAGE_ITEM_GET) = 0x00000080,
+ FUNCTION_VAL(FUNCTION_SCROLLER_LEFT_PAGE_GET) = 0x00000100,
+ FUNCTION_VAL(FUNCTION_SCROLLER_RIGHT_PAGE_GET) = 0x00000200,
+ FUNCTION_VAL(FUNCTION_SCROLLER_FOCUSED_PAGE_GET) = 0x00000400,
+ FUNCTION_VAL(FUNCTION_WINDOW_ACTIVATE) = 0x00000800,
+ FUNCTION_VAL(FUNCTION_WINDOW_GET) = 0x00001000,
+ FUNCTION_VAL(FUNCTION_PAGE_SHOW_NO_DELAY) = 0x00002000,
+ FUNCTION_VAL(FUNCTION_PAGE_FOCUS_OBJECT_GET) = 0x00004000,
+ FUNCTION_VAL(FUNCTION_PAGE_REORDER) = 0x00008000,
+};
+FUNCTION_DEF(FUNCTION_NONE);
+FUNCTION_DEF(FUNCTION_PAGE_CREATE);
+FUNCTION_DEF(FUNCTION_PAGE_DESTROY);
+FUNCTION_DEF(FUNCTION_PAGE_ADD);
+FUNCTION_DEF(FUNCTION_PAGE_REMOVE);
+FUNCTION_DEF(FUNCTION_PAGE_SHOW);
+FUNCTION_DEF(FUNCTION_PAGE_SHOW_NO_DELAY);
+FUNCTION_DEF(FUNCTION_PAGE_RELOAD);
+FUNCTION_DEF(FUNCTION_PAGE_REORDER);
+FUNCTION_DEF(FUNCTION_PAGE_ITEM_SET);
+FUNCTION_DEF(FUNCTION_PAGE_ITEM_GET);
+FUNCTION_DEF(FUNCTION_PAGE_FOCUS_OBJECT_GET);
+FUNCTION_DEF(FUNCTION_SCROLLER_LEFT_PAGE_GET);
+FUNCTION_DEF(FUNCTION_SCROLLER_RIGHT_PAGE_GET);
+FUNCTION_DEF(FUNCTION_SCROLLER_FOCUSED_PAGE_GET);
+FUNCTION_DEF(FUNCTION_WINDOW_ACTIVATE);
+FUNCTION_DEF(FUNCTION_WINDOW_GET);
+
+
+struct broker_function {
+ int function;
+ int (*process) (const char *id, int category, void *view, void *data, void *result);
+};
+
+typedef struct _Noti_Broker_Plugin_Handler {
+ int (*init) (void *parent, void *data);
+ int (*fini) (void);
+ int (*event) (int source, int event, void *data);
+} Noti_Broker_Plugin_Handler;
+
+static struct _s_info {
+ int is_loaded;
+ int is_initialized;
+ void *dl_handler;
+ Noti_Broker_Plugin_Handler handle;
+} s_info = {
+ .is_loaded = 0,
+ .is_initialized = 0,
+ .dl_handler = NULL,
+ .handle = {NULL,NULL,NULL},
+};
+
+static Evas_Object *_layout_get(void)
+{
+ Evas_Object *win = main_get_info()->win;
+ retv_if(win == NULL, NULL);
+
+ return evas_object_data_get(win, DATA_KEY_LAYOUT);
+}
+
+static Evas_Object *_scroller_get(void)
+{
+ Evas_Object *win = main_get_info()->win;
+ Evas_Object *layout = NULL;
+ Evas_Object *scroller = NULL;
+
+ if (win != NULL) {
+ layout = evas_object_data_get(win, DATA_KEY_LAYOUT);
+ if (layout != NULL) {
+ scroller = elm_object_part_content_get(layout, "scroller");
+ }
+ }
+
+ return scroller;
+}
+
+/*!
+ * To handle requests from plugin
+ */
+static int _handler_page_create(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *page = NULL;
+ Evas_Object *scroller = _scroller_get();
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ page_removable_e removable = PAGE_REMOVABLE_ON;
+
+ if (category == CATEGORY_DASHBOARD) {
+ removable = PAGE_REMOVABLE_OFF;
+ }
+
+ page = page_create(scroller
+ , (Evas_Object*)view
+ , NULL, NULL
+ , main_get_info()->root_w, main_get_info()->root_h
+ , PAGE_CHANGEABLE_BG_OFF, removable);
+ if (page != NULL && result != NULL) {
+ *((Evas_Object **)result) = page;
+ page_set_effect(page, page_effect_none, page_effect_none);
+
+ return NOTI_BROKER_ERROR_NONE;
+ }
+
+ return NOTI_BROKER_ERROR_FAIL;
+}
+
+static int _handler_page_destroy(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *page = view;
+
+ page_destroy(page);
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_page_add(const char *id, int category, void *view, void *data, void *result)
+{
+ int ret = W_HOME_ERROR_NONE;
+ Evas_Object *page = view;
+ Evas_Object *scroller = _scroller_get();;
+ retv_if(page == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ if (category == CATEGORY_NOTIFICATION) {
+ ret = scroller_push_page(scroller, page, SCROLLER_PUSH_TYPE_CENTER_LEFT);
+ } else if (category == CATEGORY_DASHBOARD) {
+ ret = scroller_push_page(scroller, page, SCROLLER_PUSH_TYPE_CENTER_NEIGHBOR_LEFT);
+ }
+
+ return (ret == W_HOME_ERROR_NONE) ? NOTI_BROKER_ERROR_NONE : NOTI_BROKER_ERROR_FAIL;
+}
+
+static int _handler_page_remove(const char *id, int category, void *view, void *data, void *result)
+{
+ int ret = NOTI_BROKER_ERROR_NONE;
+ Evas_Object *page = view;
+ Evas_Object *scroller = _scroller_get();
+ retv_if(page == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ if (scroller_pop_page(scroller, page) == NULL) {
+ _E("Failed to remove page(%p)", page);
+ ret = NOTI_BROKER_ERROR_FAIL;
+ }
+ evas_object_hide(page);
+
+ return ret;
+}
+
+static int _handler_page_show(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *page = view;
+ Evas_Object *scroller = _scroller_get();
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ if (tutorial_is_exist() == 1) {
+ _E("tutorial is exist, can't bring the page");
+ return NOTI_BROKER_ERROR_FAIL;
+ }
+
+ scroller_bring_in_page(scroller, page, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_ANIMATOR);
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_page_show_no_delay(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *page = view;
+ Evas_Object *scroller = _scroller_get();
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ scroller_bring_in_page(scroller, page, SCROLLER_FREEZE_OFF, SCROLLER_BRING_TYPE_INSTANT_SHOW);
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_page_reload(const char *id, int category, void *view, void *data, void *result)
+{
+ int ret = W_HOME_ERROR_NONE;
+ Evas_Object *page = view;
+ Evas_Object *scroller = _scroller_get();
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ if (category == CATEGORY_NOTIFICATION) {
+ ret = scroller_push_page(scroller, page, SCROLLER_PUSH_TYPE_CENTER_LEFT);
+ } else if (category == CATEGORY_DASHBOARD) {
+ if (scroller_pop_page(scroller, page) == NULL) {
+ _E("Failed to pop page(%p)", page);
+ }
+ ret = scroller_push_page(scroller, page, SCROLLER_PUSH_TYPE_CENTER_NEIGHBOR_LEFT);
+ }
+
+ return (ret == W_HOME_ERROR_NONE) ? NOTI_BROKER_ERROR_NONE : NOTI_BROKER_ERROR_FAIL;
+}
+
+static int _handler_page_reorder(const char *id, int category, void *view, void *data, void *result)
+{
+ Eina_List *list = data;
+ Evas_Object *scroller = _scroller_get();
+ retv_if(list == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ scroller_reorder_with_list(scroller, list, PAGE_DIRECTION_LEFT);
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_page_item_set(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *page = view;
+ Evas_Object *item = data;
+ retv_if(page == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(item == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ page_set_item(page, item);
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_page_item_get(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *page = view;
+ retv_if(page == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(result == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ *((Evas_Object **)result) = page_get_item(page);
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_page_focus_object_get(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *page = view;
+ page_info_s *page_info = NULL;
+ retv_if(page == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(result == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ page_info = evas_object_data_get(page, DATA_KEY_PAGE_INFO);
+ retv_if(page_info == NULL, NOTI_BROKER_ERROR_FAIL);
+ *((Evas_Object **)result) = page_info->focus;
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_scroller_left_page_get(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *page = view;
+ Evas_Object *scroller = _scroller_get();
+ retv_if(page == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(result == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ *((Evas_Object **)result) = scroller_get_left_page(scroller, page);
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_scroller_right_page_get(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *page = view;
+ Evas_Object *scroller = _scroller_get();
+ retv_if(page == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(result == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ *((Evas_Object **)result) = scroller_get_right_page(scroller, page);
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_scroller_focused_page_get(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *scroller = _scroller_get();
+ retv_if(scroller == NULL, NOTI_BROKER_ERROR_FAIL);
+ retv_if(result == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ *((Evas_Object **)result) = scroller_get_focused_page(scroller);
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_window_activate(const char *id, int category, void *view, void *data, void *result)
+{
+ Evas_Object *win = main_get_info()->win;
+ retv_if(win == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ if (tutorial_is_exist() == 1) {
+ _E("tutorial is exist, can't activate home window");
+ return NOTI_BROKER_ERROR_FAIL;
+ }
+
+ elm_win_activate(win);
+
+ if (apps_main_is_visible() == EINA_TRUE) {
+ apps_main_launch(APPS_LAUNCH_HIDE);
+ }
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+static int _handler_window_get(const char *id, int category, void *view, void *data, void *result)
+{
+ retv_if(result == NULL, NOTI_BROKER_ERROR_FAIL);
+
+ *((Evas_Object **)result) = main_get_info()->win;
+
+ return NOTI_BROKER_ERROR_NONE;
+}
+
+int noti_broker_request(int function, const char *id, int category, void *view, void *data, void *result)
+{
+ //do something
+ Evas_Object *scroller = _scroller_get();
+ retv_if(scroller == NULL, -1);
+
+ if (function == FUNCTION_PAGE_CREATE ||
+ function == FUNCTION_PAGE_DESTROY ||
+ function == FUNCTION_PAGE_ADD ||
+ function == FUNCTION_PAGE_REMOVE ||
+ function == FUNCTION_PAGE_SHOW ||
+ function == FUNCTION_PAGE_RELOAD ||
+ function == FUNCTION_PAGE_REORDER) {
+ _W("%x %s %d %p %p %p", function, id, category, view, data, result);
+ }
+
+ static struct broker_function fn_table[] = {
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_CREATE),
+ .process = _handler_page_create,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_DESTROY),
+ .process = _handler_page_destroy,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_ADD),
+ .process = _handler_page_add,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_REMOVE),
+ .process = _handler_page_remove,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_SHOW),
+ .process = _handler_page_show,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_RELOAD),
+ .process = _handler_page_reload,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_REORDER),
+ .process = _handler_page_reorder,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_ITEM_SET),
+ .process = _handler_page_item_set,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_ITEM_GET),
+ .process = _handler_page_item_get,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_SCROLLER_LEFT_PAGE_GET),
+ .process = _handler_scroller_left_page_get,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_SCROLLER_RIGHT_PAGE_GET),
+ .process = _handler_scroller_right_page_get,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_SCROLLER_FOCUSED_PAGE_GET),
+ .process = _handler_scroller_focused_page_get,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_WINDOW_ACTIVATE),
+ .process = _handler_window_activate,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_WINDOW_GET),
+ .process = _handler_window_get,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_SHOW_NO_DELAY),
+ .process = _handler_page_show_no_delay,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_PAGE_FOCUS_OBJECT_GET),
+ .process = _handler_page_focus_object_get,
+ },
+ {
+ .function = FUNCTION_VAL(FUNCTION_NONE),
+ .process = NULL,
+ },
+ };
+
+ int i = 0;
+ int ret = NOTI_BROKER_ERROR_NONE;
+ for (i = 0; fn_table[i].function != FUNCTION_VAL(FUNCTION_NONE); i++) {
+ if (function == fn_table[i].function && fn_table[i].process != NULL) {
+ ret = fn_table[i].process(id, category, view, data, result);
+ }
+ }
+
+ return ret;
+}
+
+static void _scroller_evas_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+ int event_type = (int)data;
+
+ noti_broker_event_fire_to_plugin(EVENT_SOURCE_SCROLLER, event_type, event_info);
+}
+
+static void _layout_smart_cb(void *data, Evas_Object *scroller, void *event_info)
+{
+ int event_type = (int)data;
+
+ noti_broker_event_fire_to_plugin(EVENT_SOURCE_VIEW, event_type, event_info);
+}
+
+static void _scroller_smart_cb(void *data, Evas_Object *scroller, void *event_info)
+{
+ int event_type = (int)data;
+
+ noti_broker_event_fire_to_plugin(EVENT_SOURCE_SCROLLER, event_type, event_info);
+}
+
+static key_cb_ret_e _noti_broker_back_cb(void *data)
+{
+ int ret = EVENT_RET_CONTINUE;
+ if (tutorial_is_exist() == 1) {
+ return KEY_CB_RET_CONTINUE;
+ }
+
+ ret = noti_broker_event_fire_to_plugin(EVENT_SOURCE_VIEW, EVENT_TYPE_KEY_BACK, NULL);
+ if (ret == EVENT_RET_STOP) {
+ _W("stop back key execution");
+ return KEY_CB_RET_STOP;
+ }
+
+ _W("continue the back key execution");
+ return KEY_CB_RET_CONTINUE;
+}
+
+static void _evas_object_events_register(Evas_Object *layout, Evas_Object *scroller)
+{
+ evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_DOWN, _scroller_evas_cb, (void*)EVENT_TYPE_MOUSE_DOWN);
+ evas_object_event_callback_add(scroller, EVAS_CALLBACK_MOUSE_UP, _scroller_evas_cb, (void*)EVENT_TYPE_MOUSE_UP);
+
+ evas_object_smart_callback_add(scroller, "scroll,anim,start", _scroller_smart_cb, (void*)EVENT_TYPE_ANIM_START);
+ evas_object_smart_callback_add(scroller, "scroll,anim,stop", _scroller_smart_cb, (void*)EVENT_TYPE_ANIM_STOP);
+ evas_object_smart_callback_add(scroller, "scroll,drag,start", _scroller_smart_cb, (void*)EVENT_TYPE_DRAG_START);
+ evas_object_smart_callback_add(scroller, "scroll,drag,stop", _scroller_smart_cb, (void*)EVENT_TYPE_DRAG_STOP);
+ evas_object_smart_callback_add(scroller, "edge,left", _scroller_smart_cb, (void*)EVENT_TYPE_EDGE_LEFT);
+ evas_object_smart_callback_add(scroller, "edge,right", _scroller_smart_cb, (void*)EVENT_TYPE_EDGE_RIGHT);
+ evas_object_smart_callback_add(scroller, "scroll", _scroller_smart_cb, (void*)EVENT_TYPE_SCROLL);
+
+ evas_object_smart_callback_add(layout, LAYOUT_SMART_SIGNAL_EDIT_ON,
+ _layout_smart_cb, (void *)EVENT_TYPE_EDIT_START);
+ evas_object_smart_callback_add(layout, LAYOUT_SMART_SIGNAL_EDIT_OFF,
+ _layout_smart_cb, (void *)EVENT_TYPE_EDIT_STOP);
+
+ key_register_cb(KEY_TYPE_BACK, _noti_broker_back_cb, NULL);
+}
+
+Eina_Bool _init_timeout_cb(void *data)
+{
+ if (s_info.is_initialized == 0) {
+ _W("noti broker isn't initialized");
+ noti_broker_init();
+ }
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+/*!
+ * constructor/deconstructor
+ */
+HAPI void noti_broker_load(void)
+{
+ char *errmsg = NULL;
+ void *dl_handle = NULL;
+
+ _W("loading noti broker plugin start");
+ dl_handle = dlopen(NOTI_BROKER_PLUGIN_PATH, RTLD_LOCAL | RTLD_NOW | RTLD_DEEPBIND);
+ _W("loading noti broker plugin done");
+
+ errmsg = dlerror();
+ if (errmsg) {
+ _E("dlerror(can be ignored): %s\n", errmsg);
+ CRITICAL_LOG("dlopen failed: %s\n", errmsg);
+ }
+ ret_if(dl_handle == NULL);
+
+ s_info.handle.init = dlsym(dl_handle, "noti_board_plugin_init");
+ if (s_info.handle.init == NULL) {
+ _E("Failed to find noti_board_plugin_init");
+ goto ERR;
+ }
+
+ s_info.handle.fini = dlsym(dl_handle, "noti_board_plugin_fini");
+ if (s_info.handle.fini == NULL) {
+ _E("Failed to find noti_board_plugin_fini");
+ goto ERR;
+ }
+
+ s_info.handle.event = dlsym(dl_handle, "noti_board_plugin_event");
+ if (s_info.handle.event == NULL) {
+ _E("Failed to find noti_board_plugin_event");
+ goto ERR;
+ }
+
+ s_info.is_loaded = 1;
+ s_info.dl_handler = dl_handle;
+
+ ecore_timer_add(10.0f, _init_timeout_cb, NULL);
+
+ return ;
+
+ERR:
+ if (dl_handle) dlclose(dl_handle);
+}
+
+HAPI void noti_broker_init(void)
+{
+ Evas_Object *layout = _layout_get();
+ Evas_Object *scroller = _scroller_get();
+ ret_if(s_info.is_loaded == 0);
+ ret_if(s_info.is_initialized == 1);
+ ret_if(layout == NULL);
+ ret_if(scroller == NULL);
+
+ s_info.is_initialized = 1;
+ s_info.handle.init(scroller, scroller);
+ _evas_object_events_register(layout, scroller);
+}
+
+HAPI void noti_broker_fini(void)
+{
+ ret_if(s_info.is_loaded == 0);
+ s_info.is_loaded = 0;
+
+ s_info.handle.fini();
+ s_info.is_initialized = 0;
+
+ if (s_info.dl_handler != NULL) {
+ dlclose(s_info.dl_handler);
+ }
+}
+
+/*!
+ * To notify events to plugin
+ */
+HAPI int noti_broker_event_fire_to_plugin(int source, int event, void *data)
+{
+ retv_if(s_info.is_loaded == 0, EVENT_RET_NONE);
+
+ if (event == EVENT_TYPE_APPS_SHOW ||
+ event == EVENT_TYPE_APPS_HIDE) {
+ _W("source:%d event:%x", source, event);
+ }
+
+ return s_info.handle.event(source, event, data);
+}