From 7337d856d8d46b598d33dbd19e2f783804dd648b Mon Sep 17 00:00:00 2001 From: wlh2624 <1968860844@qq.com> Date: Thu, 22 Aug 2024 11:25:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=9A=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wlh2624 <1968860844@qq.com> Change-Id: Ib3afab79eff435deb84ca3713c799f2e83067f25 --- .../include/appmgr/app_mgr_client.h | 2 +- .../include/appmgr/app_mgr_interface.h | 2 +- .../include/appmgr/app_mgr_proxy.h | 2 +- .../app_manager/src/appmgr/app_mgr_client.cpp | 4 +- .../app_manager/src/appmgr/app_mgr_proxy.cpp | 13 ++- .../app_manager/src/appmgr/app_mgr_stub.cpp | 3 +- services/appmgr/include/app_mgr_service.h | 2 +- .../appmgr/include/app_mgr_service_inner.h | 22 +++- services/appmgr/include/app_running_manager.h | 8 +- services/appmgr/include/app_running_record.h | 11 ++ services/appmgr/src/app_mgr_service.cpp | 4 +- services/appmgr/src/app_mgr_service_inner.cpp | 104 ++++++++++-------- services/appmgr/src/app_running_manager.cpp | 26 ++++- services/appmgr/src/app_running_record.cpp | 23 ++++ .../include/mock_app_mgr_service.h | 2 +- .../include/mock_app_mgr_service.h | 2 +- .../app_mgr_service_inner_test.cpp | 14 +-- .../app_scheduler_test/app_mgr_client_mock.h | 2 +- .../app_scheduler_test/app_scheduler_test.cpp | 4 +- .../main_thread_test/main_thread_test.cpp | 2 +- 20 files changed, 166 insertions(+), 86 deletions(-) diff --git a/interfaces/inner_api/app_manager/include/appmgr/app_mgr_client.h b/interfaces/inner_api/app_manager/include/appmgr/app_mgr_client.h index e9d7879d0a..f68a6bfec2 100644 --- a/interfaces/inner_api/app_manager/include/appmgr/app_mgr_client.h +++ b/interfaces/inner_api/app_manager/include/appmgr/app_mgr_client.h @@ -351,7 +351,7 @@ public: * @param config System environment change parameters. * @return Returns ERR_OK on success, others on failure. */ - virtual AppMgrResultCode UpdateConfiguration(const Configuration &config); + virtual AppMgrResultCode UpdateConfiguration(const Configuration &config, const int32_t userId = -1); /** * Update config by bundle name. diff --git a/interfaces/inner_api/app_manager/include/appmgr/app_mgr_interface.h b/interfaces/inner_api/app_manager/include/appmgr/app_mgr_interface.h index 3f0a18d704..5b340bb2a3 100644 --- a/interfaces/inner_api/app_manager/include/appmgr/app_mgr_interface.h +++ b/interfaces/inner_api/app_manager/include/appmgr/app_mgr_interface.h @@ -373,7 +373,7 @@ public: virtual int32_t GetConfiguration(Configuration& config) = 0; - virtual int32_t UpdateConfiguration(const Configuration &config) = 0; + virtual int32_t UpdateConfiguration(const Configuration &config, const int32_t userId = -1) = 0; virtual int32_t UpdateConfigurationByBundleName(const Configuration &config, const std::string &name) = 0; diff --git a/interfaces/inner_api/app_manager/include/appmgr/app_mgr_proxy.h b/interfaces/inner_api/app_manager/include/appmgr/app_mgr_proxy.h index 11a3a6f5fb..f7835b89b3 100644 --- a/interfaces/inner_api/app_manager/include/appmgr/app_mgr_proxy.h +++ b/interfaces/inner_api/app_manager/include/appmgr/app_mgr_proxy.h @@ -377,7 +377,7 @@ public: virtual int32_t GetConfiguration(Configuration& config) override; - virtual int32_t UpdateConfiguration(const Configuration &config) override; + virtual int32_t UpdateConfiguration(const Configuration &config, const int32_t userId = -1) override; virtual int32_t UpdateConfigurationByBundleName(const Configuration &config, const std::string &name) override; diff --git a/interfaces/inner_api/app_manager/src/appmgr/app_mgr_client.cpp b/interfaces/inner_api/app_manager/src/appmgr/app_mgr_client.cpp index 632839f147..9575cc506c 100644 --- a/interfaces/inner_api/app_manager/src/appmgr/app_mgr_client.cpp +++ b/interfaces/inner_api/app_manager/src/appmgr/app_mgr_client.cpp @@ -690,13 +690,13 @@ void AppMgrClient::ScheduleAcceptWantDone(const int32_t recordId, const AAFwk::W service->ScheduleAcceptWantDone(recordId, want, flag); } -AppMgrResultCode AppMgrClient::UpdateConfiguration(const Configuration &config) +AppMgrResultCode AppMgrClient::UpdateConfiguration(const Configuration &config, const int32_t userId) { sptr service = iface_cast(mgrHolder_->GetRemoteObject()); if (service == nullptr) { return AppMgrResultCode::ERROR_SERVICE_NOT_CONNECTED; } - service->UpdateConfiguration(config); + service->UpdateConfiguration(config, userId); return AppMgrResultCode::RESULT_OK; } diff --git a/interfaces/inner_api/app_manager/src/appmgr/app_mgr_proxy.cpp b/interfaces/inner_api/app_manager/src/appmgr/app_mgr_proxy.cpp index b368e5941a..fb8fc580cf 100644 --- a/interfaces/inner_api/app_manager/src/appmgr/app_mgr_proxy.cpp +++ b/interfaces/inner_api/app_manager/src/appmgr/app_mgr_proxy.cpp @@ -840,7 +840,7 @@ int AppMgrProxy::GetRenderProcessTerminationStatus(pid_t renderPid, int &status) return 0; } -int32_t AppMgrProxy::UpdateConfiguration(const Configuration &config) +int32_t AppMgrProxy::UpdateConfiguration(const Configuration &config, const int32_t userId) { TAG_LOGI(AAFwkTag::APPMGR, "AppMgrProxy UpdateConfiguration"); MessageParcel data; @@ -853,6 +853,10 @@ int32_t AppMgrProxy::UpdateConfiguration(const Configuration &config) TAG_LOGE(AAFwkTag::APPMGR, "parcel config failed"); return ERR_INVALID_DATA; } + if (!data.WriteInt32(userId)) { + TAG_LOGE(AAFwkTag::APPMGR, "parcel userId failed"); + return ERR_INVALID_DATA; + } int32_t ret = SendRequest(AppMgrInterfaceCode::UPDATE_CONFIGURATION, data, reply, option); if (ret != NO_ERROR) { TAG_LOGW(AAFwkTag::APPMGR, "SendRequest is failed, error code: %{public}d", ret); @@ -886,7 +890,7 @@ int32_t AppMgrProxy::UpdateConfigurationByBundleName(const Configuration &config return reply.ReadInt32(); } -int32_t AppMgrProxy::GetConfiguration(Configuration &config) +int32_t AppMgrProxy::GetConfiguration(Configuration& config) { MessageParcel data; MessageParcel reply; @@ -910,7 +914,7 @@ int32_t AppMgrProxy::GetConfiguration(Configuration &config) return reply.ReadInt32(); } -int32_t AppMgrProxy::RegisterConfigurationObserver(const sptr &observer) +int32_t AppMgrProxy::RegisterConfigurationObserver(const sptr& observer) { if (!observer) { TAG_LOGE(AAFwkTag::APPMGR, "observer null"); @@ -929,8 +933,7 @@ int32_t AppMgrProxy::RegisterConfigurationObserver(const sptr { public: + struct ConfigurationObserverWithUserId { + sptr observer; + int32_t userId = -1; + }; + struct AppStateCallbackWithUserId { + sptr callback; + int32_t userId = -1; + }; + AppMgrServiceInner(); virtual ~AppMgrServiceInner(); @@ -619,7 +628,7 @@ public: * @param config, System environment change parameters. * @return Returns ERR_OK on success, others on failure. */ - int32_t UpdateConfiguration(const Configuration &config); + int32_t UpdateConfiguration(const Configuration &config, const int32_t userId = -1); int32_t UpdateConfigurationByBundleName(const Configuration &config, const std::string &name); @@ -1489,7 +1498,7 @@ private: void SendReStartProcessEvent(AAFwk::EventInfo &eventInfo, int32_t appUid); void SendAppLaunchEvent(const std::shared_ptr &appRecord); void InitAppWaitingDebugList(); - void HandleConfigurationChange(const Configuration &config); + void HandleConfigurationChange(const Configuration &config, const int32_t userId = -1); bool CheckIsThreadInFoundation(pid_t pid); bool CheckAppFault(const std::shared_ptr &appRecord, const FaultData &faultData); int32_t KillFaultApp(int32_t pid, const std::string &bundleName, const FaultData &faultData, @@ -1505,7 +1514,7 @@ private: void MakeIsolateSandBoxProcessName(const std::shared_ptr &abilityInfo, const HapModuleInfo &hapModuleInfo, std::string &processName) const; const std::string TASK_ON_CALLBACK_DIED = "OnCallbackDiedTask"; - std::vector> appStateCallbacks_; + std::vector appStateCallbacks_; std::shared_ptr remoteClientManager_; std::shared_ptr appRunningManager_; std::shared_ptr taskHandler_; @@ -1518,7 +1527,8 @@ private: ffrt::mutex browserHostLock_; sptr startSpecifiedAbilityResponse_; ffrt::mutex configurationObserverLock_; - std::vector> configurationObservers_; + std::vector configurationObservers_; + #ifdef SUPPORT_SCREEN sptr focusListener_; sptr windowVisibilityChangedListener_; @@ -1548,7 +1558,9 @@ private: std::mutex loadTaskListMutex_; std::vector loadAbilityTaskFuncList_; + + std::shared_ptr multiUserConfigurationMgr_; }; } // namespace AppExecFwk } // namespace OHOS -#endif // OHOS_ABILITY_RUNTIME_APP_MGR_SERVICE_INNER_H \ No newline at end of file +#endif // OHOS_ABILITY_RUNTIME_APP_MGR_SERVICE_INNER_H diff --git a/services/appmgr/include/app_running_manager.h b/services/appmgr/include/app_running_manager.h index 6e8bb3e45c..cd3720edcf 100644 --- a/services/appmgr/include/app_running_manager.h +++ b/services/appmgr/include/app_running_manager.h @@ -41,6 +41,7 @@ namespace Rosen { class WindowVisibilityInfo; } namespace AppExecFwk { + class AppRunningManager { public: AppRunningManager(); @@ -183,7 +184,7 @@ public: * @param config System environment change parameters. * @return Returns ERR_OK on success, others on failure. */ - int32_t UpdateConfiguration(const Configuration &config); + int32_t UpdateConfiguration(const Configuration &config, const int32_t userId = -1); /** * Update config by sa. @@ -346,7 +347,9 @@ public: bool HandleUserRequestClean(const sptr &abilityToken, pid_t &pid, int32_t &uid); -private: + void SetMultiUserConfigurationMgr(const std::shared_ptr& multiUserConfigurationMgr); + + private: std::shared_ptr GetAbilityRunningRecord(const int64_t eventId); int32_t AssignRunningProcessInfoByAppRecord( std::shared_ptr appRecord, AppExecFwk::RunningProcessInfo &info) const; @@ -362,6 +365,7 @@ private: std::shared_ptr configuration_; std::mutex updateConfigurationDelayedLock_; std::map updateConfigurationDelayedMap_; + std::shared_ptr multiUserConfigurationMgr_; }; } // namespace AppExecFwk } // namespace OHOS diff --git a/services/appmgr/include/app_running_record.h b/services/appmgr/include/app_running_record.h index 46aa1a8bd7..b77e319fc8 100644 --- a/services/appmgr/include/app_running_record.h +++ b/services/appmgr/include/app_running_record.h @@ -54,6 +54,17 @@ class AbilityRunningRecord; class AppMgrServiceInner; class AppRunningRecord; +class MultiUserConfigurationMgr { +public: + void Insert(const int32_t userId, const Configuration& config); + + Configuration GetConfigurationByUserId(const int32_t userId); + +private: + std::map multiUserConfiguration_; + std::mutex multiUserConfigurationMutex_; +}; + /** * @class RenderRecord * Record nweb render process info. diff --git a/services/appmgr/src/app_mgr_service.cpp b/services/appmgr/src/app_mgr_service.cpp index 4b5f756de0..6294f24b1b 100644 --- a/services/appmgr/src/app_mgr_service.cpp +++ b/services/appmgr/src/app_mgr_service.cpp @@ -997,14 +997,14 @@ int32_t AppMgrService::GetConfiguration(Configuration& config) return ERR_OK; } -int32_t AppMgrService::UpdateConfiguration(const Configuration& config) +int32_t AppMgrService::UpdateConfiguration(const Configuration& config, const int32_t userId) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); if (!IsReady()) { TAG_LOGE(AAFwkTag::APPMGR, "UpdateConfiguration failed, AppMgrService not ready."); return ERR_INVALID_OPERATION; } - return appMgrServiceInner_->UpdateConfiguration(config); + return appMgrServiceInner_->UpdateConfiguration(config, userId); } int32_t AppMgrService::UpdateConfigurationByBundleName(const Configuration& config, const std::string &name) diff --git a/services/appmgr/src/app_mgr_service_inner.cpp b/services/appmgr/src/app_mgr_service_inner.cpp index 014fd46d66..54e40c8b3f 100644 --- a/services/appmgr/src/app_mgr_service_inner.cpp +++ b/services/appmgr/src/app_mgr_service_inner.cpp @@ -178,8 +178,6 @@ constexpr const char* RENDER_PROCESS_NAME = ":render"; constexpr const char* RENDER_PROCESS_TYPE = "render"; constexpr const char* GPU_PROCESS_NAME = ":gpu"; constexpr const char* GPU_PROCESS_TYPE = "gpu"; -constexpr const char* FONT_WGHT_SCALE = "persist.sys.font_wght_scale_for_user0"; -constexpr const char* FONT_SCALE = "persist.sys.font_scale_for_user0"; constexpr const char* KILL_REASON_USER_REQUEST = "User Request"; const std::string TOKEN_ID = "TOKEN_ID"; const int32_t SIGNAL_KILL = 9; @@ -294,8 +292,11 @@ AppMgrServiceInner::AppMgrServiceInner() appDebugManager_(std::make_shared()), appRunningStatusModule_(std::make_shared()), securityModeManager_(std::make_shared()), - appPreloader_(std::make_shared(remoteClientManager_)) -{} + appPreloader_(std::make_shared(remoteClientManager_)), + multiUserConfigurationMgr_(std::make_shared()) +{ + appRunningManager_->SetMultiUserConfigurationMgr(multiUserConfigurationMgr_); +} void AppMgrServiceInner::Init() { @@ -929,9 +930,9 @@ void AppMgrServiceInner::NotifyAppAttachFailed(std::shared_ptr TAG_LOGI(AAFwkTag::APPMGR, "Attach failed name: %{public}s %{public}zu", appRecord->GetProcessName().c_str(), abilityTokens.size()); std::lock_guard lock(appStateCallbacksLock_); - for (const auto &callback : appStateCallbacks_) { - if (callback != nullptr) { - callback->OnAppRemoteDied(abilityTokens); + for (const auto &item : appStateCallbacks_) { + if (item.callback != nullptr) { + item.callback->OnAppRemoteDied(abilityTokens); } } } @@ -963,6 +964,13 @@ void AppMgrServiceInner::LaunchApplication(const std::shared_ptrGetUid() / BASE_USER_RANGE; userId != 0) { + auto config = multiUserConfigurationMgr_->GetConfigurationByUserId(userId); + std::vector diffVe; + configuration_->CompareDifferent(diffVe, config); + configuration_->Merge(diffVe, config); + } + TAG_LOGD(AAFwkTag::APPMGR, "LaunchApplication configuration:%{public}s", configuration_->GetName().c_str()); appRecord->LaunchApplication(*configuration_); appRecord->SetState(ApplicationState::APP_STATE_READY); int restartResidentProcCount = MAX_RESTART_COUNT; @@ -2245,16 +2253,17 @@ void AppMgrServiceInner::SetBundleManagerHelper(const std::shared_ptrSetBundleManagerHelper(bundleMgrHelper); } -void AppMgrServiceInner::RegisterAppStateCallback(const sptr &callback) +void AppMgrServiceInner::RegisterAppStateCallback(const sptr& callback) { HITRACE_METER_NAME(HITRACE_TAG_APP, __PRETTY_FUNCTION__); if (callback != nullptr) { std::lock_guard lock(appStateCallbacksLock_); - appStateCallbacks_.push_back(callback); + appStateCallbacks_.push_back( + AppStateCallbackWithUserId { callback, GetUserIdByUid(IPCSkeleton::GetCallingUid()) }); auto remoteObjedct = callback->AsObject(); if (remoteObjedct) { - remoteObjedct->AddDeathRecipient(sptr( - new AppStateCallbackDeathRecipient(weak_from_this()))); + remoteObjedct->AddDeathRecipient( + sptr(new AppStateCallbackDeathRecipient(weak_from_this()))); } } } @@ -2269,7 +2278,7 @@ void AppMgrServiceInner::RemoveDeadAppStateCallback(const wptr &r std::lock_guard lock(appStateCallbacksLock_); for (auto it = appStateCallbacks_.begin(); it != appStateCallbacks_.end(); ++it) { - auto callback = *it; + auto callback = (*it).callback; if (callback && callback->AsObject() == remoteObject) { appStateCallbacks_.erase(it); break; @@ -2534,9 +2543,9 @@ void AppMgrServiceInner::OnAppStateChanged( appRecord->GetBundleName().c_str(), static_cast(state)); { std::lock_guard lock(appStateCallbacksLock_); - for (const auto &callback : appStateCallbacks_) { - if (callback != nullptr) { - callback->OnAppStateChanged(WrapAppProcessData(appRecord, state)); + for (const auto &item : appStateCallbacks_) { + if (item.callback != nullptr) { + item.callback->OnAppStateChanged(WrapAppProcessData(appRecord, state)); } } } @@ -2619,9 +2628,9 @@ void AppMgrServiceInner::OnAbilityStateChanged( return; } std::lock_guard lock(appStateCallbacksLock_); - for (const auto &callback : appStateCallbacks_) { - if (callback != nullptr) { - callback->OnAbilityRequestDone(ability->GetToken(), state); + for (const auto &item : appStateCallbacks_) { + if (item.callback != nullptr) { + item.callback->OnAbilityRequestDone(ability->GetToken(), state); } } } @@ -3278,9 +3287,9 @@ void AppMgrServiceInner::OnRemoteDied(const wptr &remote, bool is for (const auto &token : appRecord->GetAbilities()) { abilityTokens.emplace_back(token.first); } - for (const auto &callback : appStateCallbacks_) { - if (callback != nullptr) { - callback->OnAppRemoteDied(abilityTokens); + for (const auto &item : appStateCallbacks_) { + if (item.callback != nullptr) { + item.callback->OnAppRemoteDied(abilityTokens); } } ClearData(appRecord); @@ -4158,8 +4167,11 @@ void AppMgrServiceInner::HandleStartSpecifiedProcessTimeout(const int64_t eventI appRecord->ResetNewProcessRequestId(); } -int32_t AppMgrServiceInner::UpdateConfiguration(const Configuration &config) +int32_t AppMgrServiceInner::UpdateConfiguration(const Configuration &config, const int32_t userId) { + if (userId != -1) { + multiUserConfigurationMgr_->Insert(userId, config); + } HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); if (!appRunningManager_) { TAG_LOGE(AAFwkTag::APPMGR, "appRunningManager_ is null"); @@ -4186,19 +4198,20 @@ int32_t AppMgrServiceInner::UpdateConfiguration(const Configuration &config) configuration_->Merge(changeKeyV, config); } // all app - int32_t result = appRunningManager_->UpdateConfiguration(config); - HandleConfigurationChange(config); + int32_t result = appRunningManager_->UpdateConfiguration(config, userId); + HandleConfigurationChange(config, userId); if (result != ERR_OK) { TAG_LOGE(AAFwkTag::APPMGR, "update error, not notify"); return result; } // notify std::lock_guard notifyLock(configurationObserverLock_); - for (auto &observer : configurationObservers_) { - if (observer != nullptr) { - observer->OnConfigurationUpdated(config); + for (auto &item : configurationObservers_) { + if (item.observer != nullptr && (userId == -1 || item.userId == 0 || item.userId == userId)) { + item.observer->OnConfigurationUpdated(config); } } + return result; } @@ -4221,13 +4234,14 @@ int32_t AppMgrServiceInner::UpdateConfigurationByBundleName(const Configuration return result; } -void AppMgrServiceInner::HandleConfigurationChange(const Configuration &config) +void AppMgrServiceInner::HandleConfigurationChange(const Configuration& config, const int32_t userId) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); std::lock_guard lock(appStateCallbacksLock_); - for (const auto &callback : appStateCallbacks_) { - if (callback != nullptr) { - callback->NotifyConfigurationChange(config, currentUserId_); + + for (const auto &item : appStateCallbacks_) { + if (item.callback != nullptr && (userId == -1 || item.userId == 0 || item.userId == userId)) { + item.callback->NotifyConfigurationChange(config, currentUserId_); } } } @@ -4246,14 +4260,15 @@ int32_t AppMgrServiceInner::RegisterConfigurationObserver(const sptr registerLock(configurationObserverLock_); auto it = std::find_if(configurationObservers_.begin(), configurationObservers_.end(), - [&observer](const sptr &item) { - return (item && item->AsObject() == observer->AsObject()); + [&observer](const ConfigurationObserverWithUserId& item) { + return (item.observer && item.observer->AsObject() == observer->AsObject()); }); if (it != configurationObservers_.end()) { TAG_LOGE(AAFwkTag::APPMGR, "AppMgrServiceInner::Register error: observer exist"); return ERR_INVALID_VALUE; } - configurationObservers_.push_back(observer); + configurationObservers_.push_back( + ConfigurationObserverWithUserId { observer, GetUserIdByUid(IPCSkeleton::GetCallingUid()) }); return NO_ERROR; } @@ -4270,8 +4285,8 @@ int32_t AppMgrServiceInner::UnregisterConfigurationObserver(const sptr unregisterLock(configurationObserverLock_); auto it = std::find_if(configurationObservers_.begin(), configurationObservers_.end(), - [&observer](const sptr &item) { - return (item && item->AsObject() == observer->AsObject()); + [&observer](const ConfigurationObserverWithUserId &item) { + return (item.observer && item.observer->AsObject() == observer->AsObject()); }); if (it != configurationObservers_.end()) { configurationObservers_.erase(it); @@ -4308,12 +4323,8 @@ void AppMgrServiceInner::InitGlobalConfiguration() auto deviceType = GetDeviceType(); TAG_LOGI(AAFwkTag::APPMGR, "current deviceType is %{public}s", deviceType); configuration_->AddItem(AAFwk::GlobalConfigurationKey::DEVICE_TYPE, deviceType); - auto fontSizeScale = OHOS::system::GetParameter(FONT_SCALE, "1.0"); - auto fontWeightScale = OHOS::system::GetParameter(FONT_WGHT_SCALE, "1.0"); - TAG_LOGI(AAFwkTag::APPMGR, "current fontSizeScale is: %{public}s, fontWeightScale is: %{public}s", - fontSizeScale.c_str(), fontWeightScale.c_str()); - configuration_->AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_SIZE_SCALE, fontSizeScale); - configuration_->AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_WEIGHT_SCALE, fontWeightScale); + configuration_->AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_SIZE_SCALE, "1.0"); + configuration_->AddItem(AAFwk::GlobalConfigurationKey::SYSTEM_FONT_WEIGHT_SCALE, "1.0"); } std::shared_ptr AppMgrServiceInner::GetConfiguration() @@ -5088,7 +5099,6 @@ void AppMgrServiceInner::HandleUnfocused(const sptr::GetInstance()->OnProcessStateChanged(appRecord); } - void AppMgrServiceInner::InitWindowVisibilityChangedListener() { TAG_LOGD(AAFwkTag::APPMGR, "Begin."); @@ -7047,9 +7057,9 @@ bool AppMgrServiceInner::IsMemorySizeSufficent() void AppMgrServiceInner::NotifyStartResidentProcess(std::vector &bundleInfos) { std::lock_guard lock(appStateCallbacksLock_); - for (const auto &callback : appStateCallbacks_) { - if (callback != nullptr) { - callback->NotifyStartResidentProcess(bundleInfos); + for (const auto &item : appStateCallbacks_) { + if (item.callback != nullptr) { + item.callback->NotifyStartResidentProcess(bundleInfos); } } } @@ -7515,4 +7525,4 @@ int32_t AppMgrServiceInner::GetSupportedProcessCachePids(const std::string &bund return ERR_OK; } } // namespace AppExecFwk -} // namespace OHOS \ No newline at end of file +} // namespace OHOS diff --git a/services/appmgr/src/app_running_manager.cpp b/services/appmgr/src/app_running_manager.cpp index 7aa18bda3d..0d2e207585 100644 --- a/services/appmgr/src/app_running_manager.cpp +++ b/services/appmgr/src/app_running_manager.cpp @@ -779,8 +779,7 @@ void AppRunningManager::GetForegroundApplications(std::vector &lis } } } - -int32_t AppRunningManager::UpdateConfiguration(const Configuration &config) +int32_t AppRunningManager::UpdateConfiguration(const Configuration& config, const int32_t userId) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); std::vector changeKeyV; @@ -792,12 +791,16 @@ int32_t AppRunningManager::UpdateConfiguration(const Configuration &config) auto appRunningMap = GetAppRunningRecordMap(); TAG_LOGD(AAFwkTag::APPMGR, "current app size %{public}zu", appRunningMap.size()); int32_t result = ERR_OK; - for (const auto &item : appRunningMap) { - const auto &appRecord = item.second; + for (const auto& item : appRunningMap) { + const auto& appRecord = item.second; if (appRecord && appRecord->GetState() == ApplicationState::APP_STATE_CREATE) { TAG_LOGD(AAFwkTag::APPMGR, "app not ready, appName is %{public}s", appRecord->GetBundleName().c_str()); continue; } + if (!(userId == -1 || appRecord->GetUid() / BASE_USER_RANGE == 0 || + appRecord->GetUid() / BASE_USER_RANGE == userId)) { + continue; + } if (appRecord && !isCollaboratorReserveType(appRecord)) { TAG_LOGD(AAFwkTag::APPMGR, "Notification app [%{public}s]", appRecord->GetName().c_str()); std::lock_guard guard(updateConfigurationDelayedLock_); @@ -1619,16 +1622,29 @@ bool AppRunningManager::IsAppProcessesAllCached(const std::string &bundleName, i return true; } -int32_t AppRunningManager::UpdateConfigurationDelayed(const std::shared_ptr &appRecord) +int32_t AppRunningManager::UpdateConfigurationDelayed(const std::shared_ptr& appRecord) { std::lock_guard guard(updateConfigurationDelayedLock_); int32_t result = ERR_OK; auto it = updateConfigurationDelayedMap_.find(appRecord->GetRecordId()); if (it != updateConfigurationDelayedMap_.end() && it->second) { + int32_t userId = appRecord->GetUid() / BASE_USER_RANGE; + if (userId != 0) { + auto config = multiUserConfigurationMgr_->GetConfigurationByUserId(userId); + std::vector diffVe; + configuration_->CompareDifferent(diffVe, config); + configuration_->Merge(diffVe, config); + } result = appRecord->UpdateConfiguration(*configuration_); it->second = false; } return result; } + +void AppRunningManager::SetMultiUserConfigurationMgr( + const std::shared_ptr& multiUserConfigurationMgr) +{ + multiUserConfigurationMgr_ = multiUserConfigurationMgr; +} } // namespace AppExecFwk } // namespace OHOS diff --git a/services/appmgr/src/app_running_record.cpp b/services/appmgr/src/app_running_record.cpp index 4d7132a784..eacbe8be1c 100644 --- a/services/appmgr/src/app_running_record.cpp +++ b/services/appmgr/src/app_running_record.cpp @@ -200,6 +200,29 @@ int32_t RenderRecord::GetState() const return state_; } +void MultiUserConfigurationMgr::Insert(const int32_t userId, const Configuration& config) +{ + std::lock_guard guard(multiUserConfigurationMutex_); + auto it = multiUserConfiguration_.find(userId); + if (it != multiUserConfiguration_.end()) { + std::vector diffVe; + it->second.CompareDifferent(diffVe, config); + it->second.Merge(diffVe, config); + } else { + multiUserConfiguration_[userId] = config; + } +} + +Configuration MultiUserConfigurationMgr::GetConfigurationByUserId(const int32_t userId) +{ + std::lock_guard guard(multiUserConfigurationMutex_); + auto it = multiUserConfiguration_.find(userId); + if (it == multiUserConfiguration_.end()) { + return {}; + } + return it->second; +} + AppRunningRecord::AppRunningRecord( const std::shared_ptr &info, const int32_t recordId, const std::string &processName) : appRecordId_(recordId), processName_(processName) diff --git a/test/mock/frameworks_kits_appkit_test/include/mock_app_mgr_service.h b/test/mock/frameworks_kits_appkit_test/include/mock_app_mgr_service.h index d2e02b3e40..9b908f2baf 100644 --- a/test/mock/frameworks_kits_appkit_test/include/mock_app_mgr_service.h +++ b/test/mock/frameworks_kits_appkit_test/include/mock_app_mgr_service.h @@ -61,7 +61,7 @@ public: MOCK_METHOD1(SaveBrowserChannel, void(sptr browser)); MOCK_METHOD2(GetRenderProcessTerminationStatus, int(pid_t renderPid, int& status)); MOCK_METHOD1(GetConfiguration, int32_t(Configuration& config)); - MOCK_METHOD1(UpdateConfiguration, int32_t(const Configuration& config)); + MOCK_METHOD2(UpdateConfiguration, int32_t(const Configuration& config, const int32_t userId)); MOCK_METHOD1(RegisterConfigurationObserver, int32_t(const sptr& observer)); MOCK_METHOD1(UnregisterConfigurationObserver, int32_t(const sptr& observer)); MOCK_METHOD1(GetAppRunningStateByBundleName, bool(const std::string& bundleName)); diff --git a/test/mock/services_appmgr_test/include/mock_app_mgr_service.h b/test/mock/services_appmgr_test/include/mock_app_mgr_service.h index a8bcb0ef63..4273e86a39 100644 --- a/test/mock/services_appmgr_test/include/mock_app_mgr_service.h +++ b/test/mock/services_appmgr_test/include/mock_app_mgr_service.h @@ -72,7 +72,7 @@ public: void(const int32_t recordId, const AAFwk::Want& want, const std::string& flag)); MOCK_METHOD2(GetAbilityRecordsByProcessID, int(const int pid, std::vector>& tokens)); MOCK_METHOD1(GetConfiguration, int32_t(Configuration& config)); - MOCK_METHOD1(UpdateConfiguration, int32_t(const Configuration& config)); + MOCK_METHOD2(UpdateConfiguration, int32_t(const Configuration& config, const int32_t userId)); MOCK_METHOD2(UpdateConfigurationByBundleName, int32_t(const Configuration& config, const std::string &name)); MOCK_METHOD1(RegisterConfigurationObserver, int32_t(const sptr& observer)); MOCK_METHOD1(UnregisterConfigurationObserver, int32_t(const sptr& observer)); diff --git a/test/unittest/app_mgr_service_inner_test/app_mgr_service_inner_test.cpp b/test/unittest/app_mgr_service_inner_test/app_mgr_service_inner_test.cpp index 983084b41f..5442bb690b 100644 --- a/test/unittest/app_mgr_service_inner_test/app_mgr_service_inner_test.cpp +++ b/test/unittest/app_mgr_service_inner_test/app_mgr_service_inner_test.cpp @@ -1685,11 +1685,11 @@ HWTEST_F(AppMgrServiceInnerTest, OnAppStateChanged_001, TestSize.Level0) sptr mockCallback(new MockAppStateCallback()); EXPECT_CALL(*mockCallback, OnAppStateChanged(_)).Times(2); sptr callback1 = iface_cast(mockCallback); - appMgrServiceInner->appStateCallbacks_.push_back(callback1); + appMgrServiceInner->appStateCallbacks_.push_back({ callback1, 100 }); appMgrServiceInner->OnAppStateChanged(appRecord, ApplicationState::APP_STATE_CREATE, true, false); sptr callback; - appMgrServiceInner->appStateCallbacks_.push_back(callback); + appMgrServiceInner->appStateCallbacks_.push_back({ callback, 100 }); appMgrServiceInner->OnAppStateChanged(appRecord, ApplicationState::APP_STATE_CREATE, true, false); TAG_LOGI(AAFwkTag::TEST, "OnAppStateChanged_001 end"); @@ -1717,11 +1717,11 @@ HWTEST_F(AppMgrServiceInnerTest, OnAbilityStateChanged_001, TestSize.Level0) sptr mockCallback(new MockAppStateCallback()); EXPECT_CALL(*mockCallback, OnAbilityRequestDone(_, _)).Times(2); sptr callback1 = iface_cast(mockCallback); - appMgrServiceInner->appStateCallbacks_.push_back(callback1); + appMgrServiceInner->appStateCallbacks_.push_back({ callback1, 100 }); appMgrServiceInner->OnAbilityStateChanged(abilityRunningRecord, AbilityState::ABILITY_STATE_CREATE); sptr callback; - appMgrServiceInner->appStateCallbacks_.push_back(callback); + appMgrServiceInner->appStateCallbacks_.push_back({ callback, 100 }); appMgrServiceInner->OnAbilityStateChanged(abilityRunningRecord, AbilityState::ABILITY_STATE_CREATE); TAG_LOGI(AAFwkTag::TEST, "OnAbilityStateChanged_001 end"); @@ -2639,10 +2639,10 @@ HWTEST_F(AppMgrServiceInnerTest, UpdateConfiguration_001, TestSize.Level0) appMgrServiceInner->UpdateConfiguration(config); sptr observer(new (std::nothrow) MockConfigurationObserver()); - appMgrServiceInner->configurationObservers_.push_back(observer); + appMgrServiceInner->configurationObservers_.push_back({ observer, 100 }); sptr observer1; - appMgrServiceInner->configurationObservers_.push_back(observer1); - appMgrServiceInner->configurationObservers_.push_back(nullptr); + appMgrServiceInner->configurationObservers_.push_back({ observer1, 100 }); + appMgrServiceInner->configurationObservers_.push_back({ nullptr, 100 }); appMgrServiceInner->UpdateConfiguration(config); appMgrServiceInner->appRunningManager_ = nullptr; diff --git a/test/unittest/app_scheduler_test/app_mgr_client_mock.h b/test/unittest/app_scheduler_test/app_mgr_client_mock.h index 1a70c83c82..9582f06ad3 100755 --- a/test/unittest/app_scheduler_test/app_mgr_client_mock.h +++ b/test/unittest/app_scheduler_test/app_mgr_client_mock.h @@ -50,7 +50,7 @@ public: const AAFwk::Want &want, const sptr &observer, const BundleInfo &bundleInfo, int32_t userId)); MOCK_METHOD3(FinishUserTest, int( const std::string &msg, const int64_t &resultCode, const std::string &bundleName)); - MOCK_METHOD1(UpdateConfiguration, AppMgrResultCode(const Configuration &config)); + MOCK_METHOD2(UpdateConfiguration, AppMgrResultCode(const Configuration &config, const int32_t userId)); MOCK_METHOD1(GetConfiguration, AppMgrResultCode(Configuration& config)); MOCK_METHOD2(GetAbilityRecordsByProcessID, int( const int pid, std::vector> &tokens)); diff --git a/test/unittest/app_scheduler_test/app_scheduler_test.cpp b/test/unittest/app_scheduler_test/app_scheduler_test.cpp index adcfe4b09f..4b6c7ac93f 100644 --- a/test/unittest/app_scheduler_test/app_scheduler_test.cpp +++ b/test/unittest/app_scheduler_test/app_scheduler_test.cpp @@ -973,7 +973,7 @@ HWTEST_F(AppSchedulerTest, AppScheduler_FinishUserTest_002, TestSize.Level1) */ HWTEST_F(AppSchedulerTest, AppScheduler_UpdateConfiguration_001, TestSize.Level1) { - EXPECT_CALL(*clientMock_, UpdateConfiguration(_)).Times(1) + EXPECT_CALL(*clientMock_, UpdateConfiguration(_, _)).Times(1) .WillOnce(Return(AppMgrResultCode::RESULT_OK)); DelayedSingleton::GetInstance()->appMgrClient_ = std::move(clientMock_); AppExecFwk::Configuration config; @@ -991,7 +991,7 @@ HWTEST_F(AppSchedulerTest, AppScheduler_UpdateConfiguration_001, TestSize.Level1 */ HWTEST_F(AppSchedulerTest, AppScheduler_UpdateConfiguration_002, TestSize.Level1) { - EXPECT_CALL(*clientMock_, UpdateConfiguration(_)).Times(1) + EXPECT_CALL(*clientMock_, UpdateConfiguration(_, _)).Times(1) .WillOnce(Return(AppMgrResultCode::ERROR_SERVICE_NOT_READY)); DelayedSingleton::GetInstance()->appMgrClient_ = std::move(clientMock_); AppExecFwk::Configuration config; diff --git a/test/unittest/appkit/main_thread_test/main_thread_test.cpp b/test/unittest/appkit/main_thread_test/main_thread_test.cpp index 006e98ab0b..865cd33101 100644 --- a/test/unittest/appkit/main_thread_test/main_thread_test.cpp +++ b/test/unittest/appkit/main_thread_test/main_thread_test.cpp @@ -215,7 +215,7 @@ class MockAppMgrStub : public AppMgrStub { return 0; } - int32_t UpdateConfiguration(const Configuration &config) override + int32_t UpdateConfiguration(const Configuration &config, const int32_t userId = -1) override { return 0; }