Add a new API to retrieve visible app context 21/135821/3
authorHwankyu Jhun <h.jhun@samsung.com>
Tue, 27 Jun 2017 01:23:35 +0000 (10:23 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Tue, 27 Jun 2017 03:54:16 +0000 (12:54 +0900)
Change-Id: I45fe986a6eca466eb1baa8da06bc526052eed058
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
include/app_manager_extension.h
src/app_context.c
src/app_manager.c
src/app_manager_internal.h

index 74a9c3e..ff382a6 100644 (file)
@@ -181,6 +181,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);
+
+/**
  * @}
  */
 
index 6929337..f61128b 100644 (file)
@@ -24,6 +24,7 @@
 #include <glib.h>
 
 #include <aul.h>
+#include <aul_window.h>
 #include <dlog.h>
 #include <pkgmgr-info.h>
 
@@ -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;
+}
index 85a3f1e..bd9dd76 100644 (file)
@@ -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;
+}
index 1394ad6..4287bf7 100644 (file)
@@ -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 */