int type;
appcore_base_event_cb cb;
void *data;
+ void *prev_event;
} appcore_base_event_node;
typedef struct _appcore_base_rotation {
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)
{
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);
+ }
}
}
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);
__context.sid = 0;
}
+ __remove_suspend_timer();
+
g_list_free_full(__events, free);
__events = NULL;
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;
{
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;
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;
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)