}
};
-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;
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)
TEST_F(WCP, NotifyUpdate)
{
- EXPECT_EQ(complication_provider_notify_update(), 0);
+ EXPECT_EQ(complication_provider_notify_update("test"), COMPLICATION_ERROR_INVALID_PARAMETER);
}
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
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()));
}
}
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
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
}
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);
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;
}
.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);
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);
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);
case CompUpdated :
ret = "__COMP_UPDATED__";
break;
+ case CompNotifyDataUpdate :
+ ret = "__COMP_NOTIFY_DATA_UPDATE__";
+ break;
case EditableEditRequest :
ret = "__EDITABLE_EDIT_REQUEST__";
break;
enum CmdType {
CompUpdateRequest,
CompUpdated,
+ CompNotifyDataUpdate,
EditableEditRequest,
EditableEditComplete,
EditableEditPreview,
Complication::~Complication() {
LOGE("complication destroy %d", impl_->complication_id_);
+ ComplicationConnector::GetInst().UnSubscribeSignal(impl_->subscribe_id_);
}
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_);
}
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_);
parent_->OnDataUpdated(
std::string(provider_id), cur_type_, *last_data_.get());
}
+ } else if (signal_name.compare(ComplicationConnector::GetInst().GetCmdStr(
+ ComplicationConnector::CompNotifyDataUpdate)) == 0) {
+ parent_->OnNotifyDataUpdate();
}
}
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;
const Bundle& data) {
}
-void Complication::OnNotifyDataUpdate(const std::string& provider_id) {
+void Complication::OnNotifyDataUpdate() {
+ SendDataUpdateRequest();
}
std::unique_ptr<Bundle> Complication::Impl::GetDefault() {
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;
} 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,
LOGI("update call!! done");
}
- void OnNotifyDataUpdate(const std::string& provider_id) override {
- }
-
void AddCallbackInfo(CallbackInfo* ci) {
cb_list_.emplace_back(ci);
}