#include <memory>
#include <string>
#include <list>
+#include <vector>
#include <map>
#include "watchface-complication/complication.hh"
cynara_result GetPrivilegeResult();
void SetPrivilegeResult(cynara_result result);
int GetListeningCount() const;
- void SetListeningCount(int count);
+ void AddListeningComp(int comp_id);
+ void RemoveListeningComp(int comp_id);
private:
std::string sender_name_;
std::string watch_name_;
std::list<std::string> sender_privileges_;
cynara_result privilege_result_;
- int listening_count_ = 0;
+ std::vector<int> listening_comps_;
};
SenderInfo* GetSenderInfo(std::string sender_name,
GDBusConnection* connection, GVariant* parameters);
#include <unistd.h>
#include <list>
+#include <algorithm>
#include "watchface-common/watchface-util.hh"
#include "watchface-common/watchface-common-internal.hh"
#include "watchface-complication-provider/complication-provider.hh"
#include "watchface-complication-provider/complication-provider-implementation.hh"
-#include "watchface-complication-provider/include/watchface-complication-provider.h"
#ifdef LOG_TAG
#undef LOG_TAG
ComplicationProvider::ComplicationProvider(const std::string& provider_id)
: impl_(new Impl(this, provider_id)) {
- impl_->NotifyProviderReady();
}
ComplicationProvider::~ComplicationProvider() = default;
}
int ComplicationProvider::Impl::SenderInfo::GetListeningCount() const {
- return listening_count_;
+ return listening_comps_.size();
}
-void ComplicationProvider::Impl::SenderInfo::SetListeningCount(int count) {
- listening_count_ = count;
+void ComplicationProvider::Impl::SenderInfo::AddListeningComp(int comp_id) {
+ if (std::find(listening_comps_.begin(), listening_comps_.end(), comp_id)
+ != listening_comps_.end()) {
+ LOGE("Already exist id (%d)", comp_id);
+ return;
+ }
+ listening_comps_.push_back(comp_id);
+}
+
+void ComplicationProvider::Impl::SenderInfo::RemoveListeningComp(int comp_id) {
+ std::vector<int>::iterator iter = std::find(listening_comps_.begin(),
+ listening_comps_.end(), comp_id);
+ if (iter == listening_comps_.end()) {
+ LOGW("Not exist id (%d)", comp_id);
+ return;
+ }
+ listening_comps_.erase(iter);
}
std::string& ComplicationProvider::Impl::SenderInfo::GetWatchName() {
SenderInfo* si = iter->second;
if (watch_name.compare(si->GetWatchName()) == 0) {
if (si->GetListeningCount() > 0)
- parent_->OnConsumerStatusChange(si->GetAppid(),
- WATCHFACE_COMPLICATION_CONSUMER_LISTENING_STOP);
+ parent_->OnConsumerStatusChange(si->GetAppid(), false);
gdbus_.get()->UnWatch(si->GetWatcherID());
sender_info_.erase(iter);
}
}
-int ComplicationProvider::Impl::NotifyProviderReady() {
- LOGI("notify %s", provider_id_.c_str());
- if (!gdbus_.get()->EmitSignal(IGDBus::Complication, "",
- provider_id_, -1, util::GetCmdStr(util::ProviderReady),
- g_variant_new("(s)", provider_id_.c_str())))
- return WATCHFACE_COMPLICATION_ERROR_IO_ERROR;
- return WATCHFACE_COMPLICATION_ERROR_NONE;
-}
-
void ComplicationProvider::Impl::OnAppear(const std::string& name,
const std::string& name_owner) {
}
}
} else if(signal_name.compare(util::GetCmdStr(
util::CmdType::CompNotifyListeningStatus)) == 0) {
- watchface_complication_consumer_status_e state;
+ int state;
int type;
+ int comp_id;
char* sender_app_id = nullptr;
- g_variant_get(parameters, "(&sii)", &sender_app_id, &type, &state);
+ g_variant_get(parameters, "(&siii)", &sender_app_id, &type, &comp_id, &state);
if (si->CheckAppid(sender_app_id) == false) {
LOGE("invaild app id [%s]", sender_app_id);
return;
}
- int listening_count = si->GetListeningCount();
-
- if (state == WATCHFACE_COMPLICATION_CONSUMER_LISTENING_START)
- listening_count++;
+ bool prev_is_listening = (bool)si->GetListeningCount();
+ if (state)
+ si->AddListeningComp(comp_id);
else
- listening_count--;
-
- si->SetListeningCount(listening_count);
-
- if ((state == WATCHFACE_COMPLICATION_CONSUMER_LISTENING_START && listening_count == 1)
- || (state == WATCHFACE_COMPLICATION_CONSUMER_LISTENING_STOP && listening_count == 0))
- parent_->OnConsumerStatusChange(sender_app_id, state);
+ si->RemoveListeningComp(comp_id);
+ bool is_listening = (bool)si->GetListeningCount();
+ LOGI("listening state %d -> %d", (int)prev_is_listening, (int)is_listening);
+ if (prev_is_listening != is_listening)
+ parent_->OnConsumerStatusChange(sender_app_id, (bool)state);
}
}
}
void ComplicationProvider::OnConsumerStatusChange(const std::string& sender_appid,
- watchface_complication_consumer_status_e status) {
+ bool is_listening) {
}
/* LCOV_EXCL_STOP */
const tizen_base::Bundle& context,
tizen_base::Bundle* shared_data) override;
void OnConsumerStatusChange(const std::string& sender_appid,
- watchface_complication_consumer_status_e status) override;
+ bool is_listening) override;
int NotifyDataUpdate();
const std::string& GetProviderId() const;
}
void OnConsumerStatusChange(const std::string& sender_appid,
- watchface_complication_consumer_status_e status) override {
- if (status_cb_ == nullptr)
+ bool is_listening) override {
+ if (status_cb_ == nullptr) {
+ LOGI("status callback is not registered");
return;
+ }
LOGI("ConsumerStatusChange call done provider(%s) sender(%s) %d ",
- GetProviderId().c_str(), sender_appid.c_str(), status);
-
+ GetProviderId().c_str(), sender_appid.c_str(), is_listening);
+ watchface_complication_consumer_status_e status;
+ if (is_listening)
+ status = WATCHFACE_COMPLICATION_CONSUMER_LISTENING_START;
+ else
+ status = WATCHFACE_COMPLICATION_CONSUMER_LISTENING_STOP;
status_cb_(GetProviderId().c_str(), sender_appid.c_str(), status, user_data_);
}
__status_cb = callback;
__user_data = user_data;
- for (auto& i : __providers)
+ for (auto& i : __providers) {
+ LOGI("Set status callback for (%s)", i.second->GetProviderId().c_str());
i.second->SetStatusCallback(callback, user_data);
+ }
}
extern "C" EXPORT_API int watchface_complication_provider_notify_update(
#include <string>
#include "watchface-complication/complication-internal.hh"
-#include "watchface-complication-provider/include/watchface-complication-provider-internal.h"
namespace watchface_complication {
const tizen_base::Bundle& context,
tizen_base::Bundle* shared_data) = 0;
virtual void OnConsumerStatusChange(const std::string& sender_appid,
- watchface_complication_consumer_status_e status) = 0;
+ bool is_listening) = 0;
};
} // namespace watchface_complication
const std::string& sender_name);
void UpdatedProcess(GVariant* parameters);
void NotifyDataUpdateProcess(GVariant* parameters);
- void ProviderReadyProcess(GVariant* parameters);
int UpdateCurProvider(std::string new_provider_id, ComplicationType type);
private:
EditablesManager& editables_manager_;
bool mock_ = false;
bool is_provider_ready_ = false;
- int listening_status_ = 0;
+ bool is_listening_ = false;
};
} // namespace watchface_complication
#include "watchface-common/watchface-util.hh"
#include "watchface-common/watchface-common-internal.hh"
#include "watchface-complication/complication-internal.hh"
-#include "watchface-complication/include/watchface-complication-internal.h"
#include <iostream>
void Complication::Impl::OnAppear(const std::string& name,
const std::string& name_owner) {
LOGI("OnAppear %s ", name.c_str());
+ string cur_name = util::EncodeStr(util::EncodeType::Name, cur_provider_appid_);
+ if (cur_name.compare(name) != 0) {
+ LOGW("It is not current provider (%s)", cur_provider_appid_.c_str());
+ return;
+ }
+ is_provider_ready_ = true;
+ if (is_listening_)
+ parent_->NotifyListeningStart();
}
bool Complication::Impl::IsValidSender(GDBusConnection* connection,
parent_->OnNotifyDataUpdate();
}
-void Complication::Impl::ProviderReadyProcess(GVariant* parameters) {
- char* provider_id;
- g_variant_get(parameters, "(&s)", &provider_id);
- if (strcmp(cur_provider_id_.c_str(), provider_id) != 0) {
- LOGI("It's not mine %s", provider_id);
- return;
- }
-
- is_provider_ready_ = true;
-
- if (listening_status_ == WATCHFACE_COMPLICATION_CONSUMER_LISTENING_START)
- parent_->NotifyListeningStatus(WATCHFACE_COMPLICATION_CONSUMER_LISTENING_START);
- else
- LOGI("Not exist registered callback %s", provider_id);
-}
-
void Complication::Impl::OnSignal(GDBusConnection* connection,
const std::string& sender_name,
const std::string& object_path,
} else if (signal_name.compare(
util::GetCmdStr(util::CompNotifyDataUpdate)) == 0) {
NotifyDataUpdateProcess(parameters);
- } else if (signal_name.compare(
- util::GetCmdStr(util::ProviderReady)) == 0) {
- ProviderReadyProcess(parameters);
}
}
LOGI("subscribe signal %d %d ", subscribe_id_, cur_type_);
}
- is_provider_ready_ = false;
-
return ret;
}
if (ret != WATCHFACE_COMPLICATION_ERROR_NONE)
return ret;
- if (!cur_provider_id_.empty()) {
- parent_->NotifyListeningStatus(WATCHFACE_COMPLICATION_CONSUMER_LISTENING_STOP);
- is_provider_ready_ = false;
- }
+ if (!cur_provider_id_.empty())
+ parent_->NotifyListeningStatus(false);
cur_type_ = type;
cur_provider_id_ = new_provider_id;
return WATCHFACE_COMPLICATION_ERROR_NONE;
}
-void Complication::SetListeningStatus(
- watchface_complication_consumer_status_e state) {
- impl_->listening_status_ = state;
- NotifyListeningStatus(state);
+void Complication::NotifyListeningStart() {
+ LOGI("Listening start(%d)", (int)impl_->is_provider_ready_);
+ impl_->is_listening_ = true;
+ if (impl_->is_provider_ready_)
+ NotifyListeningStatus(impl_->is_listening_);
+}
+
+void Complication::NotifyListeningStop() {
+ LOGI("Listening stop(%d)", (int)impl_->is_provider_ready_);
+ impl_->is_listening_ = false;
+ if (impl_->is_provider_ready_)
+ NotifyListeningStatus(impl_->is_listening_);
}
void Complication::NotifyListeningStatus(
- watchface_complication_consumer_status_e state) {
- if (impl_->is_provider_ready_ == false)
- return;
+ bool is_listening) {
LOGI("emit signal comp_id %d, type %d %d",
- impl_->complication_id_, impl_->cur_type_, state);
+ impl_->complication_id_, impl_->cur_type_, is_listening);
std::string provider_appid = DBManager::GetProviderAppId(
impl_->cur_provider_id_.c_str());
impl_->cur_provider_id_,
-1,
util::GetCmdStr(util::CompNotifyListeningStatus),
- g_variant_new("(sii)",
+ g_variant_new("(siii)",
util::GetAppId().c_str(),
impl_->cur_type_,
- state));
+ impl_->complication_id_,
+ (int)is_listening));
if (!emit_ret)
LOGE("EmitSignal failed %s: %d",
- impl_->cur_provider_id_.c_str(), state);
+ impl_->cur_provider_id_.c_str(), is_listening);
- if (state == WATCHFACE_COMPLICATION_CONSUMER_LISTENING_START)
+ if (is_listening)
SendDataUpdateRequest(false);
LOGI("emit signal done");
#include "watchface-complication/editables-manager.hh"
#include "watchface-common/db-manager.hh"
#include "watchface-common/watchface-exception.hh"
-#include "watchface-complication-provider/include/watchface-complication-provider-internal.h"
namespace watchface_complication {
int ClearPriorityList();
int ClearDeniedList();
int Init();
- void SetListeningStatus(watchface_complication_consumer_status_e state);
- void NotifyListeningStatus(watchface_complication_consumer_status_e state);
+ void NotifyListeningStart();
+ void NotifyListeningStop();
+ void NotifyListeningStatus(bool is_listening);
public:
static const char* GetProviderIdKey();
int AddCallbackInfo(unique_ptr<CallbackInfo> ci) {
for (auto& i : cb_list_) {
- if (i.get()->GetCallback() == ci->GetCallback()) {
- LOGI("already registered callback");
- return WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER;
- }
+ if (i.get()->GetCallback() != ci->GetCallback())
+ continue;
+ LOGI("already registered callback");
+ return WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER;
}
+ if (cb_list_.empty())
+ NotifyListeningStart();
cb_list_.emplace_back(move(ci));
- if (cb_list_.size() == 1)
- SetListeningStatus(WATCHFACE_COMPLICATION_CONSUMER_LISTENING_START);
-
return WATCHFACE_COMPLICATION_ERROR_NONE;
}
int RemoveCallbackInfo(watchface_complication_updated_cb cb) {
for (auto& i : cb_list_) {
- if (i.get()->GetCallback() == cb) {
- cb_list_.remove(i);
+ if (i.get()->GetCallback() != cb)
+ continue;
- if (cb_list_.size() == 0)
- SetListeningStatus(WATCHFACE_COMPLICATION_CONSUMER_LISTENING_STOP);
+ cb_list_.remove(i);
+ if (cb_list_.empty())
+ NotifyListeningStop();
- return WATCHFACE_COMPLICATION_ERROR_NONE;
- }
+ return WATCHFACE_COMPLICATION_ERROR_NONE;
}
return WATCHFACE_COMPLICATION_ERROR_INVALID_PARAMETER;
}