@@ -9,6 +9,7 @@ import android.net.Uri
99import android.os.Build
1010import android.provider.MediaStore
1111import android.util.Log
12+ import android.widget.Toast
1213import androidx.activity.result.ActivityResultLauncher
1314import androidx.activity.result.contract.ActivityResultContracts
1415import androidx.fragment.app.FragmentActivity
@@ -70,7 +71,11 @@ class EasyPicker(
7071 var btnBackground: Int = R .drawable.bg_et_silver
7172 var textColor: Int = R .color.black
7273 var mListener = object : OnCaptureMedia {
73- override fun onCaptureMedia (request : Int , file : FileResource ) {
74+ override fun onCaptureMedia (
75+ request : Int ,
76+ file : ArrayList <FileResource >? ,
77+ ) {
78+
7479 }
7580 }
7681
@@ -123,33 +128,68 @@ class EasyPicker(
123128 getImageUri(mContext, result.data!! .extras!! .get(" data" ) as Bitmap )!!
124129 }
125130
126- CoroutineScope (Dispatchers . Main ).launch {
127- var resulting: FileResource ? = null
131+ CoroutineScope (Main ).launch {
132+ var resulting: ArrayList < FileResource > = ArrayList ()
128133 async {
129134 try {
130- resulting = MediaStoreUtils .getResourceByUri(mContext, imageUri)
135+ resulting.add( MediaStoreUtils .getResourceByUri(mContext, imageUri) )
131136 } catch (e: Exception ) {
132137 try {
133138 Log .e(" ExceptionVideo" , " >>> Exception Video First: ${e.message} " )
134- resulting = FileResource (
139+ resulting.add( FileResource (
135140 uri = imageUri,
136141 path = FilesVersionUtil .getRealPathFromUri(mContext, imageUri)
137- )
142+ ))
138143 } catch (e: Exception ) {
139144 Log .e(" ExceptionVideo" , " >>> Exception Video: ${e.message} " )
140145 }
141146 }
142147 }.await()
143- mListener.onCaptureMedia(request, resulting!! )
148+ mListener.onCaptureMedia(request, resulting)
149+ }
150+ }
151+ }
152+ private var multiImageLauncher =
153+ act.registerForActivityResult(ActivityResultContracts .StartActivityForResult ()) { result ->
154+ if (result.resultCode == Activity .RESULT_OK ) {
155+ if (result.data?.clipData != null ) {
156+ val count: Int = result.data?.clipData?.itemCount ? : 0
157+
158+ var images: ArrayList <FileResource > = ArrayList ()
159+ for (i in 0 until count) {
160+ val imageUri: Uri = try {
161+ result.data?.clipData?.getItemAt(i)?.uri!!
162+ } catch (e: Exception ) {
163+ getImageUri(
164+ mContext,
165+ result.data?.clipData?.getItemAt(i)?.uri!! as Bitmap
166+ )!!
167+ }
168+
169+ images.add(
170+ FileResource (
171+ uri = imageUri,
172+ path = FilesVersionUtil .getRealPathFromUri(
173+ mContext,
174+ imageUri
175+ )
176+ )
177+ )
178+ }
179+ if (images.isNotEmpty()) mListener.onCaptureMedia(request, files = images)
180+ } else {
181+ Toast .makeText(mContext, " Can't pick your images" , Toast .LENGTH_SHORT )
144182 }
183+
145184 }
146185 }
147186
148187
149188 private var takeImageLauncher =
150189 act.registerForActivityResult(ActivityResultContracts .TakePicture ()) { result ->
151- CoroutineScope (Dispatchers .Main ).launch {
152- var resulting: FileResource ? = null
190+ CoroutineScope (Main ).launch {
191+ var resulting: ArrayList <FileResource > = ArrayList ()
192+
153193 if (! result) {
154194 try {
155195 deleteUriFile(mPath, act)
@@ -160,20 +200,20 @@ class EasyPicker(
160200 }
161201 async {
162202 try {
163- resulting = MediaStoreUtils .getResourceByUri(mContext, mPath)
203+ resulting.add( MediaStoreUtils .getResourceByUri(mContext, mPath) )
164204 } catch (e: Exception ) {
165205 try {
166206 Log .e(" ExceptionVideo" , " >>> Exception Video First: ${e.message} " )
167- resulting = FileResource (
207+ resulting.add( FileResource (
168208 uri = mPath,
169209 path = FilesVersionUtil .getRealPathFromUri(mContext, mPath)
170- )
210+ ))
171211 } catch (e: Exception ) {
172212 Log .e(" ExceptionVideo" , " >>> Exception Video: ${e.message} " )
173213 }
174214 }
175215 }.await()
176- mListener.onCaptureMedia(request, resulting!! )
216+ mListener.onCaptureMedia(request, resulting)
177217 }
178218 }
179219
@@ -184,29 +224,29 @@ class EasyPicker(
184224 val data: Intent ? = result.data
185225 val imageUri: Uri = data?.data!!
186226
187- CoroutineScope (Dispatchers . Main ).launch {
188- var resulting: FileResource ? = null
227+ CoroutineScope (Main ).launch {
228+ var resulting: ArrayList < FileResource > = ArrayList ()
189229 async {
190230 try {
191- resulting = MediaStoreUtils .getResourceByUri(mContext, imageUri)
231+ resulting.add( MediaStoreUtils .getResourceByUri(mContext, imageUri) )
192232 } catch (e: Exception ) {
193233 try {
194234 Log .e(" ExceptionVideo" , " >>> Exception Video First: ${e.message} " )
195- resulting = FileResource (
235+ resulting.add( FileResource (
196236 uri = imageUri,
197237 path = FilesVersionUtil .getRealPathFromUri(mContext, imageUri)
198238 ? : getPathFromURI(mContext, imageUri)
199- )
239+ ))
200240 } catch (e: Exception ) {
201241 try {
202- resulting = MediaStoreUtils .getResourceByUri(mContext, imageUri)
242+ resulting.add( MediaStoreUtils .getResourceByUri(mContext, imageUri) )
203243 } catch (e: Exception ) {
204244 Log .e(" ExceptionVideo" , " >>> Exception Video: ${e.message} " )
205245 }
206246 }
207247 }
208248 }.await()
209- mListener.onCaptureMedia(request, resulting!! )
249+ mListener.onCaptureMedia(request, resulting)
210250 }
211251 }
212252 }
@@ -228,19 +268,20 @@ class EasyPicker(
228268 act.registerForActivityResult(ActivityResultContracts .StartActivityForResult ()) { result ->
229269 if (result.resultCode == Activity .RESULT_OK ) {
230270 val imageUri = result.data?.data!!
231- CoroutineScope (Dispatchers . Main ).launch {
232- var resulting: FileResource ? = null
271+ CoroutineScope (Main ).launch {
272+ var resulting: ArrayList < FileResource > = ArrayList ()
233273 async {
234- resulting = try {
235- MediaStoreUtils .getResourceByUri(mContext, imageUri)
274+
275+ try {
276+ resulting.add(MediaStoreUtils .getResourceByUri(mContext, imageUri))
236277 } catch (e: Exception ) {
237278 FileResource (
238279 uri = imageUri,
239280 path = FilesVersionUtil .getRealPathFromUri(mContext, imageUri)
240281 )
241282 }
242283 }.await()
243- resulting? .path?.let {
284+ resulting[ 0 ] .path?.let {
244285 CoroutineScope (Dispatchers .Default ).launch {
245286 val compressedImageFile: String =
246287 withContext(Dispatchers .Default ) {
@@ -250,9 +291,9 @@ class EasyPicker(
250291 " ${System .currentTimeMillis()} "
251292 )
252293 }
253- withContext(Dispatchers . Main ) {
254- resulting? .path = compressedImageFile
255- mListener.onCaptureMedia(request, resulting!! )
294+ withContext(Main ) {
295+ resulting[ 0 ] .path = compressedImageFile
296+ mListener.onCaptureMedia(request, resulting)
256297 }
257298 }
258299 }
@@ -267,31 +308,34 @@ class EasyPicker(
267308 val data: Intent ? = result.data
268309 val imageUri: Uri = data?.data!!
269310
270- CoroutineScope (Dispatchers . Main ).launch {
271- var resulting: FileResource ? = null
311+ CoroutineScope (Main ).launch {
312+ var resulting: ArrayList < FileResource > = ArrayList ()
272313 async {
273314 try {
274- resulting = MediaStoreUtils .getResourceByUri(mContext, imageUri)
315+ resulting.add( MediaStoreUtils .getResourceByUri(mContext, imageUri) )
275316 } catch (e: Exception ) {
276317 try {
277318 Log .e(" ExceptionVideo" , " >>> Exception Video First: ${e.message} " )
278- resulting = FileResource (
319+ resulting.add( FileResource (
279320 uri = imageUri,
280321 path = FilesVersionUtil .getRealPathFromUri(mContext, imageUri)
281- )
322+ ))
282323 } catch (e: Exception ) {
283324 Log .e(" ExceptionVideo" , " >>> Exception Video: ${e.message} " )
284325 }
285326 }
286327 }.await()
287- mListener.onCaptureMedia(request, resulting!! )
328+ mListener.onCaptureMedia(request, resulting)
288329 }
289330 }
290331 }
291332
292333
293334 private fun checkPermission (): Boolean {
294- return if (Build .VERSION .SDK_INT > 32 ) PermissionUtils .hasPermissions(act, PermissionUtils .NEW_IMAGE_PERMISSIONS )
335+ return if (Build .VERSION .SDK_INT > 32 ) PermissionUtils .hasPermissions(
336+ act,
337+ PermissionUtils .NEW_IMAGE_PERMISSIONS
338+ )
295339 else PermissionUtils .hasPermissions(act, PermissionUtils .IMAGE_PERMISSIONS )
296340 }
297341
@@ -303,6 +347,21 @@ class EasyPicker(
303347 }
304348 }
305349
350+ fun chooseMultipleImages () {
351+ if (checkPermission()) {
352+ val intent = Intent (
353+ Intent .ACTION_PICK ,
354+ MediaStore .Images .Media .INTERNAL_CONTENT_URI
355+ ).apply {
356+ type = " image/*"
357+ }
358+ intent.putExtra(Intent .EXTRA_ALLOW_MULTIPLE , true )
359+ multiImageLauncher.launch(intent)
360+ } else {
361+ PickActions .openStorageRequest(act, resultLauncher)
362+ }
363+ }
364+
306365 fun chooseAndCompressImage () {
307366 if (checkPermission()) {
308367 val intent = Intent (
0 commit comments