From ae3caf84b5000c847fd4907889789ec8bf0a0e48 Mon Sep 17 00:00:00 2001 From: tarsin Date: Sat, 13 May 2023 17:41:19 +0800 Subject: [PATCH] Kick pickVisualMediaLauncher out of GalleryListScene scope --- .../ehviewer/ui/scene/GalleryListScene.kt | 20 +-------------- .../ehviewer/widget/ImageSearchLayout.java | 3 --- .../com/hippo/ehviewer/widget/SearchLayout.kt | 25 ++++++++----------- .../{PermissionUtils.kt => LauncherUtils.kt} | 20 +++++++++++++++ 4 files changed, 32 insertions(+), 36 deletions(-) rename app/src/main/java/com/hippo/util/{PermissionUtils.kt => LauncherUtils.kt} (57%) diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt index d8232cb8b..fc652ce93 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.kt @@ -20,7 +20,6 @@ import android.annotation.SuppressLint import android.content.DialogInterface import android.content.Intent import android.content.res.Resources -import android.net.Uri import android.os.Bundle import android.text.InputType import android.text.Spannable @@ -35,9 +34,6 @@ import android.view.ViewGroup import android.view.ViewPropertyAnimator import android.widget.TextView import androidx.activity.OnBackPressedCallback -import androidx.activity.result.PickVisualMediaRequest -import androidx.activity.result.contract.ActivityResultContracts -import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageOnly import androidx.annotation.IntDef import androidx.core.content.ContextCompat import androidx.core.view.GravityCompat @@ -117,12 +113,7 @@ import java.time.ZoneId import java.time.ZoneOffset import com.hippo.ehviewer.download.DownloadManager as downloadManager -class GalleryListScene : - SearchBarScene(), - OnDragHandlerListener, - SearchLayout.Helper, - OnClickFabListener, - OnExpandListener { +class GalleryListScene : SearchBarScene(), OnDragHandlerListener, SearchLayout.Helper, OnClickFabListener, OnExpandListener { private val mCallback = object : OnBackPressedCallback(false) { override fun handleOnBackPressed() { when (mState) { @@ -135,9 +126,6 @@ class GalleryListScene : private lateinit var mUrlBuilder: ListUrlBuilder private var _binding: SceneGalleryListBinding? = null private val binding get() = _binding!! - private val selectImageLauncher = registerForActivityResult( - ActivityResultContracts.PickVisualMedia(), - ) { result: Uri? -> binding.searchLayout.setImageUri(result) } private var mSearchFab: View? = null private val mSearchFabAnimatorListener: Animator.AnimatorListener = object : SimpleAnimatorListener() { @@ -1056,12 +1044,6 @@ class GalleryListScene : showSearchBar() } - override fun onSelectImage() { - val builder = PickVisualMediaRequest.Builder() - builder.setMediaType(ImageOnly) - selectImageLauncher.launch(builder.build()) - } - private fun onGetGalleryListSuccess(result: GalleryListParser.Result, taskId: Int) { if (Settings.preloadThumbAggressively) { lifecycleScope.launchIO { diff --git a/app/src/main/java/com/hippo/ehviewer/widget/ImageSearchLayout.java b/app/src/main/java/com/hippo/ehviewer/widget/ImageSearchLayout.java index d0822a5bd..3deeabbc4 100644 --- a/app/src/main/java/com/hippo/ehviewer/widget/ImageSearchLayout.java +++ b/app/src/main/java/com/hippo/ehviewer/widget/ImageSearchLayout.java @@ -123,9 +123,6 @@ public final class ImageSearchLayout extends LinearLayout implements View.OnClic try { var src = ImageDecoder.createSource(context.getContentResolver(), imageUri); Bitmap bitmap = ImageDecoder.decodeBitmap(src, Image.getImageSearchDecoderSampleListener()); - if (null == bitmap) { - return; - } File temp = AppConfig.createTempFile(); if (null == temp) { return; diff --git a/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.kt b/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.kt index 1683fdcb2..172cd2855 100644 --- a/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.kt +++ b/app/src/main/java/com/hippo/ehviewer/widget/SearchLayout.kt @@ -21,7 +21,6 @@ package com.hippo.ehviewer.widget import android.annotation.SuppressLint import android.content.Context import android.content.SharedPreferences -import android.net.Uri import android.util.AttributeSet import android.view.LayoutInflater import android.view.View @@ -31,9 +30,12 @@ import android.widget.CompoundButton import android.widget.FrameLayout import android.widget.ImageView import android.widget.TextView +import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.ImageOnly import androidx.annotation.IntDef import androidx.core.content.edit import androidx.core.view.forEach +import androidx.lifecycle.findViewTreeLifecycleOwner +import androidx.lifecycle.lifecycleScope import androidx.preference.PreferenceManager import androidx.recyclerview.widget.DefaultItemAnimator import androidx.recyclerview.widget.LinearLayoutManager @@ -49,9 +51,11 @@ import com.hippo.ehviewer.R import com.hippo.ehviewer.client.EhUtils import com.hippo.ehviewer.client.data.ListUrlBuilder import com.hippo.ehviewer.client.exception.EhException +import com.hippo.util.pickVisualMedia import com.hippo.widget.RadioGridGroup import com.hippo.yorozuya.NumberUtils import com.hippo.yorozuya.ViewUtils +import kotlinx.coroutines.launch @SuppressLint("InflateParams") class SearchLayout @JvmOverloads constructor( @@ -60,7 +64,6 @@ class SearchLayout @JvmOverloads constructor( ) : EasyRecyclerView(context, attrs), CompoundButton.OnCheckedChangeListener, View.OnClickListener, - ImageSearchLayout.Helper, OnTabSelectedListener { @SearchMode @@ -145,7 +148,12 @@ class SearchLayout @JvmOverloads constructor( mTableAdvanceSearch = mAdvanceView.findViewById(R.id.search_advance_search_table) // Create image view mImageView = mInflater.inflate(R.layout.search_image, null) as ImageSearchLayout - mImageView.setHelper(this) + mImageView.setHelper { + findViewTreeLifecycleOwner()!!.lifecycleScope.launch { + val uri = pickVisualMedia(ImageOnly) + mImageView.setImageUri(uri) + } + } // Create action view mActionView = mInflater.inflate(R.layout.search_action, null) mActionView.layoutParams = LayoutParams( @@ -164,10 +172,6 @@ class SearchLayout @JvmOverloads constructor( (layoutManager as LinearLayoutManager).scrollToPositionWithOffset(0, 0) } - fun setImageUri(imageUri: Uri?) { - mImageView.setImageUri(imageUri) - } - fun setNormalSearchMode(id: Int) { mNormalSearchMode.check(id) } @@ -180,12 +184,6 @@ class SearchLayout @JvmOverloads constructor( } } - override fun onSelectImage() { - if (mHelper != null) { - mHelper!!.onSelectImage() - } - } - override fun onCheckedChanged(buttonView: CompoundButton, isChecked: Boolean) { if (buttonView === mEnableAdvanceSwitch) { post { @@ -285,7 +283,6 @@ class SearchLayout @JvmOverloads constructor( private annotation class SearchMode interface Helper { fun onChangeSearchMode() - fun onSelectImage() } internal class SearchLayoutManager(context: Context?) : LinearLayoutManager(context!!) { diff --git a/app/src/main/java/com/hippo/util/PermissionUtils.kt b/app/src/main/java/com/hippo/util/LauncherUtils.kt similarity index 57% rename from app/src/main/java/com/hippo/util/PermissionUtils.kt rename to app/src/main/java/com/hippo/util/LauncherUtils.kt index 2c062048e..bee70e04c 100644 --- a/app/src/main/java/com/hippo/util/PermissionUtils.kt +++ b/app/src/main/java/com/hippo/util/LauncherUtils.kt @@ -2,23 +2,34 @@ package com.hippo.util import android.content.Context import android.content.pm.PackageManager +import android.net.Uri import androidx.activity.ComponentActivity import androidx.activity.result.ActivityResultLauncher +import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts +import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType import androidx.core.content.ContextCompat import kotlinx.coroutines.suspendCancellableCoroutine import kotlin.coroutines.resume private lateinit var requestPermissionLauncher: ActivityResultLauncher +private lateinit var pickVisualMediaLauncher: ActivityResultLauncher private lateinit var callback: (Boolean) -> Unit +private lateinit var callback2: (Uri?) -> Unit + fun ComponentActivity.initPermission() { requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission(), ::permissionCallback) + pickVisualMediaLauncher = registerForActivityResult(ActivityResultContracts.PickVisualMedia(), ::pickVisualMediaCallback) } private fun permissionCallback(v: Boolean) { callback(v) } +private fun pickVisualMediaCallback(v: Uri?) { + callback2(v) +} + suspend fun Context.requestPermission(key: String): Boolean { if (ContextCompat.checkSelfPermission(this, key) == PackageManager.PERMISSION_GRANTED) return true return suspendCancellableCoroutine { cont -> @@ -28,3 +39,12 @@ suspend fun Context.requestPermission(key: String): Boolean { requestPermissionLauncher.launch(key) } } + +suspend fun pickVisualMedia(type: VisualMediaType): Uri? { + return suspendCancellableCoroutine { cont -> + callback2 = { + cont.resume(it) + } + pickVisualMediaLauncher.launch(PickVisualMediaRequest.Builder().setMediaType(type).build()) + } +}