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;
58 typedef Dali::Rect<int> PositionSize;
61 typedef IntrusivePtr<Application> ApplicationPtr;
64 * Implementation of the Application class.
66 class Application : public BaseObject, public Framework::Observer, public Framework::TaskObserver
69 typedef Dali::Application::LowBatterySignalType LowBatterySignalType;
70 typedef Dali::Application::LowMemorySignalType LowMemorySignalType;
71 typedef Dali::Application::DeviceOrientationChangedSignalType DeviceOrientationChangedSignalType;
72 typedef Dali::Application::AppSignalType AppSignalType;
73 typedef Dali::Application::AppControlSignalType AppControlSignalType;
74 typedef Dali::Application::WINDOW_MODE WINDOW_MODE;
77 * Create a new application
78 * @param[in] argc A pointer to the number of arguments
79 * @param[in] argv A pointer to the argument list
80 * @param[in] stylesheet The path to user defined theme file
81 * @param[in] applicationType A member of Dali::Framework::Type
82 * @param[in] useUiThread True if the application would create a UI thread
83 * @param[in] windowData The window data
86 static ApplicationPtr New(int* argc, char** argv[], const std::string& stylesheet, Framework::Type applicationType, bool useUiThread, const WindowData& windowData);
89 * @copydoc Dali::DevelApplication::PreInitialize()
91 static void PreInitialize(int* argc, char** argv[]);
95 * @copydoc Dali::Application::MainLoop()
100 * @copydoc Dali::Application::Lower()
105 * @copydoc Dali::Application::Quit()
110 * @copydoc Dali::Application::AddIdle()
112 bool AddIdle(CallbackBase* callback, bool hasReturnValue);
115 * @copydoc Dali::Application::GetAdaptor();
117 Dali::Adaptor& GetAdaptor();
120 * @copydoc Dali::Application::GetWindow();
122 Dali::Window GetWindow();
125 * @copydoc Dali::Application::GetRegion();
127 std::string GetRegion() const;
130 * @copydoc Dali::Application::GetLanguage();
132 std::string GetLanguage() const;
135 * @copydoc Dali::Application::GetObjectRegistry();
137 Dali::ObjectRegistry GetObjectRegistry() const;
140 * @copydoc Dali::Application::GetResourcePath();
142 static std::string GetResourcePath();
145 * @copydoc Dali::DevelApplication::GetDataPath()
147 static std::string GetDataPath();
150 * Retrieves the pre-initialized application.
152 * @return A pointer to the pre-initialized application
154 static ApplicationPtr GetPreInitializedApplication();
157 * Stores PositionSize of window
159 void StoreWindowPositionSize(PositionSize positionSize);
162 * @copydoc Dali::DevelApplication::GetRenderThreadId()
164 int32_t GetRenderThreadId() const;
166 public: // From Framework::Observer
168 * Called when the framework is initialised.
170 void OnInit() override;
173 * Called when the framework is terminated.
175 void OnTerminate() override;
178 * Called when the framework is paused.
180 void OnPause() override;
183 * Called when the framework resumes from a paused state.
185 void OnResume() override;
188 * Called when the framework received AppControlSignal.
189 * @param[in] The bundle data of AppControl event.
191 void OnAppControl(void* data) override;
194 * Called when the framework informs the application that it should reset itself.
196 void OnReset() override;
199 * Called when the framework informs the application that the language of the device has changed.
201 void OnLanguageChanged() override;
204 * Called when the framework informs the application that the region of the device has changed.
206 void OnRegionChanged() override;
209 * Called when the framework informs the application that the battery level of the device is low.
211 void OnBatteryLow(Dali::DeviceStatus::Battery::Status status) override;
214 * Called when the framework informs the application that the memory level of the device is low.
216 void OnMemoryLow(Dali::DeviceStatus::Memory::Status status) override;
219 * Called when the framework informs the application that device orientation is changed.
221 void OnDeviceOrientationChanged(Dali::DeviceStatus::Orientation::Status status) override;
224 * Called when the framework informs the application that the platform surface is created.
226 void OnSurfaceCreated(Any newSurface) override;
229 * Called when the framework informs the application that the platform surface is destroyed.
231 void OnSurfaceDestroyed(Any newSurface) override;
233 public: // From Framework::TaskObserver
235 * Called when the framework is initialised.
237 void OnTaskInit() override;
240 * Called when the framework is terminated.
242 void OnTaskTerminate() override;
245 * Called when the framework received AppControlSignal.
246 * @param[in] The bundle data of AppControl event.
248 void OnTaskAppControl(void* data) override;
251 * Called when the framework informs the application that the language of the device has changed.
253 void OnTaskLanguageChanged() override;
256 * Called when the framework informs the application that the region of the device has changed.
258 void OnTaskRegionChanged() override;
261 * Called when the framework informs the application that the battery level of the device is low.
263 void OnTaskBatteryLow(Dali::DeviceStatus::Battery::Status status) override;
266 * Called when the framework informs the application that the memory level of the device is low.
268 void OnTaskMemoryLow(Dali::DeviceStatus::Memory::Status status) override;
271 * Called when the framework informs the application that the device orientation is changed.
273 * Device orientation changed event is from Application Framework(Sensor Framework), it means it is system event.
274 * If UIThreading is enable, DALI application has the main thread and UI thread.
275 * This event is emitted in main thread, then it is posted to the UI thread in this callback function.
277 void OnTaskDeviceOrientationChanged(Dali::DeviceStatus::Orientation::Status status) override;
281 * Sets a user defined theme file.
282 * This should be called before initialization.
283 * @param[in] stylesheet The path to user defined theme file
285 void SetStyleSheet(const std::string& stylesheet);
288 * Sets a command line options.
289 * This is used in case of the preinitialized application.
290 * @param[in] argc A pointer to the number of arguments
291 * @param[in] argv A pointer to the argument list
293 void SetCommandLineOptions(int* argc, char** argv[]);
296 * Sets default window type.
297 * This is used in case of the preinitialized application.
298 * @param[in] type the window type for default window
300 void SetDefaultWindowType(WindowType type);
304 * @copydoc Dali::Application::InitSignal()
306 Dali::Application::AppSignalType& InitSignal()
312 * @copydoc Dali::Application::TerminateSignal()
314 Dali::Application::AppSignalType& TerminateSignal()
316 return mTerminateSignal;
320 * @copydoc Dali::Application::PauseSignal()
322 Dali::Application::AppSignalType& PauseSignal()
328 * @copydoc Dali::Application::ResumeSignal()
330 Dali::Application::AppSignalType& ResumeSignal()
332 return mResumeSignal;
336 * @copydoc Dali::Application::ResetSignal()
338 Dali::Application::AppSignalType& ResetSignal()
344 * @copydoc Dali::Application::AppControlSignal()
346 Dali::Application::AppControlSignalType& AppControlSignal()
348 return mAppControlSignal;
352 * @copydoc Dali::Application::LanguageChangedSignal()
354 Dali::Application::AppSignalType& LanguageChangedSignal()
356 return mLanguageChangedSignal;
360 * @copydoc Dali::Application::RegionChangedSignal()
362 Dali::Application::AppSignalType& RegionChangedSignal()
364 return mRegionChangedSignal;
368 * @copydoc Dali::Application::LowBatterySignal()
370 Dali::Application::LowBatterySignalType& LowBatterySignal()
372 return mLowBatterySignal;
376 * @copydoc Dali::Application:::LowMemorySignal()
378 Dali::Application::LowMemorySignalType& LowMemorySignal()
380 return mLowMemorySignal;
384 * @copydoc Dali::Application:::DeviceOrientationChangedSignalType()
386 Dali::Application::DeviceOrientationChangedSignalType& DeviceOrientationChangedSignal()
388 return mDeviceOrientationChangedSignal;
392 * @copydoc Dali::Application::TaskInitSignal()
394 Dali::Application::AppSignalType& TaskInitSignal()
396 return mTaskInitSignal;
400 * @copydoc Dali::Application::TaskTerminateSignal()
402 Dali::Application::AppSignalType& TaskTerminateSignal()
404 return mTaskTerminateSignal;
408 * @copydoc Dali::Application::TaskAppControlSignal()
410 Dali::Application::AppControlSignalType& TaskAppControlSignal()
412 return mTaskAppControlSignal;
416 * @copydoc Dali::Application::TaskLanguageChangedSignal()
418 Dali::Application::AppSignalType& TaskLanguageChangedSignal()
420 return mTaskLanguageChangedSignal;
424 * @copydoc Dali::Application::TaskRegionChangedSignal()
426 Dali::Application::AppSignalType& TaskRegionChangedSignal()
428 return mTaskRegionChangedSignal;
432 * @copydoc Dali::Application::TaskLowBatterySignal()
434 Dali::Application::LowBatterySignalType& TaskLowBatterySignal()
436 return mTaskLowBatterySignal;
440 * @copydoc Dali::Application::TaskLowMemorySignal()
442 Dali::Application::LowMemorySignalType& TaskLowMemorySignal()
444 return mTaskLowMemorySignal;
448 * @copydoc Dali::Application::TaskDeviceOrientationChangedSignal()
450 Dali::Application::DeviceOrientationChangedSignalType& TaskDeviceOrientationChangedSignal()
452 return mTaskDeviceOrientationChangedSignal;
457 * Private Constructor
458 * @param[in] argc A pointer to the number of arguments
459 * @param[in] argv A pointer to the argument list
460 * @param[in] stylesheet The path to user defined theme file
461 * @param[in] applicationType A member of Dali::Framework::Type
462 * @param[in] useUiThread True if the application would create UI thread
463 * @param[in] windowData The WindowData
465 Application(int* argc, char** argv[], const std::string& stylesheet, Framework::Type applicationType, bool useUiThread, const WindowData& windowData);
470 virtual ~Application() override;
473 Application(const Application&);
474 Application& operator=(Application&);
477 * Creates the default window
482 * Creates the adaptor
484 void CreateAdaptor();
487 * Creates the adaptor builder
489 void CreateAdaptorBuilder();
492 * Quits from the main loop
494 void QuitFromMainLoop();
497 * Changes information of preInitialized window
499 void ChangePreInitializedWindowInfo();
502 AppSignalType mInitSignal;
503 AppSignalType mTerminateSignal;
504 AppSignalType mPauseSignal;
505 AppSignalType mResumeSignal;
506 AppSignalType mResetSignal;
507 AppControlSignalType mAppControlSignal;
508 AppSignalType mLanguageChangedSignal;
509 AppSignalType mRegionChangedSignal;
510 LowBatterySignalType mLowBatterySignal;
511 LowMemorySignalType mLowMemorySignal;
512 DeviceOrientationChangedSignalType mDeviceOrientationChangedSignal;
514 AppSignalType mTaskInitSignal;
515 AppSignalType mTaskTerminateSignal;
516 AppControlSignalType mTaskAppControlSignal;
517 AppSignalType mTaskLanguageChangedSignal;
518 AppSignalType mTaskRegionChangedSignal;
519 LowBatterySignalType mTaskLowBatterySignal;
520 LowMemorySignalType mTaskLowMemorySignal;
521 DeviceOrientationChangedSignalType mTaskDeviceOrientationChangedSignal;
523 std::unique_ptr<Framework> mFramework;
525 CommandLineOptions* mCommandLineOptions;
527 Dali::Internal::Adaptor::AdaptorBuilder* mAdaptorBuilder; ///< The adaptor builder
528 Dali::Adaptor* mAdaptor;
529 std::unique_ptr<EnvironmentOptions> mEnvironmentOptions;
531 // The Main Window is that window created by the Application during initial startup
532 // (previously this was the only window)
533 Dali::Window mMainWindow; ///< Main Window instance
534 Dali::Application::WINDOW_MODE mMainWindowMode; ///< Window mode of the main window
535 std::string mMainWindowName; ///< Name of the main window as obtained from environment options
537 std::string mStylesheet;
538 PositionSize mWindowPositionSize;
539 Launchpad::State mLaunchpadState;
540 WindowType mDefaultWindowType; ///< Default window's type. It is used when Application is created.
541 bool mUseRemoteSurface;
543 bool mIsSystemInitialized;
545 SlotDelegate<Application> mSlotDelegate;
547 static ApplicationPtr gPreInitializedApplication;
550 inline Application& GetImplementation(Dali::Application& application)
552 DALI_ASSERT_ALWAYS(application && "application handle is empty");
554 BaseObject& handle = application.GetBaseObject();
556 return static_cast<Internal::Adaptor::Application&>(handle);
559 inline const Application& GetImplementation(const Dali::Application& application)
561 DALI_ASSERT_ALWAYS(application && "application handle is empty");
563 const BaseObject& handle = application.GetBaseObject();
565 return static_cast<const Internal::Adaptor::Application&>(handle);
568 } // namespace Adaptor
570 } // namespace Internal
574 #endif // DALI_INTERNAL_APPLICATION_H