xref: /aosp_15_r20/frameworks/native/libs/gui/WindowInfo.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2011 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #define LOG_TAG "WindowInfo"
18*38e8c45fSAndroid Build Coastguard Worker #define LOG_NDEBUG 0
19*38e8c45fSAndroid Build Coastguard Worker 
20*38e8c45fSAndroid Build Coastguard Worker #include <type_traits>
21*38e8c45fSAndroid Build Coastguard Worker 
22*38e8c45fSAndroid Build Coastguard Worker #include <binder/Parcel.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <gui/WindowInfo.h>
24*38e8c45fSAndroid Build Coastguard Worker 
25*38e8c45fSAndroid Build Coastguard Worker #include <log/log.h>
26*38e8c45fSAndroid Build Coastguard Worker 
27*38e8c45fSAndroid Build Coastguard Worker namespace android::gui {
28*38e8c45fSAndroid Build Coastguard Worker 
29*38e8c45fSAndroid Build Coastguard Worker namespace {
30*38e8c45fSAndroid Build Coastguard Worker 
operator <<(std::ostream & out,const sp<IBinder> & binder)31*38e8c45fSAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& out, const sp<IBinder>& binder) {
32*38e8c45fSAndroid Build Coastguard Worker     if (binder == nullptr) {
33*38e8c45fSAndroid Build Coastguard Worker         out << "<null>";
34*38e8c45fSAndroid Build Coastguard Worker     } else {
35*38e8c45fSAndroid Build Coastguard Worker         out << binder.get();
36*38e8c45fSAndroid Build Coastguard Worker     }
37*38e8c45fSAndroid Build Coastguard Worker     return out;
38*38e8c45fSAndroid Build Coastguard Worker }
39*38e8c45fSAndroid Build Coastguard Worker 
operator <<(std::ostream & out,const Region & region)40*38e8c45fSAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& out, const Region& region) {
41*38e8c45fSAndroid Build Coastguard Worker     if (region.isEmpty()) {
42*38e8c45fSAndroid Build Coastguard Worker         out << "<empty>";
43*38e8c45fSAndroid Build Coastguard Worker         return out;
44*38e8c45fSAndroid Build Coastguard Worker     }
45*38e8c45fSAndroid Build Coastguard Worker 
46*38e8c45fSAndroid Build Coastguard Worker     bool first = true;
47*38e8c45fSAndroid Build Coastguard Worker     Region::const_iterator cur = region.begin();
48*38e8c45fSAndroid Build Coastguard Worker     Region::const_iterator const tail = region.end();
49*38e8c45fSAndroid Build Coastguard Worker     while (cur != tail) {
50*38e8c45fSAndroid Build Coastguard Worker         if (first) {
51*38e8c45fSAndroid Build Coastguard Worker             first = false;
52*38e8c45fSAndroid Build Coastguard Worker         } else {
53*38e8c45fSAndroid Build Coastguard Worker             out << "|";
54*38e8c45fSAndroid Build Coastguard Worker         }
55*38e8c45fSAndroid Build Coastguard Worker         out << "[" << cur->left << "," << cur->top << "][" << cur->right << "," << cur->bottom
56*38e8c45fSAndroid Build Coastguard Worker             << "]";
57*38e8c45fSAndroid Build Coastguard Worker         cur++;
58*38e8c45fSAndroid Build Coastguard Worker     }
59*38e8c45fSAndroid Build Coastguard Worker     return out;
60*38e8c45fSAndroid Build Coastguard Worker }
61*38e8c45fSAndroid Build Coastguard Worker 
62*38e8c45fSAndroid Build Coastguard Worker } // namespace
63*38e8c45fSAndroid Build Coastguard Worker 
setInputConfig(ftl::Flags<InputConfig> config,bool value)64*38e8c45fSAndroid Build Coastguard Worker void WindowInfo::setInputConfig(ftl::Flags<InputConfig> config, bool value) {
65*38e8c45fSAndroid Build Coastguard Worker     if (value) {
66*38e8c45fSAndroid Build Coastguard Worker         inputConfig |= config;
67*38e8c45fSAndroid Build Coastguard Worker         return;
68*38e8c45fSAndroid Build Coastguard Worker     }
69*38e8c45fSAndroid Build Coastguard Worker     inputConfig &= ~config;
70*38e8c45fSAndroid Build Coastguard Worker }
71*38e8c45fSAndroid Build Coastguard Worker 
addTouchableRegion(const Rect & region)72*38e8c45fSAndroid Build Coastguard Worker void WindowInfo::addTouchableRegion(const Rect& region) {
73*38e8c45fSAndroid Build Coastguard Worker     touchableRegion.orSelf(region);
74*38e8c45fSAndroid Build Coastguard Worker }
75*38e8c45fSAndroid Build Coastguard Worker 
supportsSplitTouch() const76*38e8c45fSAndroid Build Coastguard Worker bool WindowInfo::supportsSplitTouch() const {
77*38e8c45fSAndroid Build Coastguard Worker     return !inputConfig.test(InputConfig::PREVENT_SPLITTING);
78*38e8c45fSAndroid Build Coastguard Worker }
79*38e8c45fSAndroid Build Coastguard Worker 
isSpy() const80*38e8c45fSAndroid Build Coastguard Worker bool WindowInfo::isSpy() const {
81*38e8c45fSAndroid Build Coastguard Worker     return inputConfig.test(InputConfig::SPY);
82*38e8c45fSAndroid Build Coastguard Worker }
83*38e8c45fSAndroid Build Coastguard Worker 
interceptsStylus() const84*38e8c45fSAndroid Build Coastguard Worker bool WindowInfo::interceptsStylus() const {
85*38e8c45fSAndroid Build Coastguard Worker     return inputConfig.test(InputConfig::INTERCEPTS_STYLUS);
86*38e8c45fSAndroid Build Coastguard Worker }
87*38e8c45fSAndroid Build Coastguard Worker 
overlaps(const WindowInfo * other) const88*38e8c45fSAndroid Build Coastguard Worker bool WindowInfo::overlaps(const WindowInfo* other) const {
89*38e8c45fSAndroid Build Coastguard Worker     return !frame.isEmpty() && frame.left < other->frame.right && frame.right > other->frame.left &&
90*38e8c45fSAndroid Build Coastguard Worker             frame.top < other->frame.bottom && frame.bottom > other->frame.top;
91*38e8c45fSAndroid Build Coastguard Worker }
92*38e8c45fSAndroid Build Coastguard Worker 
operator ==(const WindowInfo & info) const93*38e8c45fSAndroid Build Coastguard Worker bool WindowInfo::operator==(const WindowInfo& info) const {
94*38e8c45fSAndroid Build Coastguard Worker     return info.token == token && info.id == id && info.name == name &&
95*38e8c45fSAndroid Build Coastguard Worker             info.dispatchingTimeout == dispatchingTimeout && info.frame == frame &&
96*38e8c45fSAndroid Build Coastguard Worker             info.contentSize == contentSize && info.surfaceInset == surfaceInset &&
97*38e8c45fSAndroid Build Coastguard Worker             info.globalScaleFactor == globalScaleFactor && info.transform == transform &&
98*38e8c45fSAndroid Build Coastguard Worker             info.touchableRegion.hasSameRects(touchableRegion) &&
99*38e8c45fSAndroid Build Coastguard Worker             info.touchOcclusionMode == touchOcclusionMode && info.ownerPid == ownerPid &&
100*38e8c45fSAndroid Build Coastguard Worker             info.ownerUid == ownerUid && info.packageName == packageName &&
101*38e8c45fSAndroid Build Coastguard Worker             info.inputConfig == inputConfig && info.displayId == displayId &&
102*38e8c45fSAndroid Build Coastguard Worker             info.replaceTouchableRegionWithCrop == replaceTouchableRegionWithCrop &&
103*38e8c45fSAndroid Build Coastguard Worker             info.applicationInfo == applicationInfo && info.layoutParamsType == layoutParamsType &&
104*38e8c45fSAndroid Build Coastguard Worker             info.layoutParamsFlags == layoutParamsFlags &&
105*38e8c45fSAndroid Build Coastguard Worker             info.canOccludePresentation == canOccludePresentation;
106*38e8c45fSAndroid Build Coastguard Worker }
107*38e8c45fSAndroid Build Coastguard Worker 
writeToParcel(android::Parcel * parcel) const108*38e8c45fSAndroid Build Coastguard Worker status_t WindowInfo::writeToParcel(android::Parcel* parcel) const {
109*38e8c45fSAndroid Build Coastguard Worker     if (parcel == nullptr) {
110*38e8c45fSAndroid Build Coastguard Worker         ALOGE("%s: Null parcel", __func__);
111*38e8c45fSAndroid Build Coastguard Worker         return BAD_VALUE;
112*38e8c45fSAndroid Build Coastguard Worker     }
113*38e8c45fSAndroid Build Coastguard Worker     if (name.empty()) {
114*38e8c45fSAndroid Build Coastguard Worker         parcel->writeInt32(0);
115*38e8c45fSAndroid Build Coastguard Worker         return OK;
116*38e8c45fSAndroid Build Coastguard Worker     }
117*38e8c45fSAndroid Build Coastguard Worker     parcel->writeInt32(1);
118*38e8c45fSAndroid Build Coastguard Worker 
119*38e8c45fSAndroid Build Coastguard Worker     // Ensure that the size of custom types are what we expect for writing into the parcel.
120*38e8c45fSAndroid Build Coastguard Worker     static_assert(sizeof(inputConfig) == 4u);
121*38e8c45fSAndroid Build Coastguard Worker     static_assert(sizeof(ownerPid.val()) == 4u);
122*38e8c45fSAndroid Build Coastguard Worker     static_assert(sizeof(ownerUid.val()) == 4u);
123*38e8c45fSAndroid Build Coastguard Worker 
124*38e8c45fSAndroid Build Coastguard Worker     // clang-format off
125*38e8c45fSAndroid Build Coastguard Worker     status_t status = parcel->writeStrongBinder(token) ?:
126*38e8c45fSAndroid Build Coastguard Worker         parcel->writeInt64(dispatchingTimeout.count()) ?:
127*38e8c45fSAndroid Build Coastguard Worker         parcel->writeInt32(id) ?:
128*38e8c45fSAndroid Build Coastguard Worker         parcel->writeUtf8AsUtf16(name) ?:
129*38e8c45fSAndroid Build Coastguard Worker         parcel->writeInt32(layoutParamsFlags.get()) ?:
130*38e8c45fSAndroid Build Coastguard Worker         parcel->writeInt32(
131*38e8c45fSAndroid Build Coastguard Worker                 static_cast<std::underlying_type_t<WindowInfo::Type>>(layoutParamsType)) ?:
132*38e8c45fSAndroid Build Coastguard Worker         parcel->write(frame) ?:
133*38e8c45fSAndroid Build Coastguard Worker         parcel->writeInt32(contentSize.width) ?:
134*38e8c45fSAndroid Build Coastguard Worker         parcel->writeInt32(contentSize.height) ?:
135*38e8c45fSAndroid Build Coastguard Worker         parcel->writeInt32(surfaceInset) ?:
136*38e8c45fSAndroid Build Coastguard Worker         parcel->writeFloat(globalScaleFactor) ?:
137*38e8c45fSAndroid Build Coastguard Worker         parcel->writeFloat(alpha) ?:
138*38e8c45fSAndroid Build Coastguard Worker         parcel->writeFloat(transform.dsdx()) ?:
139*38e8c45fSAndroid Build Coastguard Worker         parcel->writeFloat(transform.dtdx()) ?:
140*38e8c45fSAndroid Build Coastguard Worker         parcel->writeFloat(transform.tx()) ?:
141*38e8c45fSAndroid Build Coastguard Worker         parcel->writeFloat(transform.dtdy()) ?:
142*38e8c45fSAndroid Build Coastguard Worker         parcel->writeFloat(transform.dsdy()) ?:
143*38e8c45fSAndroid Build Coastguard Worker         parcel->writeFloat(transform.ty()) ?:
144*38e8c45fSAndroid Build Coastguard Worker         parcel->writeInt32(static_cast<int32_t>(touchOcclusionMode)) ?:
145*38e8c45fSAndroid Build Coastguard Worker         parcel->writeInt32(ownerPid.val()) ?:
146*38e8c45fSAndroid Build Coastguard Worker         parcel->writeInt32(ownerUid.val()) ?:
147*38e8c45fSAndroid Build Coastguard Worker         parcel->writeUtf8AsUtf16(packageName) ?:
148*38e8c45fSAndroid Build Coastguard Worker         parcel->writeInt32(inputConfig.get()) ?:
149*38e8c45fSAndroid Build Coastguard Worker         parcel->writeInt32(displayId.val()) ?:
150*38e8c45fSAndroid Build Coastguard Worker         applicationInfo.writeToParcel(parcel) ?:
151*38e8c45fSAndroid Build Coastguard Worker         parcel->write(touchableRegion) ?:
152*38e8c45fSAndroid Build Coastguard Worker         parcel->writeBool(replaceTouchableRegionWithCrop) ?:
153*38e8c45fSAndroid Build Coastguard Worker         parcel->writeStrongBinder(touchableRegionCropHandle.promote()) ?:
154*38e8c45fSAndroid Build Coastguard Worker         parcel->writeStrongBinder(windowToken) ?:
155*38e8c45fSAndroid Build Coastguard Worker         parcel->writeStrongBinder(focusTransferTarget) ?:
156*38e8c45fSAndroid Build Coastguard Worker         parcel->writeBool(canOccludePresentation);
157*38e8c45fSAndroid Build Coastguard Worker     // clang-format on
158*38e8c45fSAndroid Build Coastguard Worker     return status;
159*38e8c45fSAndroid Build Coastguard Worker }
160*38e8c45fSAndroid Build Coastguard Worker 
readFromParcel(const android::Parcel * parcel)161*38e8c45fSAndroid Build Coastguard Worker status_t WindowInfo::readFromParcel(const android::Parcel* parcel) {
162*38e8c45fSAndroid Build Coastguard Worker     if (parcel == nullptr) {
163*38e8c45fSAndroid Build Coastguard Worker         ALOGE("%s: Null parcel", __func__);
164*38e8c45fSAndroid Build Coastguard Worker         return BAD_VALUE;
165*38e8c45fSAndroid Build Coastguard Worker     }
166*38e8c45fSAndroid Build Coastguard Worker     if (parcel->readInt32() == 0) {
167*38e8c45fSAndroid Build Coastguard Worker         return OK;
168*38e8c45fSAndroid Build Coastguard Worker     }
169*38e8c45fSAndroid Build Coastguard Worker 
170*38e8c45fSAndroid Build Coastguard Worker     token = parcel->readStrongBinder();
171*38e8c45fSAndroid Build Coastguard Worker     dispatchingTimeout = static_cast<decltype(dispatchingTimeout)>(parcel->readInt64());
172*38e8c45fSAndroid Build Coastguard Worker     status_t status = parcel->readInt32(&id) ?: parcel->readUtf8FromUtf16(&name);
173*38e8c45fSAndroid Build Coastguard Worker     if (status != OK) {
174*38e8c45fSAndroid Build Coastguard Worker         return status;
175*38e8c45fSAndroid Build Coastguard Worker     }
176*38e8c45fSAndroid Build Coastguard Worker 
177*38e8c45fSAndroid Build Coastguard Worker     float dsdx, dtdx, tx, dtdy, dsdy, ty;
178*38e8c45fSAndroid Build Coastguard Worker     int32_t lpFlags, lpType, touchOcclusionModeInt, inputConfigInt, ownerPidInt, ownerUidInt,
179*38e8c45fSAndroid Build Coastguard Worker             displayIdInt;
180*38e8c45fSAndroid Build Coastguard Worker     sp<IBinder> touchableRegionCropHandleSp;
181*38e8c45fSAndroid Build Coastguard Worker 
182*38e8c45fSAndroid Build Coastguard Worker     // clang-format off
183*38e8c45fSAndroid Build Coastguard Worker     status = parcel->readInt32(&lpFlags) ?:
184*38e8c45fSAndroid Build Coastguard Worker         parcel->readInt32(&lpType) ?:
185*38e8c45fSAndroid Build Coastguard Worker         parcel->read(frame) ?:
186*38e8c45fSAndroid Build Coastguard Worker         parcel->readInt32(&contentSize.width) ?:
187*38e8c45fSAndroid Build Coastguard Worker         parcel->readInt32(&contentSize.height) ?:
188*38e8c45fSAndroid Build Coastguard Worker         parcel->readInt32(&surfaceInset) ?:
189*38e8c45fSAndroid Build Coastguard Worker         parcel->readFloat(&globalScaleFactor) ?:
190*38e8c45fSAndroid Build Coastguard Worker         parcel->readFloat(&alpha) ?:
191*38e8c45fSAndroid Build Coastguard Worker         parcel->readFloat(&dsdx) ?:
192*38e8c45fSAndroid Build Coastguard Worker         parcel->readFloat(&dtdx) ?:
193*38e8c45fSAndroid Build Coastguard Worker         parcel->readFloat(&tx) ?:
194*38e8c45fSAndroid Build Coastguard Worker         parcel->readFloat(&dtdy) ?:
195*38e8c45fSAndroid Build Coastguard Worker         parcel->readFloat(&dsdy) ?:
196*38e8c45fSAndroid Build Coastguard Worker         parcel->readFloat(&ty) ?:
197*38e8c45fSAndroid Build Coastguard Worker         parcel->readInt32(&touchOcclusionModeInt) ?:
198*38e8c45fSAndroid Build Coastguard Worker         parcel->readInt32(&ownerPidInt) ?:
199*38e8c45fSAndroid Build Coastguard Worker         parcel->readInt32(&ownerUidInt) ?:
200*38e8c45fSAndroid Build Coastguard Worker         parcel->readUtf8FromUtf16(&packageName) ?:
201*38e8c45fSAndroid Build Coastguard Worker         parcel->readInt32(&inputConfigInt) ?:
202*38e8c45fSAndroid Build Coastguard Worker         parcel->readInt32(&displayIdInt) ?:
203*38e8c45fSAndroid Build Coastguard Worker         applicationInfo.readFromParcel(parcel) ?:
204*38e8c45fSAndroid Build Coastguard Worker         parcel->read(touchableRegion) ?:
205*38e8c45fSAndroid Build Coastguard Worker         parcel->readBool(&replaceTouchableRegionWithCrop) ?:
206*38e8c45fSAndroid Build Coastguard Worker         parcel->readNullableStrongBinder(&touchableRegionCropHandleSp) ?:
207*38e8c45fSAndroid Build Coastguard Worker         parcel->readNullableStrongBinder(&windowToken) ?:
208*38e8c45fSAndroid Build Coastguard Worker         parcel->readNullableStrongBinder(&focusTransferTarget) ?:
209*38e8c45fSAndroid Build Coastguard Worker         parcel->readBool(&canOccludePresentation);
210*38e8c45fSAndroid Build Coastguard Worker 
211*38e8c45fSAndroid Build Coastguard Worker     // clang-format on
212*38e8c45fSAndroid Build Coastguard Worker 
213*38e8c45fSAndroid Build Coastguard Worker     if (status != OK) {
214*38e8c45fSAndroid Build Coastguard Worker         return status;
215*38e8c45fSAndroid Build Coastguard Worker     }
216*38e8c45fSAndroid Build Coastguard Worker 
217*38e8c45fSAndroid Build Coastguard Worker     layoutParamsFlags = ftl::Flags<Flag>(lpFlags);
218*38e8c45fSAndroid Build Coastguard Worker     layoutParamsType = static_cast<Type>(lpType);
219*38e8c45fSAndroid Build Coastguard Worker     transform.set({dsdx, dtdx, tx, dtdy, dsdy, ty, 0, 0, 1});
220*38e8c45fSAndroid Build Coastguard Worker     touchOcclusionMode = static_cast<TouchOcclusionMode>(touchOcclusionModeInt);
221*38e8c45fSAndroid Build Coastguard Worker     inputConfig = ftl::Flags<InputConfig>(inputConfigInt);
222*38e8c45fSAndroid Build Coastguard Worker     ownerPid = Pid{ownerPidInt};
223*38e8c45fSAndroid Build Coastguard Worker     ownerUid = Uid{static_cast<uid_t>(ownerUidInt)};
224*38e8c45fSAndroid Build Coastguard Worker     touchableRegionCropHandle = touchableRegionCropHandleSp;
225*38e8c45fSAndroid Build Coastguard Worker     displayId = ui::LogicalDisplayId{displayIdInt};
226*38e8c45fSAndroid Build Coastguard Worker 
227*38e8c45fSAndroid Build Coastguard Worker     return OK;
228*38e8c45fSAndroid Build Coastguard Worker }
229*38e8c45fSAndroid Build Coastguard Worker 
WindowInfoHandle()230*38e8c45fSAndroid Build Coastguard Worker WindowInfoHandle::WindowInfoHandle() {}
231*38e8c45fSAndroid Build Coastguard Worker 
~WindowInfoHandle()232*38e8c45fSAndroid Build Coastguard Worker WindowInfoHandle::~WindowInfoHandle() {}
233*38e8c45fSAndroid Build Coastguard Worker 
WindowInfoHandle(const WindowInfoHandle & other)234*38e8c45fSAndroid Build Coastguard Worker WindowInfoHandle::WindowInfoHandle(const WindowInfoHandle& other) : mInfo(other.mInfo) {}
235*38e8c45fSAndroid Build Coastguard Worker 
WindowInfoHandle(const WindowInfo & other)236*38e8c45fSAndroid Build Coastguard Worker WindowInfoHandle::WindowInfoHandle(const WindowInfo& other) : mInfo(other) {}
237*38e8c45fSAndroid Build Coastguard Worker 
writeToParcel(android::Parcel * parcel) const238*38e8c45fSAndroid Build Coastguard Worker status_t WindowInfoHandle::writeToParcel(android::Parcel* parcel) const {
239*38e8c45fSAndroid Build Coastguard Worker     return mInfo.writeToParcel(parcel);
240*38e8c45fSAndroid Build Coastguard Worker }
241*38e8c45fSAndroid Build Coastguard Worker 
readFromParcel(const android::Parcel * parcel)242*38e8c45fSAndroid Build Coastguard Worker status_t WindowInfoHandle::readFromParcel(const android::Parcel* parcel) {
243*38e8c45fSAndroid Build Coastguard Worker     return mInfo.readFromParcel(parcel);
244*38e8c45fSAndroid Build Coastguard Worker }
245*38e8c45fSAndroid Build Coastguard Worker 
releaseChannel()246*38e8c45fSAndroid Build Coastguard Worker void WindowInfoHandle::releaseChannel() {
247*38e8c45fSAndroid Build Coastguard Worker     mInfo.token.clear();
248*38e8c45fSAndroid Build Coastguard Worker }
249*38e8c45fSAndroid Build Coastguard Worker 
getToken() const250*38e8c45fSAndroid Build Coastguard Worker sp<IBinder> WindowInfoHandle::getToken() const {
251*38e8c45fSAndroid Build Coastguard Worker     return mInfo.token;
252*38e8c45fSAndroid Build Coastguard Worker }
253*38e8c45fSAndroid Build Coastguard Worker 
updateFrom(sp<WindowInfoHandle> handle)254*38e8c45fSAndroid Build Coastguard Worker void WindowInfoHandle::updateFrom(sp<WindowInfoHandle> handle) {
255*38e8c45fSAndroid Build Coastguard Worker     mInfo = handle->mInfo;
256*38e8c45fSAndroid Build Coastguard Worker }
257*38e8c45fSAndroid Build Coastguard Worker 
operator <<(std::ostream & out,const WindowInfo & info)258*38e8c45fSAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& out, const WindowInfo& info) {
259*38e8c45fSAndroid Build Coastguard Worker     out << "name=" << info.name << ", id=" << info.id << ", displayId=" << info.displayId
260*38e8c45fSAndroid Build Coastguard Worker         << ", inputConfig=" << info.inputConfig.string() << ", alpha=" << info.alpha << ", frame=["
261*38e8c45fSAndroid Build Coastguard Worker         << info.frame.left << "," << info.frame.top << "][" << info.frame.right << ","
262*38e8c45fSAndroid Build Coastguard Worker         << info.frame.bottom << "], globalScale=" << info.globalScaleFactor
263*38e8c45fSAndroid Build Coastguard Worker         << ", applicationInfo.name=" << info.applicationInfo.name
264*38e8c45fSAndroid Build Coastguard Worker         << ", applicationInfo.token=" << info.applicationInfo.token
265*38e8c45fSAndroid Build Coastguard Worker         << ", touchableRegion=" << info.touchableRegion << ", ownerPid=" << info.ownerPid.toString()
266*38e8c45fSAndroid Build Coastguard Worker         << ", ownerUid=" << info.ownerUid.toString() << ", dispatchingTimeout="
267*38e8c45fSAndroid Build Coastguard Worker         << std::chrono::duration_cast<std::chrono::milliseconds>(info.dispatchingTimeout).count()
268*38e8c45fSAndroid Build Coastguard Worker         << "ms, token=" << info.token.get()
269*38e8c45fSAndroid Build Coastguard Worker         << ", touchOcclusionMode=" << ftl::enum_string(info.touchOcclusionMode);
270*38e8c45fSAndroid Build Coastguard Worker     if (info.canOccludePresentation) out << ", canOccludePresentation";
271*38e8c45fSAndroid Build Coastguard Worker     std::string transform;
272*38e8c45fSAndroid Build Coastguard Worker     info.transform.dump(transform, "transform", "    ");
273*38e8c45fSAndroid Build Coastguard Worker     out << "\n" << transform;
274*38e8c45fSAndroid Build Coastguard Worker     return out;
275*38e8c45fSAndroid Build Coastguard Worker }
276*38e8c45fSAndroid Build Coastguard Worker 
operator <<(std::ostream & out,const WindowInfoHandle & window)277*38e8c45fSAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& out, const WindowInfoHandle& window) {
278*38e8c45fSAndroid Build Coastguard Worker     const WindowInfo& info = *window.getInfo();
279*38e8c45fSAndroid Build Coastguard Worker     out << info;
280*38e8c45fSAndroid Build Coastguard Worker     return out;
281*38e8c45fSAndroid Build Coastguard Worker }
282*38e8c45fSAndroid Build Coastguard Worker 
283*38e8c45fSAndroid Build Coastguard Worker } // namespace android::gui
284