#include <stdlib.h>
#include <stdbool.h>
#include <dlfcn.h>
+#include <glib.h>
#include <Elementary.h>
#include <vconf.h>
static int (*__vc_elm_initialize)(void);
static int (*__vc_elm_deinitialize)(void);
static int (*__vc_elm_set_auto_register_mode)(int, int);
+static GThread *__vc_elm_thread;
static void __unload_vc_elm(void)
{
static int __load_vc_elm(void)
{
- if (__vc_elm_handle)
+ _DBG("Load voice-control-elm");
+
+ if (__vc_elm_handle) {
+ _DBG("Already exists");
return 0;
+ }
if (access(PATH_LIB_VC_ELM, F_OK) != 0) {
_ERR("Failed to access %s", PATH_LIB_VC_ELM);
return -1;
}
- __vc_elm_handle = dlopen(PATH_LIB_VC_ELM, RTLD_LAZY | RTLD_GLOBAL);
+ __vc_elm_handle = dlopen(PATH_LIB_VC_ELM, RTLD_LAZY | RTLD_LOCAL);
if (!__vc_elm_handle) {
_ERR("Failed to open %s", PATH_LIB_VC_ELM);
return -1;
static void __vc_elm_init(void)
{
int vt_automode = 0;
- int r;
-
- r = __load_vc_elm();
- if (r < 0)
- return;
vconf_notify_key_changed(VCONFKEY_VC_VOICE_TOUCH_AUTOMODE,
__vc_vtauto_changed_cb, NULL);
__vc_elm_deinitialize();
__vc_elm_initialized = false;
}
+}
+
+static gboolean __init_vc_elm(gpointer data)
+{
+ _DBG("Initialize vc-elm");
+ /* Postpone initialization to improve app launching performance */
+ /* VC voice touch setting */
+ __vc_elm_init();
- __unload_vc_elm();
+ return G_SOURCE_REMOVE;
+}
+
+static gpointer __vc_elm_loader(gpointer data)
+{
+ int r = 0;
+ int retry_count = 3;
+
+ do {
+ r = __load_vc_elm();
+ if (r == 0) {
+ g_idle_add(__init_vc_elm, NULL);
+ break;
+ }
+ } while (retry_count--);
+ LOGW("[vc-elm-loader] Result: %d", r);
+
+ return GINT_TO_POINTER(r);
}
static void __efl_app_init(int argc, char **argv, void *data)
}
}
- /* VC voice touch setting */
- __vc_elm_init();
+ __vc_elm_thread = g_thread_new("vc-elm-loader", __vc_elm_loader, NULL);
}
static void __efl_app_finish(void)
{
+ gpointer r;
+
__vc_elm_finish();
+ if (__vc_elm_thread) {
+ r = g_thread_join(__vc_elm_thread);
+ __vc_elm_thread = NULL;
+ _DBG("vc-elm-loader. result(%d)", GPOINTER_TO_INT(r));
+ }
elm_shutdown();
elm_exit();
}
+static void __efl_app_trim_memory(void *data)
+{
+ _DBG("Trim memory");
+ elm_cache_all_flush();
+ appcore_base_on_trim_memory();
+}
+
EXPORT_API int appcore_efl_base_init(appcore_efl_base_ops ops, int argc,
char **argv, void *data, unsigned int hint)
{
ops.ui_base.base.finish = __efl_app_finish;
ops.ui_base.base.run = __efl_app_run;
ops.ui_base.base.exit = __efl_app_exit;
+ ops.ui_base.base.trim_memory = __efl_app_trim_memory;
return ops;
}
return appcore_ui_base_on_control(b);
}
+EXPORT_API int appcore_efl_base_on_trim_memory(void)
+{
+ return appcore_ui_base_on_trim_memory();
+}
+
EXPORT_API void appcore_efl_base_window_on_show(int type, void *event)
{
appcore_ui_base_window_on_show(type, event);
appcore_ui_base_window_on_visibility(type, event);
}
+EXPORT_API void appcore_efl_base_window_on_pre_visibility(int type, void *event)
+{
+ appcore_ui_base_window_on_pre_visibility(type, event);
+}
+
+EXPORT_API void appcore_efl_base_window_on_aux_message(int type, void *event)
+{
+ appcore_ui_base_window_on_aux_message(type, event);
+}
+
EXPORT_API void appcore_efl_base_pause(void)
{
appcore_ui_base_pause();
{
appcore_ui_base_set_bg_state(bg_state);
}
+
+EXPORT_API void appcore_efl_base_set_system_resource_reclaiming(bool enable)
+{
+ appcore_ui_base_set_system_resource_reclaiming(enable);
+}