diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewCallbacksTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewCallbacksTest.java index 7f4333f8..769423a5 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewCallbacksTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewCallbacksTest.java @@ -17,6 +17,9 @@ import com.otaliastudios.cameraview.gesture.Gesture; import com.otaliastudios.cameraview.gesture.GestureAction; import com.otaliastudios.cameraview.internal.utils.Task; import com.otaliastudios.cameraview.engine.MockCameraEngine; +import com.otaliastudios.cameraview.markers.AutoFocusMarker; +import com.otaliastudios.cameraview.markers.AutoFocusTrigger; +import com.otaliastudios.cameraview.markers.MarkerLayout; import com.otaliastudios.cameraview.preview.MockCameraPreview; import com.otaliastudios.cameraview.preview.CameraPreview; @@ -34,6 +37,7 @@ import static org.junit.Assert.assertNull; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyFloat; import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.floatThat; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -190,6 +194,10 @@ public class CameraViewCallbacksTest extends BaseTest { // Enable tap gesture. // Can't mock package protected. camera.mTapGestureLayout = mock(TapGestureLayout.class); camera.mapGesture(Gesture.TAP, GestureAction.AUTO_FOCUS); + AutoFocusMarker marker = mock(AutoFocusMarker.class); + MarkerLayout markerLayout = mock(MarkerLayout.class); + camera.setAutoFocusMarker(marker); + camera.mMarkerLayout = markerLayout; PointF point = new PointF(); completeTask().when(listener).onAutoFocusStart(point); @@ -197,7 +205,8 @@ public class CameraViewCallbacksTest extends BaseTest { assertNotNull(task.await(200)); verify(listener, times(1)).onAutoFocusStart(point); - // Can't mock package protected. verify(camera.mTapGestureLayout, times(1)).onAutoFocusStart(point); + verify(marker, times(1)).onAutoFocusStart(AutoFocusTrigger.GESTURE, point); + verify(markerLayout, times(1)).onEvent(MarkerLayout.TYPE_AUTOFOCUS, any(PointF[].class)); } @Test @@ -205,6 +214,8 @@ public class CameraViewCallbacksTest extends BaseTest { // Enable tap gesture. // Can't mock package protected. camera.mTapGestureLayout = mock(TapGestureLayout.class); camera.mapGesture(Gesture.TAP, GestureAction.AUTO_FOCUS); + AutoFocusMarker marker = mock(AutoFocusMarker.class); + camera.setAutoFocusMarker(marker); PointF point = new PointF(); boolean success = true; @@ -213,6 +224,8 @@ public class CameraViewCallbacksTest extends BaseTest { assertNotNull(task.await(200)); verify(listener, times(1)).onAutoFocusEnd(success, point); + verify(marker, times(1)).onAutoFocusEnd(AutoFocusTrigger.GESTURE, success, point); + // Can't mock package protected. verify(camera.mTapGestureLayout, times(1)).onAutoFocusEnd(success); } diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java index 98bffc05..d41489b8 100644 --- a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java @@ -3,6 +3,7 @@ package com.otaliastudios.cameraview; import android.content.Context; import android.content.res.TypedArray; +import android.graphics.PointF; import android.location.Location; import androidx.annotation.NonNull; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -29,16 +30,26 @@ import com.otaliastudios.cameraview.gesture.PinchGestureLayout; import com.otaliastudios.cameraview.gesture.ScrollGestureLayout; import com.otaliastudios.cameraview.gesture.TapGestureLayout; import com.otaliastudios.cameraview.engine.MockCameraEngine; +import com.otaliastudios.cameraview.internal.utils.Task; +import com.otaliastudios.cameraview.markers.AutoFocusMarker; +import com.otaliastudios.cameraview.markers.DefaultAutoFocusMarker; +import com.otaliastudios.cameraview.markers.MarkerLayout; import com.otaliastudios.cameraview.preview.MockCameraPreview; import com.otaliastudios.cameraview.preview.CameraPreview; import com.otaliastudios.cameraview.size.Size; import com.otaliastudios.cameraview.size.SizeSelector; import com.otaliastudios.cameraview.size.SizeSelectors; +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; +import org.hamcrest.Matcher; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Matchers; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; import static org.junit.Assert.*; @@ -728,5 +739,36 @@ public class CameraViewTest extends BaseTest { //endregion + //region MarkerLayout + + @Test + public void testMarkerLayout_forAutoFocus_onMarker() { + MarkerLayout markerLayout = mock(MarkerLayout.class); + AutoFocusMarker marker = new DefaultAutoFocusMarker(); + cameraView.mMarkerLayout = markerLayout; + cameraView.setAutoFocusMarker(marker); + verify(markerLayout, times(1)).onMarker(MarkerLayout.TYPE_AUTOFOCUS, marker); + } + + @Test + public void testMarkerLayout_forAutoFocus_onEvent() { + MarkerLayout markerLayout = spy(cameraView.mMarkerLayout); + cameraView.mMarkerLayout = markerLayout; + final PointF point = new PointF(0, 0); + final PointF[] points = new PointF[]{ point }; + final Task task = new Task<>(true); + doAnswer(new Answer() { + @Override + public Object answer(InvocationOnMock invocation) throws Throwable { + task.end(true); + return null; + } + }).when(markerLayout).onEvent(MarkerLayout.TYPE_AUTOFOCUS, points); + cameraView.mCameraCallbacks.dispatchOnFocusStart(Gesture.TAP, point); + assertNotNull(task.await(100)); + } + + //endregion + // TODO: test permissions } diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/markers/MarkerLayoutTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/markers/MarkerLayoutTest.java new file mode 100644 index 00000000..4980f9a9 --- /dev/null +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/markers/MarkerLayoutTest.java @@ -0,0 +1,80 @@ +package com.otaliastudios.cameraview.markers; + + +import android.annotation.TargetApi; +import android.content.Context; +import android.view.MotionEvent; +import android.view.View; + +import com.otaliastudios.cameraview.BaseTest; +import com.otaliastudios.cameraview.TestActivity; +import com.otaliastudios.cameraview.gesture.Gesture; +import com.otaliastudios.cameraview.gesture.GestureLayout; +import com.otaliastudios.cameraview.internal.utils.Task; + +import org.hamcrest.Matchers; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.mockito.Mock; +import org.mockito.Mockito; + +import androidx.test.espresso.ViewInteraction; +import androidx.test.espresso.matcher.RootMatchers; +import androidx.test.rule.ActivityTestRule; + +import static androidx.test.espresso.Espresso.onView; + +@TargetApi(17) +public class MarkerLayoutTest extends BaseTest { + + + @Rule + public ActivityTestRule rule = new ActivityTestRule<>(TestActivity.class); + + private MarkerLayout markerLayout; + private AutoFocusMarker autoFocusMarker; + + @Before + public void setUp() { + ui(new Runnable() { + @Override + public void run() { + TestActivity a = rule.getActivity(); + markerLayout = Mockito.spy(new MarkerLayout(a)); + a.inflate(markerLayout); + autoFocusMarker = Mockito.spy(new DefaultAutoFocusMarker()); + } + }); + } + + @Test + public void testOnMarker_callsOnAttach() { + markerLayout.onMarker(MarkerLayout.TYPE_AUTOFOCUS, autoFocusMarker); + Mockito.verify(autoFocusMarker, Mockito.times(1)).onAttach( + Mockito.any(Context.class), + Mockito.eq(markerLayout)); + } + + @Test + public void testOnMarker_addsView() { + Assert.assertEquals(markerLayout.getChildCount(), 0); + markerLayout.onMarker(MarkerLayout.TYPE_AUTOFOCUS, autoFocusMarker); + Assert.assertEquals(markerLayout.getChildCount(), 1); + } + + @Test + public void testOnMarker_removesView() { + markerLayout.onMarker(MarkerLayout.TYPE_AUTOFOCUS, autoFocusMarker); + Assert.assertEquals(markerLayout.getChildCount(), 1); + markerLayout.onMarker(MarkerLayout.TYPE_AUTOFOCUS, autoFocusMarker); + Assert.assertEquals(markerLayout.getChildCount(), 1); + markerLayout.onMarker(MarkerLayout.TYPE_AUTOFOCUS, null); + Assert.assertEquals(markerLayout.getChildCount(), 0); + + Mockito.verify(autoFocusMarker, Mockito.times(2)).onAttach( + Mockito.any(Context.class), + Mockito.eq(markerLayout)); + } +} diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java index e5896c50..ae895c3c 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java @@ -117,7 +117,7 @@ public class CameraView extends FrameLayout implements LifecycleObserver { PinchGestureLayout mPinchGestureLayout; TapGestureLayout mTapGestureLayout; ScrollGestureLayout mScrollGestureLayout; - private MarkerLayout mMarkerLayout; + MarkerLayout mMarkerLayout; private boolean mKeepScreenOn; @SuppressWarnings({"FieldCanBeLocal", "unused"}) private boolean mExperimental; diff --git a/cameraview/src/main/java/com/otaliastudios/cameraview/markers/MarkerLayout.java b/cameraview/src/main/java/com/otaliastudios/cameraview/markers/MarkerLayout.java index 8c2d8c97..32c697b0 100644 --- a/cameraview/src/main/java/com/otaliastudios/cameraview/markers/MarkerLayout.java +++ b/cameraview/src/main/java/com/otaliastudios/cameraview/markers/MarkerLayout.java @@ -16,7 +16,7 @@ import androidx.annotation.Nullable; * Manages markers and provides an hierarchy / Canvas for them. * It is responsible for calling {@link Marker#onAttach(Context, ViewGroup)}. */ -public final class MarkerLayout extends FrameLayout { +public class MarkerLayout extends FrameLayout { public final static int TYPE_AUTOFOCUS = 1;