Skip to content

Commit c8133e3

Browse files
committed
introduce ThumbnailArguments
Signed-off-by: alperozturk96 <alper_ozturk@proton.me>
1 parent 5bcfd32 commit c8133e3

10 files changed

Lines changed: 74 additions & 65 deletions

File tree

app/src/main/java/com/nextcloud/ui/fileactions/FileActionsBottomSheet.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import com.nextcloud.client.account.CurrentAccountProvider
3535
import com.nextcloud.client.di.Injectable
3636
import com.nextcloud.client.di.ViewModelFactory
3737
import com.nextcloud.utils.extensions.setVisibleIf
38+
import com.nextcloud.utils.thumbnail.ThumbnailArguments
3839
import com.owncloud.android.R
3940
import com.owncloud.android.databinding.FileActionsBottomSheetBinding
4041
import com.owncloud.android.databinding.FileActionsBottomSheetItemBinding
@@ -149,7 +150,7 @@ class FileActionsBottomSheet :
149150
thumbnailGenerator.setThumbnail(
150151
it,
151152
binding.thumbnailLayout.thumbnail,
152-
shimmer = binding.thumbnailLayout.thumbnailShimmer
153+
ThumbnailArguments.withShimmer(binding.thumbnailLayout.thumbnailShimmer)
153154
)
154155
}
155156
}

app/src/main/java/com/nextcloud/ui/trashbinFileActions/TrashbinFileActionsBottomSheet.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import com.nextcloud.client.account.CurrentAccountProvider
2727
import com.nextcloud.client.di.Injectable
2828
import com.nextcloud.client.di.ViewModelFactory
2929
import com.nextcloud.utils.extensions.toOCFile
30+
import com.nextcloud.utils.thumbnail.ThumbnailArguments
3031
import com.owncloud.android.R
3132
import com.owncloud.android.databinding.FileActionsBottomSheetBinding
3233
import com.owncloud.android.databinding.FileActionsBottomSheetItemBinding
@@ -122,7 +123,7 @@ class TrashbinFileActionsBottomSheet :
122123
thumbnailGenerator.setThumbnail(
123124
it.toOCFile(),
124125
binding.thumbnailLayout.thumbnail,
125-
shimmer = binding.thumbnailLayout.thumbnailShimmer
126+
ThumbnailArguments.withShimmer(binding.thumbnailLayout.thumbnailShimmer)
126127
)
127128
}
128129
}

app/src/main/java/com/nextcloud/utils/thumbnail/FileThumbnailGenerator.kt

Lines changed: 20 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -68,29 +68,30 @@ class FileThumbnailGenerator @Inject constructor(
6868
)
6969

7070
private val tasks = Collections.synchronizedList(mutableListOf<ThumbnailGenerationTask>())
71+
private var arguments = ThumbnailArguments.none
7172

7273
fun setThumbnail(
7374
file: OCFile,
7475
view: ImageView,
75-
isGrid: Boolean,
76-
hideVideoOverlay: Boolean,
77-
shimmer: LoaderImageView?
76+
arguments: ThumbnailArguments,
7877
) {
78+
this.arguments = arguments
79+
7980
if (file.remoteId == null) {
80-
setLocalThumbnail(file, view, isGrid, hideVideoOverlay, shimmer)
81+
setLocalThumbnail(file, view)
8182
return
8283
}
8384

8485
if (!file.isPreviewAvailable) {
85-
generate(file, view, isGrid, hideVideoOverlay, shimmer)
86+
generate(file, view)
8687
return
8788
}
8889

8990
val cached = file.getSmallThumbnail()
9091
if (cached == null || file.isUpdateThumbnailNeeded) {
91-
generate(file, view, isGrid, hideVideoOverlay, shimmer)
92+
generate(file, view)
9293
} else {
93-
show(cached, file, view, isGrid, hideVideoOverlay, shimmer)
94+
show(cached, file, view)
9495
}
9596

9697
applyPngBackground(file, view)
@@ -124,64 +125,42 @@ class FileThumbnailGenerator @Inject constructor(
124125
}
125126
}
126127

127-
private fun show(
128-
bitmap: Bitmap,
129-
file: OCFile,
130-
view: ImageView,
131-
isGrid: Boolean,
132-
hideVideoOverlay: Boolean,
133-
shimmer: LoaderImageView?
134-
) {
135-
view.stopShimmer(shimmer)
128+
private fun show(bitmap: Bitmap, file: OCFile, view: ImageView) {
129+
view.stopShimmer(arguments.shimmer)
136130

137131
if (MimeTypeUtil.isVideo(file)) {
138132
view.setImageBitmap(ThumbnailsCacheManager.addVideoOverlay(bitmap, context))
139133
} else {
140-
BitmapUtils.setRoundedBitmapAccordingToListType(isGrid, bitmap, view)
134+
BitmapUtils.setRoundedBitmapAccordingToListType(arguments.isGrid, bitmap, view)
141135
}
142136
}
143137

144-
private fun setLocalThumbnail(
145-
file: OCFile,
146-
view: ImageView,
147-
isGrid: Boolean,
148-
hideVideoOverlay: Boolean,
149-
shimmer: LoaderImageView?
150-
) {
138+
private fun setLocalThumbnail(file: OCFile, view: ImageView) {
151139
val localFile = file.storagePath.toFile()
152140

153141
if (localFile == null || !MimeTypeUtil.isImageOrVideo(file)) {
154-
view.stopShimmer(shimmer)
142+
view.stopShimmer(arguments.shimmer)
155143
view.setImageDrawable(file.mimeIcon())
156144
} else if (ThumbnailsCacheManager.cancelPotentialThumbnailWork(localFile, view)) {
157145
startTask(
158146
file,
159147
view,
160-
isGrid,
161-
hideVideoOverlay,
162-
shimmer,
163148
ThumbnailGenerationTaskObject(localFile, null),
164149
localFile.hashCode()
165150
)
166151
}
167152
}
168153

169154
@Suppress("DEPRECATION")
170-
private fun generate(
171-
file: OCFile,
172-
view: ImageView,
173-
isGrid: Boolean,
174-
hideVideoOverlay: Boolean,
175-
shimmer: LoaderImageView?
176-
) {
155+
private fun generate(file: OCFile, view: ImageView) {
177156
if (!ThumbnailsCacheManager.cancelPotentialThumbnailWork(file, view)) {
178157
return
179158
}
180159

181160
val cached = file.getSmallThumbnail()
182161
if (cached != null) {
183162
view.setImageBitmap(cached)
184-
view.stopShimmer(shimmer)
163+
view.stopShimmer(arguments.shimmer)
185164
return
186165
}
187166

@@ -194,9 +173,6 @@ class FileThumbnailGenerator @Inject constructor(
194173
startTask(
195174
file,
196175
view,
197-
isGrid,
198-
hideVideoOverlay,
199-
shimmer,
200176
ThumbnailGenerationTaskObject(file, file.remoteId),
201177
file.fileId
202178
)
@@ -207,9 +183,6 @@ class FileThumbnailGenerator @Inject constructor(
207183
private fun startTask(
208184
file: OCFile,
209185
view: ImageView,
210-
isGrid: Boolean,
211-
hideVideoOverlay: Boolean,
212-
shimmer: LoaderImageView?,
213186
target: ThumbnailGenerationTaskObject,
214187
tag: Any
215188
) {
@@ -221,23 +194,23 @@ class FileThumbnailGenerator @Inject constructor(
221194
storageManager.get(),
222195
accountManager.user,
223196
tasks,
224-
isGrid,
197+
arguments.isGrid,
225198
file.remoteId,
226-
hideVideoOverlay
199+
arguments.hideVideoOverlay
227200
).apply {
228201
setListener(object : ThumbnailGenerationTask.Listener {
229-
override fun onSuccess() = view.stopShimmer(shimmer)
202+
override fun onSuccess() = view.stopShimmer(arguments.shimmer)
230203

231204
override fun onError() {
232-
view.stopShimmer(shimmer)
205+
view.stopShimmer(arguments.shimmer)
233206
view.setImageDrawable(file.mimeIcon())
234207
view.invalidate()
235208
Log_OC.w(TAG, "setting thumbnail failed, using icon from mime type")
236209
}
237210
})
238211
}
239212
view.setImageDrawable(AsyncThumbnailDrawable(context.resources, file.placeholder(), task))
240-
startShimmerLater(view, isGrid, shimmer)
213+
startShimmerLater(view, arguments.isGrid, arguments.shimmer)
241214
tasks.add(task)
242215
task.executeOnExecutor(executor, target)
243216
view.invalidate()
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* Nextcloud - Android Client
3+
*
4+
* SPDX-FileCopyrightText: 2026 Alper Ozturk <alper.ozturk@nextcloud.com>
5+
* SPDX-License-Identifier: AGPL-3.0-or-later
6+
*/
7+
8+
package com.nextcloud.utils.thumbnail
9+
10+
import com.elyeproj.loaderviewlibrary.LoaderImageView
11+
12+
data class ThumbnailArguments(
13+
val isGrid: Boolean,
14+
val hideVideoOverlay: Boolean,
15+
val shimmer: LoaderImageView?
16+
) {
17+
companion object {
18+
val none: ThumbnailArguments
19+
get() {
20+
return ThumbnailArguments(isGrid = false, hideVideoOverlay = false, shimmer = null)
21+
}
22+
23+
fun withShimmer(view: LoaderImageView): ThumbnailArguments = none.copy(shimmer = view)
24+
}
25+
}

app/src/main/java/com/nextcloud/utils/thumbnail/ThumbnailGenerator.kt

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
package com.nextcloud.utils.thumbnail
99

1010
import android.widget.ImageView
11-
import com.elyeproj.loaderviewlibrary.LoaderImageView
1211
import com.owncloud.android.datamodel.OCFile
1312
import javax.inject.Inject
1413
import javax.inject.Singleton
@@ -18,23 +17,19 @@ class ThumbnailGenerator @Inject constructor(
1817
val fileThumbnailGenerator: FileThumbnailGenerator,
1918
val folderThumbnailGenerator: FolderThumbnailGenerator
2019
) {
21-
22-
@JvmOverloads
2320
fun setThumbnail(
2421
ocFile: OCFile?,
2522
view: ImageView?,
26-
isGrid: Boolean = false,
27-
hideVideoOverlay: Boolean = false,
28-
shimmer: LoaderImageView? = null
23+
arguments: ThumbnailArguments = ThumbnailArguments.none
2924
) {
3025
if (ocFile == null || view == null) {
3126
return
3227
}
3328

3429
when {
3530
ocFile.isOfflineOperation -> fileThumbnailGenerator.setOfflineOperationThumbnail(ocFile, view)
36-
ocFile.isFolder -> folderThumbnailGenerator.setFolderThumbnail(ocFile, view, shimmer)
37-
else -> fileThumbnailGenerator.setThumbnail(ocFile, view, isGrid, hideVideoOverlay, shimmer)
31+
ocFile.isFolder -> folderThumbnailGenerator.setFolderThumbnail(ocFile, view, arguments.shimmer)
32+
else -> fileThumbnailGenerator.setThumbnail(ocFile, view, arguments)
3833
}
3934
}
4035
}

app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import com.nextcloud.utils.extensions.makeRounded
2525
import com.nextcloud.utils.extensions.setVisibleIf
2626
import com.nextcloud.utils.extensions.stopShimmer
2727
import com.nextcloud.utils.mdm.MDMConfig
28+
import com.nextcloud.utils.thumbnail.ThumbnailArguments
2829
import com.nextcloud.utils.thumbnail.ThumbnailGenerator
2930
import com.owncloud.android.R
3031
import com.owncloud.android.datamodel.FileDataStorageManager
@@ -211,9 +212,7 @@ class OCFileListDelegate(
211212
thumbnailGenerator.setThumbnail(
212213
file,
213214
viewHolder.thumbnail,
214-
gridView,
215-
hideVideoOverlay = false,
216-
viewHolder.shimmerThumbnail
215+
ThumbnailArguments(isGrid = gridView, hideVideoOverlay = false, viewHolder.shimmerThumbnail)
217216
)
218217

219218
// item layout + click listeners

app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchCurrentDirItemViewHolder.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ package com.owncloud.android.ui.adapter
1010
import android.content.Context
1111
import android.view.View
1212
import com.afollestad.sectionedrecyclerview.SectionedViewHolder
13+
import com.nextcloud.utils.thumbnail.ThumbnailArguments
1314
import com.nextcloud.utils.thumbnail.ThumbnailGenerator
1415
import com.owncloud.android.databinding.UnifiedSearchCurrentDirectoryItemBinding
1516
import com.owncloud.android.datamodel.FileDataStorageManager
@@ -41,7 +42,11 @@ class UnifiedSearchCurrentDirItemViewHolder(
4142
binding.filename.text = filename
4243
}
4344

44-
thumbnailGenerator.setThumbnail(file, binding.thumbnail, shimmer = binding.thumbnailShimmer)
45+
thumbnailGenerator.setThumbnail(
46+
file,
47+
binding.thumbnail,
48+
ThumbnailArguments.withShimmer(binding.thumbnailShimmer)
49+
)
4550

4651
binding.more.setOnClickListener {
4752
action.openFile(file.decryptedRemotePath, true)

app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.nextcloud.utils.ContactManager
2424
import com.nextcloud.utils.GlideHelper
2525
import com.nextcloud.utils.extensions.getType
2626
import com.nextcloud.utils.extensions.setVisibleIf
27+
import com.nextcloud.utils.thumbnail.ThumbnailArguments
2728
import com.owncloud.android.R
2829
import com.owncloud.android.databinding.UnifiedSearchItemBinding
2930
import com.owncloud.android.datamodel.FileDataStorageManager
@@ -113,7 +114,11 @@ class UnifiedSearchItemViewHolder(
113114
ImageViewCompat.setImageTintList(this, null)
114115
}
115116
} else {
116-
thumbnailGenerator.setThumbnail(file, binding.thumbnail, shimmer = binding.thumbnailShimmer)
117+
thumbnailGenerator.setThumbnail(
118+
file,
119+
binding.thumbnail,
120+
ThumbnailArguments.withShimmer(binding.thumbnailShimmer)
121+
)
117122
}
118123
}
119124

app/src/main/java/com/owncloud/android/ui/adapter/albums/AlbumsAdapter.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import android.view.View
1414
import android.view.ViewGroup
1515
import androidx.recyclerview.widget.RecyclerView
1616
import com.nextcloud.utils.date.DateFormatPattern
17+
import com.nextcloud.utils.thumbnail.ThumbnailArguments
1718
import com.nextcloud.utils.thumbnail.ThumbnailGenerator
1819
import com.owncloud.android.R
1920
import com.owncloud.android.databinding.AlbumsGridItemBinding
@@ -73,7 +74,11 @@ class AlbumsAdapter(
7374
ocLocal = nFile
7475
}
7576

76-
thumbnailGenerator.setThumbnail(ocLocal, gridViewHolder.thumbnail, gridView, true)
77+
thumbnailGenerator.setThumbnail(
78+
ocLocal,
79+
gridViewHolder.thumbnail,
80+
ThumbnailArguments(isGrid = gridView, hideVideoOverlay = true, null)
81+
)
7782
} else {
7883
gridViewHolder.thumbnail.setImageResource(R.drawable.file_image)
7984
gridViewHolder.thumbnail.visibility = View.VISIBLE

app/src/main/java/com/owncloud/android/ui/fragment/albums/AlbumSharingBottomSheet.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import com.nextcloud.android.common.ui.theme.utils.ColorRole
2121
import com.nextcloud.client.di.Injectable
2222
import com.nextcloud.utils.date.DateFormatPattern
2323
import com.nextcloud.utils.extensions.setVisibleIf
24+
import com.nextcloud.utils.thumbnail.ThumbnailArguments
2425
import com.nextcloud.utils.thumbnail.ThumbnailGenerator
2526
import com.owncloud.android.R
2627
import com.owncloud.android.databinding.AlbumImageThumbnailBinding
@@ -128,8 +129,7 @@ class AlbumSharingBottomSheet(
128129
thumbnailGenerator.setThumbnail(
129130
file,
130131
target.thumbnail,
131-
hideVideoOverlay = true,
132-
shimmer = target.thumbnailShimmer
132+
ThumbnailArguments(isGrid = false, hideVideoOverlay = true, target.thumbnailShimmer)
133133
)
134134
}
135135

0 commit comments

Comments
 (0)