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

Commit 68bfe0a3 authored by John Reck's avatar John Reck
Browse files

Animator refactoring & fixes

 Tweaks animators to have less unnecessary refcounting

 Pull animator management out into seperate class

 More control to tweak animator lifecycle, such as doing
 Java-side handling of start delay by attaching but not
 starting the animator

Change-Id: I4ff8207580ca11fb38f45ef0007b406e0097281c
parent 6507f2e0
Loading
Loading
Loading
Loading
+0 −19
Original line number Diff line number Diff line
@@ -21,9 +21,6 @@ import android.graphics.Matrix;
import android.graphics.Outline;
import android.graphics.Paint;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>A display list records a series of graphics related operations and can replay
 * them later. Display lists are usually built by recording operations on a
@@ -180,12 +177,6 @@ public class RenderNode {
    private boolean mValid;
    private final long mNativeRenderNode;

    // We need to keep a strong reference to all running animators to ensure that
    // they can call removeAnimator when they have finished, as the native-side
    // object can only hold a WeakReference<> to avoid leaking memory due to
    // cyclic references.
    private List<RenderNodeAnimator> mActiveAnimators;

    private RenderNode(String name) {
        mNativeRenderNode = nCreate(name);
    }
@@ -866,18 +857,9 @@ public class RenderNode {
    ///////////////////////////////////////////////////////////////////////////

    public void addAnimator(RenderNodeAnimator animator) {
        if (mActiveAnimators == null) {
            mActiveAnimators = new ArrayList<RenderNodeAnimator>();
        }
        mActiveAnimators.add(animator);
        nAddAnimator(mNativeRenderNode, animator.getNativeAnimator());
    }

    public void removeAnimator(RenderNodeAnimator animator) {
        nRemoveAnimator(mNativeRenderNode, animator.getNativeAnimator());
        mActiveAnimators.remove(animator);
    }

    ///////////////////////////////////////////////////////////////////////////
    // Native methods
    ///////////////////////////////////////////////////////////////////////////
@@ -960,7 +942,6 @@ public class RenderNode {
    ///////////////////////////////////////////////////////////////////////////

    private static native void nAddAnimator(long renderNode, long animatorPtr);
    private static native void nRemoveAnimator(long renderNode, long animatorPtr);

    ///////////////////////////////////////////////////////////////////////////
    // Finalization
+17 −11
Original line number Diff line number Diff line
@@ -172,7 +172,8 @@ public final class RenderNodeAnimator extends Animator {

    @Override
    public void cancel() {
        mTarget.removeAnimator(this);
        if (!mFinished) {
            nCancel(mNativePtr.get());

            final ArrayList<AnimatorListener> listeners = getListeners();
            final int numListeners = listeners == null ? 0 : listeners.size();
@@ -180,6 +181,7 @@ public final class RenderNodeAnimator extends Animator {
                listeners.get(i).onAnimationCancel(this);
            }
        }
    }

    @Override
    public void end() {
@@ -219,10 +221,6 @@ public final class RenderNodeAnimator extends Animator {
        return mTarget;
    }

    /**
     * WARNING: May only be called once!!!
     * TODO: Fix above -_-
     */
    public void setStartValue(float startValue) {
        checkMutable();
        nSetStartValue(mNativePtr.get(), startValue);
@@ -231,6 +229,9 @@ public final class RenderNodeAnimator extends Animator {
    @Override
    public void setStartDelay(long startDelay) {
        checkMutable();
        if (startDelay < 0) {
            throw new IllegalArgumentException("startDelay must be positive; " + startDelay);
        }
        nSetStartDelay(mNativePtr.get(), startDelay);
    }

@@ -242,6 +243,9 @@ public final class RenderNodeAnimator extends Animator {
    @Override
    public RenderNodeAnimator setDuration(long duration) {
        checkMutable();
        if (duration < 0) {
            throw new IllegalArgumentException("duration must be positive; " + duration);
        }
        nSetDuration(mNativePtr.get(), duration);
        return this;
    }
@@ -269,7 +273,6 @@ public final class RenderNodeAnimator extends Animator {

    private void onFinished() {
        mFinished = true;
        mTarget.removeAnimator(this);

        final ArrayList<AnimatorListener> listeners = getListeners();
        final int numListeners = listeners == null ? 0 : listeners.size();
@@ -296,10 +299,13 @@ public final class RenderNodeAnimator extends Animator {
            long canvasProperty, float finalValue);
    private static native long nCreateCanvasPropertyPaintAnimator(WeakReference<RenderNodeAnimator> weakThis,
            long canvasProperty, int paintField, float finalValue);

    private static native void nSetStartValue(long nativePtr, float startValue);
    private static native void nSetDuration(long nativePtr, long duration);
    private static native long nGetDuration(long nativePtr);
    private static native void nSetStartDelay(long nativePtr, long startDelay);
    private static native long nGetStartDelay(long nativePtr);
    private static native void nSetInterpolator(long animPtr, long interpolatorPtr);

    private static native void nCancel(long animPtr);
}
+1 −9
Original line number Diff line number Diff line
@@ -456,16 +456,9 @@ static void android_view_RenderNode_addAnimator(JNIEnv* env, jobject clazz,
    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
    RenderPropertyAnimator* animator = reinterpret_cast<RenderPropertyAnimator*>(animatorPtr);
    renderNode->addAnimator(animator);
    animator->start();
}

static void android_view_RenderNode_removeAnimator(JNIEnv* env, jobject clazz,
        jlong renderNodePtr, jlong animatorPtr) {
    RenderNode* renderNode = reinterpret_cast<RenderNode*>(renderNodePtr);
    RenderPropertyAnimator* animator = reinterpret_cast<RenderPropertyAnimator*>(animatorPtr);
    renderNode->removeAnimator(animator);
}


#endif // USE_OPENGL_RENDERER

// ----------------------------------------------------------------------------
@@ -546,7 +539,6 @@ static JNINativeMethod gMethods[] = {
    { "nGetPivotY",                "(J)F",  (void*) android_view_RenderNode_getPivotY },

    { "nAddAnimator",              "(JJ)V", (void*) android_view_RenderNode_addAnimator },
    { "nRemoveAnimator",           "(JJ)V", (void*) android_view_RenderNode_removeAnimator },
#endif
};

+6 −0
Original line number Diff line number Diff line
@@ -149,6 +149,11 @@ static void setInterpolator(JNIEnv* env, jobject clazz, jlong animatorPtr, jlong
    animator->setInterpolator(interpolator);
}

static void cancel(JNIEnv* env, jobject clazz, jlong animatorPtr) {
    BaseRenderNodeAnimator* animator = reinterpret_cast<BaseRenderNodeAnimator*>(animatorPtr);
    animator->cancel();
}

#endif

// ----------------------------------------------------------------------------
@@ -168,6 +173,7 @@ static JNINativeMethod gMethods[] = {
    { "nSetStartDelay", "(JJ)V", (void*) setStartDelay },
    { "nGetStartDelay", "(J)J", (void*) getStartDelay },
    { "nSetInterpolator", "(JJ)V", (void*) setInterpolator },
    { "nCancel", "(J)V", (void*) cancel },
#endif
};

+1 −0
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ ifeq ($(USE_OPENGL_RENDERER),true)
		font/Font.cpp \
		AmbientShadow.cpp \
		Animator.cpp \
		AnimatorManager.cpp \
		AssetAtlas.cpp \
		DamageAccumulator.cpp \
		FontRenderer.cpp \
Loading