1 /*
2 * Copyright (c) 2022 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 "inner_window.h"
17
18 #include "window_manager_hilog.h"
19 #include "surface_draw.h"
20
21 namespace OHOS {
22 namespace Rosen {
23 namespace {
24 constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "InnerWindow"};
25 const std::string IMAGE_PLACE_HOLDER_PNG_PATH = "/etc/window/resources/bg_place_holder.png";
26 }
WM_IMPLEMENT_SINGLE_INSTANCE(PlaceHolderWindow)27 WM_IMPLEMENT_SINGLE_INSTANCE(PlaceHolderWindow)
28
29 void PlaceholderWindowListener::OnTouchOutside() const
30 {
31 WLOGFD("place holder touch outside");
32 PlaceHolderWindow::GetInstance().Destroy();
33 }
34
AfterUnfocused()35 void PlaceholderWindowListener::AfterUnfocused()
36 {
37 WLOGFD("place holder after unfocused");
38 PlaceHolderWindow::GetInstance().Destroy();
39 }
40
OnInputEvent(const std::shared_ptr<MMI::KeyEvent> & keyEvent) const41 bool PlaceholderInputEventConsumer::OnInputEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent) const
42 {
43 WLOGFD("place holder get key event");
44 PlaceHolderWindow::GetInstance().Destroy();
45 return true;
46 }
47
OnInputEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent) const48 bool PlaceholderInputEventConsumer::OnInputEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent) const
49 {
50 WLOGFD("place holder get point event");
51 PlaceHolderWindow::GetInstance().Destroy();
52 return true;
53 }
54
OnInputEvent(const std::shared_ptr<MMI::AxisEvent> & axisEvent) const55 bool PlaceholderInputEventConsumer::OnInputEvent(const std::shared_ptr<MMI::AxisEvent>& axisEvent) const
56 {
57 // do nothing
58 return false;
59 }
60
Create(std::string name,DisplayId displyId,Rect rect,WindowMode mode)61 void PlaceHolderWindow::Create(std::string name, DisplayId displyId, Rect rect, WindowMode mode)
62 {
63 WLOGFD("create inner display id: %{public}" PRIu64"", displyId);
64 if (window_ != nullptr) {
65 WLOGFW("window has created.");
66 return;
67 }
68 sptr<WindowOption> option = new (std::nothrow) WindowOption();
69 if (option == nullptr) {
70 WLOGFE("window option is nullptr.");
71 return;
72 }
73 option->SetFocusable(false);
74 option->SetWindowMode(mode);
75 option->SetWindowRect(rect);
76 option->SetWindowType(WindowType::WINDOW_TYPE_PLACEHOLDER);
77 window_ = Window::Create(name, option);
78 if (window_ == nullptr) {
79 WLOGFE("window is nullptr.");
80 return;
81 }
82 window_->AddWindowFlag(WindowFlag::WINDOW_FLAG_FORBID_SPLIT_MOVE);
83 RegisterWindowListener();
84 SetInputEventConsumer();
85 if (!OHOS::Rosen::SurfaceDraw::DrawImage(window_->GetSurfaceNode(), rect.width_, rect.height_,
86 IMAGE_PLACE_HOLDER_PNG_PATH)) {
87 WLOGE("draw surface failed");
88 return;
89 }
90 window_->Show();
91 WLOGFD("create palce holder Window end");
92 }
93
RegisterWindowListener()94 void PlaceHolderWindow::RegisterWindowListener()
95 {
96 if (window_ == nullptr) {
97 WLOGFE("Window is nullptr, register window listener failed.");
98 return;
99 }
100 if (windowListener_ == nullptr) {
101 windowListener_ = new (std::nothrow) PlaceholderWindowListener();
102 }
103 window_->RegisterTouchOutsideListener(windowListener_);
104 window_->RegisterLifeCycleListener(windowListener_);
105 }
106
UnRegisterWindowListener()107 void PlaceHolderWindow::UnRegisterWindowListener()
108 {
109 if (window_ == nullptr || windowListener_ == nullptr) {
110 WLOGFE("Window or listener is nullptr, unregister window listener failed.");
111 return;
112 }
113 window_->UnregisterTouchOutsideListener(windowListener_);
114 window_->UnregisterLifeCycleListener(windowListener_);
115 }
116
SetInputEventConsumer()117 void PlaceHolderWindow::SetInputEventConsumer()
118 {
119 if (window_ == nullptr) {
120 WLOGFE("Window is nullptr, set window input event consumer failed.");
121 return;
122 }
123 if (inputEventConsumer_ == nullptr) {
124 inputEventConsumer_ = std::make_shared<PlaceholderInputEventConsumer>();
125 }
126 window_->SetInputEventConsumer(inputEventConsumer_);
127 }
128
Destroy()129 void PlaceHolderWindow::Destroy()
130 {
131 WLOGI("destroy place holder window begin.");
132 if (window_ != nullptr) {
133 WLOGI("destroy place holder window not nullptr.");
134 UnRegisterWindowListener();
135 window_->SetInputEventConsumer(nullptr);
136 window_->Destroy();
137 }
138 window_ = nullptr;
139 WLOGI("destroy place holder window end.");
140 }
141 } // Rosen
142 } // OHOS