From f586c94cf2e65cf73dd0044cfbfa48491de59f5f Mon Sep 17 00:00:00 2001 From: ZARA Date: Fri, 19 May 2023 14:44:54 +0330 Subject: [PATCH] #87 Support crop selection --- .../github/drjacky/imagepicker/ImagePicker.kt | 23 ++-- .../imagepicker/ImagePickerActivity.kt | 35 +++--- .../imagepicker/constant/ImageProvider.kt | 2 + .../drjacky/imagepicker/util/DialogHelper.kt | 10 +- .../src/main/res/layout/dialog_choose_app.xml | 101 ++++++++++-------- imagepicker/src/main/res/values/strings.xml | 1 + 6 files changed, 98 insertions(+), 74 deletions(-) diff --git a/imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/ImagePicker.kt b/imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/ImagePicker.kt index 76cfc22..1f3c40d 100644 --- a/imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/ImagePicker.kt +++ b/imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/ImagePicker.kt @@ -277,26 +277,30 @@ open class ImagePicker { fun createIntent(): Intent = Intent(activity, ImagePickerActivity::class.java).apply { putExtras(getBundle()) } - fun createIntentFromDialog( - onResult: (Intent) -> Unit - ) { + fun createIntentFromDialog(onResult: (Intent) -> Unit) { if (imageProvider == ImageProvider.BOTH) { DialogHelper.showChooseAppDialog( - context = activity, - listener = object : ResultListener { + context = activity, listener = object : ResultListener { override fun onResult(t: ImageProvider?) { t?.let { imageProvider = it + setImageProviderInterceptor { + setCrop(imageProvider) + } imageProviderInterceptor?.invoke(imageProvider) onResult(createIntent()) } } - }, - dismissListener + }, dismissListener ) } } + private fun setCrop(imageProvider: ImageProvider) { + crop = imageProvider == ImageProvider.CAMERA_WITH_CROP + || imageProvider == ImageProvider.GALLERY_WITH_CROP + } + /** * Get Bundle for ImagePickerActivity */ @@ -304,7 +308,6 @@ open class ImagePicker { return Bundle().apply { putSerializable(EXTRA_IMAGE_PROVIDER, imageProvider) putStringArray(EXTRA_MIME_TYPES, mimeTypes) - putBoolean(EXTRA_CROP_OVAL, cropOval) putBoolean(EXTRA_CROP_FREE_STYLE, cropFreeStyle) putBoolean(EXTRA_CROP, crop) @@ -312,13 +315,11 @@ open class ImagePicker { putFloat(EXTRA_CROP_X, cropX) putFloat(EXTRA_CROP_Y, cropY) putSerializable(EXTRA_OUTPUT_FORMAT, outputFormat) - putInt(EXTRA_MAX_WIDTH, maxWidth) putInt(EXTRA_MAX_HEIGHT, maxHeight) - putBoolean(EXTRA_KEEP_RATIO, keepRatio) } } } -} +} \ No newline at end of file diff --git a/imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/ImagePickerActivity.kt b/imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/ImagePickerActivity.kt index 119ec37..c319f33 100644 --- a/imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/ImagePickerActivity.kt +++ b/imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/ImagePickerActivity.kt @@ -114,23 +114,11 @@ class ImagePickerActivity : AppCompatActivity() { // Create Gallery/Camera Provider when (intent?.getSerializableExtra(ImagePicker.EXTRA_IMAGE_PROVIDER) as ImageProvider?) { - ImageProvider.GALLERY -> { - mGalleryProvider = GalleryProvider(this) { galleryLauncher.launch(it) } - // Pick Gallery Image - savedInstanceState ?: mGalleryProvider?.startIntent() - } - ImageProvider.CAMERA -> { - mCameraProvider = CameraProvider(this, false) { cameraLauncher.launch(it) } - mCameraProvider?.onRestoreInstanceState(savedInstanceState) - // Pick Camera Image - savedInstanceState ?: mCameraProvider?.startIntent() - } - ImageProvider.FRONT_CAMERA -> { - mCameraProvider = CameraProvider(this, true) { cameraLauncher.launch(it) } - mCameraProvider?.onRestoreInstanceState(savedInstanceState) - // Try Pick Front Camera Image - savedInstanceState ?: mCameraProvider?.startIntent() - } + ImageProvider.GALLERY -> pickGalleryImage(savedInstanceState) + ImageProvider.GALLERY_WITH_CROP -> pickGalleryImage(savedInstanceState) + ImageProvider.CAMERA -> pickCameraImage(savedInstanceState, false) + ImageProvider.CAMERA_WITH_CROP -> pickCameraImage(savedInstanceState, false) + ImageProvider.FRONT_CAMERA -> pickCameraImage(savedInstanceState, true) else -> { // Something went Wrong! This case should never happen Log.e(TAG, "Image provider can not be null") @@ -139,6 +127,19 @@ class ImagePickerActivity : AppCompatActivity() { } } + private fun pickGalleryImage(savedInstanceState: Bundle?) { + mGalleryProvider = GalleryProvider(this) { galleryLauncher.launch(it) } + // Pick Gallery Image + savedInstanceState ?: mGalleryProvider?.startIntent() + } + + private fun pickCameraImage(savedInstanceState: Bundle?, tryFrontCamera: Boolean) { + mCameraProvider = CameraProvider(this, tryFrontCamera) { cameraLauncher.launch(it) } + mCameraProvider?.onRestoreInstanceState(savedInstanceState) + // Pick Camera Image + savedInstanceState ?: mCameraProvider?.startIntent() + } + /** * Dispatch incoming result to the correct provider. */ diff --git a/imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/constant/ImageProvider.kt b/imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/constant/ImageProvider.kt index d5402c9..b489c54 100644 --- a/imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/constant/ImageProvider.kt +++ b/imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/constant/ImageProvider.kt @@ -9,7 +9,9 @@ package com.github.drjacky.imagepicker.constant */ enum class ImageProvider { GALLERY, + GALLERY_WITH_CROP, CAMERA, + CAMERA_WITH_CROP, FRONT_CAMERA, BOTH } diff --git a/imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/util/DialogHelper.kt b/imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/util/DialogHelper.kt index f5f2bd6..c1f961c 100644 --- a/imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/util/DialogHelper.kt +++ b/imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/util/DialogHelper.kt @@ -47,14 +47,18 @@ internal object DialogHelper { // Handle Camera option click customView.lytCameraPick.setOnClickListener { - listener.onResult(ImageProvider.CAMERA) + listener.onResult( + if (customView.displayCropCheckBox.isChecked) ImageProvider.CAMERA_WITH_CROP else ImageProvider.CAMERA + ) dialog.dismiss() } // Handle Gallery option click customView.lytGalleryPick.setOnClickListener { - listener.onResult(ImageProvider.GALLERY) + listener.onResult( + if (customView.displayCropCheckBox.isChecked) ImageProvider.GALLERY_WITH_CROP else ImageProvider.GALLERY + ) dialog.dismiss() } } -} +} \ No newline at end of file diff --git a/imagepicker/src/main/res/layout/dialog_choose_app.xml b/imagepicker/src/main/res/layout/dialog_choose_app.xml index 49a68e9..a0d51b7 100644 --- a/imagepicker/src/main/res/layout/dialog_choose_app.xml +++ b/imagepicker/src/main/res/layout/dialog_choose_app.xml @@ -3,58 +3,73 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content" - android:baselineAligned="false" - android:orientation="horizontal" + android:orientation="vertical" android:padding="16dp"> - - - - + + + android:layout_marginTop="10dp" + android:layout_weight="1" + android:gravity="center" + android:orientation="vertical"> - + - - - - - + + + + + android:layout_marginTop="10dp" + android:layout_weight="1" + android:gravity="center" + android:orientation="vertical"> + + + + + + + + \ No newline at end of file diff --git a/imagepicker/src/main/res/values/strings.xml b/imagepicker/src/main/res/values/strings.xml index 706e4c2..36c7fff 100644 --- a/imagepicker/src/main/res/values/strings.xml +++ b/imagepicker/src/main/res/values/strings.xml @@ -9,6 +9,7 @@ Cancel Gallery Camera + Display crop Permissions.]]>