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