* limitations under the License.
*/
+#define _GNU_SOURCE
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <tizen-extension-client-protocol.h>
#include <Ecore.h>
-#include <Ecore_Evas.h>
-#include <Ecore_Input_Evas.h>
-#include <Elementary.h>
#include <glib-object.h>
#include <malloc.h>
#include <glib.h>
#include <aul_svc.h>
#include <bundle_internal.h>
#include <ttrace.h>
-#include <voice_control_elm.h>
-#include <voice_control_elm_private.h>
#include "appcore_base.h"
#include "appcore_ui_base.h"
unsigned int hint;
char *below_app;
char *appid;
+ bool bg_state;
int state;
Ecore_Event_Handler *hshow;
Ecore_Event_Handler *hhide;
Ecore_Event_Handler *hvchange;
Ecore_Event_Handler *hlower;
+ Ecore_Event_Handler *hpvchange;
} appcore_ui_base_context;
static struct wl_display *dsp;
static struct wl_registry *reg;
static struct tizen_policy *tz_policy;
-static bool bg_state = false;
static void __wl_listener_cb(void *data, struct wl_registry *reg,
uint32_t id, const char *interface, uint32_t ver)
return ECORE_CALLBACK_RENEW;
}
+static Eina_Bool __stub_pre_visibility_cb(void *data, int type, void *event)
+{
+ if (__context.ops.window.pre_visibility)
+ __context.ops.window.pre_visibility(type, event, __context.data);
+
+ return ECORE_CALLBACK_RENEW;
+}
+
static void __prepare_to_suspend(void)
{
int suspend = APPCORE_BASE_SUSPENDED_STATE_WILL_ENTER_SUSPEND;
static void __do_pause(void)
{
if (__context.state == AS_RUNNING) {
- if (__context.ops.pause)
+ if (__context.ops.pause) {
+ traceBegin(TTRACE_TAG_APPLICATION_MANAGER, "APPCORE:PAUSE");
__context.ops.pause(__context.data);
+ traceEnd(TTRACE_TAG_APPLICATION_MANAGER);
+ }
__context.state = AS_PAUSED;
__prepare_to_suspend();
__exit_from_suspend();
if (__context.ops.resume) {
LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:resume:start]", __context.appid);
+ traceBegin(TTRACE_TAG_APPLICATION_MANAGER, "APPCORE:RESUME");
__context.ops.resume(__context.data);
+ traceEnd(TTRACE_TAG_APPLICATION_MANAGER);
LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:resume:done]", __context.appid);
- LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:Launching:done]", __context.appid);
}
if ((__context.hint & APPCORE_UI_BASE_HINT_WINDOW_STACK_CONTROL) &&
__context.below_app) {
tizen_policy_set_background_state(tz_policy, getpid());
wl_display_roundtrip(dsp);
- bg_state = true;
- _DBG("bg state: %d", bg_state);
+ __context.bg_state = true;
+ _DBG("bg state: %d", __context.bg_state);
}
static void __unset_bg_state(void)
tizen_policy_unset_background_state(tz_policy, getpid());
wl_display_roundtrip(dsp);
- bg_state = false;
- _DBG("bg state: %d", bg_state);
+ __context.bg_state = false;
+ _DBG("bg state: %d", __context.bg_state);
}
static void __do_start(bundle *b)
if (__context.hint & APPCORE_UI_BASE_HINT_BG_LAUNCH_CONTROL) {
bg_launch = bundle_get_val(b, AUL_SVC_K_BG_LAUNCH);
if (bg_launch && strcmp(bg_launch, "enable") == 0) {
- if (!bg_state && __context.state != AS_RUNNING)
+ if (!__context.bg_state &&
+ __context.state != AS_RUNNING)
__set_bg_state();
} else {
- if (bg_state)
+ if (__context.bg_state)
__unset_bg_state();
}
}
if (__context.hint & APPCORE_UI_BASE_HINT_WINDOW_AUTO_CONTROL) {
- if (!bg_state)
+ if (!__context.bg_state)
__raise_win();
}
}
+static int __is_legacy_lifecycle(void)
+{
+ static int is_legacy = -1;
+ const char *api_version;
+
+ if (is_legacy != -1)
+ return is_legacy;
+
+ api_version = getenv("TIZEN_API_VERSION");
+ if (api_version) {
+ if (strverscmp("2.4", api_version) > 0 &&
+ strverscmp("2.2.1", api_version) < 0)
+ is_legacy = 1;
+ else
+ is_legacy = 0;
+ } else {
+ is_legacy = 0;
+ }
+
+ return is_legacy;
+}
+
EXPORT_API int appcore_ui_base_on_receive(aul_type type, bundle *b)
{
if (__context.state == AS_DYING) {
switch (type) {
case AUL_START:
__do_start(b);
+ if (__context.hint & APPCORE_UI_BASE_HINT_LEGACY_CONTROL) {
+ if (!__context.bg_state && __is_legacy_lifecycle()) {
+ _DBG("Legacy lifecycle");
+ __do_resume();
+ }
+ }
break;
case AUL_RESUME:
- if (bg_state)
+ if (__context.bg_state)
__unset_bg_state();
__raise_win();
break;
return 0;
}
-EXPORT_API int appcore_ui_base_on_create(void)
+static void __add_ecore_events(void)
{
- appcore_base_on_create();
+ __context.hshow = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_SHOW,
+ __stub_show_cb, NULL);
+ if (!__context.hshow)
+ _ERR("Failed to add ECORE_WL_EVENT_WINDOW_SHOW event");
+
+ __context.hhide = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_HIDE,
+ __stub_hide_cb, NULL);
+ if (!__context.hhide)
+ _ERR("Failed to add ECORE_WL_EVENT_WINDOW_HIDE event");
- __context.hshow = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_SHOW, __stub_show_cb, NULL);
- __context.hhide = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_HIDE, __stub_hide_cb, NULL);
__context.hvchange = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_VISIBILITY_CHANGE,
- __stub_visibility_cb, NULL);
- __context.hlower = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_LOWER, __stub_lower_cb, NULL);
+ __stub_visibility_cb, NULL);
+ if (!__context.hvchange)
+ _ERR("Failed to add ECORE_WL_EVENT_WINDOW_VISIBILITY_CHANGE event");
+
+ __context.hlower = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_LOWER,
+ __stub_lower_cb, NULL);
+ if (!__context.hlower)
+ _ERR("Failed to add ECORE_WL_EVENT_WINDOW_LOWER event");
+
+ __context.hpvchange = ecore_event_handler_add(ECORE_WL_EVENT_WINDOW_PRE_VISIBILITY_CHANGE,
+ __stub_pre_visibility_cb, NULL);
+ if (!__context.hpvchange)
+ _ERR("Failed to add ECORE_WL_EVENT_WINDOW_PRE_VISIBILITY_CHANGE event");
+}
+
+static void __del_ecore_events(void)
+{
+ if (__context.hshow) {
+ ecore_event_handler_del(__context.hshow);
+ __context.hshow = NULL;
+ }
+
+ if (__context.hhide) {
+ ecore_event_handler_del(__context.hhide);
+ __context.hhide = NULL;
+ }
+
+ if (__context.hvchange) {
+ ecore_event_handler_del(__context.hvchange);
+ __context.hvchange = NULL;
+ }
+
+ if (__context.hlower) {
+ ecore_event_handler_del(__context.hlower);
+ __context.hlower = NULL;
+ }
+
+ if (__context.hpvchange) {
+ ecore_event_handler_del(__context.hpvchange);
+ __context.hpvchange = NULL;
+ }
+}
+
+EXPORT_API int appcore_ui_base_on_create(void)
+{
+ __add_ecore_events();
+ appcore_base_on_create();
__context.state = AS_CREATED;
LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:create:done]", __context.appid);
}
+EXPORT_API void appcore_ui_base_window_on_pre_visibility(int type, void *event)
+{
+ Ecore_Wl_Event_Window_Pre_Visibility_Change *ev = event;
+ bool bvisibility;
+
+ if (ev && ev->type == ECORE_WL_WINDOW_VISIBILITY_TYPE_PRE_UNOBSCURED) {
+ __update_win((unsigned int)ev->win, 0, false);
+ bvisibility = __check_visible();
+
+ _DBG("bvisibility %d, b_active %d", bvisibility, b_active);
+ if (bvisibility && b_active == FALSE) {
+ _DBG(" Go to Resume state\n");
+ b_active = TRUE;
+ __do_resume();
+ }
+ }
+}
+
EXPORT_API int appcore_ui_base_init(appcore_ui_base_ops ops, int argc, char **argv,
void *data, unsigned int hint)
{
- char *hwacc;
const char *bg_launch;
bundle *b;
char appid[PATH_MAX] = {0, };
- int r;
- bool is_vc_vt_automode = false;
- appcore_ui_plugin_init(&ops, &hint);
+ ecore_wl_init(NULL);
+
+ appcore_ui_plugin_init(&ops, argc, argv, &hint);
aul_app_get_appid_bypid(getpid(), appid, sizeof(appid));
__context.ops = ops;
__context.data = data;
__context.appid = strdup(appid);
LOG(LOG_DEBUG, "LAUNCH", "[%s:Application:main:done]", appid);
- elm_init(argc, argv);
-
- r = vc_elm_is_supported_vt_auto(&is_vc_vt_automode);
- if (r != 0) {
- _ERR("[VC] Fail to get vconfkey of vt_automode");
- } else {
- if (is_vc_vt_automode == true) {
- vc_elm_initialize();
- vc_elm_set_auto_register_mode(2, 0);
- }
- }
-
- if (__context.hint & APPCORE_UI_BASE_HINT_HW_ACC_CONTROL) {
- hwacc = getenv("HWACC");
-
- if (hwacc == NULL) {
- _DBG("elm_config_accel_preference_set is not called");
- } else if (strcmp(hwacc, "USE") == 0) {
- elm_config_accel_preference_set("hw");
- _DBG("elm_config_accel_preference_set : hw");
- } else if (strcmp(hwacc, "NOT_USE") == 0) {
- elm_config_accel_preference_set("none");
- _DBG("elm_config_accel_preference_set : none");
- } else {
- _DBG("elm_config_accel_preference_set is not called");
- }
- }
-
if (__context.hint & APPCORE_UI_BASE_HINT_BG_LAUNCH_CONTROL) {
b = bundle_import_from_argv(argc, argv);
if (b) {
EXPORT_API void appcore_ui_base_fini(void)
{
- bool is_vc_vt_automode = false;
- int r;
-
- appcore_base_fini();
- appcore_ui_plugin_fini();
-
- if (__context.hshow)
- ecore_event_handler_del(__context.hshow);
- if (__context.hhide)
- ecore_event_handler_del(__context.hhide);
- if (__context.hvchange)
- ecore_event_handler_del(__context.hvchange);
- if (__context.hlower)
- ecore_event_handler_del(__context.hlower);
-
+ __del_ecore_events();
__finish_wl();
- r = vc_elm_is_supported_vt_auto(&is_vc_vt_automode);
- if (r != 0) {
- _ERR("[VC] Fail to get vconfkey of vt_automode");
- } else {
- if (is_vc_vt_automode == true)
- vc_elm_deinitialize();
- }
-
- elm_shutdown();
-
- /* Check loader case */
- if (getenv("AUL_LOADER_INIT")) {
- unsetenv("AUL_LOADER_INIT");
- elm_shutdown();
- }
-
free(__context.appid);
__context.appid = NULL;
+
+ appcore_ui_plugin_fini();
+ appcore_base_fini();
+ ecore_wl_shutdown();
}
EXPORT_API void appcore_ui_base_pause(void)
return __get_main_surface();
}
+EXPORT_API int appcore_ui_base_get_hint(void)
+{
+ return __context.hint;
+}
+
+EXPORT_API bool appcore_ui_base_get_bg_state(void)
+{
+ return __context.bg_state;
+}
+
+EXPORT_API void appcore_ui_base_set_bg_state(bool bg_state)
+{
+ __context.bg_state = bg_state;
+}
+
static int __on_receive(aul_type type, bundle *b, void *data)
{
return appcore_ui_base_on_receive(type, b);
appcore_ui_base_window_on_visibility(type, event);
}
-static void __run(void *data)
-{
- elm_run();
-}
-
-static void __exit(void *data)
+static void __window_on_pre_visibility(int type, void *event, void *data)
{
- elm_exit();
+ appcore_ui_base_window_on_pre_visibility(type, event);
}
EXPORT_API appcore_ui_base_ops appcore_ui_base_get_default_ops(void)
ops.base.create = __on_create;
ops.base.terminate = __on_terminate;
ops.base.receive = __on_receive;
- ops.base.run = __run;
- ops.base.exit = __exit;
+ ops.base.init = NULL;
+ ops.base.finish = NULL;
+ ops.base.run = NULL;
+ ops.base.exit = NULL;
ops.pause = __on_pause;
ops.resume = __on_resume;
ops.window.hide = __window_on_hide;
ops.window.lower = __window_on_lower;
ops.window.visibility = __window_on_visibility;
+ ops.window.pre_visibility = __window_on_pre_visibility;
return ops;
}