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(const std::string & instanceKey)37 bool StatusBarDelegateManager::IsCallerInStatusBar(const std::string &instanceKey)
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, instanceKey, isExist);
45 if (ret != ERR_OK) {
46 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, ret: %{public}d", ret);
47 return false;
48 }
49 TAG_LOGI(AAFwkTag::ABILITYMGR, "isExist: %{public}d", isExist);
50 return isExist;
51 }
52
IsInStatusBar(uint32_t accessTokenId,bool isMultiInstance)53 bool StatusBarDelegateManager::IsInStatusBar(uint32_t accessTokenId, bool isMultiInstance)
54 {
55 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
56 auto statusBarDelegate = GetStatusBarDelegate();
57 CHECK_POINTER_AND_RETURN(statusBarDelegate, false);
58 bool isExist = false;
59 std::string instanceKey = isMultiInstance ? "app_instance_0" : "";
60 auto ret = statusBarDelegate->CheckIfStatusBarItemExists(accessTokenId, instanceKey, isExist);
61 if (ret != ERR_OK) {
62 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, ret: %{public}d", ret);
63 return false;
64 }
65 TAG_LOGI(AAFwkTag::ABILITYMGR, "isExist: %{public}d", isExist);
66 return isExist;
67 }
68
IsSupportStatusBar()69 bool StatusBarDelegateManager::IsSupportStatusBar()
70 {
71 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
72 auto statusBarDelegate = GetStatusBarDelegate();
73 CHECK_POINTER_AND_RETURN(statusBarDelegate, false);
74 return true;
75 }
76
DoProcessAttachment(std::shared_ptr<AbilityRecord> abilityRecord)77 int32_t StatusBarDelegateManager::DoProcessAttachment(std::shared_ptr<AbilityRecord> abilityRecord)
78 {
79 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
80 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
81 auto sessionInfo = abilityRecord->GetSessionInfo();
82 CHECK_POINTER_AND_RETURN(sessionInfo, ERR_INVALID_VALUE);
83 auto processOptions = sessionInfo->processOptions;
84 if (processOptions == nullptr) {
85 TAG_LOGD(AAFwkTag::ABILITYMGR, "no need to attach process.");
86 return ERR_OK;
87 }
88 if (processOptions->processMode == ProcessMode::NEW_PROCESS_ATTACH_TO_PARENT) {
89 auto callerRecord = abilityRecord->GetCallerRecord();
90 CHECK_POINTER_AND_RETURN(callerRecord, ERR_INVALID_VALUE);
91 TAG_LOGI(AAFwkTag::ABILITYMGR, "attach pid to parent");
92 IN_PROCESS_CALL_WITHOUT_RET(DelayedSingleton<AppScheduler>::GetInstance()->AttachPidToParent(
93 abilityRecord->GetToken(), callerRecord->GetToken()));
94 }
95 if (ProcessOptions::IsAttachToStatusBarMode(processOptions->processMode)) {
96 auto statusBarDelegate = GetStatusBarDelegate();
97 CHECK_POINTER_AND_RETURN(statusBarDelegate, ERR_INVALID_VALUE);
98 auto accessTokenId = abilityRecord->GetApplicationInfo().accessTokenId;
99 auto ret = statusBarDelegate->AttachPidToStatusBarItem(accessTokenId, abilityRecord->GetPid(),
100 abilityRecord->GetInstanceKey());
101 if (ret != ERR_OK) {
102 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, ret: %{public}d", ret);
103 return ret;
104 }
105 TAG_LOGI(AAFwkTag::ABILITYMGR, "success");
106 }
107 if (processOptions->processMode == ProcessMode::NEW_PROCESS_ATTACH_TO_STATUS_BAR_ITEM) {
108 IN_PROCESS_CALL_WITHOUT_RET(DelayedSingleton<AppScheduler>::GetInstance()->AttachedToStatusBar(
109 abilityRecord->GetToken()));
110 }
111 return ERR_OK;
112 }
113
DoCallerProcessAttachment(std::shared_ptr<AbilityRecord> abilityRecord)114 int32_t StatusBarDelegateManager::DoCallerProcessAttachment(std::shared_ptr<AbilityRecord> abilityRecord)
115 {
116 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
117 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
118 auto statusBarDelegate = GetStatusBarDelegate();
119 CHECK_POINTER_AND_RETURN(statusBarDelegate, ERR_INVALID_VALUE);
120 auto accessTokenId = abilityRecord->GetApplicationInfo().accessTokenId;
121 auto ret = statusBarDelegate->AttachPidToStatusBarItem(accessTokenId, abilityRecord->GetPid(),
122 abilityRecord->GetInstanceKey());
123 if (ret != ERR_OK) {
124 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, ret: %{public}d", ret);
125 return ret;
126 }
127 TAG_LOGI(AAFwkTag::ABILITYMGR, "caller process attach success");
128
129 return ERR_OK;
130 }
131
DoCallerProcessDetachment(std::shared_ptr<AbilityRecord> abilityRecord)132 int32_t StatusBarDelegateManager::DoCallerProcessDetachment(std::shared_ptr<AbilityRecord> abilityRecord)
133 {
134 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
135 CHECK_POINTER_AND_RETURN(abilityRecord, ERR_INVALID_VALUE);
136 auto statusBarDelegate = GetStatusBarDelegate();
137 CHECK_POINTER_AND_RETURN(statusBarDelegate, ERR_INVALID_VALUE);
138 auto accessTokenId = abilityRecord->GetApplicationInfo().accessTokenId;
139 auto ret = statusBarDelegate->DetachPidToStatusBarItem(accessTokenId, abilityRecord->GetPid(),
140 abilityRecord->GetInstanceKey());
141 if (ret != ERR_OK) {
142 TAG_LOGE(AAFwkTag::ABILITYMGR, "failed, ret: %{public}d", ret);
143 return ret;
144 }
145 TAG_LOGI(AAFwkTag::ABILITYMGR, "caller process detach success");
146
147 return ERR_OK;
148 }
149 } // namespace AAFwk
150 } // namespace OHOS