Fix wrong pause/resume state of wathcface 03/210903/2
authorChangwoo KIM <cw2010.kim@samsung.com>
Fri, 19 Jul 2019 04:53:35 +0000 (13:53 +0900)
committerhyunho <hhstark.kang@samsung.com>
Fri, 26 Jul 2019 01:02:05 +0000 (10:02 +0900)
Considering 3 entry point for manual render start

1. Pre-Visilibity Event (Only for LCD ON State)
2. AppControl Event
3. Evas Object Move Event

For LCD Off/Evas Object Move Event case, wathcface will be paused by auto visibility check
But in case of AppControl, there is no visibility check to pause watchface.
So add new timer for 200ms to check iconify state.
Once watchface got resume on iconify state, the timer will check it's visibility and pause the watchface

Change-Id: I0a93efe1bd81306192214f5658aaffaec40159f4
Signed-off-by: hyunho <hhstark.kang@samsung.com>
packaging/libwidget_viewer.spec
watch-control/CMakeLists.txt
watch-control/src/control.c

index 54d79732ef67317c1ac3696349b435cb43716bcd..2ed73f4736c28e2169302f95765b15ff4b31a891 100644 (file)
@@ -33,6 +33,7 @@ BuildRequires: pkgconfig(appsvc)
 BuildRequires: pkgconfig(ecore-wl2)
 BuildRequires: pkgconfig(wayland-tbm-client)
 BuildRequires: pkgconfig(screen_connector_watcher_evas)
+BuildRequires: pkgconfig(capi-system-device)
 BuildRequires: pkgconfig(gmock)
 %if 0%{?gcov:1}
 BuildRequires:  lcov
index 542b3da7de23ebec0074378f9ba5a0e052af5860..ca80f02ab8e880dc46def24cbfb32575329949c3 100644 (file)
@@ -14,6 +14,7 @@ pkg_check_modules(watch-control REQUIRED
        elementary
        pkgmgr-info
        capi-system-info
+       capi-system-device
        capi-appfw-application
        aul
        screen_connector_watcher_evas
index 19b2538e10a6f3130c2a9e57b9619c1c42504306..5e3d46872a8f38db19b56aef7bc7ada5ae4185e8 100644 (file)
@@ -34,6 +34,8 @@
 #include <Ecore_Wl2.h>
 #include <gio/gio.h>
 #include <aul_watch_control.h>
+#include <device/display.h>
+#include <device/callback.h>
 
 #include "watch_control_private.h"
 
@@ -86,9 +88,20 @@ static struct manual_render_s __manual_render;
 static int __listen_launch_signal(void);
 static void __ignore_launch_signal(void);
 static void __set_viewer_appid(void);
-static void __manual_render_start(void);
+static void __manual_render_start(bool force_resume);
 static void __manual_render_stop(void);
 
+static bool __lcd_is_off(void)
+{
+       int ret = 0;
+       display_state_e state = DISPLAY_STATE_NORMAL;
+
+       ret = device_display_get_state(&state);
+       if (ret < 0 || state == DISPLAY_STATE_SCREEN_OFF)
+               return true;
+       return false;
+}
+
 static bool __watch_is_visible(void)
 {
        Evas_Object *image;
@@ -106,20 +119,41 @@ static bool __watch_is_visible(void)
 static gboolean __manual_render_timeout_cb(gpointer data)
 {
        _W("Manual render timeout expired");
-       watch_manager_pause();
        __manual_render_stop();
        __manual_render.timer = 0;
        return G_SOURCE_REMOVE;
 }
 
-static gboolean __pause_timeout_cb(gpointer data)
+static gboolean __manual_render_pause_timeout_cb(gpointer data)
 {
-       if (elm_win_iconified_get(__win))
-               watch_manager_pause();
+       int lcdoff = __lcd_is_off();
+
+       _W("Manual render pause timer is expired, lcdoff %d", lcdoff);
+       if (lcdoff)
+               watch_manager_notify_paused_status_of_viewer();
 
+       __manual_render.pause_timer = 0;
        return G_SOURCE_REMOVE;
 }
 
+static void __manual_render_set_pause_timer(void)
+{
+       if (__manual_render.pause_timer)
+               return;
+
+       __manual_render.pause_timer = g_timeout_add(200,
+                       __manual_render_pause_timeout_cb, NULL);
+}
+
+static void __manual_render_unset_pause_timer(void)
+{
+       if (!__manual_render.pause_timer)
+               return;
+
+       g_source_remove(__manual_render.pause_timer);
+       __manual_render.pause_timer = 0;
+}
+
 static void __manual_render_unset_timer(void)
 {
        if (!__manual_render.timer)
@@ -132,13 +166,13 @@ static void __manual_render_unset_timer(void)
 static void __manual_render_set_timer(void)
 {
        if (__manual_render.timer)
-               __manual_render_unset_timer();
+               return;
 
-       __manual_render.timer = g_timeout_add(200, __manual_render_timeout_cb,
-                       NULL);
+       __manual_render.timer = g_timeout_add(200,
+                       __manual_render_timeout_cb, NULL);
 }
 
-static void __manual_render_start(void)
+static void __manual_render_start(bool force_resume)
 {
        if (!__watch_is_visible()) {
                _W("Watch is not visible. Skip manual render");
@@ -158,10 +192,20 @@ static void __manual_render_start(void)
        }
 
        elm_win_norender_push(__win);
-       watch_manager_notify_resumed_status_of_viewer();
+       __change_viewer_visibility(AUL_SCREEN_STATUS_PRE_RESUME, false);
        watch_manager_resume();
+       __manual_render_unset_timer();
        __manual_render_set_timer();
        __manual_render.started = true;
+
+       if (force_resume) {
+               watch_manager_notify_resumed_status_of_viewer();
+               if (__lcd_is_off()) {
+                       _W("Pause timer is started");
+                       __manual_render_unset_pause_timer();
+                       __manual_render_set_pause_timer();
+               }
+       }
 }
 
 static void __manual_render_stop(void)
@@ -179,22 +223,13 @@ static void __manual_render_stop(void)
 static void __aul_watch_control_cb(bundle *b, void *user_data)
 {
        bool v = __watch_is_visible();
-       bool i = elm_win_iconified_get(__win);
 
        if (!v)
                return;
-       __manual_render_start();
-       if (i) {
-               _D("Watch AppControl obj visibility[%d] win visibility[%d]", v, !i);
-               if (__manual_render.pause_timer)
-                       g_source_remove(__manual_render.pause_timer);
-
-               __manual_render.pause_timer = g_timeout_add(200, __pause_timeout_cb,
-                       NULL);
-       }
+       __manual_render_start(true);
 }
 
-static gboolean __delay_resume_cb(gpointer data)
+static gboolean __force_resume_cb(gpointer data)
 {
        watch_manager_resume();
        return G_SOURCE_REMOVE;
@@ -207,8 +242,8 @@ static void __obj_move_cb(void *data, Evas *e, Evas_Object *obj,
 
        if (!v)
                return;
-       __manual_render_start();
-       g_idle_add(__delay_resume_cb, NULL);
+       __manual_render_start(true);
+       g_idle_add(__force_resume_cb, NULL);
 }
 
 static Eina_Bool __window_on_pre_visibility(void *data, int type, void *event)
@@ -234,14 +269,13 @@ static Eina_Bool __window_on_pre_visibility(void *data, int type, void *event)
                return ECORE_CALLBACK_RENEW;
 
         if (ev && ev->type == ECORE_WL2_WINDOW_VISIBILITY_TYPE_PRE_UNOBSCURED) {
-                __manual_render_start();
+                __manual_render_start(false);
                 LOGD("[__WINDOW_PRE_VISIBILITY_CHANGE__] win_id(%d)", ev->win);
         }
 
         return ECORE_CALLBACK_RENEW;
 }
 
-
 static int __manual_render_init(void)
 {
        int ret;