From d0015aeffcda48bebe9ee3660ecc230240773633 Mon Sep 17 00:00:00 2001 From: Nicola Beghin Date: Wed, 31 Aug 2016 23:30:37 +0200 Subject: [PATCH 001/117] image picker bugfix for xiaomi and huawei phones --- .../main/java/com/theartofdev/edmodo/cropper/CropImage.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java index a7be473a..02a958e1 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java @@ -175,11 +175,10 @@ public static Intent getPickImageChooserIntent(@NonNull Context context, CharSeq allIntents.addAll(galleryIntents); Intent target; - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + if (allIntents.isEmpty()) { target = new Intent(); } else { - target = allIntents.get(allIntents.size() - 1); - allIntents.remove(allIntents.size() - 1); + target = allIntents.remove(0); } // Create a chooser from the main intent From 59487fc1a5b5932fdfa92228cb297e615fde54e1 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Thu, 1 Sep 2016 10:50:50 +0300 Subject: [PATCH 002/117] after PR, use last intent as target instead of first. --- .../main/java/com/theartofdev/edmodo/cropper/CropImage.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java index 02a958e1..38b1baee 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java @@ -178,7 +178,8 @@ public static Intent getPickImageChooserIntent(@NonNull Context context, CharSeq if (allIntents.isEmpty()) { target = new Intent(); } else { - target = allIntents.remove(0); + target = allIntents.get(allIntents.size() - 1); + allIntents.remove(allIntents.size() - 1); } // Create a chooser from the main intent From 58f11a460048102c8b7529baecdbd35cfe67b181 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Thu, 1 Sep 2016 14:12:25 +0300 Subject: [PATCH 003/117] streamline crop rectangle change using inverse matrix to fix crop image view resize corrupts crop rectangle window --- .../edmodo/cropper/CropImageView.java | 27 +++++-------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java index 92e4b541..b6721da6 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java @@ -1249,10 +1249,10 @@ protected void onLayout(boolean changed, int l, int t, int r, int b) { setLayoutParams(origParams); if (mBitmap != null) { - applyImageMatrix(r - l, b - t, false, false); + applyImageMatrix(r - l, b - t, true, false); // after state restore we want to restore the window crop, possible only after widget size is known - if (mBitmap != null && mRestoreCropWindowRect != null) { + if (mRestoreCropWindowRect != null) { mImageMatrix.mapRect(mRestoreCropWindowRect); mCropOverlayView.setCropWindowRect(mRestoreCropWindowRect); handleCropWindowChanged(false, false); @@ -1309,7 +1309,6 @@ private void handleCropWindowChanged(boolean inProgress, boolean animate) { mAnimation.setStartState(mImagePoints, mImageMatrix); } - updateCropRectByZoomChange(newZoom / mZoom); mZoom = newZoom; applyImageMatrix(width, height, true, animate); @@ -1318,19 +1317,6 @@ private void handleCropWindowChanged(boolean inProgress, boolean animate) { } } - /** - * Adjust the given crop window rectangle by the change in zoom, need to update the location and size - * of the crop rectangle to cover the same area in new zoom level. - */ - private void updateCropRectByZoomChange(float zoomChange) { - RectF cropRect = mCropOverlayView.getCropWindowRect(); - float xCenterOffset = getWidth() / 2 - cropRect.centerX(); - float yCenterOffset = getHeight() / 2 - cropRect.centerY(); - cropRect.offset(xCenterOffset - xCenterOffset * zoomChange, yCenterOffset - yCenterOffset * zoomChange); - cropRect.inset((cropRect.width() - cropRect.width() * zoomChange) / 2f, (cropRect.height() - cropRect.height() * zoomChange) / 2f); - mCropOverlayView.setCropWindowRect(cropRect); - } - /** * Apply matrix to handle the image inside the image view. * @@ -1340,6 +1326,10 @@ private void updateCropRectByZoomChange(float zoomChange) { private void applyImageMatrix(float width, float height, boolean center, boolean animate) { if (mBitmap != null && width > 0 && height > 0) { + mImageMatrix.invert(mImageInverseMatrix); + RectF cropRect = mCropOverlayView.getCropWindowRect(); + mImageInverseMatrix.mapRect(cropRect); + mImageMatrix.reset(); // move the image to the center of the image view first so we can manipulate it from there @@ -1363,10 +1353,7 @@ private void applyImageMatrix(float width, float height, boolean center, boolean mImageMatrix.postScale(mZoom, mZoom, BitmapUtils.getRectCenterX(mImagePoints), BitmapUtils.getRectCenterY(mImagePoints)); mapImagePointsByImageMatrix(); - RectF cropRect = mCropOverlayView.getCropWindowRect(); - - // reset the crop window offset so we can update it to required value - cropRect.offset(-mZoomOffsetX * mZoom, -mZoomOffsetY * mZoom); + mImageMatrix.mapRect(cropRect); if (center) { // set the zoomed area to be as to the center of cropping window as possible From 4c184ba1983c15aa04e6ba13c071aa16934a8902 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Thu, 1 Sep 2016 14:12:49 +0300 Subject: [PATCH 004/117] update version to 2.3.1 --- cropper/build.gradle | 2 +- .../main/res/layout/fragment_main_rect.xml | 32 +++++++++++++++++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/cropper/build.gradle b/cropper/build.gradle index ca64b0cf..b08482fd 100644 --- a/cropper/build.gradle +++ b/cropper/build.gradle @@ -6,7 +6,7 @@ apply plugin: 'maven-publish' ext { PUBLISH_GROUP_ID = 'com.theartofdev.edmodo' PUBLISH_ARTIFACT_ID = 'android-image-cropper' - PUBLISH_VERSION = '2.3.0' + PUBLISH_VERSION = '2.3.1' // gradlew clean build generateRelease } diff --git a/sample/src/main/res/layout/fragment_main_rect.xml b/sample/src/main/res/layout/fragment_main_rect.xml index 9a5c2248..fea72946 100644 --- a/sample/src/main/res/layout/fragment_main_rect.xml +++ b/sample/src/main/res/layout/fragment_main_rect.xml @@ -1,5 +1,33 @@ - \ No newline at end of file + android:layout_height="match_parent"/>--> + + + + + + + + + \ No newline at end of file From 880573a3553b79746e40ba19b70cfa7fcf827e10 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Thu, 1 Sep 2016 14:26:50 +0300 Subject: [PATCH 005/117] handle auto-zoom required on size change of the crop image view --- .../edmodo/cropper/CropImageView.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java index b6721da6..83c750c8 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java @@ -170,6 +170,12 @@ public class CropImageView extends FrameLayout { */ private RectF mRestoreCropWindowRect; + /** + * Used to detect size change to handle auto-zoom using {@link #handleCropWindowChanged(boolean, boolean)} in + * {@link #layout(int, int, int, int)}. + */ + private boolean mSizeChanged; + /** * Task used to load bitmap async from UI thread */ @@ -1258,6 +1264,9 @@ protected void onLayout(boolean changed, int l, int t, int r, int b) { handleCropWindowChanged(false, false); mCropOverlayView.fixCurrentCropWindowRect(); mRestoreCropWindowRect = null; + } else if (mSizeChanged) { + mSizeChanged = false; + handleCropWindowChanged(false, false); } } else { updateImageBounds(true); @@ -1267,6 +1276,16 @@ protected void onLayout(boolean changed, int l, int t, int r, int b) { } } + /** + * Detect size change to handle auto-zoom using {@link #handleCropWindowChanged(boolean, boolean)} in + * {@link #layout(int, int, int, int)}. + */ + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + mSizeChanged = oldw > 0 && oldh > 0; + } + /** * Handle crop window change to:
* 1. Execute auto-zoom-in/out depending on the area covered of cropping window relative to the From a8a4bd36519b9087d7b559dc65dc0863b41f0bd2 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Thu, 1 Sep 2016 14:37:05 +0300 Subject: [PATCH 006/117] update readme --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 8d35c8cc..6b9ba568 100644 --- a/README.md +++ b/README.md @@ -107,6 +107,11 @@ For more information, see the [GitHub Wiki](https://github.com/ArthurHub/Android - [Adding auto-zoom feature to Android-Image-Cropper](https://theartofdev.com/2016/04/25/adding-auto-zoom-feature-to-android-image-cropper/) ## Change log +*2.3.1* + +- Fix image picker for xiaomi and huawei phones (thx @nicolabeghin) +- Fix crop window get corrupted on `CropImageView` resize. + *2.3.0* - Change required width/height behavior to support resizing (inside/fit/exact) see wiki for details. From f9ceac0fbbdf797483ff75ea5ea06b1b04c4989c Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Thu, 1 Sep 2016 14:42:42 +0300 Subject: [PATCH 007/117] revert change made for testing --- .../main/res/layout/fragment_main_rect.xml | 32 ++----------------- 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/sample/src/main/res/layout/fragment_main_rect.xml b/sample/src/main/res/layout/fragment_main_rect.xml index fea72946..9a5c2248 100644 --- a/sample/src/main/res/layout/fragment_main_rect.xml +++ b/sample/src/main/res/layout/fragment_main_rect.xml @@ -1,33 +1,5 @@ - - - - - - - - - - \ No newline at end of file + android:layout_height="match_parent"/> \ No newline at end of file From 429425054511c7e973a758c053d93dd440cd2673 Mon Sep 17 00:00:00 2001 From: Ajay Dwivedi Date: Fri, 28 Oct 2016 15:05:15 +0530 Subject: [PATCH 008/117] Start a picker to choose image if no image uri is provided to ActivityBuilder --- .../theartofdev/edmodo/cropper/CropImage.java | 13 ++-- .../edmodo/cropper/CropImageActivity.java | 74 ++++++++++++++++++- quick-start/src/main/AndroidManifest.xml | 1 + .../cropper/quick/start/MainActivity.java | 37 +--------- 4 files changed, 80 insertions(+), 45 deletions(-) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java index 38b1baee..3df0c0ba 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java @@ -164,8 +164,10 @@ public static Intent getPickImageChooserIntent(@NonNull Context context, CharSeq List allIntents = new ArrayList<>(); PackageManager packageManager = context.getPackageManager(); - // collect all camera intents - allIntents.addAll(getCameraIntents(context, packageManager)); + // collect all camera intents if Camera permission is available + if (!isExplicitCameraPermissionRequired(context)) { + allIntents.addAll(getCameraIntents(context, packageManager)); + } List galleryIntents = getGalleryIntents(packageManager, Intent.ACTION_GET_CONTENT, includeDocuments); if (galleryIntents.size() == 0) { @@ -350,13 +352,10 @@ public static boolean isUriRequiresPermissions(@NonNull Context context, @NonNul * Result will be recieved in {@link Activity#onActivityResult(int, int, Intent)} and can be retrieved * using {@link #getActivityResult(Intent)}. * - * @param uri the image Android uri source to crop + * @param uri the image Android uri source to crop or null to start a picker * @return builder for Crop Image Activity */ - public static ActivityBuilder activity(@NonNull Uri uri) { - if (uri == null || uri.equals(Uri.EMPTY)) { - throw new IllegalArgumentException("Uri must be non null or empty"); - } + public static ActivityBuilder activity(@Nullable Uri uri) { return new ActivityBuilder(uri); } diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageActivity.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageActivity.java index bb7f0321..ed62b9fa 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageActivity.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageActivity.java @@ -12,17 +12,23 @@ package com.theartofdev.edmodo.cropper; +import android.Manifest; +import android.annotation.SuppressLint; +import android.app.Activity; import android.content.Intent; +import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; +import android.widget.Toast; import java.io.File; import java.io.IOException; @@ -38,12 +44,18 @@ public class CropImageActivity extends AppCompatActivity implements CropImageVie */ private CropImageView mCropImageView; + /** + * Persist URI image to crop URI if specific permissions are required + */ + private Uri mCropImageUri; + /** * the options that were set for the crop image */ private CropImageOptions mOptions; @Override + @SuppressLint("NewApi") public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.crop_image_activity); @@ -51,11 +63,24 @@ public void onCreate(Bundle savedInstanceState) { mCropImageView = (CropImageView) findViewById(R.id.cropImageView); Intent intent = getIntent(); - Uri source = intent.getParcelableExtra(CropImage.CROP_IMAGE_EXTRA_SOURCE); + mCropImageUri = intent.getParcelableExtra(CropImage.CROP_IMAGE_EXTRA_SOURCE); mOptions = intent.getParcelableExtra(CropImage.CROP_IMAGE_EXTRA_OPTIONS); if (savedInstanceState == null) { - mCropImageView.setImageUriAsync(source); + if (mCropImageUri == null || mCropImageUri.equals(Uri.EMPTY)) { + if (CropImage.isExplicitCameraPermissionRequired(this)) { + // request permissions and handle the result in onRequestPermissionsResult() + requestPermissions(new String[]{Manifest.permission.CAMERA}, CropImage.CAMERA_CAPTURE_PERMISSIONS_REQUEST_CODE); + } else { + CropImage.startPickImageActivity(this); + } + } else if (CropImage.isReadExternalStoragePermissionsRequired(this, mCropImageUri)) { + // request permissions and handle the result in onRequestPermissionsResult() + requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, CropImage.PICK_IMAGE_PERMISSIONS_REQUEST_CODE); + } else { + // no permissions required or already grunted, can start crop image activity + mCropImageView.setImageUriAsync(mCropImageUri); + } } ActionBar actionBar = getSupportActionBar(); @@ -140,6 +165,51 @@ public void onBackPressed() { setResultCancel(); } + @Override + @SuppressLint("NewApi") + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + + // handle result of pick image chooser + if (requestCode == CropImage.PICK_IMAGE_CHOOSER_REQUEST_CODE) { + if (resultCode == Activity.RESULT_CANCELED) { + //User cancelled the picker. We don't have anything to crop + setResultCancel(); + } + + if (resultCode == Activity.RESULT_OK) { + mCropImageUri = CropImage.getPickImageResultUri(this, data); + + // For API >= 23 we need to check specifically that we have permissions to read external storage. + if (CropImage.isReadExternalStoragePermissionsRequired(this, mCropImageUri)) { + // request permissions and handle the result in onRequestPermissionsResult() + requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, CropImage.PICK_IMAGE_PERMISSIONS_REQUEST_CODE); + } else { + // no permissions required or already grunted, can start crop image activity + mCropImageView.setImageUriAsync(mCropImageUri); + } + } + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { + if (requestCode == CropImage.PICK_IMAGE_PERMISSIONS_REQUEST_CODE) { + if (mCropImageUri != null && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + // required permissions granted, start crop image activity + mCropImageView.setImageUriAsync(mCropImageUri); + } else { + Toast.makeText(this, "Cancelling, required permissions are not granted", Toast.LENGTH_LONG).show(); + setResultCancel(); + } + } + + if (requestCode == CropImage.CAMERA_CAPTURE_PERMISSIONS_REQUEST_CODE) { + //Irrespective of whether camera permission was given or not, we show the picker + //The picker will not add the camera intent if permission is not available + CropImage.startPickImageActivity(this); + } + } + @Override public void onSetImageUriComplete(CropImageView view, Uri uri, Exception error) { if (error == null) { diff --git a/quick-start/src/main/AndroidManifest.xml b/quick-start/src/main/AndroidManifest.xml index c8fbab2b..2f109e5b 100644 --- a/quick-start/src/main/AndroidManifest.xml +++ b/quick-start/src/main/AndroidManifest.xml @@ -4,6 +4,7 @@ xmlns:android="http://schemas.android.com/apk/res/android"> + = 23 we need to check specifically that we have permissions to read external storage. - if (CropImage.isReadExternalStoragePermissionsRequired(this, imageUri)) { - // request permissions and handle the result in onRequestPermissionsResult() - mCropImageUri = imageUri; - requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 0); - } else { - // no permissions required or already grunted, can start crop image activity - startCropImageActivity(imageUri); - } - } - // handle result of CropImageActivity if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) { CropImage.ActivityResult result = CropImage.getActivityResult(data); @@ -78,16 +53,6 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) { } } - @Override - public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { - if (mCropImageUri != null && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - // required permissions granted, start crop image activity - startCropImageActivity(mCropImageUri); - } else { - Toast.makeText(this, "Cancelling, required permissions are not granted", Toast.LENGTH_LONG).show(); - } - } - /** * Start crop image activity for the given image. */ From e1767de2d4378f3f6aff63976d8c308976d19f03 Mon Sep 17 00:00:00 2001 From: Ajay Dwivedi Date: Fri, 28 Oct 2016 15:33:39 +0530 Subject: [PATCH 009/117] Start a picker to choose image if no image uri is provided to ActivityBuilder --- .../main/java/com/theartofdev/edmodo/cropper/CropImage.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java index 3df0c0ba..de611299 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java @@ -50,6 +50,7 @@ * Added value you get out-of-the-box is some edge case handling that you may miss otherwise, like the * stupid-ass Android camera result URI that may differ from version to version and from device to device. */ +@SuppressWarnings("WeakerAccess, unused") public final class CropImage { //region: Fields and Consts @@ -379,6 +380,7 @@ public static final class ActivityBuilder { /** * The image to crop source Android uri. */ + @Nullable private final Uri mSource; /** @@ -386,7 +388,7 @@ public static final class ActivityBuilder { */ private final CropImageOptions mOptions; - private ActivityBuilder(@NonNull Uri source) { + private ActivityBuilder(@Nullable Uri source) { mSource = source; mOptions = new CropImageOptions(); } From c3ec81200d733f391c03f6e49e035c9751d94b1a Mon Sep 17 00:00:00 2001 From: Lennon Petrick Spirlandelli Date: Wed, 2 Nov 2016 14:18:05 -0200 Subject: [PATCH 010/117] Added a method for creating an intent just to use the camera with the possibility of choosing where to place the picture, so that being able to get easily further --- build.gradle | 2 +- .../theartofdev/edmodo/cropper/CropImage.java | 24 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 857aec95..c1c484e2 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.1.3' + classpath 'com.android.tools.build:gradle:2.2.2' } } diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java index 38b1baee..81f9d1f7 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java @@ -191,6 +191,30 @@ public static Intent getPickImageChooserIntent(@NonNull Context context, CharSeq return chooserIntent; } + /** + * Get the main Camera intent for capturing image using device camera app. + * If the outputFileUri is null, a default Uri will be created with {@link #getCaptureImageOutputUri(Context)}, so then + * you will be able to get the pictureUri using {@link #getPickImageResultUri(Context, Intent)}. Otherwise, it is just you use + * the Uri passed to this method. + * + * @param context used to access Android APIs, like content resolve, it is your activity/fragment/widget. + * @param outputFileUri the Uri where the picture will be placed. + */ + public static Intent getCameraIntent(@NonNull Context context, Uri outputFileUri) { + + Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + + if (outputFileUri == null) { + + outputFileUri = getCaptureImageOutputUri(context); + + } + + intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); + + return intent; + } + /** * Get all Camera intents for capturing image using device camera apps. */ From 363f01619f506669f40ceaa984c7ca396f329ee4 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Fri, 18 Nov 2016 13:59:07 +0200 Subject: [PATCH 011/117] update com.android.support:appcompat to v7:24.2.1 --- cropper/build.gradle | 2 +- .../main/java/com/theartofdev/edmodo/cropper/CropImage.java | 6 ------ quick-start/build.gradle | 2 +- sample/build.gradle | 2 +- 4 files changed, 3 insertions(+), 9 deletions(-) diff --git a/cropper/build.gradle b/cropper/build.gradle index b08482fd..08465f9b 100644 --- a/cropper/build.gradle +++ b/cropper/build.gradle @@ -49,6 +49,6 @@ publishing { apply from: 'https://raw.githubusercontent.com/ArthurHub/release-android-library/master/android-release-aar.gradle' dependencies { - compile 'com.android.support:appcompat-v7:24.1.1' + compile 'com.android.support:appcompat-v7:24.2.1' } diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java index 46292b00..80e307c4 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java @@ -204,17 +204,11 @@ public static Intent getPickImageChooserIntent(@NonNull Context context, CharSeq * @param outputFileUri the Uri where the picture will be placed. */ public static Intent getCameraIntent(@NonNull Context context, Uri outputFileUri) { - Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - if (outputFileUri == null) { - outputFileUri = getCaptureImageOutputUri(context); - } - intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); - return intent; } diff --git a/quick-start/build.gradle b/quick-start/build.gradle index f7474c6d..10768fd0 100644 --- a/quick-start/build.gradle +++ b/quick-start/build.gradle @@ -17,5 +17,5 @@ android { dependencies { compile project(':cropper') - compile 'com.android.support:appcompat-v7:24.1.1' + compile 'com.android.support:appcompat-v7:24.2.1' } diff --git a/sample/build.gradle b/sample/build.gradle index f7474c6d..10768fd0 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -17,5 +17,5 @@ android { dependencies { compile project(':cropper') - compile 'com.android.support:appcompat-v7:24.1.1' + compile 'com.android.support:appcompat-v7:24.2.1' } From 736430cd8ff6a0f1f74aece13fdd712192cfd214 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Fri, 18 Nov 2016 15:07:21 +0200 Subject: [PATCH 012/117] add scaling fallback on OOM for cropping image object --- .../cropper/BitmapCroppingWorkerTask.java | 46 +++++---- .../edmodo/cropper/BitmapUtils.java | 93 ++++++++++++------- .../edmodo/cropper/CropImageView.java | 6 +- 3 files changed, 85 insertions(+), 60 deletions(-) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapCroppingWorkerTask.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapCroppingWorkerTask.java index eedb9234..e5c7a7e2 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapCroppingWorkerTask.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapCroppingWorkerTask.java @@ -112,10 +112,10 @@ final class BitmapCroppingWorkerTask extends AsyncTask(cropImageView); mContext = cropImageView.getContext(); @@ -136,11 +136,11 @@ public BitmapCroppingWorkerTask(CropImageView cropImageView, Bitmap bitmap, floa mOrgHeight = 0; } - public BitmapCroppingWorkerTask(CropImageView cropImageView, Uri uri, float[] cropPoints, - int degreesRotated, int orgWidth, int orgHeight, - boolean fixAspectRatio, int aspectRatioX, int aspectRatioY, - int reqWidth, int reqHeight, CropImageView.RequestSizeOptions options, - Uri saveUri, Bitmap.CompressFormat saveCompressFormat, int saveCompressQuality) { + BitmapCroppingWorkerTask(CropImageView cropImageView, Uri uri, float[] cropPoints, + int degreesRotated, int orgWidth, int orgHeight, + boolean fixAspectRatio, int aspectRatioX, int aspectRatioY, + int reqWidth, int reqHeight, CropImageView.RequestSizeOptions options, + Uri saveUri, Bitmap.CompressFormat saveCompressFormat, int saveCompressQuality) { mCropImageViewReference = new WeakReference<>(cropImageView); mContext = cropImageView.getContext(); @@ -179,28 +179,26 @@ protected BitmapCroppingWorkerTask.Result doInBackground(Void... params) { try { if (!isCancelled()) { - Bitmap bitmap = null; - int sampleSize = 1; + BitmapUtils.BitmapSampled bitmapSampled; if (mUri != null) { - BitmapUtils.BitmapSampled bitmapSampled = - BitmapUtils.cropBitmap(mContext, mUri, mCropPoints, mDegreesRotated, mOrgWidth, mOrgHeight, - mFixAspectRatio, mAspectRatioX, mAspectRatioY, mReqWidth, mReqHeight); - bitmap = bitmapSampled.bitmap; - sampleSize = bitmapSampled.sampleSize; + bitmapSampled = BitmapUtils.cropBitmap(mContext, mUri, mCropPoints, mDegreesRotated, mOrgWidth, mOrgHeight, + mFixAspectRatio, mAspectRatioX, mAspectRatioY, mReqWidth, mReqHeight); } else if (mBitmap != null) { - bitmap = BitmapUtils.cropBitmap(mBitmap, mCropPoints, mDegreesRotated, mFixAspectRatio, mAspectRatioX, mAspectRatioY); + bitmapSampled = BitmapUtils.cropBitmapObjectHandleOOM(mBitmap, mCropPoints, mDegreesRotated, mFixAspectRatio, mAspectRatioX, mAspectRatioY); + } else { + return new Result((Bitmap) null, 1); } - bitmap = BitmapUtils.resizeBitmap(bitmap, mReqWidth, mReqHeight, mReqSizeOptions); + Bitmap bitmap = BitmapUtils.resizeBitmap(bitmapSampled.bitmap, mReqWidth, mReqHeight, mReqSizeOptions); if (mSaveUri == null) { - return new Result(bitmap, sampleSize); + return new Result(bitmap, bitmapSampled.sampleSize); } else { BitmapUtils.writeBitmapToUri(mContext, bitmap, mSaveUri, mSaveCompressFormat, mSaveCompressQuality); if (bitmap != null) { bitmap.recycle(); } - return new Result(mSaveUri, sampleSize); + return new Result(mSaveUri, bitmapSampled.sampleSize); } } return null; @@ -237,7 +235,7 @@ protected void onPostExecute(Result result) { /** * The result of BitmapCroppingWorkerTask async loading. */ - public static final class Result { + static final class Result { /** * The cropped bitmap @@ -252,17 +250,17 @@ public static final class Result { /** * The error that occurred during async bitmap cropping. */ - public final Exception error; + final Exception error; /** * is the cropping request was to get a bitmap or to save it to uri */ - public final boolean isSave; + final boolean isSave; /** * sample size used creating the crop bitmap to lower its size */ - public final int sampleSize; + final int sampleSize; Result(Bitmap bitmap, int sampleSize) { this.bitmap = bitmap; diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapUtils.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapUtils.java index c1d16d3b..1f66ee83 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapUtils.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapUtils.java @@ -67,7 +67,7 @@ final class BitmapUtils { /** * Used to know the max texture size allowed to be rendered */ - static int mMaxTextureSize; + private static int mMaxTextureSize; /** * used to save bitmaps during state save and restore so not to reload them. @@ -79,7 +79,7 @@ final class BitmapUtils { * If no rotation is required the image will not be rotated.
* New bitmap is created and the old one is recycled. */ - public static RotateBitmapResult rotateBitmapByExif(Bitmap bitmap, Context context, Uri uri) { + static RotateBitmapResult rotateBitmapByExif(Bitmap bitmap, Context context, Uri uri) { try { File file = getFileFromUri(context, uri); if (file.exists()) { @@ -96,7 +96,7 @@ public static RotateBitmapResult rotateBitmapByExif(Bitmap bitmap, Context conte * If no rotation is required the image will not be rotated.
* New bitmap is created and the old one is recycled. */ - public static RotateBitmapResult rotateBitmapByExif(Bitmap bitmap, ExifInterface exif) { + static RotateBitmapResult rotateBitmapByExif(Bitmap bitmap, ExifInterface exif) { int degrees; int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { @@ -119,7 +119,7 @@ public static RotateBitmapResult rotateBitmapByExif(Bitmap bitmap, ExifInterface /** * Decode bitmap from stream using sampling to get bitmap with the requested limit. */ - public static BitmapSampled decodeSampledBitmap(Context context, Uri uri, int reqWidth, int reqHeight) { + static BitmapSampled decodeSampledBitmap(Context context, Uri uri, int reqWidth, int reqHeight) { try { ContentResolver resolver = context.getContentResolver(); @@ -142,20 +142,45 @@ public static BitmapSampled decodeSampledBitmap(Context context, Uri uri, int re } } + /** + * Crop image bitmap from given bitmap using the given points in the original bitmap and the given rotation.
+ * if the rotation is not 0,90,180 or 270 degrees then we must first crop a larger area of the image that + * contains the requires rectangle, rotate and then crop again a sub rectangle.
+ * If crop fails due to OOM we scale the cropping image by 0.5 every time it fails until it is small enough. + */ + static BitmapSampled cropBitmapObjectHandleOOM(Bitmap bitmap, float[] points, int degreesRotated, + boolean fixAspectRatio, int aspectRatioX, int aspectRatioY) { + int scale = 1; + while (true) { + try { + Bitmap cropBitmap = cropBitmapObjectWithScale(bitmap, points, degreesRotated, fixAspectRatio, aspectRatioX, aspectRatioY, 1 / (float) scale); + return new BitmapSampled(cropBitmap, scale); + } catch (OutOfMemoryError e) { + scale *= 2; + if (scale > 8) { + throw e; + } + } + } + } + /** * Crop image bitmap from given bitmap using the given points in the original bitmap and the given rotation.
* if the rotation is not 0,90,180 or 270 degrees then we must first crop a larger area of the image that * contains the requires rectangle, rotate and then crop again a sub rectangle. + * + * @param scale how much to scale the cropped image part, use 0.5 to lower the image by half (OOM handling) */ - public static Bitmap cropBitmap(Bitmap bitmap, float[] points, int degreesRotated, - boolean fixAspectRatio, int aspectRatioX, int aspectRatioY) { + private static Bitmap cropBitmapObjectWithScale(Bitmap bitmap, float[] points, int degreesRotated, + boolean fixAspectRatio, int aspectRatioX, int aspectRatioY, float scale) { // get the rectangle in original image that contains the required cropped area (larger for non rectangular crop) Rect rect = getRectFromPoints(points, bitmap.getWidth(), bitmap.getHeight(), fixAspectRatio, aspectRatioX, aspectRatioY); // crop and rotate the cropped image in one operation Matrix matrix = new Matrix(); - matrix.setRotate(degreesRotated, bitmap.getWidth() / 2, bitmap.getHeight() / 2); + matrix.setScale(scale, scale); + matrix.postRotate(degreesRotated, bitmap.getWidth() / 2, bitmap.getHeight() / 2); Bitmap result = Bitmap.createBitmap(bitmap, rect.left, rect.top, rect.width(), rect.height(), matrix, true); if (result == bitmap) { @@ -177,9 +202,9 @@ public static Bitmap cropBitmap(Bitmap bitmap, float[] points, int degreesRotate * Crop image bitmap from URI by decoding it with specific width and height to down-sample if required.
* Additionally if OOM is thrown try to increase the sampling (2,4,8). */ - public static BitmapSampled cropBitmap(Context context, Uri loadedImageUri, float[] points, - int degreesRotated, int orgWidth, int orgHeight, boolean fixAspectRatio, - int aspectRatioX, int aspectRatioY, int reqWidth, int reqHeight) { + static BitmapSampled cropBitmap(Context context, Uri loadedImageUri, float[] points, + int degreesRotated, int orgWidth, int orgHeight, boolean fixAspectRatio, + int aspectRatioX, int aspectRatioY, int reqWidth, int reqHeight) { int sampleMulti = 1; while (true) { try { @@ -201,56 +226,56 @@ public static BitmapSampled cropBitmap(Context context, Uri loadedImageUri, floa /** * Get left value of the bounding rectangle of the given points. */ - public static float getRectLeft(float[] points) { + static float getRectLeft(float[] points) { return Math.min(Math.min(Math.min(points[0], points[2]), points[4]), points[6]); } /** * Get top value of the bounding rectangle of the given points. */ - public static float getRectTop(float[] points) { + static float getRectTop(float[] points) { return Math.min(Math.min(Math.min(points[1], points[3]), points[5]), points[7]); } /** * Get right value of the bounding rectangle of the given points. */ - public static float getRectRight(float[] points) { + static float getRectRight(float[] points) { return Math.max(Math.max(Math.max(points[0], points[2]), points[4]), points[6]); } /** * Get bottom value of the bounding rectangle of the given points. */ - public static float getRectBottom(float[] points) { + static float getRectBottom(float[] points) { return Math.max(Math.max(Math.max(points[1], points[3]), points[5]), points[7]); } /** * Get width of the bounding rectangle of the given points. */ - public static float getRectWidth(float[] points) { + static float getRectWidth(float[] points) { return getRectRight(points) - getRectLeft(points); } /** * Get heightof the bounding rectangle of the given points. */ - public static float getRectHeight(float[] points) { + static float getRectHeight(float[] points) { return getRectBottom(points) - getRectTop(points); } /** * Get horizontal center value of the bounding rectangle of the given points. */ - public static float getRectCenterX(float[] points) { + static float getRectCenterX(float[] points) { return (getRectRight(points) + getRectLeft(points)) / 2f; } /** * Get verical center value of the bounding rectangle of the given points. */ - public static float getRectCenterY(float[] points) { + static float getRectCenterY(float[] points) { return (getRectBottom(points) + getRectTop(points)) / 2f; } @@ -258,7 +283,7 @@ public static float getRectCenterY(float[] points) { * Get a rectangle for the given 4 points (x0,y0,x1,y1,x2,y2,x3,y3) by finding the min/max 2 points that * contains the given 4 points and is a stright rectangle. */ - public static Rect getRectFromPoints(float[] points, int imageWidth, int imageHeight, boolean fixAspectRatio, int aspectRatioX, int aspectRatioY) { + static Rect getRectFromPoints(float[] points, int imageWidth, int imageHeight, boolean fixAspectRatio, int aspectRatioX, int aspectRatioY) { int left = Math.round(Math.max(0, getRectLeft(points))); int top = Math.round(Math.max(0, getRectTop(points))); int right = Math.round(Math.min(imageWidth, getRectRight(points))); @@ -276,7 +301,7 @@ public static Rect getRectFromPoints(float[] points, int imageWidth, int imageHe * Fix the given rectangle if it doesn't confirm to aspect ration rule.
* Make sure that width and height are equal if 1:1 fixed aspect ratio is requested. */ - public static void fixRectForAspectRatio(Rect rect, int aspectRatioX, int aspectRatioY) { + private static void fixRectForAspectRatio(Rect rect, int aspectRatioX, int aspectRatioY) { if (aspectRatioX == aspectRatioY && rect.width() != rect.height()) { if (rect.height() > rect.width()) { rect.bottom -= rect.height() - rect.width(); @@ -289,7 +314,7 @@ public static void fixRectForAspectRatio(Rect rect, int aspectRatioX, int aspect /** * Write the given bitmap to the given uri using the given compression. */ - public static void writeBitmapToUri(Context context, Bitmap bitmap, Uri uri, Bitmap.CompressFormat compressFormat, int compressQuality) throws FileNotFoundException { + static void writeBitmapToUri(Context context, Bitmap bitmap, Uri uri, Bitmap.CompressFormat compressFormat, int compressQuality) throws FileNotFoundException { OutputStream outputStream = null; try { outputStream = context.getContentResolver().openOutputStream(uri); @@ -302,7 +327,7 @@ public static void writeBitmapToUri(Context context, Bitmap bitmap, Uri uri, Bit /** * Resize the given bitmap to the given width/height by the given option.
*/ - public static Bitmap resizeBitmap(Bitmap bitmap, int reqWidth, int reqHeight, CropImageView.RequestSizeOptions options) { + static Bitmap resizeBitmap(Bitmap bitmap, int reqWidth, int reqHeight, CropImageView.RequestSizeOptions options) { try { if (reqWidth > 0 && reqHeight > 0 && (options == CropImageView.RequestSizeOptions.RESIZE_FIT || options == CropImageView.RequestSizeOptions.RESIZE_INSIDE || @@ -358,7 +383,7 @@ private static BitmapSampled cropBitmap(Context context, Uri loadedImageUri, flo BitmapSampled bitmapSampled = decodeSampledBitmapRegion(context, loadedImageUri, rect, width, height, sampleMulti); result = bitmapSampled.bitmap; sampleSize = bitmapSampled.sampleSize; - } catch (Exception e) { + } catch (Exception ignored) { } if (result != null) { @@ -407,7 +432,7 @@ private static BitmapSampled cropBitmap(Context context, Uri loadedImageUri, flo points2[i] = points2[i] / options.inSampleSize; } - result = cropBitmap(fullBitmap, points2, degreesRotated, fixAspectRatio, aspectRatioX, aspectRatioY); + result = cropBitmapObjectWithScale(fullBitmap, points2, degreesRotated, fixAspectRatio, aspectRatioX, aspectRatioY, 1); } finally { if (result != fullBitmap) { fullBitmap.recycle(); @@ -578,10 +603,12 @@ private static File getFileFromUri(Context context, Uri uri) { try { String[] proj = {MediaStore.Images.Media.DATA}; cursor = context.getContentResolver().query(uri, proj, null, null, null); - int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); - cursor.moveToFirst(); - String realPath = cursor.getString(column_index); - file = new File(realPath); + if (cursor != null) { + int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); + cursor.moveToFirst(); + String realPath = cursor.getString(column_index); + file = new File(realPath); + } } catch (Exception ignored) { } finally { if (cursor != null) { @@ -680,7 +707,7 @@ private static void closeSafe(Closeable closeable) { /** * Holds bitmap instance and the sample size that the bitmap was loaded/cropped with. */ - public static final class BitmapSampled { + static final class BitmapSampled { /** * The bitmap instance @@ -690,9 +717,9 @@ public static final class BitmapSampled { /** * The sample size used to lower the size of the bitmap (1,2,4,8,...) */ - public final int sampleSize; + final int sampleSize; - public BitmapSampled(Bitmap bitmap, int sampleSize) { + BitmapSampled(Bitmap bitmap, int sampleSize) { this.bitmap = bitmap; this.sampleSize = sampleSize; } @@ -704,7 +731,7 @@ public BitmapSampled(Bitmap bitmap, int sampleSize) { /** * The result of {@link #rotateBitmapByExif(android.graphics.Bitmap, android.media.ExifInterface)}. */ - public static final class RotateBitmapResult { + static final class RotateBitmapResult { /** * The loaded bitmap @@ -714,7 +741,7 @@ public static final class RotateBitmapResult { /** * The degrees the image was rotated */ - public final int degrees; + final int degrees; RotateBitmapResult(Bitmap bitmap, int degrees) { this.bitmap = bitmap; diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java index 83c750c8..29224c4a 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java @@ -613,7 +613,7 @@ public Bitmap getCroppedImage() { * @return a new Bitmap representing the cropped image */ public Bitmap getCroppedImage(int reqWidth, int reqHeight) { - return getCroppedImage(0, 0, RequestSizeOptions.RESIZE_INSIDE); + return getCroppedImage(reqWidth, reqHeight, RequestSizeOptions.RESIZE_INSIDE); } /** @@ -642,8 +642,8 @@ public Bitmap getCroppedImage(int reqWidth, int reqHeight, RequestSizeOptions op reqWidth, reqHeight); croppedBitmap = bitmapSampled.bitmap; } else { - croppedBitmap = BitmapUtils.cropBitmap(mBitmap, getCropPoints(), mDegreesRotated, - mCropOverlayView.isFixAspectRatio(), mCropOverlayView.getAspectRatioX(), mCropOverlayView.getAspectRatioY()); + croppedBitmap = BitmapUtils.cropBitmapObjectHandleOOM(mBitmap, getCropPoints(), mDegreesRotated, + mCropOverlayView.isFixAspectRatio(), mCropOverlayView.getAspectRatioX(), mCropOverlayView.getAspectRatioY()).bitmap; } croppedBitmap = BitmapUtils.resizeBitmap(croppedBitmap, reqWidth, reqHeight, options); From 56da05936d4dc69ba25b4926af9b2bb267c59f5a Mon Sep 17 00:00:00 2001 From: Tim Cooke Date: Mon, 28 Nov 2016 22:31:22 -0500 Subject: [PATCH 013/117] Allows for degrees to be negative Fixes operator-precedence-related bug in flipAxes computation Collectively, these changes ensure that the image is correctly rotated, even if the value passed in is outside of the range [0, 360]. This is particularly important for counter-clockwise rotations. --- .../theartofdev/edmodo/cropper/CropImageView.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java index 29224c4a..21e56a23 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java @@ -860,14 +860,20 @@ public void clearImage() { /** * Rotates image by the specified number of degrees clockwise.
- * Cycles from 0 to 360 degrees. + * Negative values represent counter-clockwise rotations. * * @param degrees Integer specifying the number of degrees to rotate. */ public void rotateImage(int degrees) { if (mBitmap != null) { + // Force degrees to be a non-zero value between 0 and 360 (inclusive) + if (degrees < 0) { + degrees = (degrees % 360) + 360; + } else { + degrees = degrees % 360; + } - boolean flipAxes = !mCropOverlayView.isFixAspectRatio() && (degrees > 45 && degrees < 135) || (degrees > 215 && degrees < 305); + boolean flipAxes = !mCropOverlayView.isFixAspectRatio() && ((degrees > 45 && degrees < 135) || (degrees > 215 && degrees < 305)); BitmapUtils.RECT.set(mCropOverlayView.getCropWindowRect()); float halfWidth = (flipAxes ? BitmapUtils.RECT.height() : BitmapUtils.RECT.width()) / 2f; float halfHeight = (flipAxes ? BitmapUtils.RECT.width() : BitmapUtils.RECT.height()) / 2f; @@ -882,8 +888,8 @@ public void rotateImage(int degrees) { BitmapUtils.POINTS[5] = 0; mImageInverseMatrix.mapPoints(BitmapUtils.POINTS); - mDegreesRotated += degrees; - mDegreesRotated = mDegreesRotated >= 0 ? mDegreesRotated % 360 : mDegreesRotated % 360 + 360; + // This is valid because degrees is not negative. + mDegreesRotated = (mDegreesRotated + degrees) % 360; applyImageMatrix(getWidth(), getHeight(), true, false); From 06f9354d108d1339af2c53809d9e778078dc62c9 Mon Sep 17 00:00:00 2001 From: Richard Yee Date: Fri, 20 Jan 2017 13:44:20 -0800 Subject: [PATCH 014/117] Added crop overlay released listener --- .../edmodo/cropper/CropImageView.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java index 21e56a23..98b98a3d 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java @@ -118,6 +118,11 @@ public class CropImageView extends FrameLayout { */ private int mMaxZoom; + /** + * callback to be invoked when crop overlay is released. + */ + private OnSetCropOverlayReleasedListener mOnSetCropOverlayReleasedListener; + /** * callback to be invoked when image async loading is complete. */ @@ -269,6 +274,9 @@ public CropImageView(Context context, AttributeSet attrs) { @Override public void onCropWindowChanged(boolean inProgress) { handleCropWindowChanged(inProgress, true); + if(!inProgress){ + mOnSetCropOverlayReleasedListener.onCropOverlayReleased(getCropRect()); + } } }); mCropOverlayView.setInitialAttributeValues(options); @@ -743,6 +751,13 @@ public void saveCroppedImageAsync(Uri saveUri, Bitmap.CompressFormat saveCompres startCropWorkerTask(reqWidth, reqHeight, options, saveUri, saveCompressFormat, saveCompressQuality); } + /** + * Set the callback t + */ + public void setOnSetCropOverlayReleasedListener(OnSetCropOverlayReleasedListener listener) { + mOnSetCropOverlayReleasedListener = listener; + } + /** * Set the callback to be invoked when image async loading ({@link #setImageUriAsync(Uri)}) * is complete (successful or failed). @@ -1613,6 +1628,18 @@ public enum RequestSizeOptions { //region: Inner class: OnSetImageUriCompleteListener + /** + * Interface definition for a callback to be invoked when the crop overlay is released. + */ + public interface OnSetCropOverlayReleasedListener{ + /** + * Called when the crop overlay changed listener is called and inProgress is false. + * + * @param rect The rect coordinates of the cropped overlay + */ + void onCropOverlayReleased(Rect rect); + } + /** * Interface definition for a callback to be invoked when image async loading is complete. */ From 5ba4bbb3252fe286f3b5c37c98bfbd25972c1829 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Mon, 10 Apr 2017 11:53:53 +0300 Subject: [PATCH 015/117] update gradle/tools/sdk to latest --- build.gradle | 2 +- cropper/build.gradle | 8 ++++---- gradle/wrapper/gradle-wrapper.properties | 4 ++-- quick-start/build.gradle | 8 ++++---- sample/build.gradle | 8 ++++---- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/build.gradle b/build.gradle index c1c484e2..e81618a4 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.2' + classpath 'com.android.tools.build:gradle:2.3.1' } } diff --git a/cropper/build.gradle b/cropper/build.gradle index 08465f9b..36d9bb71 100644 --- a/cropper/build.gradle +++ b/cropper/build.gradle @@ -12,11 +12,11 @@ ext { android { - compileSdkVersion 24 - buildToolsVersion '24.0.1' + compileSdkVersion 25 + buildToolsVersion '25.0.2' defaultConfig { minSdkVersion 10 - targetSdkVersion 24 + targetSdkVersion 25 versionCode 1 versionName PUBLISH_VERSION } @@ -49,6 +49,6 @@ publishing { apply from: 'https://raw.githubusercontent.com/ArthurHub/release-android-library/master/android-release-aar.gradle' dependencies { - compile 'com.android.support:appcompat-v7:24.2.1' + compile 'com.android.support:appcompat-v7:25.3.1' } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e6dd0a25..53863165 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Aug 17 18:17:00 IDT 2016 +#Mon Apr 10 09:44:17 IDT 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip diff --git a/quick-start/build.gradle b/quick-start/build.gradle index 10768fd0..64a2d8b8 100644 --- a/quick-start/build.gradle +++ b/quick-start/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 24 - buildToolsVersion '24.0.1' + compileSdkVersion 25 + buildToolsVersion '25.0.2' defaultConfig { minSdkVersion 14 - targetSdkVersion 24 + targetSdkVersion 25 versionCode 1 versionName '1.0' } @@ -17,5 +17,5 @@ android { dependencies { compile project(':cropper') - compile 'com.android.support:appcompat-v7:24.2.1' + compile 'com.android.support:appcompat-v7:25.3.1' } diff --git a/sample/build.gradle b/sample/build.gradle index 10768fd0..64a2d8b8 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 24 - buildToolsVersion '24.0.1' + compileSdkVersion 25 + buildToolsVersion '25.0.2' defaultConfig { minSdkVersion 14 - targetSdkVersion 24 + targetSdkVersion 25 versionCode 1 versionName '1.0' } @@ -17,5 +17,5 @@ android { dependencies { compile project(':cropper') - compile 'com.android.support:appcompat-v7:24.2.1' + compile 'com.android.support:appcompat-v7:25.3.1' } From 19b519e0b6fe1bb4e765a7d81e217702c78215f8 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Mon, 10 Apr 2017 12:05:55 +0300 Subject: [PATCH 016/117] minor name refactor after PR merge --- .../com/theartofdev/edmodo/cropper/CropImageView.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java index 98b98a3d..4f2766b2 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java @@ -121,7 +121,7 @@ public class CropImageView extends FrameLayout { /** * callback to be invoked when crop overlay is released. */ - private OnSetCropOverlayReleasedListener mOnSetCropOverlayReleasedListener; + private OnSetCropOverlayReleasedListener mOnCropOverlayReleasedListener; /** * callback to be invoked when image async loading is complete. @@ -274,8 +274,8 @@ public CropImageView(Context context, AttributeSet attrs) { @Override public void onCropWindowChanged(boolean inProgress) { handleCropWindowChanged(inProgress, true); - if(!inProgress){ - mOnSetCropOverlayReleasedListener.onCropOverlayReleased(getCropRect()); + if (!inProgress) { + mOnCropOverlayReleasedListener.onCropOverlayReleased(getCropRect()); } } }); @@ -755,7 +755,7 @@ public void saveCroppedImageAsync(Uri saveUri, Bitmap.CompressFormat saveCompres * Set the callback t */ public void setOnSetCropOverlayReleasedListener(OnSetCropOverlayReleasedListener listener) { - mOnSetCropOverlayReleasedListener = listener; + mOnCropOverlayReleasedListener = listener; } /** @@ -1631,7 +1631,8 @@ public enum RequestSizeOptions { /** * Interface definition for a callback to be invoked when the crop overlay is released. */ - public interface OnSetCropOverlayReleasedListener{ + public interface OnSetCropOverlayReleasedListener { + /** * Called when the crop overlay changed listener is called and inProgress is false. * From f93fce26f3102d58134d7e9209c44fd6e656d0f5 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Mon, 10 Apr 2017 12:28:18 +0300 Subject: [PATCH 017/117] add chinese translation strings from @bobingxin PR --- cropper/src/main/res/values-zh/strings.xml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 cropper/src/main/res/values-zh/strings.xml diff --git a/cropper/src/main/res/values-zh/strings.xml b/cropper/src/main/res/values-zh/strings.xml new file mode 100644 index 00000000..7282f19a --- /dev/null +++ b/cropper/src/main/res/values-zh/strings.xml @@ -0,0 +1,7 @@ + + + 逆时针旋转 + 顺时针旋转 + 裁剪 + 选择图片 + \ No newline at end of file From 9ed46cbf9875db68a1489ce2646b13e2c05f2324 Mon Sep 17 00:00:00 2001 From: tibbi Date: Mon, 10 Apr 2017 23:02:47 +0200 Subject: [PATCH 018/117] Allow flipping images horizontally and vertically --- .../cropper/BitmapCroppingWorkerTask.java | 25 ++++-- .../edmodo/cropper/BitmapUtils.java | 41 +++++++--- .../edmodo/cropper/CropImageOptions.java | 16 ++++ .../edmodo/cropper/CropImageView.java | 77 +++++++++++++++--- .../edmodo/cropper/CropOverlayView.java | 40 +++++++++ .../drawable-hdpi/crop_image_menu_flip.png | Bin 0 -> 262 bytes .../drawable-xhdpi/crop_image_menu_flip.png | Bin 0 -> 259 bytes .../drawable-xxhdpi/crop_image_menu_flip.png | Bin 0 -> 417 bytes .../drawable-xxxhdpi/crop_image_menu_flip.png | Bin 0 -> 508 bytes cropper/src/main/res/values/attrs.xml | 2 + .../cropper/sample/CropImageViewOptions.java | 4 + .../edmodo/cropper/sample/MainFragment.java | 10 +++ sample/src/main/res/menu/main.xml | 18 +++- sample/src/main/res/values/strings.xml | 3 + 14 files changed, 206 insertions(+), 30 deletions(-) create mode 100644 cropper/src/main/res/drawable-hdpi/crop_image_menu_flip.png create mode 100644 cropper/src/main/res/drawable-xhdpi/crop_image_menu_flip.png create mode 100644 cropper/src/main/res/drawable-xxhdpi/crop_image_menu_flip.png create mode 100644 cropper/src/main/res/drawable-xxxhdpi/crop_image_menu_flip.png diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapCroppingWorkerTask.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapCroppingWorkerTask.java index e5c7a7e2..702da115 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapCroppingWorkerTask.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapCroppingWorkerTask.java @@ -91,6 +91,16 @@ final class BitmapCroppingWorkerTask extends AsyncTask(cropImageView); @@ -128,6 +138,8 @@ final class BitmapCroppingWorkerTask extends AsyncTask(cropImageView); @@ -154,6 +166,8 @@ final class BitmapCroppingWorkerTask extends AsyncTask(new BitmapCroppingWorkerTask(this, mLoadedImageUri, getCropPoints(), mDegreesRotated, orgWidth, orgHeight, mCropOverlayView.isFixAspectRatio(), mCropOverlayView.getAspectRatioX(), mCropOverlayView.getAspectRatioY(), - reqWidth, reqHeight, options, + reqWidth, reqHeight, mCropOverlayView.getIsFlippedHorizontally(), mCropOverlayView.getIsFlippedVertically(), options, saveUri, saveCompressFormat, saveCompressQuality)); } else { mBitmapCroppingWorkerTask = new WeakReference<>(new BitmapCroppingWorkerTask(this, mBitmap, getCropPoints(), mDegreesRotated, mCropOverlayView.isFixAspectRatio(), mCropOverlayView.getAspectRatioX(), mCropOverlayView.getAspectRatioY(), - reqWidth, reqHeight, options, + reqWidth, reqHeight, mCropOverlayView.getIsFlippedHorizontally(), mCropOverlayView.getIsFlippedVertically(), options, saveUri, saveCompressFormat, saveCompressQuality)); } mBitmapCroppingWorkerTask.get().execute(); @@ -1143,6 +1190,8 @@ public Parcelable onSaveInstanceState() { bundle.putString("CROP_SHAPE", mCropOverlayView.getCropShape().name()); bundle.putBoolean("CROP_AUTO_ZOOM_ENABLED", mAutoZoomEnabled); bundle.putInt("CROP_MAX_ZOOM", mMaxZoom); + bundle.putBoolean("CROP_FLIP_HORIZONTALLY", mCropOverlayView.getIsFlippedHorizontally()); + bundle.putBoolean("CROP_FLIP_VERTICALLY", mCropOverlayView.getIsFlippedVertically()); return bundle; } @@ -1197,6 +1246,9 @@ public void onRestoreInstanceState(Parcelable state) { mAutoZoomEnabled = bundle.getBoolean("CROP_AUTO_ZOOM_ENABLED"); mMaxZoom = bundle.getInt("CROP_MAX_ZOOM"); + + mCropOverlayView.setFlipHorizontally(bundle.getBoolean("CROP_FLIP_HORIZONTALLY")); + mCropOverlayView.setFlipVertically(bundle.getBoolean("CROP_FLIP_VERTICALLY")); } super.onRestoreInstanceState(bundle.getParcelable("instanceState")); @@ -1390,7 +1442,9 @@ private void applyImageMatrix(float width, float height, boolean center, boolean } // scale by the current zoom level - mImageMatrix.postScale(mZoom, mZoom, BitmapUtils.getRectCenterX(mImagePoints), BitmapUtils.getRectCenterY(mImagePoints)); + float scaleX = mCropOverlayView.getIsFlippedHorizontally() ? -mZoom : mZoom; + float scaleY = mCropOverlayView.getIsFlippedVertically() ? -mZoom : mZoom; + mImageMatrix.postScale(scaleX, scaleY, BitmapUtils.getRectCenterX(mImagePoints), BitmapUtils.getRectCenterY(mImagePoints)); mapImagePointsByImageMatrix(); mImageMatrix.mapRect(cropRect); @@ -1398,20 +1452,21 @@ private void applyImageMatrix(float width, float height, boolean center, boolean if (center) { // set the zoomed area to be as to the center of cropping window as possible mZoomOffsetX = width > BitmapUtils.getRectWidth(mImagePoints) ? 0 - : Math.max(Math.min(width / 2 - cropRect.centerX(), -BitmapUtils.getRectLeft(mImagePoints)), getWidth() - BitmapUtils.getRectRight(mImagePoints)) / mZoom; + : Math.max(Math.min(width / 2 - cropRect.centerX(), -BitmapUtils.getRectLeft(mImagePoints)), getWidth() - BitmapUtils.getRectRight(mImagePoints)) / scaleX; mZoomOffsetY = height > BitmapUtils.getRectHeight(mImagePoints) ? 0 - : Math.max(Math.min(height / 2 - cropRect.centerY(), -BitmapUtils.getRectTop(mImagePoints)), getHeight() - BitmapUtils.getRectBottom(mImagePoints)) / mZoom; + : Math.max(Math.min(height / 2 - cropRect.centerY(), -BitmapUtils.getRectTop(mImagePoints)), getHeight() - BitmapUtils.getRectBottom(mImagePoints)) / scaleY; } else { // adjust the zoomed area so the crop window rectangle will be inside the area in case it was moved outside - mZoomOffsetX = Math.min(Math.max(mZoomOffsetX * mZoom, -cropRect.left), -cropRect.right + width) / mZoom; - mZoomOffsetY = Math.min(Math.max(mZoomOffsetY * mZoom, -cropRect.top), -cropRect.bottom + height) / mZoom; + mZoomOffsetX = Math.min(Math.max(mZoomOffsetX * scaleX, -cropRect.left), -cropRect.right + width) / scaleX; + mZoomOffsetY = Math.min(Math.max(mZoomOffsetY * scaleY, -cropRect.top), -cropRect.bottom + height) / scaleY; } // apply to zoom offset translate and update the crop rectangle to offset correctly - mImageMatrix.postTranslate(mZoomOffsetX * mZoom, mZoomOffsetY * mZoom); - cropRect.offset(mZoomOffsetX * mZoom, mZoomOffsetY * mZoom); + mImageMatrix.postTranslate(mZoomOffsetX * scaleX, mZoomOffsetY * scaleY); + cropRect.offset(mZoomOffsetX * scaleX, mZoomOffsetY * scaleY); mCropOverlayView.setCropWindowRect(cropRect); mapImagePointsByImageMatrix(); + mCropOverlayView.invalidate(); // set matrix to apply if (animate) { diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropOverlayView.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropOverlayView.java index 0d2ac520..eb3c9d8b 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropOverlayView.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropOverlayView.java @@ -158,6 +158,16 @@ public class CropOverlayView extends View { */ private float mTargetAspectRatio = ((float) mAspectRatioX) / mAspectRatioY; + /** + * Flag indicating if the image should be flipped horizontally + */ + private boolean mFlipHorizontally; + + /** + * Flag indicating if the image should be flipped vertically + */ + private boolean mFlipVertically; + /** * Instance variables for customizable attributes */ @@ -379,6 +389,34 @@ public void setAspectRatioY(int aspectRatioY) { } } + /** + * whether the image is flipped horizontally + */ + public boolean getIsFlippedHorizontally() { + return mFlipHorizontally; + } + + /** + * Sets whether the image should be flipped horizontally + */ + public void setFlipHorizontally(boolean flipHorizontally) { + mFlipHorizontally = flipHorizontally; + } + + /** + * whether the image is flipped vertically + */ + public boolean getIsFlippedVertically() { + return mFlipVertically; + } + + /** + * Sets whether the image should be flipped vertically + */ + public void setFlipVertically(boolean flipVertically) { + mFlipVertically = flipVertically; + } + /** * An edge of the crop window will snap to the corresponding edge of a * specified bounding box when the crop window edge is less than or equal to @@ -476,6 +514,8 @@ public void setInitialAttributeValues(CropImageOptions options) { setAspectRatioY(options.aspectRatioY); + setFlipHorizontally(options.flipHorizontally); + setMultiTouchEnabled(options.multiTouchEnabled); mTouchRadius = options.touchRadius; diff --git a/cropper/src/main/res/drawable-hdpi/crop_image_menu_flip.png b/cropper/src/main/res/drawable-hdpi/crop_image_menu_flip.png new file mode 100644 index 0000000000000000000000000000000000000000..133395df364ccbc3a7e6356252a911d3adbb604b GIT binary patch literal 262 zcmV+h0r~!kP)r6oV>^ zwVy-JQwj3jDNd!eSn4abduH{DS7Jy0Ua@;&DHBACT8mmSEo#NIs1?(qzAu)vWva!S zK^w+$W>IX6w7JI6i#G6&RHKP;m+~`%>h#dXMlVnYWofaL!_B{m7s({l@QL1$Hvj+t M07*qoM6N<$f&|cTX8-^I literal 0 HcmV?d00001 diff --git a/cropper/src/main/res/drawable-xhdpi/crop_image_menu_flip.png b/cropper/src/main/res/drawable-xhdpi/crop_image_menu_flip.png new file mode 100644 index 0000000000000000000000000000000000000000..79910ffe0c869d2f4d2795b47ef54af881a12cb7 GIT binary patch literal 259 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY0wn)GsXhawPIrZ2?`LbIhK+*@W#6`pSe`ijBR)z4*} HQ$iB}?Eq(9 literal 0 HcmV?d00001 diff --git a/cropper/src/main/res/drawable-xxhdpi/crop_image_menu_flip.png b/cropper/src/main/res/drawable-xxhdpi/crop_image_menu_flip.png new file mode 100644 index 0000000000000000000000000000000000000000..3629e38d1dc73f6bd80c3551fa16a9135a3dcbc8 GIT binary patch literal 417 zcmeAS@N?(olHy`uVBq!ia0vp^IUvlz0wh)Q=esd5FlKnVIEGX(zP)33N~%zx?c>`L z?Ld9u2od{>k2}mKtaUx2{M2C4wABK^b}zqcD{Yoi|FkFnxBHJ!V=?Qa|K*Z-j9-PN zi>%K(_&WNs-(Ua4LoJ-bYCaJsCz(pW+FvHtU~6_{`I^W8JASig2YTIu+Y|ct@7$FB zh37^Kw}X_#ftjnca}MQuus2(Wir<*Qy`<$}XQE75!xn=Zu8FGKuWV?mRSMbW~IJ&5bnI1XkxVlgtF(Xtwj#A(zt6y?Wd3 u6;^Zc^A?})ToChr`qw^NZ;;6On|-w&d+>q$zt4a{&*16m=d#Wzp$PzIZ|#yFrQ1KM8XFtG7JBdX zzpnFtB8SQZ2PRH9A*!>&BJgwS-3F^a|IW24XCM2^+q`xx9n$JOLJtw4IG^CITEQmYv|<(iq^d;WTH+g*N6a&CiUw3Niv~ zJ~4(WHuC*!@KbC&_p{;E1c&W44*8!VL_HK5S%eV8io@Sok+>iU3`L(JdYRzvg}D65 zMlBRyaAF9kOgO#@*`J&$7w+2s{lBOCyj#sZLzRH3{28)B88i7ae5CnaI8Nl(*vQYm zMfE9*R;CkU?9Zv<8ixF=CaO=_y#8=9e{p`rtYNrV&gQ~Y&6WBKTn_e?ZE)b<*5gsj zxHoLmqXRQPgg&ebxsLQ E0OOCgjQ{`u literal 0 HcmV?d00001 diff --git a/cropper/src/main/res/values/attrs.xml b/cropper/src/main/res/values/attrs.xml index d1622b03..5719ac98 100644 --- a/cropper/src/main/res/values/attrs.xml +++ b/cropper/src/main/res/values/attrs.xml @@ -42,6 +42,8 @@ + + \ No newline at end of file diff --git a/sample/src/main/java/com/theartofdev/edmodo/cropper/sample/CropImageViewOptions.java b/sample/src/main/java/com/theartofdev/edmodo/cropper/sample/CropImageViewOptions.java index ae27807a..9f0400af 100644 --- a/sample/src/main/java/com/theartofdev/edmodo/cropper/sample/CropImageViewOptions.java +++ b/sample/src/main/java/com/theartofdev/edmodo/cropper/sample/CropImageViewOptions.java @@ -40,4 +40,8 @@ final class CropImageViewOptions { public boolean showCropOverlay; public boolean showProgressBar; + + public boolean flipHorizontally; + + public boolean flipVertically; } diff --git a/sample/src/main/java/com/theartofdev/edmodo/cropper/sample/MainFragment.java b/sample/src/main/java/com/theartofdev/edmodo/cropper/sample/MainFragment.java index 731fe2b1..41434291 100644 --- a/sample/src/main/java/com/theartofdev/edmodo/cropper/sample/MainFragment.java +++ b/sample/src/main/java/com/theartofdev/edmodo/cropper/sample/MainFragment.java @@ -76,6 +76,8 @@ public void setCropImageViewOptions(CropImageViewOptions options) { mCropImageView.setShowProgressBar(options.showProgressBar); mCropImageView.setAutoZoomEnabled(options.autoZoomEnabled); mCropImageView.setMaxZoom(options.maxZoomLevel); + mCropImageView.setFlippedHorizontally(options.flipHorizontally); + mCropImageView.setFlippedVertically(options.flipVertically); } /** @@ -103,6 +105,8 @@ public void updateCurrentCropViewOptions() { options.showProgressBar = mCropImageView.isShowProgressBar(); options.autoZoomEnabled = mCropImageView.isAutoZoomEnabled(); options.maxZoomLevel = mCropImageView.getMaxZoom(); + options.flipHorizontally = mCropImageView.isFlippedHorizontally(); + options.flipVertically = mCropImageView.isFlippedVertically(); ((MainActivity) getActivity()).setCurrentOptions(options); } @@ -161,6 +165,12 @@ public boolean onOptionsItemSelected(MenuItem item) { } else if (item.getItemId() == R.id.main_action_rotate) { mCropImageView.rotateImage(90); return true; + } else if (item.getItemId() == R.id.main_action_flip_horizontally) { + mCropImageView.flipImageHorizontally(); + return true; + } else if (item.getItemId() == R.id.main_action_flip_vertically) { + mCropImageView.flipImageVertically(); + return true; } return super.onOptionsItemSelected(item); } diff --git a/sample/src/main/res/menu/main.xml b/sample/src/main/res/menu/main.xml index 7698c09d..35e28a81 100644 --- a/sample/src/main/res/menu/main.xml +++ b/sample/src/main/res/menu/main.xml @@ -1,11 +1,25 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> + + + + + + + CROP Rotate 90 degrees clockwise + Flip + Flip horizontally + Flip vertically Crop View Presets Circular Rectangular From 70bdd5267dd8671c0072532b6692fcb50f0d1c93 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Mon, 10 Apr 2017 15:26:38 +0300 Subject: [PATCH 019/117] remove deprecated code --- .../edmodo/cropper/CropImageView.java | 108 ++---------------- 1 file changed, 8 insertions(+), 100 deletions(-) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java index 87fc8635..6aab3a49 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java @@ -133,18 +133,6 @@ public class CropImageView extends FrameLayout { */ private OnCropImageCompleteListener mOnCropImageCompleteListener; - /** - * callback to be invoked when image async cropping is complete (get bitmap) - */ - @Deprecated - private OnGetCroppedImageCompleteListener mOnGetCroppedImageCompleteListener; - - /** - * callback to be invoked when image async cropping is complete (save to uri) - */ - @Deprecated - private OnSaveCroppedImageCompleteListener mOnSaveCroppedImageCompleteListener; - /** * The URI that the image was loaded from (if loaded from URI) */ @@ -693,7 +681,7 @@ public Bitmap getCroppedImage(int reqWidth, int reqHeight, RequestSizeOptions op /** * Gets the cropped image based on the current crop window.
- * The result will be invoked to listener set by {@link #setOnGetCroppedImageCompleteListener(OnGetCroppedImageCompleteListener)}. + * The result will be invoked to listener set by {@link #setOnCropImageCompleteListener(OnCropImageCompleteListener)}. */ public void getCroppedImageAsync() { getCroppedImageAsync(0, 0, RequestSizeOptions.NONE); @@ -720,7 +708,7 @@ public void getCroppedImageAsync(int reqWidth, int reqHeight) { * @param options the resize method to use, see its documentation */ public void getCroppedImageAsync(int reqWidth, int reqHeight, RequestSizeOptions options) { - if (mOnCropImageCompleteListener == null && mOnGetCroppedImageCompleteListener == null) { + if (mOnCropImageCompleteListener == null) { throw new IllegalArgumentException("mOnCropImageCompleteListener is not set"); } startCropWorkerTask(reqWidth, reqHeight, options, null, null, 0); @@ -729,7 +717,7 @@ public void getCroppedImageAsync(int reqWidth, int reqHeight, RequestSizeOptions /** * Save the cropped image based on the current crop window to the given uri.
* Uses JPEG image compression with 90 compression quality.
- * The result will be invoked to listener set by {@link #setOnGetCroppedImageCompleteListener(OnGetCroppedImageCompleteListener)}. + * The result will be invoked to listener set by {@link #setOnCropImageCompleteListener(OnCropImageCompleteListener)}. * * @param saveUri the Android Uri to save the cropped image to */ @@ -739,7 +727,7 @@ public void saveCroppedImageAsync(Uri saveUri) { /** * Save the cropped image based on the current crop window to the given uri.
- * The result will be invoked to listener set by {@link #setOnGetCroppedImageCompleteListener(OnGetCroppedImageCompleteListener)}. + * The result will be invoked to listener set by {@link #setOnCropImageCompleteListener(OnCropImageCompleteListener)}. * * @param saveUri the Android Uri to save the cropped image to * @param saveCompressFormat the compression format to use when writing the image @@ -752,7 +740,7 @@ public void saveCroppedImageAsync(Uri saveUri, Bitmap.CompressFormat saveCompres /** * Save the cropped image based on the current crop window to the given uri.
* Uses {@link RequestSizeOptions#RESIZE_INSIDE} option.
- * The result will be invoked to listener set by {@link #setOnGetCroppedImageCompleteListener(OnGetCroppedImageCompleteListener)}. + * The result will be invoked to listener set by {@link #setOnCropImageCompleteListener(OnCropImageCompleteListener)}. * * @param saveUri the Android Uri to save the cropped image to * @param saveCompressFormat the compression format to use when writing the image @@ -766,7 +754,7 @@ public void saveCroppedImageAsync(Uri saveUri, Bitmap.CompressFormat saveCompres /** * Save the cropped image based on the current crop window to the given uri.
- * The result will be invoked to listener set by {@link #setOnGetCroppedImageCompleteListener(OnGetCroppedImageCompleteListener)}. + * The result will be invoked to listener set by {@link #setOnCropImageCompleteListener(OnCropImageCompleteListener)}. * * @param saveUri the Android Uri to save the cropped image to * @param saveCompressFormat the compression format to use when writing the image @@ -776,7 +764,7 @@ public void saveCroppedImageAsync(Uri saveUri, Bitmap.CompressFormat saveCompres * @param options the resize method to use, see its documentation */ public void saveCroppedImageAsync(Uri saveUri, Bitmap.CompressFormat saveCompressFormat, int saveCompressQuality, int reqWidth, int reqHeight, RequestSizeOptions options) { - if (mOnCropImageCompleteListener == null && mOnSaveCroppedImageCompleteListener == null) { + if (mOnCropImageCompleteListener == null) { throw new IllegalArgumentException("mOnCropImageCompleteListener is not set"); } startCropWorkerTask(reqWidth, reqHeight, options, saveUri, saveCompressFormat, saveCompressQuality); @@ -805,28 +793,6 @@ public void setOnCropImageCompleteListener(OnCropImageCompleteListener listener) mOnCropImageCompleteListener = listener; } - /** - * Set the callback to be invoked when image async get cropping image ({@link #getCroppedImageAsync()}) - * is complete (successful or failed). - * - * @deprecated use {@link #setOnCropImageCompleteListener(OnCropImageCompleteListener)}. - */ - @Deprecated - public void setOnGetCroppedImageCompleteListener(OnGetCroppedImageCompleteListener listener) { - mOnGetCroppedImageCompleteListener = listener; - } - - /** - * Set the callback to be invoked when image async save cropping image ({@link #saveCroppedImageAsync(Uri)}) - * is complete (successful or failed). - * - * @deprecated use {@link #setOnCropImageCompleteListener(OnCropImageCompleteListener)}. - */ - @Deprecated - public void setOnSaveCroppedImageCompleteListener(OnSaveCroppedImageCompleteListener listener) { - mOnSaveCroppedImageCompleteListener = listener; - } - /** * Sets a Bitmap as the content of the CropImageView. * @@ -1021,18 +987,6 @@ void onImageCroppingAsyncComplete(BitmapCroppingWorkerTask.Result result) { CropResult cropResult = new CropResult(result.bitmap, result.uri, result.error, getCropPoints(), getCropRect(), getRotatedDegrees(), result.sampleSize); listener.onCropImageComplete(this, cropResult); } - - if (result.isSave) { - OnSaveCroppedImageCompleteListener listener2 = mOnSaveCroppedImageCompleteListener; - if (listener2 != null) { - listener2.onSaveCroppedImageComplete(this, result.uri, result.error); - } - } else { - OnGetCroppedImageCompleteListener listener2 = mOnGetCroppedImageCompleteListener; - if (listener2 != null) { - listener2.onGetCroppedImageComplete(this, result.bitmap, result.error); - } - } } /** @@ -1116,7 +1070,7 @@ private void clearImageInt() { * Gets the cropped image based on the current crop window.
* If (reqWidth,reqHeight) is given AND image is loaded from URI cropping will try to use sample size to fit in * the requested width and height down-sampling if possible - optimization to get best size to quality.
- * The result will be invoked to listener set by {@link #setOnGetCroppedImageCompleteListener(OnGetCroppedImageCompleteListener)}. + * The result will be invoked to listener set by {@link #setOnCropImageCompleteListener(OnCropImageCompleteListener)}. * * @param reqWidth the width to resize the cropped image to (see options) * @param reqHeight the height to resize the cropped image to (see options) @@ -1732,52 +1686,6 @@ public interface OnCropImageCompleteListener { } //endregion - //region: Inner class: OnGetCroppedImageCompleteListener - - /** - * Interface definition for a callback to be invoked when image async cropping is complete. - * - * @deprecated use {@link #setOnCropImageCompleteListener(OnCropImageCompleteListener)} and {@link - * OnCropImageCompleteListener}. - */ - @Deprecated - public interface OnGetCroppedImageCompleteListener { - - /** - * Called when a crop image view has completed cropping image.
- * If cropping failed error parameter will contain the error. - * - * @param view The crop image view that cropping of image was complete. - * @param bitmap the cropped image bitmap (null if failed) - * @param error if error occurred during cropping will contain the error, otherwise null. - */ - void onGetCroppedImageComplete(CropImageView view, Bitmap bitmap, Exception error); - } - //endregion - - //region: Inner class: OnSaveCroppedImageCompleteListener - - /** - * Interface definition for a callback to be invoked when image async cropping is complete. - * - * @deprecated use {@link #setOnCropImageCompleteListener(OnCropImageCompleteListener)} and {@link - * OnCropImageCompleteListener}. - */ - @Deprecated - public interface OnSaveCroppedImageCompleteListener { - - /** - * Called when a crop image view has completed cropping image.
- * If cropping failed error parameter will contain the error. - * - * @param view The crop image view that cropping of image was complete. - * @param uri the cropped image uri (null if failed) - * @param error if error occurred during cropping will contain the error, otherwise null. - */ - void onSaveCroppedImageComplete(CropImageView view, Uri uri, Exception error); - } - //endregion - //region: Inner class: ActivityResult /** From 80e79709fa98b2110b968cfb8469ca0ee534d145 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Mon, 10 Apr 2017 15:28:31 +0300 Subject: [PATCH 020/117] update version and readme --- .travis.yml | 4 ++-- README.md | 38 +++++++++++++------------------------- cropper/build.gradle | 2 +- 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/.travis.yml b/.travis.yml index 591a41ef..07c5c2c5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,8 @@ sudo: false android: components: - - build-tools-24.0.1 - - android-24 + - build-tools-25.0.2 + - android-25 - extra-android-m2repository script: diff --git a/README.md b/README.md index 6b9ba568..68279569 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Android Image Cropper Include the library ``` - compile 'com.theartofdev.edmodo:android-image-cropper:2.3.+' + compile 'com.theartofdev.edmodo:android-image-cropper:2.4.+' ``` ### Using Activity @@ -29,12 +29,12 @@ Include the library 3. Start `CropImageActivity` using builder pattern from your activity ```java - CropImage.activity(imageUri) + CropImage.activity() .setGuidelines(CropImageView.Guidelines.ON) .start(this); // for fragment (DO NOT use `getActivity()`) - CropImage.activity(imageUri) + CropImage.activity() .start(getContext(), this); ``` @@ -67,9 +67,9 @@ Include the library 3. Set image to crop ```java - cropImageView.setImageBitmap(bitmap); - // or cropImageView.setImageUriAsync(uri); + // or (prefer using uri for performance and better user experience) + cropImageView.setImageBitmap(bitmap); ``` 4. Get cropped image @@ -107,31 +107,19 @@ For more information, see the [GitHub Wiki](https://github.com/ArthurHub/Android - [Adding auto-zoom feature to Android-Image-Cropper](https://theartofdev.com/2016/04/25/adding-auto-zoom-feature-to-android-image-cropper/) ## Change log +*2.4.0* + +- Super simple crop activity quick start flow that handles URI and permissions (huge thanks to @adwiv) +- Handle OOM error for cropping set bitmap object, previously only image set by URI handled OOM. +- Allows for rotation degrees to be negative, fixes operator-precedence-related bug in flipAxes computation (thx Tim Cooke) +- Added crop overlay released listener (thx Richard Yee) +- Removed deprecated listeners. + *2.3.1* - Fix image picker for xiaomi and huawei phones (thx @nicolabeghin) - Fix crop window get corrupted on `CropImageView` resize. -*2.3.0* - -- Change required width/height behavior to support resizing (inside/fit/exact) see wiki for details. -- Add sampling fallback to lower cropped image resolution on OOM error (if image loaded from URI). -- Setting aspect ratio will also set it to fixed, to help with confusion, add clear aspect ratio method. -- Add support for setting min/max crop result size in code on CropImageView. -- Fix cropping failing bug when skia fails region cropping. -- Add Fallback to Intent.ACTION_PICK if no intent found for Intent.ACTION_GET_CONTENT (thx geolyth) -- Multi touch support for cropping window (experimental, thx bbwharris) -- **BREAKING CHANGES**: - - If you previously used requested width/height the default behavior now is to resize inside the cropped image, to preserve the previous behavior you need to pass the SAMPLING option. - - `OnGetCroppedImageCompleteListener` and `OnSaveCroppedImageCompleteListener` is deprecated, use `OnCropImageCompleteListener` that combines the two and provides the result object as crop activity. - - Set aspect ratio also sets fixed aspect ratio to true, if this is not the desired behavior set the fix aspect ratio flag manually or call the method after calling set aspect ratio. - -*2.2.5* - -- Fix to webp file extension (thx Nathan) -- Fix wrong initial crop window when image contains exif data. -- Added corners to circular crop window, can be removed by setting `BorderCornerThickness` to 0. - See [full change log](https://github.com/ArthurHub/Android-Image-Cropper/wiki/Change-Log). ## License diff --git a/cropper/build.gradle b/cropper/build.gradle index 36d9bb71..77593f10 100644 --- a/cropper/build.gradle +++ b/cropper/build.gradle @@ -6,7 +6,7 @@ apply plugin: 'maven-publish' ext { PUBLISH_GROUP_ID = 'com.theartofdev.edmodo' PUBLISH_ARTIFACT_ID = 'android-image-cropper' - PUBLISH_VERSION = '2.3.1' + PUBLISH_VERSION = '2.4.0' // gradlew clean build generateRelease } From 9fc839c79b59ca0255f33982f8fbe38be715a04d Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Mon, 10 Apr 2017 15:46:06 +0300 Subject: [PATCH 021/117] Added originalUri and originalBitmap to CropResult object --- README.md | 1 + .../theartofdev/edmodo/cropper/CropImage.java | 17 ++++++--- .../edmodo/cropper/CropImageActivity.java | 3 +- .../edmodo/cropper/CropImageView.java | 36 +++++++++++++++++-- 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 68279569..ef51aca7 100644 --- a/README.md +++ b/README.md @@ -113,6 +113,7 @@ For more information, see the [GitHub Wiki](https://github.com/ArthurHub/Android - Handle OOM error for cropping set bitmap object, previously only image set by URI handled OOM. - Allows for rotation degrees to be negative, fixes operator-precedence-related bug in flipAxes computation (thx Tim Cooke) - Added crop overlay released listener (thx Richard Yee) +- Added originalUri and originalBitmap to CropResult object. - Removed deprecated listeners. *2.3.1* diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java index 80e307c4..11c815dd 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java @@ -196,8 +196,10 @@ public static Intent getPickImageChooserIntent(@NonNull Context context, CharSeq /** * Get the main Camera intent for capturing image using device camera app. - * If the outputFileUri is null, a default Uri will be created with {@link #getCaptureImageOutputUri(Context)}, so then - * you will be able to get the pictureUri using {@link #getPickImageResultUri(Context, Intent)}. Otherwise, it is just you use + * If the outputFileUri is null, a default Uri will be created with {@link #getCaptureImageOutputUri(Context)}, so + * then + * you will be able to get the pictureUri using {@link #getPickImageResultUri(Context, Intent)}. Otherwise, it is + * just you use * the Uri passed to this method. * * @param context used to access Android APIs, like content resolve, it is your activity/fragment/widget. @@ -844,21 +846,26 @@ public ActivityResult[] newArray(int size) { } }; - public ActivityResult(Bitmap bitmap, Uri uri, Exception error, float[] cropPoints, Rect cropRect, int rotation, int sampleSize) { - super(bitmap, uri, error, cropPoints, cropRect, rotation, sampleSize); + public ActivityResult(Uri originalUri, Uri uri, Exception error, + float[] cropPoints, Rect cropRect, int rotation, int sampleSize) { + super(null, originalUri, null, uri, error, cropPoints, cropRect, rotation, sampleSize); } protected ActivityResult(Parcel in) { super(null, + (Uri) in.readParcelable(Uri.class.getClassLoader()), + null, (Uri) in.readParcelable(Uri.class.getClassLoader()), (Exception) in.readSerializable(), in.createFloatArray(), (Rect) in.readParcelable(Rect.class.getClassLoader()), - in.readInt(), in.readInt()); + in.readInt(), + in.readInt()); } @Override public void writeToParcel(Parcel dest, int flags) { + dest.writeParcelable(getOriginalUri(), flags); dest.writeParcelable(getUri(), flags); dest.writeSerializable(getError()); dest.writeFloatArray(getCropPoints()); diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageActivity.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageActivity.java index ed62b9fa..59325448 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageActivity.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageActivity.java @@ -294,7 +294,8 @@ protected void setResultCancel() { * Get intent instance to be used for the result of this activity. */ protected Intent getResultIntent(Uri uri, Exception error, int sampleSize) { - CropImage.ActivityResult result = new CropImage.ActivityResult(null, + CropImage.ActivityResult result = new CropImage.ActivityResult( + mCropImageView.getImageUri(), uri, error, mCropImageView.getCropPoints(), diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java index 6aab3a49..a152e573 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java @@ -984,7 +984,8 @@ void onImageCroppingAsyncComplete(BitmapCroppingWorkerTask.Result result) { OnCropImageCompleteListener listener = mOnCropImageCompleteListener; if (listener != null) { - CropResult cropResult = new CropResult(result.bitmap, result.uri, result.error, getCropPoints(), getCropRect(), getRotatedDegrees(), result.sampleSize); + CropResult cropResult = new CropResult(mBitmap, mLoadedImageUri, result.bitmap, result.uri, result.error, + getCropPoints(), getCropRect(), getRotatedDegrees(), result.sampleSize); listener.onCropImageComplete(this, cropResult); } } @@ -1693,6 +1694,18 @@ public interface OnCropImageCompleteListener { */ public static class CropResult { + /** + * The image bitmap of the original image loaded for cropping.
+ * Null if uri used to load image or activity result is used. + */ + private final Bitmap mOriginalBitmap; + + /** + * The Android uri of the original image loaded for cropping.
+ * Null if bitmap was used to load image. + */ + private final Uri mOriginalUri; + /** * The cropped image bitmap result.
* Null if save cropped image was executed, no output requested or failure. @@ -1730,7 +1743,10 @@ public static class CropResult { */ private final int mSampleSize; - CropResult(Bitmap bitmap, Uri uri, Exception error, float[] cropPoints, Rect cropRect, int rotation, int sampleSize) { + CropResult(Bitmap originalBitmap, Uri originalUri, Bitmap bitmap, Uri uri, Exception error, + float[] cropPoints, Rect cropRect, int rotation, int sampleSize) { + mOriginalBitmap = originalBitmap; + mOriginalUri = originalUri; mBitmap = bitmap; mUri = uri; mError = error; @@ -1740,6 +1756,22 @@ public static class CropResult { mSampleSize = sampleSize; } + /** + * The image bitmap of the original image loaded for cropping.
+ * Null if uri used to load image or activity result is used. + */ + public Bitmap getOriginalBitmap() { + return mOriginalBitmap; + } + + /** + * The Android uri of the original image loaded for cropping.
+ * Null if bitmap was used to load image. + */ + public Uri getOriginalUri() { + return mOriginalUri; + } + /** * Is the result is success or error. */ From 9fd17d101e1ff5c7f8a9999a36ca078284f03ed3 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Mon, 10 Apr 2017 16:09:25 +0300 Subject: [PATCH 022/117] update readme --- README.md | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index ef51aca7..d194df39 100644 --- a/README.md +++ b/README.md @@ -24,32 +24,37 @@ Include the library 2. Add `CropImageActivity` into your AndroidManifest.xml ```xml + android:theme="@style/Base.Theme.AppCompat"/> ``` 3. Start `CropImageActivity` using builder pattern from your activity ```java + // start picker to get image for cropping and then use the image in cropping activity CropImage.activity() - .setGuidelines(CropImageView.Guidelines.ON) - .start(this); + .setGuidelines(CropImageView.Guidelines.ON) + .start(this); + + // start cropping activity for pre-acquired image saved on the device + CropImage.activity(imageUri) + .start(this); // for fragment (DO NOT use `getActivity()`) CropImage.activity() - .start(getContext(), this); + .start(getContext(), this); ``` 4. Override `onActivityResult` method in your activity to get crop result ```java @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) { - CropImage.ActivityResult result = CropImage.getActivityResult(data); - if (resultCode == RESULT_OK) { - Uri resultUri = result.getUri(); - } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) { - Exception error = result.getError(); - } + if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) { + CropImage.ActivityResult result = CropImage.getActivityResult(data); + if (resultCode == RESULT_OK) { + Uri resultUri = result.getUri(); + } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) { + Exception error = result.getError(); } + } } ``` @@ -58,11 +63,11 @@ Include the library ```xml + xmlns:custom="http://schemas.android.com/apk/res-auto" + android:id="@+id/cropImageView" + android:layout_width="match_parent" + android:layout_height="0dp" + android:layout_weight="1"/> ``` 3. Set image to crop @@ -74,9 +79,10 @@ Include the library 4. Get cropped image ```java - Bitmap cropped = cropImageView.getCroppedImage(); - // or (must subscribe to async event using cropImageView.setOnCropImageCompleteListener(listener)) + // subscribe to async event using cropImageView.setOnCropImageCompleteListener(listener) cropImageView.getCroppedImageAsync(); + // or + Bitmap cropped = cropImageView.getCroppedImage(); ``` ## Features From c18eb253225ad0b958543a3b4f04f7b4a35dc9e2 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Fri, 14 Apr 2017 13:11:47 +0300 Subject: [PATCH 023/117] fix NRE in mOnCropOverlayReleasedListener invoke --- .../java/com/theartofdev/edmodo/cropper/CropImageView.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java index a152e573..ae99ce92 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java @@ -264,8 +264,9 @@ public CropImageView(Context context, AttributeSet attrs) { @Override public void onCropWindowChanged(boolean inProgress) { handleCropWindowChanged(inProgress, true); - if (!inProgress) { - mOnCropOverlayReleasedListener.onCropOverlayReleased(getCropRect()); + OnSetCropOverlayReleasedListener listener = mOnCropOverlayReleasedListener; + if (listener != null && !inProgress) { + listener.onCropOverlayReleased(getCropRect()); } } }); From 2379516e2b13686e79889b8aaf6e836675f0b97c Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Fri, 14 Apr 2017 13:24:58 +0300 Subject: [PATCH 024/117] update readme with image flipping support --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d194df39..f98f1cdf 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,7 @@ Include the library ## Features - Built-in `CropImageActivity`. - Set cropping image as Bitmap, Resource or Android URI (Gallery, Camera, Dropbox, etc.). -- Image rotation during cropping. +- Image rotation/flipping during cropping. - Auto zoom-in/out to relevant cropping area. - Auto rotate bitmap by image Exif data. - Set result image min/max limits in pixels. @@ -116,6 +116,7 @@ For more information, see the [GitHub Wiki](https://github.com/ArthurHub/Android *2.4.0* - Super simple crop activity quick start flow that handles URI and permissions (huge thanks to @adwiv) +- Image vertical and horizontal flipping during cropping (huge thanks to @tibbi). - Handle OOM error for cropping set bitmap object, previously only image set by URI handled OOM. - Allows for rotation degrees to be negative, fixes operator-precedence-related bug in flipAxes computation (thx Tim Cooke) - Added crop overlay released listener (thx Richard Yee) From 80f50db75721f830a37cdadf995f8ff1bf507772 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Fri, 14 Apr 2017 13:38:04 +0300 Subject: [PATCH 025/117] handle rotation by 90 degrees to change horizontal/vertical flipping, otherwise the UX is strange --- .../java/com/theartofdev/edmodo/cropper/CropImageView.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java index ae99ce92..32271cc1 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java @@ -890,6 +890,11 @@ public void rotateImage(int degrees) { BitmapUtils.RECT.set(mCropOverlayView.getCropWindowRect()); float halfWidth = (flipAxes ? BitmapUtils.RECT.height() : BitmapUtils.RECT.width()) / 2f; float halfHeight = (flipAxes ? BitmapUtils.RECT.width() : BitmapUtils.RECT.height()) / 2f; + if (flipAxes) { + boolean isFlippedHorizontally = mCropOverlayView.getIsFlippedHorizontally(); + mCropOverlayView.setFlipHorizontally(mCropOverlayView.getIsFlippedVertically()); + mCropOverlayView.setFlipVertically(isFlippedHorizontally); + } mImageMatrix.invert(mImageInverseMatrix); From 289b241af39ddca5d20e18c4f6285531f14867cd Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Fri, 14 Apr 2017 13:59:05 +0300 Subject: [PATCH 026/117] handle flip during cropping of image loaded from URI --- .../java/com/theartofdev/edmodo/cropper/BitmapUtils.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapUtils.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapUtils.java index df426acf..33783db1 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapUtils.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapUtils.java @@ -296,7 +296,7 @@ static float getRectCenterY(float[] points) { /** * Get a rectangle for the given 4 points (x0,y0,x1,y1,x2,y2,x3,y3) by finding the min/max 2 points that - * contains the given 4 points and is a stright rectangle. + * contains the given 4 points and is a straight rectangle. */ static Rect getRectFromPoints(float[] points, int imageWidth, int imageHeight, boolean fixAspectRatio, int aspectRatioX, int aspectRatioY) { int left = Math.round(Math.max(0, getRectLeft(points))); @@ -404,7 +404,7 @@ private static BitmapSampled cropBitmap(Context context, Uri loadedImageUri, flo if (result != null) { try { // rotate the decoded region by the required amount - result = rotateBitmapInt(result, degreesRotated); + result = rotateAndFlipBitmapInt(result, degreesRotated, flipHorizontally, flipVertically); // rotating by 0, 90, 180 or 270 degrees doesn't require extra cropping if (degreesRotated % 90 != 0) { @@ -640,10 +640,11 @@ private static File getFileFromUri(Context context, Uri uri) { * Rotate the given bitmap by the given degrees.
* New bitmap is created and the old one is recycled. */ - private static Bitmap rotateBitmapInt(Bitmap bitmap, int degrees) { - if (degrees > 0) { + private static Bitmap rotateAndFlipBitmapInt(Bitmap bitmap, int degrees, boolean flipHorizontally, boolean flipVertically) { + if (degrees > 0 || flipHorizontally || flipVertically) { Matrix matrix = new Matrix(); matrix.setRotate(degrees); + matrix.postScale(flipHorizontally ? -1 : 1, flipVertically ? -1 : 1); Bitmap newBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false); if (newBitmap != bitmap) { bitmap.recycle(); From a18edfb0ec11cb5e068e33338c8e86b74a7df63f Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Fri, 14 Apr 2017 14:03:26 +0300 Subject: [PATCH 027/117] refactor use of flip and rotation by using set rotation first and then post scale for flipping --- .../theartofdev/edmodo/cropper/BitmapUtils.java | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapUtils.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapUtils.java index 33783db1..b986f2ed 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapUtils.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/BitmapUtils.java @@ -180,21 +180,10 @@ private static Bitmap cropBitmapObjectWithScale(Bitmap bitmap, float[] points, i // get the rectangle in original image that contains the required cropped area (larger for non rectangular crop) Rect rect = getRectFromPoints(points, bitmap.getWidth(), bitmap.getHeight(), fixAspectRatio, aspectRatioX, aspectRatioY); - if (degreesRotated == 90 || degreesRotated == 270) { - if (flipHorizontally != flipVertically) { - boolean temp = flipHorizontally; - flipHorizontally = flipVertically; - flipVertically = temp; - } - } - // crop and rotate the cropped image in one operation - float scaleX = flipHorizontally ? -scale : scale; - float scaleY = flipVertically ? -scale : scale; - Matrix matrix = new Matrix(); - matrix.setScale(scaleX, scaleY); - matrix.postRotate(degreesRotated, bitmap.getWidth() / 2, bitmap.getHeight() / 2); + matrix.setRotate(degreesRotated, bitmap.getWidth() / 2, bitmap.getHeight() / 2); + matrix.postScale(flipHorizontally ? -scale : scale, flipVertically ? -scale : scale); Bitmap result = Bitmap.createBitmap(bitmap, rect.left, rect.top, rect.width(), rect.height(), matrix, true); if (result == bitmap) { From e098a07a81677cb011a6165b00be74ff57bbe571 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Fri, 14 Apr 2017 14:28:46 +0300 Subject: [PATCH 028/117] refactor mFlipHorizontally/mFlipVertically to CropImageView instead of CropOverlayView reset flags in resetCropRect to prevent state leak between different image cropping --- .../edmodo/cropper/CropImageOptions.java | 2 +- .../edmodo/cropper/CropImageView.java | 61 +++++++++++++------ .../edmodo/cropper/CropOverlayView.java | 40 ------------ 3 files changed, 43 insertions(+), 60 deletions(-) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageOptions.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageOptions.java index 041ded2b..37049b40 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageOptions.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageOptions.java @@ -259,7 +259,7 @@ public CropImageOptions[] newArray(int size) { public boolean allowCounterRotation; /** - * the amount of degreees to rotate clockwise or counter-clockwise + * the amount of degrees to rotate clockwise or counter-clockwise */ public int rotationDegrees; diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java index 32271cc1..5425b010 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java @@ -81,8 +81,21 @@ public class CropImageView extends FrameLayout { private Bitmap mBitmap; + /** + * How much the image is rotated from original clockwise + */ private int mDegreesRotated; + /** + * if the image flipped horizontally + */ + private boolean mFlipHorizontally; + + /** + * if the image flipped vertically + */ + private boolean mFlipVertically; + private int mLayoutWidth; private int mLayoutHeight; @@ -252,6 +265,8 @@ public CropImageView(Context context, AttributeSet attrs) { mMaxZoom = options.maxZoom; mShowCropOverlay = options.showCropOverlay; mShowProgressBar = options.showProgressBar; + mFlipHorizontally = options.flipHorizontally; + mFlipVertically = options.flipVertically; LayoutInflater inflater = LayoutInflater.from(context); View v = inflater.inflate(R.layout.crop_image_view, this, true); @@ -412,28 +427,34 @@ public void setFixedAspectRatio(boolean fixAspectRatio) { * whether the image should be flipped horizontally */ public boolean isFlippedHorizontally() { - return mCropOverlayView.getIsFlippedHorizontally(); + return mFlipHorizontally; } /** * Sets whether the image should be flipped horizontally */ public void setFlippedHorizontally(boolean flipHorizontally) { - mCropOverlayView.setFlipHorizontally(flipHorizontally); + if (mFlipHorizontally != flipHorizontally) { + mFlipHorizontally = flipHorizontally; + applyImageMatrix(getWidth(), getHeight(), true, false); + } } /** * whether the image should be flipped vertically */ public boolean isFlippedVertically() { - return mCropOverlayView.getIsFlippedVertically(); + return mFlipVertically; } /** * Sets whether the image should be flipped vertically */ public void setFlippedVertically(boolean flipVertically) { - mCropOverlayView.setFlipVertically(flipVertically); + if (mFlipVertically != flipVertically) { + mFlipVertically = flipVertically; + applyImageMatrix(getWidth(), getHeight(), true, false); + } } /** @@ -618,6 +639,8 @@ public void resetCropRect() { mZoomOffsetX = 0; mZoomOffsetY = 0; mDegreesRotated = 0; + mFlipHorizontally = false; + mFlipVertically = false; applyImageMatrix(getWidth(), getHeight(), false, false); mCropOverlayView.resetCropWindowRect(); } @@ -666,12 +689,12 @@ public Bitmap getCroppedImage(int reqWidth, int reqHeight, RequestSizeOptions op BitmapUtils.cropBitmap(getContext(), mLoadedImageUri, getCropPoints(), mDegreesRotated, orgWidth, orgHeight, mCropOverlayView.isFixAspectRatio(), mCropOverlayView.getAspectRatioX(), mCropOverlayView.getAspectRatioY(), - reqWidth, reqHeight, mCropOverlayView.getIsFlippedHorizontally(), mCropOverlayView.getIsFlippedVertically()); + reqWidth, reqHeight, mFlipHorizontally, mFlipVertically); croppedBitmap = bitmapSampled.bitmap; } else { croppedBitmap = BitmapUtils.cropBitmapObjectHandleOOM(mBitmap, getCropPoints(), mDegreesRotated, mCropOverlayView.isFixAspectRatio(), mCropOverlayView.getAspectRatioX(), mCropOverlayView.getAspectRatioY(), - mCropOverlayView.getIsFlippedHorizontally(), mCropOverlayView.getIsFlippedVertically()).bitmap; + mFlipHorizontally, mFlipVertically).bitmap; } croppedBitmap = BitmapUtils.resizeBitmap(croppedBitmap, reqWidth, reqHeight, options); @@ -891,9 +914,9 @@ public void rotateImage(int degrees) { float halfWidth = (flipAxes ? BitmapUtils.RECT.height() : BitmapUtils.RECT.width()) / 2f; float halfHeight = (flipAxes ? BitmapUtils.RECT.width() : BitmapUtils.RECT.height()) / 2f; if (flipAxes) { - boolean isFlippedHorizontally = mCropOverlayView.getIsFlippedHorizontally(); - mCropOverlayView.setFlipHorizontally(mCropOverlayView.getIsFlippedVertically()); - mCropOverlayView.setFlipVertically(isFlippedHorizontally); + boolean isFlippedHorizontally = mFlipHorizontally; + mFlipHorizontally = mFlipVertically; + mFlipVertically = isFlippedHorizontally; } mImageMatrix.invert(mImageInverseMatrix); @@ -943,7 +966,7 @@ public void rotateImage(int degrees) { * Flips the image horizontally. */ public void flipImageHorizontally() { - mCropOverlayView.setFlipHorizontally(!mCropOverlayView.getIsFlippedHorizontally()); + mFlipHorizontally = !mFlipHorizontally; applyImageMatrix(getWidth(), getHeight(), true, false); } @@ -951,7 +974,7 @@ public void flipImageHorizontally() { * Flips the image vertically. */ public void flipImageVertically() { - mCropOverlayView.setFlipVertically(!mCropOverlayView.getIsFlippedVertically()); + mFlipVertically = !mFlipVertically; applyImageMatrix(getWidth(), getHeight(), true, false); } @@ -1105,12 +1128,12 @@ public void startCropWorkerTask(int reqWidth, int reqHeight, RequestSizeOptions mBitmapCroppingWorkerTask = new WeakReference<>(new BitmapCroppingWorkerTask(this, mLoadedImageUri, getCropPoints(), mDegreesRotated, orgWidth, orgHeight, mCropOverlayView.isFixAspectRatio(), mCropOverlayView.getAspectRatioX(), mCropOverlayView.getAspectRatioY(), - reqWidth, reqHeight, mCropOverlayView.getIsFlippedHorizontally(), mCropOverlayView.getIsFlippedVertically(), options, + reqWidth, reqHeight, mFlipHorizontally, mFlipVertically, options, saveUri, saveCompressFormat, saveCompressQuality)); } else { mBitmapCroppingWorkerTask = new WeakReference<>(new BitmapCroppingWorkerTask(this, mBitmap, getCropPoints(), mDegreesRotated, mCropOverlayView.isFixAspectRatio(), mCropOverlayView.getAspectRatioX(), mCropOverlayView.getAspectRatioY(), - reqWidth, reqHeight, mCropOverlayView.getIsFlippedHorizontally(), mCropOverlayView.getIsFlippedVertically(), options, + reqWidth, reqHeight, mFlipHorizontally, mFlipVertically, options, saveUri, saveCompressFormat, saveCompressQuality)); } mBitmapCroppingWorkerTask.get().execute(); @@ -1151,8 +1174,8 @@ public Parcelable onSaveInstanceState() { bundle.putString("CROP_SHAPE", mCropOverlayView.getCropShape().name()); bundle.putBoolean("CROP_AUTO_ZOOM_ENABLED", mAutoZoomEnabled); bundle.putInt("CROP_MAX_ZOOM", mMaxZoom); - bundle.putBoolean("CROP_FLIP_HORIZONTALLY", mCropOverlayView.getIsFlippedHorizontally()); - bundle.putBoolean("CROP_FLIP_VERTICALLY", mCropOverlayView.getIsFlippedVertically()); + bundle.putBoolean("CROP_FLIP_HORIZONTALLY", mFlipHorizontally); + bundle.putBoolean("CROP_FLIP_VERTICALLY", mFlipVertically); return bundle; } @@ -1208,8 +1231,8 @@ public void onRestoreInstanceState(Parcelable state) { mAutoZoomEnabled = bundle.getBoolean("CROP_AUTO_ZOOM_ENABLED"); mMaxZoom = bundle.getInt("CROP_MAX_ZOOM"); - mCropOverlayView.setFlipHorizontally(bundle.getBoolean("CROP_FLIP_HORIZONTALLY")); - mCropOverlayView.setFlipVertically(bundle.getBoolean("CROP_FLIP_VERTICALLY")); + mFlipHorizontally = bundle.getBoolean("CROP_FLIP_HORIZONTALLY"); + mFlipVertically = bundle.getBoolean("CROP_FLIP_VERTICALLY"); } super.onRestoreInstanceState(bundle.getParcelable("instanceState")); @@ -1403,8 +1426,8 @@ private void applyImageMatrix(float width, float height, boolean center, boolean } // scale by the current zoom level - float scaleX = mCropOverlayView.getIsFlippedHorizontally() ? -mZoom : mZoom; - float scaleY = mCropOverlayView.getIsFlippedVertically() ? -mZoom : mZoom; + float scaleX = mFlipHorizontally ? -mZoom : mZoom; + float scaleY = mFlipVertically ? -mZoom : mZoom; mImageMatrix.postScale(scaleX, scaleY, BitmapUtils.getRectCenterX(mImagePoints), BitmapUtils.getRectCenterY(mImagePoints)); mapImagePointsByImageMatrix(); diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropOverlayView.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropOverlayView.java index eb3c9d8b..0d2ac520 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropOverlayView.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropOverlayView.java @@ -158,16 +158,6 @@ public class CropOverlayView extends View { */ private float mTargetAspectRatio = ((float) mAspectRatioX) / mAspectRatioY; - /** - * Flag indicating if the image should be flipped horizontally - */ - private boolean mFlipHorizontally; - - /** - * Flag indicating if the image should be flipped vertically - */ - private boolean mFlipVertically; - /** * Instance variables for customizable attributes */ @@ -389,34 +379,6 @@ public void setAspectRatioY(int aspectRatioY) { } } - /** - * whether the image is flipped horizontally - */ - public boolean getIsFlippedHorizontally() { - return mFlipHorizontally; - } - - /** - * Sets whether the image should be flipped horizontally - */ - public void setFlipHorizontally(boolean flipHorizontally) { - mFlipHorizontally = flipHorizontally; - } - - /** - * whether the image is flipped vertically - */ - public boolean getIsFlippedVertically() { - return mFlipVertically; - } - - /** - * Sets whether the image should be flipped vertically - */ - public void setFlipVertically(boolean flipVertically) { - mFlipVertically = flipVertically; - } - /** * An edge of the crop window will snap to the corresponding edge of a * specified bounding box when the crop window edge is less than or equal to @@ -514,8 +476,6 @@ public void setInitialAttributeValues(CropImageOptions options) { setAspectRatioY(options.aspectRatioY); - setFlipHorizontally(options.flipHorizontally); - setMultiTouchEnabled(options.multiTouchEnabled); mTouchRadius = options.touchRadius; From 95a65e401212c068f96aa12051edeb99f92430a5 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Fri, 14 Apr 2017 14:38:11 +0300 Subject: [PATCH 029/117] support setting image flip on crop image activity builder --- .../theartofdev/edmodo/cropper/CropImage.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java index 11c815dd..f4fc4482 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java @@ -824,6 +824,24 @@ public ActivityBuilder setRotationDegrees(int rotationDegrees) { mOptions.rotationDegrees = rotationDegrees; return this; } + + /** + * whether the image should be flipped horizontally.
+ * Default: false + */ + public ActivityBuilder setFlipHorizontally(boolean flipHorizontally) { + mOptions.flipHorizontally = flipHorizontally; + return this; + } + + /** + * whether the image should be flipped vertically.
+ * Default: false + */ + public ActivityBuilder setFlipVertically(boolean flipVertically) { + mOptions.flipVertically = flipVertically; + return this; + } } //endregion From cd8a23d0f0dcd442359f796688e61642df430f48 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Fri, 14 Apr 2017 15:08:30 +0300 Subject: [PATCH 030/117] support image flip menu buttons on crop image activity, with allow switch default to true --- .../com/theartofdev/edmodo/cropper/CropImage.java | 9 +++++++++ .../edmodo/cropper/CropImageActivity.java | 13 +++++++++++++ .../edmodo/cropper/CropImageOptions.java | 8 ++++++++ cropper/src/main/res/menu/crop_image_menu.xml | 14 ++++++++++++++ cropper/src/main/res/values/strings.xml | 4 ++++ 5 files changed, 48 insertions(+) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java index f4fc4482..1602601c 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java @@ -806,6 +806,15 @@ public ActivityBuilder setAllowRotation(boolean allowRotation) { return this; } + /** + * if to allow flipping during cropping.
+ * Default: true + */ + public ActivityBuilder setAllowFlipping(boolean allowFlipping) { + mOptions.allowFlipping = allowFlipping; + return this; + } + /** * if to allow counter-clockwise rotation during cropping.
* Note: if rotation is disabled this option has no effect.
diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageActivity.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageActivity.java index 59325448..a3ee89f8 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageActivity.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageActivity.java @@ -118,6 +118,10 @@ public boolean onCreateOptionsMenu(Menu menu) { menu.findItem(R.id.crop_image_menu_rotate_left).setVisible(true); } + if (!mOptions.allowFlipping) { + menu.removeItem(R.id.crop_image_menu_flip); + } + Drawable cropIcon = null; try { cropIcon = ContextCompat.getDrawable(this, R.drawable.crop_image_menu_crop); @@ -130,6 +134,7 @@ public boolean onCreateOptionsMenu(Menu menu) { if (mOptions.activityMenuIconColor != 0) { updateMenuItemIconColor(menu, R.id.crop_image_menu_rotate_left, mOptions.activityMenuIconColor); updateMenuItemIconColor(menu, R.id.crop_image_menu_rotate_right, mOptions.activityMenuIconColor); + updateMenuItemIconColor(menu, R.id.crop_image_menu_flip, mOptions.activityMenuIconColor); if (cropIcon != null) { updateMenuItemIconColor(menu, R.id.crop_image_menu_crop, mOptions.activityMenuIconColor); } @@ -152,6 +157,14 @@ public boolean onOptionsItemSelected(MenuItem item) { rotateImage(mOptions.rotationDegrees); return true; } + if (item.getItemId() == R.id.crop_image_menu_flip_horizontally) { + mCropImageView.flipImageHorizontally(); + return true; + } + if (item.getItemId() == R.id.crop_image_menu_flip_vertically) { + mCropImageView.flipImageVertically(); + return true; + } if (item.getItemId() == android.R.id.home) { setResultCancel(); return true; diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageOptions.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageOptions.java index 37049b40..af869fa5 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageOptions.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageOptions.java @@ -253,6 +253,11 @@ public CropImageOptions[] newArray(int size) { */ public boolean allowRotation; + /** + * if to allow (all) flipping during cropping (activity) + */ + public boolean allowFlipping; + /** * if to allow counter-clockwise rotation during cropping (activity) */ @@ -328,6 +333,7 @@ public CropImageOptions() { initialCropWindowRectangle = null; initialRotation = -1; allowRotation = true; + allowFlipping = true; allowCounterRotation = false; rotationDegrees = 90; flipHorizontally = false; @@ -379,6 +385,7 @@ protected CropImageOptions(Parcel in) { initialCropWindowRectangle = in.readParcelable(Rect.class.getClassLoader()); initialRotation = in.readInt(); allowRotation = in.readByte() != 0; + allowFlipping = in.readByte() != 0; allowCounterRotation = in.readByte() != 0; rotationDegrees = in.readInt(); flipHorizontally = in.readByte() != 0; @@ -428,6 +435,7 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeParcelable(initialCropWindowRectangle, flags); dest.writeInt(initialRotation); dest.writeByte((byte) (allowRotation ? 1 : 0)); + dest.writeByte((byte) (allowFlipping ? 1 : 0)); dest.writeByte((byte) (allowCounterRotation ? 1 : 0)); dest.writeInt(rotationDegrees); dest.writeByte((byte) (flipHorizontally ? 1 : 0)); diff --git a/cropper/src/main/res/menu/crop_image_menu.xml b/cropper/src/main/res/menu/crop_image_menu.xml index 5ef0ba25..a95ca970 100644 --- a/cropper/src/main/res/menu/crop_image_menu.xml +++ b/cropper/src/main/res/menu/crop_image_menu.xml @@ -13,6 +13,20 @@ android:icon="@drawable/crop_image_menu_rotate_right" android:title="@string/crop_image_menu_rotate_right" app:showAsAction="ifRoom"/> + + + + + + Rotate counter clockwise Rotate Crop + Flip + Flip horizontally + Flip vertically + Select source From cdf2d4a220b7c4c4399a098bc83cda36233a5a8c Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Fri, 14 Apr 2017 15:41:58 +0300 Subject: [PATCH 031/117] fix ignoring image rotation data in `setImageBitmap(Bitmap, ExifInterface )` method --- .../java/com/theartofdev/edmodo/cropper/CropImageView.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java index 5425b010..9bcd49cf 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java @@ -838,15 +838,16 @@ public void setImageBitmap(Bitmap bitmap) { */ public void setImageBitmap(Bitmap bitmap, ExifInterface exif) { Bitmap setBitmap; + int degreesRotated = 0; if (bitmap != null && exif != null) { BitmapUtils.RotateBitmapResult result = BitmapUtils.rotateBitmapByExif(bitmap, exif); setBitmap = result.bitmap; - mDegreesRotated = result.degrees; + degreesRotated = result.degrees; } else { setBitmap = bitmap; } mCropOverlayView.setInitialCropWindowRect(null); - setBitmap(setBitmap); + setBitmap(setBitmap, 0, null, 1, degreesRotated); } /** From 4e220cba19dacadedec8cbc4a1935acfa93bd48a Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Fri, 14 Apr 2017 16:06:01 +0300 Subject: [PATCH 032/117] fix `resetCropRect()` resetting image rotation to 0 instead of the original exif data --- .../com/theartofdev/edmodo/cropper/CropImageView.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java index 9bcd49cf..cfb3ec5e 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImageView.java @@ -81,6 +81,11 @@ public class CropImageView extends FrameLayout { private Bitmap mBitmap; + /** + * The image rotation value used during loading of the image so we can reset to it + */ + private int mInitialDegreesRotated; + /** * How much the image is rotated from original clockwise */ @@ -638,7 +643,7 @@ public void resetCropRect() { mZoom = 1; mZoomOffsetX = 0; mZoomOffsetY = 0; - mDegreesRotated = 0; + mDegreesRotated = mInitialDegreesRotated; mFlipHorizontally = false; mFlipVertically = false; applyImageMatrix(getWidth(), getHeight(), false, false); @@ -843,6 +848,7 @@ public void setImageBitmap(Bitmap bitmap, ExifInterface exif) { BitmapUtils.RotateBitmapResult result = BitmapUtils.rotateBitmapByExif(bitmap, exif); setBitmap = result.bitmap; degreesRotated = result.degrees; + mInitialDegreesRotated = result.degrees; } else { setBitmap = bitmap; } @@ -993,6 +999,7 @@ void onSetImageUriAsyncComplete(BitmapLoadingWorkerTask.Result result) { setProgressBarVisibility(); if (result.error == null) { + mInitialDegreesRotated = result.degreesRotated; setBitmap(result.bitmap, result.uri, result.loadSampleSize, result.degreesRotated); } From af6b0c3da64cedf71250b0cfddbb570fc7c8e37c Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Fri, 14 Apr 2017 16:08:17 +0300 Subject: [PATCH 033/117] update readme --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f98f1cdf..41b0f61a 100644 --- a/README.md +++ b/README.md @@ -116,11 +116,13 @@ For more information, see the [GitHub Wiki](https://github.com/ArthurHub/Android *2.4.0* - Super simple crop activity quick start flow that handles URI and permissions (huge thanks to @adwiv) -- Image vertical and horizontal flipping during cropping (huge thanks to @tibbi). +- Add image horizontal/vertical flipping during cropping (huge thanks to @tibbi). - Handle OOM error for cropping set bitmap object, previously only image set by URI handled OOM. - Allows for rotation degrees to be negative, fixes operator-precedence-related bug in flipAxes computation (thx Tim Cooke) - Added crop overlay released listener (thx Richard Yee) - Added originalUri and originalBitmap to CropResult object. +- Fix `resetCropRect()` resetting image rotation to 0 instead of the original exif data. +- Fix ignoring image rotation data in `setImageBitmap(Bitmap, ExifInterface )` method. - Removed deprecated listeners. *2.3.1* From ebd37f456985bef46aa8a2c3b634d6c9ff2cc1d3 Mon Sep 17 00:00:00 2001 From: Arthur Date: Fri, 14 Apr 2017 16:50:16 +0300 Subject: [PATCH 034/117] Add files via upload --- art/zoom sample small 2.gif | Bin 0 -> 148125 bytes art/zoom sample small 3.gif | Bin 0 -> 142424 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 art/zoom sample small 2.gif create mode 100644 art/zoom sample small 3.gif diff --git a/art/zoom sample small 2.gif b/art/zoom sample small 2.gif new file mode 100644 index 0000000000000000000000000000000000000000..a4aa7a2b67818d962466ca448eec23121e986bda GIT binary patch literal 148125 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 literal 0 HcmV?d00001 diff --git a/art/zoom sample small 3.gif b/art/zoom sample small 3.gif new file mode 100644 index 0000000000000000000000000000000000000000..05246472e75d3c5bd58e5303af3354004b41d635 GIT binary patch literal 142424 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 U(>pwv3Hfe1zY*ai=-h$-0@idr(EtDd literal 0 HcmV?d00001 From 1f3de0eb6cbbdcec53c643001f697f0212d5ea89 Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Fri, 21 Apr 2017 14:44:15 +0300 Subject: [PATCH 035/117] fix corners of crop overlay offset for oval shape resulting in confusing UI --- README.md | 4 ++++ .../java/com/theartofdev/edmodo/cropper/CropOverlayView.java | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 41b0f61a..0a182912 100644 --- a/README.md +++ b/README.md @@ -113,6 +113,10 @@ For more information, see the [GitHub Wiki](https://github.com/ArthurHub/Android - [Adding auto-zoom feature to Android-Image-Cropper](https://theartofdev.com/2016/04/25/adding-auto-zoom-feature-to-android-image-cropper/) ## Change log +*2.4.1* (WIP) + +- Fix corners of crop overlay offset for oval shape resulting in confusing UI (#256). + *2.4.0* - Super simple crop activity quick start flow that handles URI and permissions (huge thanks to @adwiv) diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropOverlayView.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropOverlayView.java index 0d2ac520..69eabe6d 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropOverlayView.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropOverlayView.java @@ -784,7 +784,10 @@ private void drawCorners(Canvas canvas) { float lineWidth = mBorderPaint != null ? mBorderPaint.getStrokeWidth() : 0; float cornerWidth = mBorderCornerPaint.getStrokeWidth(); - float w = cornerWidth / 2 + mBorderCornerOffset; + + // for rectangle crop shape we allow the corners to be offset from the borders + float w = cornerWidth / 2 + (mCropShape == CropImageView.CropShape.RECTANGLE ? mBorderCornerOffset : 0); + RectF rect = mCropWindowHandler.getRect(); rect.inset(w, w); From 6c10064dc875da27e680fe6a2debb3990045ef8b Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Fri, 21 Apr 2017 15:21:18 +0300 Subject: [PATCH 036/117] Add `start` method that accepts `android.app.Fragment`, annotated with ``@RequiresApi` 11 --- README.md | 1 + .../theartofdev/edmodo/cropper/CropImage.java | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/README.md b/README.md index 0a182912..37ac2e9a 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,7 @@ For more information, see the [GitHub Wiki](https://github.com/ArthurHub/Android *2.4.1* (WIP) - Fix corners of crop overlay offset for oval shape resulting in confusing UI (#256). +- Add `start` method that accepts `android.app.Fragment`, annotated with `@RequiresApi` 11 *2.4.0* diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java index 1602601c..b7c4ef10 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java @@ -35,6 +35,7 @@ import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.annotation.RequiresApi; import android.support.v4.app.Fragment; import java.io.File; @@ -462,6 +463,16 @@ public void start(@NonNull Context context, @NonNull Fragment fragment) { fragment.startActivityForResult(getIntent(context), CROP_IMAGE_ACTIVITY_REQUEST_CODE); } + /** + * Start {@link CropImageActivity}. + * + * @param fragment fragment to receive result + */ + @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) + public void start(@NonNull Context context, @NonNull android.app.Fragment fragment) { + fragment.startActivityForResult(getIntent(context), CROP_IMAGE_ACTIVITY_REQUEST_CODE); + } + /** * Start {@link CropImageActivity}. * @@ -471,6 +482,16 @@ public void start(@NonNull Context context, @NonNull Fragment fragment, @Nullabl fragment.startActivityForResult(getIntent(context, cls), CROP_IMAGE_ACTIVITY_REQUEST_CODE); } + /** + * Start {@link CropImageActivity}. + * + * @param fragment fragment to receive result + */ + @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) + public void start(@NonNull Context context, @NonNull android.app.Fragment fragment, @Nullable Class cls) { + fragment.startActivityForResult(getIntent(context, cls), CROP_IMAGE_ACTIVITY_REQUEST_CODE); + } + /** * The shape of the cropping window.
* To set square/circle crop shape set aspect ratio to 1:1.
From e4d3c4b52adbc2cc8d5386726a5f3cce0ccfd41c Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Sat, 22 Apr 2017 13:49:14 +0300 Subject: [PATCH 037/117] Fix support for negative rotation values for CropImageActivity --- README.md | 1 + .../main/java/com/theartofdev/edmodo/cropper/CropImage.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 37ac2e9a..092042f8 100644 --- a/README.md +++ b/README.md @@ -116,6 +116,7 @@ For more information, see the [GitHub Wiki](https://github.com/ArthurHub/Android *2.4.1* (WIP) - Fix corners of crop overlay offset for oval shape resulting in confusing UI (#256). +- Fix support for negative rotation values for CropImageActivity. - Add `start` method that accepts `android.app.Fragment`, annotated with `@RequiresApi` 11 *2.4.0* diff --git a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java index b7c4ef10..4584b56b 100644 --- a/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java +++ b/cropper/src/main/java/com/theartofdev/edmodo/cropper/CropImage.java @@ -814,7 +814,7 @@ public ActivityBuilder setInitialCropWindowRectangle(Rect initialCropWindowRecta * Default: NONE - will read image exif data */ public ActivityBuilder setInitialRotation(int initialRotation) { - mOptions.initialRotation = initialRotation; + mOptions.initialRotation = (initialRotation + 360) % 360; return this; } @@ -851,7 +851,7 @@ public ActivityBuilder setAllowCounterRotation(boolean allowCounterRotation) { * Default: 90 */ public ActivityBuilder setRotationDegrees(int rotationDegrees) { - mOptions.rotationDegrees = rotationDegrees; + mOptions.rotationDegrees = (rotationDegrees + 360) % 360; return this; } From 2d01115621db398e36c25d5426deaffaebf5e4ce Mon Sep 17 00:00:00 2001 From: Arthur Teplitzki Date: Sat, 22 Apr 2017 14:17:33 +0300 Subject: [PATCH 038/117] add test project to test dependency on the library from jcenter is working --- README.md | 7 +++ settings.gradle | 1 + test/.gitignore | 1 + test/build.gradle | 22 +++++++++ test/src/main/AndroidManifest.xml | 25 ++++++++++ .../edmodo/cropper/test/MainActivity.java | 45 ++++++++++++++++++ test/src/main/res/layout/activity_main.xml | 22 +++++++++ .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 4842 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 6114 bytes test/src/main/res/values/colors.xml | 6 +++ test/src/main/res/values/strings.xml | 3 ++ test/src/main/res/values/styles.xml | 11 +++++ 12 files changed, 143 insertions(+) create mode 100644 test/.gitignore create mode 100644 test/build.gradle create mode 100644 test/src/main/AndroidManifest.xml create mode 100644 test/src/main/java/com/theartofdev/edmodo/cropper/test/MainActivity.java create mode 100644 test/src/main/res/layout/activity_main.xml create mode 100644 test/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 test/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 test/src/main/res/values/colors.xml create mode 100644 test/src/main/res/values/strings.xml create mode 100644 test/src/main/res/values/styles.xml diff --git a/README.md b/README.md index 092042f8..706ec762 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,13 @@ Include the library compile 'com.theartofdev.edmodo:android-image-cropper:2.4.+' ``` +Add permissions to manifest + + ``` + + + ``` + ### Using Activity 2. Add `CropImageActivity` into your AndroidManifest.xml diff --git a/settings.gradle b/settings.gradle index 18154fe6..dc87507d 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,4 @@ +include ':test' include 'cropper' include 'sample' include 'quick-start' \ No newline at end of file diff --git a/test/.gitignore b/test/.gitignore new file mode 100644 index 00000000..796b96d1 --- /dev/null +++ b/test/.gitignore @@ -0,0 +1 @@ +/build diff --git a/test/build.gradle b/test/build.gradle new file mode 100644 index 00000000..bb6d490b --- /dev/null +++ b/test/build.gradle @@ -0,0 +1,22 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 25 + buildToolsVersion '25.0.2' + + defaultConfig { + minSdkVersion 11 + targetSdkVersion 25 + versionCode 1 + versionName '1.0' + } + lintOptions { + abortOnError false + } +} + +dependencies { + compile 'com.android.support:appcompat-v7:25.3.1' + compile 'com.theartofdev.edmodo:android-image-cropper:2.4.+' + +} diff --git a/test/src/main/AndroidManifest.xml b/test/src/main/AndroidManifest.xml new file mode 100644 index 00000000..491b03c8 --- /dev/null +++ b/test/src/main/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/src/main/java/com/theartofdev/edmodo/cropper/test/MainActivity.java b/test/src/main/java/com/theartofdev/edmodo/cropper/test/MainActivity.java new file mode 100644 index 00000000..4bf445a7 --- /dev/null +++ b/test/src/main/java/com/theartofdev/edmodo/cropper/test/MainActivity.java @@ -0,0 +1,45 @@ +package com.theartofdev.edmodo.cropper.test; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; +import android.view.View; +import android.widget.ImageView; +import android.widget.Toast; + +import com.example.test.R; +import com.theartofdev.edmodo.cropper.CropImage; +import com.theartofdev.edmodo.cropper.CropImageView; + +public class MainActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + } + + /** + * Start pick image activity with chooser. + */ + public void onSelectImageClick(View view) { + CropImage.activity(null) + .setGuidelines(CropImageView.Guidelines.ON) + .start(this); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + + // handle result of CropImageActivity + if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) { + CropImage.ActivityResult result = CropImage.getActivityResult(data); + if (resultCode == RESULT_OK) { + ((ImageView) findViewById(R.id.quick_start_cropped_image)).setImageURI(result.getUri()); + Toast.makeText(this, "Cropping successful, Sample: " + result.getSampleSize(), Toast.LENGTH_LONG).show(); + } else if (resultCode == CropImage.CROP_IMAGE_ACTIVITY_RESULT_ERROR_CODE) { + Toast.makeText(this, "Cropping failed: " + result.getError(), Toast.LENGTH_LONG).show(); + } + } + } +} diff --git a/test/src/main/res/layout/activity_main.xml b/test/src/main/res/layout/activity_main.xml new file mode 100644 index 00000000..b122edb3 --- /dev/null +++ b/test/src/main/res/layout/activity_main.xml @@ -0,0 +1,22 @@ + + +

pu#SJLTi4wDF0}m`? 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�IWUdvtj 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