• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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