From 83aca38885df5030532c6dfe74a1fcef3ddfb432 Mon Sep 17 00:00:00 2001 From: Prabir Pradhan Date: Fri, 22 Jul 2022 19:53:04 +0000 Subject: Reland: Send WindowInfo even if the window isn't associated with a DisplayDevice Previously reverted for b/240320932. Fixed broken test. The previous behavior was the following: If a window was in a layerStack for which there were no DisplayDevices that mapped to it, there was no WindowInfo sent for it. When a display is turned OFF, it is mapped to an invalid layer stack. So when the primary display is turned OFF, there is no WindowInfo sent for any windows on layerStack 0 as there are no DisplayDevices that now map to it. In this model, no window can receive input when the display is OFF. In this CL, we change the behavior so that WindowInfos are sent even if there are no DisplayDevices that map to its layerStack -- except that in this case, we do not let the window receive touches, as we do not have a valid transform associated with it. Bug: 239788987 Test: See bug for repro steps Test: Observe logs at runtime Test: atest libgui_tests Change-Id: Ib7e343685a0e3a87769883bdd5e24ac0e6d5e83f (cherry picked from commit da0f62ce866950a67decdfed0748458fdeff9257) --- services/surfaceflinger/Layer.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'services/surfaceflinger/Layer.cpp') diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp index be16942d40..bcc94d3146 100644 --- a/services/surfaceflinger/Layer.cpp +++ b/services/surfaceflinger/Layer.cpp @@ -81,6 +81,7 @@ namespace android { namespace { constexpr int kDumpTableRowLength = 159; +const ui::Transform kIdentityTransform; } // namespace using namespace ftl::flag_operators; @@ -2162,7 +2163,8 @@ void Layer::writeToProtoCommonState(LayerProto* layerInfo, LayerVector::StateSet if ((traceFlags & LayerTracing::TRACE_INPUT) && needsInputInfo()) { WindowInfo info; if (useDrawing) { - info = fillInputInfo(ui::Transform(), /* displayIsSecure */ true); + info = fillInputInfo( + InputDisplayArgs{.transform = &kIdentityTransform, .isSecure = true}); } else { info = state.inputInfo; } @@ -2369,7 +2371,7 @@ void Layer::handleDropInputMode(gui::WindowInfo& info) const { } } -WindowInfo Layer::fillInputInfo(const ui::Transform& displayTransform, bool displayIsSecure) { +WindowInfo Layer::fillInputInfo(const InputDisplayArgs& displayArgs) { if (!hasInputInfo()) { mDrawingState.inputInfo.name = getName(); mDrawingState.inputInfo.ownerUid = mOwnerUid; @@ -2378,12 +2380,21 @@ WindowInfo Layer::fillInputInfo(const ui::Transform& displayTransform, bool disp mDrawingState.inputInfo.displayId = getLayerStack().id; } + const ui::Transform& displayTransform = + displayArgs.transform != nullptr ? *displayArgs.transform : kIdentityTransform; + WindowInfo info = mDrawingState.inputInfo; info.id = sequence; info.displayId = getLayerStack().id; fillInputFrameInfo(info, displayTransform); + if (displayArgs.transform == nullptr) { + // Do not let the window receive touches if it is not associated with a valid display + // transform. We still allow the window to receive keys and prevent ANRs. + info.inputConfig |= WindowInfo::InputConfig::NOT_TOUCHABLE; + } + // For compatibility reasons we let layers which can receive input // receive input before they have actually submitted a buffer. Because // of this we use canReceiveInput instead of isVisible to check the @@ -2401,7 +2412,7 @@ WindowInfo Layer::fillInputInfo(const ui::Transform& displayTransform, bool disp // If the window will be blacked out on a display because the display does not have the secure // flag and the layer has the secure flag set, then drop input. - if (!displayIsSecure && isSecure()) { + if (!displayArgs.isSecure && isSecure()) { info.inputConfig |= WindowInfo::InputConfig::DROP_INPUT; } -- cgit v1.2.3-59-g8ed1b