1 #ifndef __DALI_INTERNAL_APPLICATION_H__
2 #define __DALI_INTERNAL_APPLICATION_H__
5 * Copyright (c) 2017 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 <application.h>
27 #include <application-devel.h>
28 #include <singleton-service.h>
30 #include <framework.h>
31 #include <window-impl.h>
32 #include <base/environment-options.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::AppSignalType AppSignalType;
76 typedef Dali::Application::AppControlSignalType AppControlSignalType;
77 typedef Dali::Application::WINDOW_MODE WINDOW_MODE;
80 * Create a new application
81 * @param[in] argc A pointer to the number of arguments
82 * @param[in] argv A pointer to the argument list
83 * @param[in] stylesheet The path to user defined theme file
84 * @param[in] windowMode A member of Dali::Application::WINDOW_MODE
85 * @param[in] positionSize A position and a size of the window
86 * @param[in] applicationType A member of Dali::Framework::Type
88 static ApplicationPtr New( int* argc, char **argv[], const std::string& stylesheet,
89 WINDOW_MODE windowMode, const PositionSize& positionSize, Framework::Type applicationType );
92 * @copydoc Dali::DevelApplication::PreInitialize()
94 static void PreInitialize( int* argc, char** argv[] );
99 * @copydoc Dali::Application::MainLoop()
101 void MainLoop(Dali::Configuration::ContextLoss configuration);
104 * @copydoc Dali::Application::Lower()
109 * @copydoc Dali::Application::Quit()
114 * @copydoc Dali::Application::AddIdle()
116 bool AddIdle( CallbackBase* callback );
119 * @copydoc Dali::Application::GetAdaptor();
121 Dali::Adaptor& GetAdaptor();
124 * @copydoc Dali::Application::GetWindow();
126 Dali::Window GetWindow();
129 * @copydoc Dali::DevelApplication::GetRegion();
131 std::string GetRegion();
134 * @copydoc Dali::DevelApplication::GetLanguage();
136 std::string GetLanguage();
139 * @copydoc Dali::Application::ReplaceWindow();
141 void ReplaceWindow( const PositionSize& positionSize, const std::string& name);
144 * @copydoc Dali::Application::GetResourcePath();
146 static std::string GetResourcePath();
149 * Retrieves the pre-initialized application.
151 * @return A pointer to the pre-initialized application
153 static ApplicationPtr GetPreInitializedApplication();
155 public: // Stereoscopy
158 * @copydoc Dali::Application::SetViewMode()
160 void SetViewMode( ViewMode viewMode );
163 * @copydoc Dali::Application::GetViewMode()
165 ViewMode GetViewMode() const;
168 * @copydoc Dali::Application::SetStereoBase()
170 void SetStereoBase( float stereoBase );
173 * @copydoc Dali::Application::GetStereoBase()
175 float GetStereoBase() const;
177 public: // Lifecycle functionality
180 * Called when OnInit is called or the framework is initialised.
185 * Called after OnInit is called or the framework is started.
190 * Called when OnTerminate is called or the framework is terminated.
195 * Called when OnPause is called or the framework is paused.
200 * Called when OnResume is called or the framework resumes from a paused state.
205 * Called when OnLanguageChanged is called or the framework informs the application that the language of the device has changed.
207 void DoLanguageChange();
209 public: // From Framework::Observer
212 * Called when the framework is initialised.
214 virtual void OnInit();
217 * Called when the framework is terminated.
219 virtual void OnTerminate();
222 * Called when the framework is paused.
224 virtual void OnPause();
227 * Called when the framework resumes from a paused state.
229 virtual void OnResume();
232 * Called when the framework received AppControlSignal.
233 * @param[in] The bundle data of AppControl event.
235 virtual void OnAppControl(void *data);
238 * Called when the framework informs the application that it should reset itself.
240 virtual void OnReset();
243 * Called when the framework informs the application that the language of the device has changed.
245 virtual void OnLanguageChanged( const std::string& language );
248 * Called when the framework informs the application that the region of the device has changed.
250 virtual void OnRegionChanged( const std::string& region );
253 * Called when the framework informs the application that the battery level of the device is low.
255 virtual void OnBatteryLow( Dali::DevelApplication::BatteryStatus::Type status );
258 * Called when the framework informs the application that the memory level of the device is low.
260 virtual void OnMemoryLow( Dali::DevelApplication::MemoryStatus::Type status );
265 * Signal handler when the adaptor's window resizes itself.
266 * @param[in] adaptor The adaptor
268 void OnResize(Dali::Adaptor& adaptor);
271 * Sets a user defined theme file.
272 * This should be called before initialization.
273 * @param[in] stylesheet The path to user defined theme file
275 void SetStyleSheet( const std::string& stylesheet );
280 * @copydoc Dali::Application::InitSignal()
282 Dali::Application::AppSignalType& InitSignal() { return mInitSignal; }
285 * @copydoc Dali::Application::TerminateSignal()
287 Dali::Application::AppSignalType& TerminateSignal() { return mTerminateSignal; }
290 * @copydoc Dali::Application::PauseSignal()
292 Dali::Application::AppSignalType& PauseSignal() { return mPauseSignal; }
295 * @copydoc Dali::Application::ResumeSignal()
297 Dali::Application::AppSignalType& ResumeSignal() { return mResumeSignal; }
300 * @copydoc Dali::Application::ResetSignal()
302 Dali::Application::AppSignalType& ResetSignal() { return mResetSignal; }
305 * @copydoc Dali::Application::AppControlSignal()
307 Dali::Application::AppControlSignalType& AppControlSignal() { return mAppControlSignal; }
310 * @copydoc Dali::Application::ResizeSignal()
312 Dali::Application::AppSignalType& ResizeSignal() { return mResizeSignal; }
315 * @copydoc Dali::Application::LanguageChangedSignal()
317 Dali::Application::AppSignalType& LanguageChangedSignal() { return mLanguageChangedSignal; }
320 * @copydoc Dali::Application::RegionChangedSignal()
322 Dali::Application::AppSignalType& RegionChangedSignal() { return mRegionChangedSignal; }
325 * @copydoc Dali::Application::BatteryLowSignal()
327 Dali::Application::AppSignalType& BatteryLowSignal() { return mBatteryLowSignal; }
330 * @copydoc Dali::Application::MemoryLowSignal()
332 Dali::Application::AppSignalType& MemoryLowSignal() { return mMemoryLowSignal; }
335 * @copydoc Dali::DevelApplication::LowBatterySignal()
337 Dali::DevelApplication::LowBatterySignalType& LowBatterySignal() { return mLowBatterySignal; }
340 * @copydoc Dali::DevelApplication:::LowMemorySignal()
342 Dali::DevelApplication::LowMemorySignalType& LowMemorySignal() { return mLowMemorySignal; }
347 * Private Constructor
348 * @param[in] argc A pointer to the number of arguments
349 * @param[in] argv A pointer to the argument list
350 * @param[in] stylesheet The path to user defined theme file
351 * @param[in] windowMode A member of Dali::Application::WINDOW_MODE
352 * @param[in] positionSize A position and a size of the window
353 * @param[in] applicationType A member of Dali::Framework::Type
355 Application( int* argc, char **argv[], const std::string& stylesheet,
356 WINDOW_MODE windowMode, const PositionSize& positionSize, Framework::Type applicationType );
361 virtual ~Application();
364 Application(const Application&);
365 Application& operator=(Application&);
373 * Creates the adaptor
375 void CreateAdaptor();
378 * Quits from the main loop
380 void QuitFromMainLoop();
384 AppSignalType mInitSignal;
385 AppSignalType mTerminateSignal;
386 AppSignalType mPauseSignal;
387 AppSignalType mResumeSignal;
388 AppSignalType mResetSignal;
389 AppSignalType mResizeSignal;
390 AppControlSignalType mAppControlSignal;
391 AppSignalType mLanguageChangedSignal;
392 AppSignalType mRegionChangedSignal;
393 AppSignalType mBatteryLowSignal;
394 AppSignalType mMemoryLowSignal;
395 Dali::DevelApplication::LowBatterySignalType mLowBatterySignal;
396 Dali::DevelApplication::LowMemorySignalType mLowMemorySignal;
398 EventLoop* mEventLoop;
399 Framework* mFramework;
401 Dali::Configuration::ContextLoss mContextLossConfiguration;
402 CommandLineOptions* mCommandLineOptions;
404 Dali::SingletonService mSingletonService;
405 Dali::Adaptor* mAdaptor;
406 Dali::Window mWindow;
407 Dali::Application::WINDOW_MODE mWindowMode;
409 std::string mStylesheet;
410 std::string mLanguage;
412 EnvironmentOptions mEnvironmentOptions;
413 PositionSize mWindowPositionSize;
414 Launchpad::State mLaunchpadState;
415 bool mUseRemoteSurface;
417 SlotDelegate< Application > mSlotDelegate;
419 static ApplicationPtr gPreInitializedApplication;
422 inline Application& GetImplementation(Dali::Application& application)
424 DALI_ASSERT_ALWAYS(application && "application handle is empty");
426 BaseObject& handle = application.GetBaseObject();
428 return static_cast<Internal::Adaptor::Application&>(handle);
431 inline const Application& GetImplementation(const Dali::Application& application)
433 DALI_ASSERT_ALWAYS(application && "Timre handle is empty");
435 const BaseObject& handle = application.GetBaseObject();
437 return static_cast<const Internal::Adaptor::Application&>(handle);
441 } // namespace Adaptor
443 } // namespace Internal
447 #endif // __DALI_INTERNAL_APPLICATION_H__