1a69a01cdSopenharmony_ci/*
2a69a01cdSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3a69a01cdSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4a69a01cdSopenharmony_ci * you may not use this file except in compliance with the License.
5a69a01cdSopenharmony_ci * You may obtain a copy of the License at
6a69a01cdSopenharmony_ci *
7a69a01cdSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8a69a01cdSopenharmony_ci *
9a69a01cdSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10a69a01cdSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11a69a01cdSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12a69a01cdSopenharmony_ci * See the License for the specific language governing permissions and
13a69a01cdSopenharmony_ci * limitations under the License.
14a69a01cdSopenharmony_ci */
15a69a01cdSopenharmony_ci
16a69a01cdSopenharmony_ci#include "appswitch_input.h"
17a69a01cdSopenharmony_ci
18a69a01cdSopenharmony_ci#include "input_manager.h"
19a69a01cdSopenharmony_ci#include "report.h"
20a69a01cdSopenharmony_ci#include "wukong_define.h"
21a69a01cdSopenharmony_ci
22a69a01cdSopenharmony_cinamespace OHOS {
23a69a01cdSopenharmony_cinamespace WuKong {
24a69a01cdSopenharmony_ciAppswitchInput::AppswitchInput() : InputAction()
25a69a01cdSopenharmony_ci{
26a69a01cdSopenharmony_ci    std::shared_ptr<MultimodeInputMsg> multimodeInputMsg = std::make_shared<MultimodeInputMsg>();
27a69a01cdSopenharmony_ci    multimodeInputMsg->inputType_ = INPUTTYPE_APPSWITCHINPUT;
28a69a01cdSopenharmony_ci    inputedMsgObject_ = multimodeInputMsg;
29a69a01cdSopenharmony_ci}
30a69a01cdSopenharmony_ci
31a69a01cdSopenharmony_ciAppswitchInput::~AppswitchInput()
32a69a01cdSopenharmony_ci{
33a69a01cdSopenharmony_ci}
34a69a01cdSopenharmony_ci
35a69a01cdSopenharmony_ciErrCode AppswitchInput::OrderInput(const std::shared_ptr<SpcialTestObject>& specialTestObject)
36a69a01cdSopenharmony_ci{
37a69a01cdSopenharmony_ci    AppSwitchParam* appSwitchPtr = static_cast<AppSwitchParam*>(specialTestObject.get());
38a69a01cdSopenharmony_ci    if (appSwitchPtr == nullptr) {
39a69a01cdSopenharmony_ci        return OHOS::ERR_INVALID_VALUE;
40a69a01cdSopenharmony_ci    }
41a69a01cdSopenharmony_ci    std::string bundlename = appSwitchPtr->bundlename_;
42a69a01cdSopenharmony_ci    std::vector<std::string> bundleList(0);
43a69a01cdSopenharmony_ci    std::vector<std::string> abilityList(0);
44a69a01cdSopenharmony_ci    auto util = WuKongUtil::GetInstance();
45a69a01cdSopenharmony_ci    util->GetBundleList(bundleList, abilityList);
46a69a01cdSopenharmony_ci    if (bundleList.size() == 0 || abilityList.size() == 0) {
47a69a01cdSopenharmony_ci        ERROR_LOG_STR("bundleList (%u) or abilityList (%u) is 0", bundleList.size(), abilityList.size());
48a69a01cdSopenharmony_ci        return OHOS::ERR_INVALID_VALUE;
49a69a01cdSopenharmony_ci    }
50a69a01cdSopenharmony_ci    uint32_t index = util->FindElement(bundleList, bundlename);
51a69a01cdSopenharmony_ci    if (index == INVALIDVALUE) {
52a69a01cdSopenharmony_ci        ERROR_LOG("not found bundle");
53a69a01cdSopenharmony_ci        return OHOS::ERR_INVALID_VALUE;
54a69a01cdSopenharmony_ci    }
55a69a01cdSopenharmony_ci
56a69a01cdSopenharmony_ci    // start ability through bundle information
57a69a01cdSopenharmony_ci    ErrCode result = AppManager::GetInstance()->StartAbilityByBundleInfo(abilityList[index], bundleList[index]);
58a69a01cdSopenharmony_ci    // print the result of start event
59a69a01cdSopenharmony_ci    PrintResultOfStartAbility(result, index);
60a69a01cdSopenharmony_ci    usleep(WAIT_TIME);
61a69a01cdSopenharmony_ci    return result;
62a69a01cdSopenharmony_ci}
63a69a01cdSopenharmony_ci
64a69a01cdSopenharmony_ciErrCode AppswitchInput::RandomInput()
65a69a01cdSopenharmony_ci{
66a69a01cdSopenharmony_ci    std::vector<std::string> bundleList(0);
67a69a01cdSopenharmony_ci    std::vector<std::string> abilityList(0);
68a69a01cdSopenharmony_ci    WuKongUtil::GetInstance()->GetBundleList(bundleList, abilityList);
69a69a01cdSopenharmony_ci    if (bundleList.size() == 0 || abilityList.size() == 0) {
70a69a01cdSopenharmony_ci        ERROR_LOG_STR("bundleList (%u) or abilityList (%u) is 0", bundleList.size(), abilityList.size());
71a69a01cdSopenharmony_ci        return OHOS::ERR_INVALID_VALUE;
72a69a01cdSopenharmony_ci    }
73a69a01cdSopenharmony_ci    uint32_t index = GetAbilityIndex(bundleList);
74a69a01cdSopenharmony_ci    if (index == INVALIDVALUE) {
75a69a01cdSopenharmony_ci        ERROR_LOG("not found bundle");
76a69a01cdSopenharmony_ci        return OHOS::ERR_INVALID_VALUE;
77a69a01cdSopenharmony_ci    }
78a69a01cdSopenharmony_ci    // start ability through bundle information
79a69a01cdSopenharmony_ci    ErrCode result = AppManager::GetInstance()->StartAbilityByBundleInfo(abilityList[index], bundleList[index]);
80a69a01cdSopenharmony_ci    // print the result of start event
81a69a01cdSopenharmony_ci    PrintResultOfStartAbility(result, index);
82a69a01cdSopenharmony_ci    TRACK_LOG_STR("bundle index: %d", index);
83a69a01cdSopenharmony_ci    Report::GetInstance()->SyncInputInfo(inputedMsgObject_);
84a69a01cdSopenharmony_ci    return result;
85a69a01cdSopenharmony_ci}
86a69a01cdSopenharmony_ci
87a69a01cdSopenharmony_ciErrCode AppswitchInput::RandomInput(const std::string &uri, const std::string &uriType)
88a69a01cdSopenharmony_ci{
89a69a01cdSopenharmony_ci    ErrCode result = AppManager::GetInstance()->StartAbilityByUriAndType(uri, uriType);
90a69a01cdSopenharmony_ci    Report::GetInstance()->SyncInputInfo(inputedMsgObject_);
91a69a01cdSopenharmony_ci    return result;
92a69a01cdSopenharmony_ci}
93a69a01cdSopenharmony_ci
94a69a01cdSopenharmony_ciErrCode AppswitchInput::RandomInput(const std::string &uri, const std::vector<std::string> &abilityName)
95a69a01cdSopenharmony_ci{
96a69a01cdSopenharmony_ci    ErrCode result = AppManager::GetInstance()->StartAbilityByAbilityAndUri(uri, abilityName);
97a69a01cdSopenharmony_ci    Report::GetInstance()->SyncInputInfo(inputedMsgObject_);
98a69a01cdSopenharmony_ci    return result;
99a69a01cdSopenharmony_ci}
100a69a01cdSopenharmony_ci
101a69a01cdSopenharmony_ciErrCode AppswitchInput::FocusInput(bool shouldScreenCap)
102a69a01cdSopenharmony_ci{
103a69a01cdSopenharmony_ci    return AppswitchInput::RandomInput();
104a69a01cdSopenharmony_ci}
105a69a01cdSopenharmony_ci
106a69a01cdSopenharmony_ciErrCode AppswitchInput::PrintResultOfStartAbility(const ErrCode result, uint32_t index)
107a69a01cdSopenharmony_ci{
108a69a01cdSopenharmony_ci    std::vector<std::string> bundleList;
109a69a01cdSopenharmony_ci    std::vector<std::string> abilityList;
110a69a01cdSopenharmony_ci    WuKongUtil::GetInstance()->GetBundleList(bundleList, abilityList);
111a69a01cdSopenharmony_ci    if (result == OHOS::ERR_OK) {
112a69a01cdSopenharmony_ci        INFO_LOG_STR("Bundle Name: (%s) startup successful", bundleList[index].c_str());
113a69a01cdSopenharmony_ci    } else {
114a69a01cdSopenharmony_ci        INFO_LOG_STR("Bundle Name: (%s) startup failed", bundleList[index].c_str());
115a69a01cdSopenharmony_ci    }
116a69a01cdSopenharmony_ci    return OHOS::ERR_OK;
117a69a01cdSopenharmony_ci}
118a69a01cdSopenharmony_ci
119a69a01cdSopenharmony_ciInputType AppswitchInput::GetInputInfo()
120a69a01cdSopenharmony_ci{
121a69a01cdSopenharmony_ci    return INPUTTYPE_APPSWITCHINPUT;
122a69a01cdSopenharmony_ci}
123a69a01cdSopenharmony_ci
124a69a01cdSopenharmony_ciuint32_t AppswitchInput::GetAbilityIndex(std::vector<std::string>& bundlelist)
125a69a01cdSopenharmony_ci{
126a69a01cdSopenharmony_ci    uint32_t index = INVALIDVALUE;
127a69a01cdSopenharmony_ci    std::vector<std::string> allowlist;
128a69a01cdSopenharmony_ci    std::vector<std::string> validlist;
129a69a01cdSopenharmony_ci    WuKongUtil::GetInstance()->GetAllowList(allowlist);
130a69a01cdSopenharmony_ci    WuKongUtil::GetInstance()->GetValidBundleList(validlist);
131a69a01cdSopenharmony_ci    if (bundlelist.size() > 0) {
132a69a01cdSopenharmony_ci        if (allowlist.size() > 0) {
133a69a01cdSopenharmony_ci            index = WuKongUtil::GetInstance()->FindElement(bundlelist, allowlist.at(rand() % allowlist.size()));
134a69a01cdSopenharmony_ci        } else if (validlist.size() > 0) {
135a69a01cdSopenharmony_ci            index = WuKongUtil::GetInstance()->FindElement(bundlelist, validlist.at(rand() % validlist.size()));
136a69a01cdSopenharmony_ci        } else {
137a69a01cdSopenharmony_ci            index = rand() % bundlelist.size();
138a69a01cdSopenharmony_ci        }
139a69a01cdSopenharmony_ci    }
140a69a01cdSopenharmony_ci    return index;
141a69a01cdSopenharmony_ci}
142a69a01cdSopenharmony_ci}  // namespace WuKong
143a69a01cdSopenharmony_ci}  // namespace OHOS
144