1/*
2 * Copyright (C) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include "mock_bundle_manager.h"
17#include <fstream>
18#include <sstream>
19#include <string>
20#include "ability_config.h"
21#include "ability_info.h"
22#include "application_info.h"
23#include "bundle_mgr_client.h"
24#include "hilog_wrapper.h"
25
26using namespace OHOS::AAFwk;
27namespace OHOS {
28namespace {
29    const std::string ACCESSIBLE_ABILITY_JSON_FILE_PAT = "/system/app/dummy_accessibility_ability_config.json";
30} // namespace
31
32namespace AppExecFwk {
33int BundleMgrStub::OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply, MessageOption& option)
34{
35    return 0;
36}
37
38auto HiWordInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
39    abilityInfo.name = elementTemp.GetAbilityName();
40    abilityInfo.bundleName = elementTemp.GetBundleName();
41    abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
42    abilityInfo.applicationName = "Helloworld";
43    abilityInfo.applicationInfo.name = "Helloworld";
44    abilityInfo.type = AbilityType::PAGE;
45    abilityInfo.applicationInfo.isLauncherApp = true;
46    return true;
47};
48
49auto HiMusicInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
50    abilityInfo.name = elementTemp.GetAbilityName();
51    abilityInfo.bundleName = elementTemp.GetBundleName();
52    abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
53    abilityInfo.applicationName = "hiMusic";
54    abilityInfo.applicationInfo.name = "hiMusic";
55    abilityInfo.type = AbilityType::PAGE;
56    abilityInfo.applicationInfo.isLauncherApp = false;
57
58    if (elementTemp.GetAbilityName() == "MusicAbility") {
59        abilityInfo.process = "p1";
60        abilityInfo.launchMode = LaunchMode::STANDARD;
61    }
62    if (elementTemp.GetAbilityName() == "MusicTopAbility") {
63        abilityInfo.process = "p1";
64        abilityInfo.launchMode = LaunchMode::STANDARD;
65    }
66    if (elementTemp.GetAbilityName() == "MusicSAbility") {
67        abilityInfo.process = "p2";
68        abilityInfo.launchMode = LaunchMode::SINGLETON;
69    }
70    return true;
71};
72
73auto HiRadioInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
74    abilityInfo.name = elementTemp.GetAbilityName();
75    abilityInfo.bundleName = elementTemp.GetBundleName();
76    abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
77    abilityInfo.applicationName = "hiRadio";
78    abilityInfo.applicationInfo.name = "hiRadio";
79    abilityInfo.type = AbilityType::PAGE;
80    abilityInfo.process = "p3";
81    if (elementTemp.GetAbilityName() == "RadioAbility") {
82        abilityInfo.launchMode = LaunchMode::STANDARD;
83    }
84    if (elementTemp.GetAbilityName() == "RadioTopAbility") {
85        abilityInfo.launchMode = LaunchMode::SINGLETON;
86    }
87    return true;
88};
89
90auto HiServiceInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
91    abilityInfo.name = elementTemp.GetAbilityName();
92    abilityInfo.bundleName = elementTemp.GetBundleName();
93    abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
94    abilityInfo.applicationName = "hiService";
95    abilityInfo.applicationInfo.name = "hiService";
96    abilityInfo.type = AbilityType::SERVICE;
97    abilityInfo.process = "p4";
98    return true;
99};
100
101auto MusicServiceInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
102    abilityInfo.name = elementTemp.GetAbilityName();
103    abilityInfo.bundleName = elementTemp.GetBundleName();
104    abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
105    abilityInfo.applicationName = "musicService";
106    abilityInfo.applicationInfo.name = "musicService";
107    abilityInfo.type = AbilityType::SERVICE;
108    abilityInfo.process = "p5";
109    return true;
110};
111
112auto HiDataInfo = [](std::string bundleName, AbilityInfo& abilityInfo, ElementName& elementTemp) {
113    abilityInfo.name = elementTemp.GetAbilityName();
114    abilityInfo.bundleName = elementTemp.GetBundleName();
115    abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
116    abilityInfo.applicationName = "hiData";
117    abilityInfo.applicationInfo.name = "hiData";
118    abilityInfo.type = AbilityType::DATA;
119    abilityInfo.process = "p6";
120    return true;
121};
122
123BundleMgrService::BundleMgrService()
124{
125    abilityInfoMap_.emplace(COM_IX_HIWORLD, HiWordInfo);
126    abilityInfoMap_.emplace(COM_IX_HIMUSIC, HiMusicInfo);
127    abilityInfoMap_.emplace(COM_IX_HIRADIO, HiRadioInfo);
128    abilityInfoMap_.emplace(COM_IX_HISERVICE, HiServiceInfo);
129    abilityInfoMap_.emplace(COM_IX_MUSICSERVICE, MusicServiceInfo);
130    abilityInfoMap_.emplace(COM_IX_HIDATA, HiDataInfo);
131}
132
133bool BundleMgrService::GetBundleInfo(
134    const std::string& bundleName, const BundleFlag flag, BundleInfo& bundleInfo, int32_t userId)
135{
136    return true;
137}
138
139bool BundleMgrService::QueryAbilityInfo(const AAFwk::Want& want, AbilityInfo& abilityInfo)
140{
141    HILOG_DEBUG(" mock BundleMgrService QueryAbilityInfo ------------ start");
142    if (CheckWantEntity(want, abilityInfo)) {
143        HILOG_DEBUG(" mock BundleMgrService CheckWantEntity true ------------ start");
144        return true;
145    }
146
147    ElementName elementTemp = want.GetElement();
148    std::string abilityNameTemp = elementTemp.GetAbilityName();
149    std::string bundleNameTemp = elementTemp.GetBundleName();
150    abilityInfo.deviceId = elementTemp.GetDeviceID();
151
152    if (bundleNameTemp.empty() || abilityNameTemp.empty()) {
153        return false;
154    }
155
156    auto fun = abilityInfoMap_.find(bundleNameTemp);
157    if (fun != abilityInfoMap_.end()) {
158        auto call = fun->second;
159        if (call) {
160            call(bundleNameTemp, abilityInfo, elementTemp);
161            return true;
162        }
163    }
164    if (std::string::npos != elementTemp.GetBundleName().find("service")) {
165        abilityInfo.type = AppExecFwk::AbilityType::SERVICE;
166    }
167    abilityInfo.name = elementTemp.GetAbilityName();
168    abilityInfo.bundleName = elementTemp.GetBundleName();
169    abilityInfo.applicationName = elementTemp.GetBundleName();
170    abilityInfo.deviceId = elementTemp.GetDeviceID();
171    abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
172    abilityInfo.applicationInfo.name = "hello";
173    if (want.HasEntity(Want::ENTITY_HOME) && want.GetAction() == Want::ACTION_HOME) {
174        abilityInfo.applicationInfo.isLauncherApp = true;
175    } else {
176        abilityInfo.applicationInfo.isLauncherApp = false;
177        abilityInfo.applicationInfo.iconPath = "icon path";
178        abilityInfo.applicationInfo.label = "app label";
179    }
180    HILOG_DEBUG(" mock BundleMgrService QueryAbilityInfo ------------ end");
181    return true;
182}
183
184bool BundleMgrService::GetApplicationInfo(
185    const std::string& appName, const ApplicationFlag flag, const int userId, ApplicationInfo& appInfo)
186{
187    if (appName.empty()) {
188        return false;
189    }
190    return true;
191}
192
193bool BundleMgrService::CheckWantEntity(const AAFwk::Want& want, AbilityInfo& abilityInfo)
194{
195    HILOG_DEBUG(" mock BundleMgrService QueryAbilityInfo CheckWantEntity ------------ start---------1");
196    auto entityVector = want.GetEntities();
197    ElementName element = want.GetElement();
198    if (entityVector.empty()) {
199        return false;
200    }
201
202    auto find = false;
203    HILOG_DEBUG(" mock BundleMgrService QueryAbilityInfo CheckWantEntity ------------ start---------2");
204    if (std::any_of(entityVector.begin(), entityVector.end(),
205        [element, find](const std::string &entity) {
206            return entity == Want::FLAG_HOME_INTENT_FROM_SYSTEM && element.GetAbilityName().empty() &&
207            element.GetBundleName().empty();
208        })) {
209        find = true;
210    }
211
212    HILOG_DEBUG(" mock BundleMgrService QueryAbilityInfo CheckWantEntity ------------ start---------3");
213    auto bundleName = element.GetBundleName();
214    auto abilityName = element.GetAbilityName();
215    if (find || (bundleName == AbilityConfig::SYSTEM_UI_BUNDLE_NAME &&
216                    (abilityName == AbilityConfig::SYSTEM_UI_STATUS_BAR ||
217                        abilityName == AbilityConfig::SYSTEM_UI_NAVIGATION_BAR))) {
218        GTEST_LOG_(INFO) << "QueryAbilityInfo ++> system luncher, find :" << find;
219        HILOG_DEBUG(" mock BundleMgrService QueryAbilityInfo CheckWantEntity ------------ start---------4");
220        return true;
221    }
222    HILOG_DEBUG(" mock BundleMgrService QueryAbilityInfo CheckWantEntity ------------ start---------5");
223    return false;
224}
225
226BundleMgrClient::BundleMgrClient()
227{}
228
229BundleMgrClient::~BundleMgrClient()
230{}
231
232bool BundleMgrClient::GetResConfigFile(const ExtensionAbilityInfo& extensionInfo, const std::string& metadataName,
233    std::vector<std::string>& profileInfos) const
234{
235    std::ifstream jsonFileStream;
236    jsonFileStream.open(ACCESSIBLE_ABILITY_JSON_FILE_PAT, std::ios::in);
237    if (!jsonFileStream.is_open()) {
238        HILOG_ERROR("Open json file failed.");
239        return false;
240    }
241
242    std::ostringstream buf;
243    char ch;
244    while (buf && jsonFileStream.get(ch)) {
245        buf.put(ch);
246    }
247    jsonFileStream.close();
248
249    profileInfos.push_back(buf.str());
250    return true;
251}
252} // namespace AppExecFwk
253} // namespace OHOS