11package com.margelo.nitro.multipleimagepicker
22
3+ import android.app.Activity
34import android.content.Context
5+ import android.content.Intent
46import android.graphics.Color
57import android.net.Uri
68import androidx.core.content.ContextCompat
9+ import com.facebook.react.bridge.ActivityEventListener
10+ import com.facebook.react.bridge.BaseActivityEventListener
711import com.facebook.react.bridge.ColorPropConverter
812import com.facebook.react.bridge.ReactApplicationContext
913import com.facebook.react.bridge.ReactContextBaseJavaModule
@@ -28,11 +32,13 @@ import com.luck.picture.lib.utils.DateUtils
2832import com.luck.picture.lib.utils.DensityUtil
2933import com.yalantis.ucrop.UCrop
3034import com.yalantis.ucrop.UCrop.Options
35+ import com.yalantis.ucrop.UCrop.REQUEST_CROP
3136import com.yalantis.ucrop.model.AspectRatio
3237import java.io.File
3338import java.net.HttpURLConnection
3439import java.net.URL
3540
41+
3642class MultipleImagePickerImp (reactContext : ReactApplicationContext ? ) :
3743 ReactContextBaseJavaModule (reactContext), IApp {
3844
@@ -91,7 +97,7 @@ class MultipleImagePickerImp(reactContext: ReactApplicationContext?) :
9197 PictureSelector .create(activity).openGallery(chooseMode).setImageEngine(imageEngine)
9298 .setSelectedData(dataList).setSelectorUIStyle(style).apply {
9399 if (isCrop) {
94- setCropOption()
100+ setCropOption(config.crop )
95101 // Disabled force crop engine for multiple
96102 if (! isMultiple) setCropEngine(CropEngine (cropOption))
97103 else setEditMediaInterceptListener(setEditMediaEvent())
@@ -161,7 +167,16 @@ class MultipleImagePickerImp(reactContext: ReactApplicationContext?) :
161167 resolved : (result: CropResult ) -> Unit ,
162168 rejected : (reject: Double ) -> Unit
163169 ) {
164- setCropOption()
170+ cropOption = Options ()
171+
172+ setCropOption(
173+ PickerCropConfig (
174+ circle = options.circle,
175+ ratio = options.ratio,
176+ defaultRatio = options.defaultRatio,
177+ freeStyle = options.freeStyle
178+ )
179+ )
165180
166181 try {
167182 val uri = when {
@@ -189,19 +204,46 @@ class MultipleImagePickerImp(reactContext: ReactApplicationContext?) :
189204 }
190205 }
191206
207+
192208 val destinationUri = Uri .fromFile(
193209 File (getSandboxPath(appContext), DateUtils .getCreateFileName(" CROP_" ) + " .jpeg" )
194210 )
195211
196212 val uCrop = UCrop .of<Any >(uri, destinationUri).withOptions(cropOption)
197213
198-
199214 // set engine
200215 uCrop.setImageEngine(CropImageEngine ())
201216 // start edit
202- currentActivity?.let { uCrop.start(it, 0 ) }
203217
218+ val cropActivityEventListener = object : BaseActivityEventListener () {
219+ override fun onActivityResult (activity : Activity , requestCode : Int , resultCode : Int , data : Intent ? ) {
220+ if (resultCode == Activity .RESULT_OK && requestCode == REQUEST_CROP ) {
221+ val resultUri = UCrop .getOutput(data!! )
222+ val width = UCrop .getOutputImageWidth(data).toDouble()
223+ val height = UCrop .getOutputImageHeight(data).toDouble()
224+
225+ resultUri?.let {
226+ val result = CropResult (
227+ path = it.toString(),
228+ width,
229+ height,
230+ )
231+ resolved(result)
232+ }
233+ } else if (resultCode == UCrop .RESULT_ERROR ) {
234+ val cropError = UCrop .getError(data!! )
235+ rejected(0.0 )
236+ }
237+
238+ // Remove listener after getting result
239+ reactApplicationContext.removeActivityEventListener(this )
240+ }
241+ }
242+
243+ // Add listener before starting UCrop
244+ reactApplicationContext.addActivityEventListener(cropActivityEventListener)
204245
246+ currentActivity?.let { uCrop.start(it, REQUEST_CROP ) }
205247 } catch (e: Exception ) {
206248 rejected(0.0 )
207249 }
@@ -223,12 +265,10 @@ class MultipleImagePickerImp(reactContext: ReactApplicationContext?) :
223265 }
224266 }
225267
226- private fun setCropOption () {
227- // val mainStyle: SelectMainStyle = style.selectMainStyle
228-
268+ private fun setCropOption (config : PickerCropConfig ? ) {
229269 cropOption.setShowCropFrame(true )
230270 cropOption.setShowCropGrid(true )
231- cropOption.setCircleDimmedLayer(config.crop ?.circle ? : false )
271+ cropOption.setCircleDimmedLayer(config?.circle ? : false )
232272 cropOption.setCropOutputPathDir(getSandboxPath(appContext))
233273 cropOption.isCropDragSmoothToCenter(true )
234274 cropOption.isForbidSkipMultipleCrop(true )
@@ -237,21 +277,48 @@ class MultipleImagePickerImp(reactContext: ReactApplicationContext?) :
237277 cropOption.setStatusBarColor(Color .WHITE )
238278 cropOption.isDarkStatusBarBlack(true )
239279 cropOption.isDragCropImages(true )
240- cropOption.setFreeStyleCropEnabled(true )
280+ cropOption.setFreeStyleCropEnabled(config?.freeStyle ? : true )
241281 cropOption.setSkipCropMimeType(* getNotSupportCrop())
242282
243- cropOption.apply {
244- setAspectRatioOptions(
245- 1 ,
246- AspectRatio (null , 1f , 2f ),
247- AspectRatio (null , 3f , 4f ),
248- AspectRatio (null , 5f , 3f ),
283+
284+ val ratioCount = config?.ratio?.size ? : 0
285+
286+ if (config?.defaultRatio != null || ratioCount > 0 ) {
287+
288+ var ratioList = arrayOf(AspectRatio (" Original" , 0f , 0f ))
289+
290+ if (ratioCount > 0 ) {
291+ config?.ratio?.take(4 )?.toTypedArray()?.forEach { item ->
292+ ratioList + = AspectRatio (
293+ item.title, item.width.toFloat(), item.height.toFloat()
294+ )
295+ }
296+ }
297+
298+ // Add default Aspects
299+ ratioList + = arrayOf(
300+ AspectRatio (null , 1f , 1f ),
249301 AspectRatio (null , 16f , 9f ),
250- AspectRatio (null , 1f , 1f )
302+ AspectRatio (null , 4f , 3f ),
303+ AspectRatio (null , 3f , 2f )
251304 )
252- }
253305
254- cropOption.setRat
306+ config?.defaultRatio?.let {
307+ val defaultRatio = AspectRatio (it.title, it.width.toFloat(), it.height.toFloat())
308+ ratioList = arrayOf(defaultRatio) + ratioList
309+
310+ }
311+
312+ cropOption.apply {
313+
314+ setAspectRatioOptions(
315+ 0 ,
316+ * ratioList.take(5 ).toTypedArray()
317+ )
318+
319+ }
320+
321+ }
255322 }
256323
257324
0 commit comments