refactor: Migrate to Photo picker to select images
This commit is contained in:
parent
dd628ed6f1
commit
23da382b22
2 changed files with 25 additions and 75 deletions
|
@ -29,6 +29,7 @@ import android.view.animation.OvershootInterpolator
|
||||||
import android.widget.ImageView
|
import android.widget.ImageView
|
||||||
import androidx.activity.result.ActivityResultLauncher
|
import androidx.activity.result.ActivityResultLauncher
|
||||||
import androidx.activity.result.IntentSenderRequest
|
import androidx.activity.result.IntentSenderRequest
|
||||||
|
import androidx.activity.result.PickVisualMediaRequest
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.appcompat.app.AlertDialog
|
import androidx.appcompat.app.AlertDialog
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
|
@ -37,7 +38,6 @@ import code.name.monkey.appthemehelper.util.VersionUtils
|
||||||
import code.name.monkey.retromusic.R
|
import code.name.monkey.retromusic.R
|
||||||
import code.name.monkey.retromusic.R.drawable
|
import code.name.monkey.retromusic.R.drawable
|
||||||
import code.name.monkey.retromusic.activities.base.AbsBaseActivity
|
import code.name.monkey.retromusic.activities.base.AbsBaseActivity
|
||||||
import code.name.monkey.retromusic.activities.saf.SAFGuideActivity
|
|
||||||
import code.name.monkey.retromusic.extensions.accentColor
|
import code.name.monkey.retromusic.extensions.accentColor
|
||||||
import code.name.monkey.retromusic.extensions.colorButtons
|
import code.name.monkey.retromusic.extensions.colorButtons
|
||||||
import code.name.monkey.retromusic.extensions.hideSoftKeyboard
|
import code.name.monkey.retromusic.extensions.hideSoftKeyboard
|
||||||
|
@ -45,7 +45,6 @@ import code.name.monkey.retromusic.extensions.setTaskDescriptionColorAuto
|
||||||
import code.name.monkey.retromusic.model.ArtworkInfo
|
import code.name.monkey.retromusic.model.ArtworkInfo
|
||||||
import code.name.monkey.retromusic.model.AudioTagInfo
|
import code.name.monkey.retromusic.model.AudioTagInfo
|
||||||
import code.name.monkey.retromusic.repository.Repository
|
import code.name.monkey.retromusic.repository.Repository
|
||||||
import code.name.monkey.retromusic.util.SAFUtil
|
|
||||||
import code.name.monkey.retromusic.util.logD
|
import code.name.monkey.retromusic.util.logD
|
||||||
import com.google.android.material.button.MaterialButton
|
import com.google.android.material.button.MaterialButton
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
|
@ -56,7 +55,6 @@ import org.jaudiotagger.audio.AudioFileIO
|
||||||
import org.jaudiotagger.tag.FieldKey
|
import org.jaudiotagger.tag.FieldKey
|
||||||
import org.koin.android.ext.android.inject
|
import org.koin.android.ext.android.inject
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.Collections
|
|
||||||
|
|
||||||
abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
|
abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
|
||||||
abstract val editorImage: ImageView
|
abstract val editorImage: ImageView
|
||||||
|
@ -212,6 +210,11 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val pickArtworkImage =
|
||||||
|
registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
|
||||||
|
loadImageFromFile(uri)
|
||||||
|
}
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
_binding = bindingInflater.invoke(layoutInflater)
|
_binding = bindingInflater.invoke(layoutInflater)
|
||||||
|
@ -252,14 +255,7 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun startImagePicker() {
|
private fun startImagePicker() {
|
||||||
val intent = Intent(Intent.ACTION_GET_CONTENT)
|
pickArtworkImage.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
|
||||||
intent.type = "image/*"
|
|
||||||
startActivityForResult(
|
|
||||||
Intent.createChooser(
|
|
||||||
intent,
|
|
||||||
getString(R.string.pick_from_local_storage)
|
|
||||||
), REQUEST_CODE_SELECT_IMAGE
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract fun loadCurrentImage()
|
protected abstract fun loadCurrentImage()
|
||||||
|
@ -400,36 +396,6 @@ abstract class AbsTagEditorActivity<VB : ViewBinding> : AbsBaseActivity() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) {
|
|
||||||
super.onActivityResult(requestCode, resultCode, intent)
|
|
||||||
when (requestCode) {
|
|
||||||
REQUEST_CODE_SELECT_IMAGE -> if (resultCode == Activity.RESULT_OK) {
|
|
||||||
intent?.data?.let {
|
|
||||||
loadImageFromFile(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SAFGuideActivity.REQUEST_CODE_SAF_GUIDE -> {
|
|
||||||
SAFUtil.openTreePicker(this)
|
|
||||||
}
|
|
||||||
|
|
||||||
SAFUtil.REQUEST_SAF_PICK_TREE -> {
|
|
||||||
if (resultCode == Activity.RESULT_OK) {
|
|
||||||
SAFUtil.saveTreeUri(this, intent)
|
|
||||||
writeTags(savedSongPaths)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SAFUtil.REQUEST_SAF_PICK_FILE -> {
|
|
||||||
if (resultCode == Activity.RESULT_OK) {
|
|
||||||
writeTags(Collections.singletonList(currentSongPath + SAFUtil.SEPARATOR + intent!!.dataString))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private fun getAudioFile(path: String): AudioFile {
|
private fun getAudioFile(path: String): AudioFile {
|
||||||
return try {
|
return try {
|
||||||
AudioFileIO.read(File(path))
|
AudioFileIO.read(File(path))
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package code.name.monkey.retromusic.fragments.artists
|
package code.name.monkey.retromusic.fragments.artists
|
||||||
|
|
||||||
import android.app.Activity
|
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.graphics.Color
|
import android.graphics.Color
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
|
@ -9,6 +8,7 @@ import android.view.Menu
|
||||||
import android.view.MenuInflater
|
import android.view.MenuInflater
|
||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import android.view.View
|
import android.view.View
|
||||||
|
import androidx.activity.result.PickVisualMediaRequest
|
||||||
import androidx.activity.result.contract.ActivityResultContracts
|
import androidx.activity.result.contract.ActivityResultContracts
|
||||||
import androidx.appcompat.widget.PopupMenu
|
import androidx.appcompat.widget.PopupMenu
|
||||||
import androidx.core.os.bundleOf
|
import androidx.core.os.bundleOf
|
||||||
|
@ -153,14 +153,10 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
|
||||||
MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(artist.songs))
|
MusicUtil.getReadableDurationString(MusicUtil.getTotalDuration(artist.songs))
|
||||||
)
|
)
|
||||||
val songText = resources.getQuantityString(
|
val songText = resources.getQuantityString(
|
||||||
R.plurals.albumSongs,
|
R.plurals.albumSongs, artist.songCount, artist.songCount
|
||||||
artist.songCount,
|
|
||||||
artist.songCount
|
|
||||||
)
|
)
|
||||||
val albumText = resources.getQuantityString(
|
val albumText = resources.getQuantityString(
|
||||||
R.plurals.albums,
|
R.plurals.albums, artist.songCount, artist.songCount
|
||||||
artist.songCount,
|
|
||||||
artist.songCount
|
|
||||||
)
|
)
|
||||||
binding.fragmentArtistContent.songTitle.text = songText
|
binding.fragmentArtistContent.songTitle.text = songText
|
||||||
binding.fragmentArtistContent.albumTitle.text = albumText
|
binding.fragmentArtistContent.albumTitle.text = albumText
|
||||||
|
@ -174,8 +170,7 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
|
||||||
) {
|
) {
|
||||||
biography = null
|
biography = null
|
||||||
this.lang = lang
|
this.lang = lang
|
||||||
detailsViewModel.getArtistInfo(name, lang, null)
|
detailsViewModel.getArtistInfo(name, lang, null).observe(viewLifecycleOwner) { result ->
|
||||||
.observe(viewLifecycleOwner) { result ->
|
|
||||||
when (result) {
|
when (result) {
|
||||||
is Result.Loading -> logD("Loading")
|
is Result.Loading -> logD("Loading")
|
||||||
is Result.Error -> logE("Error")
|
is Result.Error -> logE("Error")
|
||||||
|
@ -214,11 +209,8 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun loadArtistImage(artist: Artist) {
|
private fun loadArtistImage(artist: Artist) {
|
||||||
Glide.with(requireContext())
|
Glide.with(requireContext()).asBitmapPalette().artistImageOptions(artist)
|
||||||
.asBitmapPalette()
|
.load(RetroGlideExtension.getArtistModel(artist)).dontAnimate()
|
||||||
.artistImageOptions(artist)
|
|
||||||
.load(RetroGlideExtension.getArtistModel(artist))
|
|
||||||
.dontAnimate()
|
|
||||||
.into(object : SingleColorTarget(binding.image) {
|
.into(object : SingleColorTarget(binding.image) {
|
||||||
override fun onColorReady(color: Int) {
|
override fun onColorReady(color: Int) {
|
||||||
setColors(color)
|
setColors(color)
|
||||||
|
@ -274,13 +266,8 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
|
||||||
}
|
}
|
||||||
|
|
||||||
R.id.action_set_artist_image -> {
|
R.id.action_set_artist_image -> {
|
||||||
val intent = Intent(Intent.ACTION_GET_CONTENT)
|
|
||||||
intent.type = "image/*"
|
|
||||||
selectImageLauncher.launch(
|
selectImageLauncher.launch(
|
||||||
Intent.createChooser(
|
PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly)
|
||||||
intent,
|
|
||||||
getString(R.string.pick_from_local_storage)
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -336,14 +323,14 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
|
||||||
SortOrder.ArtistSongSortOrder.SONG_Z_A -> sortOrder.findItem(R.id.action_sort_order_title_desc).isChecked =
|
SortOrder.ArtistSongSortOrder.SONG_Z_A -> sortOrder.findItem(R.id.action_sort_order_title_desc).isChecked =
|
||||||
true
|
true
|
||||||
|
|
||||||
SortOrder.ArtistSongSortOrder.SONG_ALBUM ->
|
SortOrder.ArtistSongSortOrder.SONG_ALBUM -> sortOrder.findItem(R.id.action_sort_order_album).isChecked =
|
||||||
sortOrder.findItem(R.id.action_sort_order_album).isChecked = true
|
true
|
||||||
|
|
||||||
SortOrder.ArtistSongSortOrder.SONG_YEAR ->
|
SortOrder.ArtistSongSortOrder.SONG_YEAR -> sortOrder.findItem(R.id.action_sort_order_year).isChecked =
|
||||||
sortOrder.findItem(R.id.action_sort_order_year).isChecked = true
|
true
|
||||||
|
|
||||||
SortOrder.ArtistSongSortOrder.SONG_DURATION ->
|
SortOrder.ArtistSongSortOrder.SONG_DURATION -> sortOrder.findItem(R.id.action_sort_order_song_duration).isChecked =
|
||||||
sortOrder.findItem(R.id.action_sort_order_song_duration).isChecked = true
|
true
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
throw IllegalArgumentException("invalid $savedSongSortOrder")
|
throw IllegalArgumentException("invalid $savedSongSortOrder")
|
||||||
|
@ -352,14 +339,11 @@ abstract class AbsArtistDetailsFragment : AbsMainActivityFragment(R.layout.fragm
|
||||||
}
|
}
|
||||||
|
|
||||||
private val selectImageLauncher =
|
private val selectImageLauncher =
|
||||||
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
|
registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
|
||||||
if (result.resultCode == Activity.RESULT_OK) {
|
|
||||||
result.data?.data?.let {
|
|
||||||
lifecycleScope.launch {
|
lifecycleScope.launch {
|
||||||
|
if (uri != null) {
|
||||||
CustomArtistImageUtil.getInstance(requireContext())
|
CustomArtistImageUtil.getInstance(requireContext())
|
||||||
.setCustomArtistImage(artist, it)
|
.setCustomArtistImage(artist, uri)
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue