Skip to content

Commit f586c94

Browse files
committed
#87 Support crop selection
1 parent e36fc8f commit f586c94

File tree

6 files changed

+98
-74
lines changed

6 files changed

+98
-74
lines changed

imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/ImagePicker.kt

+12-11
Original file line numberDiff line numberDiff line change
@@ -277,48 +277,49 @@ open class ImagePicker {
277277
fun createIntent(): Intent =
278278
Intent(activity, ImagePickerActivity::class.java).apply { putExtras(getBundle()) }
279279

280-
fun createIntentFromDialog(
281-
onResult: (Intent) -> Unit
282-
) {
280+
fun createIntentFromDialog(onResult: (Intent) -> Unit) {
283281
if (imageProvider == ImageProvider.BOTH) {
284282
DialogHelper.showChooseAppDialog(
285-
context = activity,
286-
listener = object : ResultListener<ImageProvider> {
283+
context = activity, listener = object : ResultListener<ImageProvider> {
287284
override fun onResult(t: ImageProvider?) {
288285
t?.let {
289286
imageProvider = it
287+
setImageProviderInterceptor {
288+
setCrop(imageProvider)
289+
}
290290
imageProviderInterceptor?.invoke(imageProvider)
291291
onResult(createIntent())
292292
}
293293
}
294-
},
295-
dismissListener
294+
}, dismissListener
296295
)
297296
}
298297
}
299298

299+
private fun setCrop(imageProvider: ImageProvider) {
300+
crop = imageProvider == ImageProvider.CAMERA_WITH_CROP
301+
|| imageProvider == ImageProvider.GALLERY_WITH_CROP
302+
}
303+
300304
/**
301305
* Get Bundle for ImagePickerActivity
302306
*/
303307
private fun getBundle(): Bundle {
304308
return Bundle().apply {
305309
putSerializable(EXTRA_IMAGE_PROVIDER, imageProvider)
306310
putStringArray(EXTRA_MIME_TYPES, mimeTypes)
307-
308311
putBoolean(EXTRA_CROP_OVAL, cropOval)
309312
putBoolean(EXTRA_CROP_FREE_STYLE, cropFreeStyle)
310313
putBoolean(EXTRA_CROP, crop)
311314
putBoolean(MULTIPLE_FILES_ALLOWED, isMultiple)
312315
putFloat(EXTRA_CROP_X, cropX)
313316
putFloat(EXTRA_CROP_Y, cropY)
314317
putSerializable(EXTRA_OUTPUT_FORMAT, outputFormat)
315-
316318
putInt(EXTRA_MAX_WIDTH, maxWidth)
317319
putInt(EXTRA_MAX_HEIGHT, maxHeight)
318-
319320
putBoolean(EXTRA_KEEP_RATIO, keepRatio)
320321
}
321322
}
322323
}
323324

324-
}
325+
}

imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/ImagePickerActivity.kt

+18-17
Original file line numberDiff line numberDiff line change
@@ -114,23 +114,11 @@ class ImagePickerActivity : AppCompatActivity() {
114114

115115
// Create Gallery/Camera Provider
116116
when (intent?.getSerializableExtra(ImagePicker.EXTRA_IMAGE_PROVIDER) as ImageProvider?) {
117-
ImageProvider.GALLERY -> {
118-
mGalleryProvider = GalleryProvider(this) { galleryLauncher.launch(it) }
119-
// Pick Gallery Image
120-
savedInstanceState ?: mGalleryProvider?.startIntent()
121-
}
122-
ImageProvider.CAMERA -> {
123-
mCameraProvider = CameraProvider(this, false) { cameraLauncher.launch(it) }
124-
mCameraProvider?.onRestoreInstanceState(savedInstanceState)
125-
// Pick Camera Image
126-
savedInstanceState ?: mCameraProvider?.startIntent()
127-
}
128-
ImageProvider.FRONT_CAMERA -> {
129-
mCameraProvider = CameraProvider(this, true) { cameraLauncher.launch(it) }
130-
mCameraProvider?.onRestoreInstanceState(savedInstanceState)
131-
// Try Pick Front Camera Image
132-
savedInstanceState ?: mCameraProvider?.startIntent()
133-
}
117+
ImageProvider.GALLERY -> pickGalleryImage(savedInstanceState)
118+
ImageProvider.GALLERY_WITH_CROP -> pickGalleryImage(savedInstanceState)
119+
ImageProvider.CAMERA -> pickCameraImage(savedInstanceState, false)
120+
ImageProvider.CAMERA_WITH_CROP -> pickCameraImage(savedInstanceState, false)
121+
ImageProvider.FRONT_CAMERA -> pickCameraImage(savedInstanceState, true)
134122
else -> {
135123
// Something went Wrong! This case should never happen
136124
Log.e(TAG, "Image provider can not be null")
@@ -139,6 +127,19 @@ class ImagePickerActivity : AppCompatActivity() {
139127
}
140128
}
141129

130+
private fun pickGalleryImage(savedInstanceState: Bundle?) {
131+
mGalleryProvider = GalleryProvider(this) { galleryLauncher.launch(it) }
132+
// Pick Gallery Image
133+
savedInstanceState ?: mGalleryProvider?.startIntent()
134+
}
135+
136+
private fun pickCameraImage(savedInstanceState: Bundle?, tryFrontCamera: Boolean) {
137+
mCameraProvider = CameraProvider(this, tryFrontCamera) { cameraLauncher.launch(it) }
138+
mCameraProvider?.onRestoreInstanceState(savedInstanceState)
139+
// Pick Camera Image
140+
savedInstanceState ?: mCameraProvider?.startIntent()
141+
}
142+
142143
/**
143144
* Dispatch incoming result to the correct provider.
144145
*/

imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/constant/ImageProvider.kt

+2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ package com.github.drjacky.imagepicker.constant
99
*/
1010
enum class ImageProvider {
1111
GALLERY,
12+
GALLERY_WITH_CROP,
1213
CAMERA,
14+
CAMERA_WITH_CROP,
1315
FRONT_CAMERA,
1416
BOTH
1517
}

imagepicker/src/main/kotlin/com/github/drjacky/imagepicker/util/DialogHelper.kt

+7-3
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,18 @@ internal object DialogHelper {
4747

4848
// Handle Camera option click
4949
customView.lytCameraPick.setOnClickListener {
50-
listener.onResult(ImageProvider.CAMERA)
50+
listener.onResult(
51+
if (customView.displayCropCheckBox.isChecked) ImageProvider.CAMERA_WITH_CROP else ImageProvider.CAMERA
52+
)
5153
dialog.dismiss()
5254
}
5355

5456
// Handle Gallery option click
5557
customView.lytGalleryPick.setOnClickListener {
56-
listener.onResult(ImageProvider.GALLERY)
58+
listener.onResult(
59+
if (customView.displayCropCheckBox.isChecked) ImageProvider.GALLERY_WITH_CROP else ImageProvider.GALLERY
60+
)
5761
dialog.dismiss()
5862
}
5963
}
60-
}
64+
}

imagepicker/src/main/res/layout/dialog_choose_app.xml

+58-43
Original file line numberDiff line numberDiff line change
@@ -3,58 +3,73 @@
33
xmlns:app="http://schemas.android.com/apk/res-auto"
44
android:layout_width="match_parent"
55
android:layout_height="wrap_content"
6-
android:baselineAligned="false"
7-
android:orientation="horizontal"
6+
android:orientation="vertical"
87
android:padding="16dp">
98

109
<LinearLayout
11-
android:id="@+id/lytCameraPick"
12-
android:layout_width="0dp"
10+
android:layout_width="match_parent"
1311
android:layout_height="wrap_content"
14-
android:layout_marginTop="10dp"
15-
android:layout_weight="1"
16-
android:gravity="center"
17-
android:orientation="vertical">
18-
19-
<androidx.appcompat.widget.AppCompatImageView
20-
android:layout_width="48dp"
21-
android:layout_height="48dp"
22-
app:srcCompat="@drawable/ic_photo_camera_black_48dp"
23-
app:tint="@color/dialog_choose_icon_color" />
24-
25-
<androidx.appcompat.widget.AppCompatTextView
26-
android:layout_width="wrap_content"
12+
android:baselineAligned="false"
13+
android:orientation="horizontal">
14+
15+
<LinearLayout
16+
android:id="@+id/lytCameraPick"
17+
android:layout_width="0dp"
2718
android:layout_height="wrap_content"
28-
android:layout_marginTop="5dp"
29-
android:text="@string/title_camera"
30-
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
31-
android:textColor="@color/dialog_choose_text_color" />
19+
android:layout_marginTop="10dp"
20+
android:layout_weight="1"
21+
android:gravity="center"
22+
android:orientation="vertical">
3223

33-
</LinearLayout>
24+
<androidx.appcompat.widget.AppCompatImageView
25+
android:layout_width="48dp"
26+
android:layout_height="48dp"
27+
app:srcCompat="@drawable/ic_photo_camera_black_48dp"
28+
app:tint="@color/dialog_choose_icon_color" />
3429

35-
<LinearLayout
36-
android:id="@+id/lytGalleryPick"
37-
android:layout_width="0dp"
38-
android:layout_height="wrap_content"
39-
android:layout_marginTop="10dp"
40-
android:layout_weight="1"
41-
android:gravity="center"
42-
android:orientation="vertical">
43-
44-
<androidx.appcompat.widget.AppCompatImageView
45-
android:layout_width="48dp"
46-
android:layout_height="48dp"
47-
app:srcCompat="@drawable/ic_photo_black_48dp"
48-
app:tint="@color/dialog_choose_icon_color" />
49-
50-
<androidx.appcompat.widget.AppCompatTextView
51-
android:layout_width="wrap_content"
30+
<androidx.appcompat.widget.AppCompatTextView
31+
android:layout_width="wrap_content"
32+
android:layout_height="wrap_content"
33+
android:layout_marginTop="5dp"
34+
android:text="@string/title_camera"
35+
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
36+
android:textColor="@color/dialog_choose_text_color" />
37+
38+
</LinearLayout>
39+
40+
<LinearLayout
41+
android:id="@+id/lytGalleryPick"
42+
android:layout_width="0dp"
5243
android:layout_height="wrap_content"
53-
android:layout_marginTop="5dp"
54-
android:text="@string/title_gallery"
55-
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
56-
android:textColor="@color/dialog_choose_text_color" />
44+
android:layout_marginTop="10dp"
45+
android:layout_weight="1"
46+
android:gravity="center"
47+
android:orientation="vertical">
48+
49+
<androidx.appcompat.widget.AppCompatImageView
50+
android:layout_width="48dp"
51+
android:layout_height="48dp"
52+
app:srcCompat="@drawable/ic_photo_black_48dp"
53+
app:tint="@color/dialog_choose_icon_color" />
54+
55+
<androidx.appcompat.widget.AppCompatTextView
56+
android:layout_width="wrap_content"
57+
android:layout_height="wrap_content"
58+
android:layout_marginTop="5dp"
59+
android:text="@string/title_gallery"
60+
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
61+
android:textColor="@color/dialog_choose_text_color" />
62+
63+
</LinearLayout>
5764

5865
</LinearLayout>
5966

67+
<CheckBox
68+
android:id="@+id/displayCropCheckBox"
69+
android:layout_width="wrap_content"
70+
android:layout_height="wrap_content"
71+
android:layout_gravity="center"
72+
android:layout_marginTop="16dp"
73+
android:text="@string/display_crop" />
74+
6075
</LinearLayout>

imagepicker/src/main/res/values/strings.xml

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<string name="action_cancel">Cancel</string>
1010
<string name="title_gallery">Gallery</string>
1111
<string name="title_camera">Camera</string>
12+
<string name="display_crop">Display crop</string>
1213

1314
<string name="permission_gallery_denied">
1415
<![CDATA[Storage permission is needed to pick gallery image. Please allow storage permission from Settings > Permissions.]]></string>

0 commit comments

Comments
 (0)