android_jni: Add nextFrameIndex method

This method will return the index of the frame that will be
returned in the next call to nextFrame(). If the return value is
the same as frame count, then the next call to nextFrame() will
fail.

GOOGLE_INTERNAL_CL: 525520767
diff --git a/android_jni/avifandroidjni/src/androidTest/java/org/aomedia/avif/android/AnimatedImageTest.java b/android_jni/avifandroidjni/src/androidTest/java/org/aomedia/avif/android/AnimatedImageTest.java
index a368bf3..3d87107 100644
--- a/android_jni/avifandroidjni/src/androidTest/java/org/aomedia/avif/android/AnimatedImageTest.java
+++ b/android_jni/avifandroidjni/src/androidTest/java/org/aomedia/avif/android/AnimatedImageTest.java
@@ -105,18 +105,22 @@
     Bitmap bitmap = Bitmap.createBitmap(image.width, image.height, config);
     assertThat(bitmap).isNotNull();
     for (int i = 0; i < image.frameCount; i++) {
+      assertThat(decoder.nextFrameIndex()).isEqualTo(i);
       assertThat(decoder.nextFrame(bitmap)).isTrue();
       assertThat(frameDurations[i]).isWithin(1.0e-2).of(image.frameDuration);
     }
+    assertThat(decoder.nextFrameIndex()).isEqualTo(image.frameCount);
     // Fetch the first frame again.
     assertThat(decoder.nthFrame(0, bitmap)).isTrue();
     // Now nextFrame will return the second frame.
+    assertThat(decoder.nextFrameIndex()).isEqualTo(1);
     assertThat(decoder.nextFrame(bitmap)).isTrue();
     // Fetch the (frameCount/2)th frame.
     assertThat(decoder.nthFrame(image.frameCount / 2, bitmap)).isTrue();
     // Fetch the last frame.
     assertThat(decoder.nthFrame(image.frameCount - 1, bitmap)).isTrue();
     // Now nextFrame should return false.
+    assertThat(decoder.nextFrameIndex()).isEqualTo(image.frameCount);
     assertThat(decoder.nextFrame(bitmap)).isFalse();
     // Passing out of bound values for n should fail.
     assertThat(decoder.nthFrame(-1, bitmap)).isFalse();
diff --git a/android_jni/avifandroidjni/src/main/java/org/aomedia/avif/android/AvifDecoder.java b/android_jni/avifandroidjni/src/main/java/org/aomedia/avif/android/AvifDecoder.java
index 8ada59c..696c2d5 100644
--- a/android_jni/avifandroidjni/src/main/java/org/aomedia/avif/android/AvifDecoder.java
+++ b/android_jni/avifandroidjni/src/main/java/org/aomedia/avif/android/AvifDecoder.java
@@ -206,6 +206,17 @@
   private native boolean nextFrame(long decoder, Bitmap bitmap);
 
   /**
+   * Get the 0-based index of the frame that will be returned by the next call to {@link nextFrame}.
+   * If the returned value is same as {@link getFrameCount}, then the next call to {@link nextFrame}
+   * will fail.
+   */
+  public int nextFrameIndex() {
+    return nextFrameIndex(decoder);
+  }
+
+  private native int nextFrameIndex(long decoder);
+
+  /**
    * Decodes the nth frame of the animated AVIF into the bitmap.
    *
    * <p>Note that calling this method will change the behavior of subsequent calls to {@link
diff --git a/android_jni/avifandroidjni/src/main/jni/libavif_jni.cc b/android_jni/avifandroidjni/src/main/jni/libavif_jni.cc
index 173ad39..f6038de 100644
--- a/android_jni/avifandroidjni/src/main/jni/libavif_jni.cc
+++ b/android_jni/avifandroidjni/src/main/jni/libavif_jni.cc
@@ -278,6 +278,12 @@
   return DecodeNextImage(env, decoder, bitmap);
 }
 
+FUNC(jint, nextFrameIndex, jlong jdecoder) {
+  AvifDecoderWrapper* const decoder =
+      reinterpret_cast<AvifDecoderWrapper*>(jdecoder);
+  return decoder->decoder->imageIndex + 1;
+}
+
 FUNC(jboolean, nthFrame, jlong jdecoder, jint n, jobject bitmap) {
   AvifDecoderWrapper* const decoder =
       reinterpret_cast<AvifDecoderWrapper*>(jdecoder);