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