From d2135ace935693e29faef01f3990bbf577d5aa3f Mon Sep 17 00:00:00 2001 From: Changwoo KIM Date: Fri, 19 Jul 2019 13:53:35 +0900 Subject: [PATCH] Fix wrong pause/resume state of wathcface 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 --- packaging/libwidget_viewer.spec | 1 + watch-control/CMakeLists.txt | 1 + watch-control/src/control.c | 84 +++++++++++++++++++++++---------- 3 files changed, 61 insertions(+), 25 deletions(-) diff --git a/packaging/libwidget_viewer.spec b/packaging/libwidget_viewer.spec index 54d79732..2ed73f47 100644 --- a/packaging/libwidget_viewer.spec +++ b/packaging/libwidget_viewer.spec @@ -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 diff --git a/watch-control/CMakeLists.txt b/watch-control/CMakeLists.txt index 542b3da7..ca80f02a 100644 --- a/watch-control/CMakeLists.txt +++ b/watch-control/CMakeLists.txt @@ -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 diff --git a/watch-control/src/control.c b/watch-control/src/control.c index 19b2538e..5e3d4687 100644 --- a/watch-control/src/control.c +++ b/watch-control/src/control.c @@ -34,6 +34,8 @@ #include #include #include +#include +#include #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; -- 2.34.1