Launch widget instance sequentially 83/193683/4
authorhyunho <hhstark.kang@samsung.com>
Fri, 23 Nov 2018 07:22:32 +0000 (16:22 +0900)
committerhyunho <hhstark.kang@samsung.com>
Mon, 26 Nov 2018 06:36:08 +0000 (15:36 +0900)
Change-Id: Ib8c948fff0846122f59c3a974020bd626ba4af50
Signed-off-by: hyunho <hhstark.kang@samsung.com>
widget_viewer_evas/src/widget_viewer_evas.c

index 1a792800b6f9fd005f0cae469fc570b387b6961a..a53b3a613b1948940db775d5c5a58b09291defec 100644 (file)
 #define ERR_BUFFER_SIZE                1024
 
 #define WIDGET_PRIVILEGE "http://tizen.org/privilege/widget.viewer"
-#define WIDGET_RESTART_TIMEOUT 5000
+#define WIDGET_LAUNCH_TIMEOUT  5000
 
 /*!
  * \note
@@ -129,9 +129,9 @@ static struct info {
        Evas_Object *win;
        GHashTable *widget_table;
        GHashTable *instance_cnt_table;
-       GList *restart_list;
-       char *restarting_instance_id;
-       int restart_timer;
+       char *launching_instance_id;
+       GList *launch_list;
+       int launch_timer;
 } s_info = {
        .w = 0,
        .h = 0,
@@ -139,9 +139,9 @@ static struct info {
        .win = NULL,
        .widget_table = NULL,
        .instance_cnt_table = NULL,
-       .restart_list = NULL,
-       .restarting_instance_id = NULL,
-       .restart_timer = 0
+       .launching_instance_id = NULL,
+       .launch_list = NULL,
+       .launch_timer = 0
 };
 
 struct pending_item {
@@ -180,11 +180,11 @@ static void __flush_event_queue(struct widget_info *info);
 static int __default_delayed_resuming_time = 100;
 static bool __is_delayed_resuming_mode;
 static void __destroy_widget_info(gpointer data);
-static gboolean __restart_timeout_cb(gpointer user_data);
-static int __find_restart_info(gconstpointer a, gconstpointer b);
-static void __remove_restart_info(const char *instance_id);
-static void __restart_instance(void);
-static void __remove_restart_timer(void);
+static gboolean __launch_timeout_cb(gpointer user_data);
+static int __find_launch_info(gconstpointer a, gconstpointer b);
+static void __remove_launch_info(const char *instance_id);
+static void __launch_instance(void);
+static void __remove_launch_timer(void);
 
 static void __destroy_pending_item(gpointer data)
 {
@@ -326,30 +326,30 @@ static void __push_pending_queue(struct widget_info *info,
        LOGD("instance_id(%s), event(%s)", info->instance_id, item->event);
 }
 
-static void __add_restart_list(const char *instance_id)
+static void __add_launch_list(const char *instance_id)
 {
        GList *list;
-       char *restart_instance_id;
+       char *dup_instance_id;
 
        if (!instance_id) {
                LOGE("Invalid parameter");/* LCOV_EXCL_LINE */
                return;/* LCOV_EXCL_LINE */
        }
 
-       list = g_list_find_custom(s_info.restart_list, instance_id, __find_restart_info);
+       list = g_list_find_custom(s_info.launch_list, instance_id, __find_launch_info);
        if (list != NULL) {
-               LOGW("already in restart list(%s)", instance_id);
+               LOGW("already in launch list(%s)", instance_id);
                return;
        }
 
-       restart_instance_id = strdup(instance_id);
-       if (restart_instance_id == NULL) {
+       dup_instance_id = strdup(instance_id);
+       if (dup_instance_id == NULL) {
                LOGE("Out Of Memory");
                return;
        }
 
-       s_info.restart_list = g_list_append(s_info.restart_list, restart_instance_id);
-       LOGW("add restart(%s)", instance_id);
+       s_info.launch_list = g_list_append(s_info.launch_list, dup_instance_id);
+       LOGW("add launch(%s)", dup_instance_id);
 }
 
 static inline bool __is_widget_feature_enabled(void)
@@ -451,12 +451,11 @@ static void __screen_connector_toolkit_evas_added_cb(const char *appid, const ch
                LOGE("Wrong added info, appid(%s) info instance_id(%s), instance_id(%s)",/* LCOV_EXCL_LINE */
                                appid, info->instance_id, instance_id);/* LCOV_EXCL_LINE */
 
-               if (s_info.restarting_instance_id && info->instance_id &&
-                       strcmp(s_info.restarting_instance_id, info->instance_id) == 0) {
-                       __remove_restart_timer();
-                       __restart_instance();
+               if (s_info.launching_instance_id && info->instance_id &&
+                               strcmp(s_info.launching_instance_id, info->instance_id) == 0) {
+                       __remove_launch_timer();
+                       __launch_instance();
                }
-
                return;/* LCOV_EXCL_LINE */
        }
 
@@ -481,12 +480,11 @@ static void __screen_connector_toolkit_evas_added_cb(const char *appid, const ch
                elm_object_signal_emit(info->layout, "disable", "overlay,text");
 
        info->state = WIDGET_STATE_ATTACHED;
-
-       if (s_info.restarting_instance_id &&
-               strcmp(s_info.restarting_instance_id, instance_id) == 0) {
-               __remove_restart_info(instance_id);
-               __remove_restart_timer();
-               __restart_instance();
+       if (s_info.launching_instance_id &&
+            strcmp(s_info.launching_instance_id, instance_id) == 0) {
+               __remove_launch_info(instance_id);
+               __remove_launch_timer();
+               __launch_instance();
        }
        __flush_event_queue(info);
        /**
@@ -605,7 +603,7 @@ static void __push_event_queue(struct widget_info *info, int event)
        g_queue_push_tail(info->event_queue, GINT_TO_POINTER(event));
 }
 
-static int __find_restart_info(gconstpointer a, gconstpointer b)
+static int __find_launch_info(gconstpointer a, gconstpointer b)
 {
        if (a == NULL || b == NULL)
                return -1;
@@ -616,45 +614,45 @@ static int __find_restart_info(gconstpointer a, gconstpointer b)
        return -1;
 }
 
-static void __remove_restart_info(const char *instance_id)
+static void __remove_launch_info(const char *instance_id)
 {
        GList *list;
-       char *restart_instance_id;
+       char *launch_instance_id;
 
-       list = g_list_find_custom(s_info.restart_list, instance_id, __find_restart_info);
+       list = g_list_find_custom(s_info.launch_list, instance_id, __find_launch_info);
        if (list == NULL)
                return;
-       restart_instance_id = list->data;
-       s_info.restart_list = g_list_remove(s_info.restart_list, restart_instance_id);
-       free(restart_instance_id);
+       launch_instance_id = list->data;
+       s_info.launch_list = g_list_remove(s_info.launch_list, launch_instance_id);
+       free(launch_instance_id);
 }
 
-static void __remove_restart_timer()
+static void __remove_launch_timer()
 {
-       if (s_info.restart_timer <= 0)
+       if (s_info.launch_timer <= 0)
                return;
 
-       g_source_remove(s_info.restart_timer);
-       s_info.restart_timer = 0;
+       g_source_remove(s_info.launch_timer);
+       s_info.launch_timer = 0;
 }
 
-static void __restart_instance()
+static void __launch_instance()
 {
        struct widget_info *info;
-       char *restart_instance_id;
+       char *instance_id;
        int w, h;
        int ret;
        screen_connector_toolkit_evas_ops ops;
 
-       if (s_info.restart_list == NULL) {
-               s_info.restarting_instance_id = NULL;
-               s_info.restart_timer = 0;
+       if (s_info.launch_list == NULL) {
+               s_info.launch_timer = 0;
+               s_info.launching_instance_id = NULL;
                LOGW("null restart list");
                return;
        }
 
-       restart_instance_id = s_info.restart_list->data;
-       info = g_hash_table_lookup(s_info.widget_table, restart_instance_id);
+       instance_id = s_info.launch_list->data;
+       info = g_hash_table_lookup(s_info.widget_table, instance_id);
        evas_object_geometry_get(info->layout, NULL, NULL, &w, &h);
        LOGD("Widget launch  %s, %d, %d", info->instance_id, w, h);
 
@@ -672,16 +670,32 @@ static void __restart_instance()
                        SCREEN_CONNECTOR_SCREEN_TYPE_WIDGET,
                        info);
 
-       ret = widget_instance_terminate(info->instance_id);
-       if (ret != 0)
-               LOGW("widget_instance_terminate failed: %d", ret);
+       if (info->restart) {
+               ret = widget_instance_terminate(info->instance_id);
+               if (ret != 0)
+                       LOGW("widget_instance_terminate failed: %d", ret);
+       }
 
        info->pid = widget_instance_launch(info->instance_id, info->content_info, w, h);
        info->restart = false;
-       s_info.restarting_instance_id = restart_instance_id;
+       if (info->pid < 0) {
+               /* LCOV_EXCL_START */
+               struct widget_evas_event_info event_info;
+               LOGE("Failed to launch an widget");
+               event_info.error = info->pid;
+               event_info.widget_app_id = info->widget_id;
+               event_info.event = WIDGET_EVENT_CREATED;
 
-       s_info.restart_timer = g_timeout_add(WIDGET_RESTART_TIMEOUT,
-                       __restart_timeout_cb, restart_instance_id);
+               __smart_callback_call(info->layout, WIDGET_SMART_SIGNAL_WIDGET_CREATE_ABORTED, &event_info);
+               __display_overlay_text(info);
+               __remove_launch_info(info->instance_id);
+               __launch_instance();
+               /* LCOV_EXCL_STOP */
+       } else {
+               s_info.launching_instance_id = info->instance_id;
+               s_info.launch_timer = g_timeout_add(WIDGET_LAUNCH_TIMEOUT,
+                               __launch_timeout_cb, info->instance_id);
+       }
 }
 
 /* LCOV_EXCL_START */
@@ -713,23 +727,23 @@ static int __restart_terminated_widget(const char *widget_id)
                if (widget_instance_info->restart &&
                                widget_instance_info->pid == target_pid &&
                                (strcmp(widget_instance_info->widget_id, widget_id) == 0)) {
-                       __add_restart_list(widget_instance_info->instance_id);
+                       __add_launch_list(widget_instance_info->instance_id);
                }
        }
-       if (s_info.restart_timer == 0)
-               __restart_instance();
+       if (s_info.launch_timer == 0)
+               __launch_instance();
 
        return 0;
 }
 /* LCOV_EXCL_STOP */
 
-static gboolean __restart_timeout_cb(gpointer user_data)
+static gboolean __launch_timeout_cb(gpointer user_data)
 {
-       char *restart_instance_id = (char *)user_data;
+       char *instance_id = (char *)user_data;
 
-       LOGW("Timeout called !! %s", restart_instance_id);
-       __remove_restart_info(restart_instance_id);
-       __restart_instance();
+       LOGW("Timeout called !! %s", instance_id);
+       __remove_launch_info(instance_id);
+       __launch_instance();
        return G_SOURCE_REMOVE;
 }
 
@@ -1167,7 +1181,7 @@ static void __del_cb(void *data, Evas *e, Evas_Object *layout, void *event_info)
                                g_hash_table_remove(s_info.instance_cnt_table, widget_id);
                }
        }
-       __remove_restart_info(instance_id);
+       __remove_launch_info(instance_id);
 
        free(widget_id);
        free(instance_id);
@@ -1177,7 +1191,6 @@ static void __resize_cb(void *data, Evas *e, Evas_Object *layout, void *event_in
 {
        struct widget_info *info = data;
        int x, y, w, h;
-       screen_connector_toolkit_evas_ops ops;
        struct pending_item *item;
 
        evas_object_geometry_get(layout, &x, &y, &w, &h);
@@ -1192,33 +1205,9 @@ static void __resize_cb(void *data, Evas *e, Evas_Object *layout, void *event_in
                if (!info->disable_loading)
                        elm_object_part_text_set(layout, "text", T_("IDS_ST_POP_LOADING_ING"));
 
-               ops.added_cb = __screen_connector_toolkit_evas_added_cb;
-               ops.removed_cb = __screen_connector_toolkit_evas_removed_cb;
-               ops.updated_cb = __screen_connector_toolkit_evas_updated_cb;
-
-               if (info->toolkit_h) {
-                       screen_connector_toolkit_evas_remove(info->toolkit_h);
-                       info->toolkit_h = NULL;
-               }
-
-               info->toolkit_h = screen_connector_toolkit_evas_add(&ops, info->instance_id, SCREEN_CONNECTOR_SCREEN_TYPE_WIDGET, info);
-
-               LOGW("launch a widget instance: %s", info->instance_id);
-               info->pid = widget_instance_launch(info->instance_id, info->content_info, w, h);
-               if (info->pid < 0) {
-                       /* LCOV_EXCL_START */
-                       struct widget_evas_event_info event_info;
-                       LOGE("Failed to launch an widget");
-                       event_info.error = info->pid;
-                       event_info.widget_app_id = info->widget_id;
-                       event_info.event = WIDGET_EVENT_CREATED;
-
-                       __smart_callback_call(info->layout, WIDGET_SMART_SIGNAL_WIDGET_CREATE_ABORTED, &event_info);
-                       __display_overlay_text(info);
-
-                       return;
-                       /* LCOV_EXCL_STOP */
-               }
+               __add_launch_list(info->instance_id);
+               if (s_info.launch_timer == 0)
+                       __launch_instance();
        } else {
                /**
                 * @note
@@ -2006,7 +1995,8 @@ API void widget_viewer_evas_disable_loading(Evas_Object *widget)
 API void widget_viewer_evas_activate_faulted_widget(Evas_Object *widget)
 {
        struct widget_info *info;
-       screen_connector_toolkit_evas_ops ops;
+       int w;
+       int h;
 
        if (!__is_widget_feature_enabled()) {
                set_last_result(WIDGET_ERROR_NOT_SUPPORTED);/* LCOV_EXCL_LINE */
@@ -2041,13 +2031,7 @@ API void widget_viewer_evas_activate_faulted_widget(Evas_Object *widget)
        aul_widget_write_log(LOG_TAG, "[%s:%d] %s pid : %d",
                        __FUNCTION__, __LINE__, info->instance_id, info->pid);
        if (info->pid < 0) {
-
-               struct widget_evas_event_info event_info;
-               int w;
-               int h;
-
                evas_object_geometry_get(info->layout, NULL, NULL, &w, &h);
-
                if (!info->disable_preview) {
                        __create_preview_image(info->layout, info->widget_id);
                        elm_object_signal_emit(info->layout, "enable", "preview");
@@ -2057,30 +2041,8 @@ API void widget_viewer_evas_activate_faulted_widget(Evas_Object *widget)
                        elm_object_part_text_set(info->layout, "text", T_("IDS_ST_POP_LOADING_ING"));
                        elm_object_signal_emit(info->layout, "enable", "text");
                }
-
-               ops.added_cb = __screen_connector_toolkit_evas_added_cb;
-               ops.removed_cb = __screen_connector_toolkit_evas_removed_cb;
-               ops.updated_cb = __screen_connector_toolkit_evas_updated_cb;
-
-               if (info->toolkit_h) {
-                       screen_connector_toolkit_evas_remove(info->toolkit_h);
-                       info->toolkit_h = NULL;
-               }
-
-               info->toolkit_h = screen_connector_toolkit_evas_add(&ops, info->instance_id, SCREEN_CONNECTOR_SCREEN_TYPE_WIDGET, info);
-               info->is_faulted = false;
-               info->pid = widget_instance_launch(info->instance_id, info->content_info, w, h);
-               if (info->pid < 0) {
-                       LOGE("Failed to launch an widget");
-                       event_info.error = info->pid;
-                       event_info.widget_app_id = info->widget_id;
-                       event_info.event = WIDGET_EVENT_CREATED;
-
-                       __smart_callback_call(info->layout, WIDGET_SMART_SIGNAL_WIDGET_CREATE_ABORTED, &event_info);
-                       __display_overlay_text(info);
-
-                       return;
-               }
+               __add_launch_list(info->instance_id);
+               __launch_instance();
        } else {
                /**
                 * @note