mirror of
https://github.com/openharmony/ability_ability_runtime.git
synced 2026-08-24 22:21:36 -04:00
ConnectWithAccount got unexpected behavior
Signed-off-by: wangzhen <wangzhen346@huawei.com> Change-Id: I1df7233aed9cdc578efe0f8b32f21c820c1c2f04
This commit is contained in:
@@ -395,13 +395,13 @@ ErrCode AbilityContextImpl::ConnectAbilityWithAccount(const AAFwk::Want& want, i
|
||||
}
|
||||
|
||||
void AbilityContextImpl::DisconnectAbility(const AAFwk::Want& want,
|
||||
const sptr<AbilityConnectCallback>& connectCallback)
|
||||
const sptr<AbilityConnectCallback>& connectCallback, int32_t accountId)
|
||||
{
|
||||
HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
|
||||
TAG_LOGD(AAFwkTag::CONTEXT, "DisconnectAbility begin, caller:%{public}s.",
|
||||
abilityInfo_ == nullptr ? "" : abilityInfo_->name.c_str());
|
||||
ErrCode ret =
|
||||
ConnectionManager::GetInstance().DisconnectAbility(token_, want, connectCallback);
|
||||
ConnectionManager::GetInstance().DisconnectAbility(token_, want, connectCallback, accountId);
|
||||
if (ret != ERR_OK) {
|
||||
TAG_LOGE(AAFwkTag::CONTEXT, "error, ret=%{public}d", ret);
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ ErrCode ConnectionManager::ConnectAbilityInner(const sptr<IRemoteObject>& connec
|
||||
std::lock_guard<std::recursive_mutex> lock(connectionsLock_);
|
||||
auto connectionIter = abilityConnections_.begin();
|
||||
for (; connectionIter != abilityConnections_.end(); ++connectionIter) {
|
||||
if (MatchConnection(connectCaller, want, *connectionIter)) {
|
||||
if (MatchConnection(connectCaller, want, accountId, *connectionIter)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -89,9 +89,12 @@ ErrCode ConnectionManager::ConnectAbilityInner(const sptr<IRemoteObject>& connec
|
||||
}
|
||||
|
||||
bool ConnectionManager::MatchConnection(
|
||||
const sptr<IRemoteObject>& connectCaller, const AAFwk::Want& connectReceiver,
|
||||
const sptr<IRemoteObject>& connectCaller, const AAFwk::Want& connectReceiver, int32_t accountId,
|
||||
const std::map<ConnectionInfo, std::vector<sptr<AbilityConnectCallback>>>::value_type& connection)
|
||||
{
|
||||
if (accountId != connection.first.userid) {
|
||||
return false;
|
||||
}
|
||||
if (!connectReceiver.GetElement().GetAbilityName().empty()) {
|
||||
return connectCaller == connection.first.connectCaller &&
|
||||
connectReceiver.GetElement().GetBundleName() == connection.first.connectReceiver.GetBundleName() &&
|
||||
@@ -120,7 +123,7 @@ ErrCode ConnectionManager::CreateConnection(const sptr<IRemoteObject>& connectCa
|
||||
want, abilityConnection, connectCaller, accountId);
|
||||
std::lock_guard<std::recursive_mutex> lock(connectionsLock_);
|
||||
if (ret == ERR_OK) {
|
||||
ConnectionInfo connectionInfo(connectCaller, want.GetOperation(), abilityConnection);
|
||||
ConnectionInfo connectionInfo(connectCaller, want.GetOperation(), abilityConnection, accountId);
|
||||
std::vector<sptr<AbilityConnectCallback>> callbacks;
|
||||
callbacks.push_back(connectCallback);
|
||||
abilityConnections_[connectionInfo] = callbacks;
|
||||
@@ -139,7 +142,8 @@ ErrCode ConnectionManager::DisconnectAbility(const sptr<IRemoteObject>& connectC
|
||||
}
|
||||
|
||||
ErrCode ConnectionManager::DisconnectAbility(const sptr<IRemoteObject>& connectCaller,
|
||||
const AAFwk::Want& connectReceiver, const sptr<AbilityConnectCallback>& connectCallback)
|
||||
const AAFwk::Want& connectReceiver, const sptr<AbilityConnectCallback>& connectCallback,
|
||||
int32_t accountId)
|
||||
{
|
||||
if (connectCaller == nullptr || connectCallback == nullptr) {
|
||||
TAG_LOGE(AAFwkTag::CONNECTION, "connectCaller or connectCallback is nullptr.");
|
||||
@@ -151,8 +155,8 @@ ErrCode ConnectionManager::DisconnectAbility(const sptr<IRemoteObject>& connectC
|
||||
(element.GetBundleName() + ":" + element.GetAbilityName()).c_str());
|
||||
std::lock_guard<std::recursive_mutex> lock(connectionsLock_);
|
||||
auto item = std::find_if(abilityConnections_.begin(), abilityConnections_.end(),
|
||||
[&connectCaller, &connectReceiver, this](const auto& obj) {
|
||||
return MatchConnection(connectCaller, connectReceiver, obj);
|
||||
[&connectCaller, &connectReceiver, this, accountId](const auto& obj) {
|
||||
return MatchConnection(connectCaller, connectReceiver, accountId, obj);
|
||||
});
|
||||
if (item != abilityConnections_.end()) {
|
||||
TAG_LOGD(AAFwkTag::CONNECTION, "remove callback, Size:%{public}zu.", item->second.size());
|
||||
|
||||
@@ -86,7 +86,7 @@ void RemoveConnection(int64_t connectId)
|
||||
}
|
||||
}
|
||||
|
||||
int64_t InsertConnection(sptr<JSAbilityConnection> connection, const AAFwk::Want &want)
|
||||
int64_t InsertConnection(sptr<JSAbilityConnection> connection, const AAFwk::Want &want, int32_t accountId = -1)
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(gConnectsLock_);
|
||||
if (connection == nullptr) {
|
||||
@@ -97,6 +97,7 @@ int64_t InsertConnection(sptr<JSAbilityConnection> connection, const AAFwk::Want
|
||||
ConnectionKey key;
|
||||
key.id = g_serialNumber;
|
||||
key.want = want;
|
||||
key.accountId = accountId;
|
||||
connection->SetConnectionId(key.id);
|
||||
g_connects.emplace(key, connection);
|
||||
if (g_serialNumber < INT32_MAX) {
|
||||
@@ -1236,7 +1237,7 @@ napi_value JsAbilityContext::OnConnectAbilityWithAccount(napi_env env, NapiCallb
|
||||
// unwarp connection
|
||||
sptr<JSAbilityConnection> connection = new JSAbilityConnection(env);
|
||||
connection->SetJsConnectionObject(info.argv[INDEX_TWO]);
|
||||
int64_t connectId = InsertConnection(connection, want);
|
||||
int64_t connectId = InsertConnection(connection, want, accountId);
|
||||
NapiAsyncTask::CompleteCallback complete =
|
||||
[weak = context_, want, accountId, connection, connectId](
|
||||
napi_env env, NapiAsyncTask& task, int32_t status) {
|
||||
@@ -1277,6 +1278,7 @@ napi_value JsAbilityContext::OnDisconnectAbility(napi_env env, NapiCallbackInfo&
|
||||
// unwrap connectId
|
||||
int64_t connectId = -1;
|
||||
sptr<JSAbilityConnection> connection = nullptr;
|
||||
int32_t accountId = -1;
|
||||
napi_get_value_int64(env, info.argv[INDEX_ZERO], &connectId);
|
||||
TAG_LOGI(AAFwkTag::CONTEXT, "DisconnectAbility, connection:%{public}d.", static_cast<int32_t>(connectId));
|
||||
auto item = std::find_if(g_connects.begin(),
|
||||
@@ -1288,12 +1290,13 @@ napi_value JsAbilityContext::OnDisconnectAbility(napi_env env, NapiCallbackInfo&
|
||||
// match id
|
||||
want = item->first.want;
|
||||
connection = item->second;
|
||||
accountId = item->first.accountId;
|
||||
} else {
|
||||
TAG_LOGI(AAFwkTag::CONTEXT, "not find conn exist.");
|
||||
}
|
||||
// begin disconnect
|
||||
NapiAsyncTask::CompleteCallback complete =
|
||||
[weak = context_, want, connection](
|
||||
[weak = context_, want, connection, accountId](
|
||||
napi_env env, NapiAsyncTask& task, int32_t status) {
|
||||
auto context = weak.lock();
|
||||
if (!context) {
|
||||
@@ -1307,7 +1310,7 @@ napi_value JsAbilityContext::OnDisconnectAbility(napi_env env, NapiCallbackInfo&
|
||||
return;
|
||||
}
|
||||
TAG_LOGD(AAFwkTag::CONTEXT, "context->DisconnectAbility");
|
||||
context->DisconnectAbility(want, connection);
|
||||
context->DisconnectAbility(want, connection, accountId);
|
||||
task.Resolve(env, CreateJsUndefined(env));
|
||||
};
|
||||
|
||||
|
||||
@@ -723,7 +723,7 @@ private:
|
||||
if (!CheckStartAbilityWithAccountInputParam(env, info, want, accountId, unwrapArgc)) {
|
||||
return CreateJsUndefined(env);
|
||||
}
|
||||
if (!CheckConnectionParam(env, info.argv[INDEX_TWO], connection, want)) {
|
||||
if (!CheckConnectionParam(env, info.argv[INDEX_TWO], connection, want, accountId)) {
|
||||
ThrowInvalidParamError(env, "Parse param options failed, must be a ConnectOptions");
|
||||
return CreateJsUndefined(env);
|
||||
}
|
||||
@@ -755,7 +755,7 @@ private:
|
||||
}
|
||||
|
||||
bool CheckConnectionParam(napi_env env, napi_value value,
|
||||
sptr<JSServiceExtensionConnection>& connection, AAFwk::Want& want) const
|
||||
sptr<JSServiceExtensionConnection>& connection, AAFwk::Want& want, int32_t accountId = -1) const
|
||||
{
|
||||
if (!CheckTypeForNapiValue(env, value, napi_object)) {
|
||||
TAG_LOGE(AAFwkTag::SERVICE_EXT, "Failed to get connection object");
|
||||
@@ -767,6 +767,7 @@ private:
|
||||
std::lock_guard guard(g_connectsMutex);
|
||||
key.id = g_serialNumber;
|
||||
key.want = want;
|
||||
key.accountId = accountId;
|
||||
connection->SetConnectionId(key.id);
|
||||
g_connects.emplace(key, connection);
|
||||
if (g_serialNumber < INT32_MAX) {
|
||||
@@ -795,10 +796,11 @@ private:
|
||||
|
||||
AAFwk::Want want;
|
||||
sptr<JSServiceExtensionConnection> connection = nullptr;
|
||||
FindConnection(want, connection, connectId);
|
||||
int32_t accountId = -1;
|
||||
FindConnection(want, connection, connectId, accountId);
|
||||
// begin disconnect
|
||||
NapiAsyncTask::CompleteCallback complete =
|
||||
[weak = context_, want, connection](
|
||||
[weak = context_, want, connection, accountId](
|
||||
napi_env env, NapiAsyncTask& task, int32_t status) {
|
||||
auto context = weak.lock();
|
||||
if (!context) {
|
||||
@@ -812,7 +814,7 @@ private:
|
||||
return;
|
||||
}
|
||||
TAG_LOGD(AAFwkTag::SERVICE_EXT, "context->DisconnectAbility");
|
||||
auto innerErrorCode = context->DisconnectAbility(want, connection);
|
||||
auto innerErrorCode = context->DisconnectAbility(want, connection, accountId);
|
||||
if (innerErrorCode == 0) {
|
||||
task.Resolve(env, CreateJsUndefined(env));
|
||||
} else {
|
||||
@@ -827,7 +829,8 @@ private:
|
||||
return result;
|
||||
}
|
||||
|
||||
void FindConnection(AAFwk::Want& want, sptr<JSServiceExtensionConnection>& connection, int64_t& connectId) const
|
||||
void FindConnection(AAFwk::Want& want, sptr<JSServiceExtensionConnection>& connection, int64_t& connectId,
|
||||
int32_t &accountId) const
|
||||
{
|
||||
TAG_LOGI(AAFwkTag::SERVICE_EXT, "Disconnect ability begin, connection:%{public}d.",
|
||||
static_cast<int32_t>(connectId));
|
||||
@@ -841,6 +844,7 @@ private:
|
||||
// match id
|
||||
want = item->first.want;
|
||||
connection = item->second;
|
||||
accountId = item->first.accountId;
|
||||
TAG_LOGD(AAFwkTag::SERVICE_EXT, "find conn ability exist");
|
||||
}
|
||||
return;
|
||||
|
||||
@@ -183,12 +183,12 @@ ErrCode ServiceExtensionContext::ConnectAbilityWithAccount(
|
||||
return ret;
|
||||
}
|
||||
|
||||
ErrCode ServiceExtensionContext::DisconnectAbility(
|
||||
const AAFwk::Want &want, const sptr<AbilityConnectCallback> &connectCallback) const
|
||||
ErrCode ServiceExtensionContext::DisconnectAbility(const AAFwk::Want &want,
|
||||
const sptr<AbilityConnectCallback> &connectCallback, int32_t accountId) const
|
||||
{
|
||||
TAG_LOGD(AAFwkTag::APPKIT, "begin.");
|
||||
ErrCode ret =
|
||||
ConnectionManager::GetInstance().DisconnectAbility(token_, want, connectCallback);
|
||||
ConnectionManager::GetInstance().DisconnectAbility(token_, want, connectCallback, accountId);
|
||||
if (ret != ERR_OK) {
|
||||
TAG_LOGE(AAFwkTag::APPKIT, "%{public}s end DisconnectAbility error, ret=%{public}d", __func__, ret);
|
||||
}
|
||||
|
||||
@@ -198,7 +198,8 @@ public:
|
||||
* @param connectCallback Indicates the callback object when the target ability is connected.
|
||||
* is set up. The IAbilityConnection object uniquely identifies a connection between two abilities.
|
||||
*/
|
||||
virtual void DisconnectAbility(const AAFwk::Want &want, const sptr<AbilityConnectCallback> &connectCallback) = 0;
|
||||
virtual void DisconnectAbility(const AAFwk::Want &want, const sptr<AbilityConnectCallback> &connectCallback,
|
||||
int32_t accountId = -1) = 0;
|
||||
|
||||
/**
|
||||
* @brief get ability info of the current ability
|
||||
|
||||
@@ -84,8 +84,8 @@ public:
|
||||
const sptr<AbilityConnectCallback> &connectCallback) override;
|
||||
ErrCode ConnectAbilityWithAccount(const AAFwk::Want &want, int accountId,
|
||||
const sptr<AbilityConnectCallback> &connectCallback) override;
|
||||
void DisconnectAbility(const AAFwk::Want &want,
|
||||
const sptr<AbilityConnectCallback> &connectCallback) override;
|
||||
void DisconnectAbility(const AAFwk::Want &want, const sptr<AbilityConnectCallback> &connectCallback,
|
||||
int32_t accountId = -1) override;
|
||||
std::shared_ptr<AppExecFwk::HapModuleInfo> GetHapModuleInfo() const override;
|
||||
std::shared_ptr<AppExecFwk::AbilityInfo> GetAbilityInfo() const override;
|
||||
void MinimizeAbility(bool fromUser = false) override;
|
||||
|
||||
@@ -35,14 +35,19 @@ struct ConnectionInfo {
|
||||
// connection
|
||||
sptr<AbilityConnection> abilityConnection;
|
||||
|
||||
int32_t userid;
|
||||
|
||||
ConnectionInfo(const sptr<IRemoteObject> &connectCaller, const AAFwk::Operation &connectReceiver,
|
||||
const sptr<AbilityConnection> &abilityConnection) : connectCaller(connectCaller),
|
||||
connectReceiver(connectReceiver), abilityConnection(abilityConnection)
|
||||
const sptr<AbilityConnection> &abilityConnection, int32_t accountId = -1) : connectCaller(connectCaller),
|
||||
connectReceiver(connectReceiver), abilityConnection(abilityConnection), userid(accountId)
|
||||
{
|
||||
}
|
||||
|
||||
inline bool operator < (const ConnectionInfo &that) const
|
||||
{
|
||||
if (userid < that.userid) {
|
||||
return true;
|
||||
}
|
||||
if (connectCaller < that.connectCaller) {
|
||||
return true;
|
||||
}
|
||||
@@ -128,8 +133,8 @@ public:
|
||||
* @param connectCallback The connection callback.
|
||||
* @return Returns the result of disconnecting ability connection.
|
||||
*/
|
||||
ErrCode DisconnectAbility(const sptr<IRemoteObject> &connectCaller,
|
||||
const AAFwk::Want &connectReceiver, const sptr<AbilityConnectCallback> &connectCallback);
|
||||
ErrCode DisconnectAbility(const sptr<IRemoteObject> &connectCaller, const AAFwk::Want &connectReceiver,
|
||||
const sptr<AbilityConnectCallback> &connectCallback, int32_t accountId = -1);
|
||||
|
||||
/**
|
||||
* @brief check the ability connection of caller is disconnect.
|
||||
@@ -163,7 +168,7 @@ private:
|
||||
bool IsConnectReceiverEqual(AAFwk::Operation &connectReceiver,
|
||||
const AppExecFwk::ElementName &connectReceiverOther);
|
||||
bool MatchConnection(
|
||||
const sptr<IRemoteObject>& connectCaller, const AAFwk::Want& connectReceiver,
|
||||
const sptr<IRemoteObject>& connectCaller, const AAFwk::Want& connectReceiver, int32_t accountId,
|
||||
const std::map<ConnectionInfo, std::vector<sptr<AbilityConnectCallback>>>::value_type& connection);
|
||||
std::recursive_mutex connectionsLock_;
|
||||
std::map<ConnectionInfo, std::vector<sptr<AbilityConnectCallback>>> abilityConnections_;
|
||||
|
||||
@@ -170,6 +170,7 @@ private:
|
||||
struct ConnectionKey {
|
||||
AAFwk::Want want;
|
||||
int64_t id;
|
||||
int32_t accountId;
|
||||
};
|
||||
|
||||
struct KeyCompare {
|
||||
|
||||
@@ -52,6 +52,7 @@ private:
|
||||
struct ConnectionKey {
|
||||
AAFwk::Want want;
|
||||
int64_t id;
|
||||
int32_t accountId;
|
||||
};
|
||||
|
||||
struct key_compare {
|
||||
|
||||
@@ -146,8 +146,8 @@ public:
|
||||
*
|
||||
* @return errCode ERR_OK on success, others on failure.
|
||||
*/
|
||||
ErrCode DisconnectAbility(
|
||||
const AAFwk::Want &want, const sptr<AbilityConnectCallback> &connectCallback) const;
|
||||
ErrCode DisconnectAbility(const AAFwk::Want &want, const sptr<AbilityConnectCallback> &connectCallback,
|
||||
int32_t accountId = -1) const;
|
||||
|
||||
/**
|
||||
* @brief Destroys the current ability.
|
||||
@@ -155,7 +155,7 @@ public:
|
||||
* @return errCode ERR_OK on success, others on failure.
|
||||
*/
|
||||
ErrCode TerminateAbility();
|
||||
|
||||
|
||||
ErrCode RequestModalUIExtension(const Want &want);
|
||||
|
||||
using SelfType = ServiceExtensionContext;
|
||||
|
||||
Reference in New Issue
Block a user