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