@@ -18,12 +18,12 @@ package com.duckduckgo.app.tabs.ui
1818
1919import android.annotation.SuppressLint
2020import android.content.Context
21+ import android.graphics.Bitmap
2122import android.os.Bundle
2223import android.view.LayoutInflater
2324import android.view.View
2425import android.view.ViewGroup
2526import android.widget.ImageView
26- import android.widget.ImageView.ScaleType
2727import android.widget.TextView
2828import androidx.annotation.VisibleForTesting
2929import androidx.lifecycle.LifecycleOwner
@@ -34,6 +34,8 @@ import androidx.recyclerview.widget.RecyclerView.Adapter
3434import androidx.recyclerview.widget.RecyclerView.ViewHolder
3535import com.bumptech.glide.Glide
3636import com.bumptech.glide.RequestManager
37+ import com.bumptech.glide.load.Transformation
38+ import com.bumptech.glide.load.engine.Resource
3739import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
3840import com.duckduckgo.app.browser.databinding.ItemTabGridBinding
3941import com.duckduckgo.app.browser.databinding.ItemTabListBinding
@@ -50,14 +52,18 @@ import com.duckduckgo.app.tabs.ui.TabSwitcherAdapter.TabSwitcherViewHolder.Compa
5052import com.duckduckgo.app.tabs.ui.TabSwitcherAdapter.TabSwitcherViewHolder.Companion.LIST_TAB
5153import com.duckduckgo.app.tabs.ui.TabSwitcherAdapter.TabSwitcherViewHolder.TabViewHolder
5254import com.duckduckgo.common.ui.view.show
55+ import com.duckduckgo.common.ui.view.toPx
5356import com.duckduckgo.common.utils.DispatcherProvider
5457import com.duckduckgo.common.utils.swap
5558import com.duckduckgo.mobile.android.R as AndroidR
5659import java.io.File
60+ import java.security.MessageDigest
5761import kotlinx.coroutines.launch
5862import kotlinx.coroutines.withContext
5963import timber.log.Timber
6064
65+ private const val GRID_ITEM_HEIGHT_DP = 170
66+
6167class TabSwitcherAdapter (
6268 private val itemClickListener : TabSwitcherListener ,
6369 private val webViewPreviewPersister : WebViewPreviewPersister ,
@@ -205,6 +211,10 @@ class TabSwitcherAdapter(
205211 loadTabPreviewImage(tab.tabEntity, Glide .with (viewHolder.rootView), viewHolder.tabPreview)
206212 }
207213
214+ bundle.getString(DIFF_KEY_URL )?.let {
215+ loadFavicon(tab.tabEntity, Glide .with (viewHolder.rootView), viewHolder.favicon)
216+ }
217+
208218 bundle.getString(DIFF_KEY_TITLE )?.let {
209219 viewHolder.title.text = it
210220 }
@@ -229,6 +239,7 @@ class TabSwitcherAdapter(
229239 bundle.getString(DIFF_KEY_URL )?.let {
230240 viewHolder.url.show()
231241 viewHolder.url.text = it
242+ loadFavicon(tab.tabEntity, Glide .with (viewHolder.rootView), viewHolder.favicon)
232243 }
233244
234245 bundle.getString(DIFF_KEY_TITLE )?.let {
@@ -242,42 +253,55 @@ class TabSwitcherAdapter(
242253 }
243254
244255 private fun loadFavicon (tab : TabEntity , glide : RequestManager , view : ImageView ) {
245- if (tab.url == null ) {
256+ val url = tab.url
257+ if (url == null ) {
258+ glide.clear(view)
246259 glide.load(AndroidR .drawable.ic_dax_icon).into(view)
247260 } else {
248261 lifecycleOwner.lifecycleScope.launch {
249- faviconManager.loadToViewFromLocalWithPlaceholder(tab.tabId, tab. url!! , view)
262+ faviconManager.loadToViewFromLocalWithPlaceholder(tab.tabId, url, view)
250263 }
251264 }
252265 }
253266
254267 private fun loadTabPreviewImage (tab : TabEntity , glide : RequestManager , tabPreview : ImageView ) {
255- if (tab.url == null ) {
256- tabPreview.scaleType = ScaleType .CENTER
257- glide.load(AndroidR .drawable.ic_dax_icon_72)
258- .into(tabPreview)
259- return
260- } else {
261- tabPreview.scaleType = ScaleType .MATRIX
262- }
263-
264- val previewFile = tab.tabPreviewFile ? : return glide.clear(tabPreview)
265-
266- lifecycleOwner.lifecycleScope.launch {
267- val cachedWebViewPreview = withContext(dispatchers.io()) {
268- File (webViewPreviewPersister.fullPathForFile(tab.tabId, previewFile)).takeIf { it.exists() }
268+ fun fitAndClipBottom () = object : Transformation <Bitmap > {
269+ override fun transform (
270+ context : Context ,
271+ resource : Resource <Bitmap >,
272+ outWidth : Int ,
273+ outHeight : Int ,
274+ ): Resource <Bitmap > {
275+ resource.get().height = GRID_ITEM_HEIGHT_DP .toPx()
276+ return resource
269277 }
270278
271- if (cachedWebViewPreview == null ) {
272- glide.clear(tabPreview)
273- return @launch
279+ override fun updateDiskCacheKey (messageDigest : MessageDigest ) {
274280 }
281+ }
275282
276- glide.load(cachedWebViewPreview)
277- .transition(DrawableTransitionOptions .withCrossFade())
283+ val previewFile = tab.tabPreviewFile
284+ if (tab.url == null ) {
285+ glide.load(AndroidR .drawable.ic_dax_icon_72)
278286 .into(tabPreview)
287+ } else if (previewFile != null ) {
288+ lifecycleOwner.lifecycleScope.launch {
289+ val cachedWebViewPreview = withContext(dispatchers.io()) {
290+ File (webViewPreviewPersister.fullPathForFile(tab.tabId, previewFile)).takeIf { it.exists() }
291+ }
292+
293+ if (cachedWebViewPreview == null ) {
294+ glide.clear(tabPreview)
295+ return @launch
296+ }
279297
280- tabPreview.show()
298+ glide.load(cachedWebViewPreview)
299+ .transition(DrawableTransitionOptions .withCrossFade())
300+ .optionalTransform(fitAndClipBottom())
301+ .into(tabPreview)
302+ }
303+ } else {
304+ glide.clear(tabPreview)
281305 }
282306 }
283307
0 commit comments