Kick pickVisualMediaLauncher out of GalleryListScene scope

This commit is contained in:
tarsin committed 2023-05-13 17:41:49 +08:00
1 parent 185d47fcdf
commit ae3caf84b5
4 files changed
+32 -36

No files matched your search

@@ -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<PickVisualMediaRequest, Uri>(
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 {
@@ -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;
@@ -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!!) {
@@ -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<String>
private lateinit var pickVisualMediaLauncher: ActivityResultLauncher<PickVisualMediaRequest>
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())
}
}