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