1 #ifndef DALI_INTERNAL_APPLICATION_H
2 #define DALI_INTERNAL_APPLICATION_H
5 * Copyright (c) 2023 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali/public-api/math/rect.h>
23 #include <dali/public-api/object/base-object.h>
26 #include <dali/devel-api/common/singleton-service.h>
27 #include <dali/public-api/adaptor-framework/application.h>
29 #include <dali/internal/adaptor/common/adaptor-builder-impl.h>
30 #include <dali/internal/adaptor/common/framework.h>
31 #include <dali/internal/system/common/environment-options.h>
45 * @brief Launchpad is used to improve application launch performance.
46 * When an application is pre-initialized, so files are preloaded, some functions are initialized and a window is made in advance.
50 NONE, ///< The default state
51 PRE_INITIALIZED ///< Application is pre-initialized.
54 } // namespace Launchpad
56 class CommandLineOptions;
57 class FrameworkFactory;
59 typedef Dali::Rect<int> PositionSize;
62 typedef IntrusivePtr<Application> ApplicationPtr;
65 * Implementation of the Application class.
67 class Application : public BaseObject, public Framework::Observer, public Framework::TaskObserver
70 typedef Dali::Application::LowBatterySignalType LowBatterySignalType;
71 typedef Dali::Application::LowMemorySignalType LowMemorySignalType;
72 typedef Dali::Application::DeviceOrientationChangedSignalType DeviceOrientationChangedSignalType;
73 typedef Dali::Application::AppSignalType AppSignalType;
74 typedef Dali::Application::AppControlSignalType AppControlSignalType;
75 typedef Dali::Application::WINDOW_MODE WINDOW_MODE;
78 * Create a new application
79 * @param[in] argc A pointer to the number of arguments
80 * @param[in] argv A pointer to the argument list
81 * @param[in] stylesheet The path to user defined theme file
82 * @param[in] applicationType A member of Dali::Framework::Type
83 * @param[in] useUiThread True if the application would create a UI thread
84 * @param[in] windowData The window data
87 static ApplicationPtr New(int* argc, char** argv[], const std::string& stylesheet, Framework::Type applicationType, bool useUiThread, const WindowData& windowData);
90 * @copydoc Dali::DevelApplication::PreInitialize()
92 static void PreInitialize(int* argc, char** argv[]);
96 * @copydoc Dali::Application::MainLoop()
101 * @copydoc Dali::Application::Lower()
106 * @copydoc Dali::Application::Quit()
111 * @copydoc Dali::Application::AddIdle()
113 bool AddIdle(CallbackBase* callback, bool hasReturnValue);
116 * @copydoc Dali::Application::GetAdaptor();
118 Dali::Adaptor& GetAdaptor();
121 * @copydoc Dali::Application::GetWindow();
123 Dali::Window GetWindow();
126 * @copydoc Dali::Application::GetRegion();
128 std::string GetRegion() const;
131 * @copydoc Dali::Application::GetLanguage();
133 std::string GetLanguage() const;
136 * @copydoc Dali::Application::GetObjectRegistry();
138 Dali::ObjectRegistry GetObjectRegistry() const;
141 * @copydoc Dali::Application::GetResourcePath();
143 static std::string GetResourcePath();
146 * @copydoc Dali::DevelApplication::GetDataPath()
148 static std::string GetDataPath();
151 * Retrieves the pre-initialized application.
153 * @return A pointer to the pre-initialized application
155 static ApplicationPtr GetPreInitializedApplication();
158 * Stores PositionSize of window
160 void StoreWindowPositionSize(PositionSize positionSize);
163 * Stores the front buffer rendering status of the window.
165 void StoreFrontBufferRendering(bool enable);
168 * @copydoc Dali::DevelApplication::GetRenderThreadId()
170 int32_t GetRenderThreadId() const;
172 public: // From Framework::Observer
174 * Called when the framework is initialised.
176 void OnInit() override;
179 * Called when the framework is terminated.
181 void OnTerminate() override;
184 * Called when the framework is paused.
186 void OnPause() override;
189 * Called when the framework resumes from a paused state.
191 void OnResume() override;
194 * Called when the framework received AppControlSignal.
195 * @param[in] The bundle data of AppControl event.
197 void OnAppControl(void* data) override;
200 * Called when the framework informs the application that it should reset itself.
202 void OnReset() override;
205 * Called when the framework informs the application that the language of the device has changed.
207 void OnLanguageChanged() override;
210 * Called when the framework informs the application that the region of the device has changed.
212 void OnRegionChanged() override;
215 * Called when the framework informs the application that the battery level of the device is low.
217 void OnBatteryLow(Dali::DeviceStatus::Battery::Status status) override;
220 * Called when the framework informs the application that the memory level of the device is low.
222 void OnMemoryLow(Dali::DeviceStatus::Memory::Status status) override;
225 * Called when the framework informs the application that device orientation is changed.
227 void OnDeviceOrientationChanged(Dali::DeviceStatus::Orientation::Status status) override;
230 * Called when the framework informs the application that the platform surface is created.
232 void OnSurfaceCreated(Any newSurface) override;
235 * Called when the framework informs the application that the platform surface is destroyed.
237 void OnSurfaceDestroyed(Any newSurface) override;
239 public: // From Framework::TaskObserver
241 * Called when the framework is initialised.
243 void OnTaskInit() override;
246 * Called when the framework is terminated.
248 void OnTaskTerminate() override;
251 * Called when the framework received AppControlSignal.
252 * @param[in] The bundle data of AppControl event.
254 void OnTaskAppControl(void* data) override;
257 * Called when the framework informs the application that the language of the device has changed.
259 void OnTaskLanguageChanged() override;
262 * Called when the framework informs the application that the region of the device has changed.
264 void OnTaskRegionChanged() override;
267 * Called when the framework informs the application that the battery level of the device is low.
269 void OnTaskBatteryLow(Dali::DeviceStatus::Battery::Status status) override;
272 * Called when the framework informs the application that the memory level of the device is low.
274 void OnTaskMemoryLow(Dali::DeviceStatus::Memory::Status status) override;
277 * Called when the framework informs the application that the device orientation is changed.
279 * Device orientation changed event is from Application Framework(Sensor Framework), it means it is system event.
280 * If UIThreading is enable, DALI application has the main thread and UI thread.
281 * This event is emitted in main thread, then it is posted to the UI thread in this callback function.
283 void OnTaskDeviceOrientationChanged(Dali::DeviceStatus::Orientation::Status status) override;
287 * Sets a user defined theme file.
288 * This should be called before initialization.
289 * @param[in] stylesheet The path to user defined theme file
291 void SetStyleSheet(const std::string& stylesheet);
294 * Sets a command line options.
295 * This is used in case of the preinitialized application.
296 * @param[in] argc A pointer to the number of arguments
297 * @param[in] argv A pointer to the argument list
299 void SetCommandLineOptions(int* argc, char** argv[]);
302 * Sets default window type.
303 * This is used in case of the preinitialized application.
304 * @param[in] type the window type for default window
306 void SetDefaultWindowType(WindowType type);
309 * @brief Relayout the application and ensure all pending operations are flushed to the update thread.
311 void FlushUpdateMessages();
315 * @copydoc Dali::Application::InitSignal()
317 Dali::Application::AppSignalType& InitSignal()
323 * @copydoc Dali::Application::TerminateSignal()
325 Dali::Application::AppSignalType& TerminateSignal()
327 return mTerminateSignal;
331 * @copydoc Dali::Application::PauseSignal()
333 Dali::Application::AppSignalType& PauseSignal()
339 * @copydoc Dali::Application::ResumeSignal()
341 Dali::Application::AppSignalType& ResumeSignal()
343 return mResumeSignal;
347 * @copydoc Dali::Application::ResetSignal()
349 Dali::Application::AppSignalType& ResetSignal()
355 * @copydoc Dali::Application::AppControlSignal()
357 Dali::Application::AppControlSignalType& AppControlSignal()
359 return mAppControlSignal;
363 * @copydoc Dali::Application::LanguageChangedSignal()
365 Dali::Application::AppSignalType& LanguageChangedSignal()
367 return mLanguageChangedSignal;
371 * @copydoc Dali::Application::RegionChangedSignal()
373 Dali::Application::AppSignalType& RegionChangedSignal()
375 return mRegionChangedSignal;
379 * @copydoc Dali::Application::LowBatterySignal()
381 Dali::Application::LowBatterySignalType& LowBatterySignal()
383 return mLowBatterySignal;
387 * @copydoc Dali::Application:::LowMemorySignal()
389 Dali::Application::LowMemorySignalType& LowMemorySignal()
391 return mLowMemorySignal;
395 * @copydoc Dali::Application:::DeviceOrientationChangedSignalType()
397 Dali::Application::DeviceOrientationChangedSignalType& DeviceOrientationChangedSignal()
399 return mDeviceOrientationChangedSignal;
403 * @copydoc Dali::Application::TaskInitSignal()
405 Dali::Application::AppSignalType& TaskInitSignal()
407 return mTaskInitSignal;
411 * @copydoc Dali::Application::TaskTerminateSignal()
413 Dali::Application::AppSignalType& TaskTerminateSignal()
415 return mTaskTerminateSignal;
419 * @copydoc Dali::Application::TaskAppControlSignal()
421 Dali::Application::AppControlSignalType& TaskAppControlSignal()
423 return mTaskAppControlSignal;
427 * @copydoc Dali::Application::TaskLanguageChangedSignal()
429 Dali::Application::AppSignalType& TaskLanguageChangedSignal()
431 return mTaskLanguageChangedSignal;
435 * @copydoc Dali::Application::TaskRegionChangedSignal()
437 Dali::Application::AppSignalType& TaskRegionChangedSignal()
439 return mTaskRegionChangedSignal;
443 * @copydoc Dali::Application::TaskLowBatterySignal()
445 Dali::Application::LowBatterySignalType& TaskLowBatterySignal()
447 return mTaskLowBatterySignal;
451 * @copydoc Dali::Application::TaskLowMemorySignal()
453 Dali::Application::LowMemorySignalType& TaskLowMemorySignal()
455 return mTaskLowMemorySignal;
459 * @copydoc Dali::Application::TaskDeviceOrientationChangedSignal()
461 Dali::Application::DeviceOrientationChangedSignalType& TaskDeviceOrientationChangedSignal()
463 return mTaskDeviceOrientationChangedSignal;
468 * Private Constructor
469 * @param[in] argc A pointer to the number of arguments
470 * @param[in] argv A pointer to the argument list
471 * @param[in] stylesheet The path to user defined theme file
472 * @param[in] applicationType A member of Dali::Framework::Type
473 * @param[in] useUiThread True if the application would create UI thread
474 * @param[in] windowData The WindowData
476 Application(int* argc, char** argv[], const std::string& stylesheet, Framework::Type applicationType, bool useUiThread, const WindowData& windowData);
481 virtual ~Application() override;
484 Application(const Application&);
485 Application& operator=(Application&);
488 * Creates the default window
493 * Creates the adaptor
495 void CreateAdaptor();
498 * Creates the adaptor builder
500 void CreateAdaptorBuilder();
503 * Quits from the main loop
505 void QuitFromMainLoop();
508 * Changes information of preInitialized window
510 void ChangePreInitializedWindowInfo();
513 AppSignalType mInitSignal;
514 AppSignalType mTerminateSignal;
515 AppSignalType mPauseSignal;
516 AppSignalType mResumeSignal;
517 AppSignalType mResetSignal;
518 AppControlSignalType mAppControlSignal;
519 AppSignalType mLanguageChangedSignal;
520 AppSignalType mRegionChangedSignal;
521 LowBatterySignalType mLowBatterySignal;
522 LowMemorySignalType mLowMemorySignal;
523 DeviceOrientationChangedSignalType mDeviceOrientationChangedSignal;
525 AppSignalType mTaskInitSignal;
526 AppSignalType mTaskTerminateSignal;
527 AppControlSignalType mTaskAppControlSignal;
528 AppSignalType mTaskLanguageChangedSignal;
529 AppSignalType mTaskRegionChangedSignal;
530 LowBatterySignalType mTaskLowBatterySignal;
531 LowMemorySignalType mTaskLowMemorySignal;
532 DeviceOrientationChangedSignalType mTaskDeviceOrientationChangedSignal;
534 std::unique_ptr<Framework> mFramework;
535 std::unique_ptr<FrameworkFactory> mFrameworkFactory;
537 CommandLineOptions* mCommandLineOptions;
539 Dali::Internal::Adaptor::AdaptorBuilder* mAdaptorBuilder; ///< The adaptor builder
540 Dali::Adaptor* mAdaptor;
541 std::unique_ptr<EnvironmentOptions> mEnvironmentOptions;
543 // The Main Window is that window created by the Application during initial startup
544 // (previously this was the only window)
545 Dali::Window mMainWindow; ///< Main Window instance
546 Dali::Application::WINDOW_MODE mMainWindowMode; ///< Window mode of the main window
547 std::string mMainWindowName; ///< Name of the main window as obtained from environment options
548 bool mIsMainWindowFrontBufferRendering; ///< Whether front buffer rendering of the main window is enabled
550 std::string mStylesheet;
551 PositionSize mWindowPositionSize;
552 Launchpad::State mLaunchpadState;
553 WindowType mDefaultWindowType; ///< Default window's type. It is used when Application is created.
554 bool mUseRemoteSurface;
556 bool mIsSystemInitialized;
558 SlotDelegate<Application> mSlotDelegate;
560 UIThreadLoader* mUIThreadLoader;
561 static ApplicationPtr gPreInitializedApplication;
564 inline Application& GetImplementation(Dali::Application& application)
566 DALI_ASSERT_ALWAYS(application && "application handle is empty");
568 BaseObject& handle = application.GetBaseObject();
570 return static_cast<Internal::Adaptor::Application&>(handle);
573 inline const Application& GetImplementation(const Dali::Application& application)
575 DALI_ASSERT_ALWAYS(application && "application handle is empty");
577 const BaseObject& handle = application.GetBaseObject();
579 return static_cast<const Internal::Adaptor::Application&>(handle);
582 } // namespace Adaptor
584 } // namespace Internal
588 #endif // DALI_INTERNAL_APPLICATION_H