From 4211ed1a9be2b22c60c1ac5148a41438470ad9cc Mon Sep 17 00:00:00 2001 From: Prathamesh More Date: Mon, 13 Dec 2021 16:06:48 +0530 Subject: [PATCH] [Tag Editor] Added artwork chooser for Song tag editor --- .../tageditor/AbsTagEditorActivity.kt | 21 +- .../tageditor/AlbumTagEditorActivity.kt | 70 ++--- .../tageditor/SongTagEditorActivity.kt | 90 +++++- .../layout-land/activity_album_tag_editor.xml | 28 +- .../layout-land/activity_song_tag_editor.xml | 291 ++++++++++++++++++ .../res/layout/activity_song_tag_editor.xml | 23 ++ 6 files changed, 452 insertions(+), 71 deletions(-) create mode 100644 app/src/main/res/layout-land/activity_song_tag_editor.xml diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt index cee65c013..cadbe840b 100755 --- a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AbsTagEditorActivity.kt @@ -34,7 +34,6 @@ import androidx.appcompat.app.AlertDialog import androidx.lifecycle.lifecycleScope import androidx.viewbinding.ViewBinding import code.name.monkey.appthemehelper.ThemeStore -import code.name.monkey.appthemehelper.util.ATHUtil import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.appthemehelper.util.VersionUtils import code.name.monkey.retromusic.R @@ -60,14 +59,13 @@ import java.io.File import java.util.* abstract class AbsTagEditorActivity : AbsBaseActivity() { - abstract val editorImage: ImageView? + abstract val editorImage: ImageView val repository by inject() lateinit var saveFab: MaterialButton protected var id: Long = 0 private set private var paletteColorPrimary: Int = 0 - private var isInNoImageMode: Boolean = false private var songPaths: List? = null private var savedSongPaths: List? = null private val currentSongPath: String? = null @@ -239,7 +237,7 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() { getString(R.string.web_search), getString(R.string.remove_cover) ) - editorImage?.setOnClickListener { show } + editorImage.setOnClickListener { show } } private fun startImagePicker() { @@ -306,17 +304,6 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() { return super.onOptionsItemSelected(item) } - protected fun setNoImageMode() { - isInNoImageMode = true - setColors( - intent.getIntExtra( - EXTRA_PALETTE, - ATHUtil.resolveColor(this, R.attr.colorPrimary) - ) - ) - } - - protected fun dataChanged() { showFab() } @@ -335,9 +322,9 @@ abstract class AbsTagEditorActivity : AbsBaseActivity() { protected fun setImageBitmap(bitmap: Bitmap?, bgColor: Int) { if (bitmap == null) { - editorImage?.setImageResource(drawable.default_audio_art) + editorImage.setImageResource(drawable.default_audio_art) } else { - editorImage?.setImageBitmap(bitmap) + editorImage.setImageBitmap(bitmap) } setColors(bgColor) } diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AlbumTagEditorActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AlbumTagEditorActivity.kt index 18b73ed29..79a954055 100755 --- a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AlbumTagEditorActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/AlbumTagEditorActivity.kt @@ -63,41 +63,6 @@ class AlbumTagEditorActivity : AbsTagEditorActivity(binding.editorImage) { - override fun onResourceReady( - resource: BitmapPaletteWrapper, - transition: Transition? - ) { - getColor(resource.palette, Color.TRANSPARENT) - albumArtBitmap = resource.bitmap?.let { ImageUtil.resizeBitmap(it, 2048) } - setImageBitmap( - albumArtBitmap, - getColor( - resource.palette, - ATHUtil.resolveColor( - this@AlbumTagEditorActivity, - R.attr.defaultFooterColor - ) - ) - ) - deleteAlbumArt = false - dataChanged() - setResult(Activity.RESULT_OK) - } - - override fun onLoadFailed(errorDrawable: Drawable?) { - super.onLoadFailed(errorDrawable) - Toast.makeText(this@AlbumTagEditorActivity, "Load Failed", Toast.LENGTH_LONG) - .show() - } - - override fun setResource(resource: BitmapPaletteWrapper?) {} - }) - } - private var albumArtBitmap: Bitmap? = null private var deleteAlbumArt: Boolean = false @@ -171,6 +136,41 @@ class AlbumTagEditorActivity : AbsTagEditorActivity(binding.editorImage) { + override fun onResourceReady( + resource: BitmapPaletteWrapper, + transition: Transition? + ) { + getColor(resource.palette, Color.TRANSPARENT) + albumArtBitmap = resource.bitmap?.let { ImageUtil.resizeBitmap(it, 2048) } + setImageBitmap( + albumArtBitmap, + getColor( + resource.palette, + ATHUtil.resolveColor( + this@AlbumTagEditorActivity, + R.attr.defaultFooterColor + ) + ) + ) + deleteAlbumArt = false + dataChanged() + setResult(Activity.RESULT_OK) + } + + override fun onLoadFailed(errorDrawable: Drawable?) { + super.onLoadFailed(errorDrawable) + Toast.makeText(this@AlbumTagEditorActivity, "Load Failed", Toast.LENGTH_LONG) + .show() + } + + override fun setResource(resource: BitmapPaletteWrapper?) {} + }) + } + override fun save() { val fieldKeyValueMap = EnumMap(FieldKey::class.java) fieldKeyValueMap[FieldKey.ALBUM] = binding.albumText.text.toString() diff --git a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/SongTagEditorActivity.kt b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/SongTagEditorActivity.kt index 69c4c7cdc..cca36e9e0 100755 --- a/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/SongTagEditorActivity.kt +++ b/app/src/main/java/code/name/monkey/retromusic/activities/tageditor/SongTagEditorActivity.kt @@ -15,17 +15,33 @@ package code.name.monkey.retromusic.activities.tageditor import android.annotation.SuppressLint +import android.app.Activity +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.graphics.Color +import android.graphics.drawable.Drawable import android.net.Uri import android.os.Bundle import android.text.Editable import android.text.TextWatcher import android.view.LayoutInflater import android.widget.ImageView +import android.widget.Toast +import code.name.monkey.appthemehelper.util.ATHUtil +import code.name.monkey.retromusic.R import code.name.monkey.retromusic.databinding.ActivitySongTagEditorBinding import code.name.monkey.retromusic.extensions.appHandleColor import code.name.monkey.retromusic.extensions.setTint +import code.name.monkey.retromusic.glide.GlideApp +import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper +import code.name.monkey.retromusic.model.ArtworkInfo import code.name.monkey.retromusic.repository.SongRepository +import code.name.monkey.retromusic.util.ImageUtil import code.name.monkey.retromusic.util.MusicUtil +import code.name.monkey.retromusic.util.RetroColorUtil +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.bumptech.glide.request.target.ImageViewTarget +import com.bumptech.glide.request.transition.Transition import com.google.android.material.shape.MaterialShapeDrawable import org.jaudiotagger.tag.FieldKey import org.koin.android.ext.android.inject @@ -39,12 +55,14 @@ class SongTagEditorActivity : AbsTagEditorActivity private val songRepository by inject() + private var albumArtBitmap: Bitmap? = null + private var deleteAlbumArt: Boolean = false + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setUpViews() - setNoImageMode() setSupportActionBar(binding.toolbar) - binding.appBarLayout.statusBarForeground = + binding.appBarLayout?.statusBarForeground = MaterialShapeDrawable.createWithElevationOverlay(this) } @@ -90,11 +108,30 @@ class SongTagEditorActivity : AbsTagEditorActivity println(songTitle + songYear) } - override fun loadCurrentImage() {} + override fun loadCurrentImage() { + val bitmap = albumArt + setImageBitmap( + bitmap, + RetroColorUtil.getColor( + RetroColorUtil.generatePalette(bitmap), + ATHUtil.resolveColor(this, R.attr.defaultFooterColor) + ) + ) + deleteAlbumArt = false + } - override fun searchImageOnWeb() {} + override fun searchImageOnWeb() { + searchWebFor(binding.songText.text.toString(), binding.artistText.text.toString()) + } - override fun deleteImage() {} + override fun deleteImage() { + setImageBitmap( + BitmapFactory.decodeResource(resources, R.drawable.default_audio_art), + ATHUtil.resolveColor(this, R.attr.defaultFooterColor) + ) + deleteAlbumArt = true + dataChanged() + } override fun save() { val fieldKeyValueMap = EnumMap(FieldKey::class.java) @@ -107,7 +144,12 @@ class SongTagEditorActivity : AbsTagEditorActivity fieldKeyValueMap[FieldKey.LYRICS] = binding.lyricsText.text.toString() fieldKeyValueMap[FieldKey.ALBUM_ARTIST] = binding.albumArtistText.text.toString() fieldKeyValueMap[FieldKey.COMPOSER] = binding.songComposerText.text.toString() - writeValuesToFiles(fieldKeyValueMap, null) + writeValuesToFiles(fieldKeyValueMap, when { + deleteAlbumArt -> ArtworkInfo(id, null) + albumArtBitmap == null -> null + else -> ArtworkInfo(id, albumArtBitmap!!) + } + ) } override fun getSongPaths(): List = listOf(songRepository.song(id).data) @@ -115,6 +157,38 @@ class SongTagEditorActivity : AbsTagEditorActivity override fun getSongUris(): List = listOf(MusicUtil.getSongFileUri(id)) override fun loadImageFromFile(selectedFile: Uri?) { + GlideApp.with(this@SongTagEditorActivity).asBitmapPalette().load(selectedFile) + .diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true) + .into(object : ImageViewTarget(binding.editorImage) { + override fun onResourceReady( + resource: BitmapPaletteWrapper, + transition: Transition? + ) { + RetroColorUtil.getColor(resource.palette, Color.TRANSPARENT) + albumArtBitmap = resource.bitmap?.let { ImageUtil.resizeBitmap(it, 2048) } + setImageBitmap( + albumArtBitmap, + RetroColorUtil.getColor( + resource.palette, + ATHUtil.resolveColor( + this@SongTagEditorActivity, + R.attr.defaultFooterColor + ) + ) + ) + deleteAlbumArt = false + dataChanged() + setResult(Activity.RESULT_OK) + } + + override fun onLoadFailed(errorDrawable: Drawable?) { + super.onLoadFailed(errorDrawable) + Toast.makeText(this@SongTagEditorActivity, "Load Failed", Toast.LENGTH_LONG) + .show() + } + + override fun setResource(resource: BitmapPaletteWrapper?) {} + }) } override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) { @@ -131,6 +205,6 @@ class SongTagEditorActivity : AbsTagEditorActivity val TAG: String = SongTagEditorActivity::class.java.simpleName } - override val editorImage: ImageView? - get() = null + override val editorImage: ImageView + get() = binding.editorImage } diff --git a/app/src/main/res/layout-land/activity_album_tag_editor.xml b/app/src/main/res/layout-land/activity_album_tag_editor.xml index e474eec0b..18b98d1dc 100644 --- a/app/src/main/res/layout-land/activity_album_tag_editor.xml +++ b/app/src/main/res/layout-land/activity_album_tag_editor.xml @@ -3,7 +3,8 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="?attr/colorSurface"> + android:background="?attr/colorSurface" + android:fitsSystemWindows="true"> - + android:layout_height="match_parent"> + app:cardElevation="8dp" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintDimensionRatio="1:1" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toTopOf="parent"> + app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toEndOf="@+id/imageContainer" + app:layout_constraintTop_toTopOf="parent"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/activity_song_tag_editor.xml b/app/src/main/res/layout/activity_song_tag_editor.xml index cf6bea679..a6abea9ec 100755 --- a/app/src/main/res/layout/activity_song_tag_editor.xml +++ b/app/src/main/res/layout/activity_song_tag_editor.xml @@ -2,6 +2,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" + xmlns:tools="http://schemas.android.com/tools" android:fitsSystemWindows="true" android:focusable="true" android:focusableInTouchMode="true"> @@ -33,6 +34,28 @@ android:orientation="vertical" android:padding="16dp"> + + + + + +