1 /*
2 * Copyright (c) 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 "core/components_ng/manager/focus/focus_manager.h"
17
18 #include "base/log/dump_log.h"
19 #include "core/pipeline_ng/pipeline_context.h"
20
21 namespace OHOS::Ace::NG {
22 namespace {
GetCurrentFocusManager()23 RefPtr<FocusManager> GetCurrentFocusManager()
24 {
25 auto context = NG::PipelineContext::GetCurrentContextSafely();
26 CHECK_NULL_RETURN(context, nullptr);
27 auto focusManager = context->GetFocusManager();
28 return focusManager;
29 }
30 }
31
FocusManager(const RefPtr<PipelineContext> & pipeline)32 FocusManager::FocusManager(const RefPtr<PipelineContext>& pipeline): pipeline_(pipeline)
33 {
34 CHECK_NULL_VOID(pipeline);
35 if (pipeline->GetRootElement()) {
36 currentFocus_ = pipeline->GetRootElement()->GetFocusHub();
37 }
38 // After switching between portrait and landscape mode
39 // reset the isNeedTriggerScroll parameter to enable screen focus scrolling.
40 pipeline->RegisterSurfaceChangedCallback([weak = WeakClaim(this)](int32_t width, int32_t height, int32_t oldWidth,
41 int32_t oldHeight, WindowSizeChangeReason type) {
42 auto context = weak.Upgrade();
43 context->SetNeedTriggerScroll(true);
44 });
45 }
46
FocusViewShow(const RefPtr<FocusView> & focusView,bool isTriggerByStep)47 void FocusManager::FocusViewShow(const RefPtr<FocusView>& focusView, bool isTriggerByStep)
48 {
49 CHECK_NULL_VOID(focusView);
50 if (!focusView->HasParentFocusHub()) {
51 TAG_LOGD(AceLogTag::ACE_FOCUS, "FocusView: %{public}s/%{public}d has no parent. Do not need show.",
52 focusView->GetFrameName().c_str(), focusView->GetFrameId());
53 return;
54 }
55 focusView->SetIsViewHasShow(true);
56 auto lastFocusView = lastFocusView_.Upgrade();
57 if (lastFocusView) {
58 if (lastFocusView == focusView || lastFocusView->IsChildFocusViewOf(focusView)) {
59 return;
60 }
61 if (!focusView->IsChildFocusViewOf(lastFocusView) && IsAutoFocusTransfer()) {
62 lastFocusView->LostViewFocus();
63 }
64 }
65
66 auto focusViewWeak = AceType::WeakClaim(AceType::RawPtr(focusView));
67 if (std::find(focusViewStack_.begin(), focusViewStack_.end(), focusViewWeak) != focusViewStack_.end()) {
68 focusViewStack_.remove(focusViewWeak);
69 }
70 focusViewStack_.emplace_back(focusViewWeak);
71 focusViewStackState_ = FocusViewStackState::SHOW;
72 lastFocusView_ = focusViewWeak;
73
74 // do not set LastWeakFocus to Previous node/scope in focusView when FocusViewShow trigger by FocusStep
75 if (!isTriggerByStep) {
76 lastFocusView = lastFocusView_.Upgrade();
77 if (!lastFocusView) {
78 return;
79 }
80 auto lastFocusViewHub = lastFocusView->GetFocusHub();
81 if (lastFocusViewHub) {
82 lastFocusViewHub->SetLastWeakFocusToPreviousInFocusView();
83 }
84 }
85 }
86
RearrangeViewStack()87 bool FocusManager::RearrangeViewStack()
88 {
89 auto curFocusView = FocusView::GetCurrentFocusView();
90 CHECK_NULL_RETURN(curFocusView, false);
91 auto curFocusViewHub = curFocusView->GetFocusHub();
92 CHECK_NULL_RETURN(curFocusViewHub, false);
93 auto curFocusViewWeak = AceType::WeakClaim(AceType::RawPtr(curFocusView));
94 if (!curFocusViewHub->IsCurrentFocus() && focusViewStackState_ == FocusViewStackState::SHOW) {
95 if (std::find(focusViewStack_.begin(), focusViewStack_.end(), curFocusViewWeak) != focusViewStack_.end()) {
96 focusViewStack_.remove(curFocusViewWeak);
97 }
98 lastFocusView_ = focusViewStack_.back();
99 return true;
100 }
101 if (focusViewStackState_ == FocusViewStackState::CLOSE) {
102 auto ret = SetFocusViewRootScope(curFocusView);
103 return ret;
104 }
105 return false;
106 }
107
FocusViewHide(const RefPtr<FocusView> & focusView)108 void FocusManager::FocusViewHide(const RefPtr<FocusView>& focusView)
109 {
110 CHECK_NULL_VOID(focusView);
111 if (IsAutoFocusTransfer()) {
112 focusView->LostViewFocus();
113 }
114 auto lastFocusView = lastFocusView_.Upgrade();
115 if (lastFocusView && (lastFocusView == focusView || lastFocusView->IsChildFocusViewOf(focusView))) {
116 lastFocusView_ = nullptr;
117 }
118 }
119
FocusViewClose(const RefPtr<FocusView> & focusView,bool isDetachFromTree)120 void FocusManager::FocusViewClose(const RefPtr<FocusView>& focusView, bool isDetachFromTree)
121 {
122 if (!IsAutoFocusTransfer() && !isDetachFromTree) {
123 return;
124 }
125 CHECK_NULL_VOID(focusView);
126 focusView->LostViewFocus();
127 focusView->SetIsViewHasShow(false);
128 for (auto iter = focusViewStack_.begin(); iter != focusViewStack_.end();) {
129 auto view = (*iter).Upgrade();
130 if (view && (view == focusView || view->IsChildFocusViewOf(focusView))) {
131 auto focusHub = view->GetFocusHub();
132 if (focusHub) {
133 focusHub->RemoveFocusScopeIdAndPriority();
134 }
135 iter = focusViewStack_.erase(iter);
136 focusViewStackState_ = FocusViewStackState::CLOSE;
137 } else {
138 ++iter;
139 }
140 }
141 if (focusViewStack_.empty()) {
142 lastFocusView_ = nullptr;
143 return;
144 }
145 if (focusViewStack_.back() != lastFocusView_) {
146 lastFocusView_ = focusViewStack_.back();
147 }
148 }
149
FlushFocusView()150 void FocusManager::FlushFocusView()
151 {
152 auto lastFocusView = lastFocusView_.Upgrade();
153 auto lastFocusViewHub = lastFocusView ? lastFocusView->GetFocusHub() : nullptr;
154 if (lastFocusViewHub && lastFocusViewHub->IsCurrentFocus()) {
155 return;
156 }
157 RefPtr<FocusView> currFocusView = nullptr;
158 for (const auto& weakView : focusViewStack_) {
159 auto view = weakView.Upgrade();
160 auto viewHub = view ? view->GetFocusHub() : nullptr;
161 if (!viewHub || !viewHub->IsCurrentFocus()) {
162 continue;
163 }
164 if (currFocusView && currFocusView->IsChildFocusViewOf(view)) {
165 continue;
166 }
167 currFocusView = view;
168 }
169 lastFocusView_ = currFocusView ? AceType::WeakClaim(AceType::RawPtr(currFocusView)) : nullptr;
170 }
171
GetFocusViewMap(FocusViewMap & focusViewMap)172 void FocusManager::GetFocusViewMap(FocusViewMap& focusViewMap)
173 {
174 for (const auto& focusViewWeak : focusViewStack_) {
175 auto focusView = focusViewWeak.Upgrade();
176 if (!focusView) {
177 continue;
178 }
179 auto focusViewId = focusView->GetFrameId();
180 auto entryFocusView = focusView->GetEntryFocusView();
181 if (entryFocusView && entryFocusView != focusView) {
182 auto entryFocusViewId = entryFocusView->GetFrameId();
183 auto entryFocusViewWeak = AceType::WeakClaim(AceType::RawPtr(entryFocusView));
184 auto iter = focusViewMap.find(entryFocusViewId);
185 if (iter == focusViewMap.end()) {
186 focusViewMap[entryFocusViewId] = { entryFocusViewWeak, { focusViewWeak } };
187 } else {
188 iter->second.second.emplace_back(focusViewWeak);
189 }
190 } else {
191 focusViewMap[focusViewId] = { focusViewWeak, {} };
192 }
193 }
194 }
195
PaintFocusState()196 void FocusManager::PaintFocusState()
197 {
198 auto pipeline = pipeline_.Upgrade();
199 CHECK_NULL_VOID(pipeline);
200 auto rootNode = pipeline->GetRootElement();
201 CHECK_NULL_VOID(rootNode);
202 auto rootFocusHub = rootNode->GetFocusHub();
203 CHECK_NULL_VOID(rootFocusHub);
204 if (!pipeline->GetIsFocusActive()) {
205 return;
206 }
207 rootFocusHub->ClearAllFocusState();
208 rootFocusHub->PaintAllFocusState();
209 }
210
211
DumpFocusManager()212 void FocusManager::DumpFocusManager()
213 {
214 if (!DumpLog::GetInstance().GetDumpFile()) {
215 return;
216 }
217 DumpLog::GetInstance().Print("Focus view:");
218 std::unordered_map<int32_t, std::pair<WeakPtr<FocusView>, std::list<WeakPtr<FocusView>>>> focusViewMap;
219 GetFocusViewMap(focusViewMap);
220 for (const auto& focusViewInfo : focusViewMap) {
221 auto focusView = focusViewInfo.second.first.Upgrade();
222 if (!focusView) {
223 continue;
224 }
225 auto childFocusViewWeakList = focusViewInfo.second.second;
226 bool isFocusedView = false;
227 auto lastFocusView = lastFocusView_.Upgrade();
228 auto lastEntryFocusView = lastFocusView ? lastFocusView->GetEntryFocusView() : nullptr;
229 if (focusView == lastEntryFocusView) {
230 isFocusedView = true;
231 }
232 std::string information = focusView->GetFrameName();
233 information += isFocusedView ? "(*)" : "";
234 information += " id:" + std::to_string(focusView->GetFrameId());
235 DumpLog::GetInstance().Print(0, information, static_cast<int32_t>(childFocusViewWeakList.size()));
236 for (const auto& childWeak : childFocusViewWeakList) {
237 auto child = childWeak.Upgrade();
238 if (!child) {
239 continue;
240 }
241 std::string childInformation = child->GetFrameName();
242 childInformation += child == lastFocusView ? "(*)" : "";
243 childInformation += " id:" + std::to_string(child->GetFrameId());
244 DumpLog::GetInstance().Print(1, childInformation, 0);
245 }
246 }
247 }
248
AddFocusScope(const std::string & focusScopeId,const RefPtr<FocusHub> & scopeFocusHub)249 bool FocusManager::AddFocusScope(const std::string& focusScopeId, const RefPtr<FocusHub>& scopeFocusHub)
250 {
251 auto iter = focusHubScopeMap_.find(focusScopeId);
252 if (iter != focusHubScopeMap_.end()) {
253 auto focusScope = iter->second.first.Upgrade();
254 if (!focusScope) {
255 iter->second.first = scopeFocusHub;
256 return true;
257 }
258 return false;
259 } else {
260 focusHubScopeMap_[focusScopeId] = { scopeFocusHub, {} };
261 }
262 return true;
263 }
264
RemoveFocusScope(const std::string & focusScopeId)265 void FocusManager::RemoveFocusScope(const std::string& focusScopeId)
266 {
267 auto iter = focusHubScopeMap_.find(focusScopeId);
268 if (iter != focusHubScopeMap_.end()) {
269 if (iter->second.second.empty()) {
270 focusHubScopeMap_.erase(iter);
271 } else {
272 iter->second.first = nullptr;
273 }
274 }
275 }
276
AddScopePriorityNode(const std::string & focusScopeId,const RefPtr<FocusHub> & priorFocusHub,bool pushFront)277 void FocusManager::AddScopePriorityNode(const std::string& focusScopeId, const RefPtr<FocusHub>& priorFocusHub,
278 bool pushFront)
279 {
280 auto iter = focusHubScopeMap_.find(focusScopeId);
281 if (iter != focusHubScopeMap_.end()) {
282 if (pushFront) {
283 iter->second.second.emplace_front(priorFocusHub);
284 } else {
285 iter->second.second.emplace_back(priorFocusHub);
286 }
287 } else {
288 focusHubScopeMap_[focusScopeId] = { nullptr, { priorFocusHub } };
289 }
290 }
291
RemoveScopePriorityNode(const std::string & focusScopeId,const RefPtr<FocusHub> & priorFocusHub)292 void FocusManager::RemoveScopePriorityNode(const std::string& focusScopeId, const RefPtr<FocusHub>& priorFocusHub)
293 {
294 auto iter = focusHubScopeMap_.find(focusScopeId);
295 if (iter != focusHubScopeMap_.end()) {
296 if (iter->second.second.empty()) {
297 return;
298 }
299 iter->second.second.remove(priorFocusHub);
300 auto focusScope = iter->second.first.Upgrade();
301 if (!focusScope && iter->second.second.empty()) {
302 focusHubScopeMap_.erase(iter);
303 }
304 }
305 }
306
GetFocusScopePriorityList(const std::string & focusScopeId)307 std::optional<std::list<WeakPtr<FocusHub>>*> FocusManager::GetFocusScopePriorityList(const std::string& focusScopeId)
308 {
309 auto iter = focusHubScopeMap_.find(focusScopeId);
310 if (iter != focusHubScopeMap_.end()) {
311 if (!iter->second.second.empty()) {
312 return &(iter->second.second);
313 }
314 }
315 return std::nullopt;
316 }
317
UpdateCurrentFocus(const RefPtr<FocusHub> & current,SwitchingUpdateReason reason)318 void FocusManager::UpdateCurrentFocus(const RefPtr<FocusHub>& current, SwitchingUpdateReason reason)
319 {
320 if (isSwitchingFocus_.value_or(false)) {
321 switchingFocus_ = current;
322 updateReason_ = reason;
323 }
324 }
325
GetCurrentFocus()326 RefPtr<FocusHub> FocusManager::GetCurrentFocus()
327 {
328 return currentFocus_.Upgrade();
329 }
330
AddFocusListener(FocusChangeCallback && callback)331 int32_t FocusManager::AddFocusListener(FocusChangeCallback&& callback)
332 {
333 // max callbacks count: INT32_MAX - 1
334 if (listeners_.size() == static_cast<size_t>(std::numeric_limits<int32_t>::max() - 1)) {
335 return -1;
336 }
337 int32_t handler = nextListenerHdl_;
338 listeners_.emplace(handler, std::move(callback));
339
340 do {
341 nextListenerHdl_ = (nextListenerHdl_ == std::numeric_limits<int32_t>::max()) ? 0 : ++nextListenerHdl_;
342 } while (listeners_.count(nextListenerHdl_) != 0);
343 return handler;
344 }
345
RemoveFocusListener(int32_t handler)346 void FocusManager::RemoveFocusListener(int32_t handler)
347 {
348 listeners_.erase(handler);
349 }
350
AddFocusActiveChangeListener(const FocusActiveChangeCallback & callback)351 int32_t FocusManager::AddFocusActiveChangeListener(const FocusActiveChangeCallback& callback)
352 {
353 return focusActiveChangeCallback_.AddListener(callback);
354 }
355
RemoveFocusActiveChangeListener(int32_t handler)356 void FocusManager::RemoveFocusActiveChangeListener(int32_t handler)
357 {
358 focusActiveChangeCallback_.RemoveListener(handler);
359 }
360
TriggerFocusActiveChangeCallback(bool isFocusActive)361 void FocusManager::TriggerFocusActiveChangeCallback(bool isFocusActive)
362 {
363 focusActiveChangeCallback_.NotifyListener(isFocusActive);
364 }
365
GetFocusManager(RefPtr<FrameNode> & node)366 RefPtr<FocusManager> FocusManager::GetFocusManager(RefPtr<FrameNode>& node)
367 {
368 CHECK_NULL_RETURN(node, nullptr);
369 auto context = node->GetContextRefPtr();
370 CHECK_NULL_RETURN(context, nullptr);
371 auto focusManager = context->GetFocusManager();
372 return focusManager;
373 }
374
FocusSwitchingStart(const RefPtr<FocusHub> & focusHub,SwitchingStartReason reason)375 void FocusManager::FocusSwitchingStart(const RefPtr<FocusHub>& focusHub,
376 SwitchingStartReason reason)
377 {
378 isSwitchingFocus_ = true;
379 switchingFocus_ = focusHub;
380 startReason_ = reason;
381 }
382
ReportFocusSwitching(FocusReason focusReason)383 void FocusManager::ReportFocusSwitching(FocusReason focusReason)
384 {
385 for (auto& [_, cb] : listeners_) {
386 cb(currentFocus_, switchingFocus_, focusReason);
387 }
388 currentFocus_ = switchingFocus_;
389 isSwitchingFocus_.reset();
390 startReason_.reset();
391 updateReason_.reset();
392 endReason_.reset();
393 }
394
FocusSwitchingEnd(SwitchingEndReason reason)395 void FocusManager::FocusSwitchingEnd(SwitchingEndReason reason)
396 {
397 // While switching window, focus may move by steps.(WindowFocus/FlushFocus)
398 // Merge all steps together as a single movement.
399 if (!isSwitchingFocus_.value_or(false)) {
400 return;
401 }
402 if (!isSwitchingWindow_) {
403 auto lastHub = currentFocus_.Upgrade();
404 TAG_LOGI(AceLogTag::ACE_FOCUS, "FocusSwitch end, %{public}s/" SEC_PLD(%{public}d) " onBlur, "
405 "%{public}s/" SEC_PLD(%{public}d) " onFocus, "
406 "start: %{public}d, end: %{public}d, update: %{public}d",
407 lastHub ? lastHub->GetFrameName().c_str() : "NULL",
408 SEC_PARAM(lastHub ? lastHub->GetFrameId() : -1),
409 switchingFocus_ ? switchingFocus_->GetFrameName().c_str() : "NULL",
410 SEC_PARAM(switchingFocus_ ? switchingFocus_->GetFrameId() : -1),
411 startReason_.value_or(SwitchingStartReason::DEFAULT),
412 reason, updateReason_.value_or(SwitchingUpdateReason::DEFAULT));
413 if (switchingFocus_ &&
414 startReason_.value_or(SwitchingStartReason::DEFAULT) != SwitchingStartReason::LOST_FOCUS_TO_VIEW_ROOT) {
415 switchingFocus_->ClearLastFocusNode();
416 }
417 ReportFocusSwitching(FocusReason::DEFAULT);
418 PaintFocusState();
419 } else {
420 isSwitchingFocus_ = false;
421 endReason_ = reason;
422 }
423 }
424
WindowFocusMoveStart()425 void FocusManager::WindowFocusMoveStart()
426 {
427 isSwitchingWindow_ = true;
428 }
429
WindowFocusMoveEnd()430 void FocusManager::WindowFocusMoveEnd()
431 {
432 isSwitchingWindow_ = false;
433 if (!isSwitchingFocus_.value_or(true)) {
434 auto lastHub = currentFocus_.Upgrade();
435 TAG_LOGI(AceLogTag::ACE_FOCUS, "WinFocusMove end, %{public}s/" SEC_PLD(%{public}d) " onBlur, "
436 "%{public}s/" SEC_PLD(%{public}d) " onFocus, "
437 "start: %{public}d, end: %{public}d, update: %{public}d",
438 lastHub ? lastHub->GetFrameName().c_str() : "NULL",
439 SEC_PARAM(lastHub ? lastHub->GetFrameId() : -1),
440 switchingFocus_ ? switchingFocus_->GetFrameName().c_str() : "NULL",
441 SEC_PARAM(switchingFocus_ ? switchingFocus_->GetFrameId() : -1),
442 startReason_.value_or(SwitchingStartReason::DEFAULT),
443 endReason_.value_or(SwitchingEndReason::DEFAULT),
444 updateReason_.value_or(SwitchingUpdateReason::DEFAULT));
445 ReportFocusSwitching(FocusReason::WINDOW_FOCUS);
446 PaintFocusState();
447 }
448 }
449
CreateFocusGuard(const RefPtr<FocusHub> & focusHub,const RefPtr<FocusManager> & focusManager,SwitchingStartReason reason)450 void FocusManager::FocusGuard::CreateFocusGuard(const RefPtr<FocusHub>& focusHub,
451 const RefPtr<FocusManager>& focusManager, SwitchingStartReason reason)
452 {
453 CHECK_NULL_VOID(focusManager);
454 if (focusManager->isSwitchingFocus_.value_or(false)) {
455 return;
456 }
457 focusManager->FocusSwitchingStart(focusHub, reason);
458 focusMng_ = focusManager;
459 }
460
FocusGuard(const RefPtr<FocusHub> & focusHub,SwitchingStartReason reason)461 FocusManager::FocusGuard::FocusGuard(const RefPtr<FocusHub>& focusHub,
462 SwitchingStartReason reason)
463 {
464 RefPtr<FocusHub> hub = focusHub;
465 if (!hub || !hub->GetFocusManager()) {
466 auto curFocusView = FocusView::GetCurrentFocusView();
467 hub = curFocusView ? curFocusView->GetFocusHub() : nullptr;
468 }
469
470 auto mng = hub ? hub->GetFocusManager() : GetCurrentFocusManager();
471 CreateFocusGuard(hub, mng, reason);
472 }
473
~FocusGuard()474 FocusManager::FocusGuard::~FocusGuard()
475 {
476 if (focusMng_) {
477 focusMng_->FocusSwitchingEnd();
478 }
479 }
480
SetFocusViewRootScope(const RefPtr<FocusView> & focusView)481 bool FocusManager::SetFocusViewRootScope(const RefPtr<FocusView>& focusView)
482 {
483 auto focusViewRootScope = focusView->GetViewRootScope();
484 focusView->SetIsViewRootScopeFocused(true);
485 return focusViewRootScope->RequestFocusImmediatelyInner();
486 }
487
WindowFocus(bool isFocus)488 void FocusManager::WindowFocus(bool isFocus)
489 {
490 if (!isFocus) {
491 return;
492 }
493 WindowFocusMoveStart();
494 FocusManager::FocusGuard guard(GetCurrentFocus(), SwitchingStartReason::WINDOW_FOCUS);
495 auto curFocusView = GetLastFocusView().Upgrade();
496 auto curFocusViewHub = curFocusView ? curFocusView->GetFocusHub() : nullptr;
497 if (!curFocusViewHub) {
498 TAG_LOGW(AceLogTag::ACE_FOCUS, "Current focus view can not found!");
499 } else if (curFocusView->GetIsViewHasFocused() && !curFocusViewHub->IsCurrentFocus()) {
500 TAG_LOGI(AceLogTag::ACE_FOCUS, "Request current focus view: %{public}s/%{public}d",
501 curFocusView->GetFrameName().c_str(), curFocusView->GetFrameId());
502 if (!IsAutoFocusTransfer()) {
503 SetFocusViewRootScope(curFocusView);
504 } else {
505 auto lastViewFocusNode = curFocusViewHub->GetFocusLeaf();
506 lastViewFocusNode->RequestFocusImmediatelyInner(FocusReason::WINDOW_FOCUS);
507 }
508 } else {
509 auto container = Container::Current();
510 if (container && (container->IsUIExtensionWindow() || container->IsDynamicRender())) {
511 TAG_LOGD(AceLogTag::ACE_FOCUS,
512 "Request default focus on current focus view: %{public}s/%{public}d",
513 curFocusView->GetFrameName().c_str(),
514 curFocusView->GetFrameId());
515 curFocusView->SetIsViewRootScopeFocused(false);
516 curFocusView->RequestDefaultFocus();
517 }
518 }
519
520 auto pipeline = pipeline_.Upgrade();
521 CHECK_NULL_VOID(pipeline);
522 auto root = pipeline->GetRootElement();
523 CHECK_NULL_VOID(root);
524 auto rootFocusHub = root->GetFocusHub();
525 CHECK_NULL_VOID(rootFocusHub);
526 if (!rootFocusHub->IsCurrentFocus()) {
527 TAG_LOGD(AceLogTag::ACE_FOCUS,
528 "Request focus on rootFocusHub: %{public}s/%{public}d",
529 rootFocusHub->GetFrameName().c_str(),
530 rootFocusHub->GetFrameId());
531 auto focusDepend = rootFocusHub->GetFocusDependence();
532 rootFocusHub->SetFocusDependence(FocusDependence::SELF);
533 rootFocusHub->RequestFocusImmediatelyInner(FocusReason::WINDOW_FOCUS);
534 rootFocusHub->SetFocusDependence(focusDepend);
535 }
536 pipeline->RequestFrame();
537 }
538 } // namespace OHOS::Ace::NG
539