Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ef876c9c authored by Evan Rosky's avatar Evan Rosky
Browse files

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
parent c0f4a2ed
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -31,11 +31,24 @@ 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) {
        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 {
    parcel->writeInt32(static_cast<int>(mMap.size()));
+3 −1
Original line number Diff line number Diff line
@@ -34,7 +34,9 @@ struct LayerMetadata : public Parcelable {
    LayerMetadata& operator=(const LayerMetadata& other);
    LayerMetadata& operator=(LayerMetadata&& other);

    void merge(const LayerMetadata& other);
    // Merges other into this LayerMetadata. If eraseEmpty is true, any entries in
    // in this whose keys are paired with empty values in other will be erased.
    bool merge(const LayerMetadata& other, bool eraseEmpty = false);

    status_t writeToParcel(Parcel* parcel) const override;
    status_t readFromParcel(const Parcel* parcel) override;
+2 −4
Original line number Diff line number Diff line
@@ -1334,10 +1334,8 @@ bool Layer::setOverrideScalingMode(int32_t scalingMode) {
    return true;
}

bool Layer::setMetadata(LayerMetadata data) {
    bool changed = data.mMap != mCurrentState.metadata.mMap;
    if (!changed) return false;
    mCurrentState.metadata = std::move(data);
bool Layer::setMetadata(const LayerMetadata& data) {
    if (!mCurrentState.metadata.merge(data, true /* eraseEmpty */)) return false;
    mCurrentState.sequence++;
    mCurrentState.modified = true;
    setTransactionFlags(eTransactionNeeded);
+1 −1
Original line number Diff line number Diff line
@@ -290,7 +290,7 @@ public:
                                              uint64_t frameNumber);
    virtual void deferTransactionUntil_legacy(const sp<Layer>& barrierLayer, uint64_t frameNumber);
    virtual bool setOverrideScalingMode(int32_t overrideScalingMode);
    virtual bool setMetadata(LayerMetadata data);
    virtual bool setMetadata(const LayerMetadata& data);
    virtual bool reparentChildren(const sp<IBinder>& layer);
    virtual void setChildrenDrawingParent(const sp<Layer>& layer);
    virtual bool reparent(const sp<IBinder>& newParentHandle);
+1 −1
Original line number Diff line number Diff line
@@ -4116,7 +4116,7 @@ status_t SurfaceFlinger::createLayer(const String8& name, const sp<Client>& clie
        }
    }

    layer->setMetadata(std::move(metadata));
    layer->setMetadata(metadata);

    bool addToCurrentState = callingThreadHasUnscopedSurfaceFlingerAccess();
    result = addClientLayer(client, *handle, *gbp, layer, *parent,
Loading