1 /*
2  * Copyright (c) 2021-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_mgr.h"
17 #include "ability_info.h"
18 #include "application_info.h"
19 #include "ability_config.h"
20 using namespace OHOS::AAFwk;
21 
22 namespace OHOS {
23 namespace AppExecFwk {
24 namespace {
25 const int32_t ERROR_USER_ID_U256 = 256;
26 }
27 
QueryWantAbility(const AAFwk::Want & want,std::vector<AbilityInfo> & abilityInfos)28 int BundleMgrProxy::QueryWantAbility(
29     const AAFwk::Want& __attribute__((unused)) want, std::vector<AbilityInfo>& __attribute__((unused)) abilityInfos)
30 {
31     return 0;
32 }
33 
QueryAbilityInfo(const AAFwk::Want & want,AbilityInfo & abilityInfo)34 bool BundleMgrProxy::QueryAbilityInfo(const AAFwk::Want& want, AbilityInfo& abilityInfo)
35 {
36     ElementName eleName = want.GetElement();
37     if (eleName.GetBundleName().empty()) {
38         return false;
39     }
40     abilityInfo.visible = true;
41     abilityInfo.name = eleName.GetAbilityName();
42     abilityInfo.bundleName = eleName.GetBundleName();
43     abilityInfo.applicationName = eleName.GetAbilityName() + "App";
44     if (abilityInfo.bundleName != "com.ix.hiworld") {
45         abilityInfo.applicationInfo.isLauncherApp = false;
46     }
47     return true;
48 }
49 
GetBundleInfo(const std::string & bundleName,const BundleFlag flag,BundleInfo & bundleInfo,int32_t userId)50 bool BundleMgrProxy::GetBundleInfo(
51     const std::string& bundleName, const BundleFlag flag, BundleInfo& bundleInfo, int32_t userId)
52 {
53     return true;
54 }
55 
GetApplicationInfo(const std::string & appName,const ApplicationFlag flag,const int userId,ApplicationInfo & appInfo)56 bool BundleMgrProxy::GetApplicationInfo(
57     const std::string& appName, const ApplicationFlag flag, const int userId, ApplicationInfo& appInfo)
58 {
59     if (appName.empty()) {
60         return false;
61     }
62     appInfo.name = "Helloworld";
63     appInfo.bundleName = "com.ix.hiworld";
64     return true;
65 }
66 
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)67 int BundleMgrStub::OnRemoteRequest(uint32_t code, MessageParcel& data, MessageParcel& reply, MessageOption& option)
68 {
69     return 0;
70 }
71 
GetBundleInfo(const std::string & bundleName,const BundleFlag flag,BundleInfo & bundleInfo,int32_t userId)72 bool BundleMgrService::GetBundleInfo(
73     const std::string& bundleName, const BundleFlag flag, BundleInfo& bundleInfo, int32_t userId)
74 {
75     bundleInfo.uid = 0;
76     return true;
77 }
78 
QueryAbilityInfo(const AAFwk::Want & want,int32_t flags,int32_t userId,AbilityInfo & abilityInfo)79 bool BundleMgrService::QueryAbilityInfo(const AAFwk::Want& want, int32_t flags, int32_t userId,
80     AbilityInfo& abilityInfo)
81 {
82     auto flag = QueryAbilityInfo(want, abilityInfo);
83     if (userId == ERROR_USER_ID_U256) {
84         abilityInfo.applicationInfo.singleton = false;
85     }
86     return flag;
87 }
88 
QueryAbilityInfo(const AAFwk::Want & want,AbilityInfo & abilityInfo)89 bool BundleMgrService::QueryAbilityInfo(const AAFwk::Want& want, AbilityInfo& abilityInfo)
90 {
91     if (CheckWantEntity(want, abilityInfo)) {
92         return true;
93     }
94 
95     ElementName elementTemp = want.GetElement();
96     std::string abilityNameTemp = elementTemp.GetAbilityName();
97     std::string bundleNameTemp = elementTemp.GetBundleName();
98     abilityInfo.deviceId = elementTemp.GetDeviceID();
99     abilityInfo.visible = true;
100 
101     if (bundleNameTemp.empty() || abilityNameTemp.empty()) {
102         return false;
103     }
104 
105     auto fun = abilityInfoMap_.find(bundleNameTemp);
106     if (fun != abilityInfoMap_.end()) {
107         auto call = fun->second;
108         if (call) {
109             call(bundleNameTemp, abilityInfo, elementTemp);
110             return true;
111         }
112     }
113     if (std::string::npos != elementTemp.GetBundleName().find("Service")) {
114         abilityInfo.type = AppExecFwk::AbilityType::SERVICE;
115     }
116     if (std::string::npos != elementTemp.GetBundleName().find("Data")) {
117         abilityInfo.type = AppExecFwk::AbilityType::DATA;
118     }
119     if (std::string::npos != elementTemp.GetBundleName().find("Extension")) {
120         abilityInfo.type = AppExecFwk::AbilityType::EXTENSION;
121     }
122     abilityInfo.name = elementTemp.GetAbilityName();
123     abilityInfo.bundleName = elementTemp.GetBundleName();
124     abilityInfo.applicationName = elementTemp.GetBundleName();
125     abilityInfo.deviceId = elementTemp.GetDeviceID();
126     abilityInfo.applicationInfo.bundleName = elementTemp.GetBundleName();
127     abilityInfo.applicationInfo.name = "hello";
128     if (want.HasEntity(Want::ENTITY_HOME) && want.GetAction() == Want::ACTION_HOME) {
129         abilityInfo.applicationInfo.isLauncherApp = true;
130     } else {
131         abilityInfo.applicationInfo.isLauncherApp = false;
132         abilityInfo.applicationInfo.iconPath = "icon path";
133         abilityInfo.applicationInfo.label = "app label";
134     }
135     return true;
136 }
137 
GetApplicationInfo(const std::string & appName,const ApplicationFlag flag,const int userId,ApplicationInfo & appInfo)138 bool BundleMgrService::GetApplicationInfo(
139     const std::string& appName, const ApplicationFlag flag, const int userId, ApplicationInfo& appInfo)
140 {
141     appInfo.name = appName;
142     appInfo.bundleName = appName;
143     appInfo.uid = userId * BASE_USER_RANGE;
144     return true;
145 }
146 
CheckWantEntity(const AAFwk::Want & want,AbilityInfo & abilityInfo)147 bool BundleMgrService::CheckWantEntity(const AAFwk::Want& want, AbilityInfo& abilityInfo)
148 {
149     auto entityVector = want.GetEntities();
150     ElementName element = want.GetElement();
151 
152     auto find = false;
153     // filter ams onstart
154     for (const auto& entity : entityVector) {
155         if (entity == Want::FLAG_HOME_INTENT_FROM_SYSTEM && element.GetAbilityName().empty() &&
156             element.GetBundleName().empty()) {
157             find = true;
158             break;
159         }
160     }
161 
162     auto bundleName = element.GetBundleName();
163     auto abilityName = element.GetAbilityName();
164     if (find || (bundleName == AbilityConfig::SYSTEM_UI_BUNDLE_NAME &&
165         (abilityName == AbilityConfig::SYSTEM_UI_STATUS_BAR ||
166             abilityName == AbilityConfig::SYSTEM_UI_NAVIGATION_BAR))) {
167         return true;
168     }
169 
170     return false;
171 }
172 
ImplicitQueryInfos(const Want & want,int32_t flags,int32_t userId,bool withDefault,std::vector<AbilityInfo> & abilityInfos,std::vector<ExtensionAbilityInfo> & extensionInfos)173 bool BundleMgrService::ImplicitQueryInfos(const Want& want, int32_t flags, int32_t userId, bool withDefault,
174     std::vector<AbilityInfo>& abilityInfos, std::vector<ExtensionAbilityInfo>& extensionInfos)
175 {
176     if (want.GetAction() == "ohos.want.action.viewData") {
177         auto num = want.GetIntParam("numMock", 0);
178         if (num == 0) {
179             return true;
180         }
181         for (auto i = 0; i < num; i++) {
182             AbilityInfo info;
183             int labelId = 1;
184             int iconId = 1;
185             info.name = "abilitySelector" + std::to_string(i);
186             info.bundleName = "com.test.selector";
187             info.labelId = labelId++;
188             info.iconId = iconId++;
189             abilityInfos.push_back(info);
190         }
191     }
192     return true;
193 }
194 }  // namespace AppExecFwk
195 }  // namespace OHOS
196