X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=adaptors%2Ftizen%2Fframework-tizen.cpp;h=f437a92c4e1cf91a6f636bdf2f51b812033184e3;hb=3f6b02327d95f846759b251568ab34a03c545096;hp=1eef7940e38f73d36e20969076d3fbd54c40561f;hpb=8662d9566c568ebb35281da5cc4b49e836c90755;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/adaptors/tizen/framework-tizen.cpp b/adaptors/tizen/framework-tizen.cpp index 1eef794..f437a92 100644 --- a/adaptors/tizen/framework-tizen.cpp +++ b/adaptors/tizen/framework-tizen.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,14 +19,26 @@ #include "framework.h" // EXTERNAL INCLUDES -#include +#include +#include +#include #include #include -#ifdef OVER_TIZEN_SDK_2_2 #include -#include +#include + +// CONDITIONAL INCLUDES +#ifdef APPCORE_WATCH_AVAILABLE +#include #endif +#ifdef DALI_ELDBUS_AVAILABLE +#include +#endif // DALI_ELDBUS_AVAILABLE + +#if defined( TIZEN_PLATFORM_CONFIG_SUPPORTED ) && TIZEN_PLATFORM_CONFIG_SUPPORTED +#include +#endif // TIZEN_PLATFORM_CONFIG_SUPPORTED #include @@ -42,62 +54,119 @@ namespace Internal namespace Adaptor { +#if defined(DEBUG_ENABLED) namespace { +Integration::Log::Filter* gDBusLogging = Integration::Log::Filter::New( Debug::NoLogging, false, "LOG_ADAPTOR_EVENTS_DBUS" ); +} // anonymous namespace +#endif + +namespace AppCore +{ + +typedef enum +{ + LOW_MEMORY, //< The low memory event + LOW_BATTERY, //< The low battery event + LANGUAGE_CHANGED, //< The system language changed event + DEVICE_ORIENTATION_CHANGED, //< The device orientation changed event + REGION_FORMAT_CHANGED, //< The region format changed event + SUSPENDED_STATE_CHANGED, //< The suspended state changed event of the application + UPDATE_REQUESTED, //< The update requested event. This event can occur when an app needs to be updated. It is dependent on target devices. +} AppEventType; + +static int AppEventConverter[APPCORE_BASE_EVENT_MAX] = +{ + [LOW_MEMORY] = APPCORE_BASE_EVENT_LOW_MEMORY, + [LOW_BATTERY] = APPCORE_BASE_EVENT_LOW_BATTERY, + [LANGUAGE_CHANGED] = APPCORE_BASE_EVENT_LANG_CHANGE, + [DEVICE_ORIENTATION_CHANGED] = APPCORE_BASE_EVENT_DEVICE_ORIENTATION_CHANGED, + [REGION_FORMAT_CHANGED] = APPCORE_BASE_EVENT_REGION_CHANGE, + [SUSPENDED_STATE_CHANGED] = APPCORE_BASE_EVENT_SUSPENDED_STATE_CHANGE, +}; + +struct AppEventInfo +{ + AppEventType type; + void *value; +}; -/// Application Status Enum -enum +typedef struct AppEventInfo *AppEventInfoPtr; + +typedef void (*AppEventCallback)(AppEventInfoPtr eventInfo, void *userData); + +struct AppEventHandler { - APP_CREATE, - APP_TERMINATE, - APP_PAUSE, - APP_RESUME, - APP_RESET, - APP_CONTROL, - APP_LANGUAGE_CHANGE, - APP_DEVICE_ROTATED, - APP_REGION_CHANGED, - APP_BATTERY_LOW, - APP_MEMORY_LOW + AppEventType type; + AppEventCallback cb; + void *data; + void *raw; }; -} // Unnamed namespace +typedef struct AppEventHandler *AppEventHandlerPtr; + +int EventCallback(void *event, void *data) +{ + AppEventHandlerPtr handler = static_cast(data); + + struct AppEventInfo appEvent; + + appEvent.type = handler->type; + appEvent.value = event; + + if (handler->cb) + handler->cb(&appEvent, handler->data); + + return 0; +} + +int AppAddEventHandler(AppEventHandlerPtr *eventHandler, AppEventType eventType, AppEventCallback callback, void *userData) +{ + AppEventHandlerPtr handler; + + handler = static_cast( calloc(1, sizeof(struct AppEventHandler)) ); + if (!handler) + { + DALI_LOG_ERROR( "failed to create handler" ); + return TIZEN_ERROR_UNKNOWN; + } + else + { + handler->type = eventType; + handler->cb = callback; + handler->data = userData; + handler->raw = appcore_base_add_event( static_cast(AppEventConverter[static_cast(eventType)]), EventCallback, handler); + + *eventHandler = handler; + + return TIZEN_ERROR_NONE; + } +} + +} // namespace Appcore /** * Impl to hide EFL data members */ struct Framework::Impl { - // Constructor - - Impl(void* data) +// Constructor + Impl(void* data, Type type ) : mAbortCallBack( NULL ), mCallbackManager( NULL ) +#ifdef APPCORE_WATCH_AVAILABLE + , mWatchCallback() +#endif { - mEventCallback.create = AppCreate; - mEventCallback.terminate = AppTerminate; - mEventCallback.pause = AppPause; - mEventCallback.resume = AppResume; -#ifndef OVER_TIZEN_SDK_2_2 - mEventCallback.service = AppService; - - mEventCallback.low_memory = NULL; - mEventCallback.low_battery = NULL; - mEventCallback.device_orientation = AppDeviceRotated; - mEventCallback.language_changed = AppLanguageChanged; - mEventCallback.region_format_changed = NULL; - -#else - mEventCallback.app_control = AppControl; - - ui_app_add_event_handler(&handlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, AppBatteryLow, data); - ui_app_add_event_handler(&handlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, AppMemoryLow, data); - ui_app_add_event_handler(&handlers[APP_EVENT_DEVICE_ORIENTATION_CHANGED], APP_EVENT_DEVICE_ORIENTATION_CHANGED, AppDeviceRotated, data); - ui_app_add_event_handler(&handlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, AppLanguageChanged, data); - ui_app_add_event_handler(&handlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, AppRegionChanged, data); + mFramework = static_cast(data); +#ifndef APPCORE_WATCH_AVAILABLE + if ( type == WATCH ) + { + throw Dali::DaliException( "", "Watch Application is not supported." ); + } #endif - + mApplicationType = type; mCallbackManager = CallbackManager::New(); } @@ -111,48 +180,80 @@ struct Framework::Impl delete mCallbackManager; } - // Data + int AppMain() + { + int ret; + + if (mApplicationType == NORMAL) + { + ret = AppNormalMain(); + } + else + { + ret = AppWatchMain(); + } + return ret; + } + + void AppExit() + { + if (mApplicationType == NORMAL) + { + AppNormalExit(); + } + else + { + AppWatchExit(); + } + } + + // Data + Type mApplicationType; CallbackBase* mAbortCallBack; CallbackManager *mCallbackManager; -#ifndef OVER_TIZEN_SDK_2_2 - app_event_callback_s mEventCallback; -#else - ui_app_lifecycle_callback_s mEventCallback; - app_event_handler_h handlers[5]; + Framework* mFramework; + AppCore::AppEventHandlerPtr handlers[5]; +#ifdef APPCORE_WATCH_AVAILABLE + watch_app_lifecycle_callback_s mWatchCallback; + app_event_handler_h watchHandlers[5]; #endif - /** - * Called by AppCore on application creation. - */ - static bool AppCreate(void *data) + static int AppCreate(void *data) { - return static_cast(data)->AppStatusHandler(APP_CREATE, NULL); + appcore_ui_base_on_create(); + return static_cast( static_cast(data)->Create() ); } - /** - * Called by AppCore when the application should terminate. - */ - static void AppTerminate(void *data) + static int AppTerminate(void *data) { - static_cast(data)->AppStatusHandler(APP_TERMINATE, NULL); + appcore_ui_base_on_terminate(); + Observer *observer = &static_cast(data)->mObserver; + + observer->OnTerminate(); + + return 0; } - /** - * Called by AppCore when the application is paused. - */ - static void AppPause(void *data) + static int AppPause(void *data) { - static_cast(data)->AppStatusHandler(APP_PAUSE, NULL); + appcore_ui_base_on_pause(); + Observer *observer = &static_cast(data)->mObserver; + + observer->OnPause(); + + return 0; } - /** - * Called by AppCore when the application is resumed. - */ - static void AppResume(void *data) + static int AppResume(void *data) { - static_cast(data)->AppStatusHandler(APP_RESUME, NULL); + appcore_ui_base_on_resume(); + Observer *observer = &static_cast(data)->mObserver; + + observer->OnResume(); + + return 0; } static void ProcessBundle(Framework* framework, bundle *bundleData) @@ -169,7 +270,7 @@ struct Framework::Impl framework->SetBundleName(bundleName); } - // get bundle id + // get bundle? id char* bundleId = const_cast(bundle_get_val(bundleData, "id")); if(bundleId != NULL) { @@ -177,89 +278,286 @@ struct Framework::Impl } } -#ifndef OVER_TIZEN_SDK_2_2 /** * Called by AppCore when the application is launched from another module (e.g. homescreen). * @param[in] b the bundle data which the launcher module sent */ - static void AppService(service_h service, void *data) + static int AppControl(bundle* bundleData, void *data) { - Framework* framework = static_cast(data); + app_control_h appControl = NULL; + + appcore_ui_base_on_control(bundleData); - if(framework == NULL) + if (bundleData) { - return; + if (app_control_create_event(bundleData, &appControl) != TIZEN_ERROR_NONE) + { + DALI_LOG_ERROR("Failed to create an app_control handle"); + } + } + else + { + if (app_control_create(&appControl) != TIZEN_ERROR_NONE) + { + DALI_LOG_ERROR("Failed to create an app_control handle"); + } } - bundle *bundleData = NULL; - service_to_bundle(service, &bundleData); + Framework* framework = static_cast(data); + Observer *observer = &framework->mObserver; + ProcessBundle(framework, bundleData); - framework->AppStatusHandler(APP_RESET, NULL); + observer->OnReset(); + observer->OnAppControl(appControl); + + app_control_destroy(appControl); + + return 0; } - static void AppLanguageChanged(void* user_data) + static int AppInit(int argc, char **argv, void *data) { - static_cast(user_data)->AppStatusHandler(APP_LANGUAGE_CHANGE, NULL); +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wold-style-cast" + + ecore_init(); + ecore_app_args_set( argc, (const char **)argv ); + +#pragma GCC diagnostic pop + return 0; + } + + static void AppFinish(void) + { + ecore_shutdown(); + + if(getenv("AUL_LOADER_INIT")) + { + unsetenv("AUL_LOADER_INIT"); + ecore_shutdown(); + } } - static void AppDeviceRotated(app_device_orientation_e orientation, void *user_data) + static void AppRun(void *data) { - static_cast(user_data)->AppStatusHandler(APP_DEVICE_ROTATED, NULL); + ecore_main_loop_begin(); } -#else + static void AppExit(void *data) + { + ecore_main_loop_quit(); + } - /** - * Called by AppCore when the application is launched from another module (e.g. homescreen). - * @param[in] b the bundle data which the launcher module sent - */ - static void AppControl(app_control_h app_control, void *data) + static void AppLanguageChanged(AppCore::AppEventInfoPtr event, void *data) + { + Observer *observer = &static_cast(data)->mObserver; + + observer->OnLanguageChanged(); + } + + static void AppDeviceRotated(AppCore::AppEventInfoPtr event_info, void *data) + { + } + + static void AppRegionChanged(AppCore::AppEventInfoPtr event, void *data) + { + Observer *observer = &static_cast(data)->mObserver; + + observer->OnRegionChanged(); + } + + static void AppBatteryLow(AppCore::AppEventInfoPtr event, void *data) + { + Observer *observer = &static_cast(data)->mObserver; + + observer->OnBatteryLow(); + } + + static void AppMemoryLow(AppCore::AppEventInfoPtr event, void *data) + { + Observer *observer = &static_cast(data)->mObserver; + + observer->OnMemoryLow(); + } + + + int AppNormalMain() + { + int ret; + + AppCore::AppAddEventHandler(&handlers[AppCore::LOW_BATTERY], AppCore::LOW_BATTERY, AppBatteryLow, mFramework); + AppCore::AppAddEventHandler(&handlers[AppCore::LOW_MEMORY], AppCore::LOW_MEMORY, AppMemoryLow, mFramework); + AppCore::AppAddEventHandler(&handlers[AppCore::DEVICE_ORIENTATION_CHANGED], AppCore::DEVICE_ORIENTATION_CHANGED, AppDeviceRotated, mFramework); + AppCore::AppAddEventHandler(&handlers[AppCore::LANGUAGE_CHANGED], AppCore::LANGUAGE_CHANGED, AppLanguageChanged, mFramework); + AppCore::AppAddEventHandler(&handlers[AppCore::REGION_FORMAT_CHANGED], AppCore::REGION_FORMAT_CHANGED, AppRegionChanged, mFramework); + + appcore_ui_base_ops ops = appcore_ui_base_get_default_ops(); + + /* override methods */ + ops.base.create = AppCreate; + ops.base.control = AppControl; + ops.base.terminate = AppTerminate; + ops.pause = AppPause; + ops.resume = AppResume; + ops.base.init = AppInit; + ops.base.finish = AppFinish; + ops.base.run = AppRun; + ops.base.exit = AppExit; + + ret = appcore_ui_base_init(ops, *mFramework->mArgc, *mFramework->mArgv, mFramework, APPCORE_UI_BASE_HINT_WINDOW_GROUP_CONTROL | + APPCORE_UI_BASE_HINT_WINDOW_STACK_CONTROL | + APPCORE_UI_BASE_HINT_BG_LAUNCH_CONTROL | + APPCORE_UI_BASE_HINT_HW_ACC_CONTROL | + APPCORE_UI_BASE_HINT_WINDOW_AUTO_CONTROL ); + + if (ret != TIZEN_ERROR_NONE) + return ret; + + appcore_ui_base_fini(); + + return TIZEN_ERROR_NONE; + } + + void AppNormalExit() + { + appcore_ui_base_exit(); + } + +#ifdef APPCORE_WATCH_AVAILABLE + static bool WatchAppCreate(int width, int height, void *data) + { + return static_cast(data)->Create(); + } + + static void WatchAppTimeTick(watch_time_h time, void *data) + { + Observer *observer = &static_cast(data)->mObserver; + WatchTime curTime(time); + + observer->OnTimeTick(curTime); + } + + static void WatchAppAmbientTick(watch_time_h time, void *data) + { + Observer *observer = &static_cast(data)->mObserver; + WatchTime curTime(time); + + observer->OnAmbientTick(curTime); + } + + static void WatchAppAmbientChanged(bool ambient, void *data) + { + Observer *observer = &static_cast(data)->mObserver; + + observer->OnAmbientChanged(ambient); + } + + static void WatchAppLanguageChanged(app_event_info_h event, void *data) + { + Observer *observer = &static_cast(data)->mObserver; + + observer->OnLanguageChanged(); + } + + static void WatchAppRegionChanged(app_event_info_h event, void *data) + { + Observer *observer = &static_cast(data)->mObserver; + + observer->OnRegionChanged(); + } + + static void WatchAppBatteryLow(app_event_info_h event, void *data) + { + Observer *observer = &static_cast(data)->mObserver; + + observer->OnBatteryLow(); + } + + static void WatchAppMemoryLow(app_event_info_h event, void *data) + { + Observer *observer = &static_cast(data)->mObserver; + + observer->OnMemoryLow(); + } + + static void WatchAppControl(app_control_h app_control, void *data) { Framework* framework = static_cast(data); - if(framework == NULL) - { - return; - } + Observer *observer = &framework->mObserver; bundle *bundleData = NULL; app_control_to_bundle(app_control, &bundleData); ProcessBundle(framework, bundleData); - framework->AppStatusHandler(APP_RESET, NULL); - framework->AppStatusHandler(APP_CONTROL, app_control); + observer->OnReset(); + observer->OnAppControl(app_control); } - static void AppLanguageChanged(app_event_info_h event_info, void *user_data) + static void WatchAppTerminate(void *data) { - static_cast(user_data)->AppStatusHandler(APP_LANGUAGE_CHANGE, NULL); + Observer *observer = &static_cast(data)->mObserver; + + observer->OnTerminate(); } - static void AppDeviceRotated(app_event_info_h event_info, void *user_data) + static void WatchAppPause(void *data) { - static_cast(user_data)->AppStatusHandler(APP_DEVICE_ROTATED, NULL); + Observer *observer = &static_cast(data)->mObserver; + + observer->OnPause(); } - static void AppRegionChanged(app_event_info_h event_info, void *user_data) + static void WatchAppResume(void *data) { - static_cast(user_data)->AppStatusHandler(APP_REGION_CHANGED, NULL); + Observer *observer = &static_cast(data)->mObserver; + + observer->OnResume(); } - static void AppBatteryLow(app_event_info_h event_info, void *user_data) +#endif + + int AppWatchMain() { - static_cast(user_data)->AppStatusHandler(APP_BATTERY_LOW, NULL); + int ret = true; + +#ifdef APPCORE_WATCH_AVAILABLE + mWatchCallback.create = WatchAppCreate; + mWatchCallback.app_control = WatchAppControl; + mWatchCallback.terminate = WatchAppTerminate; + mWatchCallback.pause = WatchAppPause; + mWatchCallback.resume = WatchAppResume; + mWatchCallback.time_tick = WatchAppTimeTick; + mWatchCallback.ambient_tick = WatchAppAmbientTick; + mWatchCallback.ambient_changed = WatchAppAmbientChanged; + + watch_app_add_event_handler(&watchHandlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, WatchAppBatteryLow, mFramework); + watch_app_add_event_handler(&watchHandlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, WatchAppMemoryLow, mFramework); + watch_app_add_event_handler(&watchHandlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, WatchAppLanguageChanged, mFramework); + watch_app_add_event_handler(&watchHandlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, WatchAppRegionChanged, mFramework); + + ret = watch_app_main(*mFramework->mArgc, *mFramework->mArgv, &mWatchCallback, mFramework); +#endif + return ret; } - static void AppMemoryLow(app_event_info_h event_info, void *user_data) + void AppWatchExit() { - static_cast(user_data)->AppStatusHandler(APP_MEMORY_LOW, NULL); +#ifdef APPCORE_WATCH_AVAILABLE + watch_app_exit(); +#endif } -#endif +private: + // Undefined + Impl( const Impl& impl ); + + // Undefined + Impl& operator=( const Impl& impl ); }; -Framework::Framework( Framework::Observer& observer, int *argc, char ***argv ) +Framework::Framework( Framework::Observer& observer, int *argc, char ***argv, Type type ) : mObserver(observer), mInitialised(false), mRunning(false), @@ -270,20 +568,21 @@ Framework::Framework( Framework::Observer& observer, int *argc, char ***argv ) mAbortHandler( MakeCallback( this, &Framework::AbortCallback ) ), mImpl(NULL) { - -#ifdef OVER_TIZEN_SDK_2_2 bool featureFlag = true; system_info_get_platform_bool( "tizen.org/feature/opengles.version.2_0", &featureFlag ); if( featureFlag == false ) { set_last_result( TIZEN_ERROR_NOT_SUPPORTED ); - throw Dali::DaliException( "", "OpenGL ES 2.0 is not supported." ); } +#ifdef DALI_ELDBUS_AVAILABLE + // Initialize ElDBus. + DALI_LOG_INFO( gDBusLogging, Debug::General, "Starting DBus Initialization\n" ); + eldbus_init(); #endif - InitThreads(); - mImpl = new Impl(this); + + mImpl = new Impl(this, type); } Framework::~Framework() @@ -293,30 +592,38 @@ Framework::~Framework() Quit(); } +#ifdef DALI_ELDBUS_AVAILABLE + // Shutdown ELDBus. + DALI_LOG_INFO( gDBusLogging, Debug::General, "Shutting down DBus\n" ); + eldbus_shutdown(); +#endif + delete mImpl; } +bool Framework::Create() +{ + mInitialised = true; + mObserver.OnInit(); + return true; +} + void Framework::Run() { mRunning = true; + int ret; -#ifndef OVER_TIZEN_SDK_2_2 - app_efl_main(mArgc, mArgv, &mImpl->mEventCallback, this); - -#else - int ret = ui_app_main(*mArgc, *mArgv, &mImpl->mEventCallback, this); + ret = mImpl->AppMain(); if (ret != APP_ERROR_NONE) { - DALI_LOG_ERROR("Framework::Run(), ui_app_main() is failed. err = %d", ret); + DALI_LOG_ERROR("Framework::Run(), ui_app_main() is failed. err = %d\n", ret); } -#endif - mRunning = false; } void Framework::Quit() { - app_efl_exit(); + mImpl->AppExit(); } bool Framework::IsMainLoopRunning() @@ -344,6 +651,25 @@ std::string Framework::GetBundleId() const return mBundleId; } +std::string Framework::GetResourcePath() +{ + std::string resourcePath = ""; +#if defined( TIZEN_PLATFORM_CONFIG_SUPPORTED ) && TIZEN_PLATFORM_CONFIG_SUPPORTED + resourcePath = app_get_resource_path(); +#else // For backwards compatibility with older Tizen versions + + // "DALI_APPLICATION_PACKAGE" is used to get the already configured Application package path. + const char* environmentVariable = "DALI_APPLICATION_PACKAGE"; + char* value = getenv( environmentVariable ); + if ( value != NULL ) + { + resourcePath = value; + } +#endif //TIZEN_PLATFORM_CONFIG_SUPPORTED + + return resourcePath; +} + void Framework::SetBundleId(const std::string& id) { mBundleId = id; @@ -362,84 +688,6 @@ void Framework::AbortCallback( ) } } -bool Framework::AppStatusHandler(int type, void *bundleData) -{ - switch (type) - { - case APP_CREATE: - { - mInitialised = true; - - // Connect to abnormal exit signals - mAbortHandler.AbortOnSignal( SIGINT ); - mAbortHandler.AbortOnSignal( SIGQUIT ); - mAbortHandler.AbortOnSignal( SIGKILL ); - - mObserver.OnInit(); - break; - } - - case APP_RESET: - { - mObserver.OnReset(); - break; - } - - case APP_RESUME: - { - mObserver.OnResume(); - break; - } - - case APP_TERMINATE: - { - mObserver.OnTerminate(); - break; - } - - case APP_PAUSE: - { - mObserver.OnPause(); - break; - } - - case APP_CONTROL: - { - mObserver.OnAppControl(bundleData); - break; - } - - case APP_LANGUAGE_CHANGE: - { - mObserver.OnLanguageChanged(); - break; - } - - case APP_REGION_CHANGED: - { - mObserver.OnRegionChanged(); - break; - } - - case APP_BATTERY_LOW: - { - mObserver.OnBatteryLow(); - break; - } - - case APP_MEMORY_LOW: - { - mObserver.OnMemoryLow(); - break; - } - - default: - break; - } - - return true; -} - } // namespace Adaptor } // namespace Internal