• 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 "frameworks/bridge/js_frontend/frontend_delegate.h"
17 
18 #include "core/components_ng/pattern/container_modal/container_modal_view.h"
19 #include "core/pipeline_ng/pipeline_context.h"
20 #include "frameworks/bridge/common/utils/utils.h"
21 #include "frameworks/core/components_ng/base/inspector.h"
22 
23 namespace OHOS::Ace::Framework {
24 namespace {
25 
26 const char SLASH = '/';
27 const char SLASHSTR[] = "/";
28 const char SUPDIRECTORY[] = "../";
29 
GetFileInfo(const std::string & fileUri,std::string & fileName,std::string & filePath)30 void GetFileInfo(const std::string& fileUri, std::string& fileName, std::string& filePath)
31 {
32     size_t slashPos = fileUri.find_last_of(SLASH);
33     if (slashPos == std::string::npos) {
34         fileName = fileUri;
35     } else {
36         fileName = fileUri.substr(slashPos + 1);
37         filePath = fileUri.substr(0, slashPos + 1);
38     }
39 
40     if (StartWith(filePath, SLASHSTR)) {
41         filePath = filePath.substr(1);
42     }
43 }
44 
ParseWorkerUri(const RefPtr<AssetManager> & assetManager,const std::string & fileUri,std::string & assetsFilePath)45 bool ParseWorkerUri(const RefPtr<AssetManager>& assetManager, const std::string& fileUri, std::string& assetsFilePath)
46 {
47     if (!assetManager || fileUri.empty() || (fileUri.length() > PATH_MAX)) {
48         return false;
49     }
50 
51     std::string fileName;
52     std::string filePath;
53     GetFileInfo(fileUri, fileName, filePath);
54     if (StartWith(filePath, SUPDIRECTORY)) {
55         filePath = filePath.substr(3); // 3 : offset of filePath
56     }
57     std::vector<std::string> files;
58     assetManager->GetAssetList(filePath, files);
59 
60     bool fileExist = false;
61     for (const auto& file : files) {
62         size_t filePos = file.find_last_of(SLASH);
63         if (filePos != std::string::npos) {
64             if (file.substr(filePos + 1) == fileName) {
65                 assetsFilePath = filePath + fileName;
66                 fileExist = true;
67                 break;
68             }
69         }
70     }
71     return fileExist;
72 }
73 
ParseFileUri(const RefPtr<AssetManager> & assetManager,const std::string & fileUri,std::string & assetsFilePath)74 bool ParseFileUri(const RefPtr<AssetManager>& assetManager, const std::string& fileUri, std::string& assetsFilePath)
75 {
76     if (!assetManager || fileUri.empty() || (fileUri.length() > PATH_MAX)) {
77         return false;
78     }
79 
80     std::string fileName;
81     std::string filePath;
82     GetFileInfo(fileUri, fileName, filePath);
83     std::vector<std::string> files;
84     assetManager->GetAssetList(filePath, files);
85 
86     bool fileExist = false;
87     for (const auto& file : files) {
88         bool startWithSlash = StartWith(file, SLASHSTR);
89         if ((startWithSlash && (file.substr(1) == fileName)) || (!startWithSlash && (file == fileName))) {
90             assetsFilePath = filePath + file;
91             fileExist = true;
92             break;
93         }
94     }
95 
96     return fileExist;
97 }
98 
99 } // namespace
100 
101 template<typename T>
GetResourceData(const std::string & fileUri,T & content)102 bool FrontendDelegate::GetResourceData(const std::string& fileUri, T& content)
103 {
104     std::string targetFilePath;
105     if (!ParseFileUri(assetManager_, fileUri, targetFilePath)) {
106         LOGE("GetResourceData parse file uri failed.");
107         return false;
108     }
109     if (!GetAssetContentAllowEmpty(assetManager_, targetFilePath, content)) {
110         LOGE("GetResourceData GetAssetContent failed.");
111         return false;
112     }
113 
114     return true;
115 }
116 
GetRectangleById(const std::string & key,NG::Rectangle & rectangle)117 void FrontendDelegate::GetRectangleById(const std::string& key, NG::Rectangle& rectangle)
118 {
119     NG::Inspector::GetRectangleById(key, rectangle);
120 }
121 
ResetFocus()122 void FrontendDelegate::ResetFocus()
123 {
124     TAG_LOGI(AceLogTag::ACE_FOCUS, "user lost focus to view root scope");
125     NG::FocusHub::LostFocusToViewRoot();
126 }
127 
RequestFocus(const std::string & value,bool isSyncRequest)128 bool FrontendDelegate::RequestFocus(const std::string& value, bool isSyncRequest)
129 {
130     auto pipeline = NG::PipelineContext::GetCurrentContext();
131     CHECK_NULL_RETURN(pipeline, false);
132     return pipeline->RequestFocus(value, isSyncRequest);
133 }
134 
SetRequestFocusCallback(std::function<void (NG::RequestFocusResult result)> callback)135 void FrontendDelegate::SetRequestFocusCallback(
136     std::function<void(NG::RequestFocusResult result)> callback)
137 {
138     auto pipeline = NG::PipelineContext::GetCurrentContext();
139     CHECK_NULL_VOID(pipeline);
140     auto focusManager = pipeline->GetOrCreateFocusManager();
141     CHECK_NULL_VOID(focusManager);
142     focusManager->SetRequestFocusCallback(callback);
143 }
144 
ResetRequestFocusCallback()145 void FrontendDelegate::ResetRequestFocusCallback()
146 {
147     auto pipeline = NG::PipelineContext::GetCurrentContext();
148     CHECK_NULL_VOID(pipeline);
149     auto focusManager = pipeline->GetOrCreateFocusManager();
150     CHECK_NULL_VOID(focusManager);
151     focusManager->ResetRequestFocusCallback();
152 }
153 
Activate(bool isActive,bool autoInactive)154 bool FrontendDelegate::Activate(bool isActive, bool autoInactive)
155 {
156     auto pipeline = NG::PipelineContext::GetCurrentContext();
157     CHECK_NULL_RETURN(pipeline, false);
158     return pipeline->SetIsFocusActive(isActive, NG::FocusActiveReason::USE_API, autoInactive);
159 }
160 
GetFocusActive()161 bool FrontendDelegate::GetFocusActive()
162 {
163     auto pipeline = NG::PipelineContext::GetCurrentContext();
164     CHECK_NULL_RETURN(pipeline, false);
165     bool ret = pipeline->GetIsFocusActive();
166     return ret;
167 }
168 
SetAutoFocusTransfer(bool isAutoFocusTransfer)169 void FrontendDelegate::SetAutoFocusTransfer(bool isAutoFocusTransfer)
170 {
171     auto pipeline = NG::PipelineContext::GetCurrentContext();
172     CHECK_NULL_VOID(pipeline);
173     auto focusManager = pipeline->GetOrCreateFocusManager();
174     CHECK_NULL_VOID(focusManager);
175     focusManager->SetIsAutoFocusTransfer(isAutoFocusTransfer);
176 }
177 
SetKeyProcessingMode(int32_t keyProcessingMode)178 void FrontendDelegate::SetKeyProcessingMode(int32_t keyProcessingMode)
179 {
180     auto pipeline = NG::PipelineContext::GetCurrentContext();
181     CHECK_NULL_VOID(pipeline);
182     auto focusManager = pipeline->GetOrCreateFocusManager();
183     CHECK_NULL_VOID(focusManager);
184     focusManager->SetKeyProcessingMode(static_cast<NG::KeyProcessingMode>(keyProcessingMode));
185 }
186 
ConfigWindowMask(bool enable)187 bool FrontendDelegate::ConfigWindowMask(bool enable)
188 {
189     auto pipeline = NG::PipelineContext::GetCurrentContext();
190     CHECK_NULL_RETURN(pipeline, false);
191     return NG::ContainerModalView::ConfigCustomWindowMask(pipeline, enable);
192 }
193 
194 template<typename T>
GetResourceData(const std::string & fileUri,T & content,std::string & ami)195 bool FrontendDelegate::GetResourceData(const std::string& fileUri, T& content, std::string& ami)
196 {
197     std::string targetFilePath;
198     if (!ParseWorkerUri(assetManager_, fileUri, targetFilePath)) {
199         LOGE("GetResourceData parse file uri failed.");
200         return false;
201     }
202     ami = assetManager_->GetAssetPath(targetFilePath, true) + targetFilePath;
203     LOGI("GetResourceData ami: %{private}s.", ami.c_str());
204     if (!GetAssetContentAllowEmpty(assetManager_, targetFilePath, content)) {
205         LOGE("GetResourceData GetAssetContent failed.");
206         return false;
207     }
208     return true;
209 }
210 
211 template<typename T>
GetResourceData(const std::string & fileUri,const RefPtr<AssetManager> & assetManager,T & content)212 bool FrontendDelegate::GetResourceData(const std::string& fileUri, const RefPtr<AssetManager>& assetManager, T& content)
213 {
214     std::string targetFilePath;
215     if (!ParseFileUri(assetManager, fileUri, targetFilePath)) {
216         LOGE("GetResourceData parse file uri failed.");
217         return false;
218     }
219     if (!GetAssetContentAllowEmpty(assetManager, targetFilePath, content)) {
220         LOGE("GetResourceData GetAssetContent failed.");
221         return false;
222     }
223 
224     return true;
225 }
226 
227 template bool FrontendDelegate::GetResourceData(const std::string& fileUri, std::string& content);
228 template bool FrontendDelegate::GetResourceData(const std::string& fileUri, std::vector<uint8_t>& content);
229 template bool FrontendDelegate::GetResourceData(
230     const std::string& fileUri, std::vector<uint8_t>& content, std::string& ami);
231 template bool FrontendDelegate::GetResourceData(
232     const std::string& fileUri, const RefPtr<AssetManager>& assetManager, std::vector<uint8_t>& content);
233 
234 } // namespace OHOS::Ace::Framework
235