1 #ifndef DALI_INTERNAL_APPLICATION_H
2 #define DALI_INTERNAL_APPLICATION_H
5 * Copyright (c) 2018 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/public-api/adaptor-framework/application.h>
27 #include <dali/devel-api/adaptor-framework/singleton-service.h>
29 #include <dali/internal/adaptor/common/framework.h>
30 #include <dali/internal/window-system/common/window-impl.h>
31 #include <dali/internal/system/common/environment-options.h>
32 #include <dali/internal/adaptor/common/adaptor-builder-impl.h>
49 * @brief Launchpad is used to improve application launch performance.
50 * When an application is pre-initialized, so files are preloaded, some functions are initialized and a window is made in advance.
54 NONE, ///< The default state
55 PRE_INITIALIZED ///< Application is pre-initialized.
58 } // namespace Launchpad
60 class CommandLineOptions;
63 typedef Dali::Rect<int> PositionSize;
66 typedef IntrusivePtr<Application> ApplicationPtr;
69 * Implementation of the Application class.
71 class Application : public BaseObject, public Framework::Observer
75 typedef Dali::Application::LowBatterySignalType LowBatterySignalType;
76 typedef Dali::Application::LowMemorySignalType LowMemorySignalType;
77 typedef Dali::Application::AppSignalType AppSignalType;
78 typedef Dali::Application::AppControlSignalType AppControlSignalType;
79 typedef Dali::Application::WINDOW_MODE WINDOW_MODE;
82 * Create a new application
83 * @param[in] argc A pointer to the number of arguments
84 * @param[in] argv A pointer to the argument list
85 * @param[in] stylesheet The path to user defined theme file
86 * @param[in] windowMode A member of Dali::Application::WINDOW_MODE
87 * @param[in] positionSize A position and a size of the window
88 * @param[in] applicationType A member of Dali::Framework::Type
90 static ApplicationPtr New( int* argc, char **argv[], const std::string& stylesheet,
91 WINDOW_MODE windowMode, const PositionSize& positionSize, Framework::Type applicationType );
94 * @copydoc Dali::DevelApplication::PreInitialize()
96 static void PreInitialize( int* argc, char** argv[] );
101 * @copydoc Dali::Application::MainLoop()
103 void MainLoop(Dali::Configuration::ContextLoss configuration);
106 * @copydoc Dali::Application::Lower()
111 * @copydoc Dali::Application::Quit()
116 * @copydoc Dali::Application::AddIdle()
118 bool AddIdle( CallbackBase* callback, bool hasReturnValue );
121 * @copydoc Dali::Application::GetAdaptor();
123 Dali::Adaptor& GetAdaptor();
126 * @copydoc Dali::Application::GetWindow();
128 Dali::Window GetWindow();
131 * @copydoc Dali::Application::GetRegion();
133 std::string GetRegion() const;
136 * @copydoc Dali::Application::GetLanguage();
138 std::string GetLanguage() const;
141 * @copydoc Dali::Application::ReplaceWindow();
143 void ReplaceWindow( const PositionSize& positionSize, const std::string& name);
146 * @copydoc Dali::Application::GetResourcePath();
148 static std::string GetResourcePath();
151 * Retrieves the pre-initialized application.
153 * @return A pointer to the pre-initialized application
155 static ApplicationPtr GetPreInitializedApplication();
157 public: // Lifecycle functionality
160 * Called when OnInit is called or the framework is initialised.
165 * Called after OnInit is called or the framework is started.
170 * Called when OnTerminate is called or the framework is terminated.
175 * Called when OnPause is called or the framework is paused.
180 * Called when OnResume is called or the framework resumes from a paused state.
185 * Called when OnLanguageChanged is called or the framework informs the application that the language of the device has changed.
187 void DoLanguageChange();
189 public: // From Framework::Observer
192 * Called when the framework is initialised.
194 virtual void OnInit();
197 * Called when the framework is terminated.
199 virtual void OnTerminate();
202 * Called when the framework is paused.
204 virtual void OnPause();
207 * Called when the framework resumes from a paused state.
209 virtual void OnResume();
212 * Called when the framework received AppControlSignal.
213 * @param[in] The bundle data of AppControl event.
215 virtual void OnAppControl(void *data);
218 * Called when the framework informs the application that it should reset itself.
220 virtual void OnReset();
223 * Called when the framework informs the application that the language of the device has changed.
225 virtual void OnLanguageChanged();
228 * Called when the framework informs the application that the region of the device has changed.
230 virtual void OnRegionChanged();
233 * Called when the framework informs the application that the battery level of the device is low.
235 virtual void OnBatteryLow( Dali::DeviceStatus::Battery::Status status );
238 * Called when the framework informs the application that the memory level of the device is low.
240 virtual void OnMemoryLow( Dali::DeviceStatus::Memory::Status status );
245 * Signal handler when the adaptor's window resizes itself.
246 * @param[in] adaptor The adaptor
248 void OnResize(Dali::Adaptor& adaptor);
251 * Sets a user defined theme file.
252 * This should be called before initialization.
253 * @param[in] stylesheet The path to user defined theme file
255 void SetStyleSheet( const std::string& stylesheet );
260 * @copydoc Dali::Application::InitSignal()
262 Dali::Application::AppSignalType& InitSignal() { return mInitSignal; }
265 * @copydoc Dali::Application::TerminateSignal()
267 Dali::Application::AppSignalType& TerminateSignal() { return mTerminateSignal; }
270 * @copydoc Dali::Application::PauseSignal()
272 Dali::Application::AppSignalType& PauseSignal() { return mPauseSignal; }
275 * @copydoc Dali::Application::ResumeSignal()
277 Dali::Application::AppSignalType& ResumeSignal() { return mResumeSignal; }
280 * @copydoc Dali::Application::ResetSignal()
282 Dali::Application::AppSignalType& ResetSignal() { return mResetSignal; }
285 * @copydoc Dali::Application::AppControlSignal()
287 Dali::Application::AppControlSignalType& AppControlSignal() { return mAppControlSignal; }
290 * @copydoc Dali::Application::ResizeSignal()
292 Dali::Application::AppSignalType& ResizeSignal() { return mResizeSignal; }
295 * @copydoc Dali::Application::LanguageChangedSignal()
297 Dali::Application::AppSignalType& LanguageChangedSignal() { return mLanguageChangedSignal; }
300 * @copydoc Dali::Application::RegionChangedSignal()
302 Dali::Application::AppSignalType& RegionChangedSignal() { return mRegionChangedSignal; }
305 * @copydoc Dali::Application::BatteryLowSignal()
307 Dali::Application::AppSignalType& BatteryLowSignal() { return mBatteryLowSignal; }
310 * @copydoc Dali::Application::MemoryLowSignal()
312 Dali::Application::AppSignalType& MemoryLowSignal() { return mMemoryLowSignal; }
315 * @copydoc Dali::Application::LowBatterySignal()
317 Dali::Application::LowBatterySignalType& LowBatterySignal() { return mLowBatterySignal; }
320 * @copydoc Dali::Application:::LowMemorySignal()
322 Dali::Application::LowMemorySignalType& LowMemorySignal() { return mLowMemorySignal; }
327 * Private Constructor
328 * @param[in] argc A pointer to the number of arguments
329 * @param[in] argv A pointer to the argument list
330 * @param[in] stylesheet The path to user defined theme file
331 * @param[in] windowMode A member of Dali::Application::WINDOW_MODE
332 * @param[in] positionSize A position and a size of the window
333 * @param[in] applicationType A member of Dali::Framework::Type
335 Application( int* argc, char **argv[], const std::string& stylesheet,
336 WINDOW_MODE windowMode, const PositionSize& positionSize, Framework::Type applicationType );
341 virtual ~Application();
344 Application(const Application&);
345 Application& operator=(Application&);
353 * Creates the adaptor
355 void CreateAdaptor();
358 * Creates the adaptor builder
360 void CreateAdaptorBuilder();
363 * Quits from the main loop
365 void QuitFromMainLoop();
369 AppSignalType mInitSignal;
370 AppSignalType mTerminateSignal;
371 AppSignalType mPauseSignal;
372 AppSignalType mResumeSignal;
373 AppSignalType mResetSignal;
374 AppSignalType mResizeSignal;
375 AppControlSignalType mAppControlSignal;
376 AppSignalType mLanguageChangedSignal;
377 AppSignalType mRegionChangedSignal;
378 AppSignalType mBatteryLowSignal;
379 AppSignalType mMemoryLowSignal;
380 LowBatterySignalType mLowBatterySignal;
381 LowMemorySignalType mLowMemorySignal;
383 EventLoop* mEventLoop;
384 Framework* mFramework;
386 Dali::Configuration::ContextLoss mContextLossConfiguration;
387 CommandLineOptions* mCommandLineOptions;
389 Dali::SingletonService mSingletonService;
390 Dali::Internal::Adaptor::AdaptorBuilder* mAdaptorBuilder; ///< The adaptor builder
391 Dali::Adaptor* mAdaptor;
393 // The Main Window is that window created by the Application during initial startup
394 // (previously this was the only window)
395 Dali::Window mMainWindow; ///< Main Window instance
396 Dali::Application::WINDOW_MODE mMainWindowMode; ///< Window mode of the main window
397 std::string mMainWindowName; ///< Name of the main window as obtained from environment options
399 std::string mStylesheet;
400 EnvironmentOptions mEnvironmentOptions;
401 PositionSize mWindowPositionSize;
402 Launchpad::State mLaunchpadState;
403 bool mUseRemoteSurface;
405 SlotDelegate< Application > mSlotDelegate;
407 static ApplicationPtr gPreInitializedApplication;
410 inline Application& GetImplementation(Dali::Application& application)
412 DALI_ASSERT_ALWAYS(application && "application handle is empty");
414 BaseObject& handle = application.GetBaseObject();
416 return static_cast<Internal::Adaptor::Application&>(handle);
419 inline const Application& GetImplementation(const Dali::Application& application)
421 DALI_ASSERT_ALWAYS(application && "application handle is empty");
423 const BaseObject& handle = application.GetBaseObject();
425 return static_cast<const Internal::Adaptor::Application&>(handle);
429 } // namespace Adaptor
431 } // namespace Internal
435 #endif // DALI_INTERNAL_APPLICATION_H