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

Commit c3b9cd63 authored by Mathias Agopian's avatar Mathias Agopian
Browse files

Try to keep the same native Surface object when reading a parcel

If the IGraphicBufferProducers are the same, it's really the same
window, so we keep the same native object.

Bug: 8322406
Change-Id: I96d55a90e6656a05d4e32ae22945226c350b5747
parent 2530b32d
Loading
Loading
Loading
Loading
+17 −4
Original line number Diff line number Diff line
@@ -332,19 +332,32 @@ static jint nativeReadFromParcel(JNIEnv* env, jclass clazz,
        doThrowNPE(env);
        return 0;
    }

    sp<Surface> self(reinterpret_cast<Surface *>(nativeObject));
    if (self != NULL) {
        self->decStrong(&sRefBaseOwner);
    sp<IBinder> binder(parcel->readStrongBinder());

    // update the Surface only if the underlying IGraphicBufferProducer
    // has changed.
    if (self != NULL
            && (self->getIGraphicBufferProducer()->asBinder() == binder)) {
        // same IGraphicBufferProducer, return ourselves
        return int(self.get());
    }

    sp<Surface> sur;
    sp<IGraphicBufferProducer> gbp(
            interface_cast<IGraphicBufferProducer>(parcel->readStrongBinder()));
    sp<IGraphicBufferProducer> gbp(interface_cast<IGraphicBufferProducer>(binder));
    if (gbp != NULL) {
        // we have a new IGraphicBufferProducer, create a new Surface for it
        sur = new Surface(gbp);
        // and keep a reference before passing to java
        sur->incStrong(&sRefBaseOwner);
    }

    if (self != NULL) {
        // and loose the java reference to ourselves
        self->decStrong(&sRefBaseOwner);
    }

    return int(sur.get());
}