Skip to content

Commit 6db3309

Browse files
author
zerox80
committed
Feature: Thumbnail Loading Fix & Caching Improvements
1 parent f093c8c commit 6db3309

File tree

12 files changed

+221
-988
lines changed

12 files changed

+221
-988
lines changed

opencloudApp/src/main/java/eu/opencloud/android/datamodel/ThumbnailsCacheManager.java

Lines changed: 0 additions & 473 deletions
This file was deleted.

opencloudApp/src/main/java/eu/opencloud/android/presentation/avatar/AvatarManager.kt

Lines changed: 0 additions & 146 deletions
This file was deleted.

opencloudApp/src/main/java/eu/opencloud/android/presentation/avatar/AvatarUtils.kt

Lines changed: 19 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,13 @@ import android.accounts.Account
2323
import android.view.MenuItem
2424
import android.widget.ImageView
2525
import eu.opencloud.android.R
26-
import kotlinx.coroutines.CoroutineScope
27-
import kotlinx.coroutines.Dispatchers
28-
import kotlinx.coroutines.launch
29-
import kotlinx.coroutines.withContext
26+
import coil.load
27+
import eu.opencloud.android.MainApp.Companion.appContext
28+
import eu.opencloud.android.presentation.thumbnails.ThumbnailsRequester
3029
import org.koin.core.component.KoinComponent
31-
import org.koin.core.component.inject
3230

3331
class AvatarUtils : KoinComponent {
3432

35-
private val avatarManager: AvatarManager by inject()
36-
3733
/**
3834
* Show the avatar corresponding to the received account in an {@ImageView}.
3935
* <p>
@@ -56,20 +52,11 @@ class AvatarUtils : KoinComponent {
5652
fetchIfNotCached: Boolean = false,
5753
displayRadius: Float
5854
) {
59-
// Tech debt: Move this to a viewModel and use its viewModelScope instead
60-
CoroutineScope(Dispatchers.IO).launch {
61-
val drawable = avatarManager.getAvatarForAccount(
62-
account = account,
63-
fetchIfNotCached = fetchIfNotCached,
64-
displayRadius = displayRadius
65-
)
66-
withContext(Dispatchers.Main) {
67-
if (drawable != null) {
68-
imageView.setImageDrawable(drawable)
69-
} else {
70-
imageView.setImageResource(R.drawable.ic_account_circle)
71-
}
72-
}
55+
val uri = ThumbnailsRequester.getAvatarUri(account)
56+
imageView.load(uri, ThumbnailsRequester.getCoilImageLoader()) {
57+
placeholder(R.drawable.ic_account_circle)
58+
error(R.drawable.ic_account_circle)
59+
transformations(coil.transform.CircleCropTransformation())
7360
}
7461
}
7562

@@ -79,19 +66,17 @@ class AvatarUtils : KoinComponent {
7966
fetchIfNotCached: Boolean = false,
8067
displayRadius: Float
8168
) {
82-
CoroutineScope(Dispatchers.IO).launch {
83-
val drawable = avatarManager.getAvatarForAccount(
84-
account = account,
85-
fetchIfNotCached = fetchIfNotCached,
86-
displayRadius = displayRadius
69+
val uri = ThumbnailsRequester.getAvatarUri(account)
70+
val imageLoader = ThumbnailsRequester.getCoilImageLoader()
71+
val request = coil.request.ImageRequest.Builder(appContext)
72+
.data(uri)
73+
.target(
74+
onStart = { menuItem.setIcon(R.drawable.ic_account_circle) },
75+
onSuccess = { result -> menuItem.icon = result },
76+
onError = { menuItem.setIcon(R.drawable.ic_account_circle) }
8777
)
88-
withContext(Dispatchers.Main) {
89-
if (drawable != null) {
90-
menuItem.icon = drawable
91-
} else {
92-
menuItem.setIcon(R.drawable.ic_account_circle)
93-
}
94-
}
95-
}
78+
.transformations(coil.transform.CircleCropTransformation())
79+
.build()
80+
imageLoader.enqueue(request)
9681
}
9782
}

opencloudApp/src/main/java/eu/opencloud/android/presentation/files/details/FileDetailsFragment.kt

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@ import androidx.work.WorkInfo
4040
import com.google.android.material.snackbar.Snackbar
4141
import eu.opencloud.android.MainApp
4242
import eu.opencloud.android.R
43+
import coil.load
4344
import eu.opencloud.android.databinding.FileDetailsFragmentBinding
44-
import eu.opencloud.android.datamodel.ThumbnailsCacheManager
45+
46+
import eu.opencloud.android.presentation.thumbnails.ThumbnailsRequester
4547
import eu.opencloud.android.domain.exceptions.AccountNotFoundException
4648
import eu.opencloud.android.domain.exceptions.InstanceNotConfiguredException
4749
import eu.opencloud.android.domain.exceptions.TooEarlyException
@@ -428,21 +430,10 @@ class FileDetailsFragment : FileFragment() {
428430
}
429431
}
430432
if (ocFile.isImage) {
431-
val tagId = ocFile.remoteId.toString()
432-
var thumbnail: Bitmap? = ThumbnailsCacheManager.getBitmapFromDiskCache(tagId)
433-
if (thumbnail != null && !ocFile.needsToUpdateThumbnail) {
434-
imageView.setImageBitmap(thumbnail)
435-
} else {
436-
// generate new Thumbnail
437-
if (ThumbnailsCacheManager.cancelPotentialThumbnailWork(ocFile, imageView)) {
438-
val task = ThumbnailsCacheManager.ThumbnailGenerationTask(imageView, fileDetailsViewModel.getAccount())
439-
if (thumbnail == null) {
440-
thumbnail = ThumbnailsCacheManager.mDefaultImg
441-
}
442-
val asyncDrawable = ThumbnailsCacheManager.AsyncThumbnailDrawable(MainApp.appContext.resources, thumbnail, task)
443-
imageView.setImageDrawable(asyncDrawable)
444-
task.execute(ocFile)
445-
}
433+
imageView.load(ThumbnailsRequester.getPreviewUriForFile(OCFileWithSyncInfo(ocFile, null), fileDetailsViewModel.getAccount()), ThumbnailsRequester.getCoilImageLoader()) {
434+
placeholder(MimetypeIconUtil.getFileTypeIconId(ocFile.mimeType, ocFile.fileName))
435+
error(MimetypeIconUtil.getFileTypeIconId(ocFile.mimeType, ocFile.fileName))
436+
crossfade(true)
446437
}
447438
} else {
448439
// Name of the file, to deduce the icon to use in case the MIME type is not precise enough

0 commit comments

Comments
 (0)