diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/GridLinesLayoutTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/GridLinesLayoutTest.java index 389b8a88..2bb87665 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/GridLinesLayoutTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/internal/GridLinesLayoutTest.java @@ -5,6 +5,8 @@ import com.otaliastudios.cameraview.BaseTest; import com.otaliastudios.cameraview.TestActivity; import com.otaliastudios.cameraview.controls.Grid; import com.otaliastudios.cameraview.tools.Op; +import com.otaliastudios.cameraview.tools.Retry; +import com.otaliastudios.cameraview.tools.RetryRule; import androidx.annotation.NonNull; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -26,6 +28,9 @@ public class GridLinesLayoutTest extends BaseTest { @Rule public ActivityTestRule rule = new ActivityTestRule<>(TestActivity.class); + @Rule + public RetryRule retryRule = new RetryRule(3); + private GridLinesLayout layout; @NonNull @@ -59,24 +64,28 @@ public class GridLinesLayoutTest extends BaseTest { return result; } + @Retry @Test public void testOff() { int linesDrawn = setGridAndWait(Grid.OFF); assertEquals(0, linesDrawn); } + @Retry @Test public void test3x3() { int linesDrawn = setGridAndWait(Grid.DRAW_3X3); assertEquals(2, linesDrawn); } + @Retry @Test public void testPhi() { int linesDrawn = setGridAndWait(Grid.DRAW_PHI); assertEquals(2, linesDrawn); } + @Retry @Test public void test4x4() { int linesDrawn = setGridAndWait(Grid.DRAW_4X4); diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/tools/Retry.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/tools/Retry.java new file mode 100644 index 00000000..d5036354 --- /dev/null +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/tools/Retry.java @@ -0,0 +1,7 @@ +package com.otaliastudios.cameraview.tools; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Retention(RetentionPolicy.RUNTIME) +public @interface Retry {} diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/tools/RetryRule.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/tools/RetryRule.java new file mode 100644 index 00000000..1b54bf6f --- /dev/null +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/tools/RetryRule.java @@ -0,0 +1,46 @@ +package com.otaliastudios.cameraview.tools; + +import com.otaliastudios.cameraview.CameraLogger; + +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +import java.util.concurrent.atomic.AtomicInteger; + +public class RetryRule implements TestRule { + + private final static String TAG = RetryRule.class.getSimpleName(); + private final static CameraLogger LOG = CameraLogger.create(TAG); + + private AtomicInteger retries; + + public RetryRule(int retries) { + this.retries = new AtomicInteger(retries); + } + + @Override + public Statement apply(final Statement base, final Description description) { + return new Statement() { + @Override + public void evaluate() throws Throwable { + if (description.getAnnotation(Retry.class) == null) { + base.evaluate(); + } else { + Throwable caught = null; + while (retries.getAndDecrement() > 0) { + try { + base.evaluate(); + return; + } catch (Throwable throwable) { + caught = throwable; + } + } + if (caught != null) { + throw caught; + } + } + } + }; + } +} \ No newline at end of file diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/picture/Full2PictureRecorder.java b/cameraview/src/main/java/com/otaliastudios/cameraview/picture/Full2PictureRecorder.java index 6cfe8191..ea97f5f5 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/picture/Full2PictureRecorder.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/picture/Full2PictureRecorder.java @@ -71,6 +71,7 @@ public class Full2PictureRecorder extends PictureRecorder mResult = null; mError = e; dispatchResult(); + setState(STATE_COMPLETED); } }