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::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] windowMode A member of Dali::Application::WINDOW_MODE
82 * @param[in] positionSize A position and a size of the window
83 * @param[in] applicationType A member of Dali::Framework::Type
84 * @param[in] type It is window type for default window.
85 * @param[in] useUiThread True if the application would create a UI thread
87 static ApplicationPtr New(int* argc, char** argv[], const std::string& stylesheet, WINDOW_MODE windowMode, const PositionSize& positionSize, Framework::Type applicationType, WindowType type, bool useUiThread);
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);
162 public: // From Framework::Observer
164 * Called when the framework is initialised.
166 void OnInit() override;
169 * Called when the framework is terminated.
171 void OnTerminate() override;
174 * Called when the framework is paused.
176 void OnPause() override;
179 * Called when the framework resumes from a paused state.
181 void OnResume() override;
184 * Called when the framework received AppControlSignal.
185 * @param[in] The bundle data of AppControl event.
187 void OnAppControl(void* data) override;
190 * Called when the framework informs the application that it should reset itself.
192 void OnReset() override;
195 * Called when the framework informs the application that the language of the device has changed.
197 void OnLanguageChanged() override;
200 * Called when the framework informs the application that the region of the device has changed.
202 void OnRegionChanged() override;
205 * Called when the framework informs the application that the battery level of the device is low.
207 void OnBatteryLow(Dali::DeviceStatus::Battery::Status status) override;
210 * Called when the framework informs the application that the memory level of the device is low.
212 void OnMemoryLow(Dali::DeviceStatus::Memory::Status status) override;
215 * Called when the framework informs the application that the platform surface is created.
217 void OnSurfaceCreated(Any newSurface) override;
220 * Called when the framework informs the application that the platform surface is destroyed.
222 void OnSurfaceDestroyed(Any newSurface) override;
224 public: // From Framework::TaskObserver
226 * Called when the framework is initialised.
228 void OnTaskInit() override;
231 * Called when the framework is terminated.
233 void OnTaskTerminate() override;
236 * Called when the framework received AppControlSignal.
237 * @param[in] The bundle data of AppControl event.
239 void OnTaskAppControl(void* data) override;
242 * Called when the framework informs the application that the language of the device has changed.
244 void OnTaskLanguageChanged() override;
247 * Called when the framework informs the application that the region of the device has changed.
249 void OnTaskRegionChanged() override;
252 * Called when the framework informs the application that the battery level of the device is low.
254 void OnTaskBatteryLow(Dali::DeviceStatus::Battery::Status status) override;
257 * Called when the framework informs the application that the memory level of the device is low.
259 void OnTaskMemoryLow(Dali::DeviceStatus::Memory::Status status) override;
263 * Sets a user defined theme file.
264 * This should be called before initialization.
265 * @param[in] stylesheet The path to user defined theme file
267 void SetStyleSheet(const std::string& stylesheet);
270 * Sets a command line options.
271 * This is used in case of the preinitialized application.
272 * @param[in] argc A pointer to the number of arguments
273 * @param[in] argv A pointer to the argument list
275 void SetCommandLineOptions(int* argc, char** argv[]);
278 * Sets default window type.
279 * This is used in case of the preinitialized application.
280 * @param[in] type the window type for default window
282 void SetDefaultWindowType(WindowType type);
286 * @copydoc Dali::Application::InitSignal()
288 Dali::Application::AppSignalType& InitSignal()
294 * @copydoc Dali::Application::TerminateSignal()
296 Dali::Application::AppSignalType& TerminateSignal()
298 return mTerminateSignal;
302 * @copydoc Dali::Application::PauseSignal()
304 Dali::Application::AppSignalType& PauseSignal()
310 * @copydoc Dali::Application::ResumeSignal()
312 Dali::Application::AppSignalType& ResumeSignal()
314 return mResumeSignal;
318 * @copydoc Dali::Application::ResetSignal()
320 Dali::Application::AppSignalType& ResetSignal()
326 * @copydoc Dali::Application::AppControlSignal()
328 Dali::Application::AppControlSignalType& AppControlSignal()
330 return mAppControlSignal;
334 * @copydoc Dali::Application::LanguageChangedSignal()
336 Dali::Application::AppSignalType& LanguageChangedSignal()
338 return mLanguageChangedSignal;
342 * @copydoc Dali::Application::RegionChangedSignal()
344 Dali::Application::AppSignalType& RegionChangedSignal()
346 return mRegionChangedSignal;
350 * @copydoc Dali::Application::LowBatterySignal()
352 Dali::Application::LowBatterySignalType& LowBatterySignal()
354 return mLowBatterySignal;
358 * @copydoc Dali::Application:::LowMemorySignal()
360 Dali::Application::LowMemorySignalType& LowMemorySignal()
362 return mLowMemorySignal;
366 * @copydoc Dali::Application::TaskInitSignal()
368 Dali::Application::AppSignalType& TaskInitSignal()
370 return mTaskInitSignal;
374 * @copydoc Dali::Application::TaskTerminateSignal()
376 Dali::Application::AppSignalType& TaskTerminateSignal()
378 return mTaskTerminateSignal;
382 * @copydoc Dali::Application::TaskAppControlSignal()
384 Dali::Application::AppControlSignalType& TaskAppControlSignal()
386 return mTaskAppControlSignal;
390 * @copydoc Dali::Application::TaskLanguageChangedSignal()
392 Dali::Application::AppSignalType& TaskLanguageChangedSignal()
394 return mTaskLanguageChangedSignal;
398 * @copydoc Dali::Application::TaskRegionChangedSignal()
400 Dali::Application::AppSignalType& TaskRegionChangedSignal()
402 return mTaskRegionChangedSignal;
406 * @copydoc Dali::Application::TaskLowBatterySignal()
408 Dali::Application::LowBatterySignalType& TaskLowBatterySignal()
410 return mTaskLowBatterySignal;
414 * @copydoc Dali::Application::TaskLowMemorySignal()
416 Dali::Application::LowMemorySignalType& TaskLowMemorySignal()
418 return mTaskLowMemorySignal;
423 * Private Constructor
424 * @param[in] argc A pointer to the number of arguments
425 * @param[in] argv A pointer to the argument list
426 * @param[in] stylesheet The path to user defined theme file
427 * @param[in] windowMode A member of Dali::Application::WINDOW_MODE
428 * @param[in] positionSize A position and a size of the window
429 * @param[in] applicationType A member of Dali::Framework::Type
430 * @param[in] type The default window's type.
431 * @param[in] useUiThread True if the application would create UI thread
433 Application(int* argc, char** argv[], const std::string& stylesheet, WINDOW_MODE windowMode, const PositionSize& positionSize, Framework::Type applicationType, WindowType type, bool useUiThread);
438 ~Application() override;
441 Application(const Application&);
442 Application& operator=(Application&);
445 * Creates the default window
450 * Creates the adaptor
452 void CreateAdaptor();
455 * Creates the adaptor builder
457 void CreateAdaptorBuilder();
460 * Quits from the main loop
462 void QuitFromMainLoop();
465 * Changes size of preInitialized window
467 void ChangePreInitializedWindowSize();
470 AppSignalType mInitSignal;
471 AppSignalType mTerminateSignal;
472 AppSignalType mPauseSignal;
473 AppSignalType mResumeSignal;
474 AppSignalType mResetSignal;
475 AppControlSignalType mAppControlSignal;
476 AppSignalType mLanguageChangedSignal;
477 AppSignalType mRegionChangedSignal;
478 LowBatterySignalType mLowBatterySignal;
479 LowMemorySignalType mLowMemorySignal;
481 AppSignalType mTaskInitSignal;
482 AppSignalType mTaskTerminateSignal;
483 AppControlSignalType mTaskAppControlSignal;
484 AppSignalType mTaskLanguageChangedSignal;
485 AppSignalType mTaskRegionChangedSignal;
486 LowBatterySignalType mTaskLowBatterySignal;
487 LowMemorySignalType mTaskLowMemorySignal;
489 EventLoop* mEventLoop;
490 Framework* mFramework;
492 CommandLineOptions* mCommandLineOptions;
494 Dali::Internal::Adaptor::AdaptorBuilder* mAdaptorBuilder; ///< The adaptor builder
495 Dali::Adaptor* mAdaptor;
497 // The Main Window is that window created by the Application during initial startup
498 // (previously this was the only window)
499 Dali::Window mMainWindow; ///< Main Window instance
500 Dali::Application::WINDOW_MODE mMainWindowMode; ///< Window mode of the main window
501 std::string mMainWindowName; ///< Name of the main window as obtained from environment options
503 std::string mStylesheet;
504 EnvironmentOptions mEnvironmentOptions;
505 PositionSize mWindowPositionSize;
506 Launchpad::State mLaunchpadState;
507 bool mUseRemoteSurface;
508 WindowType mDefaultWindowType; ///< Default window's type. It is used when Application is created.
511 SlotDelegate<Application> mSlotDelegate;
513 static ApplicationPtr gPreInitializedApplication;
516 inline Application& GetImplementation(Dali::Application& application)
518 DALI_ASSERT_ALWAYS(application && "application handle is empty");
520 BaseObject& handle = application.GetBaseObject();
522 return static_cast<Internal::Adaptor::Application&>(handle);
525 inline const Application& GetImplementation(const Dali::Application& application)
527 DALI_ASSERT_ALWAYS(application && "application handle is empty");
529 const BaseObject& handle = application.GetBaseObject();
531 return static_cast<const Internal::Adaptor::Application&>(handle);
534 } // namespace Adaptor
536 } // namespace Internal
540 #endif // DALI_INTERNAL_APPLICATION_H