• 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         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