Change to use new AppFW APi for TV profile
[platform/core/uifw/dali-adaptor.git] / adaptors / common / application-impl.cpp
old mode 100644 (file)
new mode 100755 (executable)
index 79a666a..fa34d9c
 
 // EXTERNAL INCLUDES
 #include <dali/integration-api/debug.h>
-#include <style-monitor.h>
 
 // INTERNAL INCLUDES
+#include <style-monitor.h>
 #include <command-line-options.h>
 #include <common/adaptor-impl.h>
+#include <singleton-service-impl.h>
+#include <lifecycle-controller-impl.h>
 
 namespace Dali
 {
@@ -52,8 +54,6 @@ const unsigned int DEFAULT_WINDOW_WIDTH   = 480;
 const unsigned int DEFAULT_WINDOW_HEIGHT  = 800;
 const float        DEFAULT_HORIZONTAL_DPI = 220;
 const float        DEFAULT_VERTICAL_DPI   = 217;
-
-boost::thread_specific_ptr<Application> gThreadLocalApplication;
 }
 
 ApplicationPtr Application::New(
@@ -67,28 +67,30 @@ ApplicationPtr Application::New(
   return application;
 }
 
-Application::Application(
-  int* argc,
-  char** argv[],
-  const std::string& name,
-  const DeviceLayout& baseLayout,
-  Dali::Application::WINDOW_MODE windowMode)
-: mFramework(NULL),
-  mCommandLineOptions(NULL),
-  mAdaptor(NULL),
+Application::Application( int* argc, char** argv[], const std::string& name, const DeviceLayout& baseLayout, Dali::Application::WINDOW_MODE windowMode)
+: mInitSignal(),
+  mTerminateSignal(),
+  mPauseSignal(),
+  mResumeSignal(),
+  mResetSignal(),
+  mResizeSignal(),
+  mAppControlSignal(),
+  mLanguageChangedSignal(),
+  mRegionChangedSignal(),
+  mBatteryLowSignal(),
+  mMemoryLowSignal(),
+  mEventLoop( NULL ),
+  mFramework( NULL ),
+  mCommandLineOptions( NULL ),
+  mSingletonService( SingletonService::New() ),
+  mAdaptor( NULL ),
   mWindow(),
   mWindowMode( windowMode ),
-  mName(name),
-  mInitialized(false),
-  mBaseLayout(baseLayout),
+  mName( name ),
+  mInitialized( false ),
+  mBaseLayout( baseLayout ),
   mSlotDelegate( this )
 {
-  // make sure we don't create the local thread application instance twice
-  DALI_ASSERT_ALWAYS(gThreadLocalApplication.get() == NULL && "Cannot create more than one Application per thread" );
-
-  // reset is used to store a new value associated with this thread
-  gThreadLocalApplication.reset(this);
-
   mCommandLineOptions = new CommandLineOptions(argc, argv);
 
   mFramework = new Framework(*this, argc, argv, name);
@@ -96,11 +98,12 @@ Application::Application(
 
 Application::~Application()
 {
+  mSingletonService.UnregisterAll();
+
   delete mFramework;
   delete mCommandLineOptions;
   delete mAdaptor;
   mWindow.Reset();
-  gThreadLocalApplication.release();
 }
 
 void Application::CreateWindow()
@@ -123,7 +126,7 @@ void Application::CreateAdaptor()
 {
   DALI_ASSERT_ALWAYS( mWindow && "Window required to create adaptor" );
 
-  mAdaptor = &Dali::Adaptor::New( mWindow, mBaseLayout);
+  mAdaptor = &Dali::Adaptor::New( mWindow, mBaseLayout, mContextLossConfiguration );
 
   // Allow DPI to be overridden from command line.
   unsigned int hDPI=DEFAULT_HORIZONTAL_DPI;
@@ -139,8 +142,10 @@ void Application::CreateAdaptor()
   mAdaptor->ResizedSignal().Connect( mSlotDelegate, &Application::OnResize );
 }
 
-void Application::MainLoop()
+void Application::MainLoop(Dali::Configuration::ContextLoss configuration)
 {
+  mContextLossConfiguration = configuration;
+
   // Run the application
   mFramework->Run();
 }
@@ -154,7 +159,7 @@ void Application::Lower()
 void Application::Quit()
 {
   // Actually quit the application.
-  AddIdle(boost::bind(&Application::QuitFromMainLoop, this));
+  AddIdle( MakeCallback( this, &Application::QuitFromMainLoop ) );
 }
 
 void Application::QuitFromMainLoop()
@@ -162,7 +167,7 @@ void Application::QuitFromMainLoop()
   mAdaptor->Stop();
 
   Dali::Application application(this);
-  mTerminateSignalV2.Emit( application );
+  mTerminateSignal.Emit( application );
 
   mFramework->Quit();
   // This will trigger OnTerminate(), below, after the main loop has completed.
@@ -171,7 +176,7 @@ void Application::QuitFromMainLoop()
 
 void Application::OnInit()
 {
-  mFramework->AddAbortCallback(boost::bind(&Application::QuitFromMainLoop, this));
+  mFramework->AddAbortCallback( MakeCallback( this, &Application::QuitFromMainLoop ) );
 
   CreateWindow();
   CreateAdaptor();
@@ -182,7 +187,7 @@ void Application::OnInit()
   // Check if user requires no vsyncing and set on X11 Adaptor
   if (mCommandLineOptions->noVSyncOnRender)
   {
-    Internal::Adaptor::Adaptor::GetImplementation( *mAdaptor ).DisableVSync();
+    mAdaptor->SetUseHardwareVSync(false);
   }
 
   Internal::Adaptor::Adaptor::GetImplementation( *mAdaptor ).SetStereoBase( mCommandLineOptions->stereoBase );
@@ -198,11 +203,21 @@ void Application::OnInit()
 
   mInitialized = true;
 
-  // in default, auto hide indicator mode
-  mWindow.ShowIndicator(Dali::Window::AUTO);
+  // Wire up the LifecycleController
+  Dali::LifecycleController lifecycleController = Dali::LifecycleController::Get();
+
+  InitSignal().Connect( &GetImplementation( lifecycleController ), &LifecycleController::OnInit );
+  TerminateSignal().Connect( &GetImplementation( lifecycleController ), &LifecycleController::OnTerminate );
+  PauseSignal().Connect( &GetImplementation( lifecycleController ), &LifecycleController::OnPause );
+  ResumeSignal().Connect( &GetImplementation( lifecycleController ), &LifecycleController::OnResume );
+  ResetSignal().Connect( &GetImplementation( lifecycleController ), &LifecycleController::OnReset );
+  ResizeSignal().Connect( &GetImplementation( lifecycleController ), &LifecycleController::OnResize );
+  LanguageChangedSignal().Connect( &GetImplementation( lifecycleController ), &LifecycleController::OnLanguageChanged );
 
   Dali::Application application(this);
-  mInitSignalV2.Emit( application );
+  mInitSignal.Emit( application );
+
+  Internal::Adaptor::Adaptor::GetImplementation( *mAdaptor ).GetCore().SceneCreated();
 }
 
 void Application::OnTerminate()
@@ -218,14 +233,14 @@ void Application::OnPause()
 {
   mAdaptor->Pause();
   Dali::Application application(this);
-  mPauseSignalV2.Emit( application );
+  mPauseSignal.Emit( application );
 }
 
 void Application::OnResume()
 {
   mAdaptor->Resume();
   Dali::Application application(this);
-  mResumeSignalV2.Emit( application );
+  mResumeSignal.Emit( application );
 }
 
 void Application::OnReset()
@@ -235,44 +250,59 @@ void Application::OnReset()
    * because Application class already handled initialization in OnInit(), OnReset do nothing.
    */
   Dali::Application application(this);
-  mResetSignalV2.Emit( application );
+  mResetSignal.Emit( application );
 
   mWindow.Raise();
 }
 
+void Application::OnAppControl(void *data)
+{
+  Dali::Application application(this);
+  mAppControlSignal.Emit( application , data );
+}
+
 void Application::OnLanguageChanged()
 {
   mAdaptor->NotifyLanguageChanged();
 }
 
-void Application::OnResize(Dali::Adaptor& adaptor)
+void Application::OnRegionChanged()
 {
   Dali::Application application(this);
-  mResizeSignalV2.Emit( application );
+  mRegionChangedSignal.Emit( application );
 }
 
-bool Application::AddIdle(boost::function<void(void)> callBack)
+void Application::OnBatteryLow()
 {
-  return mAdaptor->AddIdle(callBack);
+  Dali::Application application(this);
+  mBatteryLowSignal.Emit( application );
 }
 
-Dali::Adaptor& Application::GetAdaptor()
+void Application::OnMemoryLow()
 {
-  return *mAdaptor;
+  Dali::Application application(this);
+  mMemoryLowSignal.Emit( application );
 }
 
-Dali::Window Application::GetWindow()
+void Application::OnResize(Dali::Adaptor& adaptor)
 {
-  return mWindow;
+  Dali::Application application(this);
+  mResizeSignal.Emit( application );
 }
 
-Dali::Application Application::Get()
+bool Application::AddIdle( CallbackBase* callback )
 {
-  DALI_ASSERT_ALWAYS( gThreadLocalApplication.get() != NULL && "Application not instantiated" );
+  return mAdaptor->AddIdle( callback );
+}
 
-  Dali::Application application(gThreadLocalApplication.get());
+Dali::Adaptor& Application::GetAdaptor()
+{
+  return *mAdaptor;
+}
 
-  return application;
+Dali::Window Application::GetWindow()
+{
+  return mWindow;
 }
 
 const std::string& Application::GetTheme()
@@ -307,6 +337,18 @@ float Application::GetStereoBase() const
   return Internal::Adaptor::Adaptor::GetImplementation( *mAdaptor ).GetStereoBase();
 }
 
+
+void Application::ReplaceWindow(PositionSize windowPosition, const std::string& name)
+{
+  Dali::Window newWindow = Dali::Window::New( windowPosition, name, mWindowMode == Dali::Application::TRANSPARENT );
+  Window& windowImpl = GetImplementation(newWindow);
+  windowImpl.SetAdaptor(*mAdaptor);
+  newWindow.ShowIndicator(Dali::Window::INVISIBLE);
+  Dali::RenderSurface* renderSurface = windowImpl.GetSurface();
+  Internal::Adaptor::Adaptor::GetImplementation( *mAdaptor ).ReplaceSurface(*renderSurface);
+  mWindow = newWindow;
+}
+
 } // namespace Adaptor
 
 } // namespace Internal