Add new api for provider info search 10/227010/3
authorJusung Son <jusung07.son@samsung.com>
Mon, 9 Mar 2020 05:04:34 +0000 (14:04 +0900)
committerJusung Son <jusung07.son@samsung.com>
Mon, 9 Mar 2020 05:11:56 +0000 (14:11 +0900)
Change-Id: I2411edebcc335ed932086d782ca5ec6609a62565
Signed-off-by: Jusung Son <jusung07.son@samsung.com>
unittest/data/test.sql
unittest/src/test-db-manager.cc
unittest/src/test-watchface-complication-provider.cc
watchface-common/db-manager.cc [moved from watchface-complication/db-manager.cc with 91% similarity]
watchface-common/db-manager.hh [moved from watchface-complication/db-manager.hh with 80% similarity]
watchface-complication-provider/include/watchface-complication-provider-internal.h
watchface-complication-provider/watchface-complication-provider.cc
watchface-complication/complication.hh [changed mode: 0644->0755]

index 39ca2db..80063d9 100644 (file)
@@ -35,6 +35,13 @@ CREATE TABLE IF NOT EXISTS provider_support_events (
   support_events  INTEGER DEFAULT 1,
   FOREIGN KEY (provider_id) REFERENCES complication_provider(provider_id) ON DELETE CASCADE
 );
+CREATE TABLE IF NOT EXISTS provider_icon (
+  provider_id    TEXT NOT NULL,
+  locale         TEXT NOT NULL DEFAULT 'No Locale',
+  icon_path      TEXT,
+  UNIQUE (provider_id, locale),
+  FOREIGN KEY (provider_id) REFERENCES complication_provider(provider_id) ON DELETE CASCADE
+);
 
 INSERT INTO complication_provider (
   pkgid, appid, provider_id, trusted, period) VALUES (
@@ -45,6 +52,20 @@ INSERT INTO complication_provider (
   1
 );
 
+INSERT INTO provider_icon (
+  provider_id, locale, icon_path) VALUES (
+  'org.tizen.gmock_comp_provider/test',
+  'No Locale',
+  'icon_path'
+);
+
+INSERT INTO provider_localized_info (
+  provider_id, locale, provider_label) VALUES (
+  'org.tizen.gmock_comp_provider/test',
+  'No Locale',
+  'provider_label'
+);
+
 INSERT INTO provider_support_types (
   provider_id, support_type, default_data) VALUES (
   'org.tizen.gmock_comp_provider/test',
index 35bdb14..362723c 100644 (file)
@@ -27,7 +27,7 @@
 #include <gtest/gtest.h>
 #include <gmock/gmock.h>
 
-#include "watchface-complication/db-manager.hh"
+#include "watchface-common/db-manager.hh"
 
 using namespace std;
 using namespace watchface_complication;
index fd77c56..77792ac 100644 (file)
@@ -24,6 +24,7 @@
 #include "watchface-complication/design-element.hh"
 #include "watchface-complication/editables-container.hh"
 #include "watchface-complication/received-editable.hh"
+#include "watchface-common/db-manager.hh"
 
 #include "mock/system_info_mock.h"
 #include "mock/tzplatform_config_mock.h"
@@ -130,6 +131,43 @@ int __fake_aul_get_app_shared_resource_path_by_appid(const char* appid,
   return 0;
 }
 
+void __all_provider_foreach_cb(const provider_info_h info, void *user_data) {
+  int* count = static_cast<int*>(user_data);
+  (*count)++;
+}
+
+void __provider_foreach_cb(const provider_info_h info, void *user_data) {
+  char* str_value;
+  int types;
+
+  watchface_complication_provider_info_get_id(info, &str_value);
+  EXPECT_STREQ(str_value, "org.tizen.gmock_comp_provider/test");
+  free(str_value);
+
+  watchface_complication_provider_info_get_app_id(info, &str_value);
+  EXPECT_STREQ(str_value, "org.tizen.gmock_comp_provider");
+  free(str_value);
+
+  watchface_complication_provider_info_get_label(info, &str_value);
+  EXPECT_STREQ(str_value, "provider_label");
+  free(str_value);
+
+  watchface_complication_provider_info_get_icon(info, &str_value);
+  EXPECT_STREQ(str_value, "icon_path");
+  free(str_value);
+
+  watchface_complication_provider_info_get_types(info, &types);
+  EXPECT_EQ(WATCHFACE_COMPLICATION_TYPE_SHORT_TEXT |
+                WATCHFACE_COMPLICATION_TYPE_LONG_TEXT |
+                WATCHFACE_COMPLICATION_TYPE_RANGED_VALUE |
+                WATCHFACE_COMPLICATION_TYPE_TIME |
+                WATCHFACE_COMPLICATION_TYPE_ICON |
+                WATCHFACE_COMPLICATION_TYPE_IMAGE |
+                WATCHFACE_COMPLICATION_TYPE_SMALL_IMAGE,
+                types);
+
+}
+
 class CWCP : public ::testing::Test {
  public:
   void RunLoop() {
@@ -410,4 +448,18 @@ TEST_F(CWCP, watchface_complication_provider_event_get_context)
   EXPECT_EQ(WATCHFACE_COMPLICATION_ERROR_NONE, ret);
 }
 
-}
\ No newline at end of file
+TEST_F(CWCP, watchface_complication_provider_foreach_info)
+{
+  int ret, count = 0;
+
+  ret = watchface_complication_provider_foreach_info(
+          nullptr, __all_provider_foreach_cb, &count);
+  EXPECT_EQ(5, count);
+  EXPECT_EQ(WATCHFACE_COMPLICATION_ERROR_NONE, ret);
+
+  ret = watchface_complication_provider_foreach_info(
+          "org.tizen.gmock_comp_provider", __provider_foreach_cb, nullptr);
+  EXPECT_EQ(WATCHFACE_COMPLICATION_ERROR_NONE, ret);
+
+}
+}
similarity index 91%
rename from watchface-complication/db-manager.cc
rename to watchface-common/db-manager.cc
index b84a137..9941370 100644 (file)
@@ -23,7 +23,7 @@
 #include <vconf.h>
 
 #include "watchface-complication/complication-internal.hh"
-#include "watchface-complication/db-manager.hh"
+#include "watchface-common/db-manager.hh"
 #include "watchface-common/watchface-util.hh"
 
 #ifdef LOG_TAG
@@ -539,4 +539,47 @@ int DBManager::GetTrustedInfo(std::string& provider_id, bool* trusted) {
   return WATCHFACE_COMPLICATION_ERROR_NONE;
 }
 
+std::list<std::shared_ptr<DBManager::ProviderInfo>>
+DBManager::GetProviderList(std::string& app_id) {
+  std::string query =
+    "SELECT A.provider_id, appid, SUM(support_type) FROM complication_provider as A "
+    "LEFT JOIN provider_support_types as B ON A.provider_id = B.provider_id";
+
+  if (app_id.empty() == false)
+    query += " WHERE A.appid = ? GROUP BY A.provider_id";
+  else
+    query += " GROUP BY A.provider_id";
+
+  util::DBHelper db;
+
+  if (!db.Open())
+    return {};
+
+  if (!db.Prepare(query))
+    return {};
+
+  if (app_id.empty() == false) {
+    if (!db.Bind(1, app_id))
+      return {};
+  }
+
+  std::string locale = DBManager::GetSystemLocale();
+
+  std::list<std::shared_ptr<DBManager::ProviderInfo>> provider_list;
+  while (db.Step() == SQLITE_ROW) {
+    std::string provider_id = db.GetText(0);
+    std::string app_id = db.GetText(1);
+    int support_types = db.GetInt(2);
+    std::string icon = GetIcon(provider_id, locale);
+    std::string label = GetLabel(provider_id.c_str());
+
+    provider_list.emplace_back(
+        std::shared_ptr<ProviderInfo>(
+            new ProviderInfo(provider_id, support_types, app_id, label, icon)));
+  }
+
+  return provider_list;
+
+}
+
 }  // namespace watchface_complication
similarity index 80%
rename from watchface-complication/db-manager.hh
rename to watchface-common/db-manager.hh
index 0b6d2e6..4c50263 100644 (file)
@@ -33,13 +33,28 @@ class EXPORT_API DBManager {
   class ProviderInfo {
     std::string provider_id_;
     int type_;
+    std::string app_id_;
+    std::string label_;
+    std::string icon_;
+
    public:
-    ProviderInfo(std::string provider_id, int type)
-      : provider_id_(provider_id), type_(type) {
+    ProviderInfo(std::string provider_id, int type,
+       std::string app_id = "", std::string label = "", std::string icon = "")
+         : provider_id_(provider_id), type_(type),
+              app_id_(app_id), label_(label), icon_(icon) {
     }
     std::string& GetProviderId() {
       return provider_id_;
     }
+    std::string& GetAppId() {
+      return app_id_;
+    }
+    std::string& GetLabel() {
+      return label_;
+    }
+    std::string& GetIcon() {
+      return icon_;
+    }
     int GetType() {
       return type_;
     }
@@ -61,6 +76,7 @@ class EXPORT_API DBManager {
   static std::list<std::string> GetProviderListWithAppId(const char* provider_id);
   static int GetTrustedInfo(std::string& provider_id, bool* trusted);
   static std::string GetSystemLocale();
+  static std::list<std::shared_ptr<ProviderInfo>> GetProviderList(std::string& app_id);
 
  private:
   DBManager(); /* LCOV_EXCL_LINE */
index 4add505..66b36d2 100644 (file)
@@ -69,6 +69,20 @@ typedef void (*watchface_complication_consumer_status_cb)(const char *provider_i
 void watchface_complication_provider_set_consumer_status_cb(
        watchface_complication_consumer_status_cb callback, void *user_data);
 
+typedef void *provider_info_h;
+
+typedef void (*complication_provider_foreach_cb)
+       (const provider_info_h info, void *user_data);
+
+int watchface_complication_provider_foreach_info(
+    const char *appid, complication_provider_foreach_cb callback,
+    void *user_data);
+int watchface_complication_provider_info_get_id(const provider_info_h info, char** id);
+int watchface_complication_provider_info_get_app_id(const provider_info_h info, char** app_id);
+int watchface_complication_provider_info_get_label(const provider_info_h info, char** label);
+int watchface_complication_provider_info_get_icon(const provider_info_h info, char** icon);
+int watchface_complication_provider_info_get_types(const provider_info_h info, int* types);
+
 #ifdef __cplusplus
 }
 #endif
index f554bdd..ca13357 100644 (file)
@@ -35,7 +35,7 @@
 #include "watchface-complication-provider/complication-provider.hh"
 #include "watchface-complication-provider/include/watchface-complication-provider.h"
 #include "watchface-complication-provider/include/watchface-complication-provider-internal.h"
-#include "watchface-complication/db-manager.hh"
+#include "watchface-common/db-manager.hh"
 #include "watchface-complication/complication-internal.hh"
 
 #ifdef LOG_TAG
@@ -1138,3 +1138,131 @@ int watchface_complication_provider_event_get_context(
 
   return WATCHFACE_COMPLICATION_ERROR_NONE;
 }
+
+extern "C" EXPORT_API
+int watchface_complication_provider_foreach_info(
+      const char *appid, complication_provider_foreach_cb callback,
+      void *user_data) {
+  if (callback == nullptr) {
+    LOGE("Invalid param");
+    return WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER;
+  }
+
+  std::string tmp_appid;
+  if (appid != nullptr && strlen(appid) > 0)
+    tmp_appid = appid;
+
+  std::list<std::shared_ptr<DBManager::ProviderInfo>> provider_list =
+        DBManager::GetProviderList(tmp_appid);
+
+  for (auto& i : provider_list)
+    callback(static_cast<provider_info_h>(i.get()), user_data);
+
+  return WATCHFACE_COMPLICATION_ERROR_NONE;
+}
+
+extern "C" EXPORT_API
+int watchface_complication_provider_info_get_id(
+     const provider_info_h info, char** id) {
+  if (info == nullptr || id == nullptr) {
+    LOGE("Invalid param");
+    return WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER;
+  }
+
+  DBManager::ProviderInfo* p_info = static_cast<DBManager::ProviderInfo*>(info);
+  string provider_id_ = p_info->GetProviderId();
+  if (provider_id_.empty())
+    return WATCHFACE_COMPLICATION_ERROR_NO_DATA;
+
+  char* tmp_id = strdup(provider_id_.c_str());
+  if (tmp_id == nullptr) {
+    LOGE("Out of memory");
+    return WATCHFACE_COMPLICATION_ERROR_OUT_OF_MEMORY;
+  }
+
+  *id = tmp_id;
+  return WATCHFACE_COMPLICATION_ERROR_NONE;
+}
+
+extern "C" EXPORT_API
+int watchface_complication_provider_info_get_app_id(
+      const provider_info_h info, char** app_id) {
+  if (info == nullptr || app_id == nullptr) {
+    LOGE("Invalid param");
+    return WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER;
+  }
+
+  DBManager::ProviderInfo* p_info = static_cast<DBManager::ProviderInfo*>(info);
+  string app_id_ = p_info->GetAppId();
+  if (app_id_.empty())
+    return WATCHFACE_COMPLICATION_ERROR_NO_DATA;
+
+  char* tmp_app_id = strdup(app_id_.c_str());
+  if (tmp_app_id == nullptr) {
+    LOGE("Out of memory");
+    return WATCHFACE_COMPLICATION_ERROR_OUT_OF_MEMORY;
+  }
+
+  *app_id = tmp_app_id;
+  return WATCHFACE_COMPLICATION_ERROR_NONE;
+}
+
+extern "C" EXPORT_API
+int watchface_complication_provider_info_get_label(
+      const provider_info_h info, char** label) {
+  if (info == nullptr || label == nullptr) {
+    LOGE("Invalid param");
+    return WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER;
+  }
+
+  DBManager::ProviderInfo* p_info = static_cast<DBManager::ProviderInfo*>(info);
+  string label_ = p_info->GetLabel();
+  if (label_.empty())
+    return WATCHFACE_COMPLICATION_ERROR_NO_DATA;
+
+  char* tmp_label = strdup(label_.c_str());
+  if (tmp_label == nullptr) {
+    LOGE("Out of memory");
+    return WATCHFACE_COMPLICATION_ERROR_OUT_OF_MEMORY;
+  }
+
+  *label = tmp_label;
+  return WATCHFACE_COMPLICATION_ERROR_NONE;
+}
+
+extern "C" EXPORT_API
+int watchface_complication_provider_info_get_icon(
+      const provider_info_h info, char** icon) {
+  if (info == nullptr || icon == nullptr) {
+    LOGE("Invalid param");
+    return WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER;
+  }
+
+  DBManager::ProviderInfo* p_info = static_cast<DBManager::ProviderInfo*>(info);
+  string icon_ = p_info->GetIcon();
+  if (icon_.empty())
+    return WATCHFACE_COMPLICATION_ERROR_NO_DATA;
+
+  char* tmp_icon = strdup(icon_.c_str());
+    if (tmp_icon == nullptr) {
+    LOGE("Out of memory");
+    return WATCHFACE_COMPLICATION_ERROR_OUT_OF_MEMORY;
+  }
+
+  *icon = tmp_icon;
+  return WATCHFACE_COMPLICATION_ERROR_NONE;
+}
+
+extern "C" EXPORT_API
+int watchface_complication_provider_info_get_types(
+      const provider_info_h info, int* types) {
+  if (info == nullptr || types == nullptr) {
+    LOGE("Invalid param");
+    return WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER;
+  }
+
+  DBManager::ProviderInfo* p_info = static_cast<DBManager::ProviderInfo*>(info);
+  *types = p_info->GetType();
+
+  return WATCHFACE_COMPLICATION_ERROR_NONE;
+}
old mode 100644 (file)
new mode 100755 (executable)
index 8bdfa47..3c7684a
@@ -29,7 +29,7 @@
 #include "watchface-complication/gdbus-interface.hh"
 #include "watchface-complication/complication-connector.hh"
 #include "watchface-complication/editables-manager.hh"
-#include "watchface-complication/db-manager.hh"
+#include "watchface-common/db-manager.hh"
 #include "watchface-common/watchface-exception.hh"
 #include "watchface-complication-provider/include/watchface-complication-provider-internal.h"