• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2024 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 "context_deal.h"
17 
18 #include <regex>
19 
20 #include "ability_manager_client.h"
21 #include "ability_manager_interface.h"
22 #include "app_context.h"
23 #include "bundle_mgr_helper.h"
24 #include "constants.h"
25 #include "directory_ex.h"
26 #include "file_ex.h"
27 #include "hilog_tag_wrapper.h"
28 #include "iservice_registry.h"
29 #include "os_account_manager_wrapper.h"
30 #include "sys_mgr_client.h"
31 #include "system_ability_definition.h"
32 
33 #define MODE 0771
34 namespace OHOS {
35 namespace AppExecFwk {
36 using namespace OHOS::AbilityBase::Constants;
37 
38 const std::string ContextDeal::CONTEXT_DEAL_FILE_SEPARATOR("/");
39 const std::string ContextDeal::CONTEXT_DEAL_Files("files");
40 const int64_t ContextDeal::CONTEXT_CREATE_BY_SYSTEM_APP(0x00000001);
41 const std::string ContextDeal::CONTEXT_DATA_STORAGE("/data/storage/");
42 const std::string ContextDeal::CONTEXT_DEAL_DATA_APP("/data/app/");
43 const std::string ContextDeal::CONTEXT_DEAL_BASE("base");
44 const std::string ContextDeal::CONTEXT_DEAL_DATABASE("database");
45 const std::string ContextDeal::CONTEXT_DEAL_PREFERENCES("preferences");
46 const std::string ContextDeal::CONTEXT_DEAL_DATA("data");
47 
ContextDeal(bool isCreateBySystemApp)48 ContextDeal::ContextDeal(bool isCreateBySystemApp) : isCreateBySystemApp_(isCreateBySystemApp)
49 {}
50 
GetApplicationInfo() const51 std::shared_ptr<ApplicationInfo> ContextDeal::GetApplicationInfo() const
52 {
53     return applicationInfo_;
54 }
55 
SetApplicationInfo(const std::shared_ptr<ApplicationInfo> & info)56 void ContextDeal::SetApplicationInfo(const std::shared_ptr<ApplicationInfo> &info)
57 {
58     if (info == nullptr) {
59         TAG_LOGE(AAFwkTag::APPKIT, "null info");
60         return;
61     }
62     applicationInfo_ = info;
63 }
64 
GetApplicationContext() const65 std::shared_ptr<Context> ContextDeal::GetApplicationContext() const
66 {
67     return appContext_;
68 }
69 
SetApplicationContext(const std::shared_ptr<Context> & context)70 void ContextDeal::SetApplicationContext(const std::shared_ptr<Context> &context)
71 {
72     if (context == nullptr) {
73         TAG_LOGE(AAFwkTag::APPKIT, "null context");
74         return;
75     }
76     appContext_ = context;
77 }
78 
GetBundleCodePath()79 std::string ContextDeal::GetBundleCodePath()
80 {
81     if (applicationInfo_ == nullptr) {
82         return "";
83     }
84 
85     std::string dir;
86     if (isCreateBySystemApp_) {
87         dir = std::regex_replace(applicationInfo_->codePath, std::regex(ABS_CODE_PATH), LOCAL_BUNDLES);
88     } else {
89         dir = LOCAL_CODE_PATH;
90     }
91 
92     return dir;
93 }
94 
SetBundleCodePath(std::string & path)95 void ContextDeal::SetBundleCodePath(std::string &path)
96 {
97     path_ = path;
98 }
99 
GetAbilityInfo()100 const std::shared_ptr<AbilityInfo> ContextDeal::GetAbilityInfo()
101 {
102     return abilityInfo_;
103 }
104 
SetAbilityInfo(const std::shared_ptr<AbilityInfo> & info)105 void ContextDeal::SetAbilityInfo(const std::shared_ptr<AbilityInfo> &info)
106 {
107     if (info == nullptr) {
108         TAG_LOGE(AAFwkTag::APPKIT, "null info");
109         return;
110     }
111     abilityInfo_ = info;
112 }
113 
GetContext()114 std::shared_ptr<Context> ContextDeal::GetContext()
115 {
116     return abilityContext_;
117 }
118 
SetContext(const std::shared_ptr<Context> & context)119 void ContextDeal::SetContext(const std::shared_ptr<Context> &context)
120 {
121     if (context == nullptr) {
122         TAG_LOGE(AAFwkTag::APPKIT, "null context");
123         return;
124     }
125     abilityContext_ = context;
126 }
127 
GetBundleManager() const128 std::shared_ptr<BundleMgrHelper> ContextDeal::GetBundleManager() const
129 {
130     auto bundleMgrHelper = DelayedSingleton<BundleMgrHelper>::GetInstance();
131     if (bundleMgrHelper == nullptr) {
132         TAG_LOGE(AAFwkTag::APPKIT, "null bundleMgrHelper");
133         return nullptr;
134     }
135     return bundleMgrHelper;
136 }
137 
GetResourceManager() const138 std::shared_ptr<Global::Resource::ResourceManager> ContextDeal::GetResourceManager() const
139 {
140     return resourceManager_;
141 }
142 
GetDatabaseDir()143 std::string ContextDeal::GetDatabaseDir()
144 {
145     std::string dir;
146     if (IsCreateBySystemApp()) {
147         dir = CONTEXT_DEAL_DATA_APP + currArea_ + CONTEXT_DEAL_FILE_SEPARATOR + std::to_string(GetCurrentAccountId())
148             + CONTEXT_DEAL_FILE_SEPARATOR + CONTEXT_DEAL_DATABASE + CONTEXT_DEAL_FILE_SEPARATOR + GetBundleName();
149     } else {
150         dir = CONTEXT_DATA_STORAGE + currArea_ + CONTEXT_DEAL_FILE_SEPARATOR + CONTEXT_DEAL_DATABASE;
151     }
152     CreateDirIfNotExist(dir);
153     TAG_LOGD(AAFwkTag::APPKIT, "GetDatabaseDir:%{public}s", dir.c_str());
154     return dir;
155 }
156 
GetDataDir()157 std::string ContextDeal::GetDataDir()
158 {
159     std::string dir = GetBaseDir() + CONTEXT_DEAL_FILE_SEPARATOR + CONTEXT_DEAL_DATA;
160     CreateDirIfNotExist(dir);
161     TAG_LOGD(AAFwkTag::APPKIT, "GetDataDir dir = %{public}s", dir.c_str());
162     return dir;
163 }
164 
GetDir(const std::string & name,int mode)165 std::string ContextDeal::GetDir(const std::string &name, int mode)
166 {
167     if (applicationInfo_ == nullptr) {
168         TAG_LOGE(AAFwkTag::APPKIT, "null applicationInfo_");
169         return "";
170     }
171     std::string dir = applicationInfo_->dataDir + CONTEXT_DEAL_FILE_SEPARATOR + name;
172     if (!OHOS::FileExists(dir)) {
173         TAG_LOGI(AAFwkTag::APPKIT, "GetDir File not exits");
174         OHOS::ForceCreateDirectory(dir);
175         OHOS::ChangeModeDirectory(dir, mode);
176     }
177     return dir;
178 }
179 
GetFilesDir()180 std::string ContextDeal::GetFilesDir()
181 {
182     std::string dir = GetBaseDir() + CONTEXT_DEAL_FILE_SEPARATOR + CONTEXT_DEAL_Files;
183     CreateDirIfNotExist(dir);
184     TAG_LOGD(AAFwkTag::APPKIT, "GetFilesDir dir = %{public}s", dir.c_str());
185     return dir;
186 }
187 
GetBundleName() const188 std::string ContextDeal::GetBundleName() const
189 {
190     return (applicationInfo_ != nullptr) ? applicationInfo_->bundleName : "";
191 }
192 
GetBundleResourcePath()193 std::string ContextDeal::GetBundleResourcePath()
194 {
195     if (abilityInfo_ == nullptr) {
196         return "";
197     }
198 
199     std::string dir;
200     if (isCreateBySystemApp_) {
201         dir = std::regex_replace(abilityInfo_->resourcePath, std::regex(ABS_CODE_PATH), LOCAL_BUNDLES);
202     } else {
203         std::regex pattern(std::string(ABS_CODE_PATH) + std::string(FILE_SEPARATOR) + abilityInfo_->bundleName);
204         dir = std::regex_replace(abilityInfo_->resourcePath, pattern, LOCAL_CODE_PATH);
205     }
206     return dir;
207 }
208 
GetAbilityManager()209 sptr<AAFwk::IAbilityManager> ContextDeal::GetAbilityManager()
210 {
211     auto remoteObject = OHOS::DelayedSingleton<SysMrgClient>::GetInstance()->GetSystemAbility(ABILITY_MGR_SERVICE_ID);
212     if (remoteObject == nullptr) {
213         TAG_LOGE(AAFwkTag::APPKIT, "null remoteObject");
214         return nullptr;
215     }
216     sptr<AAFwk::IAbilityManager> ams = iface_cast<AAFwk::IAbilityManager>(remoteObject);
217     return ams;
218 }
219 
GetAppType()220 std::string ContextDeal::GetAppType()
221 {
222     auto ptr = GetBundleManager();
223     if (ptr == nullptr) {
224         TAG_LOGE(AAFwkTag::APPKIT, "null ptr");
225         return "";
226     }
227     std::string retString = ptr->GetAppType(applicationInfo_->bundleName);
228     return retString;
229 }
230 
IsCreateBySystemApp() const231 bool ContextDeal::IsCreateBySystemApp() const
232 {
233     return (static_cast<uint64_t>(flags_) & static_cast<uint64_t>(CONTEXT_CREATE_BY_SYSTEM_APP)) == 1;
234 }
235 
GetCurrentAccountId() const236 int ContextDeal::GetCurrentAccountId() const
237 {
238     int userId = 0;
239     DelayedSingleton<OsAccountManagerWrapper>::GetInstance()->GetOsAccountLocalIdFromProcess(userId);
240     TAG_LOGD(AAFwkTag::APPKIT, "userId: %{public}d", userId);
241     return userId;
242 }
243 
CreateDirIfNotExist(const std::string & dirPath) const244 void ContextDeal::CreateDirIfNotExist(const std::string &dirPath) const
245 {
246     if (!OHOS::FileExists(dirPath)) {
247         TAG_LOGD(AAFwkTag::APPKIT, "CreateDirIfNotExist File is not exits");
248         bool createDir = OHOS::ForceCreateDirectory(dirPath);
249         if (!createDir) {
250             TAG_LOGI(AAFwkTag::APPKIT, "CreateDirIfNotExist: create dir %{public}s failed.", dirPath.c_str());
251             return;
252         }
253     }
254 }
255 
SetPattern(int patternId)256 void ContextDeal::SetPattern(int patternId)
257 {
258     if (resourceManager_ != nullptr) {
259         if (!pattern_.empty()) {
260             pattern_.clear();
261         }
262         OHOS::Global::Resource::RState errval = resourceManager_->GetPatternById(patternId, pattern_);
263         if (errval != OHOS::Global::Resource::RState::SUCCESS) {
264             TAG_LOGE(AAFwkTag::APPKIT, "SetPattern GetPatternById(patternId:%{public}d) retval: %{public}u",
265                      patternId, errval);
266         }
267     } else {
268         TAG_LOGE(AAFwkTag::APPKIT, "null resourceManager_");
269     }
270 }
271 
GetHapModuleInfo()272 std::shared_ptr<HapModuleInfo> ContextDeal::GetHapModuleInfo()
273 {
274     // fix set HapModuleInfoLocal data failed, request only once
275     if (hapModuleInfoLocal_ == nullptr) {
276         HapModuleInfoRequestInit();
277         if (hapModuleInfoLocal_ == nullptr) {
278             TAG_LOGE(AAFwkTag::APPKIT, "null hapModuleInfoLocal_");
279             return nullptr;
280         }
281     }
282     return hapModuleInfoLocal_;
283 }
284 
initResourceManager(const std::shared_ptr<Global::Resource::ResourceManager> & resourceManager)285 void ContextDeal::initResourceManager(const std::shared_ptr<Global::Resource::ResourceManager> &resourceManager)
286 {
287     resourceManager_ = resourceManager;
288 }
289 
GetString(int resId)290 std::string ContextDeal::GetString(int resId)
291 {
292     if (resourceManager_ == nullptr) {
293         TAG_LOGE(AAFwkTag::APPKIT, "null resourceManager_");
294         return "";
295     }
296 
297     std::string ret;
298     OHOS::Global::Resource::RState errval = resourceManager_->GetStringById(resId, ret);
299     if (errval == OHOS::Global::Resource::RState::SUCCESS) {
300         return ret;
301     } else {
302         TAG_LOGE(AAFwkTag::APPKIT, "GetStringById(resId:%{public}d) retval: %{public}u", resId, errval);
303         return "";
304     }
305 }
306 
GetStringArray(int resId)307 std::vector<std::string> ContextDeal::GetStringArray(int resId)
308 {
309     if (resourceManager_ == nullptr) {
310         TAG_LOGE(AAFwkTag::APPKIT, "null resourceManager_");
311         return std::vector<std::string>();
312     }
313 
314     std::vector<std::string> retv;
315     OHOS::Global::Resource::RState errval = resourceManager_->GetStringArrayById(resId, retv);
316     if (errval == OHOS::Global::Resource::RState::SUCCESS) {
317         return retv;
318     } else {
319         TAG_LOGE(AAFwkTag::APPKIT, "GetStringArrayById(resId:%{public}d) retval: %{public}u", resId, errval);
320         return std::vector<std::string>();
321     }
322 }
323 
GetIntArray(int resId)324 std::vector<int> ContextDeal::GetIntArray(int resId)
325 {
326     if (resourceManager_ == nullptr) {
327         TAG_LOGE(AAFwkTag::APPKIT, "null resourceManager_");
328         return std::vector<int>();
329     }
330 
331     std::vector<int> retv;
332     OHOS::Global::Resource::RState errval = resourceManager_->GetIntArrayById(resId, retv);
333     if (errval == OHOS::Global::Resource::RState::SUCCESS) {
334         return retv;
335     } else {
336         TAG_LOGE(AAFwkTag::APPKIT, "GetIntArrayById(resId:%{public}d) retval: %{public}u", resId, errval);
337         return std::vector<int>();
338     }
339 }
340 
GetTheme()341 std::map<std::string, std::string> ContextDeal::GetTheme()
342 {
343     if (theme_.empty()) {
344         SetTheme(GetThemeId());
345     }
346     return theme_;
347 }
348 
SetTheme(int themeId)349 void ContextDeal::SetTheme(int themeId)
350 {
351     if (resourceManager_ == nullptr) {
352         TAG_LOGE(AAFwkTag::APPKIT, "null resourceManager_");
353         return;
354     }
355 
356     auto hapModInfo = GetHapModuleInfo();
357     if (hapModInfo == nullptr) {
358         TAG_LOGE(AAFwkTag::APPKIT, "null hapModInfo");
359         return;
360     }
361 
362     if (!theme_.empty()) {
363         theme_.clear();
364     }
365     OHOS::Global::Resource::RState errval = resourceManager_->GetThemeById(themeId, theme_);
366     if (errval != OHOS::Global::Resource::RState::SUCCESS) {
367         TAG_LOGE(AAFwkTag::APPKIT, "GetThemeById(themeId:%{public}d) retval: %{public}u", themeId, errval);
368     }
369 }
370 
GetPattern()371 std::map<std::string, std::string> ContextDeal::GetPattern()
372 {
373     if (!pattern_.empty()) {
374         return pattern_;
375     } else {
376         TAG_LOGE(AAFwkTag::APPKIT, "pattern_ empty");
377         return std::map<std::string, std::string>();
378     }
379 }
380 
GetColor(int resId)381 int ContextDeal::GetColor(int resId)
382 {
383     if (resourceManager_ == nullptr) {
384         TAG_LOGE(AAFwkTag::APPKIT, "null resourceManager_");
385         return INVALID_RESOURCE_VALUE;
386     }
387 
388     uint32_t ret = INVALID_RESOURCE_VALUE;
389     OHOS::Global::Resource::RState errval = resourceManager_->GetColorById(resId, ret);
390     if (errval == OHOS::Global::Resource::RState::SUCCESS) {
391         return ret;
392     } else {
393         TAG_LOGE(AAFwkTag::APPKIT, "GetColorById(resId:%{public}d) retval: %{public}u", resId, errval);
394         return INVALID_RESOURCE_VALUE;
395     }
396 }
397 
GetThemeId()398 int ContextDeal::GetThemeId()
399 {
400     auto hapModInfo = GetHapModuleInfo();
401     if (hapModInfo != nullptr) {
402         return -1;
403     } else {
404         TAG_LOGE(AAFwkTag::APPKIT, "null hapModInfo");
405         return -1;
406     }
407 }
408 
GetDisplayOrientation()409 int ContextDeal::GetDisplayOrientation()
410 {
411     if (abilityInfo_ != nullptr) {
412         return static_cast<int>(abilityInfo_->orientation);
413     } else {
414         TAG_LOGE(AAFwkTag::APPKIT, "null abilityInfo_");
415         return static_cast<int>(DisplayOrientation::UNSPECIFIED);
416     }
417 }
418 
GetPreferencesDir()419 std::string ContextDeal::GetPreferencesDir()
420 {
421     std::string dir = GetBaseDir() + CONTEXT_DEAL_FILE_SEPARATOR + CONTEXT_DEAL_PREFERENCES;
422     CreateDirIfNotExist(dir);
423     TAG_LOGD(AAFwkTag::APPKIT, "GetPreferencesDir:%{public}s", dir.c_str());
424     return dir;
425 }
426 
SetColorMode(int mode)427 void ContextDeal::SetColorMode(int mode)
428 {
429     auto hapModInfo = GetHapModuleInfo();
430     if (hapModInfo == nullptr) {
431         TAG_LOGE(AAFwkTag::APPKIT, "null hapModInfo");
432         return;
433     }
434 
435     if (mode == static_cast<int>(ModuleColorMode::DARK)) {
436         hapModInfo->colorMode = ModuleColorMode::DARK;
437     } else if (mode == static_cast<int>(ModuleColorMode::LIGHT)) {
438         hapModInfo->colorMode = ModuleColorMode::LIGHT;
439     } else {  // default use AUTO
440         hapModInfo->colorMode = ModuleColorMode::AUTO;
441     }
442 }
443 
GetColorMode()444 int ContextDeal::GetColorMode()
445 {
446     auto hapModInfo = GetHapModuleInfo();
447     if (hapModInfo == nullptr) {
448         TAG_LOGE(AAFwkTag::APPKIT, "null hapModInfo");
449         return -1;
450     }
451     return static_cast<int>(hapModInfo->colorMode);
452 }
453 
454 
HapModuleInfoRequestInit()455 bool ContextDeal::HapModuleInfoRequestInit()
456 {
457     auto ptr = GetBundleManager();
458     if (ptr == nullptr) {
459         TAG_LOGE(AAFwkTag::APPKIT, "null ptr");
460         return false;
461     }
462 
463     if (abilityInfo_ == nullptr) {
464         TAG_LOGE(AAFwkTag::APPKIT, "null abilityInfo_");
465         return false;
466     }
467 
468     hapModuleInfoLocal_ = std::make_shared<HapModuleInfo>();
469     if (!ptr->GetHapModuleInfo(*abilityInfo_.get(), *hapModuleInfoLocal_)) {
470         TAG_LOGE(AAFwkTag::APPKIT, "will retval false");
471         return false;
472     }
473     return true;
474 }
475 
GetBaseDir() const476 std::string ContextDeal::GetBaseDir() const
477 {
478     std::string baseDir;
479     if (IsCreateBySystemApp()) {
480         baseDir = CONTEXT_DEAL_DATA_APP + currArea_ + CONTEXT_DEAL_FILE_SEPARATOR +
481             std::to_string(GetCurrentAccountId()) + CONTEXT_DEAL_FILE_SEPARATOR + CONTEXT_DEAL_BASE +
482             CONTEXT_DEAL_FILE_SEPARATOR + GetBundleName();
483     } else {
484         baseDir = CONTEXT_DATA_STORAGE + currArea_ + CONTEXT_DEAL_FILE_SEPARATOR + CONTEXT_DEAL_BASE;
485     }
486 
487     TAG_LOGD(AAFwkTag::APPKIT, "GetBaseDir:%{public}s", baseDir.c_str());
488     return baseDir;
489 }
490 }  // namespace AppExecFwk
491 }  // namespace OHOS
492