Skip to content

Commit

Permalink
Multi choose images added
Browse files Browse the repository at this point in the history
  • Loading branch information
BasemNasr committed Feb 2, 2023
1 parent 44bca60 commit 50e549d
Show file tree
Hide file tree
Showing 24 changed files with 1,291 additions and 39 deletions.
5 changes: 5 additions & 0 deletions EasyMediaPicker/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ android {
consumerProguardFiles "consumer-rules.pro"
}

buildFeatures {
viewBinding = true
}
buildTypes {
release {
minifyEnabled false
Expand Down Expand Up @@ -50,4 +53,6 @@ dependencies {

//Glide
implementation 'com.github.bumptech.glide:glide:4.13.1'
implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
implementation 'io.reactivex.rxjava3:rxjava:3.1.2'
}
2 changes: 2 additions & 0 deletions EasyMediaPicker/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,7 @@

<application>
<activity android:name="com.bn.easypicker.mutils.request_permission.RequestStoragePermissionActivity" />
<activity android:name=".multiChoose.GalleryActivity"
android:theme="@style/Theme.AppCompat.DayNight.NoActionBar"/>
</application>
</manifest>
137 changes: 109 additions & 28 deletions EasyMediaPicker/src/main/java/com/bn/easypicker/EasyPicker.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ import androidx.lifecycle.lifecycleScope
import com.bn.easypicker.MediaStoreUtils.deleteUriFile
import com.bn.easypicker.listeners.OnAttachmentTypeSelected
import com.bn.easypicker.listeners.OnCaptureMedia
import com.bn.easypicker.multiChoose.Constants
import com.bn.easypicker.multiChoose.GalleryActivity
import com.bn.easypicker.mutils.FilesVersionUtil
import com.bn.easypicker.mutils.PermissionUtils
import com.bn.easypicker.mutils.UploadImages
Expand All @@ -40,6 +42,7 @@ class EasyPicker(
private val textColor: Int = builder.textColor
private val backgroundColor: Int = builder.sheetBackgroundColor
private val btnBackground: Int = builder.btnBackground
private val maximumSelectionLimit: Int = builder.maximumSelectionLimit


private val resultLauncher =
Expand Down Expand Up @@ -69,6 +72,7 @@ class EasyPicker(
var galleryIcon: Int = R.drawable.ic_galery
var sheetBackgroundColor: Int = R.color.white
var btnBackground: Int = R.drawable.bg_et_silver
var maximumSelectionLimit: Int = 20
var textColor: Int = R.color.black
var mListener = object : OnCaptureMedia {
override fun onCaptureMedia(
Expand All @@ -90,7 +94,12 @@ class EasyPicker(
this.sheetBackgroundColor = backgroundColor
return this
}

fun setMaxSelectionLimit(
limit: Int
): Builder {
this.maximumSelectionLimit = limit
return this
}
fun setIconsAndTextColor(
cameraIcon: Int? = null,
galleryIcon: Int? = null,
Expand Down Expand Up @@ -136,10 +145,15 @@ class EasyPicker(
} catch (e: Exception) {
try {
Log.e("ExceptionVideo", ">>> Exception Video First: ${e.message}")
resulting.add(FileResource(
uri = imageUri,
path = FilesVersionUtil.getRealPathFromUri(mContext, imageUri)
))
resulting.add(
FileResource(
uri = imageUri,
path = FilesVersionUtil.getRealPathFromUri(
mContext,
imageUri
)
)
)
} catch (e: Exception) {
Log.e("ExceptionVideo", ">>> Exception Video: ${e.message}")
}
Expand All @@ -153,8 +167,8 @@ class EasyPicker(
act.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
if (result.data?.clipData != null) {
Log.v("Filessss", "ResultOk")
val count: Int = result.data?.clipData?.itemCount ?: 0

var images: ArrayList<FileResource> = ArrayList()
for (i in 0 until count) {
val imageUri: Uri = try {
Expand All @@ -165,7 +179,46 @@ class EasyPicker(
result.data?.clipData?.getItemAt(i)?.uri!! as Bitmap
)!!
}
images.add(
FileResource(
uri = imageUri,
path = FilesVersionUtil.getRealPathFromUri(
mContext,
imageUri
)
)
)
}
Log.v("Filessss", "${images.size}")
if (images.isNotEmpty()) mListener.onCaptureMedia(request, files = images)
} else {
Toast.makeText(mContext, "Can't pick your images", Toast.LENGTH_SHORT)
}

}
}

fun getImagesList(data: Intent): ArrayList<Uri> {
if (data != null && data.hasExtra(Constants.BUNDLE_IMAGE_PICKED_SUCCESS) && data.getBooleanExtra(
Constants.BUNDLE_IMAGE_PICKED_SUCCESS,
false
)
) {
return data?.getParcelableArrayListExtra(Constants.BUNDLE_SELECTED_IMAGE_RESULT)
?: arrayListOf()
}
return arrayListOf()
}

private var multiImageLauncherFromCustomGallery =
act.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val data = result.data
val uriArray = data?.let { getImagesList(it) }
var images: ArrayList<FileResource> = ArrayList()

if (uriArray != null) {
for (imageUri in uriArray) {
images.add(
FileResource(
uri = imageUri,
Expand All @@ -176,11 +229,12 @@ class EasyPicker(
)
)
}
if(images.isNotEmpty()) mListener.onCaptureMedia(request, files = images)
if (images.isNotEmpty()) mListener.onCaptureMedia(request, files = images)
} else {
Toast.makeText(mContext, "Can't pick your images", Toast.LENGTH_SHORT)
}


}
}

Expand All @@ -204,10 +258,12 @@ class EasyPicker(
} catch (e: Exception) {
try {
Log.e("ExceptionVideo", ">>> Exception Video First: ${e.message}")
resulting.add(FileResource(
uri = mPath,
path = FilesVersionUtil.getRealPathFromUri(mContext, mPath)
))
resulting.add(
FileResource(
uri = mPath,
path = FilesVersionUtil.getRealPathFromUri(mContext, mPath)
)
)
} catch (e: Exception) {
Log.e("ExceptionVideo", ">>> Exception Video: ${e.message}")
}
Expand All @@ -232,14 +288,24 @@ class EasyPicker(
} catch (e: Exception) {
try {
Log.e("ExceptionVideo", ">>> Exception Video First: ${e.message}")
resulting.add(FileResource(
uri = imageUri,
path = FilesVersionUtil.getRealPathFromUri(mContext, imageUri)
?: getPathFromURI(mContext, imageUri)
))
resulting.add(
FileResource(
uri = imageUri,
path = FilesVersionUtil.getRealPathFromUri(
mContext,
imageUri
)
?: getPathFromURI(mContext, imageUri)
)
)
} catch (e: Exception) {
try {
resulting.add(MediaStoreUtils.getResourceByUri(mContext, imageUri))
resulting.add(
MediaStoreUtils.getResourceByUri(
mContext,
imageUri
)
)
} catch (e: Exception) {
Log.e("ExceptionVideo", ">>> Exception Video: ${e.message}")
}
Expand Down Expand Up @@ -316,10 +382,15 @@ class EasyPicker(
} catch (e: Exception) {
try {
Log.e("ExceptionVideo", ">>> Exception Video First: ${e.message}")
resulting.add(FileResource(
uri = imageUri,
path = FilesVersionUtil.getRealPathFromUri(mContext, imageUri)
))
resulting.add(
FileResource(
uri = imageUri,
path = FilesVersionUtil.getRealPathFromUri(
mContext,
imageUri
)
)
)
} catch (e: Exception) {
Log.e("ExceptionVideo", ">>> Exception Video: ${e.message}")
}
Expand Down Expand Up @@ -349,14 +420,24 @@ class EasyPicker(

fun chooseMultipleImages() {
if (checkPermission()) {
val intent = Intent(
Intent.ACTION_PICK,
MediaStore.Images.Media.INTERNAL_CONTENT_URI
).apply {
type = "image/*"
act.lifecycleScope.launchWhenStarted {
multiImageLauncher
}
if (Build.VERSION.SDK_INT >= 30) {
val intent = Intent(
Intent.ACTION_PICK,
MediaStore.Images.Media.INTERNAL_CONTENT_URI
).apply {
type = "image/*"
}
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
multiImageLauncher.launch(intent)
} else {
val intent = Intent(act, GalleryActivity::class.java)
intent.putExtra(Constants.BUNDLE_SHOW_ALBUMS, true)
intent.putExtra(Constants.BUNDLE_MAX_SELECTION_LIMIT, maximumSelectionLimit)
multiImageLauncherFromCustomGallery.launch(intent)
}
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
multiImageLauncher.launch(intent)
} else {
PickActions.openStorageRequest(act, resultLauncher)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ import androidx.lifecycle.lifecycleScope
import com.bn.easypicker.MediaStoreUtils.deleteUriFile
import com.bn.easypicker.listeners.OnAttachmentTypeSelected
import com.bn.easypicker.listeners.OnCaptureMedia
import com.bn.easypicker.multiChoose.Constants
import com.bn.easypicker.multiChoose.GalleryActivity
import com.bn.easypicker.mutils.FilesVersionUtil
import com.bn.easypicker.mutils.PermissionUtils
import com.bn.easypicker.mutils.UploadImages
Expand All @@ -40,6 +42,7 @@ class FragmentEasyPicker(
private val textColor: Int = builder.textColor
private val backgroundColor: Int = builder.sheetBackgroundColor
private val btnBackground: Int = builder.btnBackground
private val maximumSelectionLimit: Int = builder.maximumSelectionLimit


private val resultLauncher =
Expand Down Expand Up @@ -70,6 +73,8 @@ class FragmentEasyPicker(
var sheetBackgroundColor: Int = R.color.white
var btnBackground: Int = R.drawable.bg_et_silver
var textColor: Int = R.color.black
var maximumSelectionLimit: Int = 20

var mListener = object : OnCaptureMedia {
override fun onCaptureMedia(request: Int, files: ArrayList<FileResource>?) {
}
Expand All @@ -86,7 +91,12 @@ class FragmentEasyPicker(
this.sheetBackgroundColor = backgroundColor
return this
}

fun setMaxSelectionLimit(
limit: Int
): Builder {
this.maximumSelectionLimit = limit
return this
}
fun setIconsAndTextColor(
cameraIcon: Int? = null,
galleryIcon: Int? = null,
Expand Down Expand Up @@ -186,6 +196,45 @@ class FragmentEasyPicker(
}
}

fun getImagesList(data: Intent): ArrayList<Uri> {
if (data != null && data.hasExtra(Constants.BUNDLE_IMAGE_PICKED_SUCCESS) && data.getBooleanExtra(
Constants.BUNDLE_IMAGE_PICKED_SUCCESS,
false
)
) {
return data?.getParcelableArrayListExtra(Constants.BUNDLE_SELECTED_IMAGE_RESULT)
?: arrayListOf()
}
return arrayListOf()
}
private var multiImageLauncherFromCustomGallery =
fragment.registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val data = result.data
val uriArray = data?.let { getImagesList(it) }
var images: ArrayList<FileResource> = ArrayList()

if (uriArray != null) {
for (imageUri in uriArray) {
images.add(
FileResource(
uri = imageUri,
path = FilesVersionUtil.getRealPathFromUri(
mContext,
imageUri
)
)
)
}
if (images.isNotEmpty()) mListener.onCaptureMedia(request, files = images)
} else {
Toast.makeText(mContext, "Can't pick your images", Toast.LENGTH_SHORT)
}


}
}



private var takeImageLauncher =
Expand Down Expand Up @@ -365,17 +414,23 @@ class FragmentEasyPicker(
}
}


fun chooseMultipleImages() {
if (checkPermission()) {
val intent = Intent(
Intent.ACTION_PICK,
MediaStore.Images.Media.INTERNAL_CONTENT_URI
).apply {
type = "image/*"
if (Build.VERSION.SDK_INT >= 30) {
val intent = Intent(
Intent.ACTION_PICK,
MediaStore.Images.Media.INTERNAL_CONTENT_URI
).apply {
type = "image/*"
}
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
multiImageLauncher.launch(intent)
} else {
val intent = Intent(fragment.requireActivity(), GalleryActivity::class.java)
intent.putExtra(Constants.BUNDLE_SHOW_ALBUMS, true)
intent.putExtra(Constants.BUNDLE_MAX_SELECTION_LIMIT, maximumSelectionLimit)
multiImageLauncherFromCustomGallery.launch(intent)
}
intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
multiImageLauncher.launch(intent)
} else {
PickActions.openStorageRequest(fragment.requireActivity(), resultLauncher)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.bn.easypicker.multiChoose

internal class Constants {
companion object{
internal const val BUNDLE_MAX_SELECTION_LIMIT = "maxSelectionLimit"
internal const val BUNDLE_SHOW_ALBUMS = "showAlbums"

internal const val BUNDLE_SELECTED_IMAGE_RESULT = "selectedImageResult"
internal const val BUNDLE_IMAGE_PICKED_SUCCESS = "pickImagesSuccess"
}
}
Loading

0 comments on commit 50e549d

Please sign in to comment.