Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@ import com.owncloud.android.ui.unifiedsearch.ProviderID
import com.owncloud.android.ui.unifiedsearch.UnifiedSearchSection
import com.owncloud.android.utils.MimeType
import com.owncloud.android.utils.ScreenshotTest
import com.owncloud.android.utils.overlay.OverlayManager
import com.nextcloud.utils.thumbnail.FileThumbnailGenerator
import com.nextcloud.utils.thumbnail.FolderThumbnailGenerator
import com.nextcloud.utils.thumbnail.ThumbnailGenerator
import javax.inject.Provider
import org.junit.Before
import org.junit.Test

Expand All @@ -32,7 +35,7 @@ class UnifiedSearchListAdapterIT : AbstractIT() {

private val testClassName = "com.owncloud.android.ui.adapter.UnifiedSearchListAdapterIT"

private lateinit var overlayManager: OverlayManager
private lateinit var thumbnailGenerator: ThumbnailGenerator
private lateinit var preferences: AppPreferences

@Suppress("DEPRECATION")
Expand Down Expand Up @@ -134,11 +137,20 @@ class UnifiedSearchListAdapterIT : AbstractIT() {
): UnifiedSearchListAdapter {
val accountManager = UserAccountManagerImpl.fromContext(targetContext)

overlayManager = OverlayManager(
preferences = preferences,
viewThemeUtils = sut.viewThemeUtils,
context = targetContext,
accountManager = accountManager
thumbnailGenerator = ThumbnailGenerator(
fileThumbnailGenerator = FileThumbnailGenerator(
storageManager = Provider { sut.storageManager },
preferences = preferences,
viewThemeUtils = sut.viewThemeUtils,
context = targetContext,
accountManager = accountManager
),
folderThumbnailGenerator = FolderThumbnailGenerator(
preferences = preferences,
viewThemeUtils = sut.viewThemeUtils,
context = targetContext,
accountManager = accountManager
)
)

val adapter = UnifiedSearchListAdapter(
Expand All @@ -157,7 +169,7 @@ class UnifiedSearchListAdapterIT : AbstractIT() {
viewThemeUtils = sut.viewThemeUtils,
appPreferences = preferences,
currentDirItemAction = noopCurrentDirAction,
overlayManager = overlayManager
thumbnailGenerator = thumbnailGenerator
)

adapter.shouldShowFooters(true)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,11 +29,12 @@ import androidx.test.espresso.matcher.ViewMatchers.isRoot
import androidx.test.espresso.matcher.ViewMatchers.withId
import com.nextcloud.test.Flaky
import com.nextcloud.test.TestActivity
import com.nextcloud.utils.extensions.getBigThumbnail
import com.nextcloud.utils.extensions.getBigThumbnailKey
import com.owncloud.android.AbstractIT
import com.owncloud.android.R
import com.owncloud.android.datamodel.OCFile
import com.owncloud.android.datamodel.ThumbnailsCacheManager
import com.owncloud.android.datamodel.ThumbnailsCacheManager.PREFIX_RESIZED_IMAGE
import com.owncloud.android.lib.common.utils.Log_OC
import com.owncloud.android.lib.resources.files.model.ImageDimension
import com.owncloud.android.ui.adapter.GalleryRowHolder
Expand Down Expand Up @@ -221,9 +222,9 @@ class GalleryFragmentIT : AbstractIT() {
drawRGB(random.nextInt(256), random.nextInt(256), random.nextInt(256))
drawCircle(w / 2f, h / 2f, w.coerceAtMost(h) / 2f, Paint().apply { color = Color.BLACK })
}
ThumbnailsCacheManager.addBitmapToCache(PREFIX_RESIZED_IMAGE + file.remoteId, bitmap)
ThumbnailsCacheManager.addBitmapToCache(file.getBigThumbnailKey(), bitmap)

assertNotNull(ThumbnailsCacheManager.getBitmapFromDiskCache(PREFIX_RESIZED_IMAGE + file.remoteId))
assertNotNull(file.getBigThumbnail())

Log_OC.d("Gallery_thumbnail", "created $id with ${bitmap.width} x ${bitmap.height}")
}
Expand Down
7 changes: 4 additions & 3 deletions app/src/main/java/com/nextcloud/client/di/AppModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
import com.owncloud.android.ui.activities.data.files.FilesServiceApiImpl;
import com.owncloud.android.ui.activities.data.files.RemoteFilesRepository;
import com.owncloud.android.ui.dialog.setupEncryption.CertificateValidator;
import com.owncloud.android.utils.overlay.OverlayManager;
import com.nextcloud.utils.thumbnail.FolderThumbnailGenerator;
import com.owncloud.android.utils.theme.ViewThemeUtils;

import org.greenrobot.eventbus.EventBus;
Expand Down Expand Up @@ -272,11 +272,12 @@ CertificateValidator certificateValidator() {

@Provides
@Singleton
OverlayManager overlayManager(
FolderThumbnailGenerator folderThumbnailGenerator(
AppPreferences appPreferences,
ViewThemeUtils viewThemeUtils,
Context context,
UserAccountManager accountManager) {
return new OverlayManager(appPreferences, viewThemeUtils, context, accountManager);
return new FolderThumbnailGenerator(appPreferences, viewThemeUtils, context, accountManager);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ import android.view.WindowManager
import android.widget.ImageView
import androidx.core.content.ContextCompat
import com.nextcloud.client.account.User
import com.nextcloud.utils.extensions.getBigThumbnail
import com.nextcloud.utils.extensions.getBigThumbnailKey
import com.nextcloud.utils.extensions.getSmallThumbnail
import com.nextcloud.utils.extensions.isPNG
import com.nextcloud.utils.extensions.toFile
import com.owncloud.android.MainApp
Expand Down Expand Up @@ -110,28 +113,30 @@ class GalleryImageGenerationJob(private val user: User, private val storageManag
}

private suspend fun getBitmap(file: OCFile, onNewThumbnail: () -> Unit): Bitmap? = withContext(Dispatchers.IO) {
val cacheKey = ThumbnailsCacheManager.PREFIX_RESIZED_IMAGE + file.remoteId

val cached = ThumbnailsCacheManager.getBitmapFromDiskCache(cacheKey)
val cached = file.getBigThumbnail()
if (cached != null && !file.isUpdateThumbnailNeeded) {
return@withContext applyVideoOverlayIfNeeded(file, cached)
}

onNewThumbnail()

if (file.isDown) {
val local = decodeLocalThumbnail(file)
if (local != null) {
ThumbnailsCacheManager.addBitmapToCache(cacheKey, local)
ThumbnailsCacheManager.addBitmapToCache(file.getBigThumbnailKey(), local)
onNewThumbnail()
return@withContext applyVideoOverlayIfNeeded(file, local)
}
}

val remote = semaphore.withPermit { fetchFromServer(file) }
if (remote != null) {
onNewThumbnail()
return@withContext applyVideoOverlayIfNeeded(file, remote)
}

file.getSmallThumbnail()?.let { small ->
return@withContext applyVideoOverlayIfNeeded(file, small)
}

null
}

Expand All @@ -149,7 +154,7 @@ class GalleryImageGenerationJob(private val user: User, private val storageManag
val pxW = p.x
val pxH = p.y

val cacheKey = ThumbnailsCacheManager.PREFIX_RESIZED_IMAGE + file.remoteId
val cacheKey = file.getBigThumbnailKey()

var bitmap = BitmapUtils.decodeSampledBitmapFromFile(file.storagePath, pxW, pxH) ?: return null

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ import androidx.lifecycle.lifecycleScope
import com.nextcloud.android.common.ui.theme.utils.ColorRole
import com.nextcloud.client.NominatimClient
import com.nextcloud.ui.fileInfo.model.ImageMetadata
import com.nextcloud.utils.extensions.getSmallThumbnail
import com.owncloud.android.MainApp
import com.owncloud.android.R
import com.owncloud.android.databinding.FileInfoFragmentBinding
import com.owncloud.android.datamodel.OCFile
import com.owncloud.android.datamodel.ThumbnailsCacheManager
import com.owncloud.android.utils.BitmapUtils
import com.owncloud.android.utils.DisplayUtils
import com.owncloud.android.utils.theme.ViewThemeUtils
Expand Down Expand Up @@ -259,9 +259,7 @@ class ImageDetailInfo(private val fragment: FileInfoFragment, private val viewTh

private fun imagePinDrawable(context: Context, file: OCFile): LayerDrawable =
(ContextCompat.getDrawable(context, R.drawable.photo_pin) as LayerDrawable).apply {
val bitmap = ThumbnailsCacheManager.getBitmapFromDiskCache(
ThumbnailsCacheManager.PREFIX_THUMBNAIL + file.remoteId
)
val bitmap = file.getSmallThumbnail()
BitmapUtils.bitmapToCircularBitmapDrawable(fragment.resources, bitmap)?.let {
setDrawable(1, it)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,12 @@ import com.owncloud.android.databinding.FileActionsBottomSheetItemBinding
import com.owncloud.android.datamodel.FileDataStorageManager
import com.owncloud.android.datamodel.OCFile
import com.owncloud.android.datamodel.SyncedFolderProvider
import com.owncloud.android.datamodel.ThumbnailsCacheManager
import com.owncloud.android.lib.resources.files.model.FileLockType
import com.owncloud.android.ui.activity.ComponentsGetter
import com.owncloud.android.utils.DisplayUtils
import com.owncloud.android.utils.DisplayUtils.AvatarGenerationListener
import com.owncloud.android.utils.FileStorageUtils
import com.owncloud.android.utils.overlay.OverlayManager
import com.nextcloud.utils.thumbnail.ThumbnailGenerator
import com.owncloud.android.utils.theme.ViewThemeUtils
import javax.inject.Inject

Expand All @@ -71,7 +70,7 @@ class FileActionsBottomSheet :
lateinit var syncedFolderProvider: SyncedFolderProvider

@Inject
lateinit var overlayManager: OverlayManager
lateinit var thumbnailGenerator: ThumbnailGenerator

private lateinit var viewModel: FileActionsViewModel

Expand All @@ -81,8 +80,6 @@ class FileActionsBottomSheet :

private lateinit var componentsGetter: ComponentsGetter

private val thumbnailAsyncTasks = mutableListOf<ThumbnailsCacheManager.ThumbnailGenerationTask>()

private var endpoints: List<Endpoint>? = mutableListOf()

private lateinit var clientIntegration: ClientIntegration
Expand Down Expand Up @@ -149,18 +146,10 @@ class FileActionsBottomSheet :

private fun loadFileThumbnail(titleFile: OCFile?) {
titleFile?.let {
DisplayUtils.setThumbnail(
thumbnailGenerator.setThumbnail(
it,
binding.thumbnailLayout.thumbnail,
currentUserProvider.user,
storageManager,
thumbnailAsyncTasks,
false,
context,
binding.thumbnailLayout.thumbnailShimmer,
syncedFolderProvider.preferences,
viewThemeUtils,
overlayManager
shimmer = binding.thumbnailLayout.thumbnailShimmer
)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,9 @@ import com.owncloud.android.databinding.FileActionsBottomSheetBinding
import com.owncloud.android.databinding.FileActionsBottomSheetItemBinding
import com.owncloud.android.datamodel.FileDataStorageManager
import com.owncloud.android.datamodel.SyncedFolderProvider
import com.owncloud.android.datamodel.ThumbnailsCacheManager
import com.owncloud.android.lib.resources.trashbin.model.TrashbinFile
import com.owncloud.android.utils.DisplayUtils
import com.owncloud.android.utils.overlay.OverlayManager
import com.nextcloud.utils.thumbnail.ThumbnailGenerator
import com.owncloud.android.utils.theme.ViewThemeUtils
import javax.inject.Inject

Expand All @@ -59,16 +58,14 @@ class TrashbinFileActionsBottomSheet :
lateinit var syncedFolderProvider: SyncedFolderProvider

@Inject
lateinit var overlayManager: OverlayManager
lateinit var thumbnailGenerator: ThumbnailGenerator

private lateinit var viewModel: TrashbinFileActionsViewModel

private var _binding: FileActionsBottomSheetBinding? = null
val binding
get() = _binding!!

private val thumbnailAsyncTasks = mutableListOf<ThumbnailsCacheManager.ThumbnailGenerationTask>()

fun interface ResultListener {
fun onResult(@IdRes actionId: Int)
}
Expand Down Expand Up @@ -122,18 +119,10 @@ class TrashbinFileActionsBottomSheet :

private fun loadFileThumbnail(titleFile: TrashbinFile?) {
titleFile?.let {
DisplayUtils.setThumbnail(
thumbnailGenerator.setThumbnail(
it.toOCFile(),
binding.thumbnailLayout.thumbnail,
currentUserProvider.user,
storageManager,
thumbnailAsyncTasks,
false,
context,
binding.thumbnailLayout.thumbnailShimmer,
syncedFolderProvider.preferences,
viewThemeUtils,
overlayManager
shimmer = binding.thumbnailLayout.thumbnailShimmer
)
}
}
Expand Down
7 changes: 2 additions & 5 deletions app/src/main/java/com/nextcloud/utils/ShortcutUtil.kt
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ import androidx.core.graphics.drawable.IconCompat
import androidx.core.graphics.drawable.toBitmap
import androidx.core.graphics.drawable.toDrawable
import com.nextcloud.client.account.User
import com.nextcloud.utils.extensions.getSmallThumbnail
import com.owncloud.android.R
import com.owncloud.android.datamodel.OCFile
import com.owncloud.android.datamodel.SyncedFolderObserver
import com.owncloud.android.datamodel.SyncedFolderProvider
import com.owncloud.android.datamodel.ThumbnailsCacheManager
import com.owncloud.android.ui.activity.FileActivity
import com.owncloud.android.ui.activity.FileDisplayActivity
import com.owncloud.android.utils.MimeTypeUtil
Expand Down Expand Up @@ -84,10 +84,7 @@ class ShortcutUtil @Inject constructor(private val mContext: Context) {
user: User,
syncedFolderProvider: SyncedFolderProvider
): IconCompat {
val thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(
ThumbnailsCacheManager.PREFIX_THUMBNAIL + file.remoteId
)

val thumbnail = file.getSmallThumbnail()
return when {
thumbnail != null -> IconCompat.createWithAdaptiveBitmap(bitmapToAdaptiveBitmap(thumbnail))

Expand Down
18 changes: 18 additions & 0 deletions app/src/main/java/com/nextcloud/utils/extensions/FileExtensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,12 @@

package com.nextcloud.utils.extensions

import android.graphics.Bitmap
import androidx.exifinterface.media.ExifInterface
import com.owncloud.android.datamodel.OCFile
import com.owncloud.android.datamodel.ThumbnailsCacheManager
import com.owncloud.android.lib.common.utils.Log_OC
import com.owncloud.android.lib.resources.files.model.ServerFileInterface
import com.owncloud.android.utils.DisplayUtils
import java.io.File
import java.nio.file.Path
Expand All @@ -22,6 +25,21 @@ fun OCFile?.logFileSize(tag: String) {
Log_OC.d(tag, "onSaveInstanceState: $size, raw byte $rawByte")
}

fun ServerFileInterface.getThumbnailKeys(): List<String> = listOf(getBigThumbnailKey(), getSmallThumbnailKey())

fun ServerFileInterface.getBigThumbnail(): Bitmap? = ThumbnailsCacheManager.getBitmapFromDiskCache(getBigThumbnailKey())

fun ServerFileInterface.getBigThumbnailKey(): String = ThumbnailsCacheManager.PREFIX_RESIZED_IMAGE + remoteId

fun ServerFileInterface.getSmallThumbnail(): Bitmap? =
ThumbnailsCacheManager.getBitmapFromDiskCache(getSmallThumbnailKey())

fun ServerFileInterface.getSmallThumbnailKey(): String = ThumbnailsCacheManager.PREFIX_THUMBNAIL + remoteId

fun File?.getSmallThumbnail(): Bitmap? = ThumbnailsCacheManager.getBitmapFromDiskCache(getSmallThumbnailKey())

fun File?.getSmallThumbnailKey(): String = ThumbnailsCacheManager.PREFIX_THUMBNAIL + hashCode()

fun File?.logFileSize(tag: String) {
val size = DisplayUtils.bytesToHumanReadable(this?.length() ?: -1)
val rawByte = this?.length() ?: -1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,29 @@ package com.nextcloud.utils.extensions
import android.content.Context
import android.graphics.drawable.GradientDrawable
import android.util.TypedValue
import android.view.View
import android.view.ViewOutlineProvider
import android.widget.ImageView
import androidx.annotation.ColorInt
import androidx.annotation.DrawableRes
import androidx.core.content.ContextCompat
import com.elyeproj.loaderviewlibrary.LoaderImageView
import com.owncloud.android.R

fun ImageView.startShimmer(shimmer: LoaderImageView) {
shimmer.setImageResource(R.drawable.background)
shimmer.resetLoader()
setVisibility(View.GONE)
shimmer.setVisibility(View.VISIBLE)
}

fun ImageView.stopShimmer(shimmer: LoaderImageView?) {
shimmer?.let {
it.visibility = View.GONE
}
setVisibility(View.VISIBLE)
}

@JvmOverloads
fun ImageView.makeRoundedWithIcon(
context: Context,
Expand Down
Loading
Loading