PUI & default-backend: add force argument to the control function of animation 79/220679/1
authorSung-Jin Park <sj76.park@samsung.com>
Tue, 3 Sep 2019 02:20:55 +0000 (11:20 +0900)
committerSung-Jin Park <sj76.park@samsung.com>
Fri, 20 Dec 2019 07:22:44 +0000 (16:22 +0900)
As we use pui_ani_control() to stop/pause an animation, it's impossible to check
whether the animation has been stopped from the user request or from the window
stack changes. Thus we add _pui_ani_control_with_force() to pass force value
when the animation must be paused from window stack changes.

Change-Id: Ied104d13cd463c37191d20515383501d4f8333a8
Signed-off-by: Sung-Jin Park <sj76.park@samsung.com>
19 files changed:
backends/bt/default_ani_connected.c
backends/bt/default_ani_pairing.c
backends/default_backend.c
backends/notification/default_ani_alarm.c
backends/notification/default_ani_emergency.c
backends/notification/default_ani_error.c
backends/notification/default_ani_networkerror.c
backends/notification/default_ani_normal.c
backends/system/default_ani_easysetup.c
backends/system/default_ani_micoff.c
backends/system/default_ani_swupdatedone.c
backends/system/default_ani_system_processing.c
backends/voice/default_ani_listening.c
backends/voice/default_ani_processing.c
backends/voice/default_ani_speaking.c
backends/voice/default_ani_streaming.c
backends/voice/default_ani_timeout.c
include/PUI_backend.h
src/PUI_ani.c

index ccc9bd1..cb2310f 100644 (file)
@@ -173,7 +173,7 @@ _ani_connected_start(pui_ani_t *ani, int repeat)
 }
 
 pui_error
-_ani_connected_stop(pui_ani_t *ani)
+_ani_connected_stop(pui_ani_t *ani, pui_bool force)
 {
        pui_int_error e = PUI_INT_ERROR_NONE;
        pui_backend_ani_data *ani_data = NULL;
@@ -184,10 +184,15 @@ _ani_connected_stop(pui_ani_t *ani)
        //TODO
        (void) info;
 
-       pui_info("... info->id: %s\n", info->id);
+       pui_info("... info->id: %s, force=%d\n", info->id, force);
 
        pui_backend_ani_remove_frame_cb(ani);
-       pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
+       if (force)
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED);
+       else
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
 
        return e;
 }
index 3e59bc7..83a200d 100644 (file)
@@ -165,7 +165,7 @@ _ani_pairing_start(pui_ani_t *ani, int repeat)
 }
 
 pui_error
-_ani_pairing_stop(pui_ani_t *ani)
+_ani_pairing_stop(pui_ani_t *ani, pui_bool force)
 {
        pui_int_error e = PUI_INT_ERROR_NONE;
        pui_backend_ani_data *ani_data = NULL;
@@ -176,10 +176,14 @@ _ani_pairing_stop(pui_ani_t *ani)
        //TODO
        (void) info;
 
-       pui_info("... info->id: %s\n", info->id);
+       pui_info("... info->id: %s, force=%d\n", info->id, force);
 
        pui_backend_ani_remove_frame_cb(ani);
-       pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
+       if (force)
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED);
+       else
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
 
        return e;
 }
index d4015ff..bc13c94 100644 (file)
@@ -178,7 +178,7 @@ _ani_start(pui_ani_t *ani, int repeat)
 }
 
 pui_error
-_ani_stop(pui_ani_t *ani)
+_ani_stop(pui_ani_t *ani, pui_bool force)
 {
        pui_int_error e = PUI_INT_ERROR_NONE;
        pui_backend_ani_data *ani_data = NULL;
@@ -189,10 +189,14 @@ _ani_stop(pui_ani_t *ani)
        //TODO
        (void) info;
 
-       pui_info("... info->id: %s\n", info->id);
+       pui_info("... info->id: %s, force=%d\n", info->id, force);
 
        pui_backend_ani_remove_frame_cb(ani);
-       pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
+       if (force)
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED);
+       else
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
 
        return e;
 }
index 7017465..3a3f553 100644 (file)
@@ -192,7 +192,7 @@ _ani_alarm_start(pui_ani_t *ani, int repeat)
 }
 
 pui_error
-_ani_alarm_stop(pui_ani_t *ani)
+_ani_alarm_stop(pui_ani_t *ani, pui_bool force)
 {
        pui_int_error e = PUI_INT_ERROR_NONE;
        pui_backend_ani_data *ani_data = NULL;
@@ -203,10 +203,15 @@ _ani_alarm_stop(pui_ani_t *ani)
        //TODO
        (void) info;
 
-       pui_info("... info->id: %s\n", info->id);
+       pui_info("... info->id: %s, force=%d\n", info->id, force);
 
        pui_backend_ani_remove_frame_cb(ani);
-       pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
+       if (force)
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED);
+       else
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
 
        return e;
 }
index b0fad94..2f58418 100644 (file)
@@ -177,7 +177,7 @@ _ani_emergency_start(pui_ani_t *ani, int repeat)
 }
 
 pui_error
-_ani_emergency_stop(pui_ani_t *ani)
+_ani_emergency_stop(pui_ani_t *ani, pui_bool force)
 {
        pui_int_error e = PUI_INT_ERROR_NONE;
        pui_backend_ani_data *ani_data = NULL;
@@ -188,10 +188,14 @@ _ani_emergency_stop(pui_ani_t *ani)
        //TODO
        (void) info;
 
-       pui_info("... info->id: %s\n", info->id);
+       pui_info("... info->id: %s, force=%d\n", info->id, force);
 
        pui_backend_ani_remove_frame_cb(ani);
-       pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
+       if (force)
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED);
+       else
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
 
        return e;
 }
index 9c4f022..2bece72 100644 (file)
@@ -173,7 +173,7 @@ _ani_error_start(pui_ani_t *ani, int repeat)
 }
 
 pui_error
-_ani_error_stop(pui_ani_t *ani)
+_ani_error_stop(pui_ani_t *ani, pui_bool force)
 {
        pui_int_error e = PUI_INT_ERROR_NONE;
        pui_backend_ani_data *ani_data = NULL;
@@ -184,10 +184,15 @@ _ani_error_stop(pui_ani_t *ani)
        //TODO
        (void) info;
 
-       pui_info("... info->id: %s\n", info->id);
+       pui_info("... info->id: %s, force=%d\n", info->id, force);
 
        pui_backend_ani_remove_frame_cb(ani);
-       pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
+       if (force)
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED);
+       else
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
 
        return e;
 }
index 6295946..7295fa6 100644 (file)
@@ -173,7 +173,7 @@ _ani_networkerror_start(pui_ani_t *ani, int repeat)
 }
 
 pui_error
-_ani_networkerror_stop(pui_ani_t *ani)
+_ani_networkerror_stop(pui_ani_t *ani, pui_bool force)
 {
        pui_int_error e = PUI_INT_ERROR_NONE;
        pui_backend_ani_data *ani_data = NULL;
@@ -184,10 +184,15 @@ _ani_networkerror_stop(pui_ani_t *ani)
        //TODO
        (void) info;
 
-       pui_info("... info->id: %s\n", info->id);
+       pui_info("... info->id: %s, force=%d\n", info->id, force);
 
        pui_backend_ani_remove_frame_cb(ani);
-       pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
+       if (force)
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED);
+       else
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
 
        return e;
 }
index a96d09e..fec9d41 100644 (file)
@@ -177,7 +177,7 @@ _ani_normal_start(pui_ani_t *ani, int repeat)
 }
 
 pui_error
-_ani_normal_stop(pui_ani_t *ani)
+_ani_normal_stop(pui_ani_t *ani, pui_bool force)
 {
        pui_int_error e = PUI_INT_ERROR_NONE;
        pui_backend_ani_data *ani_data = NULL;
@@ -188,10 +188,15 @@ _ani_normal_stop(pui_ani_t *ani)
        //TODO
        (void) info;
 
-       pui_info("... info->id: %s\n", info->id);
+       pui_info("... info->id: %s, force=%d\n", info->id, force);
 
        pui_backend_ani_remove_frame_cb(ani);
-       pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
+       if (force)
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED);
+       else
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
 
        return e;
 }
index f4b611c..791300d 100644 (file)
@@ -176,7 +176,7 @@ _ani_easysetup_start(pui_ani_t *ani, int repeat)
 }
 
 pui_error
-_ani_easysetup_stop(pui_ani_t *ani)
+_ani_easysetup_stop(pui_ani_t *ani, pui_bool force)
 {
        pui_int_error e = PUI_INT_ERROR_NONE;
        pui_backend_ani_data *ani_data = NULL;
@@ -187,10 +187,15 @@ _ani_easysetup_stop(pui_ani_t *ani)
        //TODO
        (void) info;
 
-       pui_info("... info->id: %s\n", info->id);
+       pui_info("... info->id: %s, force=%d\n", info->id, force);
 
        pui_backend_ani_remove_frame_cb(ani);
-       pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
+       if (force)
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED);
+       else
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
 
        return e;
 }
index 8ea4583..0d96ecb 100644 (file)
@@ -159,7 +159,7 @@ _ani_micoff_start(pui_ani_t *ani, int repeat)
 }
 
 pui_error
-_ani_micoff_stop(pui_ani_t *ani)
+_ani_micoff_stop(pui_ani_t *ani, pui_bool force)
 {
        pui_int_error e = PUI_INT_ERROR_NONE;
        pui_backend_ani_data *ani_data = NULL;
@@ -170,10 +170,15 @@ _ani_micoff_stop(pui_ani_t *ani)
        //TODO
        (void) info;
 
-       pui_info("... info->id: %s\n", info->id);
+       pui_info("... info->id: %s, force=%d\n", info->id, force);
 
        pui_backend_ani_remove_frame_cb(ani);
-       pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
+       if (force)
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED);
+       else
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
 
        return e;
 }
index 139bf13..b1ee0d1 100644 (file)
@@ -176,7 +176,7 @@ _ani_swupdatedone_start(pui_ani_t *ani, int repeat)
 }
 
 pui_error
-_ani_swupdatedone_stop(pui_ani_t *ani)
+_ani_swupdatedone_stop(pui_ani_t *ani, pui_bool force)
 {
        pui_int_error e = PUI_INT_ERROR_NONE;
        pui_backend_ani_data *ani_data = NULL;
@@ -187,10 +187,15 @@ _ani_swupdatedone_stop(pui_ani_t *ani)
        //TODO
        (void) info;
 
-       pui_info("... info->id: %s\n", info->id);
+       pui_info("... info->id: %s, force=%d\n", info->id, force);
 
        pui_backend_ani_remove_frame_cb(ani);
-       pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
+       if (force)
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED);
+       else
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
 
        return e;
 }
index 6778838..921c4eb 100644 (file)
@@ -165,7 +165,7 @@ _ani_system_processing_start(pui_ani_t *ani, int repeat)
 }
 
 pui_error
-_ani_system_processing_stop(pui_ani_t *ani)
+_ani_system_processing_stop(pui_ani_t *ani, pui_bool force)
 {
        pui_int_error e = PUI_INT_ERROR_NONE;
        pui_backend_ani_data *ani_data = NULL;
@@ -176,10 +176,15 @@ _ani_system_processing_stop(pui_ani_t *ani)
        //TODO
        (void) info;
 
-       pui_info("... info->id: %s\n", info->id);
+       pui_info("... info->id: %s, force=%d\n", info->id, force);
 
        pui_backend_ani_remove_frame_cb(ani);
-       pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
+       if (force)
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED);
+       else
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
 
        return e;
 }
index 2ff9a84..6317550 100644 (file)
@@ -189,7 +189,7 @@ _ani_listening_start(pui_ani_t *ani, int repeat)
 }
 
 pui_error
-_ani_listening_stop(pui_ani_t *ani)
+_ani_listening_stop(pui_ani_t *ani, pui_bool force)
 {
        pui_int_error e = PUI_INT_ERROR_NONE;
        pui_backend_ani_data *ani_data = NULL;
@@ -200,10 +200,14 @@ _ani_listening_stop(pui_ani_t *ani)
        //TODO
        (void) info;
 
-       pui_info("... info->id: %s\n", info->id);
+       pui_info("... info->id: %s, force=%d\n", info->id, force);
 
        pui_backend_ani_remove_frame_cb(ani);
-       pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
+       if (force)
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED);
+       else
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
 
        return e;
 }
index 15f4957..25bc0c0 100644 (file)
@@ -165,7 +165,7 @@ _ani_processing_start(pui_ani_t *ani, int repeat)
 }
 
 pui_error
-_ani_processing_stop(pui_ani_t *ani)
+_ani_processing_stop(pui_ani_t *ani, pui_bool force)
 {
        pui_int_error e = PUI_INT_ERROR_NONE;
        pui_backend_ani_data *ani_data = NULL;
@@ -176,10 +176,15 @@ _ani_processing_stop(pui_ani_t *ani)
        //TODO
        (void) info;
 
-       pui_info("... info->id: %s\n", info->id);
+       pui_info("... info->id: %s, force=%d\n", info->id, force);
 
        pui_backend_ani_remove_frame_cb(ani);
-       pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
+       if (force)
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED);
+       else
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
 
        return e;
 }
index af0bb47..99d564a 100644 (file)
@@ -176,7 +176,7 @@ _ani_speaking_start(pui_ani_t *ani, int repeat)
 }
 
 pui_error
-_ani_speaking_stop(pui_ani_t *ani)
+_ani_speaking_stop(pui_ani_t *ani, pui_bool force)
 {
        pui_int_error e = PUI_INT_ERROR_NONE;
        pui_backend_ani_data *ani_data = NULL;
@@ -187,10 +187,15 @@ _ani_speaking_stop(pui_ani_t *ani)
        //TODO
        (void) info;
 
-       pui_info("... info->id: %s\n", info->id);
+       pui_info("... info->id: %s, force=%d\n", info->id, force);
 
        pui_backend_ani_remove_frame_cb(ani);
-       pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
+       if (force)
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED);
+       else
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
 
        return e;
 }
index 79b5e14..0d558d8 100644 (file)
@@ -176,7 +176,7 @@ _ani_streaming_start(pui_ani_t *ani, int repeat)
 }
 
 pui_error
-_ani_streaming_stop(pui_ani_t *ani)
+_ani_streaming_stop(pui_ani_t *ani, pui_bool force)
 {
        pui_int_error e = PUI_INT_ERROR_NONE;
        pui_backend_ani_data *ani_data = NULL;
@@ -187,10 +187,15 @@ _ani_streaming_stop(pui_ani_t *ani)
        //TODO
        (void) info;
 
-       pui_info("... info->id: %s\n", info->id);
+       pui_info("... info->id: %s, force=%d\n", info->id, force);
 
        pui_backend_ani_remove_frame_cb(ani);
-       pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
+       if (force)
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED);
+       else
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
 
        return e;
 }
index 4c0b4d4..bb26a39 100644 (file)
@@ -176,7 +176,7 @@ _ani_timeout_start(pui_ani_t *ani, int repeat)
 }
 
 pui_error
-_ani_timeout_stop(pui_ani_t *ani)
+_ani_timeout_stop(pui_ani_t *ani, pui_bool force)
 {
        pui_int_error e = PUI_INT_ERROR_NONE;
        pui_backend_ani_data *ani_data = NULL;
@@ -187,10 +187,15 @@ _ani_timeout_stop(pui_ani_t *ani)
        //TODO
        (void) info;
 
-       pui_info("... info->id: %s\n", info->id);
+       pui_info("... info->id: %s, force=%d\n", info->id, force);
 
        pui_backend_ani_remove_frame_cb(ani);
-       pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
+       if (force)
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_PAUSED);
+       else
+               pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
+
 
        return e;
 }
index e7ea4fb..d1e9210 100644 (file)
@@ -44,7 +44,7 @@ typedef struct _pui_backend_ani_func pui_backend_ani_func;
 struct _pui_backend_ani_func
 {
        pui_error (*ani_start)(pui_ani_t *ani, int repeat);
-       pui_error (*ani_stop)(pui_ani_t *ani);
+       pui_error (*ani_stop)(pui_ani_t *ani, pui_bool force);
 
        void (*reserved1)(void);
        void (*reserved2)(void);
index f229a1a..9ef7c0f 100644 (file)
 static int KEY_WL_BUFFER = 0xabcdbeaf;
 static int KEY_CLIENT = 0xdcbabeaf;
 
-static Eina_Bool
-_cb_visibility_change(void *data, int type EINA_UNUSED, void *event)
-{
-       pui_ani_h ani_h =  (pui_ani_h)data;
-       pui_ani_t *ani = ani_h->ani;
-       pui_h ph = ani_h->pui_handle;
-
-       Ecore_Wl2_Event_Window_Visibility_Change *ev;
-       PUI_Event_Animation_Status *e = NULL;
-
-       ev = event;
-
-       /* check if this is needed */
-       ph->visibility = !(ev->fully_obscured);
-
-       if (ev->fully_obscured)
-       {
-               if (ani->status == PUI_ANI_STATUS_RUNNING)
-               {
-                       pui_info("animation(%s) will be stopped as it lost its priority !\n", ani->id);
-
-                       pui_ani_control(ani_h, PUI_ANI_CMD_STOP, 0);
-               }
-       }
-       else
-       {
-               if (ani->status == PUI_ANI_STATUS_STOPPED || ani->status == PUI_ANI_STATUS_PAUSED)
-               {
-                       e = (PUI_Event_Animation_Status *)calloc(1, sizeof(PUI_Event_Animation_Status));
-
-                       if (!e)
-                       {
-                               pui_err("Failed to allocate memory for PUI Event !\n");
-                               return ECORE_CALLBACK_PASS_ON;
-                       }
-                       
-                       e->ani_h = ani_h;
-                       e->win = ev->win;
-                       e->status = ani->status;
-                       
-                       if (ani->status == PUI_ANI_STATUS_STOPPED)
-                       {
-                               pui_info("[Event added][ani id:%s] PUI_EVENT_ANI_READY_TO_START event has been added.\n", ani_h->id);
-                               ecore_event_add(PUI_EVENT_ANI_READY_TO_START, e, NULL, ani_h);
-                       }
-                       else if(ani->status == PUI_ANI_STATUS_PAUSED)
-                       {
-                               pui_info("[Event added][ani id:%s] PUI_EVENT_ANI_READY_TO_RESUME event has been added.\n", ani_h->id);
-                               ecore_event_add(PUI_EVENT_ANI_READY_TO_RESUME, e, NULL, ani_h);
-                       }
-               }
-       }
-
-       return ECORE_CALLBACK_PASS_ON;
-}
-
 static void
 _pui_ani_cb_frame_done(Ecore_Wl2_Window *win, uint32_t timestamp EINA_UNUSED, void *data)
 {
@@ -285,44 +229,6 @@ pui_ani_update(pui_ani_h ani_h)
        return PUI_INT_ERROR_NONE;
 }
 
-static void
-_pui_ani_event_handlers_init(pui_ani_h ani_h)
-{
-       Ecore_Event_Handler *h = NULL;
-
-       if (!ani_h)
-       {
-               pui_err("Invalid handle !\n");
-               return;
-       }
-
-       if (!ani_h->ecore_event_hdls)
-               ani_h->ecore_event_hdls = eina_array_new(1);
-
-       h = ecore_event_handler_add(ECORE_WL2_EVENT_WINDOW_VISIBILITY_CHANGE, _cb_visibility_change, ani_h);
-       eina_array_push(ani_h->ecore_event_hdls, h);
-
-}
-
-static void
-_pui_ani_event_handlers_shutdown(pui_ani_h ani_h)
-{
-       if (!ani_h)
-       {
-               pui_err("Invalid handle !\n");
-               return;
-       }
-
-       if (ani_h->ecore_event_hdls)
-       {
-               while (eina_array_count(ani_h->ecore_event_hdls))
-                       ecore_event_handler_del(eina_array_pop(ani_h->ecore_event_hdls));
-
-               eina_array_free(ani_h->ecore_event_hdls);
-               ani_h->ecore_event_hdls = NULL;
-       }
-}
-
 static Eina_Bool
 _pui_ani_frame_cb(void *data)
 {
@@ -544,8 +450,8 @@ pui_ani_status_get(pui_ani_t *ani)
        return ani->status;
 }
 
-pui_error
-pui_ani_control(pui_ani_h ani_h, pui_ani_cmd cmd, int repeat)
+static pui_error
+_pui_ani_control_with_force(pui_ani_h ani_h, pui_ani_cmd cmd, int repeat, pui_bool force)
 {
        pui_int_error ei = PUI_INT_ERROR_NONE;
        pui_ani_t *ani = NULL;
@@ -592,7 +498,7 @@ pui_ani_control(pui_ani_h ani_h, pui_ani_cmd cmd, int repeat)
                        {
                                pui_info("current_ani id=%s, status=%d\n", current_ani->id, current_ani->status);
 
-                               ei = pui_ani_control(handle->current_ani_h, PUI_ANI_CMD_STOP, 0);
+                               ei = _pui_ani_control_with_force(handle->current_ani_h, PUI_ANI_CMD_STOP, 0, force);
 
                                if (ei != PUI_INT_ERROR_NONE)
                                        pui_info("Failed to stop running previous animation ! (id:%s)\n", current_ani->id);
@@ -609,7 +515,7 @@ pui_ani_control(pui_ani_h ani_h, pui_ani_cmd cmd, int repeat)
                        pui_err("Error on starting animation ! (id:%s, repeat:%d, status=%d))\n", ani->id, repeat, ani->status);
 
                        if (ani->status != PUI_ANI_STATUS_RUNNING)
-                               pui_ani_control(ani_h, PUI_ANI_CMD_STOP, 0);
+                               _pui_ani_control_with_force(ani_h, PUI_ANI_CMD_STOP, 0, 0);
 
                        return PUI_ERROR_INTERNAL;
                }
@@ -618,7 +524,7 @@ pui_ani_control(pui_ani_h ani_h, pui_ani_cmd cmd, int repeat)
        }
        else//cmd == PUI_ANI_CMD_STOP
        {
-               ei = ani_func->ani_stop(ani);
+               ei = ani_func->ani_stop(ani, force);
 
                if (ei != PUI_INT_ERROR_NONE)
                {
@@ -650,6 +556,101 @@ err:
        return PUI_ERROR_INTERNAL;
 }
 
+pui_error
+pui_ani_control(pui_ani_h ani_h, pui_ani_cmd cmd, int repeat)
+{
+       return _pui_ani_control_with_force(ani_h, cmd, repeat, 0);
+}
+
+static Eina_Bool
+_cb_visibility_change(void *data, int type EINA_UNUSED, void *event)
+{
+       pui_ani_h ani_h =  (pui_ani_h)data;
+       pui_ani_t *ani = ani_h->ani;
+       pui_h ph = ani_h->pui_handle;
+
+       Ecore_Wl2_Event_Window_Visibility_Change *ev;
+       PUI_Event_Animation_Status *e = NULL;
+
+       ev = event;
+
+       /* check if this is needed */
+       ph->visibility = !(ev->fully_obscured);
+
+       if (ev->fully_obscured)
+       {
+               if (ani->status == PUI_ANI_STATUS_RUNNING)
+               {
+                       pui_info("animation(%s) will be stopped as it lost its priority !\n", ani->id);
+
+                       _pui_ani_control_with_force(ani_h, PUI_ANI_CMD_STOP, 0, 1);
+               }
+       }
+       else
+       {
+               if (ani->status == PUI_ANI_STATUS_PAUSED)
+               {
+                       e = (PUI_Event_Animation_Status *)calloc(1, sizeof(PUI_Event_Animation_Status));
+
+                       if (!e)
+                       {
+                               pui_err("Failed to allocate memory for PUI Event !\n");
+                               return ECORE_CALLBACK_PASS_ON;
+                       }
+
+                       e->ani_h = ani_h;
+                       e->win = ev->win;
+                       e->status = ani->status;
+
+                       if(ani->status == PUI_ANI_STATUS_PAUSED)
+                       {
+                               pui_info("[Event added][ani id:%s] PUI_EVENT_ANI_READY_TO_RESUME event has been added.\n", ani_h->id);
+                               ecore_event_add(PUI_EVENT_ANI_READY_TO_RESUME, e, NULL, ani_h);
+                       }
+               }
+       }
+
+       return ECORE_CALLBACK_PASS_ON;
+}
+
+static void
+_pui_ani_event_handlers_init(pui_ani_h ani_h)
+{
+       Ecore_Event_Handler *h = NULL;
+
+       if (!ani_h)
+       {
+               pui_err("Invalid handle !\n");
+               return;
+       }
+
+       if (!ani_h->ecore_event_hdls)
+               ani_h->ecore_event_hdls = eina_array_new(1);
+
+       h = ecore_event_handler_add(ECORE_WL2_EVENT_WINDOW_VISIBILITY_CHANGE, _cb_visibility_change, ani_h);
+       eina_array_push(ani_h->ecore_event_hdls, h);
+
+}
+
+static void
+_pui_ani_event_handlers_shutdown(pui_ani_h ani_h)
+{
+       if (!ani_h)
+       {
+               pui_err("Invalid handle !\n");
+               return;
+       }
+
+       if (ani_h->ecore_event_hdls)
+       {
+               while (eina_array_count(ani_h->ecore_event_hdls))
+                       ecore_event_handler_del(eina_array_pop(ani_h->ecore_event_hdls));
+
+               eina_array_free(ani_h->ecore_event_hdls);
+               ani_h->ecore_event_hdls = NULL;
+       }
+}
+
 pui_ani_h
 pui_ani_create(pui_h handle, pui_id id)
 {