Migrate from Glide to Coil

This commit is contained in:
MM20
2022-01-20 22:40:32 +01:00
parent 401a493864
commit 0447d3072d
17 changed files with 91 additions and 171 deletions
@@ -12,16 +12,19 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
import com.bumptech.glide.Glide
import com.bumptech.glide.request.target.SimpleTarget
import com.bumptech.glide.request.transition.Transition
import coil.imageLoader
import coil.request.ImageRequest
import coil.size.Scale
import com.google.android.material.chip.Chip
import de.mm20.launcher2.ktx.dp
import de.mm20.launcher2.ktx.lifecycleScope
import de.mm20.launcher2.legacy.helper.ActivityStarter
import de.mm20.launcher2.search.data.Websearch
import de.mm20.launcher2.ui.R
import de.mm20.launcher2.ui.databinding.ViewWebsearchBinding
import de.mm20.launcher2.ui.launcher.search.SearchViewModel
import kotlinx.coroutines.launch
import java.io.File
class WebSearchView : FrameLayout {
constructor(context: Context) : super(context)
@@ -50,18 +53,19 @@ class WebSearchView : FrameLayout {
for (search in websearches) {
val chip = Chip(context)
chip.text = search.label
if (search.icon != null) {
Glide.with(context)
.load(search.icon)
.into(object : SimpleTarget<Drawable>() {
override fun onResourceReady(
resource: Drawable,
transition: Transition<in Drawable>?
) {
chip.chipIcon = resource
}
})
val icon = search.icon
if (icon != null) {
val imageRequest = ImageRequest.Builder(context)
.data(File(icon))
.size((32*dp).toInt())
.scale(Scale.FIT)
.target {
chip.chipIcon = it
}
.build()
lifecycleScope.launch {
context.imageLoader.execute(imageRequest)
}
chip.chipIconTint = null
} else {
chip.chipIcon = ContextCompat.getDrawable(context, R.drawable.ic_search)
@@ -10,7 +10,8 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import androidx.transition.Scene
import com.bumptech.glide.Glide
import coil.load
import coil.size.Scale
import de.mm20.launcher2.icons.IconRepository
import de.mm20.launcher2.ktx.dp
import de.mm20.launcher2.ktx.lifecycleOwner
@@ -61,7 +62,7 @@ class WebsiteDetailRepresentation : Representation, KoinComponent {
website.image.isNotBlank() -> {
websiteImage.visibility = View.VISIBLE
websiteFavIcon.visibility = FrameLayout.GONE
Glide.with(context).load(website.image).into(websiteImage)
websiteImage.load(website.image)
websiteImage.transitionName = "icon"
label.transitionName = "label"
websiteFavIcon.transitionName = null
@@ -10,12 +10,11 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import androidx.transition.Scene
import com.bumptech.glide.Glide
import coil.load
import de.mm20.launcher2.badges.BadgeRepository
import de.mm20.launcher2.icons.IconRepository
import de.mm20.launcher2.ktx.dp
import de.mm20.launcher2.ktx.lifecycleOwner
import de.mm20.launcher2.ktx.lifecycleScope
import de.mm20.launcher2.legacy.helper.ActivityStarter
import de.mm20.launcher2.search.data.Searchable
import de.mm20.launcher2.search.data.Website
@@ -26,7 +25,6 @@ import de.mm20.launcher2.ui.legacy.view.LauncherIconView
import de.mm20.launcher2.ui.legacy.view.ToolbarAction
import de.mm20.launcher2.ui.legacy.view.ToolbarView
import kotlinx.coroutines.Job
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import org.koin.core.component.KoinComponent
@@ -66,7 +64,8 @@ class WebsiteListRepresentation : Representation, KoinComponent {
website.image.isNotBlank() -> {
websiteImage.visibility = View.VISIBLE
websiteFavIcon.visibility = FrameLayout.GONE
Glide.with(context).load(website.image).into(websiteImage)
websiteImage.load(website.image)
websiteImage.load(website.image)
websiteImage.transitionName = "icon"
label.transitionName = "label"
websiteFavIcon.transitionName = null
@@ -7,7 +7,7 @@ import android.widget.ImageView
import android.widget.TextView
import androidx.core.text.HtmlCompat
import androidx.transition.Scene
import com.bumptech.glide.Glide
import coil.load
import de.mm20.launcher2.search.data.Searchable
import de.mm20.launcher2.search.data.Wikipedia
import de.mm20.launcher2.ui.R
@@ -35,7 +35,7 @@ class WikipediaDetailRepresentation : Representation {
it.scaleType = ImageView.ScaleType.CENTER_CROP
}
it.visibility = View.VISIBLE
Glide.with(context).load(wikipedia.image).into(it)
it.load(wikipedia.image)
}
}
val toolbar = findViewById<ToolbarView>(R.id.wikipediaToolbar)
@@ -7,7 +7,8 @@ import android.widget.ImageView
import android.widget.TextView
import androidx.core.text.HtmlCompat
import androidx.transition.Scene
import com.bumptech.glide.Glide
import coil.load
import coil.size.Scale
import de.mm20.launcher2.search.data.Searchable
import de.mm20.launcher2.search.data.Wikipedia
import de.mm20.launcher2.ui.R
@@ -17,13 +18,19 @@ import de.mm20.launcher2.ui.legacy.view.ToolbarAction
import de.mm20.launcher2.ui.legacy.view.ToolbarView
class WikipediaListRepresentation : Representation {
override fun getScene(rootView: SearchableView, searchable: Searchable, previousRepresentation: Int?): Scene {
override fun getScene(
rootView: SearchableView,
searchable: Searchable,
previousRepresentation: Int?
): Scene {
val wikipedia = searchable as Wikipedia
val scene = Scene.getSceneForLayout(rootView, R.layout.view_wikipedia_list, rootView.context)
val scene =
Scene.getSceneForLayout(rootView, R.layout.view_wikipedia_list, rootView.context)
scene.setEnterAction {
with(rootView) {
findViewById<TextView>(R.id.wikipediaTitle).text = wikipedia.label
findViewById<TextView>(R.id.wikipediaText).text = HtmlCompat.fromHtml(wikipedia.text, HtmlCompat.FROM_HTML_MODE_LEGACY)
findViewById<TextView>(R.id.wikipediaText).text =
HtmlCompat.fromHtml(wikipedia.text, HtmlCompat.FROM_HTML_MODE_LEGACY)
findViewById<ImageView>(R.id.wikipediaImage).also {
if (wikipedia.image.isNullOrBlank()) {
it.visibility = View.GONE
@@ -35,7 +42,7 @@ class WikipediaListRepresentation : Representation {
it.scaleType = ImageView.ScaleType.CENTER_CROP
}
it.visibility = View.VISIBLE
Glide.with(context).load(wikipedia.image).into(it)
it.load(wikipedia.image)
}
}
val toolbar = findViewById<ToolbarView>(R.id.wikipediaToolbar)
@@ -62,9 +69,11 @@ class WikipediaListRepresentation : Representation {
private fun share(context: Context, wikipedia: Wikipedia) {
val text = wikipedia.text.toString()
val shareIntent = Intent(Intent.ACTION_SEND)
shareIntent.putExtra(Intent.EXTRA_TEXT, "${wikipedia.label}\n\n" +
"${text.substring(0, 200)}\n\n" +
"${context.getString(R.string.wikipedia_url)}/wiki?curid=${wikipedia.id}")
shareIntent.putExtra(
Intent.EXTRA_TEXT, "${wikipedia.label}\n\n" +
"${text.substring(0, 200)}\n\n" +
"${context.getString(R.string.wikipedia_url)}/wiki?curid=${wikipedia.id}"
)
shareIntent.type = "text/plain"
context.startActivity(Intent.createChooser(shareIntent, null))
}
@@ -4,10 +4,14 @@ import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import androidx.core.graphics.drawable.toBitmap
import androidx.core.graphics.scale
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import coil.imageLoader
import coil.request.ImageRequest
import coil.size.Scale
import de.mm20.launcher2.search.WebsearchRepository
import de.mm20.launcher2.search.data.Websearch
import kotlinx.coroutines.Dispatchers
@@ -44,14 +48,13 @@ class WebSearchSettingsScreenVM: ViewModel(), KoinComponent {
suspend fun createIcon(context: Context, uri: Uri, size: Int): String? = withContext(
Dispatchers.IO) {
val file = File(context.dataDir, System.currentTimeMillis().toString())
val stream = context.contentResolver.openInputStream(uri)
val icon = BitmapFactory.decodeStream(stream) ?: return@withContext null
val (scaledW, scaledH) = if (icon.width > icon.height) {
size * icon.width / icon.height to size
} else {
size to size * icon.height / icon.width
}
val scaledIcon = icon.scale(scaledW, scaledH)
val imageRequest = ImageRequest.Builder(context)
.data(uri)
.size(size)
.scale(Scale.FIT)
.build()
val drawable = context.imageLoader.execute(imageRequest).drawable ?: return@withContext null
val scaledIcon = drawable.toBitmap()
val out = FileOutputStream(file)
scaledIcon.compress(Bitmap.CompressFormat.PNG, 100, out)
out.close()
@@ -4,7 +4,6 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:transitionName="cardLayout">
<de.mm20.launcher2.ui.legacy.view.AspectRationImageView
@@ -6,7 +6,6 @@
android:id="@+id/wikipediaRoot"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipChildren="false"
android:transitionName="cardLayout">
<de.mm20.launcher2.ui.legacy.view.AspectRationImageView
@@ -14,7 +13,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/color_divider"
android:scaleType="centerCrop"
android:scaleType="fitCenter"
app:aspectRatio="0.5625"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"