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

Commit 2970c499 authored by Chet Haase's avatar Chet Haase
Browse files

various fixes for animations and javadocs

Issues around threading of animations and AnimatorSet bugs are
fixed in this change. Unrelated fixes to javadocs in other
framework classes are also part of the change.

Change-Id: I35f7e03ffdec9143bc2eb155e8f9384798ad35b3
parent f499eedd
Loading
Loading
Loading
Loading
+5 −5
Original line number Diff line number Diff line
@@ -18994,7 +18994,7 @@
 visibility="public"
>
<method name="after"
 return="void"
 return="android.animation.AnimatorSet.Builder"
 abstract="false"
 native="false"
 synchronized="false"
@@ -19007,7 +19007,7 @@
</parameter>
</method>
<method name="after"
 return="void"
 return="android.animation.AnimatorSet.Builder"
 abstract="false"
 native="false"
 synchronized="false"
@@ -19020,7 +19020,7 @@
</parameter>
</method>
<method name="before"
 return="void"
 return="android.animation.AnimatorSet.Builder"
 abstract="false"
 native="false"
 synchronized="false"
@@ -19033,7 +19033,7 @@
</parameter>
</method>
<method name="with"
 return="void"
 return="android.animation.AnimatorSet.Builder"
 abstract="false"
 native="false"
 synchronized="false"
@@ -249195,7 +249195,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="arg0" type="T">
<parameter name="t" type="T">
</parameter>
</method>
</interface>
+28 −4
Original line number Diff line number Diff line
@@ -341,6 +341,20 @@ public final class AnimatorSet extends Animator {
        return this;
    }

    @Override
    public void setupStartValues() {
        for (Node node : mNodes) {
            node.animation.setupStartValues();
        }
    }

    @Override
    public void setupEndValues() {
        for (Node node : mNodes) {
            node.animation.setupEndValues();
        }
    }

    /**
     * {@inheritDoc}
     *
@@ -401,6 +415,7 @@ public final class AnimatorSet extends Animator {
                    }
                }
            });
            delayAnim.start();
        }
        if (mListeners != null) {
            ArrayList<AnimatorListener> tmpListeners =
@@ -408,6 +423,11 @@ public final class AnimatorSet extends Animator {
            int numListeners = tmpListeners.size();
            for (int i = 0; i < numListeners; ++i) {
                tmpListeners.get(i).onAnimationStart(this);
                if (mNodes.size() == 0) {
                    // Handle unusual case where empty AnimatorSet is started - should send out
                    // end event immediately since the event will not be sent out at all otherwise
                    tmpListeners.get(i).onAnimationEnd(this);
                }
            }
        }
    }
@@ -894,7 +914,7 @@ public final class AnimatorSet extends Animator {
         * @param anim The animation that will play when the animation supplied to the
         * {@link AnimatorSet#play(Animator)} method starts.
         */
        public void with(Animator anim) {
        public Builder with(Animator anim) {
            Node node = mNodeMap.get(anim);
            if (node == null) {
                node = new Node(anim);
@@ -903,6 +923,7 @@ public final class AnimatorSet extends Animator {
            }
            Dependency dependency = new Dependency(mCurrentNode, Dependency.WITH);
            node.addDependency(dependency);
            return this;
        }

        /**
@@ -913,7 +934,7 @@ public final class AnimatorSet extends Animator {
         * @param anim The animation that will play when the animation supplied to the
         * {@link AnimatorSet#play(Animator)} method ends.
         */
        public void before(Animator anim) {
        public Builder before(Animator anim) {
            Node node = mNodeMap.get(anim);
            if (node == null) {
                node = new Node(anim);
@@ -922,6 +943,7 @@ public final class AnimatorSet extends Animator {
            }
            Dependency dependency = new Dependency(mCurrentNode, Dependency.AFTER);
            node.addDependency(dependency);
            return this;
        }

        /**
@@ -932,7 +954,7 @@ public final class AnimatorSet extends Animator {
         * @param anim The animation whose end will cause the animation supplied to the
         * {@link AnimatorSet#play(Animator)} method to play.
         */
        public void after(Animator anim) {
        public Builder after(Animator anim) {
            Node node = mNodeMap.get(anim);
            if (node == null) {
                node = new Node(anim);
@@ -941,6 +963,7 @@ public final class AnimatorSet extends Animator {
            }
            Dependency dependency = new Dependency(node, Dependency.AFTER);
            mCurrentNode.addDependency(dependency);
            return this;
        }

        /**
@@ -951,11 +974,12 @@ public final class AnimatorSet extends Animator {
         * @param delay The number of milliseconds that should elapse before the
         * animation starts.
         */
        public void after(long delay) {
        public Builder after(long delay) {
            // setup dummy ValueAnimator just to run the clock
            ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
            anim.setDuration(delay);
            after(anim);
            return this;
        }

    }
+20 −13
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.animation;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.AndroidRuntimeException;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.AnimationUtils;

@@ -860,21 +861,22 @@ public class ValueAnimator extends Animator {
    /**
     * Start the animation playing. This version of start() takes a boolean flag that indicates
     * whether the animation should play in reverse. The flag is usually false, but may be set
     * to true if called from the reverse() method/
     * to true if called from the reverse() method.
     *
     * <p>The animation started by calling this method will be run on the thread that called
     * this method. This thread should have a Looper on it (a runtime exception will be thrown if
     * this is not the case). Also, if the animation will animate
     * properties of objects in the view hierarchy, then the calling thread should be the UI
     * thread for that view hierarchy.</p>
     *
     * @param playBackwards Whether the ValueAnimator should start playing in reverse.
     */
    private void start(boolean playBackwards) {
        mPlayingBackwards = playBackwards;
        Looper looper = Looper.getMainLooper();
        final boolean isUiThread;
        if (looper != null) {
            isUiThread = Thread.currentThread() == looper.getThread();
        } else {
            // ignore check if we don't have a Looper (this isn't an Activity)
            isUiThread = true;
        if (Looper.myLooper() == null) {
            throw new AndroidRuntimeException("Animators may only be run on Looper threads");
        }
        if ((mStartDelay == 0) && isUiThread) {
        mPlayingBackwards = playBackwards;
        if (mStartDelay == 0) {
            if (mListeners != null) {
                ArrayList<AnimatorListener> tmpListeners =
                        (ArrayList<AnimatorListener>) mListeners.clone();
@@ -912,10 +914,15 @@ public class ValueAnimator extends Animator {
                listener.onAnimationCancel(this);
            }
        }
        // Only cancel if the animation is actually running or has been started and is about
        // to run
        if (mPlayingState != STOPPED || sPendingAnimations.get().contains(this) ||
                sDelayedAnims.get().contains(this)) {
            // Just set the CANCELED flag - this causes the animation to end the next time a frame
            // is processed.
            mPlayingState = CANCELED;
        }
    }

    @Override
    public void end() {
+26 −18
Original line number Diff line number Diff line
@@ -513,21 +513,27 @@ href="{@docRoot}guide/developing/tools/traceview.html">Traceview: A Graphical Lo
    }

    /**
     * Count the number and aggregate size of memory allocations between
     * two points.
     * Start counting the number and aggregate size of memory allocations.
     *
     * The "start" function resets the counts and enables counting.  The
     * "stop" function disables the counting so that the analysis code
     * doesn't cause additional allocations.  The "get" function returns
     * the specified value.
     * <p>The {@link #startAllocCounting() start} function resets the counts and enables counting.
     * The {@link #stopAllocCounting() stop} function disables the counting so that the analysis
     * code doesn't cause additional allocations.  The various <code>get</code> functions return
     * the specified value. And the various <code>reset</code> functions reset the specified
     * count.</p>
     *
     * Counts are kept for the system as a whole and for each thread.
     * <p>Counts are kept for the system as a whole and for each thread.
     * The per-thread counts for threads other than the current thread
     * are not cleared by the "reset" or "start" calls.
     * are not cleared by the "reset" or "start" calls.</p>
     */
    public static void startAllocCounting() {
        VMDebug.startAllocCounting();
    }

    /**
     * Stop counting the number and aggregate size of memory allocations.
     *
     * @see #startAllocCounting()
     */
    public static void stopAllocCounting() {
        VMDebug.stopAllocCounting();
    }
@@ -671,11 +677,11 @@ href="{@docRoot}guide/developing/tools/traceview.html">Traceview: A Graphical Lo
     * for catching regressions in code that is expected to operate
     * without causing any allocations.
     *
     * Pass in the maximum number of allowed allocations.  Use -1 to disable
     * the limit.  Returns the previous limit.
     *
     * The preferred way to use this is:
     * <p>Pass in the maximum number of allowed allocations.  Use -1 to disable
     * the limit.  Returns the previous limit.</p>
     *
     * <p>The preferred way to use this is:
     * <pre>
     *  int prevLimit = -1;
     *  try {
     *      prevLimit = Debug.setAllocationLimit(0);
@@ -683,16 +689,16 @@ href="{@docRoot}guide/developing/tools/traceview.html">Traceview: A Graphical Lo
     *  } finally {
     *      Debug.setAllocationLimit(prevLimit);
     *  }
     *
     * </pre>
     * This allows limits to be nested.  The try/finally ensures that the
     * limit is reset if something fails.
     * limit is reset if something fails.</p>
     *
     * Exceeding the limit causes a dalvik.system.AllocationLimitError to
     * <p>Exceeding the limit causes a dalvik.system.AllocationLimitError to
     * be thrown from a memory allocation call.  The limit is reset to -1
     * when this happens.
     * when this happens.</p>
     *
     * The feature may be disabled in the VM configuration.  If so, this
     * call has no effect, and always returns -1.
     * <p>The feature may be disabled in the VM configuration.  If so, this
     * call has no effect, and always returns -1.</p>
     */
    public static int setAllocationLimit(int limit) {
        return VMDebug.setAllocationLimit(limit);
@@ -846,6 +852,7 @@ href="{@docRoot}guide/developing/tools/traceview.html">Traceview: A Graphical Lo
     * API for gathering and querying instruction counts.
     *
     * Example usage:
     * <pre>
     *   Debug.InstructionCount icount = new Debug.InstructionCount();
     *   icount.resetAndStart();
     *    [... do lots of stuff ...]
@@ -855,6 +862,7 @@ href="{@docRoot}guide/developing/tools/traceview.html">Traceview: A Graphical Lo
     *       System.out.println("Method invocations: "
     *           + icount.globalMethodInvocations());
     *   }
     * </pre>
     */
    public static class InstructionCount {
        private static final int NUM_INSTR = 256;
+2 −2
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@ public class ComposeShader extends Shader {

    /** Create a new compose shader, given shaders A, B, and a combining mode.
        When the mode is applied, it will be given the result from shader A as its
        "dst", and the result of from shader B as its "src".
        "dst", and the result from shader B as its "src".
        @param shaderA  The colors from this shader are seen as the "dst" by the mode
        @param shaderB  The colors from this shader are seen as the "src" by the mode
        @param mode     The mode that combines the colors from the two shaders. If mode
@@ -53,7 +53,7 @@ public class ComposeShader extends Shader {

    /** Create a new compose shader, given shaders A, B, and a combining PorterDuff mode.
        When the mode is applied, it will be given the result from shader A as its
        "dst", and the result of from shader B as its "src".
        "dst", and the result from shader B as its "src".
        @param shaderA  The colors from this shader are seen as the "dst" by the mode
        @param shaderB  The colors from this shader are seen as the "src" by the mode
        @param mode     The PorterDuff mode that combines the colors from the two shaders.