diff --git a/README.md b/README.md index 514b3f4..3511799 100644 --- a/README.md +++ b/README.md @@ -26,13 +26,13 @@ allprojects { Add the following dependency in app build.gradle: ``` dependencies { - implementation 'io.github.samuel-unknown:gallery-image-picker:1.6.3' + implementation 'io.github.samuel-unknown:gallery-image-picker:1.7.0' // if you want to use default Glide implementation for ImageLoaderFactory - implementation 'io.github.samuel-unknown:gallery-image-picker-glide:1.6.3' + implementation 'io.github.samuel-unknown:gallery-image-picker-glide:1.7.0' // if you want to use default Coil implementation for ImageLoaderFactory - implementation 'io.github.samuel-unknown:gallery-image-picker-coil:1.6.3' + implementation 'io.github.samuel-unknown:gallery-image-picker-coil:1.7.0' } ``` @@ -145,7 +145,7 @@ dependencies { #### Version 1.6.* - [x] New parameters for customization #### Version 1.7.* -- [ ] Camera integration (preview and capture) +- [x] Popup menu customization ## License ``` diff --git a/build-logic/convention/src/main/kotlin/com/samuelunknown/galleryImagePicker/LibraryVersion.kt b/build-logic/convention/src/main/kotlin/com/samuelunknown/galleryImagePicker/LibraryVersion.kt index 1e7d34b..b11c736 100644 --- a/build-logic/convention/src/main/kotlin/com/samuelunknown/galleryImagePicker/LibraryVersion.kt +++ b/build-logic/convention/src/main/kotlin/com/samuelunknown/galleryImagePicker/LibraryVersion.kt @@ -3,8 +3,8 @@ package com.samuelunknown.galleryImagePicker object LibraryVersion { private val major = 1 // change when you make incompatible API changes - private val minor = 6 // change when you add functionality in a backwards-compatible manner - private val build = 3 // change when you make backwards-compatible bug fixes + private val minor = 7 // change when you add functionality in a backwards-compatible manner + private val build = 0 // change when you make backwards-compatible bug fixes val versionCode = major * 10000 + minor * 100 + build val versionName = "${major}.${minor}.${build}" diff --git a/galleryImagePicker/src/main/java/com/samuelunknown/galleryImagePicker/extensions/IntentExtensions.kt b/galleryImagePicker/src/main/java/com/samuelunknown/galleryImagePicker/extensions/IntentExtensions.kt index 96550b2..7c223d3 100644 --- a/galleryImagePicker/src/main/java/com/samuelunknown/galleryImagePicker/extensions/IntentExtensions.kt +++ b/galleryImagePicker/src/main/java/com/samuelunknown/galleryImagePicker/extensions/IntentExtensions.kt @@ -1,6 +1,7 @@ package com.samuelunknown.galleryImagePicker.extensions import android.content.Intent +import android.os.Build import com.samuelunknown.galleryImagePicker.domain.model.GalleryConfigurationDto import com.samuelunknown.galleryImagePicker.domain.model.ImagesResultDto import java.lang.Exception @@ -9,7 +10,7 @@ private const val EXTRA_IMAGES_RESULT_DTO = "EXTRA_IMAGES_RESULT_DTO" private const val EXTRA_CONFIGURATION_DTO = "EXTRA_CONFIGURATION_DTO" internal fun Intent.getImagesResultDto(): ImagesResultDto? { - return this.getParcelableExtra(EXTRA_IMAGES_RESULT_DTO) + return this.getParcelableItem(EXTRA_IMAGES_RESULT_DTO) } internal fun Intent.putImagesResultDto(activityResultDto: ImagesResultDto): Intent { @@ -17,10 +18,19 @@ internal fun Intent.putImagesResultDto(activityResultDto: ImagesResultDto): Inte } internal fun Intent.getGalleryConfigurationDto(): GalleryConfigurationDto { - return this.getParcelableExtra(EXTRA_CONFIGURATION_DTO) + return this.getParcelableItem(EXTRA_CONFIGURATION_DTO) ?: throw Exception("${GalleryConfigurationDto::class.java} not found.") } internal fun Intent.putGalleryConfigurationDto(activityResultDto: GalleryConfigurationDto): Intent { return this.putExtra(EXTRA_CONFIGURATION_DTO, activityResultDto) -} \ No newline at end of file +} + +internal inline fun Intent.getParcelableItem(key: String): T? { + return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + getParcelableExtra(key, T::class.java) + } else { + @Suppress("DEPRECATION") + getParcelableExtra(key) + } +} diff --git a/galleryImagePicker/src/main/java/com/samuelunknown/galleryImagePicker/presentation/ui/screen/gallery/fragment/GalleryFragment.kt b/galleryImagePicker/src/main/java/com/samuelunknown/galleryImagePicker/presentation/ui/screen/gallery/fragment/GalleryFragment.kt index 857d990..a983d95 100644 --- a/galleryImagePicker/src/main/java/com/samuelunknown/galleryImagePicker/presentation/ui/screen/gallery/fragment/GalleryFragment.kt +++ b/galleryImagePicker/src/main/java/com/samuelunknown/galleryImagePicker/presentation/ui/screen/gallery/fragment/GalleryFragment.kt @@ -9,6 +9,8 @@ import android.view.Menu import android.view.View import android.view.ViewGroup import android.widget.PopupMenu +import androidx.appcompat.view.ContextThemeWrapper +import androidx.core.content.withStyledAttributes import androidx.core.view.doOnLayout import androidx.core.view.isVisible import androidx.core.view.marginBottom @@ -44,6 +46,7 @@ import com.samuelunknown.galleryImagePicker.presentation.ui.screen.gallery.fragm import com.samuelunknown.galleryImagePicker.presentation.ui.screen.gallery.fragment.recycler.GridSpacingItemDecoration import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import com.samuelunknown.galleryImagePicker.R internal class GalleryFragment private constructor( private val configurationDto: GalleryConfigurationDto, @@ -99,10 +102,6 @@ internal class GalleryFragment private constructor( binding.pickupButton.marginBottom } - private val popupMenu: PopupMenu by lazy(LazyThreadSafetyMode.NONE) { - PopupMenu(requireContext(), binding.toolbarTitle) - } - private val galleryAdapter: GalleryAdapter by lazy(LazyThreadSafetyMode.NONE) { GalleryAdapter( context = requireContext(), @@ -117,6 +116,8 @@ internal class GalleryFragment private constructor( ) } + private var popupMenu: PopupMenu? = null + private val vm: GalleryFragmentVm by savedStateViewModel { val contentResolver = requireContext().contentResolver GalleryFragmentVmFactory( @@ -143,6 +144,7 @@ internal class GalleryFragment private constructor( // NB: since vm must be initialized (for collecting actionFlow actions) before views send any actions vm.run { requireActivity().calculateScreenHeightWithoutSystemBars { height, width -> + initPopupMenu() initRootView(screenHeight = height) initBottomSheetDialog(screenHeight = height, screenWidth = width) initToolbar() @@ -159,6 +161,7 @@ internal class GalleryFragment private constructor( override fun onDestroyView() { super.onDestroyView() + popupMenu = null binding.recycler.adapter = null _binding = null } @@ -219,6 +222,18 @@ internal class GalleryFragment private constructor( } } + private fun initPopupMenu() { + requireContext().withStyledAttributes(configurationDto.themeResId, R.styleable.GalleryImagePickerAttributes) { + val popupMenuStyleResId = getResourceId( + R.styleable.GalleryImagePickerAttributes_gallery_image_picker__style_popup_menu, + R.style.GalleryImagePicker_Widget_PopupMenu + ) + + val contextWrapper = ContextThemeWrapper(requireContext(), popupMenuStyleResId) + popupMenu = PopupMenu(contextWrapper, binding.toolbarTitle) + } + } + private fun initToolbar() { initActionBar( toolbar = binding.toolbar, @@ -228,7 +243,7 @@ internal class GalleryFragment private constructor( binding.toolbarTitle.apply { text = defaultToolbarTitle - setOnClickListener { popupMenu.show() } + setOnClickListener { popupMenu?.show() } } binding.toolbar.title = "" @@ -319,13 +334,13 @@ internal class GalleryFragment private constructor( .apply { add(0, FolderItem(id = "", name = defaultToolbarTitle)) } .toList() - popupMenu.menu.clear() + popupMenu?.menu?.clear() menuItems.forEachIndexed { index, item -> - popupMenu.menu.add(Menu.NONE, index, index, item.name) + popupMenu?.menu?.add(Menu.NONE, index, index, item.name) } - popupMenu.setOnMenuItemClickListener { + popupMenu?.setOnMenuItemClickListener { val selectedFolder = if (it.itemId == 0) null else menuItems[it.itemId] vm.actionFlow.tryEmit(GalleryAction.GetImagesAction(selectedFolder)) true diff --git a/galleryImagePicker/src/main/res/values-night/colors.xml b/galleryImagePicker/src/main/res/values-night/colors.xml index d386b8e..aeb57c5 100644 --- a/galleryImagePicker/src/main/res/values-night/colors.xml +++ b/galleryImagePicker/src/main/res/values-night/colors.xml @@ -13,4 +13,4 @@ #FFFFFF #000000 #66000000 - \ No newline at end of file + diff --git a/galleryImagePicker/src/main/res/values-night/themes.xml b/galleryImagePicker/src/main/res/values-night/themes.xml index 086a4f8..f59bf37 100644 --- a/galleryImagePicker/src/main/res/values-night/themes.xml +++ b/galleryImagePicker/src/main/res/values-night/themes.xml @@ -4,9 +4,10 @@ @style/GalleryImagePicker.ThemeOverlay.AppBar @style/GalleryImagePicker.ThemeOverlay.BottomSheetDialog @style/GalleryImagePicker.Widget.Toolbar + @style/GalleryImagePicker.Widget.PopupMenu @style/GalleryImagePicker.Widget.PickupButton @style/GalleryImagePicker.Widget.Counter @color/gallery_image_picker__color_underlay @color/gallery_image_picker__color_top_line - \ No newline at end of file + diff --git a/galleryImagePicker/src/main/res/values/attrs.xml b/galleryImagePicker/src/main/res/values/attrs.xml index 60bf8ea..167f7d8 100644 --- a/galleryImagePicker/src/main/res/values/attrs.xml +++ b/galleryImagePicker/src/main/res/values/attrs.xml @@ -6,7 +6,8 @@ + - \ No newline at end of file + diff --git a/galleryImagePicker/src/main/res/values/colors.xml b/galleryImagePicker/src/main/res/values/colors.xml index 955c170..2f42dd2 100644 --- a/galleryImagePicker/src/main/res/values/colors.xml +++ b/galleryImagePicker/src/main/res/values/colors.xml @@ -13,4 +13,4 @@ #1C1C1C #FFFFFF #B3FFFFFF - \ No newline at end of file + diff --git a/galleryImagePicker/src/main/res/values/style_widget.xml b/galleryImagePicker/src/main/res/values/style_widget.xml index 595b5ec..a22b0c6 100644 --- a/galleryImagePicker/src/main/res/values/style_widget.xml +++ b/galleryImagePicker/src/main/res/values/style_widget.xml @@ -5,7 +5,6 @@ - \ No newline at end of file + + - - - \ No newline at end of file + diff --git a/sample/src/main/res/values/style_widget.xml b/sample/src/main/res/values/style_widget.xml index e43c73e..1a5dcdc 100644 --- a/sample/src/main/res/values/style_widget.xml +++ b/sample/src/main/res/values/style_widget.xml @@ -31,4 +31,9 @@ @drawable/bg_picker #000000 - \ No newline at end of file + + + diff --git a/sample/src/main/res/values/themes.xml b/sample/src/main/res/values/themes.xml index b6a42d7..de0d98f 100644 --- a/sample/src/main/res/values/themes.xml +++ b/sample/src/main/res/values/themes.xml @@ -11,9 +11,10 @@ @style/ThemeOverlay.AppBar @style/ThemeOverlay.BottomSheetDialog @style/Widget.Toolbar + @style/Widget.PopupMenu @style/Widget.PickupButton @style/Widget.Counter @color/gallery_image_picker__color_underlay @color/gallery_image_picker__color_top_line - \ No newline at end of file +