1 /*
2  * Copyright (c) 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 "scene_board/status_bar_delegate_manager.h"
17 
18 #include "ability_util.h"
19 #include "hitrace_meter.h"
20 #include "process_options.h"
21 
22 namespace OHOS {
23 namespace AAFwk {
RegisterStatusBarDelegate(sptr<AbilityRuntime::IStatusBarDelegate> delegate)24 int32_t StatusBarDelegateManager::RegisterStatusBarDelegate(sptr<AbilityRuntime::IStatusBarDelegate> delegate)
25 {
26     std::lock_guard<ffrt::mutex> lock(statusBarDelegateMutex_);
27     statusBarDelegate_ = delegate;
28     return ERR_OK;
29 }
30 
GetStatusBarDelegate()31 sptr<AbilityRuntime::IStatusBarDelegate> StatusBarDelegateManager::GetStatusBarDelegate()
32 {
33     std::lock_guard<ffrt::mutex> lock(statusBarDelegateMutex_);
34     return statusBarDelegate_;
35 }
36 
IsCallerInStatusBar()37 bool StatusBarDelegateManager::IsCallerInStatusBar()
38 {
39     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
40     auto statusBarDelegate = GetStatusBarDelegate();
41     CHECK_POINTER_AND_RETURN(statusBarDelegate, false);
42     auto callingTokenId = IPCSkeleton::GetCallingTokenID();
43     bool isExist = false;
44     auto ret = statusBarDelegate->CheckIfStatusBarItemExists(callingTokenId, isExist);
45     if (ret != ERR_OK) {
46         TAG_LOGE(AAFwkTag::ABILITYMGR, "CheckIfStatusBarItemExists failed, ret: %{public}d", ret);
47         return false;
48     }
49     TAG_LOGI(AAFwkTag::ABILITYMGR, "isExist: %{public}d", isExist);
50     return isExist;
51 }
52 
DoProcessAttachment(std::shared_ptr<AbilityRecord> abilityRecord)53 int32_t StatusBarDelegateManager::DoProcessAttachment(std::shared_ptr<AbilityRecord> abilityRecord)
54 {
55     HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
56     CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
57     auto sessionInfo = abilityRecord->GetSessionInfo();
58     CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
59     auto processOptions = sessionInfo->processOptions;
60     if (processOptions == nullptr) {
61         TAG_LOGD(AAFwkTag::ABILITYMGR, "no need to attach process.");
62         return ERR_OK;
63     }
64     if (processOptions->processMode == ProcessMode::NEW_PROCESS_ATTACH_TO_PARENT) {
65         auto callerRecord = abilityRecord->GetCallerRecord();
66         CHECK_POINTER_AND_RETURN(callerRecord, ERR_INVALID_VALUE);
67         TAG_LOGI(AAFwkTag::ABILITYMGR, "attach pid to parent.");
68         IN_PROCESS_CALL_WITHOUT_RET(DelayedSingleton<AppScheduler>::GetInstance()->AttachPidToParent(
69             abilityRecord->GetToken(), callerRecord->GetToken()));
70     }
71     if (ProcessOptions::IsAttachToStatusBarMode(processOptions->processMode)) {
72         auto statusBarDelegate = GetStatusBarDelegate();
73         CHECK_POINTER_AND_RETURN(statusBarDelegate, ERR_INVALID_VALUE);
74         auto accessTokenId = abilityRecord->GetApplicationInfo().accessTokenId;
75         auto ret = statusBarDelegate->AttachPidToStatusBarItem(accessTokenId, abilityRecord->GetPid());
76         if (ret != ERR_OK) {
77             TAG_LOGE(AAFwkTag::ABILITYMGR, "AttachPidToStatusBarItem failed, ret: %{public}d", ret);
78             return ret;
79         }
80         TAG_LOGI(AAFwkTag::ABILITYMGR, "AttachPidToStatusBarItem success.");
81     }
82     if (processOptions->processMode == ProcessMode::NEW_PROCESS_ATTACH_TO_STATUS_BAR_ITEM) {
83         IN_PROCESS_CALL_WITHOUT_RET(DelayedSingleton<AppScheduler>::GetInstance()->AttachedToStatusBar(
84             abilityRecord->GetToken()));
85     }
86     return ERR_OK;
87 }
88 }  // namespace AAFwk
89 }  // namespace OHOS