• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-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 "zidl/window_stub.h"
17 #include <vector>
18 #include "ipc_skeleton.h"
19 #include <key_event.h>
20 #include "pointer_event.h"
21 #include "window_manager_hilog.h"
22 #include <transaction/rs_transaction.h>
23 
24 namespace OHOS {
25 namespace Rosen {
26 namespace {
27     constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowStub"};
28 }
29 
OnRemoteRequest(uint32_t code,MessageParcel & data,MessageParcel & reply,MessageOption & option)30 int WindowStub::OnRemoteRequest(uint32_t code, MessageParcel &data, MessageParcel &reply, MessageOption &option)
31 {
32     if (staticDestroyMonitor_.IsDestroyed()) {
33         WLOGFE("Main thread finished, static data has been destroyed");
34         return -1;
35     }
36     if (data.ReadInterfaceToken() != GetDescriptor()) {
37         WLOGFE("InterfaceToken check failed");
38         return -1;
39     }
40     WindowMessage msgId = static_cast<WindowMessage>(code);
41     switch (msgId) {
42         case WindowMessage::TRANS_ID_UPDATE_WINDOW_RECT: {
43             struct Rect rect { data.ReadInt32(), data.ReadInt32(), data.ReadUint32(), data.ReadUint32() };
44             bool decoStatus = data.ReadBool();
45             WindowSizeChangeReason reason = static_cast<WindowSizeChangeReason>(data.ReadUint32());
46             bool hasRSTransaction = data.ReadBool();
47             if (hasRSTransaction) {
48                 auto rsTransaction = data.ReadParcelable<RSTransaction>();
49                 if (!rsTransaction) {
50                     WLOGFE("RSTransaction unMarsh failed");
51                     return -1;
52                 }
53                 std::shared_ptr<RSTransaction> transaction(rsTransaction);
54                 UpdateWindowRect(rect, decoStatus, reason, transaction);
55             } else {
56                 UpdateWindowRect(rect, decoStatus, reason);
57             }
58             break;
59         }
60         case WindowMessage::TRANS_ID_UPDATE_WINDOW_MODE: {
61             WindowMode mode = static_cast<WindowMode>(data.ReadUint32());
62             UpdateWindowMode(mode);
63             break;
64         }
65         case WindowMessage::TRANS_ID_UPDATE_MODE_SUPPORT_INFO: {
66             uint32_t modeSupportInfo = data.ReadUint32();
67             UpdateWindowModeSupportInfo(modeSupportInfo);
68             break;
69         }
70         case WindowMessage::TRANS_ID_UPDATE_FOCUS_STATUS: {
71             bool focused = data.ReadBool();
72             UpdateFocusStatus(focused);
73             break;
74         }
75         case WindowMessage::TRANS_ID_UPDATE_AVOID_AREA: {
76             sptr<AvoidArea> avoidArea = data.ReadStrongParcelable<AvoidArea>();
77             uint32_t type;
78             if (!data.ReadUint32(type)) {
79                 return -1;
80             }
81             UpdateAvoidArea(avoidArea, static_cast<AvoidAreaType>(type));
82             break;
83         }
84         case WindowMessage::TRANS_ID_UPDATE_WINDOW_STATE: {
85             UpdateWindowState(static_cast<WindowState>(data.ReadUint32()));
86             break;
87         }
88         case WindowMessage::TRANS_ID_UPDATE_DRAG_EVENT: {
89             PointInfo point;
90             point.x = data.ReadInt32();
91             point.y = data.ReadInt32();
92             DragEvent event = static_cast<DragEvent>(data.ReadUint32());
93             UpdateWindowDragInfo(point, event);
94             break;
95         }
96         case WindowMessage::TRANS_ID_UPDATE_DISPLAY_ID: {
97             UpdateDisplayId(data.ReadUint64(), data.ReadUint64());
98             break;
99         }
100         case WindowMessage::TRANS_ID_UPDATE_OCCUPIED_AREA: {
101             sptr<OccupiedAreaChangeInfo> info = data.ReadParcelable<OccupiedAreaChangeInfo>();
102             bool hasRSTransaction = data.ReadBool();
103             if (hasRSTransaction) {
104                 auto rsTransaction = data.ReadParcelable<RSTransaction>();
105                 if (!rsTransaction) {
106                     WLOGFE("RSTransaction unMarsh failed");
107                     return -1;
108                 }
109                 std::shared_ptr<RSTransaction> transaction(rsTransaction);
110                 UpdateOccupiedAreaChangeInfo(info, transaction);
111             } else {
112                 UpdateOccupiedAreaChangeInfo(info);
113             }
114 
115             break;
116         }
117         case WindowMessage::TRANS_ID_UPDATE_OCCUPIED_AREA_AND_RECT: {
118             sptr<OccupiedAreaChangeInfo> info = data.ReadParcelable<OccupiedAreaChangeInfo>();
119             struct Rect rect { data.ReadInt32(), data.ReadInt32(), data.ReadUint32(), data.ReadUint32() };
120             bool hasRSTransaction = data.ReadBool();
121             if (hasRSTransaction) {
122                 auto rsTransaction = data.ReadParcelable<RSTransaction>();
123                 if (!rsTransaction) {
124                     WLOGFE("RSTransaction unMarsh failed");
125                     return -1;
126                 }
127                 std::shared_ptr<RSTransaction> transaction(rsTransaction);
128                 UpdateOccupiedAreaAndRect(info, rect, transaction);
129             } else {
130                 UpdateOccupiedAreaAndRect(info, rect);
131             }
132 
133             break;
134         }
135         case WindowMessage::TRANS_ID_UPDATE_ACTIVE_STATUS: {
136             bool isActive = data.ReadBool();
137             UpdateActiveStatus(isActive);
138             break;
139         }
140         case WindowMessage::TRANS_ID_GET_WINDOW_PROPERTY: {
141             auto property = GetWindowProperty();
142             reply.WriteParcelable(property.GetRefPtr());
143             break;
144         }
145         case WindowMessage::TRANS_ID_NOTIFY_OUTSIDE_PRESSED: {
146             NotifyTouchOutside();
147             break;
148         }
149         case WindowMessage::TRANS_ID_NOTIFY_SCREEN_SHOT: {
150             NotifyScreenshot();
151             break;
152         }
153         case WindowMessage::TRANS_ID_NOTIFY_DESTROY: {
154             NotifyDestroy();
155             break;
156         }
157         case WindowMessage::TRANS_ID_NOTIFY_FOREGROUND: {
158             NotifyForeground();
159             break;
160         }
161         case WindowMessage::TRANS_ID_NOTIFY_BACKGROUND: {
162             NotifyBackground();
163             break;
164         }
165         case WindowMessage::TRANS_ID_DUMP_INFO: {
166             std::vector<std::string> params;
167             if (!data.ReadStringVector(&params)) {
168                 WLOGFE("Fail to read params");
169                 return -1;
170             }
171             DumpInfo(params);
172             break;
173         }
174         case WindowMessage::TRANS_ID_NOTIFY_CLIENT_POINT_UP: {
175             auto pointerEvent = MMI::PointerEvent::Create();
176             if (!pointerEvent->ReadFromParcel(data)) {
177                 WLOGFE("Read Pointer Event failed");
178                 return -1;
179             }
180             NotifyWindowClientPointUp(pointerEvent);
181             break;
182         }
183         case WindowMessage::TRANS_ID_UPDATE_ZOOM_TRANSFORM: {
184             Transform trans;
185             trans.Unmarshalling(data);
186             bool isDisplayZoomOn = data.ReadBool();
187             UpdateZoomTransform(trans, isDisplayZoomOn);
188             break;
189         }
190         case WindowMessage::TRANS_ID_RESTORE_SPLIT_WINDOW_MODE: {
191             RestoreSplitWindowMode(data.ReadUint32());
192             break;
193         }
194         case WindowMessage::TRANS_ID_CONSUME_KEY_EVENT: {
195             auto event = MMI::KeyEvent::Create();
196             if (!event->ReadFromParcel(data)) {
197                 WLOGFE("Read Pointer Event failed");
198                 return -1;
199             }
200             ConsumeKeyEvent(event);
201             break;
202         }
203         case WindowMessage::TRANS_ID_NOTIFY_FOREGROUND_INTERACTIVE_STATUS: {
204             bool interactive = data.ReadBool();
205             NotifyForegroundInteractiveStatus(interactive);
206             break;
207         }
208         default:
209             WLOGFW("unknown transaction code %{public}d", code);
210             return IPCObjectStub::OnRemoteRequest(code, data, reply, option);
211     }
212     return 0;
213 }
214 } // namespace Rosen
215 } // namespace OHOS
216