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, "Lost focus to view root scope by user");
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
SetAutoFocusTransfer(bool isAutoFocusTransfer)161 void FrontendDelegate::SetAutoFocusTransfer(bool isAutoFocusTransfer)
162 {
163 auto pipeline = NG::PipelineContext::GetCurrentContext();
164 CHECK_NULL_VOID(pipeline);
165 auto focusManager = pipeline->GetOrCreateFocusManager();
166 CHECK_NULL_VOID(focusManager);
167 focusManager->SetIsAutoFocusTransfer(isAutoFocusTransfer);
168 }
169
SetKeyProcessingMode(int32_t keyProcessingMode)170 void FrontendDelegate::SetKeyProcessingMode(int32_t keyProcessingMode)
171 {
172 auto pipeline = NG::PipelineContext::GetCurrentContext();
173 CHECK_NULL_VOID(pipeline);
174 auto focusManager = pipeline->GetOrCreateFocusManager();
175 CHECK_NULL_VOID(focusManager);
176 focusManager->SetKeyProcessingMode(static_cast<NG::KeyProcessingMode>(keyProcessingMode));
177 }
178
ConfigWindowMask(bool enable)179 bool FrontendDelegate::ConfigWindowMask(bool enable)
180 {
181 auto pipeline = NG::PipelineContext::GetCurrentContext();
182 CHECK_NULL_RETURN(pipeline, false);
183 return NG::ContainerModalView::ConfigCustomWindowMask(pipeline, enable);
184 }
185
186 template<typename T>
GetResourceData(const std::string & fileUri,T & content,std::string & ami)187 bool FrontendDelegate::GetResourceData(const std::string& fileUri, T& content, std::string& ami)
188 {
189 std::string targetFilePath;
190 if (!ParseWorkerUri(assetManager_, fileUri, targetFilePath)) {
191 LOGE("GetResourceData parse file uri failed.");
192 return false;
193 }
194 ami = assetManager_->GetAssetPath(targetFilePath, true) + targetFilePath;
195 LOGI("GetResourceData ami: %{private}s.", ami.c_str());
196 if (!GetAssetContentAllowEmpty(assetManager_, targetFilePath, content)) {
197 LOGE("GetResourceData GetAssetContent failed.");
198 return false;
199 }
200 return true;
201 }
202
203 template<typename T>
GetResourceData(const std::string & fileUri,const RefPtr<AssetManager> & assetManager,T & content)204 bool FrontendDelegate::GetResourceData(const std::string& fileUri, const RefPtr<AssetManager>& assetManager, T& content)
205 {
206 std::string targetFilePath;
207 if (!ParseFileUri(assetManager, fileUri, targetFilePath)) {
208 LOGE("GetResourceData parse file uri failed.");
209 return false;
210 }
211 if (!GetAssetContentAllowEmpty(assetManager, targetFilePath, content)) {
212 LOGE("GetResourceData GetAssetContent failed.");
213 return false;
214 }
215
216 return true;
217 }
218
219 template bool FrontendDelegate::GetResourceData(const std::string& fileUri, std::string& content);
220 template bool FrontendDelegate::GetResourceData(const std::string& fileUri, std::vector<uint8_t>& content);
221 template bool FrontendDelegate::GetResourceData(
222 const std::string& fileUri, std::vector<uint8_t>& content, std::string& ami);
223 template bool FrontendDelegate::GetResourceData(
224 const std::string& fileUri, const RefPtr<AssetManager>& assetManager, std::vector<uint8_t>& content);
225
226 } // namespace OHOS::Ace::Framework
227