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 {
299 auto* task = static_cast<Task*>(userData);
300 auto* framework = static_cast<Framework*>(task->mFramework);
301 framework->mObserver.OnMemoryLow(task->mNewMemoryStatus);
302 return G_SOURCE_REMOVE;
304 mFramework->mTaskObserver.OnTaskMemoryLow(mNewMemoryStatus);
305 AppCoreTaskBase::OnLowMemory(state);
308 void OnLowBattery(AppCoreTaskBase::LowBatteryState state) override
310 print_log(DLOG_INFO, "DALI", "%s: %s(%d) > OnLowBattery() emitted", __MODULE__, __func__, __LINE__);
311 mNewBatteryStatus = AppCore::GetBatteryStatus(static_cast<app_event_low_battery_status_e>(state));
314 [](gpointer userData) -> gboolean {
315 auto* task = static_cast<Task*>(userData);
316 auto* framework = static_cast<Framework*>(task->mFramework);
317 framework->mObserver.OnBatteryLow(task->mNewBatteryStatus);
318 return G_SOURCE_REMOVE;
320 mFramework->mTaskObserver.OnTaskBatteryLow(mNewBatteryStatus);
321 AppCoreTaskBase::OnLowBattery(state);
324 void OnLangChanged(const std::string& lang) override
326 print_log(DLOG_INFO, "DALI", "%s: %s(%d) > OnLangChanged() emitted", __MODULE__, __func__, __LINE__);
328 mFramework->SetLanguage(mNewLanguage);
331 [](gpointer userData) -> gboolean {
332 auto* task = static_cast<Task*>(userData);
333 auto* framework = static_cast<Framework*>(task->mFramework);
334 framework->mObserver.OnLanguageChanged();
335 return G_SOURCE_REMOVE;
338 mFramework->mTaskObserver.OnTaskLanguageChanged();
339 AppCoreTaskBase::OnLangChanged(lang);
342 void OnRegionChanged(const std::string& region) override
344 print_log(DLOG_INFO, "DALI", "%s: %s(%d) > nRegionChanged() emitted", __MODULE__, __func__, __LINE__);
346 mFramework->SetRegion(mNewRegion);
349 [](gpointer userData) -> gboolean {
350 auto* task = static_cast<Task*>(userData);
351 auto* framework = static_cast<Framework*>(task->mFramework);
352 framework->mObserver.OnRegionChanged();
353 return G_SOURCE_REMOVE;
356 mFramework->mTaskObserver.OnTaskRegionChanged();
357 AppCoreTaskBase::OnRegionChanged(mNewRegion);
360 void OnDeviceOrientationChanged(AppCoreTaskBase::DeviceOrientationState state) override
362 print_log(DLOG_INFO, "DALI", "%s: %s(%d) > OnDeviceOrientationChanged() emitted", __MODULE__, __func__, __LINE__);
363 // Note: This isn't emitted to the App.
364 AppCoreTaskBase::OnDeviceOrientationChanged(state);
368 GMainContext* GetTizenGlibContext()
370 GMainContext* context;
371 const char* env = getenv("TIZEN_GLIB_CONTEXT");
374 context = (GMainContext*)strtoul(env, nullptr, 10);
384 void PostToUiThread(GSourceFunc func)
386 GSource* source = g_idle_source_new();
387 g_source_set_callback(source, func, this, nullptr);
388 g_source_attach(source, GetTizenGlibContext());
389 g_source_unref(source);
393 Framework* mFramework;
394 std::string mNewLanguage;
395 std::string mNewRegion;
396 Dali::DeviceStatus::Battery::Status mNewBatteryStatus;
397 Dali::DeviceStatus::Memory::Status mNewMemoryStatus;
400 explicit UiAppContext(unsigned int hint, Framework* framework)
401 : AppCoreUiBase(hint),
402 mFramework(framework),
405 if(hint & AppCoreUiBase::HINT_DUAL_THREAD)
412 mLanguageChanged = std::make_shared<AppEvent>(IAppCore::IEvent::Type::LANG_CHANGE, OnLanguageChanged, this);
413 AddEvent(mLanguageChanged);
415 mDeviceOrientationChanged = std::make_shared<AppEvent>(IAppCore::IEvent::Type::DEVICE_ORIENTATION_CHANGED, OnDeviceOrientationChanged, this);
416 AddEvent(mDeviceOrientationChanged);
418 mRegionFormatChanged = std::make_shared<AppEvent>(IAppCore::IEvent::Type::REGION_CHANGE, OnRegionFormatChanged, this);
419 AddEvent(mRegionFormatChanged);
421 mLowMemory = std::make_shared<AppEvent>(IAppCore::IEvent::Type::LOW_MEMORY, OnLowMemory, this);
422 AddEvent(mLowMemory);
424 mLowBattery = std::make_shared<AppEvent>(IAppCore::IEvent::Type::LOW_BATTERY, OnLowBattery, this);
425 AddEvent(mLowBattery);
429 virtual ~UiAppContext()
433 RemoveEvent(mLowBattery);
434 RemoveEvent(mLowMemory);
435 RemoveEvent(mRegionFormatChanged);
436 RemoveEvent(mDeviceOrientationChanged);
437 RemoveEvent(mLanguageChanged);
441 std::unique_ptr<AppCoreTaskBase> CreateTask() override
443 return std::unique_ptr<AppCoreTaskBase>(
444 new Task(mFramework));
447 int OnCreate() override
449 AppCoreUiBase::OnCreate();
450 mFramework->Create();
454 int OnTerminate() override
456 AppCoreUiBase::OnTerminate();
457 auto* observer = &mFramework->mObserver;
458 observer->OnTerminate();
462 int OnPause() override
464 AppCoreUiBase::OnPause();
465 auto* observer = &mFramework->mObserver;
470 int OnResume() override
472 AppCoreUiBase::OnResume();
473 auto* observer = &mFramework->mObserver;
474 observer->OnResume();
478 int OnControl(tizen_base::Bundle b) override
480 AppCoreUiBase::OnControl(b);
482 app_control_h appControl = nullptr;
484 auto* bundleData = b.GetHandle();
487 if(app_control_create_event(bundleData, &appControl) != TIZEN_ERROR_NONE)
489 DALI_LOG_ERROR("Failed to create an app_control handle");
495 if(app_control_create(&appControl) != TIZEN_ERROR_NONE)
497 DALI_LOG_ERROR("Failed to create an app_control handle");
502 auto* observer = &mFramework->mObserver;
503 ProcessBundle(mFramework, bundleData);
505 observer->OnAppControl(appControl);
506 app_control_destroy(appControl);
510 void OnLoopInit(int argc, char** argv) override
512 #pragma GCC diagnostic push
513 #pragma GCC diagnostic ignored "-Wold-style-cast"
515 ecore_app_args_set(argc, (const char**)argv);
516 #pragma GCC diagnostic pop
518 #ifdef DALI_ELDBUS_AVAILABLE
519 // Initialize ElDBus.
520 DALI_LOG_INFO(gDBusLogging, Debug::General, "Starting DBus Initialization\n");
525 void OnLoopFinish() override
529 if(getenv("AUL_LOADER_INIT"))
531 setenv("AUL_LOADER_INIT", "0", 1);
535 #ifdef DALI_ELDBUS_AVAILABLE
537 DALI_LOG_INFO(gDBusLogging, Debug::General, "Shutting down DBus\n");
542 void OnLoopRun() override
544 ecore_main_loop_begin();
547 void OnLoopExit() override
549 ecore_main_loop_quit();
553 static void OnLanguageChanged(app_event_info_h event_info, void* user_data)
555 auto* context = static_cast<UiAppContext*>(user_data);
556 auto* framework = context->mFramework;
557 Observer* observer = &framework->mObserver;
559 char* lang = nullptr;
560 app_event_get_language(event_info, &lang);
563 framework->SetLanguage(std::string(lang));
564 observer->OnLanguageChanged();
569 DALI_LOG_ERROR("NULL pointer in Language changed event\n");
573 static void OnDeviceOrientationChanged(app_event_info_h event_info, void* user_data)
577 static void OnRegionFormatChanged(app_event_info_h event_info, void* user_data)
579 auto* context = static_cast<UiAppContext*>(user_data);
580 auto* framework = context->mFramework;
581 Observer* observer = &framework->mObserver;
583 char* region = nullptr;
584 app_event_get_region_format(event_info, ®ion);
587 framework->SetRegion(std::string(region));
588 observer->OnRegionChanged();
593 DALI_LOG_ERROR("NULL pointer in Region changed event\n");
597 static void OnLowBattery(app_event_info_h event_info, void* user_data)
599 auto* context = static_cast<UiAppContext*>(user_data);
600 auto* framework = context->mFramework;
601 Observer* observer = &framework->mObserver;
603 app_event_low_battery_status_e status;
604 app_event_get_low_battery_status(event_info, &status);
605 Dali::DeviceStatus::Battery::Status result = AppCore::GetBatteryStatus(status);
606 observer->OnBatteryLow(result);
609 static void OnLowMemory(app_event_info_h event_info, void* user_data)
611 auto* context = static_cast<UiAppContext*>(user_data);
612 auto* framework = context->mFramework;
613 Observer* observer = &framework->mObserver;
615 app_event_low_memory_status_e status;
616 app_event_get_low_memory_status(event_info, &status);
617 Dali::DeviceStatus::Memory::Status result = AppCore::GetMemoryStatus(status);
618 observer->OnMemoryLow(result);
621 void ProcessBundle(Framework* framework, bundle* bundleData)
623 if(bundleData == nullptr)
629 char* bundleName = const_cast<char*>(bundle_get_val(bundleData, "name"));
630 if(bundleName != nullptr)
632 framework->SetBundleName(bundleName);
636 char* bundleId = const_cast<char*>(bundle_get_val(bundleData, "id"));
637 if(bundleId != nullptr)
639 framework->SetBundleId(bundleId);
644 Framework* mFramework;
645 std::shared_ptr<AppEvent> mLanguageChanged;
646 std::shared_ptr<AppEvent> mDeviceOrientationChanged;
647 std::shared_ptr<AppEvent> mRegionFormatChanged;
648 std::shared_ptr<AppEvent> mLowBattery;
649 std::shared_ptr<AppEvent> mLowMemory;
654 Impl(void* data, Type type, bool useUiThread)
655 : mAbortCallBack(NULL),
656 mCallbackManager(NULL),
657 mUseUiThread(useUiThread)
658 #ifdef APPCORE_WATCH_AVAILABLE
663 mFramework = static_cast<Framework*>(data);
665 #ifndef APPCORE_WATCH_AVAILABLE
668 throw Dali::DaliException("", "Watch Application is not supported.");
671 mApplicationType = type;
672 mCallbackManager = CallbackManager::New();
677 delete mAbortCallBack;
679 // we're quiting the main loop so
680 // mCallbackManager->RemoveAllCallBacks() does not need to be called
681 // to delete our abort handler
682 delete mCallbackManager;
687 // TODO: The app-core-cpp has to be applied to the other app types.
689 switch(mApplicationType)
693 ret = AppNormalMain();
698 ret = AppWidgetMain();
703 ret = AppWatchMain();
706 #ifdef COMPONENT_APPLICATION_SUPPORT
709 ret = AppComponentMain();
719 switch(mApplicationType)
736 #ifdef COMPONENT_APPLICATION_SUPPORT
746 void SetLanguage(const std::string& language)
748 mLanguage = language;
751 void SetRegion(const std::string& region)
756 std::string GetLanguage()
758 if(mLanguage.empty())
760 char* language = nullptr;
761 system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &language);
763 if(language != nullptr)
765 mLanguage = std::string(language);
772 std::string GetRegion()
776 char* region = nullptr;
777 system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY, ®ion);
779 if(region != nullptr)
781 mRegion = std::string(region);
789 Type mApplicationType;
790 CallbackBase* mAbortCallBack;
791 CallbackManager* mCallbackManager;
792 std::string mLanguage{};
793 std::string mRegion{};
795 Framework* mFramework;
796 AppCore::AppEventHandlerPtr handlers[5];
797 std::unique_ptr<UiAppContext> mUiAppContext;
799 #ifdef APPCORE_WATCH_AVAILABLE
800 watch_app_lifecycle_callback_s mWatchCallback;
803 static void ProcessBundle(Framework* framework, bundle* bundleData)
805 if(bundleData == NULL)
811 char* bundleName = const_cast<char*>(bundle_get_val(bundleData, "name"));
812 if(bundleName != NULL)
814 framework->SetBundleName(bundleName);
818 char* bundleId = const_cast<char*>(bundle_get_val(bundleData, "id"));
821 framework->SetBundleId(bundleId);
825 static void AppInit(int argc, char** argv, void* data)
827 #pragma GCC diagnostic push
828 #pragma GCC diagnostic ignored "-Wold-style-cast"
830 ecore_app_args_set(argc, (const char**)argv);
831 #pragma GCC diagnostic pop
833 #ifdef DALI_ELDBUS_AVAILABLE
834 // Initialize ElDBus.
835 DALI_LOG_INFO(gDBusLogging, Debug::General, "Starting DBus Initialization\n");
840 static void AppFinish(void)
844 if(getenv("AUL_LOADER_INIT"))
846 setenv("AUL_LOADER_INIT", "0", 1);
850 #ifdef DALI_ELDBUS_AVAILABLE
852 DALI_LOG_INFO(gDBusLogging, Debug::General, "Shutting down DBus\n");
857 static void AppRun(void* data)
859 ecore_main_loop_begin();
862 static void AppExit(void* data)
864 ecore_main_loop_quit();
867 static void AppLanguageChanged(AppCore::AppEventInfoPtr event, void* data)
869 Framework* framework = static_cast<Framework*>(data);
870 Observer* observer = &framework->mObserver;
872 if(event && event->value)
874 framework->SetLanguage(std::string(static_cast<const char*>(event->value)));
875 observer->OnLanguageChanged();
879 DALI_LOG_ERROR("NULL pointer in Language changed event\n");
883 static void AppDeviceRotated(AppCore::AppEventInfoPtr event_info, void* data)
887 static void AppRegionChanged(AppCore::AppEventInfoPtr event, void* data)
889 Framework* framework = static_cast<Framework*>(data);
890 Observer* observer = &framework->mObserver;
892 if(event && event->value)
894 framework->SetRegion(std::string(static_cast<const char*>(event->value)));
895 observer->OnRegionChanged();
899 DALI_LOG_ERROR("NULL pointer in Region changed event\n");
903 static void AppBatteryLow(AppCore::AppEventInfoPtr event, void* data)
905 Observer* observer = &static_cast<Framework*>(data)->mObserver;
906 int status = *static_cast<int*>(event->value);
907 Dali::DeviceStatus::Battery::Status result = Dali::DeviceStatus::Battery::NORMAL;
909 // convert to dali battery status
914 result = Dali::DeviceStatus::Battery::POWER_OFF;
919 result = Dali::DeviceStatus::Battery::CRITICALLY_LOW;
925 observer->OnBatteryLow(result);
928 static void AppMemoryLow(AppCore::AppEventInfoPtr event, void* data)
930 Observer* observer = &static_cast<Framework*>(data)->mObserver;
931 int status = *static_cast<int*>(event->value);
932 Dali::DeviceStatus::Memory::Status result = Dali::DeviceStatus::Memory::NORMAL;
934 // convert to dali memmory status
939 result = Dali::DeviceStatus::Memory::NORMAL;
944 result = Dali::DeviceStatus::Memory::LOW;
949 result = Dali::DeviceStatus::Memory::CRITICALLY_LOW;
955 observer->OnMemoryLow(result);
960 if(mUiAppContext.get() == nullptr)
962 unsigned int hint = AppCoreUiBase::HINT_WINDOW_GROUP_CONTROL |
963 AppCoreUiBase::HINT_WINDOW_STACK_CONTROL |
964 AppCoreUiBase::HINT_BG_LAUNCH_CONTROL |
965 AppCoreUiBase::HINT_HW_ACC_CONTROL |
966 AppCoreUiBase::HINT_WINDOW_AUTO_CONTROL;
968 // For testing UIThread model, This code turns on the UI Thread feature forcibly.
969 // ex) app_launcher -e [APPID] __K_UI_THREAD enable
970 // This code doesn't change mUseUiThread in Internal::Application
971 bundle* b = bundle_import_from_argv(*mFramework->mArgc, *mFramework->mArgv);
974 const char* val = bundle_get_val(b, "__K_UI_THREAD");
975 if(val != nullptr && strcmp(val, "enable") == 0)
985 hint |= AppCoreUiBase::HINT_DUAL_THREAD;
988 mUiAppContext = std::make_unique<UiAppContext>(hint, mFramework);
991 mUiAppContext->Run(*mFramework->mArgc, *mFramework->mArgv);
992 return TIZEN_ERROR_NONE;
997 if(mUiAppContext.get() == nullptr)
1002 mUiAppContext->Exit();
1005 void AppWidgetExit()
1010 static int WidgetAppCreate(void* data)
1012 widget_base_on_create();
1013 return static_cast<int>(static_cast<Framework*>(data)->Create());
1016 static int WidgetAppTerminate(void* data)
1018 Observer* observer = &static_cast<Framework*>(data)->mObserver;
1019 observer->OnTerminate();
1021 widget_base_on_terminate();
1027 if(!IsWidgetFeatureEnabled())
1029 DALI_LOG_ERROR("widget feature is not supported");
1033 AppCore::AppAddEventHandler(&handlers[AppCore::LOW_BATTERY], AppCore::LOW_BATTERY, AppBatteryLow, mFramework);
1034 AppCore::AppAddEventHandler(&handlers[AppCore::LOW_MEMORY], AppCore::LOW_MEMORY, AppMemoryLow, mFramework);
1035 AppCore::AppAddEventHandler(&handlers[AppCore::DEVICE_ORIENTATION_CHANGED], AppCore::DEVICE_ORIENTATION_CHANGED, AppDeviceRotated, mFramework);
1036 AppCore::AppAddEventHandler(&handlers[AppCore::LANGUAGE_CHANGED], AppCore::LANGUAGE_CHANGED, AppLanguageChanged, mFramework);
1037 AppCore::AppAddEventHandler(&handlers[AppCore::REGION_FORMAT_CHANGED], AppCore::REGION_FORMAT_CHANGED, AppRegionChanged, mFramework);
1039 widget_base_ops ops = widget_base_get_default_ops();
1041 /* override methods */
1042 ops.create = WidgetAppCreate;
1043 ops.terminate = WidgetAppTerminate;
1045 ops.finish = AppFinish;
1049 int result = widget_base_init(ops, *mFramework->mArgc, *mFramework->mArgv, mFramework);
1056 #ifdef APPCORE_WATCH_AVAILABLE
1057 static bool WatchAppCreate(int width, int height, void* data)
1059 return static_cast<Framework*>(data)->Create();
1062 static void WatchAppTimeTick(watch_time_h time, void* data)
1064 Observer* observer = &static_cast<Framework*>(data)->mObserver;
1065 WatchTime curTime(time);
1067 observer->OnTimeTick(curTime);
1070 static void WatchAppAmbientTick(watch_time_h time, void* data)
1072 Observer* observer = &static_cast<Framework*>(data)->mObserver;
1073 WatchTime curTime(time);
1075 observer->OnAmbientTick(curTime);
1078 static void WatchAppAmbientChanged(bool ambient, void* data)
1080 Observer* observer = &static_cast<Framework*>(data)->mObserver;
1082 observer->OnAmbientChanged(ambient);
1085 static void WatchAppControl(app_control_h app_control, void* data)
1087 Framework* framework = static_cast<Framework*>(data);
1088 Observer* observer = &framework->mObserver;
1089 bundle* bundleData = NULL;
1091 app_control_to_bundle(app_control, &bundleData);
1092 ProcessBundle(framework, bundleData);
1094 observer->OnReset();
1095 observer->OnAppControl(app_control);
1098 static void WatchAppTerminate(void* data)
1100 Observer* observer = &static_cast<Framework*>(data)->mObserver;
1102 observer->OnTerminate();
1105 static void WatchAppPause(void* data)
1107 Observer* observer = &static_cast<Framework*>(data)->mObserver;
1109 observer->OnPause();
1112 static void WatchAppResume(void* data)
1114 Observer* observer = &static_cast<Framework*>(data)->mObserver;
1116 observer->OnResume();
1125 #ifdef APPCORE_WATCH_AVAILABLE
1126 mWatchCallback.create = WatchAppCreate;
1127 mWatchCallback.app_control = WatchAppControl;
1128 mWatchCallback.terminate = WatchAppTerminate;
1129 mWatchCallback.pause = WatchAppPause;
1130 mWatchCallback.resume = WatchAppResume;
1131 mWatchCallback.time_tick = WatchAppTimeTick;
1132 mWatchCallback.ambient_tick = WatchAppAmbientTick;
1133 mWatchCallback.ambient_changed = WatchAppAmbientChanged;
1135 AppCore::AppAddEventHandler(&handlers[AppCore::LOW_BATTERY], AppCore::LOW_BATTERY, AppBatteryLow, mFramework);
1136 AppCore::AppAddEventHandler(&handlers[AppCore::LOW_MEMORY], AppCore::LOW_MEMORY, AppMemoryLow, mFramework);
1137 AppCore::AppAddEventHandler(&handlers[AppCore::LANGUAGE_CHANGED], AppCore::LANGUAGE_CHANGED, AppLanguageChanged, mFramework);
1138 AppCore::AppAddEventHandler(&handlers[AppCore::REGION_FORMAT_CHANGED], AppCore::REGION_FORMAT_CHANGED, AppRegionChanged, mFramework);
1140 ret = watch_app_main(*mFramework->mArgc, *mFramework->mArgv, &mWatchCallback, mFramework);
1147 #ifdef APPCORE_WATCH_AVAILABLE
1152 #ifdef COMPONENT_APPLICATION_SUPPORT
1153 int AppComponentMain()
1155 /*Crate component_based_app_base_lifecycle_callback*/
1156 component_based_app_base_lifecycle_callback_s callback;
1157 callback.init = AppInit;
1158 callback.run = AppRun;
1159 callback.exit = AppExit;
1160 callback.create = ComponentAppCreate;
1161 callback.terminate = ComponentAppTerminate;
1162 callback.fini = ComponentAppFinish;
1164 return component_based_app_base_main(*mFramework->mArgc, *mFramework->mArgv, &callback, mFramework);
1168 static void* ComponentAppCreate(void* data)
1170 Framework* framework = static_cast<Framework*>(data);
1171 Observer* observer = &framework->mObserver;
1174 return Dali::AnyCast<void*>(observer->OnCreate());
1177 static void ComponentAppTerminate(void* data)
1179 Observer* observer = &static_cast<Framework*>(data)->mObserver;
1180 observer->OnTerminate();
1183 static void ComponentAppFinish(void* data)
1187 if(getenv("AUL_LOADER_INIT"))
1189 setenv("AUL_LOADER_INIT", "0", 1);
1194 void AppComponentExit()
1196 component_based_app_base_exit();
1203 Impl(const Impl& impl);
1206 Impl& operator=(const Impl& impl);
1209 Framework::Framework(Framework::Observer& observer, Framework::TaskObserver& taskObserver, int* argc, char*** argv, Type type, bool useUiThread)
1210 : mObserver(observer),
1211 mTaskObserver(taskObserver),
1212 mInitialised(false),
1219 mAbortHandler(MakeCallback(this, &Framework::AbortCallback)),
1222 bool featureFlag = true;
1223 system_info_get_platform_bool("tizen.org/feature/opengles.version.2_0", &featureFlag);
1225 if(featureFlag == false)
1227 set_last_result(TIZEN_ERROR_NOT_SUPPORTED);
1232 mImpl = new Impl(this, type, useUiThread);
1235 Framework::~Framework()
1245 bool Framework::Create()
1247 mInitialised = true;
1252 void Framework::Run()
1257 DALI_TRACE_BEGIN(gTraceFilter, "DALI_APPMAIN");
1258 ret = mImpl->AppMain();
1259 DALI_TRACE_END(gTraceFilter, "DALI_APPMAIN");
1260 if(ret != APP_ERROR_NONE)
1262 DALI_LOG_ERROR("Framework::Run(), ui_app_main() is failed. err = %d\n", ret);
1267 void Framework::Quit()
1272 bool Framework::IsMainLoopRunning()
1277 void Framework::AddAbortCallback(CallbackBase* callback)
1279 mImpl->mAbortCallBack = callback;
1282 std::string Framework::GetBundleName() const
1287 void Framework::SetBundleName(const std::string& name)
1292 std::string Framework::GetBundleId() const
1297 std::string Framework::GetResourcePath()
1299 std::string resourcePath = "";
1300 #if defined(TIZEN_PLATFORM_CONFIG_SUPPORTED) && TIZEN_PLATFORM_CONFIG_SUPPORTED
1301 char* app_rsc_path = app_get_resource_path();
1304 resourcePath = app_rsc_path;
1307 #else // For backwards compatibility with older Tizen versions
1309 // "DALI_APPLICATION_PACKAGE" is used to get the already configured Application package path.
1310 const char* environmentVariable = "DALI_APPLICATION_PACKAGE";
1311 char* value = getenv(environmentVariable);
1314 resourcePath = value;
1317 if(resourcePath.back() != '/')
1319 resourcePath += "/";
1322 #endif // TIZEN_PLATFORM_CONFIG_SUPPORTED
1324 return resourcePath;
1327 std::string Framework::GetDataPath()
1330 char* dataPath = app_get_data_path();
1339 void Framework::SetBundleId(const std::string& id)
1344 void Framework::AbortCallback()
1346 // if an abort call back has been installed run it.
1347 if(mImpl->mAbortCallBack)
1349 CallbackBase::Execute(*mImpl->mAbortCallBack);
1357 void Framework::InitThreads()
1361 void Framework::SetLanguage(const std::string& language)
1363 mImpl->SetLanguage(language);
1366 void Framework::SetRegion(const std::string& region)
1368 mImpl->SetRegion(region);
1371 std::string Framework::GetLanguage() const
1373 return mImpl->GetLanguage();
1376 std::string Framework::GetRegion() const
1378 return mImpl->GetRegion();
1381 } // namespace Adaptor
1383 } // namespace Internal