Skip to content

Commit 1a8b541

Browse files
committed
enhance thumbnail generation
1 parent 7e7dc46 commit 1a8b541

3 files changed

Lines changed: 46 additions & 53 deletions

File tree

‎owncloudApp/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ public class ThumbnailsCacheManager {
7272
private static DiskLruImageCache mThumbnailCache = null;
7373
private static boolean mThumbnailCacheStarting = true;
7474

75-
private static final int DISK_CACHE_SIZE = 1024 * 1024 * 10; // 10MB
75+
private static final int DISK_CACHE_SIZE = 1024 * 1024 * 250; // 250MB
7676
private static final CompressFormat mCompressFormat = CompressFormat.JPEG;
7777
private static final int mCompressQuality = 70;
7878
private static OwnCloudClient mClient = null;
@@ -447,8 +447,7 @@ public static boolean cancelPotentialThumbnailWork(Object file, ImageView imageV
447447
private static ThumbnailGenerationTask getBitmapWorkerTask(ImageView imageView) {
448448
if (imageView != null) {
449449
final Drawable drawable = imageView.getDrawable();
450-
if (drawable instanceof AsyncThumbnailDrawable) {
451-
final AsyncThumbnailDrawable asyncDrawable = (AsyncThumbnailDrawable) drawable;
450+
if (drawable instanceof AsyncThumbnailDrawable asyncDrawable) {
452451
return asyncDrawable.getBitmapWorkerTask();
453452
}
454453
}

‎owncloudApp/src/main/java/com/owncloud/android/presentation/files/filelist/FileListAdapter.kt‎

Lines changed: 19 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ package com.owncloud.android.presentation.files.filelist
2626

2727
import android.accounts.Account
2828
import android.content.Context
29-
import android.graphics.Bitmap
3029
import android.graphics.Color
3130
import android.view.LayoutInflater
3231
import android.view.View
@@ -42,7 +41,8 @@ import com.owncloud.android.R
4241
import com.owncloud.android.databinding.GridItemBinding
4342
import com.owncloud.android.databinding.ItemFileListBinding
4443
import com.owncloud.android.databinding.ListFooterBinding
45-
import com.owncloud.android.datamodel.ThumbnailsCacheManager
44+
import com.owncloud.android.presentation.thumbnails.ThumbnailsRequester
45+
import coil.load
4646
import com.owncloud.android.domain.files.model.FileListOption
4747
import com.owncloud.android.domain.files.model.OCFileWithSyncInfo
4848
import com.owncloud.android.domain.files.model.OCFooterFile
@@ -188,7 +188,6 @@ class FileListAdapter(
188188
val fileIcon = holder.itemView.findViewById<ImageView>(R.id.thumbnail).apply {
189189
tag = file.id
190190
}
191-
val thumbnail: Bitmap? = file.remoteId?.let { ThumbnailsCacheManager.getBitmapFromDiskCache(file.remoteId) }
192191

193192
holder.itemView.findViewById<LinearLayout>(R.id.ListItemLayout)?.apply {
194193
contentDescription = "LinearLayout-$name"
@@ -203,7 +202,7 @@ class FileListAdapter(
203202
holder.itemView.findViewById<ImageView>(R.id.shared_via_users_icon).isVisible =
204203
file.sharedWithSharee == true || file.isSharedWithMe
205204

206-
setSpecificViewHolder(viewType, holder, fileWithSyncInfo, thumbnail)
205+
setSpecificViewHolder(viewType, holder, fileWithSyncInfo)
207206

208207
setIconPinAccordingToFilesLocalState(holder.itemView.findViewById(R.id.localFileIndicator), fileWithSyncInfo)
209208

@@ -237,22 +236,12 @@ class FileListAdapter(
237236
// Folder
238237
fileIcon.setImageResource(R.drawable.ic_menu_archive)
239238
} else {
240-
// Set file icon depending on its mimetype. Ask for thumbnail later.
241-
fileIcon.setImageResource(MimetypeIconUtil.getFileTypeIconId(file.mimeType, file.fileName))
242-
243-
if (thumbnail != null) {
244-
fileIcon.setImageBitmap(thumbnail)
245-
}
246-
if (file.needsToUpdateThumbnail && ThumbnailsCacheManager.cancelPotentialThumbnailWork(file, fileIcon)) {
247-
// generate new Thumbnail
248-
val task = ThumbnailsCacheManager.ThumbnailGenerationTask(fileIcon, account)
249-
val asyncDrawable = ThumbnailsCacheManager.AsyncThumbnailDrawable(context.resources, thumbnail, task)
250-
251-
// If drawable is not visible, do not update it.
252-
if (asyncDrawable.minimumHeight > 0 && asyncDrawable.minimumWidth > 0) {
253-
fileIcon.setImageDrawable(asyncDrawable)
254-
}
255-
task.execute(file)
239+
fileIcon.load(
240+
ThumbnailsRequester.getPreviewUriForFile(fileWithSyncInfo, account!!),
241+
ThumbnailsRequester.getCoilImageLoader()
242+
) {
243+
placeholder(MimetypeIconUtil.getFileTypeIconId(file.mimeType, file.fileName))
244+
error(MimetypeIconUtil.getFileTypeIconId(file.mimeType, file.fileName))
256245
}
257246

258247
if (file.mimeType == "image/png") {
@@ -272,7 +261,7 @@ class FileListAdapter(
272261
}
273262
}
274263

275-
private fun setSpecificViewHolder(viewType: Int, holder: RecyclerView.ViewHolder, fileWithSyncInfo: OCFileWithSyncInfo, thumbnail: Bitmap?) {
264+
private fun setSpecificViewHolder(viewType: Int, holder: RecyclerView.ViewHolder, fileWithSyncInfo: OCFileWithSyncInfo) {
276265
val file = fileWithSyncInfo.file
277266

278267
when (viewType) {
@@ -327,23 +316,14 @@ class FileListAdapter(
327316
val fileIcon = holder.itemView.findViewById<ImageView>(R.id.thumbnail)
328317
val layoutParams = fileIcon.layoutParams as ViewGroup.MarginLayoutParams
329318

330-
if (thumbnail == null) {
331-
view.binding.Filename.text = file.fileName
332-
// Reset layout params values default
333-
manageGridLayoutParams(
334-
layoutParams = layoutParams,
335-
marginVertical = 0,
336-
height = context.resources.getDimensionPixelSize(R.dimen.item_file_grid_height),
337-
width = context.resources.getDimensionPixelSize(R.dimen.item_file_grid_width),
338-
)
339-
} else {
340-
manageGridLayoutParams(
341-
layoutParams = layoutParams,
342-
marginVertical = context.resources.getDimensionPixelSize(R.dimen.item_file_image_grid_margin),
343-
height = ViewGroup.LayoutParams.MATCH_PARENT,
344-
width = ViewGroup.LayoutParams.MATCH_PARENT,
345-
)
346-
}
319+
view.binding.Filename.text = file.fileName
320+
// Reset layout params values default
321+
manageGridLayoutParams(
322+
layoutParams = layoutParams,
323+
marginVertical = 0,
324+
height = context.resources.getDimensionPixelSize(R.dimen.item_file_grid_height),
325+
width = context.resources.getDimensionPixelSize(R.dimen.item_file_grid_width),
326+
)
347327
}
348328
}
349329
}
@@ -412,7 +392,7 @@ class FileListAdapter(
412392
}
413393

414394
filesCount == 1 -> {
415-
when {
395+
when {
416396
foldersCount <= 0 -> {
417397
context.getString(R.string.file_list__footer__file)
418398
}

‎owncloudApp/src/main/java/com/owncloud/android/presentation/thumbnails/ThumbnailsRequester.kt‎

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -52,23 +52,37 @@ object ThumbnailsRequester : KoinComponent {
5252
private val clientManager: ClientManager by inject()
5353

5454
private const val SPACE_SPECIAL_PREVIEW_URI = "%s?scalingup=0&a=1&x=%d&y=%d&c=%s&preview=1"
55-
private const val FILE_PREVIEW_URI = "%s%s?x=%d&y=%d&c=%s&preview=1&id=%s"
55+
private const val FILE_PREVIEW_URI = "%s/%s?x=%d&y=%d&c=%s&preview=1&id=%s"
5656

57-
private const val DISK_CACHE_SIZE: Long = 1024 * 1024 * 10 // 10MB
57+
private const val DISK_CACHE_SIZE: Long = 1024 * 1024 * 250 // 250MB
5858

59+
private var imageLoader: ImageLoader? = null
60+
private var lastAccountName: String? = null
61+
62+
@Synchronized
5963
fun getCoilImageLoader(): ImageLoader {
60-
val ownCloudClient = getOwnCloudClient()
64+
val currentAccount = AccountUtils.getCurrentOwnCloudAccount(appContext)
65+
val currentAccountName = currentAccount?.name
66+
67+
if (imageLoader != null && lastAccountName == currentAccountName) {
68+
return imageLoader!!
69+
}
70+
71+
val ownCloudClient = clientManager.getClientForCoilThumbnails(
72+
accountName = currentAccountName ?: ""
73+
)
6174

6275
val coilRequestHeaderInterceptor = CoilRequestHeaderInterceptor(
6376
requestHeaders = hashMapOf(
64-
AUTHORIZATION_HEADER to ownCloudClient.credentials.headerAuth,
77+
AUTHORIZATION_HEADER to (ownCloudClient.credentials?.headerAuth ?: ""),
6578
ACCEPT_ENCODING_HEADER to ACCEPT_ENCODING_IDENTITY,
6679
USER_AGENT_HEADER to SingleSessionManager.getUserAgent(),
6780
OC_X_REQUEST_ID to RandomUtils.generateRandomUUID(),
6881
)
6982
)
7083

71-
return ImageLoader(appContext).newBuilder().okHttpClient(
84+
lastAccountName = currentAccountName
85+
imageLoader = ImageLoader(appContext).newBuilder().okHttpClient(
7286
okHttpClient = ownCloudClient.okHttpClient.newBuilder().addNetworkInterceptor(coilRequestHeaderInterceptor).build()
7387
).logger(DebugLogger())
7488
.memoryCache {
@@ -83,6 +97,8 @@ object ThumbnailsRequester : KoinComponent {
8397
.build()
8498
}
8599
.build()
100+
101+
return imageLoader!!
86102
}
87103

88104
fun getPreviewUriForSpaceSpecial(spaceSpecial: SpaceSpecial): String {
@@ -99,9 +115,7 @@ object ThumbnailsRequester : KoinComponent {
99115
}
100116

101117
fun getPreviewUriForFile(ocFile: OCFileWithSyncInfo, account: Account): String {
102-
var baseUrl = getOwnCloudClient().baseUri.toString() + "/remote.php/dav/files/" + account.name.split("@".toRegex())
103-
.dropLastWhile { it.isEmpty() }
104-
.toTypedArray()[0]
118+
var baseUrl = getOwnCloudClient().baseUri.toString() + "/remote.php/dav/files/" + com.owncloud.android.lib.common.accounts.AccountUtils.getUserId(account, appContext)
105119
ocFile.space?.getSpaceSpecialImage()?.let {
106120
baseUrl = it.webDavUrl
107121
}
@@ -111,8 +125,8 @@ object ThumbnailsRequester : KoinComponent {
111125
return String.format(
112126
Locale.ROOT,
113127
FILE_PREVIEW_URI,
114-
baseUrl,
115-
Uri.encode(ocFile.file.remotePath, "/"),
128+
baseUrl.removeSuffix("/"),
129+
Uri.encode(ocFile.file.remotePath, "/").removePrefix("/"),
116130
fileThumbnailSize,
117131
fileThumbnailSize,
118132
ocFile.file.etag,
@@ -121,7 +135,7 @@ object ThumbnailsRequester : KoinComponent {
121135
}
122136

123137
private fun getOwnCloudClient() = clientManager.getClientForCoilThumbnails(
124-
accountName = AccountUtils.getCurrentOwnCloudAccount(appContext).name
138+
accountName = AccountUtils.getCurrentOwnCloudAccount(appContext)?.name ?: ""
125139
)
126140

127141
private class CoilRequestHeaderInterceptor(

0 commit comments

Comments
 (0)