ConnectWithAccount got unexpected behavior

Signed-off-by: wangzhen <wangzhen346@huawei.com>
Change-Id: I1df7233aed9cdc578efe0f8b32f21c820c1c2f04
This commit is contained in:
wangzhen
2024-05-08 11:20:48 +08:00
parent 1a4679a73a
commit 413971f877
11 changed files with 51 additions and 32 deletions
@@ -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;