Add notify update API 76/171376/7
authorhyunho <hhstark.kang@samsung.com>
Mon, 19 Mar 2018 02:48:39 +0000 (11:48 +0900)
committerHyunho Kang <hhstark.kang@samsung.com>
Mon, 19 Mar 2018 02:49:34 +0000 (02:49 +0000)
Change-Id: I55b0a68500de18c6ac9ff9241c337b2216586f76
Signed-off-by: hyunho <hhstark.kang@samsung.com>
12 files changed:
unittest/src/test_complication.cc
unittest/src/test_complication_provider.cc
watchface-complication-provider/complication-provider-event-interface.h
watchface-complication-provider/complication-provider.cc
watchface-complication-provider/include/watchface-complication-provider.h
watchface-complication-provider/watchface-complication-provider.cc
watchface-complication/complication-connector.cc
watchface-complication/complication-connector.h
watchface-complication/complication.cc
watchface-complication/complication.h
watchface-complication/include/watchface-complication.h
watchface-complication/watchface-complication.cc

index d61465e..678d40e 100755 (executable)
@@ -142,7 +142,7 @@ class WFC : public ::testing::Test {
   }
 };
 
-int on_complication_update_cb(int complication_id, const char* provider_id,
+void on_complication_update_cb(int complication_id, const char* provider_id,
                              complication_type type, const bundle* data,
                              void* user_data) {
   const char* cur_provider_id = NULL;
@@ -150,7 +150,6 @@ int on_complication_update_cb(int complication_id, const char* provider_id,
 
   EXPECT_EQ(complication_get_provider_id(data, &cur_provider_id), 0);
   EXPECT_EQ(complication_get_type(data, &cur_type), 0);
-  return 0;
 }
 
 TEST_F(WFC, Create)
index 801a7b6..5406a71 100755 (executable)
@@ -72,5 +72,5 @@ TEST_F(WCP, GetSupportTypes)
 
 TEST_F(WCP, NotifyUpdate)
 {
-  EXPECT_EQ(complication_provider_notify_update(), 0);
+  EXPECT_EQ(complication_provider_notify_update("test"), COMPLICATION_ERROR_INVALID_PARAMETER);
 }
index 24ed963..ca2dfd2 100644 (file)
@@ -28,7 +28,7 @@ class EXPORT_API IComplicationProviderEvent {
  public:
   virtual void OnDataUpdated(const std::string& provider_id,
                              ComplicationType type, const Bundle& data) = 0;
-  virtual void OnNotifyDataUpdate(const std::string& provider_id) = 0;
+  virtual void OnNotifyDataUpdate() = 0;
 };
 
 }  // namespace watchface_complication
index 0763f3a..00a8606 100644 (file)
@@ -78,11 +78,12 @@ void ComplicationProvider::Impl::OnSignal(const std::string& sender_name,
     ComplicationConnector::GetInst().EmitSignal(
       ComplicationConnector::Complication,
       std::string(sender_app_id),
-      provider_id_, complication_id,
+      provider_id_, -1,
       ComplicationConnector::GetInst().GetCmdStr(
           ComplicationConnector::CompUpdated),
-      g_variant_new("(sis)",
+      g_variant_new("(siis)",
                     (provider_id_).c_str(),
+                    type,
                     complication_id,
                     shared_data->ToString()));
   }
@@ -97,8 +98,14 @@ const std::string& ComplicationProvider::GetProviderId() const {
 }
 
 void ComplicationProvider::NotifyDataUpdate() {
-
-
+    LOGI("notify %s", impl_->provider_id_.c_str());
+    ComplicationConnector::GetInst().EmitSignal(
+      ComplicationConnector::Complication,
+      "",
+      impl_->provider_id_, -1,
+      ComplicationConnector::GetInst().GetCmdStr(
+          ComplicationConnector::CompNotifyDataUpdate),
+      NULL);
 }
 
 }  // namespace watchface_complication
index 1673d32..d5936c5 100644 (file)
@@ -43,7 +43,7 @@ int complication_provider_update_request_cb_del(const char *provider_id,
     on_update_request cb, void *user_data);
 int complication_provider_get_support_types(const char *provider_id,
     int *types);
-int complication_provider_notify_update();
+int complication_provider_notify_update(const char *provider_id);
 
 #ifdef __cplusplus
 }
index abc4c60..77359ce 100644 (file)
@@ -105,8 +105,11 @@ extern "C" EXPORT_API int complication_provider_update_request_cb_add(
   auto cp = __providers.find(provider_id);
   auto ws = cp->second;
 
-  if (cp == __providers.end())
+  if (cp == __providers.end()) {
     ws = new WatchComplicationProviderStub(provider_id, support_types);
+    __providers[provider_id] = ws;
+    LOGI("create new provider : %s", provider_id);
+  }
 
   auto ci = new CallbackInfo(cb, user_data);
   ws->AddCallbackInfo(ci);
@@ -130,6 +133,26 @@ extern "C" EXPORT_API int complication_provider_get_support_types(
   return 0;
 }
 
-extern "C" EXPORT_API int complication_provider_notify_update() {
+extern "C" EXPORT_API int complication_provider_notify_update(
+  const char* provider_id) {
+  auto cp = __providers.find(provider_id);
+
+  if (cp == __providers.end()) {
+    LOGE("can not find provider (%s)", provider_id);
+    return COMPLICATION_ERROR_INVALID_PARAMETER;
+  }
+
+  auto ws = cp->second;
+  // TODO(?): Get provider's support type from storage
+  int support_types = ShortText | Image;
+
+  if (cp == __providers.end()) {
+    LOGI("create new provider : %s", provider_id);
+    ws = new WatchComplicationProviderStub(provider_id, support_types);
+    __providers[provider_id] = ws;
+  }
+
+  ws->NotifyDataUpdate();
+
   return 0;
 }
index c0c195a..4c4347c 100644 (file)
@@ -92,10 +92,10 @@ bool ComplicationConnector::EmitSignal(SigType type, std::string target_id,
                      .EncodeStr(Name, target_id);
 
   LOGI("emit : %s, %s, %d, %s", target_id.c_str(), id.c_str(), sub_id, cmd.c_str());
-  LOGI("emit signal %s, %s", name.c_str(), path.c_str());
+  LOGI("emit signal %s, %s", name.empty() ? NULL : name.c_str(), path.c_str());
   result = g_dbus_connection_emit_signal(
              impl_->conn_,
-             name.c_str(),
+             name.empty() ? NULL : name.c_str(),
              path.c_str(),
              COMPLICATION_INTERFACE,
              cmd.c_str(), data, &err);
@@ -148,6 +148,9 @@ std::string ComplicationConnector::EncodeStr(EncodeType type,
   std::string encoded_path_str;
   std::string encoded_str;
 
+  if (appid.empty())
+    return "";
+
   encoded_path = g_compute_checksum_for_string(G_CHECKSUM_MD5,
                  appid.c_str(), -1);
 
@@ -164,6 +167,8 @@ std::string ComplicationConnector::EncodeStr(EncodeType type,
 
 std::string ComplicationConnector::EncodeStr(EncodeType type, std::string appid,
     int compid) {
+  if (appid.empty())
+    return "";
   std::string str = appid + "_" + std::to_string(compid);
 
   return EncodeStr(type, str);
@@ -213,6 +218,9 @@ std::string ComplicationConnector::GetCmdStr(CmdType type) {
   case CompUpdated :
     ret = "__COMP_UPDATED__";
     break;
+  case CompNotifyDataUpdate :
+    ret = "__COMP_NOTIFY_DATA_UPDATE__";
+    break;
   case EditableEditRequest :
     ret = "__EDITABLE_EDIT_REQUEST__";
     break;
index d525e4d..04885a8 100644 (file)
@@ -35,6 +35,7 @@ class EXPORT_API ComplicationConnector {
   enum CmdType {
     CompUpdateRequest,
     CompUpdated,
+    CompNotifyDataUpdate,
     EditableEditRequest,
     EditableEditComplete,
     EditableEditPreview,
index 3a56717..e1f57cd 100755 (executable)
@@ -46,6 +46,7 @@ Complication::Complication(int id, int support_types,
 
 Complication::~Complication() {
   LOGE("complication destroy %d", impl_->complication_id_);
+  ComplicationConnector::GetInst().UnSubscribeSignal(impl_->subscribe_id_);
 }
 
 Complication::Impl::Impl(Complication* parent, int id,
@@ -76,7 +77,7 @@ Complication::Impl::Impl(Complication* parent, int id,
   RestoreStateOrSetDefault();
   subscribe_id_ = ComplicationConnector::GetInst().SubscribeSignal(
                     ComplicationConnector::Complication, cur_provider_id_,
-                    complication_id_, this);
+                    -1, this);
   LOGI("subscribe signal %d", subscribe_id_);
 }
 
@@ -95,15 +96,20 @@ void Complication::Impl::OnSignal(const std::string& sender_name,
                                   const std::string& signal_name,
                                   GVariant* parameters) {
   char *provider_id;
+  int type;
   int complication_id;
   bundle_raw *raw = NULL;
 
   LOGI("signal_name: %s", signal_name.c_str());
-  std::string cmd =
-      ComplicationConnector::GetInst().GetCmdStr(
-          ComplicationConnector::CompUpdated);
-  if (signal_name.compare(cmd) == 0) {
-    g_variant_get(parameters, "(&si&s)", &provider_id, &complication_id, &raw);
+  if (signal_name.compare(ComplicationConnector::GetInst().GetCmdStr(
+          ComplicationConnector::CompUpdated)) == 0) {
+    g_variant_get(parameters, "(&sii&s)", &provider_id, &type,
+        &complication_id, &raw);
+    if (complication_id != complication_id_ || type != cur_type_) {
+      LOGI("It's not mine %d:%d, %d:%d", complication_id, complication_id_,
+          type, cur_type_);
+      return;
+    }
     if (raw != NULL)
       last_data_.reset(new Bundle(std::string(reinterpret_cast<char*>(raw))));
     LOGI("data: %s, %d, cur_type :%d", provider_id, complication_id, cur_type_);
@@ -111,6 +117,9 @@ void Complication::Impl::OnSignal(const std::string& sender_name,
       parent_->OnDataUpdated(
           std::string(provider_id), cur_type_, *last_data_.get());
     }
+  } else if (signal_name.compare(ComplicationConnector::GetInst().GetCmdStr(
+          ComplicationConnector::CompNotifyDataUpdate)) == 0) {
+    parent_->OnNotifyDataUpdate();
   }
 }
 
@@ -302,7 +311,7 @@ int Complication::SetCurDataIdx(int cur_data_idx) {
   ComplicationConnector::GetInst().UnSubscribeSignal(impl_->subscribe_id_);
   impl_->subscribe_id_ = ComplicationConnector::GetInst().SubscribeSignal(
                     ComplicationConnector::Complication, impl_->cur_provider_id_,
-                    impl_->complication_id_, impl_.get());
+                    -1, impl_.get());
   LOGI("subscribe signal %d", impl_->subscribe_id_);
 
   return 0;
@@ -400,7 +409,8 @@ void Complication::OnDataUpdated(const std::string& provider_id,
                                  const Bundle& data) {
 }
 
-void Complication::OnNotifyDataUpdate(const std::string& provider_id) {
+void Complication::OnNotifyDataUpdate() {
+  SendDataUpdateRequest();
 }
 
 std::unique_ptr<Bundle> Complication::Impl::GetDefault() {
index 7e3b684..ceb000d 100644 (file)
@@ -55,7 +55,7 @@ class EXPORT_API Complication : public IEditable
   void OnDataUpdated(const std::string& provider_id,
                     ComplicationType type,
                     const Bundle& data) override;
-  void OnNotifyDataUpdate(const std::string& provider_id) override;
+  void OnNotifyDataUpdate() override;
   int GetId() override;
   void SetName(const std::string& name) override;
   void SetState(IEditable::EditableState state) override;
index 90aa47d..96c04bc 100644 (file)
@@ -47,7 +47,7 @@ typedef enum _complication_shape_type {
 } complication_shape_type;
 
 typedef void *complication_h;
-typedef int (*on_complication_update)(int complication_id,
+typedef void (*on_complication_update)(int complication_id,
                                       const char *provider_id,
                                       complication_type type,
                                       const bundle *data,
index c3fc88e..ef2fb2e 100644 (file)
@@ -77,9 +77,6 @@ class WatchComplicationStub : public Complication {
     LOGI("update call!! done");
   }
 
-  void OnNotifyDataUpdate(const std::string& provider_id) override {
-  }
-
   void AddCallbackInfo(CallbackInfo* ci) {
     cb_list_.emplace_back(ci);
   }