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

Commit 49afa5bc authored by Chet Haase's avatar Chet Haase
Browse files

Add facilities for layout transitions

Change-Id: I5c73ce6c6ba3bc9e3b57fcfbbcab37d511db6132
parent 63134b3a
Loading
Loading
Loading
Loading
+33 −18
Original line number Diff line number Diff line
@@ -19779,6 +19779,8 @@
 deprecated="not deprecated"
 visibility="public"
>
<implements name="java.lang.Cloneable">
</implements>
<constructor name="Animatable"
 type="android.animation.Animatable"
 static="false"
@@ -19811,6 +19813,19 @@
 visibility="public"
>
</method>
<method name="clone"
 return="android.animation.Animatable"
 abstract="false"
 native="false"
 synchronized="false"
 static="false"
 final="false"
 deprecated="not deprecated"
 visibility="public"
>
<exception name="CloneNotSupportedException" type="java.lang.CloneNotSupportedException">
</exception>
</method>
<method name="end"
 return="void"
 abstract="false"
@@ -269619,7 +269634,7 @@
>
<parameter name="numBits" type="int">
</parameter>
<parameter name="rnd" type="java.util.Random">
<parameter name="random" type="java.util.Random">
</parameter>
</constructor>
<constructor name="BigInteger"
@@ -269633,7 +269648,7 @@
</parameter>
<parameter name="certainty" type="int">
</parameter>
<parameter name="rnd" type="java.util.Random">
<parameter name="unused" type="java.util.Random">
</parameter>
</constructor>
<constructor name="BigInteger"
@@ -269643,7 +269658,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="val" type="java.lang.String">
<parameter name="value" type="java.lang.String">
</parameter>
</constructor>
<constructor name="BigInteger"
@@ -269653,7 +269668,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="val" type="java.lang.String">
<parameter name="value" type="java.lang.String">
</parameter>
<parameter name="radix" type="int">
</parameter>
@@ -269677,7 +269692,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="val" type="byte[]">
<parameter name="value" type="byte[]">
</parameter>
</constructor>
<method name="abs"
@@ -269701,7 +269716,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="val" type="java.math.BigInteger">
<parameter name="value" type="java.math.BigInteger">
</parameter>
</method>
<method name="and"
@@ -269714,7 +269729,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="val" type="java.math.BigInteger">
<parameter name="value" type="java.math.BigInteger">
</parameter>
</method>
<method name="andNot"
@@ -269727,7 +269742,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="val" type="java.math.BigInteger">
<parameter name="value" type="java.math.BigInteger">
</parameter>
</method>
<method name="bitCount"
@@ -269775,7 +269790,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="val" type="java.math.BigInteger">
<parameter name="value" type="java.math.BigInteger">
</parameter>
</method>
<method name="divide"
@@ -269849,7 +269864,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="val" type="java.math.BigInteger">
<parameter name="value" type="java.math.BigInteger">
</parameter>
</method>
<method name="getLowestSetBit"
@@ -269908,7 +269923,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="val" type="java.math.BigInteger">
<parameter name="value" type="java.math.BigInteger">
</parameter>
</method>
<method name="min"
@@ -269921,7 +269936,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="val" type="java.math.BigInteger">
<parameter name="value" type="java.math.BigInteger">
</parameter>
</method>
<method name="mod"
@@ -269975,7 +269990,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="val" type="java.math.BigInteger">
<parameter name="value" type="java.math.BigInteger">
</parameter>
</method>
<method name="negate"
@@ -270021,7 +270036,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="val" type="java.math.BigInteger">
<parameter name="value" type="java.math.BigInteger">
</parameter>
</method>
<method name="pow"
@@ -270049,7 +270064,7 @@
>
<parameter name="bitLength" type="int">
</parameter>
<parameter name="rnd" type="java.util.Random">
<parameter name="unused" type="java.util.Random">
</parameter>
</method>
<method name="remainder"
@@ -270125,7 +270140,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="val" type="java.math.BigInteger">
<parameter name="value" type="java.math.BigInteger">
</parameter>
</method>
<method name="testBit"
@@ -270175,7 +270190,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="val" type="long">
<parameter name="value" type="long">
</parameter>
</method>
<method name="xor"
@@ -270188,7 +270203,7 @@
 deprecated="not deprecated"
 visibility="public"
>
<parameter name="val" type="java.math.BigInteger">
<parameter name="value" type="java.math.BigInteger">
</parameter>
</method>
<field name="ONE"
+15 −1
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ import java.util.ArrayList;
 * This is the superclass for classes which provide basic support for animations which can be
 * started, ended, and have <code>AnimatableListeners</code> added to them.
 */
public abstract class Animatable {
public abstract class Animatable implements Cloneable {


    /**
@@ -107,6 +107,20 @@ public abstract class Animatable {
        }
    }

    @Override
    public Animatable clone() throws CloneNotSupportedException {
        final Animatable anim = (Animatable) super.clone();
        if (mListeners != null) {
            ArrayList<AnimatableListener> oldListeners = mListeners;
            anim.mListeners = new ArrayList<AnimatableListener>();
            int numListeners = oldListeners.size();
            for (int i = 0; i < numListeners; ++i) {
                anim.mListeners.add(oldListeners.get(i));
            }
        }
        return anim;
    }

    /**
     * <p>An animation listener receives notifications from an animation.
     * Notifications indicate animation related events, such as the end or the
+37 −2
Original line number Diff line number Diff line
@@ -80,9 +80,11 @@ public class Animator<T> extends Animatable {

    /**
     * Internal variables
     * NOTE: This object implements the clone() method, making a deep copy of any referenced
     * objects. As other non-trivial fields are added to this class, make sure to add logic
     * to clone() to make deep copies of them.
     */


    // The first time that the animation's animateFrame() method is called. This time is used to
    // determine elapsed time (and therefore the elapsed fraction) in subsequent calls
    // to animateFrame()
@@ -402,7 +404,7 @@ public class Animator<T> extends Animatable {
     * @return The current position in time of the animation.
     */
    public long getCurrentPlayTime() {
        if (!mInitialized) {
        if (!mInitialized || mPlayingState == STOPPED) {
            return 0;
        }
        return AnimationUtils.currentAnimationTimeMillis() - mStartTime;
@@ -954,6 +956,39 @@ public class Animator<T> extends Animatable {
        }
    }

    @Override
    public Animator clone() throws CloneNotSupportedException {
        final Animator anim = (Animator) super.clone();
        if (mUpdateListeners != null) {
            ArrayList<AnimatorUpdateListener> oldListeners = mUpdateListeners;
            anim.mUpdateListeners = new ArrayList<AnimatorUpdateListener>();
            int numListeners = oldListeners.size();
            for (int i = 0; i < numListeners; ++i) {
                anim.mUpdateListeners.add(oldListeners.get(i));
            }
        }
        anim.mSeekTime = -1;
        anim.mPlayingBackwards = false;
        anim.mCurrentIteration = 0;
        anim.mInitialized = false;
        anim.mPlayingState = STOPPED;
        anim.mStartedDelay = false;
        PropertyValuesHolder[] oldValues = mValues;
        if (oldValues != null) {
            int numValues = oldValues.length;
            anim.mValues = new PropertyValuesHolder[numValues];
            for (int i = 0; i < numValues; ++i) {
                anim.mValues[i] = oldValues[i];
            }
            anim.mValuesMap = new HashMap<String, PropertyValuesHolder>(numValues);
            for (int i = 0; i < numValues; ++i) {
                PropertyValuesHolder valuesHolder = mValues[i];
                anim.mValuesMap.put(valuesHolder.getPropertyName(), valuesHolder);
            }
        }
        return anim;
    }

    /**
     * Implementors of this interface can add themselves as update listeners
     * to an <code>Animator</code> instance to receive callbacks on every animation
+6 −0
Original line number Diff line number Diff line
@@ -228,4 +228,10 @@ public final class PropertyAnimator<T> extends Animator<T> {
            mValues[i].setAnimatedValue(mTarget);
        }
    }

    @Override
    public PropertyAnimator clone() throws CloneNotSupportedException {
        final PropertyAnimator anim = (PropertyAnimator) super.clone();
        return anim;
    }
}
+88 −5
Original line number Diff line number Diff line
@@ -45,11 +45,18 @@ import java.util.HashMap;
 */
public final class Sequencer extends Animatable {

    /**
     * Internal variables
     * NOTE: This object implements the clone() method, making a deep copy of any referenced
     * objects. As other non-trivial fields are added to this class, make sure to add logic
     * to clone() to make deep copies of them.
     */

    /**
     * Tracks animations currently being played, so that we know what to
     * cancel or end when cancel() or end() is called on this Sequencer
     */
    private final ArrayList<Animatable> mPlayingSet = new ArrayList<Animatable>();
    private ArrayList<Animatable> mPlayingSet = new ArrayList<Animatable>();

    /**
     * Contains all nodes, mapped to their respective Animatables. When new
@@ -57,21 +64,21 @@ public final class Sequencer extends Animatable {
     * to a single node representing that Animatable, not create a new Node
     * if one already exists.
     */
    private final HashMap<Animatable, Node> mNodeMap = new HashMap<Animatable, Node>();
    private HashMap<Animatable, Node> mNodeMap = new HashMap<Animatable, Node>();

    /**
     * Set of all nodes created for this Sequencer. This list is used upon
     * starting the sequencer, and the nodes are placed in sorted order into the
     * sortedNodes collection.
     */
    private final ArrayList<Node> mNodes = new ArrayList<Node>();
    private ArrayList<Node> mNodes = new ArrayList<Node>();

    /**
     * The sorted list of nodes. This is the order in which the animations will
     * be played. The details about when exactly they will be played depend
     * on the dependency relationships of the nodes.
     */
    private final ArrayList<Node> mSortedNodes = new ArrayList<Node>();
    private ArrayList<Node> mSortedNodes = new ArrayList<Node>();

    /**
     * Flag indicating whether the nodes should be sorted prior to playing. This
@@ -283,6 +290,75 @@ public final class Sequencer extends Animatable {
        }
    }

    @Override
    public Sequencer clone() throws CloneNotSupportedException {
        final Sequencer anim = (Sequencer) super.clone();
        /*
         * The basic clone() operation copies all items. This doesn't work very well for
         * Sequencer, because it will copy references that need to be recreated and state
         * that may not apply. What we need to do now is put the clone in an uninitialized
         * state, with fresh, empty data structures. Then we will build up the nodes list
         * manually, as we clone each Node (and its animation). The clone will then be sorted,
         * and will populate any appropriate lists, when it is started.
         */
        anim.mNeedsSort = true;
        anim.mCanceled = false;
        anim.mPlayingSet = new ArrayList<Animatable>();
        anim.mNodeMap = new HashMap<Animatable, Node>();
        anim.mNodes = new ArrayList<Node>();
        anim.mSortedNodes = new ArrayList<Node>();

        // Walk through the old nodes list, cloning each node and adding it to the new nodemap.
        // One problem is that the old node dependencies point to nodes in the old sequencer.
        // We need to track the old/new nodes in order to reconstruct the dependencies in the clone.
        HashMap<Node, Node> nodeCloneMap = new HashMap<Node, Node>(); // <old, new>
        for (Node node : mNodes) {
            Node nodeClone = node.clone();
            nodeCloneMap.put(node, nodeClone);
            anim.mNodes.add(nodeClone);
            anim.mNodeMap.put(nodeClone.animation, nodeClone);
            // Clear out the dependencies in the clone; we'll set these up manually later
            nodeClone.dependencies = null;
            nodeClone.tmpDependencies = null;
            nodeClone.nodeDependents = null;
            nodeClone.nodeDependencies = null;
            // clear out any listeners that were set up by the sequencer; these will
            // be set up when the clone's nodes are sorted
            ArrayList<AnimatableListener> cloneListeners = nodeClone.animation.getListeners();
            if (cloneListeners != null) {
                ArrayList<AnimatableListener> listenersToRemove = null;
                for (AnimatableListener listener : cloneListeners) {
                    if (listener instanceof SequencerAnimatableListener) {
                        if (listenersToRemove == null) {
                            listenersToRemove = new ArrayList<AnimatableListener>();
                        }
                        listenersToRemove.add(listener);
                    }
                }
                if (listenersToRemove != null) {
                    for (AnimatableListener listener : listenersToRemove) {
                        cloneListeners.remove(listener);
                    }
                }
            }
        }
        // Now that we've cloned all of the nodes, we're ready to walk through their
        // dependencies, mapping the old dependencies to the new nodes
        for (Node node : mNodes) {
            Node nodeClone = nodeCloneMap.get(node);
            if (node.dependencies != null) {
                for (Dependency dependency : node.dependencies) {
                    Node clonedDependencyNode = nodeCloneMap.get(dependency.node);
                    Dependency cloneDependency = new Dependency(clonedDependencyNode,
                            dependency.rule);
                    nodeClone.addDependency(cloneDependency);
                }
            }
        }

        return anim;
    }

    /**
     * This class is the mechanism by which animations are started based on events in other
     * animations. If an animation has multiple dependencies on other animations, then
@@ -514,7 +590,7 @@ public final class Sequencer extends Animatable {
     * both dependencies upon other nodes (in the dependencies list) as
     * well as dependencies of other nodes upon this (in the nodeDependents list).
     */
    private static class Node {
    private static class Node implements Cloneable {
        public Animatable animation;

        /**
@@ -587,6 +663,13 @@ public final class Sequencer extends Animatable {
            }
            dependencyNode.nodeDependents.add(this);
        }

        @Override
        public Node clone() throws CloneNotSupportedException {
            Node node = (Node) super.clone();
            node.animation = (Animatable) animation.clone();
            return node;
        }
    }

    /**
Loading