Added layout direction change by system language 39/146439/10
authortaeyoon0.lee <taeyoon0.lee@samsung.com>
Mon, 28 Aug 2017 14:39:53 +0000 (23:39 +0900)
committertaeyoon0.lee <taeyoon0.lee@samsung.com>
Tue, 5 Sep 2017 07:29:24 +0000 (16:29 +0900)
Change-Id: Ia48f37a873655013d7fa23ba65a98a5ca1af58ef

adaptors/common/adaptor-impl.cpp
adaptors/common/adaptor-impl.h
adaptors/common/locale-utils.cpp
adaptors/common/locale-utils.h
adaptors/ecore/common/ecore-virtual-keyboard.cpp
adaptors/ecore/wayland/imf-manager-impl-ecore-wl.cpp
adaptors/tizen/adaptor-impl-tizen.cpp
adaptors/ubuntu/adaptor-impl-ubuntu.cpp
adaptors/x11/imf-manager-impl-x.cpp
packaging/dali-adaptor.spec

index 08fe0e0..6201c5c 100644 (file)
@@ -20,6 +20,9 @@
 
 // EXTERNAL INCLUDES
 #include <dali/public-api/common/dali-common.h>
+#include <dali/public-api/common/stage.h>
+#include <dali/public-api/actors/layer.h>
+#include <dali/devel-api/actors/actor-devel.h>
 #include <dali/integration-api/debug.h>
 #include <dali/integration-api/core.h>
 #include <dali/integration-api/context-notifier.h>
@@ -55,6 +58,8 @@
 #include <tizen-logging.h>
 #include <image-loading.h>
 
+#include <locale-utils.h>
+
 using Dali::TextAbstraction::FontClient;
 
 namespace Dali
@@ -190,6 +195,8 @@ void Adaptor::Initialize( Dali::Configuration::ContextLoss configuration )
   {
     Dali::SetMaxTextureSize( mEnvironmentOptions->GetMaxTextureSize() );
   }
+
+  SetupSystemInformation();
 }
 
 Adaptor::~Adaptor()
@@ -824,6 +831,14 @@ float Adaptor::GetStereoBase() const
   return mCore->GetStereoBase();
 }
 
+void Adaptor::SetRootLayoutDirection( std::string locale )
+{
+  Dali::Stage stage = Dali::Stage::GetCurrent();
+
+  stage.GetRootLayer().SetProperty( DevelActor::Property::LAYOUT_DIRECTION,
+                                    static_cast< DevelActor::LayoutDirection::Type >( Internal::Adaptor::Locale::GetDirection( std::string( locale ) ) ) );
+}
+
 } // namespace Adaptor
 
 } // namespace Internal
index f48f29e..5920b85 100644 (file)
@@ -345,6 +345,12 @@ public:
    */
   void SurfaceResizeComplete( Dali::Adaptor::SurfaceSize surfaceSize );
 
+  /**
+   * Sets layout direction of root by system language
+   * @param[in] locale System locale
+   */
+  void SetRootLayoutDirection( std::string locale );
+
 public:  //AdaptorInternalServices
 
   /**
@@ -516,6 +522,11 @@ private:
    */
   void GetDataStoragePath(std::string& path);
 
+  /**
+   * Sets up system information if needs
+   */
+  void SetupSystemInformation();
+
 private:
 
   /**
index d14856b..a036736 100644 (file)
@@ -33,128 +33,125 @@ namespace Locale
 namespace
 {
 
-struct LocaleDirection
+struct LocaleDirectionInfo
 {
   const char * locale;
   const char * name;
-  Dali::ImfManager::TextDirection direction;
+  Locale::Direction direction;
 };
 
-const LocaleDirection LOCALE_DIRECTION_LOOKUP_TABLE[] =
+const LocaleDirectionInfo LOCALE_DIRECTION_LOOKUP_TABLE[] =
 {
-  { "af", "Afrikaans",          Dali::ImfManager::LeftToRight },
-  { "am", "Amharic",            Dali::ImfManager::LeftToRight },
-  { "ar", "Arabic",             Dali::ImfManager::RightToLeft },
-  { "as", "Assamese",           Dali::ImfManager::LeftToRight },
-  { "az", "Azeri",              Dali::ImfManager::LeftToRight },
-  { "be", "Belarusian",         Dali::ImfManager::LeftToRight },
-  { "bg", "Bulgarian",          Dali::ImfManager::LeftToRight },
-  { "bn", "Bengali",            Dali::ImfManager::LeftToRight },
-  { "bo", "Tibetan",            Dali::ImfManager::LeftToRight },
-  { "bs", "Bosnian",            Dali::ImfManager::LeftToRight },
-  { "ca", "Catalan",            Dali::ImfManager::LeftToRight },
-  { "cs", "Czech",              Dali::ImfManager::LeftToRight },
-  { "cy", "Welsh",              Dali::ImfManager::LeftToRight },
-  { "da", "Danish",             Dali::ImfManager::LeftToRight },
-  { "de", "German",             Dali::ImfManager::LeftToRight },
-  { "dv", "Divehi",             Dali::ImfManager::RightToLeft },
-  { "el", "Greek",              Dali::ImfManager::LeftToRight },
-  { "en", "English",            Dali::ImfManager::LeftToRight },
-  { "es", "Spanish",            Dali::ImfManager::LeftToRight },
-  { "et", "Estonian",           Dali::ImfManager::LeftToRight },
-  { "eu", "Basque",             Dali::ImfManager::LeftToRight },
-  { "fa", "Farsi",              Dali::ImfManager::RightToLeft },
-  { "fi", "Finnish",            Dali::ImfManager::LeftToRight },
-  { "fo", "Faroese",            Dali::ImfManager::LeftToRight },
-  { "fr", "French",             Dali::ImfManager::LeftToRight },
-  { "gd", "Gaelic",             Dali::ImfManager::LeftToRight },
-  { "gl", "Galician",           Dali::ImfManager::LeftToRight },
-  { "gn", "Guarani",            Dali::ImfManager::LeftToRight },
-  { "gu", "Gujarati",           Dali::ImfManager::LeftToRight },
-  { "he", "Hebrew",             Dali::ImfManager::RightToLeft },
-  { "hi", "Hindi",              Dali::ImfManager::LeftToRight },
-  { "hr", "Croatian",           Dali::ImfManager::LeftToRight },
-  { "hu", "Hungarian",          Dali::ImfManager::LeftToRight },
-  { "hy", "Armenian",           Dali::ImfManager::LeftToRight },
-  { "id", "Indonesian",         Dali::ImfManager::LeftToRight },
-  { "is", "Icelandic",          Dali::ImfManager::LeftToRight },
-  { "it", "Italian",            Dali::ImfManager::LeftToRight },
-  { "ja", "Japanese",           Dali::ImfManager::LeftToRight },
-  { "ka", "Georgian",           Dali::ImfManager::LeftToRight },
-  { "kk", "Kazakh",             Dali::ImfManager::RightToLeft },
-  { "km", "Khmer",              Dali::ImfManager::LeftToRight },
-  { "kn", "Kannada",            Dali::ImfManager::LeftToRight },
-  { "ko", "Korean",             Dali::ImfManager::LeftToRight },
-  { "ks", "Kashmiri",           Dali::ImfManager::RightToLeft },
-  { "la", "Latin",              Dali::ImfManager::LeftToRight },
-  { "lo", "Lao",                Dali::ImfManager::LeftToRight },
-  { "lt", "Lithuanian",         Dali::ImfManager::LeftToRight },
-  { "lv", "Latvian",            Dali::ImfManager::LeftToRight },
-  { "mi", "Maori",              Dali::ImfManager::LeftToRight },
-  { "mk", "FYRO Macedonia",     Dali::ImfManager::LeftToRight },
-  { "ml", "Malayalam",          Dali::ImfManager::LeftToRight },
-  { "mn", "Mongolian",          Dali::ImfManager::LeftToRight },
-  { "mr", "Marathi",            Dali::ImfManager::LeftToRight },
-  { "ms", "Malay",              Dali::ImfManager::LeftToRight },
-  { "mt", "Maltese",            Dali::ImfManager::LeftToRight },
-  { "my", "Burmese",            Dali::ImfManager::LeftToRight },
-  { "nb", "Norwegian: Bokml",   Dali::ImfManager::LeftToRight },
-  { "ne", "Nepali",             Dali::ImfManager::LeftToRight },
-  { "nl", "Dutch",              Dali::ImfManager::LeftToRight },
-  { "nn", "Norwegian: Nynorsk", Dali::ImfManager::LeftToRight },
-  { "or", "Oriya",              Dali::ImfManager::LeftToRight },
-  { "pa", "Punjabi",            Dali::ImfManager::LeftToRight },
-  { "pl", "Polish",             Dali::ImfManager::LeftToRight },
-  { "pt", "Portuguese",         Dali::ImfManager::LeftToRight },
-  { "rm", "Raeto-Romance",      Dali::ImfManager::LeftToRight },
-  { "ro", "Romanian",           Dali::ImfManager::LeftToRight },
-  { "ru", "Russian",            Dali::ImfManager::LeftToRight },
-  { "sa", "Sanskrit",           Dali::ImfManager::LeftToRight },
-  { "sb", "Sorbian",            Dali::ImfManager::LeftToRight },
-  { "sd", "Sindhi",             Dali::ImfManager::LeftToRight },
-  { "si", "Sinhala",            Dali::ImfManager::LeftToRight },
-  { "sk", "Slovak",             Dali::ImfManager::LeftToRight },
-  { "sl", "Slovenian",          Dali::ImfManager::LeftToRight },
-  { "so", "Somali",             Dali::ImfManager::LeftToRight },
-  { "sq", "Albanian",           Dali::ImfManager::LeftToRight },
-  { "sr", "Serbian",            Dali::ImfManager::LeftToRight },
-  { "sv", "Swedish",            Dali::ImfManager::LeftToRight },
-  { "sw", "Swahili",            Dali::ImfManager::LeftToRight },
-  { "ta", "Tamil",              Dali::ImfManager::LeftToRight },
-  { "te", "Telugu",             Dali::ImfManager::LeftToRight },
-  { "tg", "Tajik",              Dali::ImfManager::RightToLeft },
-  { "th", "Thai",               Dali::ImfManager::LeftToRight },
-  { "tk", "Turkmen",            Dali::ImfManager::LeftToRight },
-  { "tn", "Setsuana",           Dali::ImfManager::LeftToRight },
-  { "tr", "Turkish",            Dali::ImfManager::LeftToRight },
-  { "ts", "Tsonga",             Dali::ImfManager::LeftToRight },
-  { "tt", "Tatar",              Dali::ImfManager::LeftToRight },
-  { "uk", "Ukrainian",          Dali::ImfManager::LeftToRight },
-  { "ur", "Urdu",               Dali::ImfManager::RightToLeft },
-  { "uz", "Uzbek",              Dali::ImfManager::LeftToRight },
-  { "vi", "Vietnamese",         Dali::ImfManager::LeftToRight },
-  { "xh", "Xhosa",              Dali::ImfManager::LeftToRight },
-  { "yi", "Yiddish",            Dali::ImfManager::RightToLeft },
-  { "zh", "Chinese",            Dali::ImfManager::LeftToRight },
-  { "zu", "Zulu",               Dali::ImfManager::LeftToRight },
-
-  { NULL, NULL, Dali::ImfManager::LeftToRight }
+  { "af", "Afrikaans",          Locale::LeftToRight },
+  { "am", "Amharic",            Locale::LeftToRight },
+  { "ar", "Arabic",             Locale::RightToLeft },
+  { "as", "Assamese",           Locale::LeftToRight },
+  { "az", "Azerbaijani",        Locale::RightToLeft },
+  { "be", "Belarusian",         Locale::LeftToRight },
+  { "bg", "Bulgarian",          Locale::LeftToRight },
+  { "bn", "Bengali",            Locale::LeftToRight },
+  { "bo", "Tibetan",            Locale::LeftToRight },
+  { "bs", "Bosnian",            Locale::LeftToRight },
+  { "ca", "Catalan",            Locale::LeftToRight },
+  { "cs", "Czech",              Locale::LeftToRight },
+  { "cy", "Welsh",              Locale::LeftToRight },
+  { "da", "Danish",             Locale::LeftToRight },
+  { "de", "German",             Locale::LeftToRight },
+  { "dv", "Divehi",             Locale::RightToLeft },
+  { "el", "Greek",              Locale::LeftToRight },
+  { "en", "English",            Locale::LeftToRight },
+  { "es", "Spanish",            Locale::LeftToRight },
+  { "et", "Estonian",           Locale::LeftToRight },
+  { "eu", "Basque",             Locale::LeftToRight },
+  { "fa", "Farsi",              Locale::RightToLeft },
+  { "fi", "Finnish",            Locale::LeftToRight },
+  { "fo", "Faroese",            Locale::LeftToRight },
+  { "fr", "French",             Locale::LeftToRight },
+  { "gd", "Gaelic",             Locale::LeftToRight },
+  { "gl", "Galician",           Locale::LeftToRight },
+  { "gn", "Guarani",            Locale::LeftToRight },
+  { "gu", "Gujarati",           Locale::LeftToRight },
+  { "he", "Hebrew",             Locale::RightToLeft },
+  { "hi", "Hindi",              Locale::LeftToRight },
+  { "hr", "Croatian",           Locale::LeftToRight },
+  { "hu", "Hungarian",          Locale::LeftToRight },
+  { "hy", "Armenian",           Locale::LeftToRight },
+  { "id", "Indonesian",         Locale::LeftToRight },
+  { "is", "Icelandic",          Locale::LeftToRight },
+  { "it", "Italian",            Locale::LeftToRight },
+  { "ja", "Japanese",           Locale::LeftToRight },
+  { "ka", "Georgian",           Locale::LeftToRight },
+  { "kk", "Kazakh",             Locale::RightToLeft },
+  { "km", "Khmer",              Locale::LeftToRight },
+  { "kn", "Kannada",            Locale::LeftToRight },
+  { "ko", "Korean",             Locale::LeftToRight },
+  { "ks", "Kashmiri",           Locale::RightToLeft },
+  { "la", "Latin",              Locale::LeftToRight },
+  { "lo", "Lao",                Locale::LeftToRight },
+  { "lt", "Lithuanian",         Locale::LeftToRight },
+  { "lv", "Latvian",            Locale::LeftToRight },
+  { "mi", "Maori",              Locale::LeftToRight },
+  { "mk", "FYRO Macedonia",     Locale::LeftToRight },
+  { "ml", "Malayalam",          Locale::LeftToRight },
+  { "mn", "Mongolian",          Locale::LeftToRight },
+  { "mr", "Marathi",            Locale::LeftToRight },
+  { "ms", "Malay",              Locale::LeftToRight },
+  { "mt", "Maltese",            Locale::LeftToRight },
+  { "my", "Burmese",            Locale::LeftToRight },
+  { "nb", "Norwegian: Bokml",   Locale::LeftToRight },
+  { "ne", "Nepali",             Locale::LeftToRight },
+  { "nl", "Dutch",              Locale::LeftToRight },
+  { "nn", "Norwegian: Nynorsk", Locale::LeftToRight },
+  { "or", "Oriya",              Locale::LeftToRight },
+  { "pa", "Punjabi",            Locale::LeftToRight },
+  { "pl", "Polish",             Locale::LeftToRight },
+  { "pt", "Portuguese",         Locale::LeftToRight },
+  { "rm", "Raeto-Romance",      Locale::LeftToRight },
+  { "ro", "Romanian",           Locale::LeftToRight },
+  { "ru", "Russian",            Locale::LeftToRight },
+  { "sa", "Sanskrit",           Locale::LeftToRight },
+  { "sb", "Sorbian",            Locale::LeftToRight },
+  { "sd", "Sindhi",             Locale::LeftToRight },
+  { "si", "Sinhala",            Locale::LeftToRight },
+  { "sk", "Slovak",             Locale::LeftToRight },
+  { "sl", "Slovenian",          Locale::LeftToRight },
+  { "so", "Somali",             Locale::LeftToRight },
+  { "sq", "Albanian",           Locale::LeftToRight },
+  { "sr", "Serbian",            Locale::LeftToRight },
+  { "sv", "Swedish",            Locale::LeftToRight },
+  { "sw", "Swahili",            Locale::LeftToRight },
+  { "ta", "Tamil",              Locale::LeftToRight },
+  { "te", "Telugu",             Locale::LeftToRight },
+  { "tg", "Tajik",              Locale::RightToLeft },
+  { "th", "Thai",               Locale::LeftToRight },
+  { "tk", "Turkmen",            Locale::LeftToRight },
+  { "tn", "Setsuana",           Locale::LeftToRight },
+  { "tr", "Turkish",            Locale::LeftToRight },
+  { "ts", "Tsonga",             Locale::LeftToRight },
+  { "tt", "Tatar",              Locale::LeftToRight },
+  { "uk", "Ukrainian",          Locale::LeftToRight },
+  { "ur", "Urdu",               Locale::RightToLeft },
+  { "uz", "Uzbek",              Locale::LeftToRight },
+  { "vi", "Vietnamese",         Locale::LeftToRight },
+  { "xh", "Xhosa",              Locale::LeftToRight },
+  { "yi", "Yiddish",            Locale::RightToLeft },
+  { "zh", "Chinese",            Locale::LeftToRight },
+  { "zu", "Zulu",               Locale::LeftToRight },
+
+  { NULL, NULL, Locale::LeftToRight }
 };
 
 } // unnamed namespace
 
-Dali::ImfManager::TextDirection GetTextDirection( std::string locale )
+Locale::Direction GetDirection( const std::string& locale )
 {
-  Dali::ImfManager::TextDirection direction( Dali::ImfManager::LeftToRight );
+  Locale::Direction direction( Locale::LeftToRight );
 
   if ( !locale.empty() && locale.size() > 2 )
   {
-    // We're only interested in the first two characters
-    locale.resize(2);
-
-    for ( const LocaleDirection* iter = &LOCALE_DIRECTION_LOOKUP_TABLE[0]; iter->locale; ++iter )
+    for ( const LocaleDirectionInfo* iter = &LOCALE_DIRECTION_LOOKUP_TABLE[0]; iter->locale; ++iter )
     {
-      if ( !locale.compare( iter->locale ) )
+      if ( !locale.compare( 0, 2, iter->locale ) )
       {
         direction = iter->direction;
         break;
index b04182b..ecb251a 100644 (file)
@@ -21,9 +21,6 @@
 // EXTERNAL INCLUDES
 #include <string>
 
-// INTERNAL INCLUDES
-#include <imf-manager.h>
-
 namespace Dali
 {
 
@@ -36,7 +33,13 @@ namespace Adaptor
 namespace Locale
 {
 
-Dali::ImfManager::TextDirection GetTextDirection( std::string locale );
+enum Direction
+{
+  LeftToRight,
+  RightToLeft,
+};
+
+Locale::Direction GetDirection( const std::string& locale );
 
 } // namespace Locale
 
index 7747cd3..affbda2 100644 (file)
@@ -325,7 +325,7 @@ Dali::VirtualKeyboard::TextDirection GetTextDirection()
 
         if ( locale )
         {
-          direction = (Dali::VirtualKeyboard::TextDirection)Locale::GetTextDirection( std::string( locale ) );
+          direction = static_cast< Dali::VirtualKeyboard::TextDirection >( Locale::GetDirection( std::string( locale ) ) );
           free( locale );
         }
       }
index 5764c3a..edd8899 100644 (file)
@@ -699,7 +699,7 @@ Dali::ImfManager::TextDirection ImfManager::GetTextDirection()
 
       if ( locale )
       {
-        direction = Locale::GetTextDirection( std::string( locale ) );
+        direction = static_cast< Dali::ImfManager::TextDirection >( Locale::GetDirection( std::string( locale ) ) );
         free( locale );
       }
     }
index 1619139..67afe39 100644 (file)
@@ -25,6 +25,8 @@
 #include <ecore-wl-render-surface.h>
 #endif
 
+#include <system_settings.h>
+
 namespace Dali
 {
 
@@ -34,6 +36,30 @@ namespace Internal
 namespace Adaptor
 {
 
+namespace
+{
+
+static void OnSystemLanguageChanged( system_settings_key_e key, void* data )
+{
+  char* locale = NULL;
+  if( system_settings_get_value_string( SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &locale ) != SYSTEM_SETTINGS_ERROR_NONE ||
+      locale == NULL )
+  {
+    DALI_LOG_ERROR( "DALI OnSystemLanguageChanged failed " );
+    return;
+  }
+
+  Adaptor* adaptor = static_cast< Adaptor* >( data );
+  if( adaptor != NULL )
+  {
+    adaptor->SetRootLayoutDirection( locale );
+  }
+
+  free( locale );
+}
+
+} // namesapce
+
 void Adaptor::GetDataStoragePath( std::string& path)
 {
 #ifdef USE_APPFW
@@ -82,6 +108,28 @@ void Adaptor::SurfaceInitialized()
 #endif
 }
 
+void Adaptor::SetupSystemInformation()
+{
+  if( system_settings_set_changed_cb( SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, OnSystemLanguageChanged, this ) != SYSTEM_SETTINGS_ERROR_NONE )
+  {
+    DALI_LOG_ERROR( "DALI system_settings_set_changed_cb failed.\n" );
+    return;
+  }
+
+  char* locale = NULL;
+  if( system_settings_get_value_string( SYSTEM_SETTINGS_KEY_LOCALE_LANGUAGE, &locale ) != SYSTEM_SETTINGS_ERROR_NONE ||
+      locale == NULL )
+  {
+    DALI_LOG_ERROR( "DALI OnSystemLanguageChanged failed " );
+    return;
+  }
+
+  SetRootLayoutDirection( locale );
+
+  free( locale );
+
+}
+
 } // namespace Adaptor
 
 } // namespace Internal
index be25b7b..4f1201c 100644 (file)
@@ -41,6 +41,10 @@ void Adaptor::SurfaceInitialized()
 {
 }
 
+void Adaptor::SetupSystemInformation()
+{
+}
+
 } // namespace Adaptor
 
 } // namespace Internal
index e0fa762..c9bef9c 100644 (file)
@@ -538,7 +538,7 @@ Dali::ImfManager::TextDirection ImfManager::GetTextDirection()
 
       if ( locale )
       {
-        direction = Locale::GetTextDirection( std::string( locale ) );
+        direction = static_cast< Dali::ImfManager::TextDirection >( Locale::GetDirection( std::string( locale ) ) );
         free( locale );
       }
     }
index a467049..393f4f3 100644 (file)
@@ -114,6 +114,7 @@ BuildRequires:  pkgconfig(capi-appfw-app-common)
 BuildRequires:  pkgconfig(capi-appfw-app-control)
 BuildRequires:  pkgconfig(ecore-imf)
 %endif
+
 BuildRequires:  pkgconfig(capi-system-system-settings)
 
 # for feedback plugin