1 #ifndef DALI_INTERNAL_APPLICATION_H
2 #define DALI_INTERNAL_APPLICATION_H
5 * Copyright (c) 2022 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;
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] windowMode A member of Dali::Application::WINDOW_MODE
83 * @param[in] positionSize A position and a size of the window
84 * @param[in] applicationType A member of Dali::Framework::Type
85 * @param[in] type It is window type for default window.
86 * @param[in] useUiThread True if the application would create a UI thread
88 static ApplicationPtr New(int* argc, char** argv[], const std::string& stylesheet, WINDOW_MODE windowMode, const PositionSize& positionSize, Framework::Type applicationType, WindowType type, bool useUiThread);
91 * @copydoc Dali::DevelApplication::PreInitialize()
93 static void PreInitialize(int* argc, char** argv[]);
97 * @copydoc Dali::Application::MainLoop()
102 * @copydoc Dali::Application::Lower()
107 * @copydoc Dali::Application::Quit()
112 * @copydoc Dali::Application::AddIdle()
114 bool AddIdle(CallbackBase* callback, bool hasReturnValue);
117 * @copydoc Dali::Application::GetAdaptor();
119 Dali::Adaptor& GetAdaptor();
122 * @copydoc Dali::Application::GetWindow();
124 Dali::Window GetWindow();
127 * @copydoc Dali::Application::GetRegion();
129 std::string GetRegion() const;
132 * @copydoc Dali::Application::GetLanguage();
134 std::string GetLanguage() const;
137 * @copydoc Dali::Application::GetObjectRegistry();
139 Dali::ObjectRegistry GetObjectRegistry() const;
142 * @copydoc Dali::Application::GetResourcePath();
144 static std::string GetResourcePath();
147 * @copydoc Dali::DevelApplication::GetDataPath()
149 static std::string GetDataPath();
152 * Retrieves the pre-initialized application.
154 * @return A pointer to the pre-initialized application
156 static ApplicationPtr GetPreInitializedApplication();
159 * Stores PositionSize of window
161 void StoreWindowPositionSize(PositionSize positionSize);
164 * @copydoc Dali::DevelApplication::GetRenderThreadId()
166 int32_t GetRenderThreadId() const;
168 public: // From Framework::Observer
170 * Called when the framework is initialised.
172 void OnInit() override;
175 * Called when the framework is terminated.
177 void OnTerminate() override;
180 * Called when the framework is paused.
182 void OnPause() override;
185 * Called when the framework resumes from a paused state.
187 void OnResume() override;
190 * Called when the framework received AppControlSignal.
191 * @param[in] The bundle data of AppControl event.
193 void OnAppControl(void* data) override;
196 * Called when the framework informs the application that it should reset itself.
198 void OnReset() override;
201 * Called when the framework informs the application that the language of the device has changed.
203 void OnLanguageChanged() override;
206 * Called when the framework informs the application that the region of the device has changed.
208 void OnRegionChanged() override;
211 * Called when the framework informs the application that the battery level of the device is low.
213 void OnBatteryLow(Dali::DeviceStatus::Battery::Status status) override;
216 * Called when the framework informs the application that the memory level of the device is low.
218 void OnMemoryLow(Dali::DeviceStatus::Memory::Status status) override;
221 * Called when the framework informs the application that device orientation is changed.
223 void OnDeviceOrientationChanged(Dali::DeviceStatus::Orientation::Status status) override;
226 * Called when the framework informs the application that the platform surface is created.
228 void OnSurfaceCreated(Any newSurface) override;
231 * Called when the framework informs the application that the platform surface is destroyed.
233 void OnSurfaceDestroyed(Any newSurface) override;
235 public: // From Framework::TaskObserver
237 * Called when the framework is initialised.
239 void OnTaskInit() override;
242 * Called when the framework is terminated.
244 void OnTaskTerminate() override;
247 * Called when the framework received AppControlSignal.
248 * @param[in] The bundle data of AppControl event.
250 void OnTaskAppControl(void* data) override;
253 * Called when the framework informs the application that the language of the device has changed.
255 void OnTaskLanguageChanged() override;
258 * Called when the framework informs the application that the region of the device has changed.
260 void OnTaskRegionChanged() override;
263 * Called when the framework informs the application that the battery level of the device is low.
265 void OnTaskBatteryLow(Dali::DeviceStatus::Battery::Status status) override;
268 * Called when the framework informs the application that the memory level of the device is low.
270 void OnTaskMemoryLow(Dali::DeviceStatus::Memory::Status status) override;
273 * Called when the framework informs the application that the device orientation is changed.
275 * Device orientation changed event is from Application Framework(Sensor Framework), it means it is system event.
276 * If UIThreading is enable, DALI application has the main thread and UI thread.
277 * This event is emitted in main thread, then it is posted to the UI thread in this callback function.
279 void OnTaskDeviceOrientationChanged(Dali::DeviceStatus::Orientation::Status status) override;
283 * Sets a user defined theme file.
284 * This should be called before initialization.
285 * @param[in] stylesheet The path to user defined theme file
287 void SetStyleSheet(const std::string& stylesheet);
290 * Sets a command line options.
291 * This is used in case of the preinitialized application.
292 * @param[in] argc A pointer to the number of arguments
293 * @param[in] argv A pointer to the argument list
295 void SetCommandLineOptions(int* argc, char** argv[]);
298 * Sets default window type.
299 * This is used in case of the preinitialized application.
300 * @param[in] type the window type for default window
302 void SetDefaultWindowType(WindowType type);
306 * @copydoc Dali::Application::InitSignal()
308 Dali::Application::AppSignalType& InitSignal()
314 * @copydoc Dali::Application::TerminateSignal()
316 Dali::Application::AppSignalType& TerminateSignal()
318 return mTerminateSignal;
322 * @copydoc Dali::Application::PauseSignal()
324 Dali::Application::AppSignalType& PauseSignal()
330 * @copydoc Dali::Application::ResumeSignal()
332 Dali::Application::AppSignalType& ResumeSignal()
334 return mResumeSignal;
338 * @copydoc Dali::Application::ResetSignal()
340 Dali::Application::AppSignalType& ResetSignal()
346 * @copydoc Dali::Application::AppControlSignal()
348 Dali::Application::AppControlSignalType& AppControlSignal()
350 return mAppControlSignal;
354 * @copydoc Dali::Application::LanguageChangedSignal()
356 Dali::Application::AppSignalType& LanguageChangedSignal()
358 return mLanguageChangedSignal;
362 * @copydoc Dali::Application::RegionChangedSignal()
364 Dali::Application::AppSignalType& RegionChangedSignal()
366 return mRegionChangedSignal;
370 * @copydoc Dali::Application::LowBatterySignal()
372 Dali::Application::LowBatterySignalType& LowBatterySignal()
374 return mLowBatterySignal;
378 * @copydoc Dali::Application:::LowMemorySignal()
380 Dali::Application::LowMemorySignalType& LowMemorySignal()
382 return mLowMemorySignal;
386 * @copydoc Dali::Application:::DeviceOrientationChangedSignalType()
388 Dali::Application::DeviceOrientationChangedSignalType& DeviceOrientationChangedSignal()
390 return mDeviceOrientationChangedSignal;
394 * @copydoc Dali::Application::TaskInitSignal()
396 Dali::Application::AppSignalType& TaskInitSignal()
398 return mTaskInitSignal;
402 * @copydoc Dali::Application::TaskTerminateSignal()
404 Dali::Application::AppSignalType& TaskTerminateSignal()
406 return mTaskTerminateSignal;
410 * @copydoc Dali::Application::TaskAppControlSignal()
412 Dali::Application::AppControlSignalType& TaskAppControlSignal()
414 return mTaskAppControlSignal;
418 * @copydoc Dali::Application::TaskLanguageChangedSignal()
420 Dali::Application::AppSignalType& TaskLanguageChangedSignal()
422 return mTaskLanguageChangedSignal;
426 * @copydoc Dali::Application::TaskRegionChangedSignal()
428 Dali::Application::AppSignalType& TaskRegionChangedSignal()
430 return mTaskRegionChangedSignal;
434 * @copydoc Dali::Application::TaskLowBatterySignal()
436 Dali::Application::LowBatterySignalType& TaskLowBatterySignal()
438 return mTaskLowBatterySignal;
442 * @copydoc Dali::Application::TaskLowMemorySignal()
444 Dali::Application::LowMemorySignalType& TaskLowMemorySignal()
446 return mTaskLowMemorySignal;
450 * @copydoc Dali::Application::TaskDeviceOrientationChangedSignal()
452 Dali::Application::DeviceOrientationChangedSignalType& TaskDeviceOrientationChangedSignal()
454 return mTaskDeviceOrientationChangedSignal;
459 * Private Constructor
460 * @param[in] argc A pointer to the number of arguments
461 * @param[in] argv A pointer to the argument list
462 * @param[in] stylesheet The path to user defined theme file
463 * @param[in] windowMode A member of Dali::Application::WINDOW_MODE
464 * @param[in] positionSize A position and a size of the window
465 * @param[in] applicationType A member of Dali::Framework::Type
466 * @param[in] type The default window's type.
467 * @param[in] useUiThread True if the application would create UI thread
469 Application(int* argc, char** argv[], const std::string& stylesheet, WINDOW_MODE windowMode, const PositionSize& positionSize, Framework::Type applicationType, WindowType type, bool useUiThread);
474 virtual ~Application() override;
477 Application(const Application&);
478 Application& operator=(Application&);
481 * Creates the default window
486 * Creates the adaptor
488 void CreateAdaptor();
491 * Creates the adaptor builder
493 void CreateAdaptorBuilder();
496 * Quits from the main loop
498 void QuitFromMainLoop();
501 * Changes size of preInitialized window
503 void ChangePreInitializedWindowSize();
506 AppSignalType mInitSignal;
507 AppSignalType mTerminateSignal;
508 AppSignalType mPauseSignal;
509 AppSignalType mResumeSignal;
510 AppSignalType mResetSignal;
511 AppControlSignalType mAppControlSignal;
512 AppSignalType mLanguageChangedSignal;
513 AppSignalType mRegionChangedSignal;
514 LowBatterySignalType mLowBatterySignal;
515 LowMemorySignalType mLowMemorySignal;
516 DeviceOrientationChangedSignalType mDeviceOrientationChangedSignal;
518 AppSignalType mTaskInitSignal;
519 AppSignalType mTaskTerminateSignal;
520 AppControlSignalType mTaskAppControlSignal;
521 AppSignalType mTaskLanguageChangedSignal;
522 AppSignalType mTaskRegionChangedSignal;
523 LowBatterySignalType mTaskLowBatterySignal;
524 LowMemorySignalType mTaskLowMemorySignal;
525 DeviceOrientationChangedSignalType mTaskDeviceOrientationChangedSignal;
527 EventLoop* mEventLoop;
528 Framework* mFramework;
530 CommandLineOptions* mCommandLineOptions;
532 Dali::Internal::Adaptor::AdaptorBuilder* mAdaptorBuilder; ///< The adaptor builder
533 Dali::Adaptor* mAdaptor;
535 // The Main Window is that window created by the Application during initial startup
536 // (previously this was the only window)
537 Dali::Window mMainWindow; ///< Main Window instance
538 Dali::Application::WINDOW_MODE mMainWindowMode; ///< Window mode of the main window
539 std::string mMainWindowName; ///< Name of the main window as obtained from environment options
541 std::string mStylesheet;
542 EnvironmentOptions mEnvironmentOptions;
543 PositionSize mWindowPositionSize;
544 Launchpad::State mLaunchpadState;
545 bool mUseRemoteSurface;
546 WindowType mDefaultWindowType; ///< Default window's type. It is used when Application is created.
549 SlotDelegate<Application> mSlotDelegate;
551 static ApplicationPtr gPreInitializedApplication;
554 inline Application& GetImplementation(Dali::Application& application)
556 DALI_ASSERT_ALWAYS(application && "application handle is empty");
558 BaseObject& handle = application.GetBaseObject();
560 return static_cast<Internal::Adaptor::Application&>(handle);
563 inline const Application& GetImplementation(const Dali::Application& application)
565 DALI_ASSERT_ALWAYS(application && "application handle is empty");
567 const BaseObject& handle = application.GetBaseObject();
569 return static_cast<const Internal::Adaptor::Application&>(handle);
572 } // namespace Adaptor
574 } // namespace Internal
578 #endif // DALI_INTERNAL_APPLICATION_H