From aa03d8aff5342c5420a4480b68084be16267b8d5 Mon Sep 17 00:00:00 2001 From: zhoushicheng Date: Wed, 17 Aug 2022 16:45:51 +0800 Subject: [PATCH] IssueNo:#I5MSQY Signed-off-by: zhoushicheng Change-Id: I690dd40a4d6291d00d2330cf0c18d338612b10b5 --- .../napi/app/app_manager/js_app_manager.cpp | 16 ++--- .../app/app_manager/js_app_state_observer.cpp | 72 ++++++++++++++----- .../app/app_manager/js_app_state_observer.h | 14 ++-- 3 files changed, 66 insertions(+), 36 deletions(-) diff --git a/frameworks/js/napi/app/app_manager/js_app_manager.cpp b/frameworks/js/napi/app/app_manager/js_app_manager.cpp index a76238eadd6..8d26db7addd 100644 --- a/frameworks/js/napi/app/app_manager/js_app_manager.cpp +++ b/frameworks/js/napi/app/app_manager/js_app_manager.cpp @@ -46,7 +46,6 @@ constexpr size_t ARGC_THREE = 3; constexpr int32_t ERR_NOT_OK = -1; std::mutex g_observerMutex; -std::map> g_observerIds; class JsAppManager final { public: @@ -152,8 +151,7 @@ private: HILOG_DEBUG("RegisterApplicationStateObserver success."); std::lock_guard lock(g_observerMutex); int64_t observerId = serialNumber; - g_observerIds.emplace(observerId, observer_); - observer_->SetJsObserverObject(info.argv[INDEX_ZERO]); + observer_->AddJsObserverObject(observerId, info.argv[INDEX_ZERO]); if (serialNumber < INT32_MAX) { serialNumber++; } else { @@ -181,10 +179,9 @@ private: napi_get_value_int64(reinterpret_cast(&engine), reinterpret_cast(info.argv[INDEX_ZERO]), &observerId); std::lock_guard lock(g_observerMutex); - auto item = g_observerIds.find(observerId); - if (item != g_observerIds.end()) { + bool isExist = observer_->FindObserverByObserverId(observerId); + if (isExist) { // match id - observer_ = item->second; HILOG_INFO("%{public}s find observer exist observer:%{public}d", __func__, (int32_t)observerId); } else { HILOG_INFO("%{public}s not find observer, observer:%{public}d", __func__, (int32_t)observerId); @@ -205,12 +202,11 @@ private: return; } int32_t ret = appManager->UnregisterApplicationStateObserver(observer); - if (ret == 0) { + if (ret == 0 && observer->RemoveJsObserverObject(observerId)) { task.Resolve(engine, engine.CreateUndefined()); std::lock_guard lock(g_observerMutex); - g_observerIds.erase(observerId); - observer->Uninit(); - HILOG_DEBUG("UnregisterApplicationStateObserver success size:%{public}zu", g_observerIds.size()); + HILOG_DEBUG("UnregisterApplicationStateObserver success size:%{public}zu", + observer->GetJsObserverMapSize()); } else { HILOG_ERROR("UnregisterApplicationStateObserver failed error:%{public}d", ret); task.Reject(engine, CreateJsError(engine, ret, "UnregisterApplicationStateObserver failed")); diff --git a/frameworks/js/napi/app/app_manager/js_app_state_observer.cpp b/frameworks/js/napi/app/app_manager/js_app_state_observer.cpp index f25817dec33..353e366d05c 100644 --- a/frameworks/js/napi/app/app_manager/js_app_state_observer.cpp +++ b/frameworks/js/napi/app/app_manager/js_app_state_observer.cpp @@ -50,8 +50,12 @@ void JSAppStateObserver::HandleOnForegroundApplicationChanged(const AppStateData { HILOG_DEBUG("HandleOnForegroundApplicationChanged bundleName:%{public}s, uid:%{public}d, state:%{public}d", appStateData.bundleName.c_str(), appStateData.uid, appStateData.state); - NativeValue* argv[] = {CreateJsAppStateData(engine_, appStateData)}; - CallJsFunction("onForegroundApplicationChanged", argv, ARGC_ONE); + auto tmpMap = jsObserverObjectMap_; + for (auto &item : tmpMap) { + NativeValue* value = (item.second)->Get(); + NativeValue* argv[] = {CreateJsAppStateData(engine_, appStateData)}; + CallJsFunction(value, "onForegroundApplicationChanged", argv, ARGC_ONE); + } } void JSAppStateObserver::OnAbilityStateChanged(const AbilityStateData &abilityStateData) @@ -76,8 +80,12 @@ void JSAppStateObserver::OnAbilityStateChanged(const AbilityStateData &abilitySt void JSAppStateObserver::HandleOnAbilityStateChanged(const AbilityStateData &abilityStateData) { HILOG_INFO("HandleOnAbilityStateChanged begin"); - NativeValue* argv[] = {CreateJsAbilityStateData(engine_, abilityStateData)}; - CallJsFunction("onAbilityStateChanged", argv, ARGC_ONE); + auto tmpMap = jsObserverObjectMap_; + for (auto &item : tmpMap) { + NativeValue* value = (item.second)->Get(); + NativeValue* argv[] = {CreateJsAbilityStateData(engine_, abilityStateData)}; + CallJsFunction(value, "onAbilityStateChanged", argv, ARGC_ONE); + } } void JSAppStateObserver::OnExtensionStateChanged(const AbilityStateData &abilityStateData) @@ -102,8 +110,12 @@ void JSAppStateObserver::OnExtensionStateChanged(const AbilityStateData &ability void JSAppStateObserver::HandleOnExtensionStateChanged(const AbilityStateData &abilityStateData) { HILOG_INFO("HandleOnExtensionStateChanged begin"); - NativeValue* argv[] = {CreateJsAbilityStateData(engine_, abilityStateData)}; - CallJsFunction("onAbilityStateChanged", argv, ARGC_ONE); + auto tmpMap = jsObserverObjectMap_; + for (auto &item : tmpMap) { + NativeValue* value = (item.second)->Get(); + NativeValue* argv[] = {CreateJsAbilityStateData(engine_, abilityStateData)}; + CallJsFunction(value, "onAbilityStateChanged", argv, ARGC_ONE); + } } void JSAppStateObserver::OnProcessCreated(const ProcessData &processData) @@ -128,8 +140,12 @@ void JSAppStateObserver::OnProcessCreated(const ProcessData &processData) void JSAppStateObserver::HandleOnProcessCreated(const ProcessData &processData) { HILOG_INFO("HandleOnProcessCreated begin"); - NativeValue* argv[] = {CreateJsProcessData(engine_, processData)}; - CallJsFunction("onProcessCreated", argv, ARGC_ONE); + auto tmpMap = jsObserverObjectMap_; + for (auto &item : tmpMap) { + NativeValue* value = (item.second)->Get(); + NativeValue* argv[] = {CreateJsProcessData(engine_, processData)}; + CallJsFunction(value, "onProcessCreated", argv, ARGC_ONE); + } } void JSAppStateObserver::OnProcessDied(const ProcessData &processData) @@ -154,18 +170,18 @@ void JSAppStateObserver::OnProcessDied(const ProcessData &processData) void JSAppStateObserver::HandleOnProcessDied(const ProcessData &processData) { HILOG_INFO("HandleOnProcessDied begin"); - NativeValue* argv[] = {CreateJsProcessData(engine_, processData)}; - CallJsFunction("onProcessDied", argv, ARGC_ONE); + auto tmpMap = jsObserverObjectMap_; + for (auto &item : tmpMap) { + NativeValue* value = (item.second)->Get(); + NativeValue* argv[] = {CreateJsProcessData(engine_, processData)}; + CallJsFunction(value, "onProcessDied", argv, ARGC_ONE); + } } -void JSAppStateObserver::CallJsFunction(const char *methodName, NativeValue *const *argv, size_t argc) +void JSAppStateObserver::CallJsFunction( + NativeValue* value, const char *methodName, NativeValue *const *argv, size_t argc) { HILOG_INFO("CallJsFunction begin, method:%{public}s", methodName); - if (jsObserverObject_ == nullptr) { - HILOG_ERROR("jsObserverObject_ nullptr"); - return; - } - NativeValue* value = jsObserverObject_->Get(); NativeObject* obj = ConvertNativeValueTo(value); if (obj == nullptr) { HILOG_ERROR("Failed to get object"); @@ -181,9 +197,29 @@ void JSAppStateObserver::CallJsFunction(const char *methodName, NativeValue *con HILOG_INFO("CallJsFunction end"); } -void JSAppStateObserver::SetJsObserverObject(NativeValue* jsObserverObject) +void JSAppStateObserver::AddJsObserverObject(const int32_t observerId, NativeValue* jsObserverObject) +{ + jsObserverObjectMap_.emplace( + observerId, std::shared_ptr(engine_.CreateReference(jsObserverObject, 1))); +} + +bool JSAppStateObserver::RemoveJsObserverObject(const int32_t observerId) +{ + bool result = (jsObserverObjectMap_.erase(observerId) == 1); + return result; +} + +bool JSAppStateObserver::FindObserverByObserverId(const int32_t observerId) +{ + auto item = jsObserverObjectMap_.find(observerId); + bool isExist = (item != jsObserverObjectMap_.end()); + return isExist; +} + +int32_t JSAppStateObserver::GetJsObserverMapSize() { - jsObserverObject_ = std::unique_ptr(engine_.CreateReference(jsObserverObject, 1)); + int32_t length = jsObserverObjectMap_.size(); + return length; } } // namespace AbilityRuntime } // namespace OHOS diff --git a/frameworks/js/napi/app/app_manager/js_app_state_observer.h b/frameworks/js/napi/app/app_manager/js_app_state_observer.h index de675018ae6..4640f611252 100644 --- a/frameworks/js/napi/app/app_manager/js_app_state_observer.h +++ b/frameworks/js/napi/app/app_manager/js_app_state_observer.h @@ -40,17 +40,15 @@ public: void HandleOnExtensionStateChanged(const AbilityStateData &abilityStateData); void HandleOnProcessCreated(const ProcessData &processData); void HandleOnProcessDied(const ProcessData &processData); - void SetJsObserverObject(NativeValue* jsObserverObject); - void CallJsFunction(const char *methodName, NativeValue *const *argv, size_t argc); - - inline void Uninit() - { - jsObserverObject_.reset(); - } + void CallJsFunction(NativeValue* value, const char *methodName, NativeValue *const *argv, size_t argc); + void AddJsObserverObject(const int32_t observerId, NativeValue* jsObserverObject); + bool RemoveJsObserverObject(const int32_t observerId); + bool FindObserverByObserverId(const int32_t observerId); + int32_t GetJsObserverMapSize(); private: NativeEngine& engine_; - std::unique_ptr jsObserverObject_ = nullptr; + std::map> jsObserverObjectMap_; }; } // namespace AbilityRuntime } // namespace OHOS -- Gitee