From 2ff94559da5c8e5e4cd140c0fc243c50a4f7e0b0 Mon Sep 17 00:00:00 2001 From: vedraj360 Date: Wed, 13 Mar 2024 16:32:11 +0530 Subject: [PATCH] Show file size changes --- .../crazylegend/mediapicker/FragmentResult.kt | 10 +- .../crazylegend/mediapicker/MainActivity.kt | 52 +++++-- .../java/com/crazylegend/core/Extensions.kt | 15 +- .../adapters/multi/MultiSelectViewHolder.kt | 8 +- .../core/adapters/single/SingleAdapter.kt | 8 +- .../core/adapters/single/SingleViewHolder.kt | 11 +- .../java/com/crazylegend/core/dto/Config.kt | 3 - .../com/crazylegend/core/dto/PickerConfig.kt | 3 + .../core/modifiers/SizeTextModifier.kt | 133 ++++++++++++++++++ .../modifiers/base/BaseMultiPickerModifier.kt | 20 ++- .../base/BaseSinglePickerModifier.kt | 9 +- core/src/main/res/layout/itemview_image.xml | 3 +- imagepicker/README.md | 9 ++ .../MultiImagePickerBottomSheetDialog.kt | 6 +- .../SingleImagePickerBottomSheetDialog.kt | 39 +++-- .../imagepicker/pickers/MultiImagePicker.kt | 16 +-- .../imagepicker/pickers/SingleImagePicker.kt | 18 +-- videopicker/README.md | 9 ++ .../MultiVideoPickerBottomSheetDialog.kt | 6 +- .../SingleVideoPickerBottomSheetDialog.kt | 7 +- .../videopicker/pickers/MultiVideoPicker.kt | 10 +- .../videopicker/pickers/SingleVideoPicker.kt | 18 +-- 22 files changed, 316 insertions(+), 97 deletions(-) delete mode 100644 core/src/main/java/com/crazylegend/core/dto/Config.kt create mode 100644 core/src/main/java/com/crazylegend/core/dto/PickerConfig.kt create mode 100644 core/src/main/java/com/crazylegend/core/modifiers/SizeTextModifier.kt diff --git a/app/src/main/java/com/crazylegend/mediapicker/FragmentResult.kt b/app/src/main/java/com/crazylegend/mediapicker/FragmentResult.kt index f42fcb1..c4071fe 100644 --- a/app/src/main/java/com/crazylegend/mediapicker/FragmentResult.kt +++ b/app/src/main/java/com/crazylegend/mediapicker/FragmentResult.kt @@ -17,7 +17,7 @@ import com.bumptech.glide.Glide import com.crazylegend.audiopicker.audios.AudioModel import com.crazylegend.audiopicker.pickers.MultiAudioPicker import com.crazylegend.audiopicker.pickers.SingleAudioPicker -import com.crazylegend.core.dto.Config +import com.crazylegend.core.dto.PickerConfig import com.crazylegend.core.modifiers.TitleTextModifier import com.crazylegend.core.modifiers.base.BaseMultiPickerModifier import com.crazylegend.imagepicker.images.ImageModel @@ -147,7 +147,7 @@ class FragmentResult : DialogFragment(R.layout.activity_main), View.OnClickListe @SuppressLint("MissingPermission") private fun showVideoMultiBottomSheetPicker() { - MultiVideoPicker.showPicker(requireContext(), arrayOf(), config = Config(showFileSize = true), { + MultiVideoPicker.showPicker(requireContext(), arrayOf(), pickerConfig = PickerConfig(showFileSize = true), { setupBaseMultiPicker(tintForLoadingProgressBar = ContextCompat.getColor(requireContext(), R.color.colorPrimaryDark), gravityForSelectAndUnSelectIndicators = BaseMultiPickerModifier.Gravity.TOP_RIGHT, titleModifications = { textAlignment = TextView.TEXT_ALIGNMENT_CENTER textStyle = TitleTextModifier.TextStyle.ITALIC @@ -173,7 +173,7 @@ class FragmentResult : DialogFragment(R.layout.activity_main), View.OnClickListe private fun showSingleVideoBottomSheetPicker() { //SingleVideoPicker.showPicker(context = this, onPickedVideo = ::loadVideo) - SingleVideoPicker.showPicker(requireContext(), extensions = arrayOf(), config = Config(showFileSize = false), { + SingleVideoPicker.showPicker(requireContext(), extensions = arrayOf(), pickerConfig = PickerConfig(showFileSize = false), { setupBaseModifier(loadingIndicatorColor = R.color.minusColor, titleTextModifications = { textAlignment = TextView.TEXT_ALIGNMENT_VIEW_START textStyle = TitleTextModifier.TextStyle.ITALIC @@ -203,7 +203,7 @@ class FragmentResult : DialogFragment(R.layout.activity_main), View.OnClickListe //images @SuppressLint("MissingPermission") private fun showImageMultiBottomSheetPicker() { - MultiImagePicker.showPicker(requireContext(), extensions = arrayOf(), config = Config(showFileSize = false), { + MultiImagePicker.showPicker(requireContext(), extensions = arrayOf(), pickerConfig = PickerConfig(showFileSize = false), { setupBaseMultiPicker(tintForLoadingProgressBar = ContextCompat.getColor(requireContext(), R.color.colorPrimaryDark), gravityForSelectAndUnSelectIndicators = BaseMultiPickerModifier.Gravity.TOP_LEFT, titleModifications = { textAlignment = TextView.TEXT_ALIGNMENT_VIEW_START textStyle = TitleTextModifier.TextStyle.BOLD_ITALIC @@ -226,7 +226,7 @@ class FragmentResult : DialogFragment(R.layout.activity_main), View.OnClickListe @SuppressLint("MissingPermission") private fun showSingleImageBottomSheetPicker() { - SingleImagePicker.showPicker(requireContext(), extensions = arrayOf(), config = Config(showFileSize = true), { + SingleImagePicker.showPicker(requireContext(), extensions = arrayOf(), pickerConfig = PickerConfig(showFileSize = true), { loadingIndicatorTint = ContextCompat.getColor(requireContext(), R.color.colorPrimaryDark) titleTextModifier.apply { textAlignment = TextView.TEXT_ALIGNMENT_VIEW_START diff --git a/app/src/main/java/com/crazylegend/mediapicker/MainActivity.kt b/app/src/main/java/com/crazylegend/mediapicker/MainActivity.kt index 644aa88..310099d 100644 --- a/app/src/main/java/com/crazylegend/mediapicker/MainActivity.kt +++ b/app/src/main/java/com/crazylegend/mediapicker/MainActivity.kt @@ -15,7 +15,8 @@ import com.bumptech.glide.Glide import com.crazylegend.audiopicker.audios.AudioModel import com.crazylegend.audiopicker.pickers.MultiAudioPicker import com.crazylegend.audiopicker.pickers.SingleAudioPicker -import com.crazylegend.core.dto.Config +import com.crazylegend.core.dto.PickerConfig +import com.crazylegend.core.modifiers.SizeTextModifier import com.crazylegend.core.modifiers.TitleTextModifier import com.crazylegend.core.modifiers.base.BaseMultiPickerModifier import com.crazylegend.imagepicker.images.ImageModel @@ -150,7 +151,7 @@ class MainActivity : AppCompatActivity(), View.OnClickListener { //videos private fun showVideoMultiBottomSheetPicker() { - MultiVideoPicker.showPicker(this, extensions = arrayOf(), config = Config(showFileSize = true), { + MultiVideoPicker.showPicker(this, extensions = arrayOf(), pickerConfig = PickerConfig(showFileSize = true), { setupBaseMultiPicker(tintForLoadingProgressBar = ContextCompat.getColor( this@MainActivity, R.color.colorPrimaryDark ), @@ -174,7 +175,15 @@ class MainActivity : AppCompatActivity(), View.OnClickListener { }, viewHolderPlaceholderModifications = { resID = R.drawable.ic_close - }) + }, + sizeTextModifications = { + textAlignment = TextView.TEXT_ALIGNMENT_CENTER + textStyle = SizeTextModifier.TextStyle.BOLD + margin = 22 // use dp or sp this is only for demonstration purposes + textPadding = 8 // use dp or sp this is only for demonstration purposes + textSize = 10f // use sp this is only for demonstration purposes + } + ) }, ::doSomethingWithVideoList) } @@ -182,7 +191,7 @@ class MainActivity : AppCompatActivity(), View.OnClickListener { private fun showSingleVideoBottomSheetPicker() { //SingleVideoPicker.showPicker(context = this, onPickedVideo = ::loadVideo) - SingleVideoPicker.showPicker(this, extensions = arrayOf(), config = Config(showFileSize = true), { + SingleVideoPicker.showPicker(this, extensions = arrayOf(), pickerConfig = PickerConfig(showFileSize = true), { setupBaseModifier(loadingIndicatorColor = R.color.minusColor, titleTextModifications = { textAlignment = TextView.TEXT_ALIGNMENT_VIEW_START textStyle = TitleTextModifier.TextStyle.ITALIC @@ -193,7 +202,16 @@ class MainActivity : AppCompatActivity(), View.OnClickListener { textString = "Pick a video" }, placeHolderModifications = { resID = R.drawable.ic_image - }) + }, sizeTextModifications = { + textAlignment = TextView.TEXT_ALIGNMENT_VIEW_START + textStyle = SizeTextModifier.TextStyle.NORMAL + margin = 22 // use dp or sp this is only for demonstration purposes + textColor = Color.BLACK + textPadding = 5 // use dp or sp this is only for demonstration purposes + textSize = 12f // use sp this is only for demonstration purposes + backgroundDrawable = R.drawable.rounded_bg_abstract_dialog + } + ) }, ::loadVideo) } @@ -212,7 +230,7 @@ class MainActivity : AppCompatActivity(), View.OnClickListener { //images private fun showImageMultiBottomSheetPicker() { - MultiImagePicker.showPicker(this, extensions = arrayOf(), config = Config(showFileSize = true), { + MultiImagePicker.showPicker(this, extensions = arrayOf(), pickerConfig = PickerConfig(showFileSize = true), { setupBaseMultiPicker(tintForLoadingProgressBar = ContextCompat.getColor( this@MainActivity, R.color.colorPrimaryDark ), @@ -236,7 +254,16 @@ class MainActivity : AppCompatActivity(), View.OnClickListener { }, viewHolderPlaceholderModifications = { resID = R.drawable.ic_image - }) + }, + sizeTextModifications = { + textAlignment = TextView.TEXT_ALIGNMENT_VIEW_START + textStyle = SizeTextModifier.TextStyle.NORMAL + margin = 22 // use dp or sp this is only for demonstration purposes + textColor = Color.GREEN + textPadding = 6 // use dp or sp this is only for demonstration purposes + textSize = 12f // use sp this is only for demonstration purposes + } + ) }) { list -> doSomethingWithImageList(list) } @@ -244,7 +271,7 @@ class MainActivity : AppCompatActivity(), View.OnClickListener { private fun showSingleImageBottomSheetPicker() { - SingleImagePicker.showPicker(this, extensions = arrayOf(), config = Config(showFileSize = true),{ + SingleImagePicker.showPicker(this, extensions = arrayOf(), pickerConfig = PickerConfig(showFileSize = true), { loadingIndicatorTint = ContextCompat.getColor(this@MainActivity, R.color.colorPrimaryDark) titleTextModifier.apply { @@ -267,6 +294,15 @@ class MainActivity : AppCompatActivity(), View.OnClickListener { viewHolderPlaceholderModifier.apply { resID = R.drawable.ic_image } + sizeTextModifier.apply { + textAlignment = TextView.TEXT_ALIGNMENT_VIEW_START + textStyle = SizeTextModifier.TextStyle.NORMAL + margin = 22 // use dp or sp this is only for demonstration purposes + textColor = Color.BLACK + textPadding = 5 // use dp or sp this is only for demonstration purposes + textSize = 12f // use sp this is only for demonstration purposes + backgroundDrawable = R.drawable.rounded_bg_abstract_dialog + } }, ::loadImage) } diff --git a/core/src/main/java/com/crazylegend/core/Extensions.kt b/core/src/main/java/com/crazylegend/core/Extensions.kt index f80dffb..838deff 100644 --- a/core/src/main/java/com/crazylegend/core/Extensions.kt +++ b/core/src/main/java/com/crazylegend/core/Extensions.kt @@ -19,6 +19,7 @@ import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target import com.crazylegend.core.modifiers.base.BaseMultiPickerModifier import com.crazylegend.core.modifiers.base.BaseSinglePickerModifier +import kotlin.math.pow /** * Created by crazy on 5/8/20 to long live and prosper ! @@ -143,7 +144,15 @@ internal var Float.dp: Float } set(_) {} -internal fun Int.bytesToMegabytesFormatted(): String { - val megabytes = this / (1024.0 * 1024.0) - return "%.2f MB".format(megabytes) +internal fun Int.bytesToFormattedString(): String { + return when { + this >= 1024.0.pow(3.0) -> { + val gigabytes = this / 1024.0.pow(3.0) + "%.2f GB".format(gigabytes) + } + else -> { + val megabytes = this / 1024.0.pow(2.0) + "%.2f MB".format(megabytes) + } + } } \ No newline at end of file diff --git a/core/src/main/java/com/crazylegend/core/adapters/multi/MultiSelectViewHolder.kt b/core/src/main/java/com/crazylegend/core/adapters/multi/MultiSelectViewHolder.kt index f8d0346..b63adc4 100644 --- a/core/src/main/java/com/crazylegend/core/adapters/multi/MultiSelectViewHolder.kt +++ b/core/src/main/java/com/crazylegend/core/adapters/multi/MultiSelectViewHolder.kt @@ -2,7 +2,7 @@ package com.crazylegend.core.adapters.multi import androidx.core.view.isVisible import com.crazylegend.core.adapters.BaseViewHolder -import com.crazylegend.core.bytesToMegabytesFormatted +import com.crazylegend.core.bytesToFormattedString import com.crazylegend.core.databinding.ItemviewImageBinding import com.crazylegend.core.dto.BaseCursorModel import com.crazylegend.core.modifiers.base.BaseMultiPickerModifier @@ -29,10 +29,12 @@ class MultiSelectViewHolder( fun bind(cursorModel: BaseCursorModel, showFileSize: Boolean) { loadImage(binding.image, cursorModel.contentUri, viewHolderPlaceholderModifier) if (showFileSize) { + modifier?.sizeTextModifier?.applyTextParams(binding.size) + modifier?.sizeTextModifier?.applyTextParamsConstraint(binding.size) binding.size.isVisible = false cursorModel.size?.let { size -> - binding.size.isVisible = true - binding.size.text = size.bytesToMegabytesFormatted() + binding.size.isVisible = size > 0 + binding.size.text = size.bytesToFormattedString() } } if (cursorModel.isSelected) { diff --git a/core/src/main/java/com/crazylegend/core/adapters/single/SingleAdapter.kt b/core/src/main/java/com/crazylegend/core/adapters/single/SingleAdapter.kt index 0c587bb..3d53f11 100644 --- a/core/src/main/java/com/crazylegend/core/adapters/single/SingleAdapter.kt +++ b/core/src/main/java/com/crazylegend/core/adapters/single/SingleAdapter.kt @@ -5,6 +5,7 @@ import androidx.recyclerview.widget.ListAdapter import com.crazylegend.core.databinding.ItemviewImageBinding import com.crazylegend.core.dto.BaseCursorModel import com.crazylegend.core.inflater +import com.crazylegend.core.modifiers.SizeTextModifier import com.crazylegend.core.modifiers.single.ImageModifier @@ -12,12 +13,13 @@ import com.crazylegend.core.modifiers.single.ImageModifier * Created by crazy on 5/8/20 to long live and prosper ! */ -open class SingleAdapter(private val viewHolderPlaceholderModifier: ImageModifier?, +open class SingleAdapter(private val showFileSize: Boolean, + private val viewHolderPlaceholderModifier: ImageModifier?, + private val sizeTextModifier: SizeTextModifier?, private val onClick: (BaseCursorModel) -> Unit) : ListAdapter(SingleDiffUtil()) { - var showFileSize: Boolean = false override fun onCreateViewHolder(parent: ViewGroup, viewBaseCursorModelype: Int) = - SingleViewHolder(ItemviewImageBinding.inflate(parent.inflater, parent, false), viewHolderPlaceholderModifier, onClick) + SingleViewHolder(ItemviewImageBinding.inflate(parent.inflater, parent, false), viewHolderPlaceholderModifier, sizeTextModifier, onClick) override fun onBindViewHolder(holder: SingleViewHolder, position: Int) { val item = getItem(position) diff --git a/core/src/main/java/com/crazylegend/core/adapters/single/SingleViewHolder.kt b/core/src/main/java/com/crazylegend/core/adapters/single/SingleViewHolder.kt index d4d0c2d..b521cdf 100644 --- a/core/src/main/java/com/crazylegend/core/adapters/single/SingleViewHolder.kt +++ b/core/src/main/java/com/crazylegend/core/adapters/single/SingleViewHolder.kt @@ -2,10 +2,11 @@ package com.crazylegend.core.adapters.single import androidx.core.view.isVisible import com.crazylegend.core.adapters.BaseViewHolder -import com.crazylegend.core.bytesToMegabytesFormatted +import com.crazylegend.core.bytesToFormattedString import com.crazylegend.core.databinding.ItemviewImageBinding import com.crazylegend.core.dto.BaseCursorModel import com.crazylegend.core.gone +import com.crazylegend.core.modifiers.SizeTextModifier import com.crazylegend.core.modifiers.single.ImageModifier @@ -14,16 +15,18 @@ import com.crazylegend.core.modifiers.single.ImageModifier */ class SingleViewHolder(private val binding: ItemviewImageBinding, - private val viewHolderPlaceholderModifier: ImageModifier?, onClick: (BaseCursorModel) -> Unit) : + private val viewHolderPlaceholderModifier: ImageModifier?, private val sizeTextModifier: SizeTextModifier?, onClick: (BaseCursorModel) -> Unit) : BaseViewHolder(binding) { fun bind(item: BaseCursorModel, showFileSize: Boolean) { loadImage(binding.image, item.contentUri, viewHolderPlaceholderModifier) if (showFileSize) { + sizeTextModifier?.applyTextParams(binding.size) + sizeTextModifier?.applyTextParamsConstraint(binding.size) binding.size.isVisible = false item.size?.let { size -> - binding.size.isVisible = true - binding.size.text = size.bytesToMegabytesFormatted() + binding.size.isVisible = size > 0 + binding.size.text = size.bytesToFormattedString() } } } diff --git a/core/src/main/java/com/crazylegend/core/dto/Config.kt b/core/src/main/java/com/crazylegend/core/dto/Config.kt deleted file mode 100644 index b51a12b..0000000 --- a/core/src/main/java/com/crazylegend/core/dto/Config.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.crazylegend.core.dto - -data class Config(val showFileSize: Boolean = false) \ No newline at end of file diff --git a/core/src/main/java/com/crazylegend/core/dto/PickerConfig.kt b/core/src/main/java/com/crazylegend/core/dto/PickerConfig.kt new file mode 100644 index 0000000..c87a378 --- /dev/null +++ b/core/src/main/java/com/crazylegend/core/dto/PickerConfig.kt @@ -0,0 +1,3 @@ +package com.crazylegend.core.dto + +data class PickerConfig(val showFileSize: Boolean = false) \ No newline at end of file diff --git a/core/src/main/java/com/crazylegend/core/modifiers/SizeTextModifier.kt b/core/src/main/java/com/crazylegend/core/modifiers/SizeTextModifier.kt new file mode 100644 index 0000000..ae4fde3 --- /dev/null +++ b/core/src/main/java/com/crazylegend/core/modifiers/SizeTextModifier.kt @@ -0,0 +1,133 @@ +package com.crazylegend.core.modifiers + +import android.content.res.ColorStateList +import android.graphics.Color +import android.graphics.Paint +import android.graphics.Typeface +import android.os.Parcelable +import android.widget.TextView +import androidx.appcompat.widget.AppCompatTextView +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.core.content.ContextCompat +import androidx.core.view.setMargins +import androidx.core.view.setPadding +import androidx.core.view.updateLayoutParams +import kotlinx.parcelize.Parcelize + + +/** + * Created by crazy on 5/11/20 to long live and prosper ! + */ + + +@Parcelize +data class SizeTextModifier( + var textColor: Int? = null, + var textPadding: Int? = null, + var textSize: Float? = null, + var startMargin: Int? = null, + var endMargin: Int? = null, + var marginTop: Int? = null, + var marginBottom: Int? = null, + var margin: Int? = null, + var backgroundColor: Int? = null, + var backgroundDrawable: Int? = null, + var textStyle: TextStyle = TextStyle.NORMAL, + var textAlignment: Int = TextView.TEXT_ALIGNMENT_VIEW_START +) : Parcelable { + + + private val allSizeMarginCondition get() = margin != null + + enum class TextStyle { + BOLD, UNDERLINED, ITALIC, BOLD_ITALIC, NORMAL + } + + private fun updateMargins(textView: AppCompatTextView) { + textView.updateLayoutParams { + startMargin?.let { marginStart = it } + endMargin?.let { marginEnd = it } + marginTop?.let { topMargin = it } + marginBottom?.let { bottomMargin = it } + } + } + + private fun updateMarginsConstraint(textView: AppCompatTextView) { + textView.updateLayoutParams { + startMargin?.let { marginStart = it } + endMargin?.let { marginEnd = it } + marginTop?.let { topMargin = it } + marginBottom?.let { bottomMargin = it } + } + } + + private fun updateAllMargins(textView: AppCompatTextView) { + textView.updateLayoutParams { + margin?.let { setMargins(it) } + } + } + + private fun updateAllMarginsConstraint(textView: AppCompatTextView) { + textView.updateLayoutParams { + margin?.let { setMargins(it) } + } + } + + fun applyTextParams(text: AppCompatTextView) { + textSize?.let { text.textSize = it } + textPadding?.let { text.setPadding(it) } + textColor?.let { text.setTextColor(it) } + text.textAlignment = textAlignment + backgroundColor?.let { text.setBackgroundColor(it) } + applyTextStyle(text) + if (allSizeMarginCondition) { + updateAllMargins(text) + } else { + updateMargins(text) + } + } + + fun applyTextParamsConstraint(text: AppCompatTextView) { + textSize?.let { text.textSize = it } + textPadding?.let { text.setPadding(it) } + textColor?.let { text.setTextColor(it) } + text.textAlignment = textAlignment + backgroundDrawable?.let { text.background = ContextCompat.getDrawable(text.context, it) } + ?: run { + text.backgroundTintList = ColorStateList.valueOf(Color.BLACK) + } + applyTextStyle(text) + if (allSizeMarginCondition) { + updateAllMarginsConstraint(text) + } else { + updateMarginsConstraint(text) + } + } + + fun applyBackGroundDrawable(text: AppCompatTextView) { + } + + private fun applyTextStyle(text: AppCompatTextView) { + when (textStyle) { + TextStyle.BOLD -> { + text.setTypeface(text.typeface, Typeface.BOLD) + } + + TextStyle.UNDERLINED -> { + text.paintFlags = text.paintFlags or Paint.UNDERLINE_TEXT_FLAG + } + + TextStyle.ITALIC -> { + text.setTypeface(text.typeface, Typeface.ITALIC) + } + + TextStyle.BOLD_ITALIC -> { + text.setTypeface(text.typeface, Typeface.BOLD_ITALIC) + } + + else -> { + + } + } + } +} \ No newline at end of file diff --git a/core/src/main/java/com/crazylegend/core/modifiers/base/BaseMultiPickerModifier.kt b/core/src/main/java/com/crazylegend/core/modifiers/base/BaseMultiPickerModifier.kt index 204528d..534c27a 100644 --- a/core/src/main/java/com/crazylegend/core/modifiers/base/BaseMultiPickerModifier.kt +++ b/core/src/main/java/com/crazylegend/core/modifiers/base/BaseMultiPickerModifier.kt @@ -7,11 +7,16 @@ import androidx.core.view.marginBottom import androidx.core.view.marginLeft import androidx.core.view.marginRight import androidx.core.view.marginTop -import com.crazylegend.core.* +import com.crazylegend.core.bottom +import com.crazylegend.core.constrainBottomToTopOf +import com.crazylegend.core.left +import com.crazylegend.core.modifiers.SizeTextModifier import com.crazylegend.core.modifiers.TitleTextModifier import com.crazylegend.core.modifiers.multi.DoneButtonModifier import com.crazylegend.core.modifiers.multi.SelectIconModifier import com.crazylegend.core.modifiers.single.ImageModifier +import com.crazylegend.core.right +import com.crazylegend.core.top import kotlinx.parcelize.Parcelize @@ -28,7 +33,8 @@ open class BaseMultiPickerModifier( open var indicatorsGravity: Gravity = Gravity.BOTTOM_RIGHT, open val viewHolderPlaceholderModifier: ImageModifier = ImageModifier(), open val noContentTextModifier: TitleTextModifier = TitleTextModifier(), - open var loadingIndicatorTint: Int? = null + open var loadingIndicatorTint: Int? = null, + open val sizeTextModifier: SizeTextModifier = SizeTextModifier(), ) : Parcelable { enum class Gravity { @@ -42,7 +48,8 @@ open class BaseMultiPickerModifier( unSelectIconModifications: SelectIconModifier.() -> Unit = {}, viewHolderPlaceholderModifications: ImageModifier.() -> Unit = {}, gravityForSelectAndUnSelectIndicators: Gravity = Gravity.BOTTOM_RIGHT, - tintForLoadingProgressBar: Int? = null + tintForLoadingProgressBar: Int? = null, + sizeTextModifications: SizeTextModifier.() -> Unit = {}, ) { doneButtonModifier.doneButtonModifications() titleTextModifier.titleModifications() @@ -51,6 +58,7 @@ open class BaseMultiPickerModifier( viewHolderPlaceholderModifier.viewHolderPlaceholderModifications() indicatorsGravity = gravityForSelectAndUnSelectIndicators loadingIndicatorTint = tintForLoadingProgressBar + sizeTextModifier.sizeTextModifications() } fun applyGravity(imageView: AppCompatImageView) { @@ -59,14 +67,17 @@ open class BaseMultiPickerModifier( imageView.top(imageView.marginTop) imageView.left(imageView.marginLeft) } + Gravity.TOP_RIGHT -> { imageView.top(imageView.marginTop) imageView.right(imageView.marginRight) } + Gravity.BOTTOM_LEFT -> { imageView.bottom(imageView.marginBottom) imageView.left(imageView.marginLeft) } + Gravity.BOTTOM_RIGHT -> { imageView.bottom(imageView.marginBottom) imageView.right(imageView.marginRight) @@ -80,14 +91,17 @@ open class BaseMultiPickerModifier( imageView.top(imageView.marginTop) imageView.left(imageView.marginLeft) } + Gravity.TOP_RIGHT -> { imageView.top(imageView.marginTop) imageView.right(imageView.marginRight) } + Gravity.BOTTOM_LEFT -> { imageView.constrainBottomToTopOf(view, imageView.marginBottom) imageView.left(imageView.marginLeft) } + Gravity.BOTTOM_RIGHT -> { imageView.constrainBottomToTopOf(view, imageView.marginBottom) imageView.right(imageView.marginRight) diff --git a/core/src/main/java/com/crazylegend/core/modifiers/base/BaseSinglePickerModifier.kt b/core/src/main/java/com/crazylegend/core/modifiers/base/BaseSinglePickerModifier.kt index 5a4d4c8..4ad2e3b 100644 --- a/core/src/main/java/com/crazylegend/core/modifiers/base/BaseSinglePickerModifier.kt +++ b/core/src/main/java/com/crazylegend/core/modifiers/base/BaseSinglePickerModifier.kt @@ -1,6 +1,7 @@ package com.crazylegend.core.modifiers.base import android.os.Parcelable +import com.crazylegend.core.modifiers.SizeTextModifier import com.crazylegend.core.modifiers.TitleTextModifier import com.crazylegend.core.modifiers.single.ImageModifier import kotlinx.parcelize.Parcelize @@ -15,17 +16,21 @@ open class BaseSinglePickerModifier( open val titleTextModifier: TitleTextModifier = TitleTextModifier(), open val viewHolderPlaceholderModifier: ImageModifier = ImageModifier(), open val noContentTextModifier: TitleTextModifier = TitleTextModifier(), - open var loadingIndicatorTint: Int? = null + open var loadingIndicatorTint: Int? = null, + open val sizeTextModifier: SizeTextModifier = SizeTextModifier(), ) : Parcelable { inline fun setupBaseModifier( loadingIndicatorColor: Int? = null, titleTextModifications: TitleTextModifier.() -> Unit = {}, placeHolderModifications: ImageModifier.() -> Unit = {}, - noContentTextModifications: TitleTextModifier.() -> Unit = {}) { + noContentTextModifications: TitleTextModifier.() -> Unit = {}, + sizeTextModifications: SizeTextModifier.() -> Unit = {}, + ) { titleTextModifier.titleTextModifications() loadingIndicatorTint = loadingIndicatorColor viewHolderPlaceholderModifier.placeHolderModifications() noContentTextModifier.noContentTextModifications() + sizeTextModifier.sizeTextModifications() } } \ No newline at end of file diff --git a/core/src/main/res/layout/itemview_image.xml b/core/src/main/res/layout/itemview_image.xml index 7a2bb0b..3e7e824 100644 --- a/core/src/main/res/layout/itemview_image.xml +++ b/core/src/main/res/layout/itemview_image.xml @@ -23,14 +23,13 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> - ? = arrayOf() - var config: Config = Config() + var pickerConfig: PickerConfig = PickerConfig() override val layout: Int get() = super.layout @@ -75,7 +75,7 @@ internal class MultiImagePickerBottomSheetDialog : AbstractBottomSheetDialogFrag ::applyDoneButtonModifications, ::applyTitleModifications ) - multiSelectAdapter.showFileSize = config.showFileSize + multiSelectAdapter.showFileSize = pickerConfig.showFileSize imagesVM.images.observe(viewLifecycleOwner) { setupList( diff --git a/imagepicker/src/main/java/com/crazylegend/imagepicker/dialogs/single/SingleImagePickerBottomSheetDialog.kt b/imagepicker/src/main/java/com/crazylegend/imagepicker/dialogs/single/SingleImagePickerBottomSheetDialog.kt index e60ead7..c23686c 100644 --- a/imagepicker/src/main/java/com/crazylegend/imagepicker/dialogs/single/SingleImagePickerBottomSheetDialog.kt +++ b/imagepicker/src/main/java/com/crazylegend/imagepicker/dialogs/single/SingleImagePickerBottomSheetDialog.kt @@ -15,7 +15,7 @@ import androidx.lifecycle.observe import com.crazylegend.core.abstracts.AbstractBottomSheetDialogFragment import com.crazylegend.core.adapters.single.SingleAdapter import com.crazylegend.core.databinding.FragmentImagesGalleryLayoutBinding -import com.crazylegend.core.dto.Config +import com.crazylegend.core.dto.PickerConfig import com.crazylegend.core.modifiers.base.BaseSinglePickerModifier import com.crazylegend.extensions.viewBinding import com.crazylegend.imagepicker.contracts.SinglePickerContracts @@ -29,7 +29,7 @@ import com.crazylegend.imagepicker.pickers.SingleImagePicker * Created by crazy on 5/8/20 to long live and prosper ! */ internal class SingleImagePickerBottomSheetDialog : AbstractBottomSheetDialogFragment(), - SinglePickerContracts { + SinglePickerContracts { override val layout: Int get() = super.layout @@ -39,14 +39,14 @@ internal class SingleImagePickerBottomSheetDialog : AbstractBottomSheetDialogFra override val modifier: BaseSinglePickerModifier? get() = arguments?.getParcelable(modifierTag) var extensions: Array? = arrayOf() - var config: Config = Config() + var pickerConfig: PickerConfig = PickerConfig() override val singleAdapter by lazy { - SingleAdapter(modifier?.viewHolderPlaceholderModifier) { + SingleAdapter(pickerConfig.showFileSize, modifier?.viewHolderPlaceholderModifier, modifier?.sizeTextModifier) { val image = it as ImageModel setFragmentResult( - SingleImagePicker.SINGLE_IMAGE_REQUEST_KEY, - bundleOf(SingleImagePicker.ON_SINGLE_IMAGE_PICK_KEY to image) + SingleImagePicker.SINGLE_IMAGE_REQUEST_KEY, + bundleOf(SingleImagePicker.ON_SINGLE_IMAGE_PICK_KEY to image) ) onImagePicked?.forImage(image) dismissAllowingStateLoss() @@ -54,14 +54,14 @@ internal class SingleImagePickerBottomSheetDialog : AbstractBottomSheetDialogFra } override val askForStoragePermission = - registerForActivityResult(ActivityResultContracts.RequestPermission()) { - if (it) { - imagesVM.loadImages(extensions = extensions) - } else { - Log.e(errorTag, "PERMISSION DENIED") - dismissAllowingStateLoss() + registerForActivityResult(ActivityResultContracts.RequestPermission()) { + if (it) { + imagesVM.loadImages(extensions = extensions) + } else { + Log.e(errorTag, "PERMISSION DENIED") + dismissAllowingStateLoss() + } } - } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -72,14 +72,13 @@ internal class SingleImagePickerBottomSheetDialog : AbstractBottomSheetDialogFra askForStoragePermission.launch(Manifest.permission.READ_MEDIA_IMAGES) } setupUIForSinglePicker( - binding.gallery, - singleAdapter, - binding.title, - binding.loadingIndicator, - modifier?.loadingIndicatorTint, - ::applyTitleModifications + binding.gallery, + singleAdapter, + binding.title, + binding.loadingIndicator, + modifier?.loadingIndicatorTint, + ::applyTitleModifications ) - singleAdapter.showFileSize = config.showFileSize imagesVM.images.observe(viewLifecycleOwner) { setupList(singleAdapter, it, binding.noContentText, modifier?.noContentTextModifier) } diff --git a/imagepicker/src/main/java/com/crazylegend/imagepicker/pickers/MultiImagePicker.kt b/imagepicker/src/main/java/com/crazylegend/imagepicker/pickers/MultiImagePicker.kt index 88e629e..acd473f 100644 --- a/imagepicker/src/main/java/com/crazylegend/imagepicker/pickers/MultiImagePicker.kt +++ b/imagepicker/src/main/java/com/crazylegend/imagepicker/pickers/MultiImagePicker.kt @@ -3,7 +3,7 @@ package com.crazylegend.imagepicker.pickers import android.content.Context import android.util.Log import androidx.fragment.app.FragmentManager -import com.crazylegend.core.dto.Config +import com.crazylegend.core.dto.PickerConfig import com.crazylegend.core.modifiers.base.BaseMultiPickerModifier import com.crazylegend.core.setupModifier import com.crazylegend.extensions.setupManager @@ -39,16 +39,16 @@ object MultiImagePicker { fun showPicker( - context: Context, extensions: Array? = arrayOf(), - config: Config = Config(), - multiImagePickerModifier: BaseMultiPickerModifier.() -> Unit = {}, - imagesList: (list: List) -> Unit = {} + context: Context, extensions: Array? = arrayOf(), + pickerConfig: PickerConfig = PickerConfig(), + multiImagePickerModifier: BaseMultiPickerModifier.() -> Unit = {}, + imagesList: (list: List) -> Unit = {} ) { val manager = context.setupManager() val modifier = setupModifier(multiImagePickerModifier) with(MultiImagePickerBottomSheetDialog()) { this.extensions = extensions - this.config = config + this.pickerConfig = pickerConfig addModifier(modifier) onImagesPicked = onImagesDSL(imagesList) show(manager, MULTI_PICKER_BOTTOM_SHEET) @@ -58,14 +58,14 @@ object MultiImagePicker { fun showPicker( fragmentManager: FragmentManager, extensions: Array? = arrayOf(), - config: Config = Config(), + pickerConfig: PickerConfig = PickerConfig(), multiImagePickerModifier: BaseMultiPickerModifier.() -> Unit = {}, imagesList: (list: List) -> Unit = {} ) { val modifier = setupModifier(multiImagePickerModifier) with(MultiImagePickerBottomSheetDialog()) { this.extensions = extensions - this.config = config + this.pickerConfig = pickerConfig addModifier(modifier) onImagesPicked = onImagesDSL(imagesList) show(fragmentManager, MULTI_PICKER_BOTTOM_SHEET) diff --git a/imagepicker/src/main/java/com/crazylegend/imagepicker/pickers/SingleImagePicker.kt b/imagepicker/src/main/java/com/crazylegend/imagepicker/pickers/SingleImagePicker.kt index 12e434a..a2cc7e2 100644 --- a/imagepicker/src/main/java/com/crazylegend/imagepicker/pickers/SingleImagePicker.kt +++ b/imagepicker/src/main/java/com/crazylegend/imagepicker/pickers/SingleImagePicker.kt @@ -3,7 +3,7 @@ package com.crazylegend.imagepicker.pickers import android.content.Context import android.util.Log import androidx.fragment.app.FragmentManager -import com.crazylegend.core.dto.Config +import com.crazylegend.core.dto.PickerConfig import com.crazylegend.core.modifiers.base.BaseSinglePickerModifier import com.crazylegend.core.setupModifier import com.crazylegend.extensions.setupManager @@ -39,7 +39,7 @@ object SingleImagePicker { fun showPicker( context: Context, extensions: Array? = arrayOf(), - config: Config = Config(), + pickerConfig: PickerConfig = PickerConfig(), pickerModifier: BaseSinglePickerModifier.() -> Unit = {}, onPickedImage: (image: ImageModel) -> Unit = {} ) { @@ -47,7 +47,7 @@ object SingleImagePicker { val manager = context.setupManager() with(SingleImagePickerBottomSheetDialog()) { this.extensions = extensions - this.config = config + this.pickerConfig = pickerConfig addModifier(modifier) onImagePicked = onImageDSL(onPickedImage) show(manager, SINGLE_PICKER_BOTTOM_SHEET) @@ -55,16 +55,16 @@ object SingleImagePicker { } fun showPicker( - fragmentManager: FragmentManager, - extensions: Array? = arrayOf(), - config: Config = Config(), - pickerModifier: BaseSinglePickerModifier.() -> Unit = {}, - onPickedImage: (image: ImageModel) -> Unit = {} + fragmentManager: FragmentManager, + extensions: Array? = arrayOf(), + pickerConfig: PickerConfig = PickerConfig(), + pickerModifier: BaseSinglePickerModifier.() -> Unit = {}, + onPickedImage: (image: ImageModel) -> Unit = {} ) { val modifier = setupModifier(pickerModifier) with(SingleImagePickerBottomSheetDialog()) { this.extensions = extensions - this.config = config + this.pickerConfig = pickerConfig addModifier(modifier) onImagePicked = onImageDSL(onPickedImage) show(fragmentManager, SINGLE_PICKER_BOTTOM_SHEET) diff --git a/videopicker/README.md b/videopicker/README.md index 9f79695..11f6cc4 100644 --- a/videopicker/README.md +++ b/videopicker/README.md @@ -76,6 +76,15 @@ import java.awt.Color }, viewHolderPlaceholderModifications = { resID = R.drawable.ic_close + }, + sizeTextModifications = { + textAlignment = TextView.TEXT_ALIGNMENT_VIEW_START + textStyle = SizeTextModifier.TextStyle.NORMAL + margin = 22 // use dp or sp this is only for demonstration purposes + textColor = Color.BLACK + textPadding = 5 // use dp or sp this is only for demonstration purposes + textSize = 12f // use sp this is only for demonstration purposes + backgroundDrawable = R.drawable.rounded_bg_abstract_dialog } ) }, ::doSomethingWithVideoList) diff --git a/videopicker/src/main/java/com/crazylegend/videopicker/dialogs/multi/MultiVideoPickerBottomSheetDialog.kt b/videopicker/src/main/java/com/crazylegend/videopicker/dialogs/multi/MultiVideoPickerBottomSheetDialog.kt index 59416cd..19b1c9b 100644 --- a/videopicker/src/main/java/com/crazylegend/videopicker/dialogs/multi/MultiVideoPickerBottomSheetDialog.kt +++ b/videopicker/src/main/java/com/crazylegend/videopicker/dialogs/multi/MultiVideoPickerBottomSheetDialog.kt @@ -15,7 +15,7 @@ import androidx.lifecycle.observe import com.crazylegend.core.abstracts.AbstractBottomSheetDialogFragment import com.crazylegend.core.adapters.multi.MultiSelectAdapter import com.crazylegend.core.databinding.FragmentImagesGalleryLayoutMultiBinding -import com.crazylegend.core.dto.Config +import com.crazylegend.core.dto.PickerConfig import com.crazylegend.core.modifiers.base.BaseMultiPickerModifier import com.crazylegend.extensions.viewBinding import com.crazylegend.videopicker.contracts.MultiPickerContracts @@ -44,7 +44,7 @@ internal class MultiVideoPickerBottomSheetDialog : AbstractBottomSheetDialogFrag MultiSelectAdapter(modifier) } var extensions: Array? = arrayOf() - var config: Config = Config() + var pickerConfig: PickerConfig = PickerConfig() override val askForStoragePermission = registerForActivityResult(ActivityResultContracts.RequestPermission()) { @@ -74,7 +74,7 @@ internal class MultiVideoPickerBottomSheetDialog : AbstractBottomSheetDialogFrag ::applyDoneButtonModifications, ::applyTitleModifications ) - multiSelectAdapter.showFileSize = config.showFileSize + multiSelectAdapter.showFileSize = pickerConfig.showFileSize videosVM.videos.observe(viewLifecycleOwner) { setupList( multiSelectAdapter, diff --git a/videopicker/src/main/java/com/crazylegend/videopicker/dialogs/single/SingleVideoPickerBottomSheetDialog.kt b/videopicker/src/main/java/com/crazylegend/videopicker/dialogs/single/SingleVideoPickerBottomSheetDialog.kt index 70982d5..c263514 100644 --- a/videopicker/src/main/java/com/crazylegend/videopicker/dialogs/single/SingleVideoPickerBottomSheetDialog.kt +++ b/videopicker/src/main/java/com/crazylegend/videopicker/dialogs/single/SingleVideoPickerBottomSheetDialog.kt @@ -15,7 +15,7 @@ import androidx.lifecycle.observe import com.crazylegend.core.abstracts.AbstractBottomSheetDialogFragment import com.crazylegend.core.adapters.single.SingleAdapter import com.crazylegend.core.databinding.FragmentImagesGalleryLayoutBinding -import com.crazylegend.core.dto.Config +import com.crazylegend.core.dto.PickerConfig import com.crazylegend.core.modifiers.base.BaseSinglePickerModifier import com.crazylegend.extensions.viewBinding import com.crazylegend.videopicker.contracts.SinglePickerContracts @@ -37,12 +37,12 @@ internal class SingleVideoPickerBottomSheetDialog : AbstractBottomSheetDialogFra override val binding by viewBinding(FragmentImagesGalleryLayoutBinding::bind) override val videosVM by viewModels() var extensions: Array? = arrayOf() - var config: Config = Config() + var pickerConfig: PickerConfig = PickerConfig() override val modifier: BaseSinglePickerModifier? get() = arguments?.getParcelable(modifierTag) override val singleAdapter by lazy { - SingleAdapter(modifier?.viewHolderPlaceholderModifier) { + SingleAdapter(pickerConfig.showFileSize, modifier?.viewHolderPlaceholderModifier, modifier?.sizeTextModifier) { setFragmentResult( SingleVideoPicker.SINGLE_VIDEO_REQUEST_KEY, bundleOf(SingleVideoPicker.ON_SINGLE_VIDEO_PICK_KEY to it as VideoModel) @@ -70,7 +70,6 @@ internal class SingleVideoPickerBottomSheetDialog : AbstractBottomSheetDialogFra } else { askForStoragePermission.launch(Manifest.permission.READ_MEDIA_VIDEO) } - singleAdapter.showFileSize = config.showFileSize setupUIForSinglePicker( binding.gallery, singleAdapter, diff --git a/videopicker/src/main/java/com/crazylegend/videopicker/pickers/MultiVideoPicker.kt b/videopicker/src/main/java/com/crazylegend/videopicker/pickers/MultiVideoPicker.kt index 11efa8c..7f6d1db 100644 --- a/videopicker/src/main/java/com/crazylegend/videopicker/pickers/MultiVideoPicker.kt +++ b/videopicker/src/main/java/com/crazylegend/videopicker/pickers/MultiVideoPicker.kt @@ -3,7 +3,7 @@ package com.crazylegend.videopicker.pickers import android.content.Context import android.util.Log import androidx.fragment.app.FragmentManager -import com.crazylegend.core.dto.Config +import com.crazylegend.core.dto.PickerConfig import com.crazylegend.core.modifiers.base.BaseMultiPickerModifier import com.crazylegend.core.setupModifier import com.crazylegend.extensions.setupManager @@ -40,7 +40,7 @@ object MultiVideoPicker { fun showPicker( context: Context, extensions: Array? = arrayOf(), - config: Config = Config(), + pickerConfig: PickerConfig = PickerConfig(), modifier: BaseMultiPickerModifier.() -> Unit = {}, videoList: (list: List) -> Unit = {}, ) { @@ -48,7 +48,7 @@ object MultiVideoPicker { val setupModifier = setupModifier(modifier) with(MultiVideoPickerBottomSheetDialog()) { this.extensions = extensions - this.config = config + this.pickerConfig = pickerConfig addModifier(setupModifier) onVideosPicked = onVideosDSL(videoList) show(manager, MULTI_PICKER_BOTTOM_SHEET) @@ -58,14 +58,14 @@ object MultiVideoPicker { fun showPicker( fragmentManager: FragmentManager, extensions: Array? = arrayOf(), - config: Config = Config(), + pickerConfig: PickerConfig = PickerConfig(), modifier: BaseMultiPickerModifier.() -> Unit = {}, videoList: (list: List) -> Unit = {} ) { val setupModifier = setupModifier(modifier) with(MultiVideoPickerBottomSheetDialog()) { this.extensions = extensions - this.config = config + this.pickerConfig = pickerConfig addModifier(setupModifier) onVideosPicked = onVideosDSL(videoList) show(fragmentManager, MULTI_PICKER_BOTTOM_SHEET) diff --git a/videopicker/src/main/java/com/crazylegend/videopicker/pickers/SingleVideoPicker.kt b/videopicker/src/main/java/com/crazylegend/videopicker/pickers/SingleVideoPicker.kt index 99b837e..5e194dc 100644 --- a/videopicker/src/main/java/com/crazylegend/videopicker/pickers/SingleVideoPicker.kt +++ b/videopicker/src/main/java/com/crazylegend/videopicker/pickers/SingleVideoPicker.kt @@ -3,7 +3,7 @@ package com.crazylegend.videopicker.pickers import android.content.Context import android.util.Log import androidx.fragment.app.FragmentManager -import com.crazylegend.core.dto.Config +import com.crazylegend.core.dto.PickerConfig import com.crazylegend.core.modifiers.base.BaseSinglePickerModifier import com.crazylegend.core.setupModifier import com.crazylegend.extensions.setupManager @@ -37,17 +37,17 @@ object SingleVideoPicker { } fun showPicker( - context: Context, - extensions: Array? = arrayOf(), - config: Config = Config(), - pickerModifier: BaseSinglePickerModifier.() -> Unit = {}, - onPickedVideo: (video: VideoModel) -> Unit = {} + context: Context, + extensions: Array? = arrayOf(), + pickerConfig: PickerConfig = PickerConfig(), + pickerModifier: BaseSinglePickerModifier.() -> Unit = {}, + onPickedVideo: (video: VideoModel) -> Unit = {} ) { val modifier = setupModifier(pickerModifier) val manager = context.setupManager() with(SingleVideoPickerBottomSheetDialog()) { this.extensions = extensions - this.config = config + this.pickerConfig = pickerConfig addModifier(modifier) onVideoPicked = onVideoDSL(onPickedVideo) show(manager, SINGLE_PICKER_BOTTOM_SHEET) @@ -57,14 +57,14 @@ object SingleVideoPicker { fun showPicker( fragmentManager: FragmentManager, extensions: Array? = arrayOf(), - config: Config = Config(), + pickerConfig: PickerConfig = PickerConfig(), pickerModifier: BaseSinglePickerModifier.() -> Unit = {}, onPickedVideo: (video: VideoModel) -> Unit = {} ) { val modifier = setupModifier(pickerModifier) with(SingleVideoPickerBottomSheetDialog()) { this.extensions = extensions - this.config = config + this.pickerConfig = pickerConfig addModifier(modifier) onVideoPicked = onVideoDSL(onPickedVideo) show(fragmentManager, SINGLE_PICKER_BOTTOM_SHEET)