Loading services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp +14 −13 Original line number Diff line number Diff line Loading @@ -708,7 +708,7 @@ void LayerSnapshotBuilder::updateSnapshot(LayerSnapshot& snapshot, const Args& a ftl::Flags<RequestedLayerState::Changes> parentChanges = parentSnapshot.changes & (RequestedLayerState::Changes::Hierarchy | RequestedLayerState::Changes::Geometry | RequestedLayerState::Changes::Visibility | RequestedLayerState::Changes::Metadata | RequestedLayerState::Changes::AffectsChildren | RequestedLayerState::Changes::AffectsChildren | RequestedLayerState::Changes::Input | RequestedLayerState::Changes::FrameRate | RequestedLayerState::Changes::GameMode); snapshot.changes |= parentChanges; if (args.displayChanges) snapshot.changes |= RequestedLayerState::Changes::Geometry; Loading Loading @@ -1041,6 +1041,19 @@ void LayerSnapshotBuilder::updateInput(LayerSnapshot& snapshot, snapshot.inputInfo.id = static_cast<int32_t>(snapshot.uniqueSequence); snapshot.inputInfo.displayId = static_cast<int32_t>(snapshot.outputFilter.layerStack.id); snapshot.inputInfo.touchOcclusionMode = requested.hasInputInfo() ? requested.windowInfoHandle->getInfo()->touchOcclusionMode : parentSnapshot.inputInfo.touchOcclusionMode; if (requested.dropInputMode == gui::DropInputMode::ALL || parentSnapshot.dropInputMode == gui::DropInputMode::ALL) { snapshot.dropInputMode = gui::DropInputMode::ALL; } else if (requested.dropInputMode == gui::DropInputMode::OBSCURED || parentSnapshot.dropInputMode == gui::DropInputMode::OBSCURED) { snapshot.dropInputMode = gui::DropInputMode::OBSCURED; } else { snapshot.dropInputMode = gui::DropInputMode::NONE; } updateVisibility(snapshot, snapshot.isVisible); if (!needsInputInfo(snapshot, requested)) { return; Loading @@ -1064,18 +1077,6 @@ void LayerSnapshotBuilder::updateInput(LayerSnapshot& snapshot, } snapshot.inputInfo.alpha = snapshot.color.a; snapshot.inputInfo.touchOcclusionMode = requested.hasInputInfo() ? requested.windowInfoHandle->getInfo()->touchOcclusionMode : parentSnapshot.inputInfo.touchOcclusionMode; if (requested.dropInputMode == gui::DropInputMode::ALL || parentSnapshot.dropInputMode == gui::DropInputMode::ALL) { snapshot.dropInputMode = gui::DropInputMode::ALL; } else if (requested.dropInputMode == gui::DropInputMode::OBSCURED || parentSnapshot.dropInputMode == gui::DropInputMode::OBSCURED) { snapshot.dropInputMode = gui::DropInputMode::OBSCURED; } else { snapshot.dropInputMode = gui::DropInputMode::NONE; } handleDropInputMode(snapshot, parentSnapshot); Loading services/surfaceflinger/FrontEnd/RequestedLayerState.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -417,6 +417,8 @@ std::ostream& operator<<(std::ostream& out, const RequestedLayerState& obj) { if (!obj.handleAlive) out << " handleNotAlive"; if (obj.requestedFrameRate.isValid()) out << " requestedFrameRate: {" << obj.requestedFrameRate << "}"; if (obj.dropInputMode != gui::DropInputMode::NONE) out << " dropInputMode=" << static_cast<uint32_t>(obj.dropInputMode); return out; } Loading services/surfaceflinger/tests/unittests/LayerHierarchyTest.h +11 −0 Original line number Diff line number Diff line Loading @@ -478,6 +478,17 @@ protected: mLifecycleManager.applyTransactions(transactions); } void setDropInputMode(uint32_t id, gui::DropInputMode dropInputMode) { std::vector<TransactionState> transactions; transactions.emplace_back(); transactions.back().states.push_back({}); transactions.back().states.front().state.what = layer_state_t::eDropInputModeChanged; transactions.back().states.front().layerId = id; transactions.back().states.front().state.dropInputMode = dropInputMode; mLifecycleManager.applyTransactions(transactions); } LayerLifecycleManager mLifecycleManager; }; Loading services/surfaceflinger/tests/unittests/LayerSnapshotTest.cpp +21 −0 Original line number Diff line number Diff line Loading @@ -1162,4 +1162,25 @@ TEST_F(LayerSnapshotTest, setSecureRootSnapshot) { EXPECT_TRUE(getSnapshot(11)->isSecure); } // b/314350323 TEST_F(LayerSnapshotTest, propagateDropInputMode) { setDropInputMode(1, gui::DropInputMode::ALL); LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(), .layerLifecycleManager = mLifecycleManager, .includeMetadata = false, .displays = mFrontEndDisplayInfos, .displayChanges = false, .globalShadowSettings = globalShadowSettings, .supportsBlur = true, .supportedLayerGenericMetadata = {}, .genericLayerMetadataKeyMap = {}}; args.rootSnapshot.isSecure = true; update(mSnapshotBuilder, args); EXPECT_EQ(getSnapshot(1)->dropInputMode, gui::DropInputMode::ALL); // Ensure child also has the correct drop input mode regardless of whether either layer has // an input channel EXPECT_EQ(getSnapshot(11)->dropInputMode, gui::DropInputMode::ALL); } } // namespace android::surfaceflinger::frontend Loading
services/surfaceflinger/FrontEnd/LayerSnapshotBuilder.cpp +14 −13 Original line number Diff line number Diff line Loading @@ -708,7 +708,7 @@ void LayerSnapshotBuilder::updateSnapshot(LayerSnapshot& snapshot, const Args& a ftl::Flags<RequestedLayerState::Changes> parentChanges = parentSnapshot.changes & (RequestedLayerState::Changes::Hierarchy | RequestedLayerState::Changes::Geometry | RequestedLayerState::Changes::Visibility | RequestedLayerState::Changes::Metadata | RequestedLayerState::Changes::AffectsChildren | RequestedLayerState::Changes::AffectsChildren | RequestedLayerState::Changes::Input | RequestedLayerState::Changes::FrameRate | RequestedLayerState::Changes::GameMode); snapshot.changes |= parentChanges; if (args.displayChanges) snapshot.changes |= RequestedLayerState::Changes::Geometry; Loading Loading @@ -1041,6 +1041,19 @@ void LayerSnapshotBuilder::updateInput(LayerSnapshot& snapshot, snapshot.inputInfo.id = static_cast<int32_t>(snapshot.uniqueSequence); snapshot.inputInfo.displayId = static_cast<int32_t>(snapshot.outputFilter.layerStack.id); snapshot.inputInfo.touchOcclusionMode = requested.hasInputInfo() ? requested.windowInfoHandle->getInfo()->touchOcclusionMode : parentSnapshot.inputInfo.touchOcclusionMode; if (requested.dropInputMode == gui::DropInputMode::ALL || parentSnapshot.dropInputMode == gui::DropInputMode::ALL) { snapshot.dropInputMode = gui::DropInputMode::ALL; } else if (requested.dropInputMode == gui::DropInputMode::OBSCURED || parentSnapshot.dropInputMode == gui::DropInputMode::OBSCURED) { snapshot.dropInputMode = gui::DropInputMode::OBSCURED; } else { snapshot.dropInputMode = gui::DropInputMode::NONE; } updateVisibility(snapshot, snapshot.isVisible); if (!needsInputInfo(snapshot, requested)) { return; Loading @@ -1064,18 +1077,6 @@ void LayerSnapshotBuilder::updateInput(LayerSnapshot& snapshot, } snapshot.inputInfo.alpha = snapshot.color.a; snapshot.inputInfo.touchOcclusionMode = requested.hasInputInfo() ? requested.windowInfoHandle->getInfo()->touchOcclusionMode : parentSnapshot.inputInfo.touchOcclusionMode; if (requested.dropInputMode == gui::DropInputMode::ALL || parentSnapshot.dropInputMode == gui::DropInputMode::ALL) { snapshot.dropInputMode = gui::DropInputMode::ALL; } else if (requested.dropInputMode == gui::DropInputMode::OBSCURED || parentSnapshot.dropInputMode == gui::DropInputMode::OBSCURED) { snapshot.dropInputMode = gui::DropInputMode::OBSCURED; } else { snapshot.dropInputMode = gui::DropInputMode::NONE; } handleDropInputMode(snapshot, parentSnapshot); Loading
services/surfaceflinger/FrontEnd/RequestedLayerState.cpp +2 −0 Original line number Diff line number Diff line Loading @@ -417,6 +417,8 @@ std::ostream& operator<<(std::ostream& out, const RequestedLayerState& obj) { if (!obj.handleAlive) out << " handleNotAlive"; if (obj.requestedFrameRate.isValid()) out << " requestedFrameRate: {" << obj.requestedFrameRate << "}"; if (obj.dropInputMode != gui::DropInputMode::NONE) out << " dropInputMode=" << static_cast<uint32_t>(obj.dropInputMode); return out; } Loading
services/surfaceflinger/tests/unittests/LayerHierarchyTest.h +11 −0 Original line number Diff line number Diff line Loading @@ -478,6 +478,17 @@ protected: mLifecycleManager.applyTransactions(transactions); } void setDropInputMode(uint32_t id, gui::DropInputMode dropInputMode) { std::vector<TransactionState> transactions; transactions.emplace_back(); transactions.back().states.push_back({}); transactions.back().states.front().state.what = layer_state_t::eDropInputModeChanged; transactions.back().states.front().layerId = id; transactions.back().states.front().state.dropInputMode = dropInputMode; mLifecycleManager.applyTransactions(transactions); } LayerLifecycleManager mLifecycleManager; }; Loading
services/surfaceflinger/tests/unittests/LayerSnapshotTest.cpp +21 −0 Original line number Diff line number Diff line Loading @@ -1162,4 +1162,25 @@ TEST_F(LayerSnapshotTest, setSecureRootSnapshot) { EXPECT_TRUE(getSnapshot(11)->isSecure); } // b/314350323 TEST_F(LayerSnapshotTest, propagateDropInputMode) { setDropInputMode(1, gui::DropInputMode::ALL); LayerSnapshotBuilder::Args args{.root = mHierarchyBuilder.getHierarchy(), .layerLifecycleManager = mLifecycleManager, .includeMetadata = false, .displays = mFrontEndDisplayInfos, .displayChanges = false, .globalShadowSettings = globalShadowSettings, .supportsBlur = true, .supportedLayerGenericMetadata = {}, .genericLayerMetadataKeyMap = {}}; args.rootSnapshot.isSecure = true; update(mSnapshotBuilder, args); EXPECT_EQ(getSnapshot(1)->dropInputMode, gui::DropInputMode::ALL); // Ensure child also has the correct drop input mode regardless of whether either layer has // an input channel EXPECT_EQ(getSnapshot(11)->dropInputMode, gui::DropInputMode::ALL); } } // namespace android::surfaceflinger::frontend