Support Widget Application
[platform/core/uifw/dali-adaptor.git] / adaptors / tizen / framework-tizen.cpp
index 4fcba81..9628bdd 100644 (file)
@@ -26,8 +26,9 @@
 #include <Ecore.h>
 
 #include <system_info.h>
+#include <system_settings.h>
 #include <bundle_internal.h>
-
+#include <widget_base.h>
 // CONDITIONAL INCLUDES
 #ifdef APPCORE_WATCH_AVAILABLE
 #include <appcore-watch/watch_app.h>
@@ -54,13 +55,36 @@ namespace Internal
 namespace Adaptor
 {
 
-#if defined(DEBUG_ENABLED)
 namespace
 {
+#if defined(DEBUG_ENABLED)
 Integration::Log::Filter* gDBusLogging = Integration::Log::Filter::New( Debug::NoLogging, false, "LOG_ADAPTOR_EVENTS_DBUS" );
-} // anonymous namespace
 #endif
 
+bool IsWidgetFeatureEnabled()
+{
+  static bool feature = false;
+  static bool retrieved = false;
+  int ret;
+
+  if(retrieved == true)
+  {
+    return feature;
+  }
+
+  ret = system_info_get_platform_bool("http://tizen.org/feature/shell.appwidget", &feature);
+  if(ret != SYSTEM_INFO_ERROR_NONE)
+  {
+    DALI_LOG_ERROR("failed to get system info");
+    return false;
+  }
+
+  retrieved = true;
+  return feature;
+}
+
+} // anonymous namespace
+
 namespace AppCore
 {
 
@@ -168,6 +192,13 @@ struct Framework::Impl
 #endif
     mApplicationType = type;
     mCallbackManager = CallbackManager::New();
+
+    char* region;
+    char* language;
+    system_settings_get_value_string( SYSTEM_SETTINGS_KEY_LOCALE_COUNTRY, &region );
+    system_settings_get_value_string( SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &language );
+    mRegion = std::string( region );
+    mLanguage = std::string( language );
   }
 
   ~Impl()
@@ -188,6 +219,10 @@ struct Framework::Impl
     {
       ret = AppNormalMain();
     }
+    else if(mApplicationType == WIDGET)
+    {
+      ret = AppWidgetMain();
+    }
     else
     {
       ret = AppWatchMain();
@@ -201,17 +236,42 @@ struct Framework::Impl
     {
       AppNormalExit();
     }
+    else if(mApplicationType == WIDGET)
+    {
+      AppWidgetExit();
+    }
     else
     {
       AppWatchExit();
     }
   }
 
+  void SetLanguage( const std::string& language )
+  {
+    mLanguage = language;
+  }
+
+  void SetRegion( const std::string& region )
+  {
+    mRegion = region;
+  }
+
+  std::string GetLanguage() const
+  {
+    return mLanguage;
+  }
+
+  std::string GetRegion() const
+  {
+    return mRegion;
+  }
 
   // Data
   Type mApplicationType;
   CallbackBase* mAbortCallBack;
   CallbackManager *mCallbackManager;
+  std::string mLanguage;
+  std::string mRegion;
 
   Framework* mFramework;
   AppCore::AppEventHandlerPtr handlers[5];
@@ -350,9 +410,18 @@ struct Framework::Impl
 
   static void AppLanguageChanged(AppCore::AppEventInfoPtr event, void *data)
   {
-    Observer *observer = &static_cast<Framework*>(data)->mObserver;
+    Framework* framework = static_cast<Framework*>(data);
+    Observer *observer = &framework->mObserver;
 
-    observer->OnLanguageChanged();
+    if( event && event->value )
+    {
+      framework->SetLanguage( std::string( static_cast<const char *>(event->value) ) );
+      observer->OnLanguageChanged();
+    }
+    else
+    {
+      DALI_LOG_ERROR( "NULL pointer in Language changed event\n" );
+    }
   }
 
   static void AppDeviceRotated(AppCore::AppEventInfoPtr event_info, void *data)
@@ -361,23 +430,73 @@ struct Framework::Impl
 
   static void AppRegionChanged(AppCore::AppEventInfoPtr event, void *data)
   {
-    Observer *observer = &static_cast<Framework*>(data)->mObserver;
+    Framework* framework = static_cast<Framework*>(data);
+    Observer *observer = &framework->mObserver;
 
-    observer->OnRegionChanged();
+    if( event && event->value )
+    {
+      framework->SetRegion( std::string( static_cast<const char *>(event->value) ) );
+      observer->OnRegionChanged();
+    }
+    else
+    {
+      DALI_LOG_ERROR( "NULL pointer in Region changed event\n" );
+    }
   }
 
   static void AppBatteryLow(AppCore::AppEventInfoPtr event, void *data)
   {
     Observer *observer = &static_cast<Framework*>(data)->mObserver;
+    int status = *static_cast<int *>(event->value);
+    Dali::DeviceStatus::Battery::Status result = Dali::DeviceStatus::Battery::NORMAL;
 
-    observer->OnBatteryLow();
+    // convert to dali battery status
+    switch( status )
+    {
+      case 1:
+      {
+        result = Dali::DeviceStatus::Battery::POWER_OFF;
+        break;
+      }
+      case 2:
+      {
+        result = Dali::DeviceStatus::Battery::CRITICALLY_LOW;
+        break;
+      }
+      default :
+        break;
+    }
+    observer->OnBatteryLow(result);
   }
 
   static void AppMemoryLow(AppCore::AppEventInfoPtr event, void *data)
   {
     Observer *observer = &static_cast<Framework*>(data)->mObserver;
+    int status = *static_cast<int *>(event->value);
+    Dali::DeviceStatus::Memory::Status result = Dali::DeviceStatus::Memory::NORMAL;
 
-    observer->OnMemoryLow();
+    // convert to dali memmory status
+    switch( status )
+    {
+      case 1:
+      {
+        result = Dali::DeviceStatus::Memory::NORMAL;
+        break;
+      }
+      case 2:
+      {
+        result = Dali::DeviceStatus::Memory::LOW;
+        break;
+      }
+      case 4:
+      {
+        result = Dali::DeviceStatus::Memory::CRITICALLY_LOW;
+        break;
+      }
+      default :
+        break;
+    }
+    observer->OnMemoryLow(result);
   }
 
 
@@ -423,61 +542,84 @@ struct Framework::Impl
     appcore_ui_base_exit();
   }
 
-#ifdef APPCORE_WATCH_AVAILABLE
-  static bool WatchAppCreate(int width, int height, void *data)
+  void AppWidgetExit()
   {
-    return static_cast<Framework*>(data)->Create();
+    widget_base_exit();
   }
 
-  static void WatchAppTimeTick(watch_time_h time, void *data)
+  static int WidgetAppCreate( void *data )
   {
-    Observer *observer = &static_cast<Framework*>(data)->mObserver;
-    WatchTime curTime(time);
-
-    observer->OnTimeTick(curTime);
+    widget_base_on_create();
+    return static_cast<int>( static_cast<Framework*>(data)->Create() );
   }
 
-  static void WatchAppAmbientTick(watch_time_h time, void *data)
+  static int WidgetAppTerminate( void *data )
   {
     Observer *observer = &static_cast<Framework*>(data)->mObserver;
-    WatchTime curTime(time);
+    observer->OnTerminate();
 
-    observer->OnAmbientTick(curTime);
+    widget_base_on_terminate();
+    return 0;
   }
 
-  static void WatchAppAmbientChanged(bool ambient, void *data)
+  int AppWidgetMain()
   {
-    Observer *observer = &static_cast<Framework*>(data)->mObserver;
+    if( !IsWidgetFeatureEnabled() )
+    {
+      DALI_LOG_ERROR("widget feature is not supported");
+      return 0;
+    }
 
-    observer->OnAmbientChanged(ambient);
+    AppCore::AppAddEventHandler(&handlers[AppCore::LOW_BATTERY], AppCore::LOW_BATTERY, AppBatteryLow, mFramework);
+    AppCore::AppAddEventHandler(&handlers[AppCore::LOW_MEMORY], AppCore::LOW_MEMORY, AppMemoryLow, mFramework);
+    AppCore::AppAddEventHandler(&handlers[AppCore::DEVICE_ORIENTATION_CHANGED], AppCore::DEVICE_ORIENTATION_CHANGED, AppDeviceRotated, mFramework);
+    AppCore::AppAddEventHandler(&handlers[AppCore::LANGUAGE_CHANGED], AppCore::LANGUAGE_CHANGED, AppLanguageChanged, mFramework);
+    AppCore::AppAddEventHandler(&handlers[AppCore::REGION_FORMAT_CHANGED], AppCore::REGION_FORMAT_CHANGED, AppRegionChanged, mFramework);
+
+    widget_base_ops ops = widget_base_get_default_ops();
+
+    /* override methods */
+    ops.create = WidgetAppCreate;
+    ops.terminate = WidgetAppTerminate;
+    ops.init = AppInit;
+    ops.finish = AppFinish;
+    ops.run = AppRun;
+    ops.exit = AppExit;
+
+    int result = widget_base_init(ops, *mFramework->mArgc, *mFramework->mArgv, mFramework);
+
+    widget_base_fini();
+
+    return result;
   }
 
-  static void WatchAppLanguageChanged(app_event_info_h event, void *data)
+#ifdef APPCORE_WATCH_AVAILABLE
+  static bool WatchAppCreate(int width, int height, void *data)
   {
-    Observer *observer = &static_cast<Framework*>(data)->mObserver;
-
-    observer->OnLanguageChanged();
+    return static_cast<Framework*>(data)->Create();
   }
 
-  static void WatchAppRegionChanged(app_event_info_h event, void *data)
+  static void WatchAppTimeTick(watch_time_h time, void *data)
   {
     Observer *observer = &static_cast<Framework*>(data)->mObserver;
+    WatchTime curTime(time);
 
-    observer->OnRegionChanged();
+    observer->OnTimeTick(curTime);
   }
 
-  static void WatchAppBatteryLow(app_event_info_h event, void *data)
+  static void WatchAppAmbientTick(watch_time_h time, void *data)
   {
     Observer *observer = &static_cast<Framework*>(data)->mObserver;
+    WatchTime curTime(time);
 
-    observer->OnBatteryLow();
+    observer->OnAmbientTick(curTime);
   }
 
-  static void WatchAppMemoryLow(app_event_info_h event, void *data)
+  static void WatchAppAmbientChanged(bool ambient, void *data)
   {
     Observer *observer = &static_cast<Framework*>(data)->mObserver;
 
-    observer->OnMemoryLow();
+    observer->OnAmbientChanged(ambient);
   }
 
   static void WatchAppControl(app_control_h app_control, void *data)
@@ -530,10 +672,10 @@ struct Framework::Impl
     mWatchCallback.ambient_tick = WatchAppAmbientTick;
     mWatchCallback.ambient_changed = WatchAppAmbientChanged;
 
-    watch_app_add_event_handler(&watchHandlers[APP_EVENT_LOW_BATTERY], APP_EVENT_LOW_BATTERY, WatchAppBatteryLow, mFramework);
-    watch_app_add_event_handler(&watchHandlers[APP_EVENT_LOW_MEMORY], APP_EVENT_LOW_MEMORY, WatchAppMemoryLow, mFramework);
-    watch_app_add_event_handler(&watchHandlers[APP_EVENT_LANGUAGE_CHANGED], APP_EVENT_LANGUAGE_CHANGED, WatchAppLanguageChanged, mFramework);
-    watch_app_add_event_handler(&watchHandlers[APP_EVENT_REGION_FORMAT_CHANGED], APP_EVENT_REGION_FORMAT_CHANGED, WatchAppRegionChanged, mFramework);
+    AppCore::AppAddEventHandler(&handlers[AppCore::LOW_BATTERY], AppCore::LOW_BATTERY, AppBatteryLow, mFramework);
+    AppCore::AppAddEventHandler(&handlers[AppCore::LOW_MEMORY], AppCore::LOW_MEMORY, AppMemoryLow, mFramework);
+    AppCore::AppAddEventHandler(&handlers[AppCore::LANGUAGE_CHANGED], AppCore::LANGUAGE_CHANGED, AppLanguageChanged, mFramework);
+    AppCore::AppAddEventHandler(&handlers[AppCore::REGION_FORMAT_CHANGED], AppCore::REGION_FORMAT_CHANGED, AppRegionChanged, mFramework);
 
     ret = watch_app_main(*mFramework->mArgc, *mFramework->mArgv, &mWatchCallback, mFramework);
 #endif
@@ -547,7 +689,6 @@ struct Framework::Impl
 #endif
   }
 
-
 private:
   // Undefined
   Impl( const Impl& impl );
@@ -687,6 +828,26 @@ void Framework::AbortCallback( )
   }
 }
 
+void Framework::SetLanguage( const std::string& language )
+{
+  mImpl->SetLanguage( language );
+}
+
+void Framework::SetRegion( const std::string& region )
+{
+  mImpl->SetRegion( region );
+}
+
+std::string Framework::GetLanguage() const
+{
+  return mImpl->GetLanguage();
+}
+
+std::string Framework::GetRegion() const
+{
+  return mImpl->GetRegion();
+}
+
 } // namespace Adaptor
 
 } // namespace Internal