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>
28 #include <system_info.h>
29 #include <system_settings.h>
30 #include <widget_base.h>
31 #include <app_core_ui_base.hh>
32 #include <app_event_internal.hh>
34 // CONDITIONAL INCLUDES
35 #ifdef APPCORE_WATCH_AVAILABLE
36 #include <appcore-watch/watch_app.h>
38 #ifdef DALI_ELDBUS_AVAILABLE
40 #endif // DALI_ELDBUS_AVAILABLE
42 #if defined(TIZEN_PLATFORM_CONFIG_SUPPORTED) && TIZEN_PLATFORM_CONFIG_SUPPORTED
43 #include <tzplatform_config.h>
44 #endif // TIZEN_PLATFORM_CONFIG_SUPPORTED
46 #ifdef COMPONENT_APPLICATION_SUPPORT
47 #include <component_based_app_base.h>
50 #include <dali/integration-api/debug.h>
51 #include <dali/integration-api/trace.h>
54 #include <dali/internal/system/common/callback-manager.h>
55 #include <dali/internal/system/linux/dali-ecore.h>
57 using namespace tizen_cpp;
67 #if defined(DEBUG_ENABLED)
68 Integration::Log::Filter* gDBusLogging = Integration::Log::Filter::New(Debug::NoLogging, false, "LOG_ADAPTOR_EVENTS_DBUS");
70 DALI_INIT_TRACE_FILTER(gTraceFilter, DALI_TRACE_FRAMEWORK, true);
72 bool IsWidgetFeatureEnabled()
74 static bool feature = false;
75 static bool retrieved = false;
83 ret = system_info_get_platform_bool("http://tizen.org/feature/shell.appwidget", &feature);
84 if(ret != SYSTEM_INFO_ERROR_NONE)
86 DALI_LOG_ERROR("failed to get system info");
94 } // anonymous namespace
100 LOW_MEMORY, //< The low memory event
101 LOW_BATTERY, //< The low battery event
102 LANGUAGE_CHANGED, //< The system language changed event
103 DEVICE_ORIENTATION_CHANGED, //< The device orientation changed event
104 REGION_FORMAT_CHANGED, //< The region format changed event
105 SUSPENDED_STATE_CHANGED, //< The suspended state changed event of the application
106 UPDATE_REQUESTED, //< The update requested event. This event can occur when an app needs to be updated. It is dependent on target devices.
109 static int AppEventConverter[APPCORE_BASE_EVENT_MAX] =
111 [LOW_MEMORY] = APPCORE_BASE_EVENT_LOW_MEMORY,
112 [LOW_BATTERY] = APPCORE_BASE_EVENT_LOW_BATTERY,
113 [LANGUAGE_CHANGED] = APPCORE_BASE_EVENT_LANG_CHANGE,
114 [DEVICE_ORIENTATION_CHANGED] = APPCORE_BASE_EVENT_DEVICE_ORIENTATION_CHANGED,
115 [REGION_FORMAT_CHANGED] = APPCORE_BASE_EVENT_REGION_CHANGE,
116 [SUSPENDED_STATE_CHANGED] = APPCORE_BASE_EVENT_SUSPENDED_STATE_CHANGE,
125 typedef struct AppEventInfo* AppEventInfoPtr;
127 typedef void (*AppEventCallback)(AppEventInfoPtr eventInfo, void* userData);
129 struct AppEventHandler
137 typedef struct AppEventHandler* AppEventHandlerPtr;
139 int EventCallback(void* event, void* data)
141 AppEventHandlerPtr handler = static_cast<AppEventHandlerPtr>(data);
143 struct AppEventInfo appEvent;
145 appEvent.type = handler->type;
146 appEvent.value = event;
149 handler->cb(&appEvent, handler->data);
154 int AppAddEventHandler(AppEventHandlerPtr* eventHandler, AppEventType eventType, AppEventCallback callback, void* userData)
156 AppEventHandlerPtr handler;
158 handler = static_cast<AppEventHandlerPtr>(calloc(1, sizeof(struct AppEventHandler)));
161 DALI_LOG_ERROR("failed to create handler");
162 return TIZEN_ERROR_UNKNOWN;
166 handler->type = eventType;
167 handler->cb = callback;
168 handler->data = userData;
169 handler->raw = appcore_base_add_event(static_cast<appcore_base_event>(AppEventConverter[static_cast<int>(eventType)]), EventCallback, handler);
171 *eventHandler = handler;
173 return TIZEN_ERROR_NONE;
177 DeviceStatus::Memory::Status GetMemoryStatus(app_event_low_memory_status_e memoryStatus)
181 case APP_EVENT_LOW_MEMORY_SOFT_WARNING: // 0x02
183 return Dali::DeviceStatus::Memory::Status::LOW;
185 case APP_EVENT_LOW_MEMORY_HARD_WARNING: // 0x04
187 return Dali::DeviceStatus::Memory::Status::CRITICALLY_LOW;
189 default: // APP_EVENT_LOW_MEMORY_NORMAL 0x01
191 return Dali::DeviceStatus::Memory::Status::NORMAL;
196 DeviceStatus::Battery::Status GetBatteryStatus(app_event_low_battery_status_e batteryStatus)
198 switch(batteryStatus)
200 case APP_EVENT_LOW_BATTERY_POWER_OFF: // 1
202 return Dali::DeviceStatus::Battery::Status::POWER_OFF;
204 case APP_EVENT_LOW_BATTERY_CRITICAL_LOW: // 2
206 return Dali::DeviceStatus::Battery::Status::CRITICALLY_LOW;
210 return Dali::DeviceStatus::Battery::Status::NORMAL;
215 } // namespace AppCore
218 * Impl to hide EFL data members
220 struct Framework::Impl
222 class UiAppContext : public AppCoreUiBase
225 class Task : public AppCoreTaskBase
228 explicit Task(Framework* framework)
229 : mFramework(framework),
230 mNewBatteryStatus(Dali::DeviceStatus::Battery::Status::NORMAL),
231 mNewMemoryStatus(Dali::DeviceStatus::Memory::NORMAL)
239 int OnCreate() override
241 // On the main thread, the log functions are not set. So print_log() is used directly.
242 print_log(DLOG_INFO, "DALI", "%s: %s(%d) > OnCreate() emitted", __MODULE__, __func__, __LINE__);
243 mFramework->mTaskObserver.OnTaskInit();
244 return AppCoreTaskBase::OnCreate();
247 int OnTerminate() override
249 print_log(DLOG_INFO, "DALI", "%s: %s(%d) > OnTerminate() emitted", __MODULE__, __func__, __LINE__);
250 mFramework->mTaskObserver.OnTaskTerminate();
251 return AppCoreTaskBase::OnTerminate();
254 int OnControl(tizen_base::Bundle b) override
256 print_log(DLOG_INFO, "DALI", "%s: %s(%d) > OnControl() emitted", __MODULE__, __func__, __LINE__);
257 AppCoreTaskBase::OnControl(b);
259 app_control_h appControl = nullptr;
261 auto* bundleData = b.GetHandle();
264 if(app_control_create_event(bundleData, &appControl) != TIZEN_ERROR_NONE)
266 print_log(DLOG_ERROR, "DALI", "%s: %s(%d) > Failed to create an app_control handle with Bundle", __MODULE__, __func__, __LINE__);
271 if(app_control_create(&appControl) != TIZEN_ERROR_NONE)
273 print_log(DLOG_ERROR, "DALI", "%s: %s(%d) > Failed to create an app_control handle", __MODULE__, __func__, __LINE__);
276 mFramework->mTaskObserver.OnTaskAppControl(appControl);
278 app_control_destroy(appControl);
282 void OnUiEvent(AppCoreTaskBase::UiState state) override
284 // This event is emitted when the UI thread is paused or resumed.
285 print_log(DLOG_INFO, "DALI", "%s: %s(%d) > OnUiEvent() emitted", __MODULE__, __func__, __LINE__);
287 // Note: This isn't implemented.
288 AppCoreTaskBase::OnUiEvent(state);
291 void OnLowMemory(AppCoreTaskBase::LowMemoryState state) override
293 print_log(DLOG_INFO, "DALI", "%s: %s(%d) > OnLowMemory() emitted", __MODULE__, __func__, __LINE__);
295 mNewMemoryStatus = AppCore::GetMemoryStatus(static_cast<app_event_low_memory_status_e>(state));
298 [](gpointer userData) -> gboolean
300 auto* task = static_cast<Task*>(userData);
301 auto* framework = static_cast<Framework*>(task->mFramework);
302 framework->mObserver.OnMemoryLow(task->mNewMemoryStatus);
303 return G_SOURCE_REMOVE;
305 mFramework->mTaskObserver.OnTaskMemoryLow(mNewMemoryStatus);
306 AppCoreTaskBase::OnLowMemory(state);
309 void OnLowBattery(AppCoreTaskBase::LowBatteryState state) override
311 print_log(DLOG_INFO, "DALI", "%s: %s(%d) > OnLowBattery() emitted", __MODULE__, __func__, __LINE__);
312 mNewBatteryStatus = AppCore::GetBatteryStatus(static_cast<app_event_low_battery_status_e>(state));
315 [](gpointer userData) -> gboolean
317 auto* task = static_cast<Task*>(userData);
318 auto* framework = static_cast<Framework*>(task->mFramework);
319 framework->mObserver.OnBatteryLow(task->mNewBatteryStatus);
320 return G_SOURCE_REMOVE;
322 mFramework->mTaskObserver.OnTaskBatteryLow(mNewBatteryStatus);
323 AppCoreTaskBase::OnLowBattery(state);
326 void OnLangChanged(const std::string& lang) override
328 print_log(DLOG_INFO, "DALI", "%s: %s(%d) > OnLangChanged() emitted", __MODULE__, __func__, __LINE__);
330 mFramework->SetLanguage(mNewLanguage);
333 [](gpointer userData) -> gboolean
335 auto* task = static_cast<Task*>(userData);
336 auto* framework = static_cast<Framework*>(task->mFramework);
337 framework->mObserver.OnLanguageChanged();
338 return G_SOURCE_REMOVE;
341 mFramework->mTaskObserver.OnTaskLanguageChanged();
342 AppCoreTaskBase::OnLangChanged(lang);
345 void OnRegionChanged(const std::string& region) override
347 print_log(DLOG_INFO, "DALI", "%s: %s(%d) > nRegionChanged() emitted", __MODULE__, __func__, __LINE__);
349 mFramework->SetRegion(mNewRegion);
352 [](gpointer userData) -> gboolean
354 auto* task = static_cast<Task*>(userData);
355 auto* framework = static_cast<Framework*>(task->mFramework);
356 framework->mObserver.OnRegionChanged();
357 return G_SOURCE_REMOVE;
360 mFramework->mTaskObserver.OnTaskRegionChanged();
361 AppCoreTaskBase::OnRegionChanged(mNewRegion);
364 void OnDeviceOrientationChanged(AppCoreTaskBase::DeviceOrientationState state) override
366 print_log(DLOG_INFO, "DALI", "%s: %s(%d) > OnDeviceOrientationChanged() emitted", __MODULE__, __func__, __LINE__);
367 // Note: This isn't emitted to the App.
368 AppCoreTaskBase::OnDeviceOrientationChanged(state);
372 GMainContext* GetTizenGlibContext()
374 GMainContext* context;
375 const char* env = getenv("TIZEN_GLIB_CONTEXT");
378 context = (GMainContext*)strtoul(env, nullptr, 10);
388 void PostToUiThread(GSourceFunc func)
390 GSource* source = g_idle_source_new();
391 g_source_set_callback(source, func, this, nullptr);
392 g_source_attach(source, GetTizenGlibContext());
393 g_source_unref(source);
397 Framework* mFramework;
398 std::string mNewLanguage;
399 std::string mNewRegion;
400 Dali::DeviceStatus::Battery::Status mNewBatteryStatus;
401 Dali::DeviceStatus::Memory::Status mNewMemoryStatus;
404 explicit UiAppContext(unsigned int hint, Framework* framework)
405 : AppCoreUiBase(hint),
406 mFramework(framework),
409 if(hint & AppCoreUiBase::HINT_DUAL_THREAD)
416 mLanguageChanged = std::make_shared<AppEvent>(IAppCore::IEvent::Type::LANG_CHANGE, OnLanguageChanged, this);
417 AddEvent(mLanguageChanged);
419 mDeviceOrientationChanged = std::make_shared<AppEvent>(IAppCore::IEvent::Type::DEVICE_ORIENTATION_CHANGED, OnDeviceOrientationChanged, this);
420 AddEvent(mDeviceOrientationChanged);
422 mRegionFormatChanged = std::make_shared<AppEvent>(IAppCore::IEvent::Type::REGION_CHANGE, OnRegionFormatChanged, this);
423 AddEvent(mRegionFormatChanged);
425 mLowMemory = std::make_shared<AppEvent>(IAppCore::IEvent::Type::LOW_MEMORY, OnLowMemory, this);
426 AddEvent(mLowMemory);
428 mLowBattery = std::make_shared<AppEvent>(IAppCore::IEvent::Type::LOW_BATTERY, OnLowBattery, this);
429 AddEvent(mLowBattery);
433 virtual ~UiAppContext()
437 RemoveEvent(mLowBattery);
438 RemoveEvent(mLowMemory);
439 RemoveEvent(mRegionFormatChanged);
440 RemoveEvent(mDeviceOrientationChanged);
441 RemoveEvent(mLanguageChanged);
445 std::unique_ptr<AppCoreTaskBase> CreateTask() override
447 return std::unique_ptr<AppCoreTaskBase>(
448 new Task(mFramework));
451 int OnCreate() override
453 AppCoreUiBase::OnCreate();
454 mFramework->Create();
458 int OnTerminate() override
460 AppCoreUiBase::OnTerminate();
461 auto* observer = &mFramework->mObserver;
462 observer->OnTerminate();
466 int OnPause() override
468 AppCoreUiBase::OnPause();
469 auto* observer = &mFramework->mObserver;
474 int OnResume() override
476 AppCoreUiBase::OnResume();
477 auto* observer = &mFramework->mObserver;
478 observer->OnResume();
482 int OnControl(tizen_base::Bundle b) override
484 AppCoreUiBase::OnControl(b);
486 app_control_h appControl = nullptr;
488 auto* bundleData = b.GetHandle();
491 if(app_control_create_event(bundleData, &appControl) != TIZEN_ERROR_NONE)
493 DALI_LOG_ERROR("Failed to create an app_control handle");
499 if(app_control_create(&appControl) != TIZEN_ERROR_NONE)
501 DALI_LOG_ERROR("Failed to create an app_control handle");
506 auto* observer = &mFramework->mObserver;
507 ProcessBundle(mFramework, bundleData);
509 observer->OnAppControl(appControl);
510 app_control_destroy(appControl);
514 void OnLoopInit(int argc, char** argv) override
516 #pragma GCC diagnostic push
517 #pragma GCC diagnostic ignored "-Wold-style-cast"
519 ecore_app_args_set(argc, (const char**)argv);
520 #pragma GCC diagnostic pop
522 #ifdef DALI_ELDBUS_AVAILABLE
523 // Initialize ElDBus.
524 DALI_LOG_INFO(gDBusLogging, Debug::General, "Starting DBus Initialization\n");
529 void OnLoopFinish() override
533 if(getenv("AUL_LOADER_INIT"))
535 setenv("AUL_LOADER_INIT", "0", 1);
539 #ifdef DALI_ELDBUS_AVAILABLE
541 DALI_LOG_INFO(gDBusLogging, Debug::General, "Shutting down DBus\n");
546 void OnLoopRun() override
548 ecore_main_loop_begin();
551 void OnLoopExit() override
553 ecore_main_loop_quit();
557 static void OnLanguageChanged(app_event_info_h event_info, void* user_data)
559 auto* context = static_cast<UiAppContext*>(user_data);
560 auto* framework = context->mFramework;
561 Observer* observer = &framework->mObserver;
563 char* lang = nullptr;
564 app_event_get_language(event_info, &lang);
567 framework->SetLanguage(std::string(lang));
568 observer->OnLanguageChanged();
573 DALI_LOG_ERROR("NULL pointer in Language changed event\n");
577 static void OnDeviceOrientationChanged(app_event_info_h event_info, void* user_data)
581 static void OnRegionFormatChanged(app_event_info_h event_info, void* user_data)
583 auto* context = static_cast<UiAppContext*>(user_data);
584 auto* framework = context->mFramework;
585 Observer* observer = &framework->mObserver;
587 char* region = nullptr;
588 app_event_get_region_format(event_info, ®ion);
591 framework->SetRegion(std::string(region));
592 observer->OnRegionChanged();
597 DALI_LOG_ERROR("NULL pointer in Region changed event\n");
601 static void OnLowBattery(app_event_info_h event_info, void* user_data)
603 auto* context = static_cast<UiAppContext*>(user_data);
604 auto* framework = context->mFramework;
605 Observer* observer = &framework->mObserver;
607 app_event_low_battery_status_e status;
608 app_event_get_low_battery_status(event_info, &status);
609 Dali::DeviceStatus::Battery::Status result = AppCore::GetBatteryStatus(status);
610 observer->OnBatteryLow(result);
613 static void OnLowMemory(app_event_info_h event_info, void* user_data)
615 auto* context = static_cast<UiAppContext*>(user_data);
616 auto* framework = context->mFramework;
617 Observer* observer = &framework->mObserver;
619 app_event_low_memory_status_e status;
620 app_event_get_low_memory_status(event_info, &status);
621 Dali::DeviceStatus::Memory::Status result = AppCore::GetMemoryStatus(status);
622 observer->OnMemoryLow(result);
625 void ProcessBundle(Framework* framework, bundle* bundleData)
627 if(bundleData == nullptr)
633 char* bundleName = const_cast<char*>(bundle_get_val(bundleData, "name"));
634 if(bundleName != nullptr)
636 framework->SetBundleName(bundleName);
640 char* bundleId = const_cast<char*>(bundle_get_val(bundleData, "id"));
641 if(bundleId != nullptr)
643 framework->SetBundleId(bundleId);
648 Framework* mFramework;
649 std::shared_ptr<AppEvent> mLanguageChanged;
650 std::shared_ptr<AppEvent> mDeviceOrientationChanged;
651 std::shared_ptr<AppEvent> mRegionFormatChanged;
652 std::shared_ptr<AppEvent> mLowBattery;
653 std::shared_ptr<AppEvent> mLowMemory;
658 Impl(void* data, Type type, bool useUiThread)
659 : mAbortCallBack(NULL),
660 mCallbackManager(NULL),
661 mUseUiThread(useUiThread)
662 #ifdef APPCORE_WATCH_AVAILABLE
667 mFramework = static_cast<Framework*>(data);
669 #ifndef APPCORE_WATCH_AVAILABLE
672 throw Dali::DaliException("", "Watch Application is not supported.");
675 mApplicationType = type;
676 mCallbackManager = CallbackManager::New();
681 delete mAbortCallBack;
683 // we're quiting the main loop so
684 // mCallbackManager->RemoveAllCallBacks() does not need to be called
685 // to delete our abort handler
686 delete mCallbackManager;
691 // TODO: The app-core-cpp has to be applied to the other app types.
693 switch(mApplicationType)
697 ret = AppNormalMain();
702 ret = AppWidgetMain();
707 ret = AppWatchMain();
710 #ifdef COMPONENT_APPLICATION_SUPPORT
713 ret = AppComponentMain();
723 switch(mApplicationType)
740 #ifdef COMPONENT_APPLICATION_SUPPORT
750 void SetLanguage(const std::string& language)
752 mLanguage = language;
755 void SetRegion(const std::string& region)
760 std::string GetLanguage()
762 if(mLanguage.empty())
764 char* language = nullptr;
765 system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &language);
767 if(language != nullptr)
769 mLanguage = std::string(language);
776 std::string GetRegion()
780 char* region = nullptr;
781 system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY, ®ion);
783 if(region != nullptr)
785 mRegion = std::string(region);
793 Type mApplicationType;
794 CallbackBase* mAbortCallBack;
795 CallbackManager* mCallbackManager;
796 std::string mLanguage{};
797 std::string mRegion{};
799 Framework* mFramework;
800 AppCore::AppEventHandlerPtr handlers[5];
801 std::unique_ptr<UiAppContext> mUiAppContext;
803 #ifdef APPCORE_WATCH_AVAILABLE
804 watch_app_lifecycle_callback_s mWatchCallback;
805 app_event_handler_h watchHandlers[5];
808 static void ProcessBundle(Framework* framework, bundle* bundleData)
810 if(bundleData == NULL)
816 char* bundleName = const_cast<char*>(bundle_get_val(bundleData, "name"));
817 if(bundleName != NULL)
819 framework->SetBundleName(bundleName);
823 char* bundleId = const_cast<char*>(bundle_get_val(bundleData, "id"));
826 framework->SetBundleId(bundleId);
830 static void AppInit(int argc, char** argv, void* data)
832 #pragma GCC diagnostic push
833 #pragma GCC diagnostic ignored "-Wold-style-cast"
835 ecore_app_args_set(argc, (const char**)argv);
836 #pragma GCC diagnostic pop
838 #ifdef DALI_ELDBUS_AVAILABLE
839 // Initialize ElDBus.
840 DALI_LOG_INFO(gDBusLogging, Debug::General, "Starting DBus Initialization\n");
845 static void AppFinish(void)
849 if(getenv("AUL_LOADER_INIT"))
851 setenv("AUL_LOADER_INIT", "0", 1);
855 #ifdef DALI_ELDBUS_AVAILABLE
857 DALI_LOG_INFO(gDBusLogging, Debug::General, "Shutting down DBus\n");
862 static void AppRun(void* data)
864 ecore_main_loop_begin();
867 static void AppExit(void* data)
869 ecore_main_loop_quit();
872 static void AppLanguageChanged(AppCore::AppEventInfoPtr event, void* data)
874 Framework* framework = static_cast<Framework*>(data);
875 Observer* observer = &framework->mObserver;
877 if(event && event->value)
879 framework->SetLanguage(std::string(static_cast<const char*>(event->value)));
880 observer->OnLanguageChanged();
884 DALI_LOG_ERROR("NULL pointer in Language changed event\n");
888 static void AppDeviceRotated(AppCore::AppEventInfoPtr event_info, void* data)
892 static void AppRegionChanged(AppCore::AppEventInfoPtr event, void* data)
894 Framework* framework = static_cast<Framework*>(data);
895 Observer* observer = &framework->mObserver;
897 if(event && event->value)
899 framework->SetRegion(std::string(static_cast<const char*>(event->value)));
900 observer->OnRegionChanged();
904 DALI_LOG_ERROR("NULL pointer in Region changed event\n");
908 static void AppBatteryLow(AppCore::AppEventInfoPtr event, void* data)
910 Observer* observer = &static_cast<Framework*>(data)->mObserver;
911 int status = *static_cast<int*>(event->value);
912 Dali::DeviceStatus::Battery::Status result = Dali::DeviceStatus::Battery::NORMAL;
914 // convert to dali battery status
919 result = Dali::DeviceStatus::Battery::POWER_OFF;
924 result = Dali::DeviceStatus::Battery::CRITICALLY_LOW;
930 observer->OnBatteryLow(result);
933 static void AppMemoryLow(AppCore::AppEventInfoPtr event, void* data)
935 Observer* observer = &static_cast<Framework*>(data)->mObserver;
936 int status = *static_cast<int*>(event->value);
937 Dali::DeviceStatus::Memory::Status result = Dali::DeviceStatus::Memory::NORMAL;
939 // convert to dali memmory status
944 result = Dali::DeviceStatus::Memory::NORMAL;
949 result = Dali::DeviceStatus::Memory::LOW;
954 result = Dali::DeviceStatus::Memory::CRITICALLY_LOW;
960 observer->OnMemoryLow(result);
965 if(mUiAppContext.get() == nullptr)
967 unsigned int hint = AppCoreUiBase::HINT_WINDOW_GROUP_CONTROL |
968 AppCoreUiBase::HINT_WINDOW_STACK_CONTROL |
969 AppCoreUiBase::HINT_BG_LAUNCH_CONTROL |
970 AppCoreUiBase::HINT_HW_ACC_CONTROL |
971 AppCoreUiBase::HINT_WINDOW_AUTO_CONTROL;
973 // For testing UIThread model, This code turns on the UI Thread feature forcibly.
974 // ex) app_launcher -e [APPID] __K_UI_THREAD enable
975 // This code doesn't change mUseUiThread in Internal::Application
976 bundle* b = bundle_import_from_argv(*mFramework->mArgc, *mFramework->mArgv);
979 const char* val = bundle_get_val(b, "__K_UI_THREAD");
980 if(val != nullptr && strcmp(val, "enable") == 0)
990 hint |= AppCoreUiBase::HINT_DUAL_THREAD;
993 mUiAppContext = std::make_unique<UiAppContext>(hint, mFramework);
996 mUiAppContext->Run(*mFramework->mArgc, *mFramework->mArgv);
997 return TIZEN_ERROR_NONE;
1000 void AppNormalExit()
1002 if(mUiAppContext.get() == nullptr)
1007 mUiAppContext->Exit();
1010 void AppWidgetExit()
1015 static int WidgetAppCreate(void* data)
1017 widget_base_on_create();
1018 return static_cast<int>(static_cast<Framework*>(data)->Create());
1021 static int WidgetAppTerminate(void* data)
1023 Observer* observer = &static_cast<Framework*>(data)->mObserver;
1024 observer->OnTerminate();
1026 widget_base_on_terminate();
1032 if(!IsWidgetFeatureEnabled())
1034 DALI_LOG_ERROR("widget feature is not supported");
1038 AppCore::AppAddEventHandler(&handlers[AppCore::LOW_BATTERY], AppCore::LOW_BATTERY, AppBatteryLow, mFramework);
1039 AppCore::AppAddEventHandler(&handlers[AppCore::LOW_MEMORY], AppCore::LOW_MEMORY, AppMemoryLow, mFramework);
1040 AppCore::AppAddEventHandler(&handlers[AppCore::DEVICE_ORIENTATION_CHANGED], AppCore::DEVICE_ORIENTATION_CHANGED, AppDeviceRotated, mFramework);
1041 AppCore::AppAddEventHandler(&handlers[AppCore::LANGUAGE_CHANGED], AppCore::LANGUAGE_CHANGED, AppLanguageChanged, mFramework);
1042 AppCore::AppAddEventHandler(&handlers[AppCore::REGION_FORMAT_CHANGED], AppCore::REGION_FORMAT_CHANGED, AppRegionChanged, mFramework);
1044 widget_base_ops ops = widget_base_get_default_ops();
1046 /* override methods */
1047 ops.create = WidgetAppCreate;
1048 ops.terminate = WidgetAppTerminate;
1050 ops.finish = AppFinish;
1054 int result = widget_base_init(ops, *mFramework->mArgc, *mFramework->mArgv, mFramework);
1061 #ifdef APPCORE_WATCH_AVAILABLE
1062 static bool WatchAppCreate(int width, int height, void* data)
1064 return static_cast<Framework*>(data)->Create();
1067 static void WatchAppTimeTick(watch_time_h time, void* data)
1069 Observer* observer = &static_cast<Framework*>(data)->mObserver;
1070 WatchTime curTime(time);
1072 observer->OnTimeTick(curTime);
1075 static void WatchAppAmbientTick(watch_time_h time, void* data)
1077 Observer* observer = &static_cast<Framework*>(data)->mObserver;
1078 WatchTime curTime(time);
1080 observer->OnAmbientTick(curTime);
1083 static void WatchAppAmbientChanged(bool ambient, void* data)
1085 Observer* observer = &static_cast<Framework*>(data)->mObserver;
1087 observer->OnAmbientChanged(ambient);
1090 static void WatchAppControl(app_control_h app_control, void* data)
1092 Framework* framework = static_cast<Framework*>(data);
1093 Observer* observer = &framework->mObserver;
1094 bundle* bundleData = NULL;
1096 app_control_to_bundle(app_control, &bundleData);
1097 ProcessBundle(framework, bundleData);
1099 observer->OnReset();
1100 observer->OnAppControl(app_control);
1103 static void WatchAppTerminate(void* data)
1105 Observer* observer = &static_cast<Framework*>(data)->mObserver;
1107 observer->OnTerminate();
1110 static void WatchAppPause(void* data)
1112 Observer* observer = &static_cast<Framework*>(data)->mObserver;
1114 observer->OnPause();
1117 static void WatchAppResume(void* data)
1119 Observer* observer = &static_cast<Framework*>(data)->mObserver;
1121 observer->OnResume();
1130 #ifdef APPCORE_WATCH_AVAILABLE
1131 mWatchCallback.create = WatchAppCreate;
1132 mWatchCallback.app_control = WatchAppControl;
1133 mWatchCallback.terminate = WatchAppTerminate;
1134 mWatchCallback.pause = WatchAppPause;
1135 mWatchCallback.resume = WatchAppResume;
1136 mWatchCallback.time_tick = WatchAppTimeTick;
1137 mWatchCallback.ambient_tick = WatchAppAmbientTick;
1138 mWatchCallback.ambient_changed = WatchAppAmbientChanged;
1140 AppCore::AppAddEventHandler(&handlers[AppCore::LOW_BATTERY], AppCore::LOW_BATTERY, AppBatteryLow, mFramework);
1141 AppCore::AppAddEventHandler(&handlers[AppCore::LOW_MEMORY], AppCore::LOW_MEMORY, AppMemoryLow, mFramework);
1142 AppCore::AppAddEventHandler(&handlers[AppCore::LANGUAGE_CHANGED], AppCore::LANGUAGE_CHANGED, AppLanguageChanged, mFramework);
1143 AppCore::AppAddEventHandler(&handlers[AppCore::REGION_FORMAT_CHANGED], AppCore::REGION_FORMAT_CHANGED, AppRegionChanged, mFramework);
1145 ret = watch_app_main(*mFramework->mArgc, *mFramework->mArgv, &mWatchCallback, mFramework);
1152 #ifdef APPCORE_WATCH_AVAILABLE
1157 #ifdef COMPONENT_APPLICATION_SUPPORT
1158 int AppComponentMain()
1160 /*Crate component_based_app_base_lifecycle_callback*/
1161 component_based_app_base_lifecycle_callback_s callback;
1162 callback.init = AppInit;
1163 callback.run = AppRun;
1164 callback.exit = AppExit;
1165 callback.create = ComponentAppCreate;
1166 callback.terminate = ComponentAppTerminate;
1167 callback.fini = ComponentAppFinish;
1169 return component_based_app_base_main(*mFramework->mArgc, *mFramework->mArgv, &callback, mFramework);
1173 static void* ComponentAppCreate(void* data)
1175 Framework* framework = static_cast<Framework*>(data);
1176 Observer* observer = &framework->mObserver;
1179 return Dali::AnyCast<void*>(observer->OnCreate());
1182 static void ComponentAppTerminate(void* data)
1184 Observer* observer = &static_cast<Framework*>(data)->mObserver;
1185 observer->OnTerminate();
1188 static void ComponentAppFinish(void* data)
1192 if(getenv("AUL_LOADER_INIT"))
1194 setenv("AUL_LOADER_INIT", "0", 1);
1199 void AppComponentExit()
1201 component_based_app_base_exit();
1208 Impl(const Impl& impl);
1211 Impl& operator=(const Impl& impl);
1214 Framework::Framework(Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Type type, bool useUiThread)
1215 : mObserver(observer),
1216 mTaskObserver(taskObserver),
1217 mInitialised(false),
1224 mAbortHandler(MakeCallback(this, &Framework::AbortCallback)),
1227 bool featureFlag = true;
1228 system_info_get_platform_bool("tizen.org/feature/opengles.version.2_0", &featureFlag);
1230 if(featureFlag == false)
1232 set_last_result(TIZEN_ERROR_NOT_SUPPORTED);
1237 mImpl = new Impl(this, type, useUiThread);
1240 Framework::~Framework()
1250 bool Framework::Create()
1252 mInitialised = true;
1257 void Framework::Run()
1262 DALI_TRACE_BEGIN(gTraceFilter, "DALI_APPMAIN");
1263 ret = mImpl->AppMain();
1264 DALI_TRACE_END(gTraceFilter, "DALI_APPMAIN");
1265 if(ret != APP_ERROR_NONE)
1267 DALI_LOG_ERROR("Framework::Run(), ui_app_main() is failed. err = %d\n", ret);
1272 void Framework::Quit()
1277 bool Framework::IsMainLoopRunning()
1282 void Framework::AddAbortCallback(CallbackBase* callback)
1284 mImpl->mAbortCallBack = callback;
1287 std::string Framework::GetBundleName() const
1292 void Framework::SetBundleName(const std::string& name)
1297 std::string Framework::GetBundleId() const
1302 std::string Framework::GetResourcePath()
1304 std::string resourcePath = "";
1305 #if defined(TIZEN_PLATFORM_CONFIG_SUPPORTED) && TIZEN_PLATFORM_CONFIG_SUPPORTED
1306 char* app_rsc_path = app_get_resource_path();
1309 resourcePath = app_rsc_path;
1312 #else // For backwards compatibility with older Tizen versions
1314 // "DALI_APPLICATION_PACKAGE" is used to get the already configured Application package path.
1315 const char* environmentVariable = "DALI_APPLICATION_PACKAGE";
1316 char* value = getenv(environmentVariable);
1319 resourcePath = value;
1322 if(resourcePath.back() != '/')
1324 resourcePath += "/";
1327 #endif // TIZEN_PLATFORM_CONFIG_SUPPORTED
1329 return resourcePath;
1332 std::string Framework::GetDataPath()
1335 char* dataPath = app_get_data_path();
1344 void Framework::SetBundleId(const std::string& id)
1349 void Framework::AbortCallback()
1351 // if an abort call back has been installed run it.
1352 if(mImpl->mAbortCallBack)
1354 CallbackBase::Execute(*mImpl->mAbortCallBack);
1362 void Framework::InitThreads()
1366 void Framework::SetLanguage(const std::string& language)
1368 mImpl->SetLanguage(language);
1371 void Framework::SetRegion(const std::string& region)
1373 mImpl->SetRegion(region);
1376 std::string Framework::GetLanguage() const
1378 return mImpl->GetLanguage();
1381 std::string Framework::GetRegion() const
1383 return mImpl->GetRegion();
1386 } // namespace Adaptor
1388 } // namespace Internal