[Tizen][AT-SPI] Track application lifecycle
[platform/core/uifw/dali-adaptor.git] / dali / internal / adaptor / common / application-impl.cpp
index 1311e2a..d3e8bd3 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 // EXTERNAL INCLUDES
 #include <dali/devel-api/common/singleton-service.h>
 #include <dali/integration-api/debug.h>
+#include <dali/integration-api/trace.h>
 #include <dali/public-api/object/object-registry.h>
 
 // INTERNAL INCLUDES
-#include <dali/devel-api/adaptor-framework/accessibility-impl.h>
+#include <dali/devel-api/adaptor-framework/accessibility-bridge.h>
+#include <dali/devel-api/adaptor-framework/environment-variable.h>
 #include <dali/devel-api/adaptor-framework/style-monitor.h>
+#include <dali/devel-api/atspi-interfaces/accessible.h>
 #include <dali/devel-api/text-abstraction/font-client.h>
 #include <dali/internal/adaptor/common/adaptor-impl.h>
 #include <dali/internal/adaptor/common/framework.h>
 #include <dali/internal/adaptor/common/lifecycle-controller-impl.h>
 #include <dali/internal/system/common/command-line-options.h>
+#include <dali/internal/system/common/environment-variables.h>
 #include <dali/internal/window-system/common/render-surface-factory.h>
 #include <dali/internal/window-system/common/window-impl.h>
 #include <dali/internal/window-system/common/window-render-surface.h>
@@ -55,6 +59,8 @@ namespace Internal
 {
 namespace Adaptor
 {
+DALI_INIT_TRACE_FILTER(gTraceFilter, DALI_TRACE_APPLICATION, true);
+
 ApplicationPtr Application::gPreInitializedApplication(NULL);
 
 ApplicationPtr Application::New(
@@ -64,9 +70,10 @@ ApplicationPtr Application::New(
   Dali::Application::WINDOW_MODE windowMode,
   const PositionSize&            positionSize,
   Framework::Type                applicationType,
-  WindowType                     type)
+  WindowType                     type,
+  bool                           useUiThread)
 {
-  ApplicationPtr application(new Application(argc, argv, stylesheet, windowMode, positionSize, applicationType, type));
+  ApplicationPtr application(new Application(argc, argv, stylesheet, windowMode, positionSize, applicationType, type, useUiThread));
   return application;
 }
 
@@ -76,13 +83,13 @@ void Application::PreInitialize(int* argc, char** argv[])
   {
     Dali::TextAbstraction::FontClientPreInitialize();
 
-    gPreInitializedApplication = new Application(argc, argv, "", Dali::Application::OPAQUE, PositionSize(), Framework::NORMAL, WindowType::NORMAL);
+    gPreInitializedApplication = new Application(argc, argv, "", Dali::Application::OPAQUE, PositionSize(), Framework::NORMAL, WindowType::NORMAL, false);
     gPreInitializedApplication->CreateWindow(); // Only create window
     gPreInitializedApplication->mLaunchpadState = Launchpad::PRE_INITIALIZED;
   }
 }
 
-Application::Application(int* argc, char** argv[], const std::string& stylesheet, Dali::Application::WINDOW_MODE windowMode, const PositionSize& positionSize, Framework::Type applicationType, WindowType type)
+Application::Application(int* argc, char** argv[], const std::string& stylesheet, Dali::Application::WINDOW_MODE windowMode, const PositionSize& positionSize, Framework::Type applicationType, WindowType type, bool useUiThread)
 : mInitSignal(),
   mTerminateSignal(),
   mPauseSignal(),
@@ -104,6 +111,7 @@ Application::Application(int* argc, char** argv[], const std::string& stylesheet
   mWindowPositionSize(positionSize),
   mLaunchpadState(Launchpad::NONE),
   mDefaultWindowType(type),
+  mUseUiThread(useUiThread),
   mSlotDelegate(this)
 {
   // Get mName from environment options
@@ -114,8 +122,14 @@ Application::Application(int* argc, char** argv[], const std::string& stylesheet
     mMainWindowName = (*argv)[0];
   }
 
+  const char* uiThreadEnabled = Dali::EnvironmentVariable::GetEnvironmentVariable(DALI_ENV_ENABLE_UI_THREAD);
+  if(uiThreadEnabled && std::atoi(uiThreadEnabled) != 0)
+  {
+    mUseUiThread = true;
+  }
+
   mCommandLineOptions = new CommandLineOptions(argc, argv);
-  mFramework          = new Framework(*this, argc, argv, applicationType);
+  mFramework          = new Framework(*this, *this, argc, argv, applicationType, mUseUiThread);
   mUseRemoteSurface   = (applicationType == Framework::WATCH);
 }
 
@@ -142,6 +156,9 @@ void Application::StoreWindowPositionSize(PositionSize positionSize)
 
 void Application::ChangePreInitializedWindowSize()
 {
+  // The real screen size may be different from the value of the preinitialized state. Update it.
+  Dali::Internal::Adaptor::WindowSystem::UpdateScreenSize();
+
   int screenWidth, screenHeight;
   Dali::Internal::Adaptor::WindowSystem::GetScreenSize(screenWidth, screenHeight);
 
@@ -165,7 +182,7 @@ void Application::ChangePreInitializedWindowSize()
   }
   else if(screenWidth != mWindowPositionSize.width || screenHeight != mWindowPositionSize.height)
   {
-    //Some apps can receive screen size differently after launching by specifying size in manifest.
+    // Some apps can receive screen size differently after launching by specifying size in manifest.
     mWindowPositionSize.width  = screenWidth;
     mWindowPositionSize.height = screenHeight;
     mMainWindow.SetSize(Dali::Window::WindowSize(mWindowPositionSize.width, mWindowPositionSize.height));
@@ -238,7 +255,6 @@ void Application::Quit()
 
 void Application::QuitFromMainLoop()
 {
-  Accessibility::Bridge::GetCurrentBridge()->WindowHidden();
   Accessibility::Bridge::GetCurrentBridge()->Terminate();
 
   mAdaptor->Stop();
@@ -266,7 +282,9 @@ void Application::OnInit()
   }
 
   // Run the adaptor
+  DALI_TRACE_BEGIN(gTraceFilter, "DALI_APP_ADAPTOR_START");
   mAdaptor->Start();
+  DALI_TRACE_END(gTraceFilter, "DALI_APP_ADAPTOR_START");
   Accessibility::Accessible::SetObjectRegistry(mAdaptor->GetObjectRegistry());
 
   if(!mStylesheet.empty())
@@ -285,9 +303,15 @@ void Application::OnInit()
   LanguageChangedSignal().Connect(&GetImplementation(lifecycleController), &LifecycleController::OnLanguageChanged);
 
   Dali::Application application(this);
+
+  DALI_TRACE_BEGIN(gTraceFilter, "DALI_APP_EMIT_INIT_SIGNAL");
   mInitSignal.Emit(application);
+  DALI_TRACE_END(gTraceFilter, "DALI_APP_EMIT_INIT_SIGNAL");
 
   mAdaptor->NotifySceneCreated();
+
+  // Ensure the join of Font thread at this point
+  Dali::TextAbstraction::FontClientJoinFontThreads();
 }
 
 void Application::OnTerminate()
@@ -309,6 +333,8 @@ void Application::OnTerminate()
 
 void Application::OnPause()
 {
+  Accessibility::Bridge::GetCurrentBridge()->ApplicationPaused();
+
   // A DALi app should handle Pause/Resume events.
   // DALi just delivers the framework Pause event to the application, but not actually pause DALi core.
   // Pausing DALi core only occurs on the Window Hidden framework event
@@ -318,6 +344,8 @@ void Application::OnPause()
 
 void Application::OnResume()
 {
+  Accessibility::Bridge::GetCurrentBridge()->ApplicationResumed();
+
   // Emit the signal first so the application can queue any messages before we do an update/render
   // This ensures we do not just redraw the last frame before pausing if that's not required
   Dali::Application application(this);
@@ -372,6 +400,12 @@ void Application::OnMemoryLow(Dali::DeviceStatus::Memory::Status status)
   mLowMemorySignal.Emit(status);
 }
 
+void Application::OnDeviceOrientationChanged(Dali::DeviceStatus::Orientation::Status status)
+{
+  Dali::Application application(this);
+  mDeviceOrientationChangedSignal.Emit(status);
+}
+
 void Application::OnSurfaceCreated(Any newSurface)
 {
   void* newWindow = AnyCast<void*>(newSurface);
@@ -389,6 +423,54 @@ void Application::OnSurfaceDestroyed(Any surface)
 {
 }
 
+void Application::OnTaskInit()
+{
+  Dali::Application application(this);
+  mTaskInitSignal.Emit(application);
+}
+
+void Application::OnTaskTerminate()
+{
+  Dali::Application application(this);
+  mTaskTerminateSignal.Emit(application);
+}
+
+void Application::OnTaskAppControl(void* data)
+{
+  Dali::Application application(this);
+  mTaskAppControlSignal.Emit(application, data);
+}
+
+void Application::OnTaskLanguageChanged()
+{
+  Dali::Application application(this);
+  mTaskLanguageChangedSignal.Emit(application);
+}
+
+void Application::OnTaskRegionChanged()
+{
+  Dali::Application application(this);
+  mTaskRegionChangedSignal.Emit(application);
+}
+
+void Application::OnTaskBatteryLow(Dali::DeviceStatus::Battery::Status status)
+{
+  Dali::Application application(this);
+  mTaskLowBatterySignal.Emit(status);
+}
+
+void Application::OnTaskMemoryLow(Dali::DeviceStatus::Memory::Status status)
+{
+  Dali::Application application(this);
+  mTaskLowMemorySignal.Emit(status);
+}
+
+void Application::OnTaskDeviceOrientationChanged(Dali::DeviceStatus::Orientation::Status status)
+{
+  Dali::Application application(this);
+  mTaskDeviceOrientationChangedSignal.Emit(status);
+}
+
 bool Application::AddIdle(CallbackBase* callback, bool hasReturnValue)
 {
   return mAdaptor->AddIdle(callback, hasReturnValue);
@@ -454,6 +536,15 @@ void Application::SetDefaultWindowType(WindowType type)
   mMainWindow.SetType(type);
 }
 
+int32_t Application::GetRenderThreadId() const
+{
+  if(mAdaptor)
+  {
+    return Internal::Adaptor::Adaptor::GetImplementation(*mAdaptor).GetRenderThreadId();
+  }
+  return 0;
+}
+
 ApplicationPtr Application::GetPreInitializedApplication()
 {
   // Reset the handle to decrease the reference count
@@ -463,12 +554,6 @@ ApplicationPtr Application::GetPreInitializedApplication()
   return application;
 }
 
-Graphics::Controller& Application::GetController()
-{
-  auto& adaptor = Internal::Adaptor::Adaptor::GetImplementation(*mAdaptor);
-  return adaptor.GetGraphicsInterface().GetController();
-}
-
 } // namespace Adaptor
 
 } // namespace Internal