From 6667a9987ecc06fb1978e83b37094316f8095246 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Tue, 24 Feb 2026 15:20:39 +0100 Subject: [PATCH 1/3] fix(client-integration): icon crash Signed-off-by: alperozturk96 # Conflicts: # app/src/main/java/com/nextcloud/utils/GlideHelper.kt --- .../ui/fileactions/ClientIntegration.kt | 36 +++++++------------ 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/nextcloud/ui/fileactions/ClientIntegration.kt b/app/src/main/java/com/nextcloud/ui/fileactions/ClientIntegration.kt index 0561a66b5178..3e9fc9fb06cd 100644 --- a/app/src/main/java/com/nextcloud/ui/fileactions/ClientIntegration.kt +++ b/app/src/main/java/com/nextcloud/ui/fileactions/ClientIntegration.kt @@ -9,14 +9,10 @@ package com.nextcloud.ui.fileactions import android.content.Context import android.content.Intent -import android.graphics.Canvas -import android.graphics.drawable.PictureDrawable import android.os.Bundle import android.view.LayoutInflater import android.view.View import androidx.appcompat.content.res.AppCompatResources -import androidx.core.graphics.createBitmap -import androidx.core.graphics.drawable.toDrawable import androidx.core.net.toUri import androidx.lifecycle.lifecycleScope import com.google.gson.Gson @@ -81,31 +77,25 @@ class ClientIntegration( } text.text = endpoint.name + val px = DisplayUtils.convertDpToPixel( + context.resources.getDimension(R.dimen.iconized_single_line_item_icon_size), + context + ) + if (endpoint.icon != null) { sheet.lifecycleScope.launch(Dispatchers.IO) { val client = OwnCloudClientManagerFactory.getDefaultSingleton() .getNextcloudClientFor(user.toOwnCloudAccount(), context) - val drawable = - GlideHelper.getDrawable(context, client, client.baseUri.toString() + endpoint.icon) - ?.mutate() - - val px = DisplayUtils.convertDpToPixel( - context.resources.getDimension(R.dimen.iconized_single_line_item_icon_size), - context - ) - val returnedBitmap = - createBitmap(drawable?.intrinsicWidth ?: px, drawable?.intrinsicHeight ?: px) - - val canvas = Canvas(returnedBitmap) - canvas.drawPicture((drawable as PictureDrawable).picture) - - val d = returnedBitmap.toDrawable(context.resources) - - val tintedDrawable = viewThemeUtils.platform.tintDrawable( + val drawable = GlideHelper.fetchDrawable( context, - d - ) + client, + client.baseUri.toString() + endpoint.icon, + width = px, + height = px + )?.mutate() + + val tintedDrawable = drawable?.let { viewThemeUtils.platform.tintDrawable(context, it) } withContext(Dispatchers.Main) { icon.setImageDrawable(tintedDrawable) From 3dfb266d7330c8e09b7d596308c8bdd6a3832615 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 15 Apr 2026 09:02:40 +0200 Subject: [PATCH 2/3] simplify Signed-off-by: alperozturk96 --- .../ui/fileactions/ClientIntegration.kt | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/nextcloud/ui/fileactions/ClientIntegration.kt b/app/src/main/java/com/nextcloud/ui/fileactions/ClientIntegration.kt index 3e9fc9fb06cd..ca2358cdd198 100644 --- a/app/src/main/java/com/nextcloud/ui/fileactions/ClientIntegration.kt +++ b/app/src/main/java/com/nextcloud/ui/fileactions/ClientIntegration.kt @@ -9,6 +9,7 @@ package com.nextcloud.ui.fileactions import android.content.Context import android.content.Intent +import android.graphics.drawable.Drawable import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -87,32 +88,37 @@ class ClientIntegration( val client = OwnCloudClientManagerFactory.getDefaultSingleton() .getNextcloudClientFor(user.toOwnCloudAccount(), context) - val drawable = GlideHelper.fetchDrawable( - context, - client, - client.baseUri.toString() + endpoint.icon, - width = px, - height = px - )?.mutate() - - val tintedDrawable = drawable?.let { viewThemeUtils.platform.tintDrawable(context, it) } + val drawable = GlideHelper + .getDrawable(context, client, client.baseUri.toString() + endpoint.icon)?.mutate() withContext(Dispatchers.Main) { - icon.setImageDrawable(tintedDrawable) + val tintedDrawable = drawable?.let { viewThemeUtils.platform.tintDrawable(context, it) } + if (tintedDrawable != null) { + icon.setImageDrawable(tintedDrawable) + } else { + getDefaultTintedIconDrawable(viewThemeUtils)?.let { + icon.setImageDrawable(it) + } + } } } } else { - val tintedDrawable = viewThemeUtils.platform.tintDrawable( - context, - AppCompatResources.getDrawable(context, R.drawable.ic_activity)!! - ) - - icon.setImageDrawable(tintedDrawable) + getDefaultTintedIconDrawable(viewThemeUtils)?.let { + icon.setImageDrawable(it) + } } } return itemBinding.root } + private fun getDefaultTintedIconDrawable(viewThemeUtils: ViewThemeUtils): Drawable? { + val drawable = AppCompatResources.getDrawable(context, R.drawable.ic_activity) ?: return null + return viewThemeUtils.platform.tintDrawable( + context, + drawable + ) + } + private fun requestClientIntegration(endpoint: Endpoint, fileId: String, filePath: String) { sheet.lifecycleScope.launch(Dispatchers.IO) { val client = OwnCloudClientManagerFactory.getDefaultSingleton() From d818169785b24e2eeb049b0af76f5823d185c087 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 15 Apr 2026 09:23:11 +0200 Subject: [PATCH 3/3] simplify Signed-off-by: alperozturk96 --- .../ui/fileactions/ClientIntegration.kt | 80 +++++++++++-------- 1 file changed, 48 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/com/nextcloud/ui/fileactions/ClientIntegration.kt b/app/src/main/java/com/nextcloud/ui/fileactions/ClientIntegration.kt index ca2358cdd198..fbc258d0836d 100644 --- a/app/src/main/java/com/nextcloud/ui/fileactions/ClientIntegration.kt +++ b/app/src/main/java/com/nextcloud/ui/fileactions/ClientIntegration.kt @@ -9,11 +9,15 @@ package com.nextcloud.ui.fileactions import android.content.Context import android.content.Intent +import android.graphics.Canvas import android.graphics.drawable.Drawable +import android.graphics.drawable.PictureDrawable import android.os.Bundle import android.view.LayoutInflater import android.view.View import androidx.appcompat.content.res.AppCompatResources +import androidx.core.graphics.createBitmap +import androidx.core.graphics.drawable.toDrawable import androidx.core.net.toUri import androidx.lifecycle.lifecycleScope import com.google.gson.Gson @@ -78,47 +82,59 @@ class ClientIntegration( } text.text = endpoint.name - val px = DisplayUtils.convertDpToPixel( - context.resources.getDimension(R.dimen.iconized_single_line_item_icon_size), - context - ) - - if (endpoint.icon != null) { - sheet.lifecycleScope.launch(Dispatchers.IO) { - val client = OwnCloudClientManagerFactory.getDefaultSingleton() - .getNextcloudClientFor(user.toOwnCloudAccount(), context) - - val drawable = GlideHelper - .getDrawable(context, client, client.baseUri.toString() + endpoint.icon)?.mutate() - - withContext(Dispatchers.Main) { - val tintedDrawable = drawable?.let { viewThemeUtils.platform.tintDrawable(context, it) } - if (tintedDrawable != null) { - icon.setImageDrawable(tintedDrawable) - } else { - getDefaultTintedIconDrawable(viewThemeUtils)?.let { - icon.setImageDrawable(it) - } - } - } + sheet.lifecycleScope.launch(Dispatchers.IO) { + val client = OwnCloudClientManagerFactory.getDefaultSingleton() + .getNextcloudClientFor(user.toOwnCloudAccount(), context) + + val rawDrawable = if (endpoint.icon != null) { + GlideHelper.getDrawable(context, client, client.baseUri.toString() + endpoint.icon)?.mutate() + } else { + null } - } else { - getDefaultTintedIconDrawable(viewThemeUtils)?.let { - icon.setImageDrawable(it) + + val tintableDrawable = prepareDrawableForTinting(rawDrawable) ?: getDefaultIconDrawable() + + withContext(Dispatchers.Main) { + tintableDrawable?.let { + val tinted = viewThemeUtils.platform.tintDrawable(context, it) + icon.setImageDrawable(tinted) + } } } } + return itemBinding.root } - private fun getDefaultTintedIconDrawable(viewThemeUtils: ViewThemeUtils): Drawable? { - val drawable = AppCompatResources.getDrawable(context, R.drawable.ic_activity) ?: return null - return viewThemeUtils.platform.tintDrawable( - context, - drawable - ) + private fun prepareDrawableForTinting(drawable: Drawable?): Drawable? { + if (drawable == null) { + return null + } + + if (drawable is PictureDrawable) { + val defaultSize = DisplayUtils.convertDpToPixel( + context.resources.getDimension(R.dimen.iconized_single_line_item_icon_size), + context + ).toInt().coerceAtLeast(1) + + val width = if (drawable.intrinsicWidth > 0) drawable.intrinsicWidth else defaultSize + val height = if (drawable.intrinsicHeight > 0) drawable.intrinsicHeight else defaultSize + + val safeWidth = width.coerceAtLeast(1) + val safeHeight = height.coerceAtLeast(1) + + val bitmap = createBitmap(safeWidth, safeHeight) + val canvas = Canvas(bitmap) + canvas.drawPicture(drawable.picture) + + return bitmap.toDrawable(context.resources) + } + + return drawable } + private fun getDefaultIconDrawable(): Drawable? = AppCompatResources.getDrawable(context, R.drawable.ic_activity) + private fun requestClientIntegration(endpoint: Endpoint, fileId: String, filePath: String) { sheet.lifecycleScope.launch(Dispatchers.IO) { val client = OwnCloudClientManagerFactory.getDefaultSingleton()