PlayerAndroid/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AlbumTagEditorActivity.kt

220 lines
8.0 KiB
Kotlin
Raw Normal View History

2020-10-06 08:46:04 +00:00
/*
* Copyright (c) 2020 Hemanth Savarla.
*
* Licensed under the GNU General Public License v3
*
* This is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
*/
2019-04-20 05:29:45 +00:00
package code.name.monkey.retromusic.activities.tageditor
2018-12-06 08:52:57 +00:00
import android.app.Activity
import android.content.res.ColorStateList
2019-12-01 15:45:12 +00:00
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Color
import android.graphics.drawable.Drawable
2018-12-06 08:52:57 +00:00
import android.net.Uri
import android.os.Bundle
2019-12-01 15:45:12 +00:00
import android.text.Editable
import android.text.TextWatcher
2020-01-05 20:25:55 +00:00
import android.transition.Slide
import android.view.LayoutInflater
import android.widget.ImageView
2018-12-06 08:52:57 +00:00
import android.widget.Toast
2019-12-01 15:45:12 +00:00
import code.name.monkey.appthemehelper.util.ATHUtil
2018-12-06 08:52:57 +00:00
import code.name.monkey.retromusic.R
import code.name.monkey.retromusic.databinding.ActivityAlbumTagEditorBinding
2019-07-30 21:46:50 +00:00
import code.name.monkey.retromusic.extensions.appHandleColor
import code.name.monkey.retromusic.extensions.setTint
import code.name.monkey.retromusic.glide.GlideApp
2019-12-01 15:45:12 +00:00
import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper
2020-10-12 17:22:53 +00:00
import code.name.monkey.retromusic.model.ArtworkInfo
import code.name.monkey.retromusic.model.Song
2019-12-01 15:45:12 +00:00
import code.name.monkey.retromusic.util.ImageUtil
2018-12-12 20:59:07 +00:00
import code.name.monkey.retromusic.util.RetroColorUtil.generatePalette
import code.name.monkey.retromusic.util.RetroColorUtil.getColor
2018-12-06 08:52:57 +00:00
import com.bumptech.glide.load.engine.DiskCacheStrategy
import com.bumptech.glide.request.target.ImageViewTarget
import com.bumptech.glide.request.transition.Transition
2018-12-06 08:52:57 +00:00
import org.jaudiotagger.tag.FieldKey
import java.util.*
2018-12-06 08:52:57 +00:00
class AlbumTagEditorActivity : AbsTagEditorActivity<ActivityAlbumTagEditorBinding>(), TextWatcher {
override val bindingInflater: (LayoutInflater) -> ActivityAlbumTagEditorBinding =
ActivityAlbumTagEditorBinding::inflate
2019-12-30 11:01:50 +00:00
2020-01-05 20:25:55 +00:00
private fun windowEnterTransition() {
val slide = Slide()
slide.excludeTarget(R.id.appBarLayout, true)
slide.excludeTarget(R.id.status_bar, true)
slide.excludeTarget(android.R.id.statusBarBackground, true)
slide.excludeTarget(android.R.id.navigationBarBackground, true)
window.enterTransition = slide
}
2020-08-21 18:01:52 +00:00
override fun loadImageFromFile(selectedFile: Uri?) {
GlideApp.with(this@AlbumTagEditorActivity).asBitmapPalette().load(selectedFile)
2019-12-30 11:01:50 +00:00
.diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true)
.into(object : ImageViewTarget<BitmapPaletteWrapper>(binding.editorImage) {
2019-12-30 11:01:50 +00:00
override fun onResourceReady(
resource: BitmapPaletteWrapper,
transition: Transition<in BitmapPaletteWrapper>?
2019-12-30 11:01:50 +00:00
) {
getColor(resource.palette, Color.TRANSPARENT)
albumArtBitmap = resource.bitmap?.let { ImageUtil.resizeBitmap(it, 2048) }
2019-12-30 11:01:50 +00:00
setImageBitmap(
albumArtBitmap,
getColor(
resource.palette,
ATHUtil.resolveColor(
this@AlbumTagEditorActivity,
R.attr.defaultFooterColor
)
2019-12-30 11:01:50 +00:00
)
)
deleteAlbumArt = false
dataChanged()
setResult(Activity.RESULT_OK)
}
override fun onLoadFailed(errorDrawable: Drawable?) {
super.onLoadFailed(errorDrawable)
Toast.makeText(this@AlbumTagEditorActivity, "Load Failed", Toast.LENGTH_LONG)
2019-12-30 11:01:50 +00:00
.show()
}
override fun setResource(resource: BitmapPaletteWrapper?) {}
2019-12-30 11:01:50 +00:00
})
}
private var albumArtBitmap: Bitmap? = null
private var deleteAlbumArt: Boolean = false
private fun setupToolbar() {
binding.toolbar.setBackgroundColor(ATHUtil.resolveColor(this, R.attr.colorSurface))
setSupportActionBar(binding.toolbar)
2019-12-30 11:01:50 +00:00
}
override fun onCreate(savedInstanceState: Bundle?) {
setDrawUnderStatusBar()
super.onCreate(savedInstanceState)
2020-01-05 20:25:55 +00:00
window.sharedElementsUseOverlay = true
binding.imageContainer.transitionName = getString(R.string.transition_album_art)
2020-01-05 20:25:55 +00:00
windowEnterTransition()
2019-12-30 11:01:50 +00:00
setUpViews()
setupToolbar()
}
private fun setUpViews() {
fillViewsWithFileTags()
binding.yearContainer.setTint(false)
binding.genreContainer.setTint(false)
binding.albumTitleContainer.setTint(false)
binding.albumArtistContainer.setTint(false)
2019-12-30 11:01:50 +00:00
binding.albumText.appHandleColor().addTextChangedListener(this)
binding.albumArtistText.appHandleColor().addTextChangedListener(this)
binding.genreTitle.appHandleColor().addTextChangedListener(this)
binding.yearTitle.appHandleColor().addTextChangedListener(this)
2019-12-30 11:01:50 +00:00
}
private fun fillViewsWithFileTags() {
binding.albumText.setText(albumTitle)
binding.albumArtistText.setText(albumArtistName)
binding.genreTitle.setText(genreName)
binding.yearTitle.setText(songYear)
println(albumTitle + albumArtistName)
2019-12-30 11:01:50 +00:00
}
override fun loadCurrentImage() {
val bitmap = albumArt
setImageBitmap(
bitmap,
getColor(
generatePalette(bitmap),
ATHUtil.resolveColor(this, R.attr.defaultFooterColor)
)
)
deleteAlbumArt = false
}
private fun toastLoadingFailed() {
Toast.makeText(
this@AlbumTagEditorActivity,
R.string.could_not_download_album_cover,
Toast.LENGTH_SHORT
).show()
}
override fun searchImageOnWeb() {
searchWebFor(binding.albumText.text.toString(), binding.albumArtistText.text.toString())
2019-12-30 11:01:50 +00:00
}
override fun deleteImage() {
setImageBitmap(
2020-02-25 13:15:23 +00:00
BitmapFactory.decodeResource(resources, R.drawable.default_audio_art),
2019-12-30 11:01:50 +00:00
ATHUtil.resolveColor(this, R.attr.defaultFooterColor)
)
deleteAlbumArt = true
dataChanged()
}
override fun save() {
val fieldKeyValueMap = EnumMap<FieldKey, String>(FieldKey::class.java)
fieldKeyValueMap[FieldKey.ALBUM] = binding.albumText.text.toString()
2020-10-06 08:46:04 +00:00
// android seems not to recognize album_artist field so we additionally write the normal artist field
fieldKeyValueMap[FieldKey.ARTIST] = binding.albumArtistText.text.toString()
fieldKeyValueMap[FieldKey.ALBUM_ARTIST] = binding.albumArtistText.text.toString()
fieldKeyValueMap[FieldKey.GENRE] = binding.genreTitle.text.toString()
fieldKeyValueMap[FieldKey.YEAR] = binding.yearTitle.text.toString()
2019-12-30 11:01:50 +00:00
2020-01-29 17:25:43 +00:00
writeValuesToFiles(
fieldKeyValueMap,
2020-10-12 17:22:53 +00:00
when {
deleteAlbumArt -> ArtworkInfo(id, null)
albumArtBitmap == null -> null
else -> ArtworkInfo(id, albumArtBitmap!!)
}
2019-12-30 11:01:50 +00:00
)
}
2020-08-31 12:30:07 +00:00
override fun getSongPaths(): List<String> {
return repository.albumById(id).songs
.map(Song::data)
2019-12-30 11:01:50 +00:00
}
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
}
override fun afterTextChanged(s: Editable) {
dataChanged()
}
override fun setColors(color: Int) {
super.setColors(color)
saveFab.backgroundTintList = ColorStateList.valueOf(color)
}
override val editorImage: ImageView
get() = binding.editorImage
2019-12-30 11:01:50 +00:00
companion object {
val TAG: String = AlbumTagEditorActivity::class.java.simpleName
}
2018-12-06 08:52:57 +00:00
}