Merge "Add the fourth loop behavior LOOP_FINITE to FrameSequenceDrawable."
diff --git a/framesequence/src/android/support/rastermill/FrameSequenceDrawable.java b/framesequence/src/android/support/rastermill/FrameSequenceDrawable.java
index a1b7020..77bdb57 100644
--- a/framesequence/src/android/support/rastermill/FrameSequenceDrawable.java
+++ b/framesequence/src/android/support/rastermill/FrameSequenceDrawable.java
@@ -103,9 +103,9 @@
     }
 
     /**
-     * Loop only once.
+     * Loop a finite number of times, which can be set using setLoopCount. Default to loop once.
      */
-    public static final int LOOP_ONCE = 1;
+    public static final int LOOP_FINITE = 1;
 
     /**
      * Loop continuously. The OnFinishedListener will never be called.
@@ -118,14 +118,29 @@
     public static final int LOOP_DEFAULT = 3;
 
     /**
+     * Loop only once.
+     *
+     * @deprecated Use LOOP_FINITE instead.
+     */
+    @Deprecated
+    public static final int LOOP_ONCE = LOOP_FINITE;
+
+    /**
      * Define looping behavior of frame sequence.
      *
-     * Must be one of LOOP_ONCE, LOOP_INF, or LOOP_DEFAULT
+     * Must be one of LOOP_ONCE, LOOP_INF, LOOP_DEFAULT, or LOOP_FINITE.
      */
     public void setLoopBehavior(int loopBehavior) {
         mLoopBehavior = loopBehavior;
     }
 
+    /**
+     * Set the number of loops in LOOP_FINITE mode. The number must be a postive integer.
+     */
+    public void setLoopCount(int loopCount) {
+        mLoopCount = loopCount;
+    }
+
     private final FrameSequence mFrameSequence;
     private final FrameSequence.State mFrameSequenceState;
 
@@ -151,6 +166,7 @@
     private int mState;
     private int mCurrentLoop;
     private int mLoopBehavior = LOOP_DEFAULT;
+    private int mLoopCount = 1;
 
     private long mLastSwap;
     private long mNextSwap;
@@ -361,7 +377,7 @@
                 boolean continueLooping = true;
                 if (mNextFrameToDecode == mFrameSequence.getFrameCount() - 1) {
                     mCurrentLoop++;
-                    if ((mLoopBehavior == LOOP_ONCE && mCurrentLoop == 1) ||
+                    if ((mLoopBehavior == LOOP_ONCE && mCurrentLoop == mLoopCount) ||
                             (mLoopBehavior == LOOP_DEFAULT && mCurrentLoop == mFrameSequence.getDefaultLoopCount())) {
                         continueLooping = false;
                     }