From 70522ce7f7d5c94b0e920d435dbc6cf7e97c133b Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 8 Oct 2026 11:36:21 +0200 Subject: [PATCH 1/4] BitmapFactory cannot decode vector drawables, they have to be drawn into a bitmap Signed-off-by: alperozturk96 --- .../com/owncloud/android/utils/BitmapUtils.kt | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/app/src/main/java/com/owncloud/android/utils/BitmapUtils.kt b/app/src/main/java/com/owncloud/android/utils/BitmapUtils.kt index 73489cfed6de..77356ea11291 100644 --- a/app/src/main/java/com/owncloud/android/utils/BitmapUtils.kt +++ b/app/src/main/java/com/owncloud/android/utils/BitmapUtils.kt @@ -22,8 +22,11 @@ import android.graphics.Rect import android.graphics.RectF import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.Drawable +import android.graphics.drawable.PictureDrawable import android.widget.ImageView import androidx.annotation.DimenRes +import androidx.annotation.DrawableRes +import androidx.core.content.res.ResourcesCompat import androidx.core.graphics.applyCanvas import androidx.core.graphics.blue import androidx.core.graphics.createBitmap @@ -43,6 +46,7 @@ import com.owncloud.android.lib.resources.users.StatusType import com.owncloud.android.ui.StatusDrawable import java.security.MessageDigest import java.security.NoSuchAlgorithmException +import kotlin.math.max import kotlin.math.min import kotlin.math.roundToInt import com.nextcloud.utils.decodeSampledBitmapFromFile as decodeSampledBitmap @@ -124,6 +128,24 @@ object BitmapUtils { return bitmap.scale((scale * width).roundToInt(), (scale * height).roundToInt()) } + @JvmStatic + fun rasterizeDrawable(@DrawableRes drawableId: Int, size: Int): Bitmap { + val drawable = checkNotNull(ResourcesCompat.getDrawable(resources, drawableId, null)) + return drawableToBitmap(drawable, size, size) + } + + @JvmStatic + fun rasterizePictureDrawable(pictureDrawable: PictureDrawable, maxSize: Int): Bitmap { + val width = pictureDrawable.intrinsicWidth + val height = pictureDrawable.intrinsicHeight + val factor = min(1f, maxSize.toFloat() / max(width, height)) + + return createBitmap((width * factor).roundToInt(), (height * factor).roundToInt()).applyCanvas { + scale(factor, factor) + drawPicture(pictureDrawable.picture) + } + } + @Suppress("TooGenericExceptionCaught") private fun readExifOrientation(storagePath: String): Int = try { ExifInterface(storagePath).getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL) From 734d6a1585dc0e0117719cfb409501f80e4eec86 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 8 Oct 2026 11:36:29 +0200 Subject: [PATCH 2/4] BitmapFactory cannot decode vector drawables, they have to be drawn into a bitmap Signed-off-by: alperozturk96 --- .../owncloud/android/ui/activity/DrawerActivity.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java index 6ac40163ec51..dff62b894161 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java @@ -19,7 +19,6 @@ import android.content.res.ColorStateList; import android.content.res.Configuration; import android.graphics.Bitmap; -import android.graphics.Canvas; import android.graphics.Color; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; @@ -453,14 +452,7 @@ public void onResourceReady(@NonNull Drawable resource, @Nullable Transition Date: Thu, 8 Oct 2026 11:36:36 +0200 Subject: [PATCH 3/4] BitmapFactory cannot decode vector drawables, they have to be drawn into a bitmap Signed-off-by: alperozturk96 --- .../android/datamodel/ThumbnailsCacheManager.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java index deb5c72070de..dc820c0ce92b 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java +++ b/app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java @@ -112,11 +112,11 @@ public final class ThumbnailsCacheManager { public static final int THUMBNAIL_SIZE_IN_KB = 512; private static final int RESIZED_IMAGE_SIZE_IN_KB = 10240; - public static final Bitmap mDefaultImg = BitmapFactory.decodeResource(MainApp.getAppContext().getResources(), - R.drawable.file_image); + public static final Bitmap mDefaultImg = BitmapUtils.rasterizeDrawable(R.drawable.file_image, + getThumbnailDimension()); - public static final Bitmap mDefaultVideo = BitmapFactory.decodeResource(MainApp.getAppContext().getResources(), - R.drawable.file_movie); + public static final Bitmap mDefaultVideo = BitmapUtils.rasterizeDrawable(R.drawable.file_movie, + getThumbnailDimension()); private ThumbnailsCacheManager() { } From 6d30a72f89c0d2aecf22490f352c73b128377537 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 8 Oct 2026 11:36:49 +0200 Subject: [PATCH 4/4] the tint belongs to the placeholder icon only, it would paint the loaded image in a single color Signed-off-by: alperozturk96 --- .../owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt b/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt index 5618eb892e3c..85c483b8740c 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt +++ b/app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt @@ -127,6 +127,8 @@ class UnifiedSearchItemViewHolder( if (entry.thumbnailUrl.isNotBlank()) { filesAction.loadFileThumbnail(entry) { client -> + ImageViewCompat.setImageTintList(binding.thumbnail, null) + if (entryType == SearchResultEntryType.Avatar) { GlideHelper.loadCircularBitmapIntoImageView( context,