Skip to content

Commit

Permalink
refactor: migrate from picasso to coil v3
Browse files Browse the repository at this point in the history
  • Loading branch information
kelsos committed Jan 2, 2025
1 parent 29fec8f commit 09373fd
Show file tree
Hide file tree
Showing 16 changed files with 180 additions and 175 deletions.
3 changes: 2 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ plugins {
alias(libs.plugins.kotlinAndroid)
alias(libs.plugins.kotlinParcelize)
alias(libs.plugins.kapt)
alias(libs.plugins.ksp)
alias(libs.plugins.protobuf)
alias(libs.plugins.googleServices) apply false
alias(libs.plugins.crashlytics) apply false
Expand Down Expand Up @@ -232,6 +233,7 @@ dependencies {
implementation(libs.androidx.legacy.support.v4)
implementation(libs.androidx.legacy.support.v13)
implementation(libs.bundles.coroutines)
implementation(libs.bundles.coil)
implementation(libs.bundles.koin)
implementation(libs.google.material)
implementation(libs.google.protobuf.javalite)
Expand All @@ -242,7 +244,6 @@ dependencies {
implementation(libs.bundles.jackson)
implementation(libs.kotlin.stdlib)
implementation(libs.kotlin.reflect)
implementation(libs.squareup.picasso)
implementation(libs.rxandroid)
implementation(libs.rxjava)
implementation(libs.rxkotlin)
Expand Down
3 changes: 1 addition & 2 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,7 @@
-keep class com.raizlabs.android.dbflow.config.GeneratedDatabaseHolder
-keep class * extends com.raizlabs.android.dbflow.config.BaseDatabaseDefinition { *; }

## Square Picasso specific rules ##
## https://square.github.io/picasso/ ##
## OKHttp ##

-dontwarn com.squareup.okhttp.**

Expand Down
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@

<receiver
android:name=".platform.mediasession.MediaButtonReceiver"
android:exported="false">
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
Expand Down
2 changes: 0 additions & 2 deletions app/src/main/java/com/kelsos/mbrc/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,4 @@ open class App : Application() {
)
}
}

internal open fun testMode(): Boolean = false
}
34 changes: 21 additions & 13 deletions app/src/main/java/com/kelsos/mbrc/BaseActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,8 @@ import org.koin.android.ext.android.inject
import org.koin.androidx.scope.ScopeActivity
import timber.log.Timber

private const val NAVIGATION_DELAY = 250L

abstract class BaseActivity :
ScopeActivity(),
NavigationView.OnNavigationItemSelectedListener {
Expand Down Expand Up @@ -135,25 +137,27 @@ abstract class BaseActivity :
keyCode: Int,
event: KeyEvent,
): Boolean {
when (keyCode) {
KeyEvent.KEYCODE_VOLUME_UP -> {
bus.post(MessageEvent(UserInputEventType.KEY_VOLUME_UP))
return true
}
val result =
when (keyCode) {
KeyEvent.KEYCODE_VOLUME_UP -> {
bus.post(MessageEvent(UserInputEventType.KEY_VOLUME_UP))
true
}

KeyEvent.KEYCODE_VOLUME_DOWN -> {
bus.post(MessageEvent(UserInputEventType.KEY_VOLUME_DOWN))
return true
}
KeyEvent.KEYCODE_VOLUME_DOWN -> {
bus.post(MessageEvent(UserInputEventType.KEY_VOLUME_DOWN))
true
}

else -> return super.onKeyDown(keyCode, event)
}
else -> super.onKeyDown(keyCode, event)
}
return result
}

override fun onNavigationItemSelected(item: MenuItem): Boolean {
val itemId = item.itemId
drawer.closeDrawer(GravityCompat.START)
drawer.postDelayed({ navigate(itemId) }, 250)
drawer.postDelayed({ navigate(itemId) }, NAVIGATION_DELAY)
return true
}

Expand Down Expand Up @@ -229,7 +233,11 @@ abstract class BaseActivity :
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START)
} else {
onBackPressedDispatcher.onBackPressed()
if (this@BaseActivity is PlayerActivity) {
finish()
} else {
onBackPressedDispatcher.onBackPressed()
}
}
}
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.kelsos.mbrc.features.library

import android.app.Activity
import android.graphics.Bitmap
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
Expand All @@ -11,10 +10,14 @@ import android.widget.TextView
import androidx.appcompat.widget.PopupMenu
import androidx.core.view.isGone
import androidx.recyclerview.widget.RecyclerView
import coil3.load
import coil3.request.crossfade
import coil3.request.error
import coil3.request.placeholder
import coil3.size.Scale
import com.kelsos.mbrc.R
import com.kelsos.mbrc.common.ui.SquareImageView
import com.raizlabs.android.dbflow.list.FlowCursorList
import com.squareup.picasso.Picasso
import java.io.File

class AlbumEntryAdapter(
Expand Down Expand Up @@ -59,19 +62,20 @@ class AlbumEntryAdapter(
) {
val data = this.data ?: return
val item = data.getItem(position.toLong()) ?: return
val (artist, album, _, _) = item
val (artist, album) = item
holder.album.text = if (album.isNullOrBlank()) holder.emptyAlbum else album
holder.artist.text = if (artist.isNullOrBlank()) holder.unknownArtist else artist
Picasso
.get()
.load(File(cache, item.key()))
.noFade()
.config(Bitmap.Config.RGB_565)
.error(R.drawable.ic_image_no_cover)
.placeholder(R.drawable.ic_image_no_cover)
.resizeDimen(R.dimen.list_album_size, R.dimen.list_album_size)
.centerCrop()
.into(holder.image)

holder.image.load(File(cache, item.key())) {
crossfade(false)
placeholder(R.drawable.ic_image_no_cover)
error(R.drawable.ic_image_no_cover)
size(
holder.itemView.context.resources
.getDimensionPixelSize(R.dimen.list_album_size),
)
scale(Scale.FILL)
}
}

fun refresh() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.kelsos.mbrc.features.library

import android.graphics.Bitmap
import android.os.Bundle
import android.view.MenuItem
import android.widget.Button
Expand All @@ -10,13 +9,17 @@ import androidx.activity.OnBackPressedCallback
import androidx.core.os.BundleCompat
import androidx.core.view.isVisible
import androidx.recyclerview.widget.LinearLayoutManager
import coil3.load
import coil3.request.crossfade
import coil3.request.error
import coil3.request.placeholder
import coil3.size.Scale
import com.google.android.material.snackbar.Snackbar
import com.kelsos.mbrc.R
import com.kelsos.mbrc.common.ui.EmptyRecyclerView
import com.kelsos.mbrc.common.utilities.RemoteUtils.sha1
import com.kelsos.mbrc.features.queue.PopupActionHandler
import com.raizlabs.android.dbflow.list.FlowCursorList
import com.squareup.picasso.Picasso
import org.koin.android.ext.android.inject
import org.koin.androidx.scope.ScopeActivity
import java.io.File
Expand Down Expand Up @@ -91,16 +94,15 @@ class AlbumTracksActivity :
) {
val image = findViewById<ImageView>(R.id.album_tracks__cover)
val cache = File(cacheDir, "covers")
Picasso
.get()
.load(File(cache, sha1("${artist}_$album")))
.noFade()
.config(Bitmap.Config.RGB_565)
.error(R.drawable.ic_image_no_cover)
.placeholder(R.drawable.ic_image_no_cover)
.resizeDimen(R.dimen.cover_size, R.dimen.cover_size)
.centerCrop()
.into(image)
val coverFile = File(cache, sha1("${artist}_$album"))

image.load(coverFile) {
crossfade(false)
placeholder(R.drawable.ic_image_no_cover)
error(R.drawable.ic_image_no_cover)
size(resources.getDimensionPixelSize(R.dimen.list_album_size))
scale(Scale.FILL)
}
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.kelsos.mbrc.features.library

import android.app.Activity
import android.graphics.Bitmap
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
Expand All @@ -12,10 +11,13 @@ import android.widget.TextView
import androidx.appcompat.widget.PopupMenu
import androidx.core.view.isGone
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import coil3.load
import coil3.request.crossfade
import coil3.request.error
import coil3.request.placeholder
import coil3.size.Scale
import com.kelsos.mbrc.R
import com.raizlabs.android.dbflow.list.FlowCursorList
import com.squareup.picasso.Picasso
import java.io.File

class TrackEntryAdapter(
Expand All @@ -35,31 +37,6 @@ class TrackEntryAdapter(
this.listener = listener
}

/**
* Called when RecyclerView needs a new [ViewHolder] of the given type to represent
* an item.
*
*
* This new ViewHolder should be constructed with a new View that can represent the items
* of the given type. You can either create a new View manually or inflate it from an XML
* layout file.
*
*
* The new ViewHolder will be used to display items of the adapter using
* [.onBindViewHolder]. Since it will be re-used to display different
* items in the data set, it is a good idea to cache references to sub views of the View to
* avoid unnecessary [View.findViewById] calls.
* @param parent The ViewGroup into which the new View will be added after it is bound to
* * an adapter position.
* *
* @param viewType The view type of the new View.
* *
* @return A new ViewHolder that holds a View of the given view type.
* *
* @see .getItemViewType
* @see .onBindViewHolder
*/
override fun onCreateViewHolder(
parent: ViewGroup,
viewType: Int,
Expand Down Expand Up @@ -91,25 +68,6 @@ class TrackEntryAdapter(
popupMenu.show()
}

/**
* Called by RecyclerView to display the data at the specified position. This method
* should update the contents of the [ViewHolder.itemView] to reflect the item at
* the given position.
*
*
* Note that unlike [android.widget.ListView], RecyclerView will not call this
* method again if the position of the item changes in the data set unless the item itself
* is invalidated or the new position cannot be determined. For this reason, you should only
* use the `position` parameter while acquiring the related data item inside this
* method and should not keep a copy of it. If you need the position of an item later on
* (e.g. in a click listener), use [ViewHolder.getPosition] which will have the
* updated position.
* @param holder The ViewHolder which should be updated to represent the contents of the
* * item at the given position in the data set.
* *
* @param position The position of the item within the adapter's data set.
*/
override fun onBindViewHolder(
holder: ViewHolder,
position: Int,
Expand All @@ -119,24 +77,18 @@ class TrackEntryAdapter(
val artist = entry.artist
holder.artist.text = if (artist.isNullOrBlank()) holder.unknownArtist else artist
holder.image.isGone = !coverMode

Picasso
.get()
.load(File(cache, entry.key()))
.noFade()
.config(Bitmap.Config.RGB_565)
.error(R.drawable.ic_image_no_cover)
.placeholder(R.drawable.ic_image_no_cover)
.resizeDimen(R.dimen.list_album_size, R.dimen.list_album_size)
.centerCrop()
.into(holder.image)
holder.image.load(File(cache, entry.key())) {
crossfade(false)
placeholder(R.drawable.ic_image_no_cover)
error(R.drawable.ic_image_no_cover)
size(
holder.itemView.context.resources
.getDimensionPixelSize(R.dimen.list_album_size),
)
scale(Scale.FILL)
}
}

/**
* Returns the total number of items in the data set hold by the adapter.
* @return The total number of items in this adapter.
*/
override fun getItemCount(): Int {
val count = data?.count?.toInt()
return count ?: 0
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package com.kelsos.mbrc.features.minicontrol

import android.content.Intent
import android.graphics.Bitmap
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
Expand All @@ -11,13 +10,17 @@ import android.widget.ImageView
import android.widget.TextView
import androidx.core.app.TaskStackBuilder
import androidx.fragment.app.Fragment
import coil3.load
import coil3.request.crossfade
import coil3.request.error
import coil3.request.placeholder
import coil3.size.Scale
import com.kelsos.mbrc.R
import com.kelsos.mbrc.annotations.PlayerState
import com.kelsos.mbrc.annotations.PlayerState.State
import com.kelsos.mbrc.extensions.getDimens
import com.kelsos.mbrc.features.player.PlayerActivity
import com.kelsos.mbrc.features.player.TrackInfo
import com.squareup.picasso.Picasso
import org.koin.android.ext.android.inject
import org.koin.android.scope.AndroidScopeComponent
import org.koin.androidx.scope.fragmentScope
Expand Down Expand Up @@ -81,14 +84,13 @@ class MiniControlFragment :

if (file.exists()) {
val dimens = requireContext().getDimens()
Picasso
.get()
.load(file)
.noFade()
.config(Bitmap.Config.RGB_565)
.resize(dimens, dimens)
.centerCrop()
.into(trackCover)
trackCover.load(file) {
crossfade(false)
placeholder(R.drawable.ic_image_no_cover)
error(R.drawable.ic_image_no_cover)
size(dimens)
scale(Scale.FILL)
}
} else {
trackCover.setImageResource(R.drawable.ic_image_no_cover)
}
Expand Down
Loading

0 comments on commit 09373fd

Please sign in to comment.