@@ -20,13 +20,15 @@ import android.view.View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
2020import android.widget.Button
2121import android.widget.TextView
2222import android.widget.Toast
23- import androidx.activity.result.ActivityResultCallback
2423import androidx.activity.result.ActivityResultLauncher
24+ import androidx.activity.result.PickVisualMediaRequest
2525import androidx.activity.result.contract.ActivityResultContracts
2626import androidx.activity.viewModels
2727import androidx.appcompat.app.AppCompatActivity
2828import androidx.core.content.ContextCompat
2929import androidx.core.content.edit
30+ import androidx.core.view.ViewCompat
31+ import androidx.core.view.WindowCompat
3032import androidx.core.view.forEach
3133import androidx.fragment.app.commit
3234import androidx.lifecycle.Lifecycle
@@ -52,7 +54,6 @@ import me.rosuh.easywatermark.ui.panel.*
5254import me.rosuh.easywatermark.ui.widget.CenterLayoutManager
5355import me.rosuh.easywatermark.ui.widget.LaunchView
5456import me.rosuh.easywatermark.utils.FileUtils
55- import me.rosuh.easywatermark.utils.PickImageContract
5657import me.rosuh.easywatermark.utils.VibrateHelper
5758import me.rosuh.easywatermark.utils.ktx.*
5859import me.rosuh.easywatermark.utils.onItemClick
@@ -61,14 +62,22 @@ import me.rosuh.easywatermark.utils.onItemClick
6162@AndroidEntryPoint
6263class MainActivity : AppCompatActivity () {
6364
64- private lateinit var pickIconLauncher: ActivityResultLauncher <String >
65+ private lateinit var pickIconPhotoPickerLauncher: ActivityResultLauncher <PickVisualMediaRequest >
66+ private lateinit var pickMultiplePhotoPickerLauncher: ActivityResultLauncher <PickVisualMediaRequest >
67+ private lateinit var pickIconLegacyLauncher: ActivityResultLauncher <String >
6568 private val viewModel: MainViewModel by viewModels()
6669
6770 private val currentBgColor: Int
6871 get() = ((launchView.parent as ? View ? )?.background as ? ColorDrawable )?.color ? : colorSurface
6972
7073 private lateinit var requestPermissionLauncher: ActivityResultLauncher <String >
7174
75+ private var pendingPermissionAction: (() -> Unit )? = null
76+
77+ private val isSystemPhotoPickerAvailable by lazy {
78+ ActivityResultContracts .PickVisualMedia .isPhotoPickerAvailable(this )
79+ }
80+
7281 private val contentFunList: List <FuncTitleModel > by lazy {
7382 listOf (
7483 FuncTitleModel (
@@ -227,19 +236,32 @@ class MainActivity : AppCompatActivity() {
227236 }
228237
229238 private fun registerResultCallback () {
230- pickIconLauncher =
231- registerForActivityResult(PickImageContract ()) { uri: Uri ? ->
232- handleActivityResult(REQ_PICK_ICON , listOf (uri))
239+ pickMultiplePhotoPickerLauncher =
240+ registerForActivityResult(ActivityResultContracts .PickMultipleVisualMedia ()) { uris ->
241+ handlePickedMedia(REQ_CODE_PICK_IMAGE , uris)
242+ }
243+ pickIconPhotoPickerLauncher =
244+ registerForActivityResult(ActivityResultContracts .PickVisualMedia ()) { uri ->
245+ val result = uri?.let (::listOf) ? : emptyList()
246+ handlePickedMedia(REQ_PICK_ICON , result)
247+ }
248+ pickIconLegacyLauncher =
249+ registerForActivityResult(ActivityResultContracts .GetContent ()) { uri: Uri ? ->
250+ val result = uri?.let (::listOf) ? : emptyList()
251+ handlePickedMedia(REQ_PICK_ICON , result)
233252 }
234253 requestPermissionLauncher = registerForActivityResult(ActivityResultContracts .RequestPermission ()) { isGranted ->
235254 if (isGranted) {
255+ pendingPermissionAction?.invoke()
256+ pendingPermissionAction = null
236257 return @registerForActivityResult
237258 }
238259 Toast .makeText(
239260 this ,
240261 getString(R .string.request_permission_failed),
241262 Toast .LENGTH_SHORT
242263 ).show()
264+ pendingPermissionAction = null
243265 }
244266 }
245267
@@ -441,9 +463,7 @@ class MainActivity : AppCompatActivity() {
441463 }
442464 // pick image button
443465 launchView.ivSelectedPhotoTips.setOnClickListener {
444- checkReadingPermission(requestPermissionLauncher) {
445- performFileSearch(REQ_CODE_PICK_IMAGE )
446- }
466+ performFileSearch(REQ_CODE_PICK_IMAGE )
447467 }
448468 // setting bg
449469 launchView.ivPhoto.apply {
@@ -595,9 +615,7 @@ class MainActivity : AppCompatActivity() {
595615 TextContentDisplayFragment .replaceShow(this , launchView.fcFunctionDetail.id)
596616 }
597617 FuncTitleModel .FuncType .Icon -> {
598- checkReadingPermission(requestPermissionLauncher) {
599- performFileSearch(REQ_PICK_ICON )
600- }
618+ performFileSearch(REQ_PICK_ICON )
601619 }
602620 FuncTitleModel .FuncType .Color -> {
603621 ColorFragment .replaceShow(this , launchView.fcFunctionDetail.id)
@@ -664,9 +682,7 @@ class MainActivity : AppCompatActivity() {
664682 }
665683
666684 R .id.action_pick -> {
667- checkReadingPermission(requestPermissionLauncher) {
668- performFileSearch(REQ_CODE_PICK_IMAGE )
669- }
685+ performFileSearch(REQ_CODE_PICK_IMAGE )
670686 true
671687 }
672688
@@ -683,33 +699,44 @@ class MainActivity : AppCompatActivity() {
683699 * Fires an intent to spin up the "file chooser" UI and select an image.
684700 */
685701 private fun performFileSearch (requestCode : Int ) {
686- if (requestCode == REQ_PICK_ICON ) {
687- val mime = " image/*"
688- val result = kotlin.runCatching {
689- when (requestCode) {
690- REQ_PICK_ICON -> {
691- pickIconLauncher.launch(mime)
692- }
693- }
694- }
702+ val request = PickVisualMediaRequest .Builder ()
703+ .setMediaType(ActivityResultContracts .PickVisualMedia .ImageOnly )
704+ .build()
695705
696- if (result.isFailure) {
697- Toast .makeText(
698- this ,
699- getString(R .string.tips_not_app_can_open_images),
700- Toast .LENGTH_LONG
701- ).show()
702- Log .i(" performFileSearch" , result.exceptionOrNull()?.message ? : " No msg provided" )
706+ if (isSystemPhotoPickerAvailable) {
707+ launchView.logoView.stop()
708+ when (requestCode) {
709+ REQ_PICK_ICON -> pickIconPhotoPickerLauncher.launch(request)
710+ else -> pickMultiplePhotoPickerLauncher.launch(request)
703711 }
704- } else {
705- GalleryFragment ().apply {
712+ return
713+ }
714+
715+ val launchLegacyPicker = {
716+ if (requestCode == REQ_PICK_ICON ) {
706717 launchView.logoView.stop()
707- doOnDismiss {
708- launchView.logoView.start()
709- }
710- show(supportFragmentManager, " GalleryFragment" )
718+ pickIconLegacyLauncher.launch(" image/*" )
719+ } else {
720+ openLegacyGallery()
711721 }
712722 }
723+
724+ pendingPermissionAction = launchLegacyPicker
725+ checkReadingPermission(requestPermissionLauncher, grant = {
726+ val action = pendingPermissionAction
727+ pendingPermissionAction = null
728+ action?.invoke()
729+ })
730+ }
731+
732+ private fun openLegacyGallery () {
733+ GalleryFragment ().apply {
734+ launchView.logoView.stop()
735+ doOnDismiss {
736+ launchView.logoView.start()
737+ }
738+ show(supportFragmentManager, " GalleryFragment" )
739+ }
713740 }
714741
715742 private fun dealWithImage (uri : List <Uri >) {
@@ -724,10 +751,11 @@ class MainActivity : AppCompatActivity() {
724751 }
725752 }
726753
727- private fun handleActivityResult (requestCode : Int , list : List <Uri ?>? ) {
728- val finalList = list?.filterNotNull()?.filter {
754+ private fun handlePickedMedia (requestCode : Int , list : List <Uri >) {
755+ launchView.logoView.start()
756+ val finalList = list.filter {
729757 FileUtils .isImage(this .contentResolver, it)
730- } ? : emptyList()
758+ }
731759 if (finalList.isEmpty()) {
732760 Toast .makeText(
733761 this ,
@@ -823,7 +851,12 @@ class MainActivity : AppCompatActivity() {
823851 }
824852
825853 fun requestPermission (block : () -> Unit ) {
826- checkWritingPermission(requestPermissionLauncher, grant = block)
854+ pendingPermissionAction = block
855+ checkWritingPermission(requestPermissionLauncher, grant = {
856+ val action = pendingPermissionAction
857+ pendingPermissionAction = null
858+ action?.invoke()
859+ })
827860 }
828861
829862 companion object {
0 commit comments