Remove suspend timer when resuming app
[platform/core/appfw/app-core.git] / src / base / appcore_base.c
index e276926..a4b4f73 100644 (file)
@@ -67,6 +67,7 @@ typedef struct _appcore_base_event_node {
        int type;
        appcore_base_event_cb cb;
        void *data;
+       void *prev_event;
 } appcore_base_event_node;
 
 typedef struct _appcore_base_rotation {
@@ -129,6 +130,70 @@ appcore_base_tizen_profile_t appcore_base_get_tizen_profile(void)
        return profile;
 }
 
+static int __compare_event(void *prev_event, void *curr_event, int type)
+{
+       char *curr_strval;
+       char *prev_strval;
+       int curr_intval;
+       int prev_intval;
+       int ret = -1;
+
+       switch (type) {
+       case APPCORE_BASE_EVENT_LOW_MEMORY:
+       case APPCORE_BASE_EVENT_LOW_BATTERY:
+       case APPCORE_BASE_EVENT_DEVICE_ORIENTATION_CHANGED:
+       case APPCORE_BASE_EVENT_SUSPENDED_STATE_CHANGE:
+               prev_intval = GPOINTER_TO_INT(prev_event);
+               curr_intval = *(int *)curr_event;
+               if (prev_intval == curr_intval)
+                       ret = 0;
+               break;
+       case APPCORE_BASE_EVENT_LANG_CHANGE:
+       case APPCORE_BASE_EVENT_REGION_CHANGE:
+               prev_strval = prev_event;
+               curr_strval = curr_event;
+               if (prev_strval && curr_strval &&
+                               !strcmp(prev_strval, curr_strval))
+                       ret = 0;
+               break;
+       default:
+               break;
+       }
+
+       return ret;
+}
+
+static void __unset_prev_event(void **prev_event, int type)
+{
+       if (type == APPCORE_BASE_EVENT_LANG_CHANGE ||
+                       type == APPCORE_BASE_EVENT_REGION_CHANGE)
+               free(*prev_event);
+       *prev_event = NULL;
+}
+
+static void __set_prev_event(void **prev_event, void *curr_event, int type)
+{
+       int curr_intval;
+       char *curr_strval;
+
+       switch (type) {
+       case APPCORE_BASE_EVENT_LOW_MEMORY:
+       case APPCORE_BASE_EVENT_LOW_BATTERY:
+       case APPCORE_BASE_EVENT_DEVICE_ORIENTATION_CHANGED:
+       case APPCORE_BASE_EVENT_SUSPENDED_STATE_CHANGE:
+               curr_intval = *(int *)curr_event;
+               *prev_event = GINT_TO_POINTER(curr_intval);
+               break;
+       case APPCORE_BASE_EVENT_LANG_CHANGE:
+       case APPCORE_BASE_EVENT_REGION_CHANGE:
+               curr_strval = curr_event;
+               if (curr_strval)
+                       *prev_event = strdup(curr_strval);
+               break;
+       default:
+               break;
+       }
+}
 
 static void __invoke_callback(void *event, int type)
 {
@@ -136,10 +201,16 @@ static void __invoke_callback(void *event, int type)
 
        while (iter) {
                appcore_base_event_node *node = iter->data;
+               iter = g_list_next(iter);
 
-               if (node->type == type)
+               if (node->type != type)
+                       continue;
+
+               if (__compare_event(node->prev_event, event, type)) {
                        node->cb(event, node->data);
-               iter = g_list_next(iter);
+                       __unset_prev_event(&node->prev_event, type);
+                       __set_prev_event(&node->prev_event, event, type);
+               }
        }
 }
 
@@ -1086,8 +1157,6 @@ EXPORT_API int appcore_base_init(appcore_base_ops ops, int argc, char **argv, vo
        if (__context.ops.set_i18n)
                __context.ops.set_i18n(__context.data);
 
-       appcore_base_control_init();
-
        if (__context.ops.create) {
                traceBegin(TTRACE_TAG_APPLICATION_MANAGER, "APPCORE:CREATE");
                r = __context.ops.create(__context.data);
@@ -1131,6 +1200,8 @@ EXPORT_API void appcore_base_fini(void)
                __context.sid = 0;
        }
 
+       __remove_suspend_timer();
+
        g_list_free_full(__events, free);
        __events = NULL;
 
@@ -1199,8 +1270,10 @@ EXPORT_API int appcore_base_on_receive(aul_type type, bundle *b)
                if (__context.ops.exit)
                        __context.ops.exit(__context.data);
                break;
+       case AUL_TERMINATE_INST:
+       case AUL_TERMINATE_BG_INST:
        case AUL_TERMINATE_BGAPP:
-               _DBG("[APP %d]     AUL event: AUL_TERMINATE_BGAPP", getpid());
+               _DBG("[APP %d]     AUL event: %d", getpid(), type);
                if (!__context.allowed_bg)
                        __remove_suspend_timer();
                break;
@@ -1243,7 +1316,7 @@ EXPORT_API int appcore_base_on_create(void)
 {
        int r;
 
-       r = aul_launch_init(__context.ops.receive, NULL);
+       r = aul_launch_init(__context.ops.receive, __context.data);
        if (r < 0) {
                _ERR("Aul init failed: %d", r);
                return -1;
@@ -1338,6 +1411,12 @@ EXPORT_API appcore_base_event_h appcore_base_add_event(enum appcore_base_event e
        node->cb = cb;
        node->type = event;
        node->data = data;
+
+       if (event == APPCORE_BASE_EVENT_LANG_CHANGE ||
+                       event == APPCORE_BASE_EVENT_REGION_CHANGE)
+               node->prev_event = NULL;
+       else
+               node->prev_event = GINT_TO_POINTER(-1);
        __events = g_list_append(__events, node);
 
        return node;
@@ -1353,6 +1432,7 @@ EXPORT_API int appcore_base_remove_event(appcore_base_event_h handle)
 
        event = node->type;
        __events = g_list_remove(__events, node);
+       __unset_prev_event(&node->prev_event, event);
        free(node);
        if (__context.dirty && !__exist_callback(event)) {
                if (__context.ops.unset_event)