@@ -9,11 +9,15 @@ package com.nextcloud.ui.fileactions
99
1010import android.content.Context
1111import android.content.Intent
12+ import android.graphics.Canvas
1213import android.graphics.drawable.Drawable
14+ import android.graphics.drawable.PictureDrawable
1315import android.os.Bundle
1416import android.view.LayoutInflater
1517import android.view.View
1618import androidx.appcompat.content.res.AppCompatResources
19+ import androidx.core.graphics.createBitmap
20+ import androidx.core.graphics.drawable.toDrawable
1721import androidx.core.net.toUri
1822import androidx.lifecycle.lifecycleScope
1923import com.google.gson.Gson
@@ -78,47 +82,59 @@ class ClientIntegration(
7882 }
7983 text.text = endpoint.name
8084
81- val px = DisplayUtils .convertDpToPixel(
82- context.resources.getDimension(R .dimen.iconized_single_line_item_icon_size),
83- context
84- )
85-
86- if (endpoint.icon != null ) {
87- sheet.lifecycleScope.launch(Dispatchers .IO ) {
88- val client = OwnCloudClientManagerFactory .getDefaultSingleton()
89- .getNextcloudClientFor(user.toOwnCloudAccount(), context)
90-
91- val drawable = GlideHelper
92- .getDrawable(context, client, client.baseUri.toString() + endpoint.icon)?.mutate()
93-
94- withContext(Dispatchers .Main ) {
95- val tintedDrawable = drawable?.let { viewThemeUtils.platform.tintDrawable(context, it) }
96- if (tintedDrawable != null ) {
97- icon.setImageDrawable(tintedDrawable)
98- } else {
99- getDefaultTintedIconDrawable(viewThemeUtils)?.let {
100- icon.setImageDrawable(it)
101- }
102- }
103- }
85+ sheet.lifecycleScope.launch(Dispatchers .IO ) {
86+ val client = OwnCloudClientManagerFactory .getDefaultSingleton()
87+ .getNextcloudClientFor(user.toOwnCloudAccount(), context)
88+
89+ val rawDrawable = if (endpoint.icon != null ) {
90+ GlideHelper .getDrawable(context, client, client.baseUri.toString() + endpoint.icon)?.mutate()
91+ } else {
92+ null
10493 }
105- } else {
106- getDefaultTintedIconDrawable(viewThemeUtils)?.let {
107- icon.setImageDrawable(it)
94+
95+ val tintableDrawable = prepareDrawableForTinting(rawDrawable) ? : getDefaultIconDrawable()
96+
97+ withContext(Dispatchers .Main ) {
98+ tintableDrawable?.let {
99+ val tinted = viewThemeUtils.platform.tintDrawable(context, it)
100+ icon.setImageDrawable(tinted)
101+ }
108102 }
109103 }
110104 }
105+
111106 return itemBinding.root
112107 }
113108
114- private fun getDefaultTintedIconDrawable (viewThemeUtils : ViewThemeUtils ): Drawable ? {
115- val drawable = AppCompatResources .getDrawable(context, R .drawable.ic_activity) ? : return null
116- return viewThemeUtils.platform.tintDrawable(
117- context,
118- drawable
119- )
109+ private fun prepareDrawableForTinting (drawable : Drawable ? ): Drawable ? {
110+ if (drawable == null ) {
111+ return null
112+ }
113+
114+ if (drawable is PictureDrawable ) {
115+ val defaultSize = DisplayUtils .convertDpToPixel(
116+ context.resources.getDimension(R .dimen.iconized_single_line_item_icon_size),
117+ context
118+ ).toInt().coerceAtLeast(1 )
119+
120+ val width = if (drawable.intrinsicWidth > 0 ) drawable.intrinsicWidth else defaultSize
121+ val height = if (drawable.intrinsicHeight > 0 ) drawable.intrinsicHeight else defaultSize
122+
123+ val safeWidth = width.coerceAtLeast(1 )
124+ val safeHeight = height.coerceAtLeast(1 )
125+
126+ val bitmap = createBitmap(safeWidth, safeHeight)
127+ val canvas = Canvas (bitmap)
128+ canvas.drawPicture(drawable.picture)
129+
130+ return bitmap.toDrawable(context.resources)
131+ }
132+
133+ return drawable
120134 }
121135
136+ private fun getDefaultIconDrawable (): Drawable ? = AppCompatResources .getDrawable(context, R .drawable.ic_activity)
137+
122138 private fun requestClientIntegration (endpoint : Endpoint , fileId : String , filePath : String ) {
123139 sheet.lifecycleScope.launch(Dispatchers .IO ) {
124140 val client = OwnCloudClientManagerFactory .getDefaultSingleton()
0 commit comments