1 /*
2 * Copyright (c) 2023-2024 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 "auto_fill_manager.h"
17
18 #include "auto_fill_error.h"
19 #include "extension_ability_info.h"
20 #include "hilog_wrapper.h"
21
22 namespace OHOS {
23 namespace AbilityRuntime {
24 namespace {
25 const std::string WANT_PARAMS_AUTO_FILL_CMD = "fill";
26 const std::string WANT_PARAMS_AUTO_SAVE_CMD = "save";
27 const std::string WANT_PARAMS_EXTENSION_TYPE = "autoFill/password";
28 constexpr static char WANT_PARAMS_VIEW_DATA_KEY[] = "ohos.ability.params.viewData";
29 constexpr static char WANT_PARAMS_AUTO_FILL_CMD_KEY[] = "ohos.ability.params.autoFillCmd";
30 constexpr static char WANT_PARAMS_EXTENSION_TYPE_KEY[] = "ability.want.params.uiExtensionType";
31 constexpr static char WANT_PARAMS_AUTO_FILL_TYPE_KEY[] = "ability.want.params.AutoFillType";
32 constexpr static char AUTO_FILL_MANAGER_THREAD[] = "AutoFillManager";
33 constexpr static uint32_t AUTO_FILL_REQUEST_TIME_OUT_VALUE = 1000;
34 } // namespace
GetInstance()35 AutoFillManager &AutoFillManager::GetInstance()
36 {
37 static AutoFillManager instance;
38 return instance;
39 }
40
~AutoFillManager()41 AutoFillManager::~AutoFillManager()
42 {
43 HILOG_DEBUG("Called.");
44 if (eventHandler_ != nullptr) {
45 eventHandler_.reset();
46 }
47 }
48
RequestAutoFill(const AbilityBase::AutoFillType & autoFillType,Ace::UIContent * uiContent,const AbilityBase::ViewData & viewdata,const std::shared_ptr<IFillRequestCallback> & fillCallback)49 int32_t AutoFillManager::RequestAutoFill(
50 const AbilityBase::AutoFillType &autoFillType,
51 Ace::UIContent *uiContent,
52 const AbilityBase::ViewData &viewdata,
53 const std::shared_ptr<IFillRequestCallback> &fillCallback)
54 {
55 HILOG_DEBUG("Called.");
56 if (uiContent == nullptr || fillCallback == nullptr) {
57 HILOG_ERROR("UIContent or fillCallback is nullptr.");
58 return AutoFill::AUTO_FILL_OBJECT_IS_NULL;
59 }
60 return HandleRequestExecuteInner(autoFillType, uiContent, viewdata, fillCallback, nullptr);
61 }
62
RequestAutoSave(Ace::UIContent * uiContent,const AbilityBase::ViewData & viewdata,const std::shared_ptr<ISaveRequestCallback> & saveCallback)63 int32_t AutoFillManager::RequestAutoSave(
64 Ace::UIContent *uiContent,
65 const AbilityBase::ViewData &viewdata,
66 const std::shared_ptr<ISaveRequestCallback> &saveCallback)
67 {
68 HILOG_DEBUG("Called.");
69 if (uiContent == nullptr || saveCallback == nullptr) {
70 HILOG_ERROR("UIContent or save callback is nullptr.");
71 return AutoFill::AUTO_FILL_OBJECT_IS_NULL;
72 }
73 return HandleRequestExecuteInner(
74 AbilityBase::AutoFillType::UNSPECIFIED, uiContent, viewdata, nullptr, saveCallback);
75 }
76
HandleRequestExecuteInner(const AbilityBase::AutoFillType & autoFillType,Ace::UIContent * uiContent,const AbilityBase::ViewData & viewdata,const std::shared_ptr<IFillRequestCallback> & fillCallback,const std::shared_ptr<ISaveRequestCallback> & saveCallback)77 int32_t AutoFillManager::HandleRequestExecuteInner(
78 const AbilityBase::AutoFillType &autoFillType,
79 Ace::UIContent *uiContent,
80 const AbilityBase::ViewData &viewdata,
81 const std::shared_ptr<IFillRequestCallback> &fillCallback,
82 const std::shared_ptr<ISaveRequestCallback> &saveCallback)
83 {
84 if (uiContent == nullptr || (fillCallback == nullptr && saveCallback == nullptr)) {
85 HILOG_ERROR("UIContent or fillCallback&saveCallback is nullptr.");
86 return AutoFill::AUTO_FILL_OBJECT_IS_NULL;
87 }
88 {
89 std::lock_guard<std::mutex> lock(mutexLock_);
90 SetTimeOutEvent(++eventId_);
91 }
92 AAFwk::Want want;
93 want.SetParam(WANT_PARAMS_EXTENSION_TYPE_KEY, WANT_PARAMS_EXTENSION_TYPE);
94 want.SetParam(WANT_PARAMS_VIEW_DATA_KEY, viewdata.ToJsonString());
95
96 auto extensionCallback = std::make_shared<AutoFillExtensionCallback>();
97 if (fillCallback != nullptr) {
98 want.SetParam(WANT_PARAMS_AUTO_FILL_CMD_KEY, WANT_PARAMS_AUTO_FILL_CMD);
99 want.SetParam(WANT_PARAMS_AUTO_FILL_TYPE_KEY, static_cast<int32_t>(autoFillType));
100 extensionCallback->SetFillRequestCallback(fillCallback);
101 } else {
102 want.SetParam(WANT_PARAMS_AUTO_FILL_CMD_KEY, WANT_PARAMS_AUTO_SAVE_CMD);
103 extensionCallback->SetSaveRequestCallback(saveCallback);
104 }
105
106 Ace::ModalUIExtensionCallbacks callback;
107 callback.onResult = std::bind(
108 &AutoFillExtensionCallback::OnResult, extensionCallback, std::placeholders::_1, std::placeholders::_2);
109 callback.onRelease = std::bind(
110 &AutoFillExtensionCallback::OnRelease, extensionCallback, std::placeholders::_1);
111 callback.onError = std::bind(&AutoFillExtensionCallback::OnError,
112 extensionCallback, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
113 callback.onReceive = std::bind(&AutoFillExtensionCallback::OnReceive, extensionCallback, std::placeholders::_1);
114 Ace::ModalUIExtensionConfig config;
115 config.isAsyncModalBinding = true;
116 int32_t sessionId = uiContent->CreateModalUIExtension(want, callback, config);
117 if (sessionId == 0) {
118 HILOG_ERROR("Create modal ui extension is failed.");
119 RemoveEvent(eventId_);
120 return AutoFill::AUTO_FILL_CREATE_MODULE_UI_EXTENSION_FAILED;
121 }
122 extensionCallback->SetUIContent(uiContent);
123 extensionCallback->SetSessionId(sessionId);
124 extensionCallback->SetEventId(eventId_);
125 std::lock_guard<std::mutex> lock(mutexLock_);
126 extensionCallbacks_.emplace(eventId_, extensionCallback);
127 return AutoFill::AUTO_FILL_SUCCESS;
128 }
129
SetTimeOutEvent(uint32_t eventId)130 void AutoFillManager::SetTimeOutEvent(uint32_t eventId)
131 {
132 HILOG_DEBUG("Called.");
133 auto runner = AppExecFwk::EventRunner::Create(AUTO_FILL_MANAGER_THREAD);
134 if (eventHandler_ == nullptr) {
135 HILOG_DEBUG("Eventhandler is nullptr.");
136 eventHandler_ = std::make_shared<AutoFillEventHandler>(runner);
137 }
138 eventHandler_->SendEvent(eventId, AUTO_FILL_REQUEST_TIME_OUT_VALUE);
139 }
140
RemoveEvent(uint32_t eventId)141 void AutoFillManager::RemoveEvent(uint32_t eventId)
142 {
143 HILOG_DEBUG("Called.");
144 if (eventHandler_ == nullptr) {
145 HILOG_ERROR("Eventhandler is nullptr.");
146 return;
147 }
148 eventHandler_->RemoveEvent(eventId);
149
150 std::lock_guard<std::mutex> lock(mutexLock_);
151 auto ret = extensionCallbacks_.find(eventId);
152 if (ret != extensionCallbacks_.end()) {
153 extensionCallbacks_.erase(ret);
154 }
155 }
156
HandleTimeOut(uint32_t eventId)157 void AutoFillManager::HandleTimeOut(uint32_t eventId)
158 {
159 HILOG_DEBUG("Called.");
160 std::lock_guard<std::mutex> lock(mutexLock_);
161 auto ret = extensionCallbacks_.find(eventId);
162 if (ret == extensionCallbacks_.end()) {
163 HILOG_WARN("Event id is not find.");
164 return;
165 }
166 auto extensionCallback = ret->second.lock();
167 if (extensionCallback == nullptr) {
168 HILOG_ERROR("Extension callback is nullptr.");
169 return;
170 }
171 extensionCallback->HandleTimeOut();
172 extensionCallbacks_.erase(ret);
173 }
174 } // namespace AbilityRuntime
175 } // namespace OHOS
176