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

Commit 503d2bd9 authored by Robert Carr's avatar Robert Carr
Browse files

Correct setLayer variants.

Correct a legitimate bug in setLayer where it would fail
to clear a relative layer equal to the new absolute layer. Optimize
all the other variants to not trigger rebuilding of layer stacks in
the case of redundant Z setting.

Test: Existing tests pass.
Change-Id: I6559322017a7b8c5510f8ff265216af3d414696a
parent 069ac6a5
Loading
Loading
Loading
Loading
+12 −5
Original line number Original line Diff line number Diff line
@@ -1109,9 +1109,10 @@ bool Layer::setChildLayer(const sp<Layer>& childLayer, int32_t z) {
    if (childLayer->setLayer(z)) {
    if (childLayer->setLayer(z)) {
        mCurrentChildren.removeAt(idx);
        mCurrentChildren.removeAt(idx);
        mCurrentChildren.add(childLayer);
        mCurrentChildren.add(childLayer);
    }
        return true;
        return true;
    }
    }
    return false;
}


bool Layer::setChildRelativeLayer(const sp<Layer>& childLayer,
bool Layer::setChildRelativeLayer(const sp<Layer>& childLayer,
        const sp<IBinder>& relativeToHandle, int32_t relativeZ) {
        const sp<IBinder>& relativeToHandle, int32_t relativeZ) {
@@ -1122,12 +1123,13 @@ bool Layer::setChildRelativeLayer(const sp<Layer>& childLayer,
    if (childLayer->setRelativeLayer(relativeToHandle, relativeZ)) {
    if (childLayer->setRelativeLayer(relativeToHandle, relativeZ)) {
        mCurrentChildren.removeAt(idx);
        mCurrentChildren.removeAt(idx);
        mCurrentChildren.add(childLayer);
        mCurrentChildren.add(childLayer);
    }
        return true;
        return true;
    }
    }
    return false;
}


bool Layer::setLayer(int32_t z) {
bool Layer::setLayer(int32_t z) {
    if (mCurrentState.z == z) return false;
    if (mCurrentState.z == z && !usingRelativeZ(LayerVector::StateSet::Current)) return false;
    mCurrentState.sequence++;
    mCurrentState.sequence++;
    mCurrentState.z = z;
    mCurrentState.z = z;
    mCurrentState.modified = true;
    mCurrentState.modified = true;
@@ -1158,7 +1160,7 @@ void Layer::addZOrderRelative(const wp<Layer>& relative) {
    setTransactionFlags(eTransactionNeeded);
    setTransactionFlags(eTransactionNeeded);
}
}


bool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t z) {
bool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t relativeZ) {
    sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get());
    sp<Handle> handle = static_cast<Handle*>(relativeToHandle.get());
    if (handle == nullptr) {
    if (handle == nullptr) {
        return false;
        return false;
@@ -1168,9 +1170,14 @@ bool Layer::setRelativeLayer(const sp<IBinder>& relativeToHandle, int32_t z) {
        return false;
        return false;
    }
    }


    if (mCurrentState.z == relativeZ && usingRelativeZ(LayerVector::StateSet::Current) &&
            mCurrentState.zOrderRelativeOf == relative) {
        return false;
    }

    mCurrentState.sequence++;
    mCurrentState.sequence++;
    mCurrentState.modified = true;
    mCurrentState.modified = true;
    mCurrentState.z = z;
    mCurrentState.z = relativeZ;


    auto oldZOrderRelativeOf = mCurrentState.zOrderRelativeOf.promote();
    auto oldZOrderRelativeOf = mCurrentState.zOrderRelativeOf.promote();
    if (oldZOrderRelativeOf != nullptr) {
    if (oldZOrderRelativeOf != nullptr) {