Implement default theme overlay 58/237358/2
authorSangyoon Jang <jeremy.jang@samsung.com>
Mon, 29 Jun 2020 11:04:08 +0000 (20:04 +0900)
committerSangyoon Jang <jeremy.jang@samsung.com>
Mon, 29 Jun 2020 11:23:29 +0000 (20:23 +0900)
When getting theme info, overlay upon default theme info.

Change-Id: I2899023bcd8e9331882a678a822954597d9fa6a8
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
src/theme/loader/theme_info.cc
src/theme/loader/theme_info.h
src/theme_provider/selection_request_handler.cc
test/unit_tests/test_request_handlers.cc

index 751893d..393514b 100644 (file)
 
 #include "theme/loader/theme_info.h"
 
+#include <algorithm>
 #include <string>
+#include <vector>
+
+#include "theme/utils/logging.h"
 
 namespace ttm {
 namespace loader {
@@ -97,5 +101,53 @@ tizen_base::Bundle ThemeInfo::Serialize() const {
   return bundle_;
 }
 
+ThemeInfo& ThemeInfo::Merge(const ThemeInfo& other) {
+  std::vector<tizen_base::Bundle::KeyInfo> keyinfos = bundle_.GetKeys();
+  std::vector<tizen_base::Bundle::KeyInfo> other_keyinfos =
+      const_cast<ThemeInfo&>(other).bundle_.GetKeys();
+
+  // We need to create new vector which only has key strings, because we need to
+  // sort and resize vector to use set_difference(), but
+  // tizen_base::Bundle::KeyInfo doesn't provide default constructor.
+  std::vector<std::string> keys;
+  for (const auto& info : keyinfos)
+    keys.emplace_back(info.GetName());
+  std::vector<std::string> other_keys;
+  for (const auto& info : other_keyinfos)
+    other_keys.emplace_back(info.GetName());
+
+  if (keys.size() < other_keys.size())
+    keys.resize(other_keys.size());
+
+  std::sort(keys.begin(), keys.end());
+  std::sort(other_keys.begin(), other_keys.end());
+
+  std::vector<std::string> diff;
+  std::set_difference(other_keys.begin(), other_keys.end(), keys.begin(),
+      keys.end(), std::back_inserter(diff));
+  // do not merge special key "is_default"
+  diff.erase(std::remove(diff.begin(), diff.end(), "is_default"), diff.end());
+
+  for (const auto& key : diff) {
+    bundle_type type = other.bundle_.GetType(key);
+    switch (type) {
+      case BUNDLE_TYPE_STR:
+        bundle_.Add(key, other.bundle_.GetString(key));
+        break;
+      case BUNDLE_TYPE_STR_ARRAY:
+        bundle_.Add(key, other.bundle_.GetStringArray(key));
+        break;
+      case BUNDLE_TYPE_BYTE:
+        bundle_.Add(key, other.bundle_.GetByte(key));
+        break;
+      default:
+        LOG(WARNING) << "Unexpected bundle_type during merging bundle";
+        break;
+    }
+  }
+
+  return *this;
+}
+
 }  // namespace loader
 }  // namespace ttm
index 980eca6..fe3efd2 100644 (file)
@@ -51,6 +51,8 @@ class ThemeInfo {
 
   tizen_base::Bundle Serialize() const;
 
+  ThemeInfo& Merge(const ThemeInfo& other);
+
  private:
   tizen_base::Bundle bundle_;
 };
index 8ce0774..97960b2 100644 (file)
@@ -26,6 +26,11 @@ tizen_base::Bundle SelectionRequestHandler::OnRequest(dbus::Command cmd,
         b.Add(dbus::kCmdResultKey, "error");
         return b;
       }
+      std::shared_ptr<loader::ThemeInfo> default_theme =
+          proxy_->GetDefaultTheme();
+      if (default_theme)
+        themeinfo->Merge(*default_theme);
+
       b.Add(dbus::kCmdResultKey, "ok");
       b.Add(dbus::kCmdDataKey,
           reinterpret_cast<char*>(themeinfo->Serialize().ToRaw().first.get()));
index d20ae2d..3998fba 100644 (file)
@@ -75,6 +75,19 @@ class RequestHandlersTest : public TestFixture {
   virtual ~RequestHandlersTest() {}
 
   virtual void SetUp() {
+    ttm::provider::DbManager db_manager(kTestDb);
+    tizen_base::Bundle b;
+    b.Add("id", "default_id");
+    b.Add("version", "1.0");
+    b.Add("tool_version", "1.1");
+    b.Add("title", "Default Theme");
+    b.Add("resolution", "360X360");
+    b.Add("preview", "shared/res/default_preview.png");
+    b.Add("description", "default test");
+    b.Add("is_default", "true");
+    b.Add("some_default_key", "some_default_value");
+    db_manager.Insert(b);
+
     proxy_ = std::make_shared<ThemeInfoProxy>(kTestDb);
 
     b_.Add("id", "testid");
@@ -221,8 +234,9 @@ TEST_F(RequestHandlersTest, SelectionRequestHandler_OnRequest) {
   tizen_base::Bundle result(rb.GetString(ttm::dbus::kCmdDataKey));
   ThemeInfo theme(result);
   EXPECT_EQ(theme.GetId(), "testid");
+  EXPECT_EQ(theme.GetString("some_default_key"), "some_default_value");
 
   rb = handler.OnRequest(ttm::dbus::Command::GET_IDS, {});
   std::vector<std::string> ids = rb.GetStringArray(ttm::dbus::kCmdDataKey);
-  EXPECT_EQ(ids.size(), 2);
+  EXPECT_EQ(ids.size(), 3);
 }