• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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