package code.name.monkey.retromusic.glide import android.graphics.drawable.Drawable import code.name.monkey.appthemehelper.ThemeStore.Companion.accentColor import code.name.monkey.appthemehelper.util.TintHelper import code.name.monkey.retromusic.App.Companion.getContext import code.name.monkey.retromusic.Constants.USER_BANNER import code.name.monkey.retromusic.Constants.USER_PROFILE import code.name.monkey.retromusic.R import code.name.monkey.retromusic.glide.artistimage.ArtistImage import code.name.monkey.retromusic.glide.audiocover.AudioFileCover import code.name.monkey.retromusic.glide.palette.BitmapPaletteWrapper import code.name.monkey.retromusic.model.Artist import code.name.monkey.retromusic.model.Song import code.name.monkey.retromusic.util.ArtistSignatureUtil import code.name.monkey.retromusic.util.CustomArtistImageUtil.Companion.getFile import code.name.monkey.retromusic.util.CustomArtistImageUtil.Companion.getInstance import code.name.monkey.retromusic.util.PreferenceUtil import com.bumptech.glide.GenericTransitionOptions import com.bumptech.glide.Priority import com.bumptech.glide.RequestBuilder import com.bumptech.glide.annotation.GlideExtension import com.bumptech.glide.annotation.GlideOption import com.bumptech.glide.annotation.GlideType import com.bumptech.glide.load.Key import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.request.BaseRequestOptions import com.bumptech.glide.signature.MediaStoreSignature import java.io.File @GlideExtension object RetroGlideExtension { private const val DEFAULT_ARTIST_IMAGE = R.drawable.default_artist_art private const val DEFAULT_SONG_IMAGE: Int = R.drawable.default_audio_art private const val DEFAULT_ALBUM_IMAGE = R.drawable.default_album_art private const val DEFAULT_ERROR_IMAGE_BANNER = R.drawable.material_design_default private val DEFAULT_DISK_CACHE_STRATEGY_ARTIST = DiskCacheStrategy.RESOURCE private val DEFAULT_DISK_CACHE_STRATEGY = DiskCacheStrategy.NONE private const val DEFAULT_ANIMATION = android.R.anim.fade_in @JvmStatic @GlideType(BitmapPaletteWrapper::class) fun asBitmapPalette(requestBuilder: RequestBuilder): RequestBuilder { return requestBuilder } private fun getSongModel(song: Song, ignoreMediaStore: Boolean): Any { return if (!song.coverArt.isNullOrEmpty()) { song.coverArtUri!! } else { // this won't work but is a fallback for now i guess lol AudioFileCover(song.data) } } fun getSongModel(song: Song): Any { return getSongModel(song, PreferenceUtil.isIgnoreMediaStoreArtwork) } fun getArtistModel(artist: Artist): Any { return getArtistModel( artist, getInstance(getContext()).hasCustomArtistImage(artist), false ) } fun getArtistModel(artist: Artist, forceDownload: Boolean): Any { return getArtistModel( artist, getInstance(getContext()).hasCustomArtistImage(artist), forceDownload ) } private fun getArtistModel( artist: Artist, hasCustomImage: Boolean, forceDownload: Boolean ): Any { return if (!hasCustomImage) { ArtistImage(artist) } else { getFile(artist) } } @JvmStatic @GlideOption fun artistImageOptions( baseRequestOptions: BaseRequestOptions<*>, artist: Artist ): BaseRequestOptions<*> { return baseRequestOptions .diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY_ARTIST) .priority(Priority.LOW) .error(DEFAULT_ARTIST_IMAGE) .placeholder(DEFAULT_ARTIST_IMAGE) .signature(createSignature(artist)) } @JvmStatic @GlideOption fun songCoverOptions( baseRequestOptions: BaseRequestOptions<*>, song: Song ): BaseRequestOptions<*> { return baseRequestOptions.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY) .error(DEFAULT_SONG_IMAGE) .placeholder(DEFAULT_SONG_IMAGE) .signature(createSignature(song)) } @JvmStatic @GlideOption fun albumCoverOptions( baseRequestOptions: BaseRequestOptions<*>, song: Song ): BaseRequestOptions<*> { return baseRequestOptions.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY) .error(DEFAULT_ALBUM_IMAGE) .placeholder(DEFAULT_ALBUM_IMAGE) .signature(createSignature(song)) } @JvmStatic @GlideOption fun userProfileOptions( baseRequestOptions: BaseRequestOptions<*>, file: File ): BaseRequestOptions<*> { return baseRequestOptions.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY) .error(getErrorUserProfile()) .signature(createSignature(file)) } @JvmStatic @GlideOption fun profileBannerOptions( baseRequestOptions: BaseRequestOptions<*>, file: File ): BaseRequestOptions<*> { return baseRequestOptions.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY) .placeholder(DEFAULT_ERROR_IMAGE_BANNER) .error(DEFAULT_ERROR_IMAGE_BANNER) .signature(createSignature(file)) } @JvmStatic @GlideOption fun playlistOptions( baseRequestOptions: BaseRequestOptions<*> ): BaseRequestOptions<*> { return baseRequestOptions.diskCacheStrategy(DEFAULT_DISK_CACHE_STRATEGY) .error(DEFAULT_ALBUM_IMAGE) } private fun createSignature(song: Song): Key { return MediaStoreSignature("", song.dateModified, 0) } private fun createSignature(file: File): Key { return MediaStoreSignature("", file.lastModified(), 0) } private fun createSignature(artist: Artist): Key { return ArtistSignatureUtil.getInstance(getContext()) .getArtistSignature(artist.name) } fun getUserModel(): File { val dir = getContext().filesDir return File(dir, USER_PROFILE) } fun getBannerModel(): File { val dir = getContext().filesDir return File(dir, USER_BANNER) } private fun getErrorUserProfile(): Drawable { return TintHelper.createTintedDrawable( getContext(), R.drawable.ic_account, accentColor(getContext()) ) } fun getDefaultTransition(): GenericTransitionOptions { return GenericTransitionOptions().transition(DEFAULT_ANIMATION) } }