From ef876c9c6bb5118c457c9146964d76de854c11fc Mon Sep 17 00:00:00 2001 From: Evan Rosky Date: Fri, 25 Jan 2019 17:46:06 -0800 Subject: Merge metadata from transaction instead of replace This was replacing metadata when set in transactions rather than merging. To fix this, merge has been augmented to also report if a change occurred and to erase empty entries (as a mechanism to "unset" metadata) Bug: 122925737 Test: Added more unittests Change-Id: Ia854cbcc1ddd334f18ffacea667cbb98778ec210 --- libs/gui/LayerMetadata.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'libs/gui/LayerMetadata.cpp') diff --git a/libs/gui/LayerMetadata.cpp b/libs/gui/LayerMetadata.cpp index 745433a605..04d2871c77 100644 --- a/libs/gui/LayerMetadata.cpp +++ b/libs/gui/LayerMetadata.cpp @@ -31,10 +31,23 @@ LayerMetadata::LayerMetadata(const LayerMetadata& other) = default; LayerMetadata::LayerMetadata(LayerMetadata&& other) = default; -void LayerMetadata::merge(const LayerMetadata& other) { +bool LayerMetadata::merge(const LayerMetadata& other, bool eraseEmpty) { + bool changed = false; for (const auto& entry : other.mMap) { - mMap[entry.first] = entry.second; + auto it = mMap.find(entry.first); + if (it != mMap.cend() && it->second != entry.second) { + if (eraseEmpty && entry.second.empty()) { + mMap.erase(it); + } else { + it->second = entry.second; + } + changed = true; + } else if (it == mMap.cend() && !entry.second.empty()) { + mMap[entry.first] = entry.second; + changed = true; + } } + return changed; } status_t LayerMetadata::writeToParcel(Parcel* parcel) const { -- cgit v1.2.3-59-g8ed1b