2 * Copyright (c) 2022 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali/internal/adaptor/common/framework.h>
22 #include <app_common.h>
23 #include <app_control_internal.h>
25 #include <bundle_internal.h>
26 #include <system_info.h>
27 #include <system_settings.h>
28 #include <widget_base.h>
29 #include <app_core_ui_base.hh>
30 #include <app_event_internal.hh>
31 // CONDITIONAL INCLUDES
32 #ifdef APPCORE_WATCH_AVAILABLE
33 #include <appcore-watch/watch_app.h>
35 #ifdef DALI_ELDBUS_AVAILABLE
37 #endif // DALI_ELDBUS_AVAILABLE
39 #if defined(TIZEN_PLATFORM_CONFIG_SUPPORTED) && TIZEN_PLATFORM_CONFIG_SUPPORTED
40 #include <tzplatform_config.h>
41 #endif // TIZEN_PLATFORM_CONFIG_SUPPORTED
43 #ifdef COMPONENT_APPLICATION_SUPPORT
44 #include <component_based_app_base.h>
47 #include <dali/integration-api/debug.h>
48 #include <dali/integration-api/trace.h>
51 #include <dali/internal/system/common/callback-manager.h>
52 #include <dali/internal/system/linux/dali-ecore.h>
54 using namespace tizen_cpp;
64 #if defined(DEBUG_ENABLED)
65 Integration::Log::Filter* gDBusLogging = Integration::Log::Filter::New(Debug::NoLogging, false, "LOG_ADAPTOR_EVENTS_DBUS");
67 DALI_INIT_TRACE_FILTER(gTraceFilter, DALI_TRACE_FRAMEWORK, true);
69 bool IsWidgetFeatureEnabled()
71 static bool feature = false;
72 static bool retrieved = false;
80 ret = system_info_get_platform_bool("http://tizen.org/feature/shell.appwidget", &feature);
81 if(ret != SYSTEM_INFO_ERROR_NONE)
83 DALI_LOG_ERROR("failed to get system info");
91 } // anonymous namespace
97 LOW_MEMORY, //< The low memory event
98 LOW_BATTERY, //< The low battery event
99 LANGUAGE_CHANGED, //< The system language changed event
100 DEVICE_ORIENTATION_CHANGED, //< The device orientation changed event
101 REGION_FORMAT_CHANGED, //< The region format changed event
102 SUSPENDED_STATE_CHANGED, //< The suspended state changed event of the application
103 UPDATE_REQUESTED, //< The update requested event. This event can occur when an app needs to be updated. It is dependent on target devices.
106 static int AppEventConverter[APPCORE_BASE_EVENT_MAX] =
108 [LOW_MEMORY] = APPCORE_BASE_EVENT_LOW_MEMORY,
109 [LOW_BATTERY] = APPCORE_BASE_EVENT_LOW_BATTERY,
110 [LANGUAGE_CHANGED] = APPCORE_BASE_EVENT_LANG_CHANGE,
111 [DEVICE_ORIENTATION_CHANGED] = APPCORE_BASE_EVENT_DEVICE_ORIENTATION_CHANGED,
112 [REGION_FORMAT_CHANGED] = APPCORE_BASE_EVENT_REGION_CHANGE,
113 [SUSPENDED_STATE_CHANGED] = APPCORE_BASE_EVENT_SUSPENDED_STATE_CHANGE,
122 typedef struct AppEventInfo* AppEventInfoPtr;
124 typedef void (*AppEventCallback)(AppEventInfoPtr eventInfo, void* userData);
126 struct AppEventHandler
134 typedef struct AppEventHandler* AppEventHandlerPtr;
136 int EventCallback(void* event, void* data)
138 AppEventHandlerPtr handler = static_cast<AppEventHandlerPtr>(data);
140 struct AppEventInfo appEvent;
142 appEvent.type = handler->type;
143 appEvent.value = event;
146 handler->cb(&appEvent, handler->data);
151 int AppAddEventHandler(AppEventHandlerPtr* eventHandler, AppEventType eventType, AppEventCallback callback, void* userData)
153 AppEventHandlerPtr handler;
155 handler = static_cast<AppEventHandlerPtr>(calloc(1, sizeof(struct AppEventHandler)));
158 DALI_LOG_ERROR("failed to create handler");
159 return TIZEN_ERROR_UNKNOWN;
163 handler->type = eventType;
164 handler->cb = callback;
165 handler->data = userData;
166 handler->raw = appcore_base_add_event(static_cast<appcore_base_event>(AppEventConverter[static_cast<int>(eventType)]), EventCallback, handler);
168 *eventHandler = handler;
170 return TIZEN_ERROR_NONE;
174 DeviceStatus::Memory::Status GetMemoryStatus(app_event_low_memory_status_e memoryStatus)
178 case APP_EVENT_LOW_MEMORY_SOFT_WARNING: // 0x02
180 return Dali::DeviceStatus::Memory::Status::LOW;
182 case APP_EVENT_LOW_MEMORY_HARD_WARNING: // 0x04
184 return Dali::DeviceStatus::Memory::Status::CRITICALLY_LOW;
186 default: // APP_EVENT_LOW_MEMORY_NORMAL 0x01
188 return Dali::DeviceStatus::Memory::Status::NORMAL;
193 DeviceStatus::Battery::Status GetBatteryStatus(app_event_low_battery_status_e batteryStatus)
195 switch(batteryStatus)
197 case APP_EVENT_LOW_BATTERY_POWER_OFF: // 1
199 return Dali::DeviceStatus::Battery::Status::POWER_OFF;
201 case APP_EVENT_LOW_BATTERY_CRITICAL_LOW: // 2
203 return Dali::DeviceStatus::Battery::Status::CRITICALLY_LOW;
207 return Dali::DeviceStatus::Battery::Status::NORMAL;
212 } // namespace AppCore
215 * Impl to hide EFL data members
217 struct Framework::Impl
219 class UiAppContext : public AppCoreUiBase
222 explicit UiAppContext(unsigned int hint, Framework* framework)
223 : AppCoreUiBase(hint),
224 mFramework(framework)
226 mLanguageChanged = std::make_shared<AppEvent>(IAppCore::IEvent::Type::LANG_CHANGE, OnLanguageChanged, this);
227 AddEvent(mLanguageChanged);
229 mDeviceOrientationChanged = std::make_shared<AppEvent>(IAppCore::IEvent::Type::DEVICE_ORIENTATION_CHANGED, OnDeviceOrientationChanged, this);
230 AddEvent(mDeviceOrientationChanged);
232 mRegionFormatChanged = std::make_shared<AppEvent>(IAppCore::IEvent::Type::REGION_CHANGE, OnRegionFormatChanged, this);
233 AddEvent(mRegionFormatChanged);
235 mLowMemory = std::make_shared<AppEvent>(IAppCore::IEvent::Type::LOW_MEMORY, OnLowMemory, this);
236 AddEvent(mLowMemory);
238 mLowBattery = std::make_shared<AppEvent>(IAppCore::IEvent::Type::LOW_BATTERY, OnLowBattery, this);
239 AddEvent(mLowBattery);
242 virtual ~UiAppContext()
244 RemoveEvent(mLowBattery);
245 RemoveEvent(mLowMemory);
246 RemoveEvent(mRegionFormatChanged);
247 RemoveEvent(mDeviceOrientationChanged);
248 RemoveEvent(mLanguageChanged);
251 int OnCreate() override
253 AppCoreUiBase::OnCreate();
254 mFramework->Create();
258 int OnTerminate() override
260 AppCoreUiBase::OnTerminate();
261 auto* observer = &mFramework->mObserver;
262 observer->OnTerminate();
266 int OnPause() override
268 AppCoreUiBase::OnPause();
269 auto* observer = &mFramework->mObserver;
274 int OnResume() override
276 AppCoreUiBase::OnResume();
277 auto* observer = &mFramework->mObserver;
278 observer->OnResume();
282 int OnControl(tizen_base::Bundle b) override
284 AppCoreUiBase::OnControl(b);
286 app_control_h appControl = nullptr;
288 auto* bundleData = b.GetHandle();
291 if(app_control_create_event(bundleData, &appControl) != TIZEN_ERROR_NONE)
293 DALI_LOG_ERROR("Failed to create an app_control handle");
299 if(app_control_create(&appControl) != TIZEN_ERROR_NONE)
301 DALI_LOG_ERROR("Failed to create an app_control handle");
306 auto* observer = &mFramework->mObserver;
307 ProcessBundle(mFramework, bundleData);
309 observer->OnAppControl(appControl);
310 app_control_destroy(appControl);
314 void OnLoopInit(int argc, char** argv) override
316 #pragma GCC diagnostic push
317 #pragma GCC diagnostic ignored "-Wold-style-cast"
319 ecore_app_args_set(argc, (const char**)argv);
320 #pragma GCC diagnostic pop
322 #ifdef DALI_ELDBUS_AVAILABLE
323 // Initialize ElDBus.
324 DALI_LOG_INFO(gDBusLogging, Debug::General, "Starting DBus Initialization\n");
329 void OnLoopFinish() override
333 if(getenv("AUL_LOADER_INIT"))
335 setenv("AUL_LOADER_INIT", "0", 1);
339 #ifdef DALI_ELDBUS_AVAILABLE
341 DALI_LOG_INFO(gDBusLogging, Debug::General, "Shutting down DBus\n");
346 void OnLoopRun() override
348 ecore_main_loop_begin();
351 void OnLoopExit() override
353 ecore_main_loop_quit();
357 static void OnLanguageChanged(app_event_info_h event_info, void* user_data)
359 auto* context = static_cast<UiAppContext*>(user_data);
360 auto* framework = context->mFramework;
361 Observer* observer = &framework->mObserver;
363 char* lang = nullptr;
364 app_event_get_language(event_info, &lang);
367 framework->SetLanguage(std::string(lang));
368 observer->OnLanguageChanged();
373 DALI_LOG_ERROR("NULL pointer in Language changed event\n");
377 static void OnDeviceOrientationChanged(app_event_info_h event_info, void* user_data)
381 static void OnRegionFormatChanged(app_event_info_h event_info, void* user_data)
383 auto* context = static_cast<UiAppContext*>(user_data);
384 auto* framework = context->mFramework;
385 Observer* observer = &framework->mObserver;
387 char* region = nullptr;
388 app_event_get_region_format(event_info, ®ion);
391 framework->SetRegion(std::string(region));
392 observer->OnRegionChanged();
397 DALI_LOG_ERROR("NULL pointer in Region changed event\n");
401 static void OnLowBattery(app_event_info_h event_info, void* user_data)
403 auto* context = static_cast<UiAppContext*>(user_data);
404 auto* framework = context->mFramework;
405 Observer* observer = &framework->mObserver;
407 app_event_low_battery_status_e status;
408 app_event_get_low_battery_status(event_info, &status);
409 Dali::DeviceStatus::Battery::Status result = AppCore::GetBatteryStatus(status);
410 observer->OnBatteryLow(result);
413 static void OnLowMemory(app_event_info_h event_info, void* user_data)
415 auto* context = static_cast<UiAppContext*>(user_data);
416 auto* framework = context->mFramework;
417 Observer* observer = &framework->mObserver;
419 app_event_low_memory_status_e status;
420 app_event_get_low_memory_status(event_info, &status);
421 Dali::DeviceStatus::Memory::Status result = AppCore::GetMemoryStatus(status);
422 observer->OnMemoryLow(result);
425 void ProcessBundle(Framework* framework, bundle* bundleData)
427 if(bundleData == nullptr)
433 char* bundleName = const_cast<char*>(bundle_get_val(bundleData, "name"));
434 if(bundleName != nullptr)
436 framework->SetBundleName(bundleName);
440 char* bundleId = const_cast<char*>(bundle_get_val(bundleData, "id"));
441 if(bundleId != nullptr)
443 framework->SetBundleId(bundleId);
448 Framework* mFramework;
449 std::shared_ptr<AppEvent> mLanguageChanged;
450 std::shared_ptr<AppEvent> mDeviceOrientationChanged;
451 std::shared_ptr<AppEvent> mRegionFormatChanged;
452 std::shared_ptr<AppEvent> mLowBattery;
453 std::shared_ptr<AppEvent> mLowMemory;
457 Impl(void* data, Type type)
458 : mAbortCallBack(NULL),
459 mCallbackManager(NULL)
460 #ifdef APPCORE_WATCH_AVAILABLE
465 mFramework = static_cast<Framework*>(data);
467 #ifndef APPCORE_WATCH_AVAILABLE
470 throw Dali::DaliException("", "Watch Application is not supported.");
473 mApplicationType = type;
474 mCallbackManager = CallbackManager::New();
479 delete mAbortCallBack;
481 // we're quiting the main loop so
482 // mCallbackManager->RemoveAllCallBacks() does not need to be called
483 // to delete our abort handler
484 delete mCallbackManager;
489 // TODO: The app-core-cpp has to be applied to the other app types.
491 switch(mApplicationType)
495 ret = AppNormalMain();
500 ret = AppWidgetMain();
505 ret = AppWatchMain();
508 #ifdef COMPONENT_APPLICATION_SUPPORT
511 ret = AppComponentMain();
521 switch(mApplicationType)
538 #ifdef COMPONENT_APPLICATION_SUPPORT
548 void SetLanguage(const std::string& language)
550 mLanguage = language;
553 void SetRegion(const std::string& region)
558 std::string GetLanguage()
560 if(mLanguage.empty())
562 char* language = nullptr;
563 system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &language);
565 if(language != nullptr)
567 mLanguage = std::string(language);
574 std::string GetRegion()
578 char* region = nullptr;
579 system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY, ®ion);
581 if(region != nullptr)
583 mRegion = std::string(region);
591 Type mApplicationType;
592 CallbackBase* mAbortCallBack;
593 CallbackManager* mCallbackManager;
594 std::string mLanguage{};
595 std::string mRegion{};
597 Framework* mFramework;
598 AppCore::AppEventHandlerPtr handlers[5];
599 std::unique_ptr<UiAppContext> mUiAppContext;
600 #ifdef APPCORE_WATCH_AVAILABLE
601 watch_app_lifecycle_callback_s mWatchCallback;
602 app_event_handler_h watchHandlers[5];
605 static void ProcessBundle(Framework* framework, bundle* bundleData)
607 if(bundleData == NULL)
613 char* bundleName = const_cast<char*>(bundle_get_val(bundleData, "name"));
614 if(bundleName != NULL)
616 framework->SetBundleName(bundleName);
620 char* bundleId = const_cast<char*>(bundle_get_val(bundleData, "id"));
623 framework->SetBundleId(bundleId);
627 static void AppInit(int argc, char** argv, void* data)
629 #pragma GCC diagnostic push
630 #pragma GCC diagnostic ignored "-Wold-style-cast"
632 ecore_app_args_set(argc, (const char**)argv);
633 #pragma GCC diagnostic pop
635 #ifdef DALI_ELDBUS_AVAILABLE
636 // Initialize ElDBus.
637 DALI_LOG_INFO(gDBusLogging, Debug::General, "Starting DBus Initialization\n");
642 static void AppFinish(void)
646 if(getenv("AUL_LOADER_INIT"))
648 setenv("AUL_LOADER_INIT", "0", 1);
652 #ifdef DALI_ELDBUS_AVAILABLE
654 DALI_LOG_INFO(gDBusLogging, Debug::General, "Shutting down DBus\n");
659 static void AppRun(void* data)
661 ecore_main_loop_begin();
664 static void AppExit(void* data)
666 ecore_main_loop_quit();
669 static void AppLanguageChanged(AppCore::AppEventInfoPtr event, void* data)
671 Framework* framework = static_cast<Framework*>(data);
672 Observer* observer = &framework->mObserver;
674 if(event && event->value)
676 framework->SetLanguage(std::string(static_cast<const char*>(event->value)));
677 observer->OnLanguageChanged();
681 DALI_LOG_ERROR("NULL pointer in Language changed event\n");
685 static void AppDeviceRotated(AppCore::AppEventInfoPtr event_info, void* data)
689 static void AppRegionChanged(AppCore::AppEventInfoPtr event, void* data)
691 Framework* framework = static_cast<Framework*>(data);
692 Observer* observer = &framework->mObserver;
694 if(event && event->value)
696 framework->SetRegion(std::string(static_cast<const char*>(event->value)));
697 observer->OnRegionChanged();
701 DALI_LOG_ERROR("NULL pointer in Region changed event\n");
705 static void AppBatteryLow(AppCore::AppEventInfoPtr event, void* data)
707 Observer* observer = &static_cast<Framework*>(data)->mObserver;
708 int status = *static_cast<int*>(event->value);
709 Dali::DeviceStatus::Battery::Status result = Dali::DeviceStatus::Battery::NORMAL;
711 // convert to dali battery status
716 result = Dali::DeviceStatus::Battery::POWER_OFF;
721 result = Dali::DeviceStatus::Battery::CRITICALLY_LOW;
727 observer->OnBatteryLow(result);
730 static void AppMemoryLow(AppCore::AppEventInfoPtr event, void* data)
732 Observer* observer = &static_cast<Framework*>(data)->mObserver;
733 int status = *static_cast<int*>(event->value);
734 Dali::DeviceStatus::Memory::Status result = Dali::DeviceStatus::Memory::NORMAL;
736 // convert to dali memmory status
741 result = Dali::DeviceStatus::Memory::NORMAL;
746 result = Dali::DeviceStatus::Memory::LOW;
751 result = Dali::DeviceStatus::Memory::CRITICALLY_LOW;
757 observer->OnMemoryLow(result);
762 if(mUiAppContext.get() == nullptr)
764 unsigned int hint = AppCoreUiBase::HINT_WINDOW_GROUP_CONTROL |
765 AppCoreUiBase::HINT_WINDOW_STACK_CONTROL |
766 AppCoreUiBase::HINT_BG_LAUNCH_CONTROL |
767 AppCoreUiBase::HINT_HW_ACC_CONTROL |
768 AppCoreUiBase::HINT_WINDOW_AUTO_CONTROL;
770 mUiAppContext = std::make_unique<UiAppContext>(hint, mFramework);
773 mUiAppContext->Run(*mFramework->mArgc, *mFramework->mArgv);
774 return TIZEN_ERROR_NONE;
779 if(mUiAppContext.get() == nullptr)
784 mUiAppContext->Exit();
792 static int WidgetAppCreate(void* data)
794 widget_base_on_create();
795 return static_cast<int>(static_cast<Framework*>(data)->Create());
798 static int WidgetAppTerminate(void* data)
800 Observer* observer = &static_cast<Framework*>(data)->mObserver;
801 observer->OnTerminate();
803 widget_base_on_terminate();
809 if(!IsWidgetFeatureEnabled())
811 DALI_LOG_ERROR("widget feature is not supported");
815 AppCore::AppAddEventHandler(&handlers[AppCore::LOW_BATTERY], AppCore::LOW_BATTERY, AppBatteryLow, mFramework);
816 AppCore::AppAddEventHandler(&handlers[AppCore::LOW_MEMORY], AppCore::LOW_MEMORY, AppMemoryLow, mFramework);
817 AppCore::AppAddEventHandler(&handlers[AppCore::DEVICE_ORIENTATION_CHANGED], AppCore::DEVICE_ORIENTATION_CHANGED, AppDeviceRotated, mFramework);
818 AppCore::AppAddEventHandler(&handlers[AppCore::LANGUAGE_CHANGED], AppCore::LANGUAGE_CHANGED, AppLanguageChanged, mFramework);
819 AppCore::AppAddEventHandler(&handlers[AppCore::REGION_FORMAT_CHANGED], AppCore::REGION_FORMAT_CHANGED, AppRegionChanged, mFramework);
821 widget_base_ops ops = widget_base_get_default_ops();
823 /* override methods */
824 ops.create = WidgetAppCreate;
825 ops.terminate = WidgetAppTerminate;
827 ops.finish = AppFinish;
831 int result = widget_base_init(ops, *mFramework->mArgc, *mFramework->mArgv, mFramework);
838 #ifdef APPCORE_WATCH_AVAILABLE
839 static bool WatchAppCreate(int width, int height, void* data)
841 return static_cast<Framework*>(data)->Create();
844 static void WatchAppTimeTick(watch_time_h time, void* data)
846 Observer* observer = &static_cast<Framework*>(data)->mObserver;
847 WatchTime curTime(time);
849 observer->OnTimeTick(curTime);
852 static void WatchAppAmbientTick(watch_time_h time, void* data)
854 Observer* observer = &static_cast<Framework*>(data)->mObserver;
855 WatchTime curTime(time);
857 observer->OnAmbientTick(curTime);
860 static void WatchAppAmbientChanged(bool ambient, void* data)
862 Observer* observer = &static_cast<Framework*>(data)->mObserver;
864 observer->OnAmbientChanged(ambient);
867 static void WatchAppControl(app_control_h app_control, void* data)
869 Framework* framework = static_cast<Framework*>(data);
870 Observer* observer = &framework->mObserver;
871 bundle* bundleData = NULL;
873 app_control_to_bundle(app_control, &bundleData);
874 ProcessBundle(framework, bundleData);
877 observer->OnAppControl(app_control);
880 static void WatchAppTerminate(void* data)
882 Observer* observer = &static_cast<Framework*>(data)->mObserver;
884 observer->OnTerminate();
887 static void WatchAppPause(void* data)
889 Observer* observer = &static_cast<Framework*>(data)->mObserver;
894 static void WatchAppResume(void* data)
896 Observer* observer = &static_cast<Framework*>(data)->mObserver;
898 observer->OnResume();
907 #ifdef APPCORE_WATCH_AVAILABLE
908 mWatchCallback.create = WatchAppCreate;
909 mWatchCallback.app_control = WatchAppControl;
910 mWatchCallback.terminate = WatchAppTerminate;
911 mWatchCallback.pause = WatchAppPause;
912 mWatchCallback.resume = WatchAppResume;
913 mWatchCallback.time_tick = WatchAppTimeTick;
914 mWatchCallback.ambient_tick = WatchAppAmbientTick;
915 mWatchCallback.ambient_changed = WatchAppAmbientChanged;
917 AppCore::AppAddEventHandler(&handlers[AppCore::LOW_BATTERY], AppCore::LOW_BATTERY, AppBatteryLow, mFramework);
918 AppCore::AppAddEventHandler(&handlers[AppCore::LOW_MEMORY], AppCore::LOW_MEMORY, AppMemoryLow, mFramework);
919 AppCore::AppAddEventHandler(&handlers[AppCore::LANGUAGE_CHANGED], AppCore::LANGUAGE_CHANGED, AppLanguageChanged, mFramework);
920 AppCore::AppAddEventHandler(&handlers[AppCore::REGION_FORMAT_CHANGED], AppCore::REGION_FORMAT_CHANGED, AppRegionChanged, mFramework);
922 ret = watch_app_main(*mFramework->mArgc, *mFramework->mArgv, &mWatchCallback, mFramework);
929 #ifdef APPCORE_WATCH_AVAILABLE
934 #ifdef COMPONENT_APPLICATION_SUPPORT
935 int AppComponentMain()
937 /*Crate component_based_app_base_lifecycle_callback*/
938 component_based_app_base_lifecycle_callback_s callback;
939 callback.init = AppInit;
940 callback.run = AppRun;
941 callback.exit = AppExit;
942 callback.create = ComponentAppCreate;
943 callback.terminate = ComponentAppTerminate;
944 callback.fini = ComponentAppFinish;
946 return component_based_app_base_main(*mFramework->mArgc, *mFramework->mArgv, &callback, mFramework);
950 static void* ComponentAppCreate(void* data)
952 Framework* framework = static_cast<Framework*>(data);
953 Observer* observer = &framework->mObserver;
956 return Dali::AnyCast<void*>(observer->OnCreate());
959 static void ComponentAppTerminate(void* data)
961 Observer* observer = &static_cast<Framework*>(data)->mObserver;
962 observer->OnTerminate();
965 static void ComponentAppFinish(void* data)
969 if(getenv("AUL_LOADER_INIT"))
971 setenv("AUL_LOADER_INIT", "0", 1);
976 void AppComponentExit()
978 component_based_app_base_exit();
985 Impl(const Impl& impl);
988 Impl& operator=(const Impl& impl);
991 Framework::Framework(Framework::Observer& observer, int* argc, char*** argv, Type type)
992 : mObserver(observer),
1000 mAbortHandler(MakeCallback(this, &Framework::AbortCallback)),
1003 bool featureFlag = true;
1004 system_info_get_platform_bool("tizen.org/feature/opengles.version.2_0", &featureFlag);
1006 if(featureFlag == false)
1008 set_last_result(TIZEN_ERROR_NOT_SUPPORTED);
1013 mImpl = new Impl(this, type);
1016 Framework::~Framework()
1026 bool Framework::Create()
1028 mInitialised = true;
1033 void Framework::Run()
1038 DALI_TRACE_BEGIN(gTraceFilter, "DALI_APPMAIN");
1039 ret = mImpl->AppMain();
1040 DALI_TRACE_END(gTraceFilter, "DALI_APPMAIN");
1041 if(ret != APP_ERROR_NONE)
1043 DALI_LOG_ERROR("Framework::Run(), ui_app_main() is failed. err = %d\n", ret);
1048 void Framework::Quit()
1053 bool Framework::IsMainLoopRunning()
1058 void Framework::AddAbortCallback(CallbackBase* callback)
1060 mImpl->mAbortCallBack = callback;
1063 std::string Framework::GetBundleName() const
1068 void Framework::SetBundleName(const std::string& name)
1073 std::string Framework::GetBundleId() const
1078 std::string Framework::GetResourcePath()
1080 std::string resourcePath = "";
1081 #if defined(TIZEN_PLATFORM_CONFIG_SUPPORTED) && TIZEN_PLATFORM_CONFIG_SUPPORTED
1082 char* app_rsc_path = app_get_resource_path();
1085 resourcePath = app_rsc_path;
1088 #else // For backwards compatibility with older Tizen versions
1090 // "DALI_APPLICATION_PACKAGE" is used to get the already configured Application package path.
1091 const char* environmentVariable = "DALI_APPLICATION_PACKAGE";
1092 char* value = getenv(environmentVariable);
1095 resourcePath = value;
1098 if(resourcePath.back() != '/')
1100 resourcePath += "/";
1103 #endif // TIZEN_PLATFORM_CONFIG_SUPPORTED
1105 return resourcePath;
1108 std::string Framework::GetDataPath()
1111 char* dataPath = app_get_data_path();
1120 void Framework::SetBundleId(const std::string& id)
1125 void Framework::AbortCallback()
1127 // if an abort call back has been installed run it.
1128 if(mImpl->mAbortCallBack)
1130 CallbackBase::Execute(*mImpl->mAbortCallBack);
1138 void Framework::InitThreads()
1142 void Framework::SetLanguage(const std::string& language)
1144 mImpl->SetLanguage(language);
1147 void Framework::SetRegion(const std::string& region)
1149 mImpl->SetRegion(region);
1152 std::string Framework::GetLanguage() const
1154 return mImpl->GetLanguage();
1157 std::string Framework::GetRegion() const
1159 return mImpl->GetRegion();
1162 } // namespace Adaptor
1164 } // namespace Internal