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);
+
+/**
* @}
*/
#include <glib.h>
#include <aul.h>
+#include <aul_window.h>
#include <dlog.h>
#include <pkgmgr-info.h>
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;
+}