/* * 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. * */ package code.name.monkey.retromusic.activities.tageditor import android.app.Activity import android.content.res.ColorStateList 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.transition.Slide 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.ActivityAlbumTagEditorBinding 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.model.Song import code.name.monkey.retromusic.util.ImageUtil import code.name.monkey.retromusic.util.RetroColorUtil.generatePalette import code.name.monkey.retromusic.util.RetroColorUtil.getColor import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.request.target.ImageViewTarget import com.bumptech.glide.request.transition.Transition import org.jaudiotagger.tag.FieldKey import java.util.* class AlbumTagEditorActivity : AbsTagEditorActivity(), TextWatcher { override val bindingInflater: (LayoutInflater) -> ActivityAlbumTagEditorBinding = ActivityAlbumTagEditorBinding::inflate 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 } override fun loadImageFromFile(selectedFile: Uri?) { GlideApp.with(this@AlbumTagEditorActivity).asBitmapPalette().load(selectedFile) .diskCacheStrategy(DiskCacheStrategy.NONE).skipMemoryCache(true) .into(object : ImageViewTarget(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 private fun setupToolbar() { binding.toolbar.setBackgroundColor(ATHUtil.resolveColor(this, R.attr.colorSurface)) setSupportActionBar(binding.toolbar) } override fun onCreate(savedInstanceState: Bundle?) { setDrawUnderStatusBar() super.onCreate(savedInstanceState) window.sharedElementsUseOverlay = true binding.imageContainer.transitionName = getString(R.string.transition_album_art) windowEnterTransition() setUpViews() setupToolbar() } private fun setUpViews() { fillViewsWithFileTags() binding.yearContainer.setTint(false) binding.genreContainer.setTint(false) binding.albumTitleContainer.setTint(false) binding.albumArtistContainer.setTint(false) binding.albumText.appHandleColor().addTextChangedListener(this) binding.albumArtistText.appHandleColor().addTextChangedListener(this) binding.genreTitle.appHandleColor().addTextChangedListener(this) binding.yearTitle.appHandleColor().addTextChangedListener(this) } private fun fillViewsWithFileTags() { binding.albumText.setText(albumTitle) binding.albumArtistText.setText(albumArtistName) binding.genreTitle.setText(genreName) binding.yearTitle.setText(songYear) println(albumTitle + albumArtistName) } 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()) } 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) fieldKeyValueMap[FieldKey.ALBUM] = binding.albumText.text.toString() // 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() writeValuesToFiles( fieldKeyValueMap, when { deleteAlbumArt -> ArtworkInfo(id, null) albumArtBitmap == null -> null else -> ArtworkInfo(id, albumArtBitmap!!) } ) } override fun getSongPaths(): List { return repository.albumById(id).songs .map(Song::data) } 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 companion object { val TAG: String = AlbumTagEditorActivity::class.java.simpleName } }