From: Hwankyu Jhun Date: Tue, 27 Jun 2017 01:23:35 +0000 (+0900) Subject: Add a new API to retrieve visible app context X-Git-Tag: submit/tizen/20170629.060228~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d9e8aa7b2c9015c80296a4c01582e7701aaa689c;p=platform%2Fcore%2Fapi%2Fapp-manager.git Add a new API to retrieve visible app context Change-Id: I45fe986a6eca466eb1baa8da06bc526052eed058 Signed-off-by: Hwankyu Jhun --- diff --git a/include/app_manager_extension.h b/include/app_manager_extension.h index 74a9c3e..ff382a6 100644 --- a/include/app_manager_extension.h +++ b/include/app_manager_extension.h @@ -180,6 +180,22 @@ int app_manager_detach_window(const char *app_id); */ int app_manager_unset_app_context_status_cb(app_manager_app_context_status_cb callback, const char *appid); +/** + * @brief Retrieves all application contexts of visible applications. + * @since_tizen 3.0 + * @param[in] callback The callback function to invoke + * @param[in] user_data The user data to be passed to the callback function + * @return @c 0 on success, + * otherwise a negative error value + * @retval #APP_MANAGER_ERROR_NONE Successful + * @retval #APP_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #APP_MANAGER_ERROR_IO_ERROR Internal I/O error + * @retval #APP_MANAGER_ERROR_OUT_OF_MEMORY Out of memory + * @post This function invokes app_manager_app_context_cb() for each application context. + * @see app_manager_app_context_cb() + */ +int app_manager_foreach_visible_app_context(app_manager_app_context_cb callback, void *user_data); + /** * @} */ diff --git a/src/app_context.c b/src/app_context.c index 6929337..f61128b 100644 --- a/src/app_context.c +++ b/src/app_context.c @@ -24,6 +24,7 @@ #include #include +#include #include #include @@ -835,3 +836,116 @@ int app_context_unset_status_cb(app_manager_app_context_status_cb callback, cons return APP_MANAGER_ERROR_NONE; } + +static void __foreach_window_info_cb(aul_window_info_h info, void *data) +{ + GList **list = (GList **)data; + int visibility; + int pid; + int ret; + + if (info == NULL || list == NULL) { + LOGE("Invalid parameter"); + return; + } + + ret = aul_window_info_get_visibility(info, &visibility); + if (ret < 0) { + LOGE("Failed to get window visibility"); + return; + } + + if (visibility < 0 || visibility > 1) + return; + + ret = aul_window_info_get_pid(info, &pid); + if (ret < 0) { + LOGE("Failed to get pid"); + return; + } + + *list = g_list_append(*list, GINT_TO_POINTER(pid)); +} + +static int __foreach_app_context_cb(const aul_app_info *aul_app_context, void *data) +{ + GHashTable *app_context_table = (GHashTable *)data; + app_context_h app_context; + app_state_e app_state; + int ret; + + if (aul_app_context == NULL || app_context_table == NULL) { + LOGE("Invalid parameter"); + return -1; + } + + app_state = app_context_get_app_status(aul_app_context->status); + ret = app_context_create(aul_app_context->appid, + aul_app_context->pid, + aul_app_context->pkgid, + app_state, + (bool)aul_app_context->is_sub_app, + aul_app_context->instance_id, + &app_context); + if (ret != APP_MANAGER_ERROR_NONE) { + LOGE("Failed to create app context - %s(%d)", + aul_app_context->appid, aul_app_context->pid); + return -1; + } + + g_hash_table_insert(app_context_table, GINT_TO_POINTER(aul_app_context->pid), app_context); + + return 0; +} + +int app_context_foreach_visible_app_context(app_manager_app_context_cb callback, void *user_data) +{ + aul_window_stack_h handle = NULL; + GHashTable *app_context_table; + app_context_h app_context; + GList *pid_list = NULL; + GList *iter; + int ret; + + if (callback == NULL) + return APP_MANAGER_ERROR_INVALID_PARAMETER; + + app_context_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, + NULL, (GDestroyNotify)app_context_destroy); + if (app_context_table == NULL) + return APP_MANAGER_ERROR_OUT_OF_MEMORY; + + ret = aul_app_get_all_running_app_info(__foreach_app_context_cb, app_context_table); + if (ret != AUL_R_OK) { + g_hash_table_destroy(app_context_table); + return APP_MANAGER_ERROR_IO_ERROR; + } + + ret = aul_window_stack_get(&handle); + if (ret < 0) { + g_hash_table_destroy(app_context_table); + return APP_MANAGER_ERROR_IO_ERROR; + } + + ret = aul_window_stack_foreach(handle, __foreach_window_info_cb, &pid_list); + if (ret < 0) { + aul_window_stack_del(handle); + g_hash_table_destroy(app_context_table); + return APP_MANAGER_ERROR_IO_ERROR; + } + aul_window_stack_del(handle); + + iter = g_list_first(pid_list); + while (iter) { + app_context = (app_context_h)g_hash_table_lookup(app_context_table, iter->data); + if (app_context) { + if (!callback(app_context, user_data)) + break; + } + iter = g_list_next(iter); + } + g_list_free(pid_list); + g_hash_table_destroy(app_context_table); + + return APP_MANAGER_ERROR_NONE; +} diff --git a/src/app_manager.c b/src/app_manager.c index 85a3f1e..bd9dd76 100644 --- a/src/app_manager.c +++ b/src/app_manager.c @@ -629,3 +629,14 @@ API int app_manager_unset_app_context_status_cb(app_manager_app_context_status_c return APP_MANAGER_ERROR_NONE; } + +API int app_manager_foreach_visible_app_context(app_manager_app_context_cb callback, void *user_data) +{ + int ret; + + ret = app_context_foreach_visible_app_context(callback, user_data); + if (ret != APP_MANAGER_ERROR_NONE) + return app_manager_error(ret, __FUNCTION__, NULL); + + return APP_MANAGER_ERROR_NONE; +} diff --git a/src/app_manager_internal.h b/src/app_manager_internal.h index 1394ad6..4287bf7 100644 --- a/src/app_manager_internal.h +++ b/src/app_manager_internal.h @@ -78,4 +78,6 @@ void remove_app_manager_event_info_list(app_manager_event_info *head); int app_context_unset_status_cb(app_manager_app_context_status_cb callback, const char *appid); +int app_context_foreach_visible_app_context(app_manager_app_context_cb callback, void *user_data); + #endif /* __TIZEN_APPFW_APP_MANAGER_INTERNAL_H */