1 /*
2 * Copyright (c) 2021 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 "core/event/multimodal/multimodal_manager.h"
17
18 #include "base/log/dump_log.h"
19 #include "base/log/log.h"
20 #include "core/pipeline/pipeline_context.h"
21
22 namespace OHOS::Ace {
23
GetMultiModalScene(int32_t pageId)24 RefPtr<MultiModalScene> MultiModalManager::GetMultiModalScene(int32_t pageId)
25 {
26 auto iter = multiModalScenes_.find(pageId);
27 if (iter == multiModalScenes_.end()) {
28 auto newScene = multiModalScenes_.try_emplace(pageId, MakeRefPtr<MultiModalScene>(pageId, subscriber_));
29 return newScene.first->second;
30 }
31 return iter->second;
32 }
33
PushActiveScene(int32_t newPageId)34 void MultiModalManager::PushActiveScene(int32_t newPageId)
35 {
36 if (activeSceneId_ == newPageId) {
37 return;
38 }
39 if (activeSceneId_ > 0) {
40 GetMultiModalScene(activeSceneId_)->Hide();
41 }
42 activeSceneId_ = newPageId;
43 }
44
PopActiveScene(int32_t poppedPageId,int32_t incomingPageId)45 void MultiModalManager::PopActiveScene(int32_t poppedPageId, int32_t incomingPageId)
46 {
47 RemoveMultimodalScene(poppedPageId);
48 if (activeSceneId_ == incomingPageId) {
49 return;
50 }
51 GetMultiModalScene(incomingPageId)->Resume();
52 activeSceneId_ = incomingPageId;
53 }
54
GetCurrentMultiModalScene()55 RefPtr<MultiModalScene> MultiModalManager::GetCurrentMultiModalScene()
56 {
57 if (activeSceneId_ < 0) {
58 return nullptr;
59 }
60 return GetMultiModalScene(activeSceneId_);
61 }
62
ReplaceActiveScene(int32_t newPageId,int32_t replaceId)63 void MultiModalManager::ReplaceActiveScene(int32_t newPageId, int32_t replaceId)
64 {
65 RemoveMultimodalScene(replaceId);
66 if (activeSceneId_ == newPageId) {
67 return;
68 }
69 activeSceneId_ = newPageId;
70 }
71
RemoveMultimodalScene(int32_t pageId)72 void MultiModalManager::RemoveMultimodalScene(int32_t pageId)
73 {
74 multiModalScenes_.erase(pageId);
75 }
76
RemoveInactiveScene(int32_t pageId)77 void MultiModalManager::RemoveInactiveScene(int32_t pageId)
78 {
79 if (activeSceneId_ == pageId) {
80 LOGW("fail to remove scene due to it is active");
81 return;
82 }
83 RemoveMultimodalScene(pageId);
84 }
85
SetMultimodalSubscriber(const RefPtr<MultimodalSubscriber> & subscriber)86 void MultiModalManager::SetMultimodalSubscriber(const RefPtr<MultimodalSubscriber>& subscriber)
87 {
88 if (subscriber) {
89 subscriber_ = subscriber;
90 }
91 }
92
OpenChannel(const RefPtr<PipelineContext> & context)93 void MultiModalManager::OpenChannel(const RefPtr<PipelineContext>& context)
94 {
95 if (!subscriber_) {
96 return;
97 }
98 if (isRegistered_) {
99 return;
100 }
101 auto callback = [weak = WeakClaim(this), weakContext = WeakPtr<PipelineContext>(context)](
102 const AceMultimodalEvent& event) {
103 auto manager = weak.Upgrade();
104 if (!manager) {
105 LOGE("fail to get manager to notify event");
106 return;
107 }
108 auto context = weakContext.Upgrade();
109 if (!context) {
110 LOGE("fail to get context to notify event");
111 return;
112 }
113 auto scene = manager->GetCurrentMultiModalScene();
114 if (!scene) {
115 LOGE("fail to get current multi modal scene");
116 return;
117 }
118 auto weakScene = AceType::WeakClaim(AceType::RawPtr(scene));
119 context->GetTaskExecutor()->PostSyncTask([event, weakScene]() {
120 auto scene = weakScene.Upgrade();
121 if (scene == nullptr) {
122 LOGE("scene is null!");
123 return;
124 }
125 scene->OnNotifyMultimodalEvent(event);
126 }, TaskExecutor::TaskType::UI);
127 };
128 subscriber_->RegisterCallback(callback, [weak = WeakClaim(this)]() {
129 auto manager = weak.Upgrade();
130 if (!manager) {
131 LOGE("fail to get manager to notify event");
132 return;
133 }
134 manager->isRegistered_ = true;
135 });
136 }
137
DumpMultimodalScene()138 void MultiModalManager::DumpMultimodalScene()
139 {
140 if (DumpLog::GetInstance().GetDumpFile()) {
141 DumpLog::GetInstance().AddDesc("ActiveScene: ", activeSceneId_);
142 DumpLog::GetInstance().AddDesc("totalScene: ", multiModalScenes_.size());
143 DumpLog::GetInstance().AddDesc("registered: ", isRegistered_);
144 DumpLog::GetInstance().Print(0, GetTypeName(), multiModalScenes_.size());
145 }
146 GetCurrentMultiModalScene()->Dump();
147 }
148
149 } // namespace OHOS::Ace