From f7bd04674df928557c75949ef9107eb1c350736b Mon Sep 17 00:00:00 2001 From: HaniHashemi Date: Sat, 28 Mar 2015 10:44:18 +0430 Subject: [PATCH 1/7] add minimum crop size --- .../android/crop/example/MainActivity.java | 6 ++++-- .../main/java/com/soundcloud/android/crop/Crop.java | 12 ++++++++++++ .../soundcloud/android/crop/CropImageActivity.java | 4 +++- .../com/soundcloud/android/crop/HighlightView.java | 8 +++++++- 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java b/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java index 7e904ba0..a116a43a 100644 --- a/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java +++ b/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java @@ -6,7 +6,6 @@ import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; - import android.widget.ImageView; import android.widget.Toast; @@ -52,7 +51,10 @@ protected void onActivityResult(int requestCode, int resultCode, Intent result) private void beginCrop(Uri source) { Uri outputUri = Uri.fromFile(new File(getCacheDir(), "cropped")); - new Crop(source).output(outputUri).asSquare().start(this); + Crop crop = new Crop(source); + crop.output(outputUri); + crop.widthMinSize(50); + crop.asSquare().start(this); } private void handleCrop(int resultCode, Intent result) { diff --git a/lib/src/main/java/com/soundcloud/android/crop/Crop.java b/lib/src/main/java/com/soundcloud/android/crop/Crop.java index 52d86013..482aea32 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/Crop.java +++ b/lib/src/main/java/com/soundcloud/android/crop/Crop.java @@ -26,6 +26,7 @@ static interface Extra { String MAX_X = "max_x"; String MAX_Y = "max_y"; String ERROR = "error"; + String MIN_X = "minimum_x"; } private Intent cropIntent; @@ -83,6 +84,17 @@ public Crop withMaxSize(int width, int height) { return this; } + /** + * Set minimum crop size + * + * @param width + * @return + */ + public Crop widthMinSize(int width) { + cropIntent.putExtra(Extra.MIN_X, width); + return this; + } + /** * Send the crop Intent! * diff --git a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java index b2273cb4..75577771 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java +++ b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java @@ -56,6 +56,7 @@ public class CropImageActivity extends MonitoredActivity { // Output image private int maxX; private int maxY; + private int minX; private int exifRotation; private Uri sourceUri; @@ -117,6 +118,7 @@ private void setupFromIntent() { aspectY = extras.getInt(Crop.Extra.ASPECT_Y); maxX = extras.getInt(Crop.Extra.MAX_X); maxY = extras.getInt(Crop.Extra.MAX_Y); + minX = extras.getInt(Crop.Extra.MIN_X, 25); saveUri = extras.getParcelable(MediaStore.EXTRA_OUTPUT); } @@ -236,7 +238,7 @@ private void makeDefault() { int y = (height - cropHeight) / 2; RectF cropRect = new RectF(x, y, x + cropWidth, y + cropHeight); - hv.setup(imageView.getUnrotatedMatrix(), imageRect, cropRect, aspectX != 0 && aspectY != 0); + hv.setup(imageView.getUnrotatedMatrix(), imageRect, cropRect, aspectX != 0 && aspectY != 0, minX); imageView.add(hv); } diff --git a/lib/src/main/java/com/soundcloud/android/crop/HighlightView.java b/lib/src/main/java/com/soundcloud/android/crop/HighlightView.java index 25b9091b..7e0fddf5 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/HighlightView.java +++ b/lib/src/main/java/com/soundcloud/android/crop/HighlightView.java @@ -75,6 +75,7 @@ enum HandleMode { Changing, Always, Never } private float handleRadius; private float outlineWidth; private boolean isFocused; + private int minX = 25; public HighlightView(View context) { viewContext = context; @@ -118,6 +119,11 @@ public void setup(Matrix m, Rect imageRect, RectF cropRect, boolean maintainAspe modifyMode = ModifyMode.None; } + public void setup(Matrix m, Rect imageRect, RectF cropRect, boolean maintainAspectRatio,int minX){ + this.minX = minX; + setup(m, imageRect, cropRect, maintainAspectRatio); + } + private float dpToPx(float dp) { return dp * viewContext.getResources().getDisplayMetrics().density; } @@ -326,7 +332,7 @@ void growBy(float dx, float dy) { r.inset(-dx, -dy); // Don't let the cropping rectangle shrink too fast - final float widthCap = 25F; + final float widthCap = minX; if (r.width() < widthCap) { r.inset(-(widthCap - r.width()) / 2F, 0F); } From 4876e93ed852002406a2082b80115c77c1c327ad Mon Sep 17 00:00:00 2001 From: HaniHashemi Date: Sat, 28 Mar 2015 11:02:07 +0430 Subject: [PATCH 2/7] set default crop size to minimum width --- .../java/com/soundcloud/android/crop/CropImageActivity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java index 75577771..8911d236 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java +++ b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java @@ -226,6 +226,9 @@ private void makeDefault() { @SuppressWarnings("SuspiciousNameCombination") int cropHeight = cropWidth; + if (cropWidth < minX) + cropWidth = cropHeight = minX; + if (aspectX != 0 && aspectY != 0) { if (aspectX > aspectY) { cropHeight = cropWidth * aspectY / aspectX; From 66e2bc5064b39b5c329a7b40f28f7c58eb85ce6a Mon Sep 17 00:00:00 2001 From: HaniHashemi Date: Sat, 28 Mar 2015 11:18:35 +0430 Subject: [PATCH 3/7] block image if image is small than min width --- .../com/soundcloud/android/crop/example/MainActivity.java | 2 +- .../java/com/soundcloud/android/crop/CropImageActivity.java | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java b/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java index a116a43a..1c42f2e6 100644 --- a/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java +++ b/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java @@ -53,7 +53,7 @@ private void beginCrop(Uri source) { Uri outputUri = Uri.fromFile(new File(getCacheDir(), "cropped")); Crop crop = new Crop(source); crop.output(outputUri); - crop.widthMinSize(50); + crop.widthMinSize(1000); crop.asSquare().start(this); } diff --git a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java index 8911d236..df4b3555 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java +++ b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java @@ -33,6 +33,7 @@ import android.provider.MediaStore; import android.view.View; import android.view.Window; +import android.widget.Toast; import java.io.IOException; import java.io.InputStream; @@ -81,6 +82,11 @@ public void onCreate(Bundle icicle) { finish(); return; } + if (rotateBitmap.getWidth() < minX) { + Toast.makeText(this, "Image is too small", Toast.LENGTH_SHORT).show(); + finish(); + return; + } startCrop(); } From 85cd8db74a3c4d2198ba39d5795e4ab2844e6c4d Mon Sep 17 00:00:00 2001 From: HaniHashemi Date: Sat, 28 Mar 2015 11:21:31 +0430 Subject: [PATCH 4/7] add string to resource file --- .../java/com/soundcloud/android/crop/CropImageActivity.java | 2 +- lib/src/main/res/values/strings.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java index df4b3555..612c67a6 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java +++ b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java @@ -83,7 +83,7 @@ public void onCreate(Bundle icicle) { return; } if (rotateBitmap.getWidth() < minX) { - Toast.makeText(this, "Image is too small", Toast.LENGTH_SHORT).show(); + Toast.makeText(this, R.string.crop__image_is_small, Toast.LENGTH_SHORT).show(); finish(); return; } diff --git a/lib/src/main/res/values/strings.xml b/lib/src/main/res/values/strings.xml index cc310bbe..a9e2f448 100644 --- a/lib/src/main/res/values/strings.xml +++ b/lib/src/main/res/values/strings.xml @@ -3,6 +3,7 @@ Saving picture… Please wait… No image sources available + Image is too small DONE CANCEL From 2caeb1b5f2a5609af77d13a3a93e103bdd321fb0 Mon Sep 17 00:00:00 2001 From: HaniHashemi Date: Sat, 28 Mar 2015 11:42:02 +0430 Subject: [PATCH 5/7] set result response when image is too small --- .../com/soundcloud/android/crop/example/MainActivity.java | 4 ++++ example/src/main/res/values/strings.xml | 1 + .../java/com/soundcloud/android/crop/CropImageActivity.java | 3 ++- lib/src/main/res/values/strings.xml | 1 - 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java b/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java index 1c42f2e6..4bd436a6 100644 --- a/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java +++ b/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java @@ -10,6 +10,7 @@ import android.widget.Toast; import com.soundcloud.android.crop.Crop; +import com.soundcloud.android.crop.CropImageActivity; import java.io.File; @@ -62,6 +63,9 @@ private void handleCrop(int resultCode, Intent result) { resultView.setImageURI(Crop.getOutput(result)); } else if (resultCode == Crop.RESULT_ERROR) { Toast.makeText(this, Crop.getError(result).getMessage(), Toast.LENGTH_SHORT).show(); + }else if (resultCode == CropImageActivity.RESULT_IMAGE_TOO_SMALL){ + Toast.makeText(this, R.string.image_is_small, Toast.LENGTH_SHORT).show(); + Crop.pickImage(this); } } diff --git a/example/src/main/res/values/strings.xml b/example/src/main/res/values/strings.xml index 7a257821..8779cb6c 100644 --- a/example/src/main/res/values/strings.xml +++ b/example/src/main/res/values/strings.xml @@ -2,5 +2,6 @@ Crop Demo Pick + Image is too small diff --git a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java index 612c67a6..7de1741f 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java +++ b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java @@ -48,6 +48,7 @@ public class CropImageActivity extends MonitoredActivity { private static final boolean IN_MEMORY_CROP = Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD_MR1; private static final int SIZE_DEFAULT = 2048; private static final int SIZE_LIMIT = 4096; + public static final int RESULT_IMAGE_TOO_SMALL = 1587; private final Handler handler = new Handler(); @@ -83,7 +84,7 @@ public void onCreate(Bundle icicle) { return; } if (rotateBitmap.getWidth() < minX) { - Toast.makeText(this, R.string.crop__image_is_small, Toast.LENGTH_SHORT).show(); + setResult(RESULT_IMAGE_TOO_SMALL); finish(); return; } diff --git a/lib/src/main/res/values/strings.xml b/lib/src/main/res/values/strings.xml index a9e2f448..cc310bbe 100644 --- a/lib/src/main/res/values/strings.xml +++ b/lib/src/main/res/values/strings.xml @@ -3,7 +3,6 @@ Saving picture… Please wait… No image sources available - Image is too small DONE CANCEL From 8dbcb1dc1eed7469bc9827124130f257a0b51413 Mon Sep 17 00:00:00 2001 From: HaniHashemi Date: Sat, 28 Mar 2015 13:45:55 +0430 Subject: [PATCH 6/7] fix bug in minimum size --- .../android/crop/example/MainActivity.java | 2 +- .../android/crop/CropImageActivity.java | 21 +++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java b/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java index 4bd436a6..2840d79a 100644 --- a/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java +++ b/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java @@ -54,7 +54,7 @@ private void beginCrop(Uri source) { Uri outputUri = Uri.fromFile(new File(getCacheDir(), "cropped")); Crop crop = new Crop(source); crop.output(outputUri); - crop.widthMinSize(1000); + crop.widthMinSize(640); crop.asSquare().start(this); } diff --git a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java index 7de1741f..688c304a 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java +++ b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java @@ -33,7 +33,6 @@ import android.provider.MediaStore; import android.view.View; import android.view.Window; -import android.widget.Toast; import java.io.IOException; import java.io.InputStream; @@ -233,9 +232,6 @@ private void makeDefault() { @SuppressWarnings("SuspiciousNameCombination") int cropHeight = cropWidth; - if (cropWidth < minX) - cropWidth = cropHeight = minX; - if (aspectX != 0 && aspectY != 0) { if (aspectX > aspectY) { cropHeight = cropWidth * aspectY / aspectX; @@ -244,6 +240,23 @@ private void makeDefault() { } } + if (cropWidth < minX || cropHeight < minX) { + cropWidth = cropHeight = minX; + + if (aspectX != 0 && aspectY != 0) { + if (aspectX > aspectY) { + cropHeight = cropWidth * aspectY / aspectX; + } else { + cropWidth = cropHeight * aspectX / aspectY; + } + } + + if (cropHeight > height || cropWidth > width) { + setResult(RESULT_IMAGE_TOO_SMALL); + finish(); + } + } + int x = (width - cropWidth) / 2; int y = (height - cropHeight) / 2; From c160f11e715332f682200557aaa47a96231b1467 Mon Sep 17 00:00:00 2001 From: HaniHashemi Date: Mon, 6 Apr 2015 17:45:31 +0430 Subject: [PATCH 7/7] if image is too small it just respond a error --- .../android/crop/example/MainActivity.java | 3 --- example/src/main/res/values/strings.xml | 1 - .../soundcloud/android/crop/CropImageActivity.java | 13 ++++++++++--- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java b/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java index 2840d79a..73e56cbb 100644 --- a/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java +++ b/example/src/main/java/com/soundcloud/android/crop/example/MainActivity.java @@ -63,9 +63,6 @@ private void handleCrop(int resultCode, Intent result) { resultView.setImageURI(Crop.getOutput(result)); } else if (resultCode == Crop.RESULT_ERROR) { Toast.makeText(this, Crop.getError(result).getMessage(), Toast.LENGTH_SHORT).show(); - }else if (resultCode == CropImageActivity.RESULT_IMAGE_TOO_SMALL){ - Toast.makeText(this, R.string.image_is_small, Toast.LENGTH_SHORT).show(); - Crop.pickImage(this); } } diff --git a/example/src/main/res/values/strings.xml b/example/src/main/res/values/strings.xml index 8779cb6c..7a257821 100644 --- a/example/src/main/res/values/strings.xml +++ b/example/src/main/res/values/strings.xml @@ -2,6 +2,5 @@ Crop Demo Pick - Image is too small diff --git a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java index 688c304a..ff19815e 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java +++ b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java @@ -47,7 +47,6 @@ public class CropImageActivity extends MonitoredActivity { private static final boolean IN_MEMORY_CROP = Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD_MR1; private static final int SIZE_DEFAULT = 2048; private static final int SIZE_LIMIT = 4096; - public static final int RESULT_IMAGE_TOO_SMALL = 1587; private final Handler handler = new Handler(); @@ -83,7 +82,11 @@ public void onCreate(Bundle icicle) { return; } if (rotateBitmap.getWidth() < minX) { - setResult(RESULT_IMAGE_TOO_SMALL); + try { + throw new Exception("Image size is small than your minimum size."); + } catch (Exception e) { + setResultException(e); + } finish(); return; } @@ -252,7 +255,11 @@ private void makeDefault() { } if (cropHeight > height || cropWidth > width) { - setResult(RESULT_IMAGE_TOO_SMALL); + try { + throw new Exception("Image size is small than your minimum size."); + } catch (Exception e) { + setResultException(e); + } finish(); } }