180922886Sopenharmony_ci/* 280922886Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 380922886Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 480922886Sopenharmony_ci * you may not use this file except in compliance with the License. 580922886Sopenharmony_ci * You may obtain a copy of the License at 680922886Sopenharmony_ci * 780922886Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 880922886Sopenharmony_ci * 980922886Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1080922886Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1180922886Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1280922886Sopenharmony_ci * See the License for the specific language governing permissions and 1380922886Sopenharmony_ci * limitations under the License. 1480922886Sopenharmony_ci */ 1580922886Sopenharmony_ci 1680922886Sopenharmony_ci#include <thread> 1780922886Sopenharmony_ci#include <chrono> 1880922886Sopenharmony_ci#include <utility> 1980922886Sopenharmony_ci 2080922886Sopenharmony_ci#include "avsession_log.h" 2180922886Sopenharmony_ci#include "app_mgr_constants.h" 2280922886Sopenharmony_ci#include "app_manager_adapter.h" 2380922886Sopenharmony_ci 2480922886Sopenharmony_cinamespace OHOS::AVSession { 2580922886Sopenharmony_ciusing AppExecFwk::AppProcessData; 2680922886Sopenharmony_ciusing AppExecFwk::AppProcessState; 2780922886Sopenharmony_ciusing AppExecFwk::AppMgrResultCode; 2880922886Sopenharmony_ciusing AppExecFwk::RunningProcessInfo; 2980922886Sopenharmony_ciusing AppExecFwk::ApplicationState; 3080922886Sopenharmony_ci 3180922886Sopenharmony_ciAppManagerAdapter::AppManagerAdapter() 3280922886Sopenharmony_ci{ 3380922886Sopenharmony_ci SLOGI("construct"); 3480922886Sopenharmony_ci} 3580922886Sopenharmony_ci 3680922886Sopenharmony_ciAppManagerAdapter::~AppManagerAdapter() 3780922886Sopenharmony_ci{ 3880922886Sopenharmony_ci SLOGI("destroy"); 3980922886Sopenharmony_ci} 4080922886Sopenharmony_ci 4180922886Sopenharmony_ciAppManagerAdapter& AppManagerAdapter::GetInstance() 4280922886Sopenharmony_ci{ 4380922886Sopenharmony_ci static AppManagerAdapter appManagerAdapter; 4480922886Sopenharmony_ci return appManagerAdapter; 4580922886Sopenharmony_ci} 4680922886Sopenharmony_ci 4780922886Sopenharmony_civoid AppManagerAdapter::Init() 4880922886Sopenharmony_ci{ 4980922886Sopenharmony_ci appStateCallback_ = new(std::nothrow) AVSessionAppStateCallback(); 5080922886Sopenharmony_ci if (appStateCallback_ == nullptr) { 5180922886Sopenharmony_ci SLOGE("no memory"); 5280922886Sopenharmony_ci return; 5380922886Sopenharmony_ci } 5480922886Sopenharmony_ci int retryCount = 0; 5580922886Sopenharmony_ci while (retryCount < RETRY_COUNT_MAX) { 5680922886Sopenharmony_ci if (appManager_.RegisterAppStateCallback(appStateCallback_) != AppMgrResultCode::RESULT_OK) { 5780922886Sopenharmony_ci SLOGE("register app state callback failed"); 5880922886Sopenharmony_ci retryCount++; 5980922886Sopenharmony_ci std::this_thread::sleep_for(std::chrono::milliseconds(RETRY_INTERVAL_TIME)); 6080922886Sopenharmony_ci continue; 6180922886Sopenharmony_ci } 6280922886Sopenharmony_ci break; 6380922886Sopenharmony_ci } 6480922886Sopenharmony_ci} 6580922886Sopenharmony_ci 6680922886Sopenharmony_cibool AppManagerAdapter::IsAppBackground(int32_t uid, int32_t pid) 6780922886Sopenharmony_ci{ 6880922886Sopenharmony_ci std::vector<RunningProcessInfo> infos; 6980922886Sopenharmony_ci if (appManager_.GetAllRunningProcesses(infos) != AppMgrResultCode::RESULT_OK) { 7080922886Sopenharmony_ci SLOGE("get all running processes info failed"); 7180922886Sopenharmony_ci return false; 7280922886Sopenharmony_ci } 7380922886Sopenharmony_ci for (const auto& info : infos) { 7480922886Sopenharmony_ci if (info.uid_ == uid && info.pid_ == pid && info.state_ == AppProcessState::APP_STATE_BACKGROUND) { 7580922886Sopenharmony_ci SLOGI("uid=%{public}d pid=%{public}d is background", uid, pid); 7680922886Sopenharmony_ci return true; 7780922886Sopenharmony_ci } 7880922886Sopenharmony_ci } 7980922886Sopenharmony_ci SLOGD("uid=%{public}d pid=%{public}d is not background", uid, pid); 8080922886Sopenharmony_ci return false; 8180922886Sopenharmony_ci} 8280922886Sopenharmony_ci 8380922886Sopenharmony_civoid AppManagerAdapter::SetAppStateChangeObserver(const std::function<void(int32_t, int32_t, bool)>& observer) 8480922886Sopenharmony_ci{ 8580922886Sopenharmony_ci appStateChangeObserver_ = observer; 8680922886Sopenharmony_ci} 8780922886Sopenharmony_ci 8880922886Sopenharmony_ci// LCOV_EXCL_START 8980922886Sopenharmony_civoid AppManagerAdapter::AddObservedApp(int32_t uid) 9080922886Sopenharmony_ci{ 9180922886Sopenharmony_ci std::lock_guard lockGuard(uidLock_); 9280922886Sopenharmony_ci SLOGD("add for uid=%{public}d", uid); 9380922886Sopenharmony_ci observedAppUIDs_.insert(uid); 9480922886Sopenharmony_ci} 9580922886Sopenharmony_ci// LCOV_EXCL_STOP 9680922886Sopenharmony_ci 9780922886Sopenharmony_civoid AppManagerAdapter::RemoveObservedApp(int32_t uid) 9880922886Sopenharmony_ci{ 9980922886Sopenharmony_ci std::lock_guard lockGuard(uidLock_); 10080922886Sopenharmony_ci SLOGD("RemoveObservedApp for uid=%{public}d", uid); 10180922886Sopenharmony_ci observedAppUIDs_.erase(uid); 10280922886Sopenharmony_ci} 10380922886Sopenharmony_ci 10480922886Sopenharmony_civoid AppManagerAdapter::SetServiceCallbackForAppStateChange(const std::function<void(int uid, int state)>& callback) 10580922886Sopenharmony_ci{ 10680922886Sopenharmony_ci serviceCallbackForAppStateChange_ = callback; 10780922886Sopenharmony_ci} 10880922886Sopenharmony_ci 10980922886Sopenharmony_ci// LCOV_EXCL_START 11080922886Sopenharmony_civoid AppManagerAdapter::HandleAppStateChanged(const AppProcessData& appProcessData) 11180922886Sopenharmony_ci{ 11280922886Sopenharmony_ci { 11380922886Sopenharmony_ci std::lock_guard lockGuard(uidLock_); 11480922886Sopenharmony_ci if (appProcessData.appState == ApplicationState::APP_STATE_FOREGROUND || 11580922886Sopenharmony_ci appProcessData.appState == ApplicationState::APP_STATE_BACKGROUND) { 11680922886Sopenharmony_ci for (const auto& appData : appProcessData.appDatas) { 11780922886Sopenharmony_ci serviceCallbackForAppStateChange_(appData.uid, static_cast<int>(appProcessData.appState)); 11880922886Sopenharmony_ci } 11980922886Sopenharmony_ci } 12080922886Sopenharmony_ci } 12180922886Sopenharmony_ci if (appProcessData.appState == ApplicationState::APP_STATE_TERMINATED) { 12280922886Sopenharmony_ci for (const auto& appData : appProcessData.appDatas) { 12380922886Sopenharmony_ci SLOGI("HandleAppStateChanged remove for uid=%{public}d", static_cast<int>(appData.uid)); 12480922886Sopenharmony_ci RemoveObservedApp(appData.uid); 12580922886Sopenharmony_ci } 12680922886Sopenharmony_ci } 12780922886Sopenharmony_ci 12880922886Sopenharmony_ci std::set<std::pair<int32_t, int32_t>> appNeedHandleMap; 12980922886Sopenharmony_ci { 13080922886Sopenharmony_ci std::lock_guard lockGuard(uidLock_); 13180922886Sopenharmony_ci for (const auto& appData : appProcessData.appDatas) { 13280922886Sopenharmony_ci SLOGI("bundleName=%{public}s uid=%{public}d pid=%{public}d state=%{public}d", 13380922886Sopenharmony_ci appData.appName.c_str(), appData.uid, appProcessData.pid, appProcessData.appState); 13480922886Sopenharmony_ci auto it = observedAppUIDs_.find(appData.uid); 13580922886Sopenharmony_ci if (it == observedAppUIDs_.end()) { 13680922886Sopenharmony_ci continue; 13780922886Sopenharmony_ci } 13880922886Sopenharmony_ci appNeedHandleMap.insert(std::make_pair(appData.uid, appProcessData.pid)); 13980922886Sopenharmony_ci } 14080922886Sopenharmony_ci } 14180922886Sopenharmony_ci 14280922886Sopenharmony_ci if (appProcessData.appState == ApplicationState::APP_STATE_BACKGROUND) { 14380922886Sopenharmony_ci if (appStateChangeObserver_) { 14480922886Sopenharmony_ci for (const auto& pair : appNeedHandleMap) { 14580922886Sopenharmony_ci appStateChangeObserver_(pair.first, pair.second, true); 14680922886Sopenharmony_ci } 14780922886Sopenharmony_ci } 14880922886Sopenharmony_ci } else { 14980922886Sopenharmony_ci if (appStateChangeObserver_) { 15080922886Sopenharmony_ci for (const auto& pair : appNeedHandleMap) { 15180922886Sopenharmony_ci appStateChangeObserver_(pair.first, pair.second, false); 15280922886Sopenharmony_ci } 15380922886Sopenharmony_ci } 15480922886Sopenharmony_ci } 15580922886Sopenharmony_ci} 15680922886Sopenharmony_ci// LCOV_EXCL_STOP 15780922886Sopenharmony_ci 15880922886Sopenharmony_civoid AVSessionAppStateCallback::OnAppStateChanged(const AppExecFwk::AppProcessData& appProcessData) 15980922886Sopenharmony_ci{ 16080922886Sopenharmony_ci AppManagerAdapter::GetInstance().HandleAppStateChanged(appProcessData); 16180922886Sopenharmony_ci} 16280922886Sopenharmony_ci} 163