Migrate from Glide to Coil
This commit is contained in:
@@ -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
|
||||
|
||||
+2
-2
@@ -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))
|
||||
}
|
||||
|
||||
+11
-8
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user