diff --git a/cameraview/src/androidTest/java/com/otaliastudios/cameraview/OrientationHelperTest.java b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/OrientationHelperTest.java new file mode 100644 index 00000000..1b496680 --- /dev/null +++ b/cameraview/src/androidTest/java/com/otaliastudios/cameraview/OrientationHelperTest.java @@ -0,0 +1,97 @@ +package com.otaliastudios.cameraview; + + +import android.annotation.TargetApi; +import android.app.Instrumentation; +import android.app.UiAutomation; +import android.support.test.InstrumentationRegistry; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; +import android.view.OrientationEventListener; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +@RunWith(AndroidJUnit4.class) +@SmallTest +public class OrientationHelperTest { + + private OrientationHelper helper; + private OrientationHelper.Callbacks callbacks; + + @Before + public void setUp() { + InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + callbacks = mock(OrientationHelper.Callbacks.class); + helper = new OrientationHelper(InstrumentationRegistry.getContext(), callbacks); + } + }); + } + + @After + public void tearDown() { + callbacks = null; + helper = null; + } + + @Test + public void testEnable() { + assertNotNull(helper.mListener); + assertNull(helper.mDisplay); + + helper.enable(InstrumentationRegistry.getContext()); + assertNotNull(helper.mListener); + assertNotNull(helper.mDisplay); + + // Ensure nothing bad if called twice. + helper.enable(InstrumentationRegistry.getContext()); + assertNotNull(helper.mListener); + assertNotNull(helper.mDisplay); + + helper.disable(); + assertNotNull(helper.mListener); + assertNull(helper.mDisplay); + + verify(callbacks, atLeastOnce()).onDisplayOffsetChanged(anyInt()); + } + + @Test + public void testRotation() { + helper.enable(InstrumentationRegistry.getContext()); + + reset(callbacks); // Reset counts. + helper.mListener.onOrientationChanged(OrientationEventListener.ORIENTATION_UNKNOWN); + assertEquals(helper.mLastOrientation, 0); + helper.mListener.onOrientationChanged(10); + assertEquals(helper.mLastOrientation, 0); + helper.mListener.onOrientationChanged(-10); + assertEquals(helper.mLastOrientation, 0); + helper.mListener.onOrientationChanged(44); + assertEquals(helper.mLastOrientation, 0); + helper.mListener.onOrientationChanged(360); + assertEquals(helper.mLastOrientation, 0); + + // Callback called just once. + verify(callbacks, times(1)).onDeviceOrientationChanged(0); + + helper.mListener.onOrientationChanged(90); + helper.mListener.onOrientationChanged(91); + assertEquals(helper.mLastOrientation, 90); + verify(callbacks, times(1)).onDeviceOrientationChanged(90); + + helper.mListener.onOrientationChanged(180); + assertEquals(helper.mLastOrientation, 180); + verify(callbacks, times(1)).onDeviceOrientationChanged(180); + + helper.mListener.onOrientationChanged(270); + assertEquals(helper.mLastOrientation, 270); + verify(callbacks, times(1)).onDeviceOrientationChanged(270); + } +} diff --git a/cameraview/src/main/utils/com/otaliastudios/cameraview/OrientationHelper.java b/cameraview/src/main/utils/com/otaliastudios/cameraview/OrientationHelper.java index 53f9aaea..ba63b7f2 100644 --- a/cameraview/src/main/utils/com/otaliastudios/cameraview/OrientationHelper.java +++ b/cameraview/src/main/utils/com/otaliastudios/cameraview/OrientationHelper.java @@ -19,11 +19,12 @@ class OrientationHelper { DISPLAY_ORIENTATIONS.put(Surface.ROTATION_270, 270); } - private final OrientationEventListener mListener; + final OrientationEventListener mListener; + Display mDisplay; + private final Callbacks mCallbacks; - private Display mDisplay; - private int mLastKnownDisplayOffset = -1; - private int mLastOrientation = -1; + int mLastKnownDisplayOffset = -1; + int mLastOrientation = -1; interface Callbacks { void onDisplayOffsetChanged(int displayOffset);