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