pull/724/head
Mattia Iavarone 6 years ago
parent 6b0b06f2c0
commit 6be11956e9
  1. 25
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/CameraViewTest.java
  2. 137
      cameraview/src/androidTest/java/com/otaliastudios/cameraview/metering/MeteringRegionsTest.java
  3. 1
      cameraview/src/main/java/com/otaliastudios/cameraview/CameraView.java
  4. 5
      cameraview/src/main/java/com/otaliastudios/cameraview/metering/MeteringRegion.java
  5. 9
      cameraview/src/main/java/com/otaliastudios/cameraview/metering/MeteringRegions.java

@ -5,6 +5,7 @@ import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.ImageFormat;
import android.graphics.PointF;
import android.graphics.RectF;
import android.location.Location;
import androidx.annotation.NonNull;
import androidx.test.annotation.UiThreadTest;
@ -632,6 +633,20 @@ public class CameraViewTest extends BaseTest {
cameraView.startAutoFocus(200, 200);
}
@Test(expected = IllegalArgumentException.class)
public void testStartAutoFocus_illegal3() {
cameraView.startAutoFocus(new RectF(-1, -1, 1, 1));
}
@Test(expected = IllegalArgumentException.class)
public void testStartAutoFocus_illegal4() {
cameraView.setLeft(0);
cameraView.setRight(100);
cameraView.setTop(0);
cameraView.setBottom(100);
cameraView.startAutoFocus(new RectF(-100, -100, 200, 200));
}
@Test
public void testStartAutoFocus() {
cameraView.setLeft(0);
@ -642,6 +657,16 @@ public class CameraViewTest extends BaseTest {
assertTrue(mockController.mFocusStarted);
}
@Test
public void testStartAutoFocusRect() {
cameraView.setLeft(0);
cameraView.setRight(100);
cameraView.setTop(0);
cameraView.setBottom(100);
cameraView.startAutoFocus(new RectF(25, 25, 75, 75));
assertTrue(mockController.mFocusStarted);
}
//endregion
//region test setParameters

@ -0,0 +1,137 @@
package com.otaliastudios.cameraview.metering;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.SmallTest;
import com.otaliastudios.cameraview.BaseTest;
import com.otaliastudios.cameraview.R;
import com.otaliastudios.cameraview.markers.AutoFocusMarker;
import com.otaliastudios.cameraview.markers.AutoFocusTrigger;
import com.otaliastudios.cameraview.markers.MarkerParser;
import com.otaliastudios.cameraview.size.Size;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import java.util.List;
import static junit.framework.TestCase.assertNotNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(AndroidJUnit4.class)
@SmallTest
public class MeteringRegionsTest extends BaseTest {
private final Size bounds = new Size(1000, 1000);
private void checkRegion(@NonNull MeteringRegion region, @NonNull PointF center, int weight) {
assertEquals(center.x, region.mRegion.centerX(), 0.01F);
assertEquals(center.y, region.mRegion.centerY(), 0.01F);
assertEquals(weight, region.mWeight);
}
@Test
public void testFromPoint() {
PointF center = new PointF(500, 500);
MeteringRegions regions = MeteringRegions.fromPoint(bounds, center);
assertEquals(2, regions.mRegions.size());
MeteringRegion first = regions.mRegions.get(0);
MeteringRegion second = regions.mRegions.get(1);
checkRegion(first, center, MeteringRegion.MAX_WEIGHT);
checkRegion(second, center,
Math.round(MeteringRegions.BLUR_FACTOR_WEIGHT * MeteringRegion.MAX_WEIGHT));
}
@Test
public void testFromArea() {
RectF area = new RectF(400, 400, 600, 600);
MeteringRegions regions = MeteringRegions.fromArea(bounds, area);
assertEquals(1, regions.mRegions.size());
MeteringRegion region = regions.mRegions.get(0);
checkRegion(region, new PointF(area.centerX(), area.centerY()), MeteringRegion.MAX_WEIGHT);
}
@Test
public void testFromArea_withBlur() {
RectF area = new RectF(400, 400, 600, 600);
MeteringRegions regions = MeteringRegions.fromArea(bounds, area,
MeteringRegion.MAX_WEIGHT, true);
assertEquals(2, regions.mRegions.size());
MeteringRegion first = regions.mRegions.get(0);
MeteringRegion second = regions.mRegions.get(1);
PointF center = new PointF(area.centerX(), area.centerY());
checkRegion(first, center, MeteringRegion.MAX_WEIGHT);
checkRegion(second, center,
Math.round(MeteringRegions.BLUR_FACTOR_WEIGHT * MeteringRegion.MAX_WEIGHT));
}
@Test
public void testTransform() {
MeteringTransform transform = mock(MeteringTransform.class);
when(transform.transformMeteringPoint(any(PointF.class))).then(new Answer<PointF>() {
@Override
public PointF answer(InvocationOnMock invocation) {
PointF in = invocation.getArgument(0);
// This will swap x and y coordinates
//noinspection SuspiciousNameCombination
return new PointF(in.y, in.x);
}
});
RectF area = new RectF(0, 0, 100, 500); // tall area
RectF expected = new RectF(0, 0, 500, 100); // wide area
MeteringRegions regions = MeteringRegions.fromArea(bounds, area);
MeteringRegions transformed = regions.transform(transform);
verify(transform, times(4)).transformMeteringPoint(any(PointF.class));
assertEquals(1, transformed.mRegions.size());
assertEquals(expected, transformed.mRegions.get(0).mRegion);
}
@Test
public void testGet() {
MeteringTransform<Integer> transform = new MeteringTransform<Integer>() {
@NonNull
@Override
public PointF transformMeteringPoint(@NonNull PointF point) {
return point;
}
@NonNull
@Override
public Integer transformMeteringRegion(@NonNull RectF region, int weight) {
return weight;
}
};
MeteringRegions regions = MeteringRegions.fromArea(bounds,
new RectF(400, 400, 600, 600),
900,
true);
assertEquals(2, regions.mRegions.size());
List<Integer> result = regions.get(1, transform);
assertEquals(1, result.size());
assertEquals(900, (int) result.get(0));
}
}

@ -72,7 +72,6 @@ import com.otaliastudios.cameraview.markers.AutoFocusMarker;
import com.otaliastudios.cameraview.markers.AutoFocusTrigger;
import com.otaliastudios.cameraview.markers.MarkerLayout;
import com.otaliastudios.cameraview.markers.MarkerParser;
import com.otaliastudios.cameraview.metering.MeteringRegion;
import com.otaliastudios.cameraview.metering.MeteringRegions;
import com.otaliastudios.cameraview.overlay.OverlayLayout;
import com.otaliastudios.cameraview.preview.CameraPreview;

@ -7,9 +7,9 @@ import androidx.annotation.NonNull;
import com.otaliastudios.cameraview.size.Size;
public class MeteringRegion implements Comparable<MeteringRegion> {
class MeteringRegion implements Comparable<MeteringRegion> {
public final static int MAX_WEIGHT = 1000;
final static int MAX_WEIGHT = 1000;
final RectF mRegion;
final int mWeight;
@ -55,6 +55,7 @@ public class MeteringRegion implements Comparable<MeteringRegion> {
return clip(new RectF(0, 0, bounds.getWidth(), bounds.getHeight()));
}
@SuppressWarnings("WeakerAccess")
@NonNull
MeteringRegion clip(@NonNull RectF bounds) {
RectF region = new RectF();

@ -4,20 +4,23 @@ import android.graphics.PointF;
import android.graphics.RectF;
import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
import com.otaliastudios.cameraview.size.Size;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class MeteringRegions {
private final static float POINT_AREA = 0.05F;
private final static float BLUR_FACTOR_WEIGHT = 0.1F;
@VisibleForTesting
final static float BLUR_FACTOR_WEIGHT = 0.1F;
private final static float BLUR_FACTOR_SIZE = 1.5F;
private final List<MeteringRegion> mRegions;
@VisibleForTesting
final List<MeteringRegion> mRegions;
private MeteringRegions(@NonNull List<MeteringRegion> regions) {
mRegions = regions;

Loading…
Cancel
Save