Skip to content

Commit 43b016f

Browse files
authored
Merge pull request #128 from esensar/fix/scroll-performance
Convert all drawables into bitmap drawables for faster loading
2 parents 9e9aae0 + 44674ef commit 43b016f

File tree

2 files changed

+26
-11
lines changed

2 files changed

+26
-11
lines changed

app/src/main/kotlin/com/simplemobiletools/launcher/activities/MainActivity.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import android.view.accessibility.AccessibilityNodeInfo
2929
import android.view.animation.DecelerateInterpolator
3030
import android.widget.PopupMenu
3131
import androidx.core.graphics.drawable.toBitmap
32+
import androidx.core.graphics.drawable.toDrawable
3233
import androidx.core.view.GestureDetectorCompat
3334
import androidx.core.view.WindowCompat
3435
import androidx.core.view.isVisible
@@ -845,13 +846,13 @@ class MainActivity : SimpleActivity(), FlingListener {
845846
val label = info.loadLabel(packageManager).toString()
846847
val drawable = info.loadIcon(packageManager) ?: getDrawableForPackageName(packageName) ?: continue
847848
val placeholderColor = calculateAverageColor(drawable.toBitmap())
848-
allApps.add(AppLauncher(null, label, packageName, activityName, 0, placeholderColor, drawable))
849+
allApps.add(AppLauncher(null, label, packageName, activityName, 0, placeholderColor, drawable.toBitmap().toDrawable(resources)))
849850
}
850851

851852
// add Simple Launchers settings as an app
852853
val drawable = getDrawableForPackageName(packageName)
853854
val placeholderColor = calculateAverageColor(drawable!!.toBitmap())
854-
val launcherSettings = AppLauncher(null, getString(R.string.launcher_settings), packageName, "", 0, placeholderColor, drawable)
855+
val launcherSettings = AppLauncher(null, getString(R.string.launcher_settings), packageName, "", 0, placeholderColor, drawable.toBitmap().toDrawable(resources))
855856
allApps.add(launcherSettings)
856857
launchersDB.insertAll(allApps)
857858
return allApps

app/src/main/kotlin/com/simplemobiletools/launcher/adapters/LaunchersAdapter.kt

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package com.simplemobiletools.launcher.adapters
22

3+
import android.graphics.drawable.Drawable
34
import android.view.LayoutInflater
45
import android.view.View
56
import android.view.ViewGroup
67
import androidx.recyclerview.widget.RecyclerView
78
import com.bumptech.glide.Glide
89
import com.bumptech.glide.load.engine.DiskCacheStrategy
910
import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
11+
import com.bumptech.glide.request.target.DrawableImageViewTarget
1012
import com.bumptech.glide.request.transition.DrawableCrossFadeFactory
13+
import com.bumptech.glide.request.transition.Transition
1114
import com.qtalk.recyclerviewfastscroller.RecyclerViewFastScroller
1215
import com.simplemobiletools.commons.extensions.getColoredDrawableWithColor
1316
import com.simplemobiletools.commons.extensions.getProperTextColor
@@ -109,15 +112,26 @@ class LaunchersAdapter(
109112
binding.launcherLabel.setTextColor(textColor)
110113
binding.launcherIcon.setPadding(iconPadding, iconPadding, iconPadding, 0)
111114

112-
val factory = DrawableCrossFadeFactory.Builder(150).setCrossFadeEnabled(true).build()
113-
val placeholderDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.placeholder_drawable, launcher.thumbnailColor)
114-
115-
Glide.with(activity)
116-
.load(launcher.drawable)
117-
.placeholder(placeholderDrawable)
118-
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
119-
.transition(DrawableTransitionOptions.withCrossFade(factory))
120-
.into(binding.launcherIcon)
115+
// Once all images are loaded and crossfades are done, directly set drawables
116+
if (launcher.drawable != null && binding.launcherIcon.tag == true) {
117+
binding.launcherIcon.setImageDrawable(launcher.drawable)
118+
} else {
119+
val factory = DrawableCrossFadeFactory.Builder(150).setCrossFadeEnabled(true).build()
120+
val placeholderDrawable = activity.resources.getColoredDrawableWithColor(R.drawable.placeholder_drawable, launcher.thumbnailColor)
121+
122+
Glide.with(activity)
123+
.load(launcher.drawable)
124+
.placeholder(placeholderDrawable)
125+
.diskCacheStrategy(DiskCacheStrategy.RESOURCE)
126+
.transition(DrawableTransitionOptions.withCrossFade(factory))
127+
.into(object : DrawableImageViewTarget(binding.launcherIcon) {
128+
override fun onResourceReady(resource: Drawable, transition: Transition<in Drawable>?) {
129+
super.onResourceReady(resource, transition)
130+
// Set tag to true to mark that crossfade was already done on this view
131+
view.tag = true
132+
}
133+
})
134+
}
121135

122136
setOnClickListener { itemClick(launcher) }
123137
setOnLongClickListener { view ->

0 commit comments

Comments
 (0)