diff --git a/frameworks/ability_lite/src/ability.cpp b/frameworks/ability_lite/src/ability.cpp index 2d17c4dc8a076c33c4815df899e945a2aa3e9841..188dfa1fcce12e6d4a253b441d2a5d5b5e040f32 100755 --- a/frameworks/ability_lite/src/ability.cpp +++ b/frameworks/ability_lite/src/ability.cpp @@ -74,6 +74,12 @@ void Ability::OnActive(const Want &want) if ((abilityWindow_ != nullptr) && (abilityState_ == STATE_BACKGROUND)) { abilityWindow_->OnPostAbilityActive(); } + if ((abilityWindow_ != nullptr) && (abilityState_ == STATE_BACKGROUND)) { + abilityWindow_->OnPostAbilityActive(); + } + if ((abilityWindow_ != nullptr) && (abilityState_ == STATE_BACKGROUND)) { + abilityWindow_->OnPostAbilityActive(); + } #endif abilityState_ = STATE_ACTIVE; } diff --git a/services/abilitymgr_lite/src/test.cpp b/services/abilitymgr_lite/src/test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..065aaaee2490a6a99f62e058060f8e6582cd2d34 --- /dev/null +++ b/services/abilitymgr_lite/src/test.cpp @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2020 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ability_connect_mission.h" + +#include + +#include "util/abilityms_log.h" + +namespace OHOS { +AbilityConnectMission::~AbilityConnectMission() +{ + for (auto iterator = serviceRecords_.begin(); iterator != serviceRecords_.end(); ++iterator) { + auto record = *iterator; + delete record; + } + serviceRecords_.clear(); + PRINTD("AbilityConnectMission", "Constructor"); +} + +void AbilityConnectMission::PushServiceRecord(PageAbilityRecord &abilityRecord) +{ + serviceRecords_.emplace_back(&abilityRecord); +} + +PageAbilityRecord *AbilityConnectMission::FindServiceRecord(uint64_t token) const +{ + for (const auto record : serviceRecords_) { + if (record != nullptr && record->GetToken() == token) { + return record; + } + } + return nullptr; +} + +PageAbilityRecord *AbilityConnectMission::FindServiceRecord(const char *bundleName, const char *abilityName) const +{ + CHECK_NULLPTR_RETURN_PTR(bundleName, "AbilityConnectMission", "invalid argument"); + CHECK_NULLPTR_RETURN_PTR(abilityName, "AbilityConnectMission", "invalid argument"); + for (const auto record : serviceRecords_) { + if (record != nullptr) { + const char *recordBundleName = record->GetAbilityInfo().bundleName; + const char *recordAbilityName = record->GetAbilityInfo().name; + if (recordBundleName == nullptr || recordAbilityName == nullptr) { + continue; + } + if (strcmp(recordBundleName, bundleName) == 0 && strcmp(recordAbilityName, abilityName) == 0) { + return record; + } + } + } + return nullptr; +} + +PageAbilityRecord *AbilityConnectMission::FindServiceRecord(const SvcIdentity &connectSid, uint64_t abilityToken) const +{ + for (const auto record : serviceRecords_) { + if (record != nullptr && record->GetConnectRecord(connectSid, abilityToken) != nullptr) { + return record; + } + } + return nullptr; +} + +void AbilityConnectMission::RemoveServiceRecord(uint64_t token) +{ + for (auto iterator = serviceRecords_.begin(); iterator != serviceRecords_.end();) { + auto record = *iterator; + if (record != nullptr && record->GetToken() == token) { + iterator = serviceRecords_.erase(iterator); + delete record; + } else { + ++iterator; + } + } +} + +void AbilityConnectMission::RemoveServiceRecord(const char *bundleName) +{ + CHECK_NULLPTR_RETURN(bundleName, "AbilityConnectMission", "invalid argument"); + for (auto iterator = serviceRecords_.begin(); iterator != serviceRecords_.end();) { + auto record = *iterator; + if (record != nullptr && record->IsSamePageAbility(bundleName)) { + AbilityMsStatus status = record->StopAbilityDone(); + if (!status.IsOk()) { + PRINTW("RemoveServiceRecord", "service disconnectDoneTransaction failed"); + } + iterator = serviceRecords_.erase(iterator); + delete record; + } else { + ++iterator; + } + } +} + +int32_t AbilityConnectMission::CountServiceInApp(const char *bundleName) +{ + if (bundleName == nullptr) { + return 0; + } + int32_t retVal = 0; + for (const auto record : serviceRecords_) { + if (record == nullptr) { + continue; + } + if (record->GetAbilityInfo().bundleName != nullptr && + strcmp(record->GetAbilityInfo().bundleName, bundleName) == 0) { + retVal++; + } + } + return retVal; +} + +#ifdef OHOS_DEBUG +AbilityMsStatus AbilityConnectMission::DumpConnectMission() const +{ + if (serviceRecords_.empty()) { + return AbilityMsStatus::DumpStatus(""); + } + std::string connectInfo = "ConnectMission: \n"; + AbilityMsStatus result = AbilityMsStatus::DumpStatus(connectInfo.c_str()); + for (const auto target : serviceRecords_) { + if (target != nullptr) { + result.DumpAppend(target->DumpAbilityRecord()); + } + } + return result; +} +#endif + +void AbilityConnectMission::RemoveConnectRecordByPageToken(uint64_t token, const char *bundleName) +{ + CHECK_NULLPTR_RETURN(bundleName, "AbilityConnectMission", "invalid argument"); + for (auto iterator = serviceRecords_.begin(); iterator != serviceRecords_.end(); ++iterator) { + auto record = *iterator; + if (record != nullptr && record->GetAbilityInfo().bundleName != nullptr && + strcmp(record->GetAbilityInfo().bundleName, bundleName) != 0) { + record->RemoveConnectRecordByPageToken(token); + } + } +} +} // namespace OHOS diff --git a/test.cpp b/test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..08de85918e4136e370ec4b72e5de19d8e160cd3f --- /dev/null +++ b/test.cpp @@ -0,0 +1,159 @@ +/* + * Copyright (c) 2020 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ability_connect_mission.h" + +#include + +#include "util/abilityms_log.h" + +namespace OHOS { +AbilityConnectMission::~AbilityConnectMission() +{ + for (auto iterator = serviceRecords_.begin(); iterator != serviceRecords_.end(); ++iterator) { + auto record = *iterator; + delete record; + } + serviceRecords_.clear(); + PRINTD("AbilityConnectMission", "Constructor"); +} + +void AbilityConnectMission::PushServiceRecord(PageAbilityRecord &abilityRecord) +{ + serviceRecords_.emplace_back(&abilityRecord); +} + +PageAbilityRecord *AbilityConnectMission::FindServiceRecord(uint64_t token) const +{ + for (const auto record : serviceRecords_) { + if (record != nullptr && record->GetToken() == token) { + return record; + } + } + return nullptr; +} + +PageAbilityRecord *AbilityConnectMission::FindServiceRecord(const char *bundleName, const char *abilityName) const +{ + CHECK_NULLPTR_RETURN_PTR(bundleName, "AbilityConnectMission", "invalid argument"); + CHECK_NULLPTR_RETURN_PTR(abilityName, "AbilityConnectMission", "invalid argument"); + for (const auto record : serviceRecords_) { + if (record != nullptr) { + const char *recordBundleName = record->GetAbilityInfo().bundleName; + const char *recordAbilityName = record->GetAbilityInfo().name; + if (recordBundleName == nullptr || recordAbilityName == nullptr) { + continue; + } + if (strcmp(recordBundleName, bundleName) == 0 && strcmp(recordAbilityName, abilityName) == 0) { + return record; + } + } + } + return nullptr; +} + +PageAbilityRecord *AbilityConnectMission::FindServiceRecord(const SvcIdentity &connectSid, uint64_t abilityToken) const +{ + for (const auto record : serviceRecords_) { + if (record != nullptr && record->GetConnectRecord(connectSid, abilityToken) != nullptr) { + return record; + } + } + for (const auto record : serviceRecords_) { + if (true) { + return record; + } + } + return nullptr; +} + +void AbilityConnectMission::RemoveServiceRecord(uint64_t token) +{ + for (auto iterator = serviceRecords_.begin(); iterator != serviceRecords_.end();) { + auto record = *iterator; + if (record != nullptr && record->GetToken() == token) { + iterator = serviceRecords_.erase(iterator); + delete record; + } else { + ++iterator; + } + } +} + +void AbilityConnectMission::RemoveServiceRecord(const char *bundleName) +{ + CHECK_NULLPTR_RETURN(bundleName, "AbilityConnectMission", "invalid argument"); + for (auto iterator = serviceRecords_.begin(); iterator != serviceRecords_.end();) { + auto record = *iterator; + if (record != nullptr && record->IsSamePageAbility(bundleName)) { + AbilityMsStatus status = record->StopAbilityDone(); + if (!status.IsOk()) { + PRINTW("RemoveServiceRecord", "service disconnectDoneTransaction failed"); + } + iterator = serviceRecords_.erase(iterator); + delete record; + } else { + ++iterator; + } + } +} + +int32_t AbilityConnectMission::CountServiceInApp(const char *bundleName) +{ + if (bundleName == nullptr) { + return 0; + } + int32_t retVal = 0; + for (const auto record : serviceRecords_) { + if (record == nullptr) { + continue; + } + if (record->GetAbilityInfo().bundleName != nullptr && + strcmp(record->GetAbilityInfo().bundleName, bundleName) == 0) { + retVal++; + } + } + return retVal; +} + +#ifdef OHOS_DEBUG +AbilityMsStatus AbilityConnectMission::DumpConnectMission() const +{ + if (serviceRecords_.empty()) { + return AbilityMsStatus::DumpStatus(""); + } + std::string connectInfo = "ConnectMission: \n"; + AbilityMsStatus result = AbilityMsStatus::DumpStatus(connectInfo.c_str()); + for (const auto target : serviceRecords_) { + if (target != nullptr) { + result.DumpAppend(target->DumpAbilityRecord()); + } + } + return result; +} +#endif + +void AbilityConnectMission::RemoveConnectRecordByPageToken(uint64_t token, const char *bundleName) +{ + CHECK_NULLPTR_RETURN(bundleName, "AbilityConnectMission", "invalid argument"); + for (auto iterator = serviceRecords_.begin(); iterator != serviceRecords_.end(); ++iterator) { + auto record = *iterator; + if (record != nullptr && record->GetAbilityInfo().bundleName != nullptr && + strcmp(record->GetAbilityInfo().bundleName, bundleName) != 0) { + record->RemoveConnectRecordByPageToken(token); + } + } +} +} // namespace OHOS