From 43c64450762f4a4c4266071feb4a2e7f4fba68e4 Mon Sep 17 00:00:00 2001 From: Grant Date: Fri, 15 Apr 2016 12:20:23 +0200 Subject: [PATCH 01/11] Rotation issue Fix Fixes issue where the savedUri rotation was incorrect --- build.gradle | 2 +- example/build.gradle | 4 +-- gradle/wrapper/gradle-wrapper.properties | 2 +- lib/build.gradle | 12 ++++--- .../android/crop/CropImageActivity.java | 33 ++++++++++++------- 5 files changed, 32 insertions(+), 21 deletions(-) diff --git a/build.gradle b/build.gradle index a34833b3..bfaa192e 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:1.2.3' + classpath 'com.android.tools.build:gradle:2.0.0' } } diff --git a/example/build.gradle b/example/build.gradle index 33f163f5..cde486e6 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -4,11 +4,11 @@ archivesBaseName = 'android-crop-example' android { compileSdkVersion 23 - buildToolsVersion '23.0.1' + buildToolsVersion '23.0.3' defaultConfig { minSdkVersion 10 - targetSdkVersion 22 + targetSdkVersion 23 versionCode Integer.parseInt(project.VERSION_CODE) versionName project.VERSION } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index eb84f97f..2585216f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip diff --git a/lib/build.gradle b/lib/build.gradle index 20e1a767..3c6c0354 100644 --- a/lib/build.gradle +++ b/lib/build.gradle @@ -7,11 +7,13 @@ archivesBaseName = 'android-crop' android { compileSdkVersion 23 - buildToolsVersion '23.0.1' + buildToolsVersion '23.0.3' defaultConfig { minSdkVersion 10 - targetSdkVersion 22 + targetSdkVersion 23 + versionCode 1 + versionName "1.0.2" testApplicationId 'com.soundcloud.android.crop.test' testInstrumentationRunner 'android.test.InstrumentationTestRunner' @@ -19,10 +21,10 @@ android { } dependencies { - compile 'com.android.support:support-annotations:23.0.1' - compile 'com.android.support:support-v4:23.0.1' + compile 'com.android.support:support-annotations:23.1.1' + compile 'com.android.support:support-v4:23.1.1' androidTestCompile 'com.squareup:fest-android:1.0.7' - androidTestCompile 'com.android.support:support-v4:23.0.1' + androidTestCompile 'com.android.support:support-v4:23.1.1' androidTestCompile 'org.mockito:mockito-core:1.9.5' androidTestCompile 'com.google.dexmaker:dexmaker:1.0' androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.0' 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 97a0466a..fc164ccf 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java +++ b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java @@ -24,6 +24,7 @@ import android.graphics.Matrix; import android.graphics.Rect; import android.graphics.RectF; +import android.media.ExifInterface; import android.net.Uri; import android.opengl.GLES10; import android.os.Build; @@ -94,23 +95,29 @@ private void setupViews() { imageView = (CropImageView) findViewById(R.id.crop_image); imageView.context = this; - imageView.setRecycler(new ImageViewTouchBase.Recycler() { + imageView.setRecycler(new ImageViewTouchBase.Recycler() + { @Override - public void recycle(Bitmap b) { + public void recycle(Bitmap b) + { b.recycle(); System.gc(); } }); - findViewById(R.id.btn_cancel).setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { + findViewById(R.id.btn_cancel).setOnClickListener(new View.OnClickListener() + { + public void onClick(View v) + { setResult(RESULT_CANCELED); finish(); } }); - findViewById(R.id.btn_done).setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { + findViewById(R.id.btn_done).setOnClickListener(new View.OnClickListener() + { + public void onClick(View v) + { onSaveClicked(); } }); @@ -288,6 +295,13 @@ private void onSaveClicked() { try { croppedImage = decodeRegionCrop(r, outWidth, outHeight); + + if (exifRotation != 0) + { + Matrix m = new Matrix(); + m.postRotate(exifRotation); + croppedImage = Bitmap.createBitmap(croppedImage, 0, 0, croppedImage.getWidth(), croppedImage.getHeight(), m, true); + } } catch (IllegalArgumentException e) { setResultException(e); finish(); @@ -295,7 +309,7 @@ private void onSaveClicked() { } if (croppedImage != null) { - imageView.setImageRotateBitmapResetBase(new RotateBitmap(croppedImage, exifRotation), true); +// imageView.setImageRotateBitmapResetBase(new RotateBitmap(croppedImage, exifRotation), true); imageView.center(); imageView.highlightViews.clear(); } @@ -390,11 +404,6 @@ private void saveOutput(Bitmap croppedImage) { CropUtil.closeSilently(outputStream); } - CropUtil.copyExifRotation( - CropUtil.getFromMediaUri(this, getContentResolver(), sourceUri), - CropUtil.getFromMediaUri(this, getContentResolver(), saveUri) - ); - setResultUri(saveUri); } From 85d3b0c78a82509174d2ee919fe3ef7ab0bc9252 Mon Sep 17 00:00:00 2001 From: Grant Date: Wed, 20 Apr 2016 13:35:28 +0200 Subject: [PATCH 02/11] travis-ci build issue Changes buildToolsVersion to 23.0.2 --- example/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/example/build.gradle b/example/build.gradle index cde486e6..0d646452 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -4,7 +4,7 @@ archivesBaseName = 'android-crop-example' android { compileSdkVersion 23 - buildToolsVersion '23.0.3' + buildToolsVersion '23.0.2' defaultConfig { minSdkVersion 10 From ac472d895eef5e4125de92d04120c5d2d2540ee7 Mon Sep 17 00:00:00 2001 From: Grant Date: Wed, 20 Apr 2016 13:39:36 +0200 Subject: [PATCH 03/11] travis-ci fix 2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Changes build tools version again, to 23.0.1 Can’t believe that it hasn’t been updated --- example/build.gradle | 2 +- lib/build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/example/build.gradle b/example/build.gradle index 0d646452..590cef15 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -4,7 +4,7 @@ archivesBaseName = 'android-crop-example' android { compileSdkVersion 23 - buildToolsVersion '23.0.2' + buildToolsVersion '23.0.1' defaultConfig { minSdkVersion 10 diff --git a/lib/build.gradle b/lib/build.gradle index 3c6c0354..d07013a2 100644 --- a/lib/build.gradle +++ b/lib/build.gradle @@ -7,7 +7,7 @@ archivesBaseName = 'android-crop' android { compileSdkVersion 23 - buildToolsVersion '23.0.3' + buildToolsVersion '23.0.1' defaultConfig { minSdkVersion 10 From 7b9082131be69078572a4a1030870a504b90edb3 Mon Sep 17 00:00:00 2001 From: Grant Date: Thu, 28 Apr 2016 21:13:36 +0200 Subject: [PATCH 04/11] supply min size Added the withMinSize function to allow for min size will also throw exception/error if the selected image is less then the given amount --- .../android/crop/example/MainActivity.java | 2 +- .../com/soundcloud/android/crop/Crop.java | 14 +++++++++++ .../android/crop/CropImageActivity.java | 22 ++++++++++++++++- .../android/crop/HighlightView.java | 24 +++++++++++++++---- 4 files changed, 56 insertions(+), 6 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 079775aa..c8bd8543 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 @@ -51,7 +51,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent result) private void beginCrop(Uri source) { Uri destination = Uri.fromFile(new File(getCacheDir(), "cropped")); - Crop.of(source, destination).asSquare().start(this); + Crop.of(source, destination).withMinSize(512, 512).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 564f5b52..fbd12c23 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/Crop.java +++ b/lib/src/main/java/com/soundcloud/android/crop/Crop.java @@ -25,6 +25,8 @@ interface Extra { String ASPECT_Y = "aspect_y"; String MAX_X = "max_x"; String MAX_Y = "max_y"; + String MIN_X = "mix_x"; + String MIN_Y = "mix_y"; String ERROR = "error"; } @@ -79,6 +81,18 @@ public Crop withMaxSize(int width, int height) { return this; } + /** + * Set minimum crop size + * + * @param width Min width + * @param height Min height + */ + public Crop withMinSize(int width, int height) { + cropIntent.putExtra(Extra.MIN_X, width); + cropIntent.putExtra(Extra.MIN_Y, height); + return this; + } + /** * Send the crop Intent from an Activity * 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 fc164ccf..f00ed0d0 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java +++ b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java @@ -35,6 +35,7 @@ import android.view.Window; import android.view.WindowManager; +import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -54,6 +55,8 @@ public class CropImageActivity extends MonitoredActivity { private int aspectY; // Output image + private int minX; + private int minY; private int maxX; private int maxY; private int exifRotation; @@ -133,6 +136,9 @@ private void loadInput() { maxX = extras.getInt(Crop.Extra.MAX_X); maxY = extras.getInt(Crop.Extra.MAX_Y); saveUri = extras.getParcelable(MediaStore.EXTRA_OUTPUT); + + minX = extras.getInt(Crop.Extra.MIN_X, 0); + minY = extras.getInt(Crop.Extra.MIN_Y, 0); } sourceUri = intent.getData(); @@ -146,6 +152,20 @@ private void loadInput() { BitmapFactory.Options option = new BitmapFactory.Options(); option.inSampleSize = sampleSize; rotateBitmap = new RotateBitmap(BitmapFactory.decodeStream(is, null, option), exifRotation); + + option.inJustDecodeBounds = true; + BitmapFactory.decodeFile(new File(sourceUri.getPath()).getAbsolutePath(), option); + int imageHeight = option.outHeight; + int imageWidth = option.outWidth; + + if (minX > imageHeight || minY > imageWidth) + { + Intent intentError = new Intent(); + intentError.putExtra(Crop.Extra.ERROR, new Throwable("Image is less then minimum size specified.\nRequired size:"+minX+"x"+minY)); + setResult(Crop.RESULT_ERROR, intentError); + finish(); + } + } catch (IOException e) { Log.e("Error reading image: " + e.getMessage(), e); setResultException(e); @@ -251,7 +271,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, minY); 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 27cc10da..92e85b09 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/HighlightView.java +++ b/lib/src/main/java/com/soundcloud/android/crop/HighlightView.java @@ -77,6 +77,9 @@ enum HandleMode { Changing, Always, Never } private float outlineWidth; private boolean isFocused; + private float minWidth = 0f; + private float minHeight = 0f; + public HighlightView(View context) { viewContext = context; initStyles(context.getContext()); @@ -97,6 +100,13 @@ private void initStyles(Context context) { } } + public void setup(Matrix m, Rect imageRect, RectF cropRect, boolean maintainAspectRatio, int minWidth, int minHeight) + { + this.minWidth = minWidth; + this.minHeight = minHeight; + setup(m, imageRect, cropRect, maintainAspectRatio); + } + public void setup(Matrix m, Rect imageRect, RectF cropRect, boolean maintainAspectRatio) { matrix = new Matrix(m); @@ -209,10 +219,8 @@ private void drawThirds(Canvas canvas) { drawRect.left + xThird, drawRect.bottom, outlinePaint); canvas.drawLine(drawRect.left + xThird * 2, drawRect.top, drawRect.left + xThird * 2, drawRect.bottom, outlinePaint); - canvas.drawLine(drawRect.left, drawRect.top + yThird, - drawRect.right, drawRect.top + yThird, outlinePaint); - canvas.drawLine(drawRect.left, drawRect.top + yThird * 2, - drawRect.right, drawRect.top + yThird * 2, outlinePaint); + canvas.drawLine(drawRect.left, drawRect.top + yThird, drawRect.right, drawRect.top + yThird, outlinePaint); + canvas.drawLine(drawRect.left, drawRect.top + yThird * 2, drawRect.right, drawRect.top + yThird * 2, outlinePaint); } private void drawCircle(Canvas canvas) { @@ -348,6 +356,14 @@ void growBy(float dx, float dy) { r.inset(0F, -(heightCap - r.height()) / 2F); } + // Limits the size of the image to the given minimum amount + if (minWidth > 0f || minHeight > 0f) + { + float widthDiff = (Math.abs((r.right-r.left)) < minWidth) ? minWidth - Math.abs((r.right-r.left)) : 0f; + float heightDiff = (Math.abs((r.bottom-r.top)) < minHeight) ? minHeight - Math.abs((r.bottom-r.top)) : 0f; + r.inset((widthDiff/2)*-1, (heightDiff / 2) * -1); + } + // Put the cropping rectangle inside the image rectangle if (r.left < imageRect.left) { r.offset(imageRect.left - r.left, 0F); From f27194619756f76e8fb62201e18bf99845af7e27 Mon Sep 17 00:00:00 2001 From: Grant Date: Thu, 28 Apr 2016 21:51:09 +0200 Subject: [PATCH 05/11] Removed min in example --- .../java/com/soundcloud/android/crop/example/MainActivity.java | 2 +- 1 file changed, 1 insertion(+), 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 c8bd8543..079775aa 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 @@ -51,7 +51,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent result) private void beginCrop(Uri source) { Uri destination = Uri.fromFile(new File(getCacheDir(), "cropped")); - Crop.of(source, destination).withMinSize(512, 512).asSquare().start(this); + Crop.of(source, destination).asSquare().start(this); } private void handleCrop(int resultCode, Intent result) { From 6c53287ff536b98ef291f23da98b89a980f4de77 Mon Sep 17 00:00:00 2001 From: Grant Date: Fri, 27 May 2016 21:30:02 +0200 Subject: [PATCH 06/11] Merge remote-tracking branch 'jdamcd/master' # Conflicts: # build.gradle # lib/src/main/java/com/soundcloud/android/crop/Crop.java --- build.gradle | 2 +- .../java/com/soundcloud/android/crop/Crop.java | 15 ++++++++++++--- .../android/crop/CropImageActivity.java | 6 +++++- lib/src/main/res/values-fa/strings.xml | 10 ++++++++++ 4 files changed, 28 insertions(+), 5 deletions(-) create mode 100644 lib/src/main/res/values-fa/strings.xml diff --git a/build.gradle b/build.gradle index bfaa192e..9eb04bf7 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:2.0.0' + classpath 'com.android.tools.build:gradle:2.1.0' } } 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 fbd12c23..3c6e2a6a 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/Crop.java +++ b/lib/src/main/java/com/soundcloud/android/crop/Crop.java @@ -25,8 +25,9 @@ interface Extra { String ASPECT_Y = "aspect_y"; String MAX_X = "max_x"; String MAX_Y = "max_y"; - String MIN_X = "mix_x"; - String MIN_Y = "mix_y"; + String MIN_X = "min_x"; + String MIN_Y = "min_y"; + String AS_PNG = "as_png"; String ERROR = "error"; } @@ -92,6 +93,14 @@ public Crop withMinSize(int width, int height) { cropIntent.putExtra(Extra.MIN_Y, height); return this; } + /** + * Set whether to save the result as a PNG or not. Helpful to preserve alpha. + * @param asPng whether to save the result as a PNG or not + */ + public Crop asPng(boolean asPng) { + cropIntent.putExtra(Extra.AS_PNG, asPng); + return this; + } /** * Send the crop Intent from an Activity @@ -264,7 +273,7 @@ private static Intent getImagePicker() { } private static void showImagePickerError(Context context) { - Toast.makeText(context, R.string.crop__pick_error, Toast.LENGTH_SHORT).show(); + Toast.makeText(context.getApplicationContext(), R.string.crop__pick_error, Toast.LENGTH_SHORT).show(); } } 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 f00ed0d0..907252ac 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java +++ b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java @@ -60,6 +60,7 @@ public class CropImageActivity extends MonitoredActivity { private int maxX; private int maxY; private int exifRotation; + private boolean saveAsPng; private Uri sourceUri; private Uri saveUri; @@ -135,6 +136,7 @@ private void loadInput() { aspectY = extras.getInt(Crop.Extra.ASPECT_Y); maxX = extras.getInt(Crop.Extra.MAX_X); maxY = extras.getInt(Crop.Extra.MAX_Y); + saveAsPng = extras.getBoolean(Crop.Extra.AS_PNG, false); saveUri = extras.getParcelable(MediaStore.EXTRA_OUTPUT); minX = extras.getInt(Crop.Extra.MIN_X, 0); @@ -415,7 +417,9 @@ private void saveOutput(Bitmap croppedImage) { try { outputStream = getContentResolver().openOutputStream(saveUri); if (outputStream != null) { - croppedImage.compress(Bitmap.CompressFormat.JPEG, 90, outputStream); + croppedImage.compress(saveAsPng ? Bitmap.CompressFormat.PNG : Bitmap.CompressFormat.JPEG, + 90, // note: quality is ignored when using PNG + outputStream); } } catch (IOException e) { setResultException(e); diff --git a/lib/src/main/res/values-fa/strings.xml b/lib/src/main/res/values-fa/strings.xml new file mode 100644 index 00000000..a4f3d6cf --- /dev/null +++ b/lib/src/main/res/values-fa/strings.xml @@ -0,0 +1,10 @@ + + + در حال ذخیره سازی + لطفاً صبر کنید ... + تصویری در دسترس نیست + + تأیید + انصراف + + From 48f757ec06475f2bbc3e2548914f797c1a7bd9a4 Mon Sep 17 00:00:00 2001 From: Grant Date: Fri, 27 May 2016 21:38:56 +0200 Subject: [PATCH 07/11] clean comments --- lib/src/main/java/com/soundcloud/android/crop/Crop.java | 3 --- 1 file changed, 3 deletions(-) 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 4149b0c0..3c6e2a6a 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/Crop.java +++ b/lib/src/main/java/com/soundcloud/android/crop/Crop.java @@ -83,7 +83,6 @@ public Crop withMaxSize(int width, int height) { } /** -<<<<<<< HEAD * Set minimum crop size * * @param width Min width @@ -95,8 +94,6 @@ public Crop withMinSize(int width, int height) { return this; } /** -======= ->>>>>>> jdamcd/master * Set whether to save the result as a PNG or not. Helpful to preserve alpha. * @param asPng whether to save the result as a PNG or not */ From 53d952db703c29f5064778857ca39480fec0b0c9 Mon Sep 17 00:00:00 2001 From: Grant Date: Fri, 27 May 2016 22:11:13 +0200 Subject: [PATCH 08/11] Fixed lint errors 5 lint errors removed --- lib/build.gradle | 8 ++++---- lib/src/main/res/values-fa/strings.xml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/build.gradle b/lib/build.gradle index d07013a2..82047a90 100644 --- a/lib/build.gradle +++ b/lib/build.gradle @@ -7,7 +7,7 @@ archivesBaseName = 'android-crop' android { compileSdkVersion 23 - buildToolsVersion '23.0.1' + buildToolsVersion '23.0.3' defaultConfig { minSdkVersion 10 @@ -21,10 +21,10 @@ android { } dependencies { - compile 'com.android.support:support-annotations:23.1.1' - compile 'com.android.support:support-v4:23.1.1' + compile 'com.android.support:support-annotations:23.4.0' + compile 'com.android.support:support-v4:23.4.0' androidTestCompile 'com.squareup:fest-android:1.0.7' - androidTestCompile 'com.android.support:support-v4:23.1.1' + androidTestCompile 'com.android.support:support-v4:23.4.0' androidTestCompile 'org.mockito:mockito-core:1.9.5' androidTestCompile 'com.google.dexmaker:dexmaker:1.0' androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.0' diff --git a/lib/src/main/res/values-fa/strings.xml b/lib/src/main/res/values-fa/strings.xml index a4f3d6cf..962f2f81 100644 --- a/lib/src/main/res/values-fa/strings.xml +++ b/lib/src/main/res/values-fa/strings.xml @@ -1,7 +1,7 @@ در حال ذخیره سازی - لطفاً صبر کنید ... + لطفاً صبر کنید … تصویری در دسترس نیست تأیید From 694d238df349f53198c453c9047109a983de3447 Mon Sep 17 00:00:00 2001 From: Grant Date: Sun, 29 May 2016 19:58:51 +0200 Subject: [PATCH 09/11] Travis settings --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8a555561..b1406f5c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ sudo: false android: components: - - build-tools-23.0.1 + - build-tools-23.0.3 - android-23 - extra-android-support - extra-android-m2repository From 07bcd1d467dc091dca79710125353ba96f5466e1 Mon Sep 17 00:00:00 2001 From: Grant Date: Sun, 29 May 2016 21:25:00 +0200 Subject: [PATCH 10/11] Lint errors in base project Replaces almost all icons. Added "disable 'Registered', 'IconDensities'" for lint ignore Updated travis CI --- example/build.gradle | 2 +- lib/build.gradle | 5 ++++- lib/src/main/AndroidManifest.xml | 2 +- lib/src/main/res/drawable-hdpi/crop__tile.png | Bin 0 -> 5117 bytes .../res/drawable-mdpi/crop__divider.9.png | Bin 76 -> 0 bytes lib/src/main/res/drawable-mdpi/crop__tile.png | Bin 0 -> 3829 bytes .../crop__selectable_background.xml | 3 +-- .../crop__selectable_background.xml | 20 ++++++++++++++++++ .../res/drawable-xhdpi/crop__divider.9.png | Bin 83 -> 80 bytes .../main/res/drawable-xhdpi/crop__tile.png | Bin 142 -> 6917 bytes .../res/drawable-xxhdpi/crop__divider.9.png | Bin 0 -> 80 bytes .../main/res/drawable-xxhdpi/crop__tile.png | Bin 0 -> 12053 bytes .../res/drawable-xxxhdpi/crop__divider.9.png | Bin 0 -> 81 bytes .../main/res/drawable-xxxhdpi/crop__tile.png | Bin 0 -> 19237 bytes 14 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 lib/src/main/res/drawable-hdpi/crop__tile.png delete mode 100644 lib/src/main/res/drawable-mdpi/crop__divider.9.png create mode 100644 lib/src/main/res/drawable-mdpi/crop__tile.png rename lib/src/main/res/{drawable => drawable-v10}/crop__selectable_background.xml (86%) create mode 100644 lib/src/main/res/drawable-v11/crop__selectable_background.xml create mode 100644 lib/src/main/res/drawable-xxhdpi/crop__divider.9.png create mode 100644 lib/src/main/res/drawable-xxhdpi/crop__tile.png create mode 100644 lib/src/main/res/drawable-xxxhdpi/crop__divider.9.png create mode 100644 lib/src/main/res/drawable-xxxhdpi/crop__tile.png diff --git a/example/build.gradle b/example/build.gradle index 590cef15..cde486e6 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -4,7 +4,7 @@ archivesBaseName = 'android-crop-example' android { compileSdkVersion 23 - buildToolsVersion '23.0.1' + buildToolsVersion '23.0.3' defaultConfig { minSdkVersion 10 diff --git a/lib/build.gradle b/lib/build.gradle index 82047a90..eeaab309 100644 --- a/lib/build.gradle +++ b/lib/build.gradle @@ -13,11 +13,14 @@ android { minSdkVersion 10 targetSdkVersion 23 versionCode 1 - versionName "1.0.2" + versionName "1.0.1" testApplicationId 'com.soundcloud.android.crop.test' testInstrumentationRunner 'android.test.InstrumentationTestRunner' } + lintOptions { + disable 'Registered', 'IconDensities' + } } dependencies { diff --git a/lib/src/main/AndroidManifest.xml b/lib/src/main/AndroidManifest.xml index 0cb62bb6..760b435c 100644 --- a/lib/src/main/AndroidManifest.xml +++ b/lib/src/main/AndroidManifest.xml @@ -1 +1 @@ - + \ No newline at end of file diff --git a/lib/src/main/res/drawable-hdpi/crop__tile.png b/lib/src/main/res/drawable-hdpi/crop__tile.png new file mode 100644 index 0000000000000000000000000000000000000000..2f2569f5b01bcf87f14aa0b659d2e5fdf642cb97 GIT binary patch literal 5117 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 literal 0 HcmV?d00001 diff --git a/lib/src/main/res/drawable-mdpi/crop__divider.9.png b/lib/src/main/res/drawable-mdpi/crop__divider.9.png deleted file mode 100644 index 0279e17a123f8cbb3c7e3a9ce5c5af8e693b6977..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76 zcmeAS@N?(olHy`uVBq!ia0vp^%plCc1|-8Yw(bW~!k#XUAsp9}6B-)+^LX%RmN2q0 Ycy4A9FVZ~13zTN?boFyt=akR{01+Y(GXMYp diff --git a/lib/src/main/res/drawable-mdpi/crop__tile.png b/lib/src/main/res/drawable-mdpi/crop__tile.png new file mode 100644 index 0000000000000000000000000000000000000000..77a325cde9966cab8e001b5885f72a2fbe174376 GIT binary patch literal 3829 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 literal 0 HcmV?d00001 diff --git a/lib/src/main/res/drawable/crop__selectable_background.xml b/lib/src/main/res/drawable-v10/crop__selectable_background.xml similarity index 86% rename from lib/src/main/res/drawable/crop__selectable_background.xml rename to lib/src/main/res/drawable-v10/crop__selectable_background.xml index 83c4a7de..b92a29a2 100644 --- a/lib/src/main/res/drawable/crop__selectable_background.xml +++ b/lib/src/main/res/drawable-v10/crop__selectable_background.xml @@ -1,7 +1,6 @@ - + diff --git a/lib/src/main/res/drawable-v11/crop__selectable_background.xml b/lib/src/main/res/drawable-v11/crop__selectable_background.xml new file mode 100644 index 00000000..9469b59a --- /dev/null +++ b/lib/src/main/res/drawable-v11/crop__selectable_background.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/src/main/res/drawable-xhdpi/crop__divider.9.png b/lib/src/main/res/drawable-xhdpi/crop__divider.9.png index 65061c0f45e63fe0fea0bfad9c71ee52c07ef38e..809f130792a2c234a00ceaa344bdf622bd0af214 100644 GIT binary patch delta 49 zcmWFzn4qE~?&;zfQgJIep`qb_0MBy|$B*@Em^7jo1e!S#k1bmModF0uUHx3vIVCg! E0M3LGF#rGn delta 52 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 I=akR{05%XO6#xJL diff --git a/lib/src/main/res/drawable-xxhdpi/crop__divider.9.png b/lib/src/main/res/drawable-xxhdpi/crop__divider.9.png new file mode 100644 index 0000000000000000000000000000000000000000..ea71af02b167d8683a7d486c159ec39688de40da GIT binary patch literal 80 zcmeAS@N?(olHy`uVBq!ia0vp^Y#_`5A|IT2?*XL5JzX3_DsCkwG&KCrkkISk`xhL^ cwE8K-6f6FZ&!X?X1}b6jboFyt=akR{0Q#jDaR2}S literal 0 HcmV?d00001 diff --git a/lib/src/main/res/drawable-xxhdpi/crop__tile.png b/lib/src/main/res/drawable-xxhdpi/crop__tile.png new file mode 100644 index 0000000000000000000000000000000000000000..7f757d90961aef9a70e2a11d29ab213cc1575c94 GIT binary patch literal 12053 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 OBVb}+sb7k8y!Ib={peo+ literal 0 HcmV?d00001 diff --git a/lib/src/main/res/drawable-xxxhdpi/crop__divider.9.png b/lib/src/main/res/drawable-xxxhdpi/crop__divider.9.png new file mode 100644 index 0000000000000000000000000000000000000000..d505ff9063f91ab30812fcc3ad22a068dd180b41 GIT binary patch literal 81 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFq5}q!OAr-fh6B-)+TNuO$iT|)q d5qa=cjlr-%{N5Un$*2R}WA$Q_`mD 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 Date: Thu, 7 Jun 2018 15:22:52 +0200 Subject: [PATCH 11/11] updated gradle versions --- build.gradle | 6 ++- example/build.gradle | 9 ++-- .../android/crop/example/MainActivity.java | 7 +-- gradle/wrapper/gradle-wrapper.properties | 2 +- lib/build.gradle | 21 ++++---- .../com/soundcloud/android/crop/Crop.java | 24 +++++++++ .../android/crop/CropImageActivity.java | 52 ++++++++++++------- 7 files changed, 79 insertions(+), 42 deletions(-) diff --git a/build.gradle b/build.gradle index 9eb04bf7..49c948aa 100644 --- a/build.gradle +++ b/build.gradle @@ -1,9 +1,10 @@ buildscript { repositories { - mavenCentral() + google() + jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.0' + classpath 'com.android.tools.build:gradle:3.1.2' } } @@ -13,5 +14,6 @@ allprojects { repositories { mavenCentral() + google() } } diff --git a/example/build.gradle b/example/build.gradle index cde486e6..5b9decd1 100644 --- a/example/build.gradle +++ b/example/build.gradle @@ -3,17 +3,16 @@ apply plugin: 'com.android.application' archivesBaseName = 'android-crop-example' android { - compileSdkVersion 23 - buildToolsVersion '23.0.3' + compileSdkVersion 27 defaultConfig { - minSdkVersion 10 - targetSdkVersion 23 + minSdkVersion 14 + targetSdkVersion 27 versionCode Integer.parseInt(project.VERSION_CODE) versionName project.VERSION } } dependencies { - compile project(':lib') + implementation project(':lib') } 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 079775aa..ef28dacf 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 @@ -1,7 +1,5 @@ package com.soundcloud.android.crop.example; -import com.soundcloud.android.crop.Crop; - import android.app.Activity; import android.content.Intent; import android.net.Uri; @@ -11,6 +9,8 @@ import android.widget.ImageView; import android.widget.Toast; +import com.soundcloud.android.crop.Crop; + import java.io.File; public class MainActivity extends Activity { @@ -51,7 +51,8 @@ protected void onActivityResult(int requestCode, int resultCode, Intent result) private void beginCrop(Uri source) { Uri destination = Uri.fromFile(new File(getCacheDir(), "cropped")); - Crop.of(source, destination).asSquare().start(this); + + Crop.of(source, destination).withMinSize(512, (512 / 16)).start(this); } private void handleCrop(int resultCode, Intent result) { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 7d0eb9b2..84b3274a 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.10-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip diff --git a/lib/build.gradle b/lib/build.gradle index eeaab309..014d9c71 100644 --- a/lib/build.gradle +++ b/lib/build.gradle @@ -6,12 +6,11 @@ apply plugin: 'signing' archivesBaseName = 'android-crop' android { - compileSdkVersion 23 - buildToolsVersion '23.0.3' + compileSdkVersion 27 defaultConfig { - minSdkVersion 10 - targetSdkVersion 23 + minSdkVersion 14 + targetSdkVersion 27 versionCode 1 versionName "1.0.1" @@ -24,12 +23,12 @@ android { } dependencies { - compile 'com.android.support:support-annotations:23.4.0' - compile 'com.android.support:support-v4:23.4.0' - androidTestCompile 'com.squareup:fest-android:1.0.7' - androidTestCompile 'com.android.support:support-v4:23.4.0' - androidTestCompile 'org.mockito:mockito-core:1.9.5' - androidTestCompile 'com.google.dexmaker:dexmaker:1.0' - androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.0' + implementation 'com.android.support:support-annotations:27.1.1' + implementation 'com.android.support:support-v4:27.1.1' + androidTestImplementation 'com.squareup:fest-android:1.0.7' + androidTestImplementation 'com.android.support:support-v4:27.1.1' + androidTestImplementation 'org.mockito:mockito-core:1.9.5' + androidTestImplementation 'com.google.dexmaker:dexmaker:1.0' + androidTestImplementation 'com.google.dexmaker:dexmaker-mockito:1.0' } 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 3c6e2a6a..a4baa881 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/Crop.java +++ b/lib/src/main/java/com/soundcloud/android/crop/Crop.java @@ -23,12 +23,19 @@ public class Crop { interface Extra { String ASPECT_X = "aspect_x"; String ASPECT_Y = "aspect_y"; + + String MIN_ASPECT_X = "min_aspect_x"; + String MIN_ASPECT_Y = "min_aspect_y"; + String MAX_ASPECT_X = "max_aspect_x"; + String MAX_ASPECT_Y = "max_aspect_y"; + String MAX_X = "max_x"; String MAX_Y = "max_y"; String MIN_X = "min_x"; String MIN_Y = "min_y"; String AS_PNG = "as_png"; String ERROR = "error"; + String LAYOUT_ID = "layout_id"; } private Intent cropIntent; @@ -49,6 +56,11 @@ private Crop(Uri source, Uri destination) { cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, destination); } +// public Crop withLayout(int layoutId) { +// cropIntent.putExtra(Extra.LAYOUT_ID, layoutId); +// return this; +// } + /** * Set fixed aspect ratio for crop area * @@ -61,6 +73,16 @@ public Crop withAspect(int x, int y) { return this; } +// public Crop withAspectRange(int minX, int minY, int maxX, int maxY) { +// cropIntent.putExtra(Extra.MIN_ASPECT_X, minX); +// cropIntent.putExtra(Extra.MIN_ASPECT_Y, minY); +// cropIntent.putExtra(Extra.MAX_ASPECT_X, maxX); +// cropIntent.putExtra(Extra.MAX_ASPECT_Y, maxY); +// cropIntent.putExtra(Extra.ASPECT_X, maxX); +// cropIntent.putExtra(Extra.ASPECT_Y, maxY); +// return this; +// } + /** * Crop area with fixed 1:1 aspect ratio */ @@ -93,8 +115,10 @@ public Crop withMinSize(int width, int height) { cropIntent.putExtra(Extra.MIN_Y, height); return this; } + /** * Set whether to save the result as a PNG or not. Helpful to preserve alpha. + * * @param asPng whether to save the result as a PNG or not */ public Crop asPng(boolean asPng) { 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 907252ac..9834fcbf 100644 --- a/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java +++ b/lib/src/main/java/com/soundcloud/android/crop/CropImageActivity.java @@ -24,7 +24,6 @@ import android.graphics.Matrix; import android.graphics.Rect; import android.graphics.RectF; -import android.media.ExifInterface; import android.net.Uri; import android.opengl.GLES10; import android.os.Build; @@ -54,6 +53,11 @@ public class CropImageActivity extends MonitoredActivity { private int aspectX; private int aspectY; + private int minAspectX; + private int minAspectY; + private int maxAspectX; + private int maxAspectY; + // Output image private int minX; private int minY; @@ -95,33 +99,34 @@ private void setupWindowFlags() { } private void setupViews() { - setContentView(R.layout.crop__activity_crop); + Intent intent = getIntent(); + Bundle extras = intent.getExtras(); + + int layoutId = R.layout.crop__activity_crop; + if (extras != null) { + layoutId = extras.getInt(Crop.Extra.LAYOUT_ID, R.layout.crop__activity_crop); + } + setContentView(layoutId); imageView = (CropImageView) findViewById(R.id.crop_image); imageView.context = this; - imageView.setRecycler(new ImageViewTouchBase.Recycler() - { + imageView.setRecycler(new ImageViewTouchBase.Recycler() { @Override - public void recycle(Bitmap b) - { + public void recycle(Bitmap b) { b.recycle(); System.gc(); } }); - findViewById(R.id.btn_cancel).setOnClickListener(new View.OnClickListener() - { - public void onClick(View v) - { + findViewById(R.id.btn_cancel).setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { setResult(RESULT_CANCELED); finish(); } }); - findViewById(R.id.btn_done).setOnClickListener(new View.OnClickListener() - { - public void onClick(View v) - { + findViewById(R.id.btn_done).setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { onSaveClicked(); } }); @@ -134,6 +139,12 @@ private void loadInput() { if (extras != null) { aspectX = extras.getInt(Crop.Extra.ASPECT_X); aspectY = extras.getInt(Crop.Extra.ASPECT_Y); + + minAspectX = extras.getInt(Crop.Extra.MIN_ASPECT_X); + minAspectY = extras.getInt(Crop.Extra.MIN_ASPECT_Y); + maxAspectX = extras.getInt(Crop.Extra.MAX_ASPECT_X); + maxAspectX = extras.getInt(Crop.Extra.MAX_ASPECT_Y); + maxX = extras.getInt(Crop.Extra.MAX_X); maxY = extras.getInt(Crop.Extra.MAX_Y); saveAsPng = extras.getBoolean(Crop.Extra.AS_PNG, false); @@ -160,10 +171,9 @@ private void loadInput() { int imageHeight = option.outHeight; int imageWidth = option.outWidth; - if (minX > imageHeight || minY > imageWidth) - { + if (minX > imageHeight || minY > imageWidth) { Intent intentError = new Intent(); - intentError.putExtra(Crop.Extra.ERROR, new Throwable("Image is less then minimum size specified.\nRequired size:"+minX+"x"+minY)); + intentError.putExtra(Crop.Extra.ERROR, new Throwable("Image is less then minimum size specified.\nRequired size:" + minX + "x" + minY)); setResult(Crop.RESULT_ERROR, intentError); finish(); } @@ -273,7 +283,10 @@ 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, minX, minY); + + boolean maintainAspectRatio = !(minAspectX != 0 && minAspectY != 0 && maxAspectX != 0 && maxAspectY != 0) && (aspectX != 0 && aspectY != 0); + + hv.setup(imageView.getUnrotatedMatrix(), imageRect, cropRect, maintainAspectRatio, minX, minY); imageView.add(hv); } @@ -318,8 +331,7 @@ private void onSaveClicked() { try { croppedImage = decodeRegionCrop(r, outWidth, outHeight); - if (exifRotation != 0) - { + if (exifRotation != 0) { Matrix m = new Matrix(); m.postRotate(exifRotation); croppedImage = Bitmap.createBitmap(croppedImage, 0, 0, croppedImage.getWidth(), croppedImage.getHeight(), m, true);