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

Commit 7c608f25 authored by Chet Haase's avatar Chet Haase
Browse files

optimizing for primitive types in animations

The animator classes caused autoboxing by converting primitive types (by far
the most typical types used in animations) to be converted to their
Object equivalents because of various APIs that required Object
(like getValue() to get the animated value). This change creates
factory methods on some classes instead of the former constructors
so that we can create and return private type-specific subclasses
which operate directly on the primitive types instead.

In particular, float and int are natively supported by the animators
now. Support in the APIs for double and long was removed because it
seemed like these less common types did not justify the extra
baggage of the added API and code.

Change-Id: I6008a3883e3d6dd5225005f45f112af148e5a4ea
parent 8182cd36
Loading
Loading
Loading
Loading
+126 −216
Original line number Diff line number Diff line
@@ -17874,7 +17874,7 @@
</class>
<class name="Keyframe"
 extends="java.lang.Object"
 abstract="false"
 abstract="true"
 static="false"
 final="false"
 deprecated="not deprecated"
@@ -17889,137 +17889,156 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="fraction" type="float">
</parameter>
<parameter name="value" type="java.lang.Object">
</parameter>
</constructor>
<constructor name="Keyframe"
 type="android.animation.Keyframe"
<method name="clone"
 return="android.animation.Keyframe"
 abstract="true"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="fraction" type="float">
</parameter>
<parameter name="value" type="java.lang.Float">
</parameter>
</constructor>
<constructor name="Keyframe"
 type="android.animation.Keyframe"
</method>
<method name="getFraction"
 return="float"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="fraction" type="float">
</parameter>
<parameter name="value" type="java.lang.Integer">
</parameter>
</constructor>
<constructor name="Keyframe"
 type="android.animation.Keyframe"
</method>
<method name="getInterpolator"
 return="android.animation.TimeInterpolator"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="fraction" type="float">
</parameter>
<parameter name="value" type="java.lang.Double">
</parameter>
</constructor>
<constructor name="Keyframe"
 type="android.animation.Keyframe"
</method>
<method name="getType"
 return="java.lang.Class"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="fraction" type="float">
</parameter>
<parameter name="value" type="int">
</parameter>
</constructor>
<constructor name="Keyframe"
 type="android.animation.Keyframe"
</method>
<method name="getValue"
 return="java.lang.Object"
 abstract="true"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="fraction" type="float">
</parameter>
<parameter name="value" type="float">
</parameter>
</constructor>
<constructor name="Keyframe"
 type="android.animation.Keyframe"
</method>
<method name="hasValue"
 return="boolean"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
</method>
<method name="ofFloat"
 return="android.animation.Keyframe"
 abstract="false"
 native="false"
 synchronized="false"
 static="true"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="fraction" type="float">
</parameter>
<parameter name="value" type="double">
<parameter name="value" type="float">
</parameter>
</constructor>
<method name="clone"
</method>
<method name="ofFloat"
 return="android.animation.Keyframe"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 static="true"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="fraction" type="float">
</parameter>
</method>
<method name="getFraction"
 return="float"
<method name="ofInt"
 return="android.animation.Keyframe"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 static="true"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="fraction" type="float">
</parameter>
<parameter name="value" type="int">
</parameter>
</method>
<method name="getInterpolator"
 return="android.animation.TimeInterpolator"
<method name="ofInt"
 return="android.animation.Keyframe"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 static="true"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="fraction" type="float">
</parameter>
</method>
<method name="getType"
 return="java.lang.Class"
<method name="ofObject"
 return="android.animation.Keyframe"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 static="true"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="fraction" type="float">
</parameter>
<parameter name="value" type="java.lang.Object">
</parameter>
</method>
<method name="getValue"
 return="java.lang.Object"
<method name="ofObject"
 return="android.animation.Keyframe"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 static="true"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="fraction" type="float">
</parameter>
</method>
<method name="setFraction"
 return="void"
@@ -18049,7 +18068,7 @@
</method>
<method name="setValue"
 return="void"
 abstract="false"
 abstract="true"
 native="false"
 synchronized="false"
 static="false"
@@ -18456,23 +18475,6 @@
 visibility="public"
>
</method>
<method name="ofDouble"
 return="android.animation.ObjectAnimator"
 abstract="false"
 native="false"
 synchronized="false"
 static="true"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="target" type="java.lang.Object">
</parameter>
<parameter name="propertyName" type="java.lang.String">
</parameter>
<parameter name="values" type="double...">
</parameter>
</method>
<method name="ofFloat"
 return="android.animation.ObjectAnimator"
 abstract="false"
@@ -18507,23 +18509,6 @@
<parameter name="values" type="int...">
</parameter>
</method>
<method name="ofLong"
 return="android.animation.ObjectAnimator"
 abstract="false"
 native="false"
 synchronized="false"
 static="true"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="target" type="java.lang.Object">
</parameter>
<parameter name="propertyName" type="java.lang.String">
</parameter>
<parameter name="values" type="long...">
</parameter>
</method>
<method name="ofObject"
 return="android.animation.ObjectAnimator"
 abstract="false"
@@ -18626,21 +18611,6 @@
 visibility="public"
>
</method>
<method name="ofDouble"
 return="android.animation.PropertyValuesHolder"
 abstract="false"
 native="false"
 synchronized="false"
 static="true"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="propertyName" type="java.lang.String">
</parameter>
<parameter name="values" type="double...">
</parameter>
</method>
<method name="ofFloat"
 return="android.animation.PropertyValuesHolder"
 abstract="false"
@@ -18686,21 +18656,6 @@
<parameter name="values" type="android.animation.Keyframe...">
</parameter>
</method>
<method name="ofLong"
 return="android.animation.PropertyValuesHolder"
 abstract="false"
 native="false"
 synchronized="false"
 static="true"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="propertyName" type="java.lang.String">
</parameter>
<parameter name="values" type="long...">
</parameter>
</method>
<method name="ofObject"
 return="android.animation.PropertyValuesHolder"
 abstract="false"
@@ -18718,19 +18673,6 @@
<parameter name="values" type="java.lang.Object...">
</parameter>
</method>
<method name="setDoubleValues"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="values" type="double...">
</parameter>
</method>
<method name="setEvaluator"
 return="void"
 abstract="false"
@@ -18796,19 +18738,6 @@
<parameter name="values" type="android.animation.Keyframe...">
</parameter>
</method>
<method name="setLongValues"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="values" type="long...">
</parameter>
</method>
<method name="setObjectValues"
 return="void"
 abstract="false"
@@ -19083,19 +19012,6 @@
 visibility="public"
>
</method>
<method name="ofDouble"
 return="android.animation.ValueAnimator"
 abstract="false"
 native="false"
 synchronized="false"
 static="true"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="values" type="double...">
</parameter>
</method>
<method name="ofFloat"
 return="android.animation.ValueAnimator"
 abstract="false"
@@ -19122,19 +19038,6 @@
<parameter name="values" type="int...">
</parameter>
</method>
<method name="ofLong"
 return="android.animation.ValueAnimator"
 abstract="false"
 native="false"
 synchronized="false"
 static="true"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="values" type="long...">
</parameter>
</method>
<method name="ofObject"
 return="android.animation.ValueAnimator"
 abstract="false"
@@ -19211,19 +19114,6 @@
<parameter name="playTime" type="long">
</parameter>
</method>
<method name="setDoubleValues"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="values" type="double...">
</parameter>
</method>
<method name="setDuration"
 return="android.animation.ValueAnimator"
 abstract="false"
@@ -19302,19 +19192,6 @@
<parameter name="value" type="android.animation.TimeInterpolator">
</parameter>
</method>
<method name="setLongValues"
 return="void"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="values" type="long...">
</parameter>
</method>
<method name="setObjectValues"
 return="void"
 abstract="false"
@@ -166627,6 +166504,17 @@
 visibility="public"
>
</field>
<field name="NETWORK_TYPE_EHRPD"
 type="int"
 transient="false"
 volatile="false"
 value="14"
 static="true"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="NETWORK_TYPE_EVDO_0"
 type="int"
 transient="false"
@@ -166715,6 +166603,17 @@
 visibility="public"
>
</field>
<field name="NETWORK_TYPE_LTE"
 type="int"
 transient="false"
 volatile="false"
 value="13"
 static="true"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="NETWORK_TYPE_UMTS"
 type="int"
 transient="false"
@@ -166770,6 +166669,17 @@
 visibility="public"
>
</field>
<field name="PHONE_TYPE_SIP"
 type="int"
 transient="false"
 volatile="false"
 value="3"
 static="true"
 final="true"
 deprecated="not deprecated"
 visibility="public"
>
</field>
<field name="SIM_STATE_ABSENT"
 type="int"
 transient="false"
@@ -250796,7 +250706,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="buffer" type="byte[]">
<parameter name="dst" type="byte[]">
</parameter>
<exception name="IOException" type="java.io.IOException">
</exception>
@@ -250811,11 +250721,11 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="buffer" type="byte[]">
<parameter name="dst" type="byte[]">
</parameter>
<parameter name="offset" type="int">
</parameter>
<parameter name="count" type="int">
<parameter name="byteCount" type="int">
</parameter>
<exception name="IOException" type="java.io.IOException">
</exception>
@@ -251056,7 +250966,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="buffer" type="byte[]">
<parameter name="dst" type="byte[]">
</parameter>
<exception name="IOException" type="java.io.IOException">
</exception>
@@ -251071,11 +250981,11 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="buffer" type="byte[]">
<parameter name="dst" type="byte[]">
</parameter>
<parameter name="offset" type="int">
</parameter>
<parameter name="length" type="int">
<parameter name="byteCount" type="int">
</parameter>
<exception name="IOException" type="java.io.IOException">
</exception>
@@ -253982,7 +253892,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="buffer" type="byte[]">
<parameter name="dst" type="byte[]">
</parameter>
<exception name="IOException" type="java.io.IOException">
</exception>
@@ -253997,11 +253907,11 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="buffer" type="byte[]">
<parameter name="dst" type="byte[]">
</parameter>
<parameter name="offset" type="int">
</parameter>
<parameter name="length" type="int">
<parameter name="byteCount" type="int">
</parameter>
<exception name="IOException" type="java.io.IOException">
</exception>
@@ -257802,7 +257712,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="buffer" type="byte[]">
<parameter name="dst" type="byte[]">
</parameter>
<exception name="IOException" type="java.io.IOException">
</exception>
@@ -257817,11 +257727,11 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="buffer" type="byte[]">
<parameter name="dst" type="byte[]">
</parameter>
<parameter name="offset" type="int">
</parameter>
<parameter name="count" type="int">
<parameter name="byteCount" type="int">
</parameter>
<exception name="IOException" type="java.io.IOException">
</exception>
@@ -283974,9 +283884,9 @@
>
<parameter name="uri" type="java.net.URI">
</parameter>
<parameter name="sa" type="java.net.SocketAddress">
<parameter name="address" type="java.net.SocketAddress">
</parameter>
<parameter name="ioe" type="java.io.IOException">
<parameter name="failure" type="java.io.IOException">
</parameter>
</method>
<method name="getDefault"
@@ -284075,7 +283985,7 @@
>
<parameter name="uri" type="java.net.URI">
</parameter>
<parameter name="conn" type="java.net.URLConnection">
<parameter name="connection" type="java.net.URLConnection">
</parameter>
<exception name="IOException" type="java.io.IOException">
</exception>
+0 −38
Original line number Diff line number Diff line
@@ -51,8 +51,6 @@ public class AnimatorInflater {
     */
    private static final int VALUE_TYPE_FLOAT       = 0;
    private static final int VALUE_TYPE_INT         = 1;
    private static final int VALUE_TYPE_DOUBLE      = 2;
    private static final int VALUE_TYPE_LONG        = 3;
    private static final int VALUE_TYPE_COLOR       = 4;
    private static final int VALUE_TYPE_CUSTOM      = 5;

@@ -242,42 +240,6 @@ public class AnimatorInflater {
            }
            break;

            case VALUE_TYPE_LONG: {
                int valueFrom;
                int valueTo;
                if (hasFrom) {
                    valueFrom = a.getInteger(com.android.internal.R.styleable.Animator_valueFrom, 0);
                    if (hasTo) {
                        valueTo = a.getInteger(com.android.internal.R.styleable.Animator_valueTo, 0);
                        anim.setLongValues(valueFrom, valueTo);
                    } else {
                        anim.setLongValues(valueFrom);
                    }
                } else {
                    valueTo = a.getInteger(com.android.internal.R.styleable.Animator_valueTo, 0);
                    anim.setLongValues(valueTo);
                }
            }
            break;

            case VALUE_TYPE_DOUBLE: {
                double valueFrom;
                double valueTo;
                if (hasFrom) {
                    valueFrom = a.getFloat(com.android.internal.R.styleable.Animator_valueFrom, 0f);
                    if (hasTo) {
                        valueTo = a.getFloat(com.android.internal.R.styleable.Animator_valueTo, 0f);
                        anim.setDoubleValues(valueFrom, valueTo);
                    } else {
                        anim.setDoubleValues(valueFrom);
                    }
                } else {
                    valueTo = a.getFloat(com.android.internal.R.styleable.Animator_valueTo, 0f);
                    anim.setDoubleValues(valueTo);
                }
            }
            break;

            case VALUE_TYPE_CUSTOM: {
                // TODO: How to get an 'Object' value?
                float valueFrom;
+39 −17
Original line number Diff line number Diff line
@@ -362,14 +362,18 @@ public final class AnimatorSet extends Animator {
        // dependencies on all of the nodes. For example, we don't want to start an animation
        // when some other animation also wants to start when the first animation begins.
        final ArrayList<Node> nodesToStart = new ArrayList<Node>();
        for (Node node : mSortedNodes) {
        int numSortedNodes = mSortedNodes.size();
        for (int i = 0; i < numSortedNodes; ++i) {
            Node node = mSortedNodes.get(i);
            if (mSetListener == null) {
                mSetListener = new AnimatorSetListener(this);
            }
            if (node.dependencies == null || node.dependencies.size() == 0) {
                nodesToStart.add(node);
            } else {
                for (Dependency dependency : node.dependencies) {
                int numDependencies = node.dependencies.size();
                for (int j = 0; j < numDependencies; ++j) {
                    Dependency dependency = node.dependencies.get(j);
                    dependency.node.animation.addListener(
                            new DependencyListener(this, node, dependency.rule));
                }
@@ -389,7 +393,9 @@ public final class AnimatorSet extends Animator {
            delayAnim.setDuration(mStartDelay);
            delayAnim.addListener(new AnimatorListenerAdapter() {
                public void onAnimationEnd(Animator anim) {
                    for (Node node : nodesToStart) {
                    int numNodes = nodesToStart.size();
                    for (int i = 0; i < numNodes; ++i) {
                        Node node = nodesToStart.get(i);
                        node.animation.start();
                        mPlayingSet.add(node.animation);
                    }
@@ -399,8 +405,9 @@ public final class AnimatorSet extends Animator {
        if (mListeners != null) {
            ArrayList<AnimatorListener> tmpListeners =
                    (ArrayList<AnimatorListener>) mListeners.clone();
            for (AnimatorListener listener : tmpListeners) {
                listener.onAnimationStart(this);
            int numListeners = tmpListeners.size();
            for (int i = 0; i < numListeners; ++i) {
                tmpListeners.get(i).onAnimationStart(this);
            }
        }
    }
@@ -540,7 +547,9 @@ public final class AnimatorSet extends Animator {
                return;
            }
            Dependency dependencyToRemove = null;
            for (Dependency dependency : mNode.tmpDependencies) {
            int numDependencies = mNode.tmpDependencies.size();
            for (int i = 0; i < numDependencies; ++i) {
                Dependency dependency = mNode.tmpDependencies.get(i);
                if (dependency.rule == mRule &&
                        dependency.node.animation == dependencyAnimation) {
                    // rule fired - remove the dependency and listener and check to
@@ -571,8 +580,9 @@ public final class AnimatorSet extends Animator {
        public void onAnimationCancel(Animator animation) {
            if (mPlayingSet.size() == 0) {
                if (mListeners != null) {
                    for (AnimatorListener listener : mListeners) {
                        listener.onAnimationCancel(mAnimatorSet);
                    int numListeners = mListeners.size();
                    for (int i = 0; i < numListeners; ++i) {
                        mListeners.get(i).onAnimationCancel(mAnimatorSet);
                    }
                }
            }
@@ -586,8 +596,9 @@ public final class AnimatorSet extends Animator {
            animNode.done = true;
            ArrayList<Node> sortedNodes = mAnimatorSet.mSortedNodes;
            boolean allDone = true;
            for (Node node : sortedNodes) {
                if (!node.done) {
            int numSortedNodes = sortedNodes.size();
            for (int i = 0; i < numSortedNodes; ++i) {
                if (!sortedNodes.get(i).done) {
                    allDone = false;
                    break;
                }
@@ -598,8 +609,9 @@ public final class AnimatorSet extends Animator {
                if (mListeners != null) {
                    ArrayList<AnimatorListener> tmpListeners =
                            (ArrayList<AnimatorListener>) mListeners.clone();
                    for (AnimatorListener listener : tmpListeners) {
                        listener.onAnimationEnd(mAnimatorSet);
                    int numListeners = tmpListeners.size();
                    for (int i = 0; i < numListeners; ++i) {
                        tmpListeners.get(i).onAnimationEnd(mAnimatorSet);
                    }
                }
            }
@@ -629,17 +641,23 @@ public final class AnimatorSet extends Animator {
        if (mNeedsSort) {
            mSortedNodes.clear();
            ArrayList<Node> roots = new ArrayList<Node>();
            for (Node node : mNodes) {
            int numNodes = mNodes.size();
            for (int i = 0; i < numNodes; ++i) {
                Node node = mNodes.get(i);
                if (node.dependencies == null || node.dependencies.size() == 0) {
                    roots.add(node);
                }
            }
            ArrayList<Node> tmpRoots = new ArrayList<Node>();
            while (roots.size() > 0) {
                for (Node root : roots) {
                int numRoots = roots.size();
                for (int i = 0; i < numRoots; ++i) {
                    Node root = roots.get(i);
                    mSortedNodes.add(root);
                    if (root.nodeDependents != null) {
                        for (Node node : root.nodeDependents) {
                        int numDependents = root.nodeDependents.size();
                        for (int j = 0; j < numDependents; ++j) {
                            Node node = root.nodeDependents.get(j);
                            node.nodeDependencies.remove(root);
                            if (node.nodeDependencies.size() == 0) {
                                tmpRoots.add(node);
@@ -660,9 +678,13 @@ public final class AnimatorSet extends Animator {
            // Doesn't need sorting, but still need to add in the nodeDependencies list
            // because these get removed as the event listeners fire and the dependencies
            // are satisfied
            for (Node node : mNodes) {
            int numNodes = mNodes.size();
            for (int i = 0; i < numNodes; ++i) {
                Node node = mNodes.get(i);
                if (node.dependencies != null && node.dependencies.size() > 0) {
                    for (Dependency dependency : node.dependencies) {
                    int numDependencies = node.dependencies.size();
                    for (int j = 0; j < numDependencies; ++j) {
                        Dependency dependency = node.dependencies.get(j);
                        if (node.nodeDependencies == null) {
                            node.nodeDependencies = new ArrayList<Node>();
                        }
+134 −0

File added.

Preview size limit exceeded, changes collapsed.

+133 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading