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 LOGD("fail to get subscriber to register callback");
97 return;
98 }
99 if (isRegistered_) {
100 return;
101 }
102 auto callback = [weak = WeakClaim(this), weakContext = WeakPtr<PipelineContext>(context)](
103 const AceMultimodalEvent& event) {
104 auto manager = weak.Upgrade();
105 if (!manager) {
106 LOGE("fail to get manager to notify event");
107 return;
108 }
109 auto context = weakContext.Upgrade();
110 if (!context) {
111 LOGE("fail to get context to notify event");
112 return;
113 }
114 auto scene = manager->GetCurrentMultiModalScene();
115 if (!scene) {
116 LOGE("fail to get current multi modal scene");
117 return;
118 }
119 auto weakScene = AceType::WeakClaim(AceType::RawPtr(scene));
120 context->GetTaskExecutor()->PostSyncTask([event, weakScene]() {
121 auto scene = weakScene.Upgrade();
122 if (scene == nullptr) {
123 LOGE("scene is null!");
124 return;
125 }
126 scene->OnNotifyMultimodalEvent(event);
127 }, TaskExecutor::TaskType::UI);
128 };
129 subscriber_->RegisterCallback(callback, [weak = WeakClaim(this)]() {
130 auto manager = weak.Upgrade();
131 if (!manager) {
132 LOGE("fail to get manager to notify event");
133 return;
134 }
135 manager->isRegistered_ = true;
136 });
137 }
138
DumpMultimodalScene()139 void MultiModalManager::DumpMultimodalScene()
140 {
141 if (DumpLog::GetInstance().GetDumpFile()) {
142 DumpLog::GetInstance().AddDesc("ActiveScene: ", activeSceneId_);
143 DumpLog::GetInstance().AddDesc("totalScene: ", multiModalScenes_.size());
144 DumpLog::GetInstance().AddDesc("registered: ", isRegistered_);
145 DumpLog::GetInstance().Print(0, GetTypeName(), multiModalScenes_.size());
146 }
147 GetCurrentMultiModalScene()->Dump();
148 }
149
150 } // namespace OHOS::Ace