From 0991975543f08e6d7830db9dfb5dfd26269c2197 Mon Sep 17 00:00:00 2001 From: lovegaoshi <106490582+lovegaoshi@users.noreply.github.com> Date: Wed, 25 Oct 2023 10:07:59 -0700 Subject: [PATCH] feat: square crop albumart option --- .../example/kotlin_audio_example/MainActivity.kt | 11 ++++++++++- kotlin-audio/build.gradle | 3 +++ .../kotlinaudio/models/PlayerConfig.kt | 4 ++++ .../kotlinaudio/notification/NotificationManager.kt | 13 +++++++++---- .../kotlinaudio/players/BaseAudioPlayer.kt | 3 ++- 5 files changed, 28 insertions(+), 6 deletions(-) diff --git a/kotlin-audio-example/src/main/java/com/example/kotlin_audio_example/MainActivity.kt b/kotlin-audio-example/src/main/java/com/example/kotlin_audio_example/MainActivity.kt index 7cf74eef..94dfc102 100644 --- a/kotlin-audio-example/src/main/java/com/example/kotlin_audio_example/MainActivity.kt +++ b/kotlin-audio-example/src/main/java/com/example/kotlin_audio_example/MainActivity.kt @@ -61,7 +61,8 @@ class MainActivity : ComponentActivity() { this, playerConfig = PlayerConfig( interceptPlayerActionsTriggeredExternally = true, handleAudioBecomingNoisy = true, - handleAudioFocus = true + handleAudioFocus = true, + // squareCropAlbumArt = true, ) ) player.add(tracks) @@ -173,6 +174,14 @@ class MainActivity : ComponentActivity() { companion object { val tracks = listOf( + DefaultAudioItem( + "https://rntp.dev/example/Longing.mp3", + MediaType.DEFAULT, + title = "Longing (wide album art)", + artwork = "https://i.ytimg.com/vi/qod7eBE0mTk/maxresdefault.jpg", + artist = "David Chavez", + duration = 143 * 1000, + ), DefaultAudioItem( "https://rntp.dev/example/Longing.mp3", MediaType.DEFAULT, diff --git a/kotlin-audio/build.gradle b/kotlin-audio/build.gradle index 1edac783..fee8a471 100644 --- a/kotlin-audio/build.gradle +++ b/kotlin-audio/build.gradle @@ -64,6 +64,9 @@ dependencies { // The instrumentation test companion libraries androidTestImplementation("de.mannodermaus.junit5:android-test-core:1.3.0") androidTestRuntimeOnly("de.mannodermaus.junit5:android-test-runner:1.3.0") + + // album art transformation + implementation 'jp.wasabeef.transformers:coil:1.0.6' } afterEvaluate { diff --git a/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/models/PlayerConfig.kt b/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/models/PlayerConfig.kt index a326c39b..5ec6154e 100644 --- a/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/models/PlayerConfig.kt +++ b/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/models/PlayerConfig.kt @@ -30,4 +30,8 @@ data class PlayerConfig( * The audio content type. */ val audioContentType: AudioContentType = AudioContentType.MUSIC, + /** + * Whether to crop the album art to a square. + */ + val squareCropAlbumArt: Boolean = false, ) diff --git a/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/notification/NotificationManager.kt b/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/notification/NotificationManager.kt index 253f4317..b7c7c06a 100644 --- a/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/notification/NotificationManager.kt +++ b/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/notification/NotificationManager.kt @@ -38,6 +38,7 @@ import com.google.android.exoplayer2.ui.PlayerNotificationManager.CustomActionRe import kotlinx.coroutines.MainScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch +import jp.wasabeef.transformers.coil.CropSquareTransformation class NotificationManager internal constructor( private val context: Context, @@ -45,7 +46,8 @@ class NotificationManager internal constructor( private val mediaSession: MediaSessionCompat, private val mediaSessionConnector: MediaSessionConnector, val event: NotificationEventHolder, - val playerEventHolder: PlayerEventHolder + val playerEventHolder: PlayerEventHolder, + private val squareCropAlbumArt: Boolean, ) : PlayerNotificationManager.NotificationListener { private var pendingIntent: PendingIntent? = null private val descriptionAdapter = object : PlayerNotificationManager.MediaDescriptionAdapter { @@ -76,10 +78,13 @@ class NotificationManager internal constructor( val artwork = getMediaItemArtworkUrl() val holder = player.currentMediaItem?.getAudioItemHolder() if (artwork != null && holder?.artworkBitmap == null) { - context.imageLoader.enqueue( - ImageRequest.Builder(context) + var imageRequest = ImageRequest.Builder(context) .data(artwork) - .target { result -> + if (squareCropAlbumArt) { + imageRequest = imageRequest.transformations(CropSquareTransformation()) + } + context.imageLoader.enqueue( + imageRequest.target { result -> val resultBitmap = (result as BitmapDrawable).bitmap holder?.artworkBitmap = resultBitmap invalidate() diff --git a/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt b/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt index 8d7ce7cb..fe455ecb 100644 --- a/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt +++ b/kotlin-audio/src/main/java/com/doublesymmetry/kotlinaudio/players/BaseAudioPlayer.kt @@ -236,7 +236,8 @@ abstract class BaseAudioPlayer internal constructor( mediaSession, mediaSessionConnector, notificationEventHolder, - playerEventHolder + playerEventHolder, + playerConfig.squareCropAlbumArt ) exoPlayer.addListener(PlayerListener())