Skip to content

Commit 1d09343

Browse files
Merge pull request nextcloud#15017 from nextcloud/glideV4
Glide v4
2 parents 5c63c0e + 630d26a commit 1d09343

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+1328
-1060
lines changed

.idea/codeStyles/Project.xml

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/build.gradle

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,10 @@ dependencies {
296296
androidTestImplementation libs.espresso.intents
297297
androidTestImplementation libs.espresso.idling.resource
298298

299+
// Glide
300+
implementation libs.glide
301+
ksp libs.ksp
302+
299303
compileOnly "org.jbundle.util.osgi.wrapped:org.jbundle.util.osgi.wrapped.org.apache.http.client:4.1.2"
300304
// remove after entire switch to lib v2
301305
implementation "commons-httpclient:commons-httpclient:3.1@jar" // remove after entire switch to lib v2
@@ -326,9 +330,7 @@ dependencies {
326330
implementation "pl.droidsonroids.gif:android-gif-drawable:1.2.29"
327331
implementation "com.github.nextcloud-deps:qrcodescanner:0.1.2.4" // "com.github.blikoon:QRCodeScanner:0.1.2"
328332
implementation "com.google.android.flexbox:flexbox:3.0.0"
329-
implementation("com.github.bumptech.glide:glide:3.8.0") {
330-
exclude group: "com.android.support"
331-
}
333+
332334
implementation "com.caverock:androidsvg:1.4"
333335
implementation "androidx.annotation:annotation:1.9.1"
334336
implementation "com.vanniktech:emoji-google:0.21.0"

app/src/main/java/com/nextcloud/client/widget/DashboardWidgetService.kt

Lines changed: 21 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -11,34 +11,25 @@ import android.appwidget.AppWidgetManager
1111
import android.content.Context
1212
import android.content.Intent
1313
import android.graphics.Bitmap
14-
import android.net.Uri
1514
import android.view.View
1615
import android.widget.RemoteViews
1716
import android.widget.RemoteViewsService
17+
import androidx.core.graphics.drawable.toBitmap
1818
import androidx.core.net.toUri
19-
import com.bumptech.glide.Glide
20-
import com.bumptech.glide.load.engine.DiskCacheStrategy
21-
import com.bumptech.glide.load.model.StreamEncoder
22-
import com.bumptech.glide.load.resource.file.FileToStreamDecoder
23-
import com.bumptech.glide.request.FutureTarget
2419
import com.nextcloud.android.lib.resources.dashboard.DashboardGetWidgetItemsRemoteOperation
2520
import com.nextcloud.android.lib.resources.dashboard.DashboardWidgetItem
2621
import com.nextcloud.client.account.UserAccountManager
2722
import com.nextcloud.client.network.ClientFactory
23+
import com.nextcloud.utils.GlideHelper
2824
import com.owncloud.android.R
25+
import com.owncloud.android.lib.common.OwnCloudClientManagerFactory
2926
import com.owncloud.android.lib.common.utils.Log_OC
3027
import com.owncloud.android.utils.BitmapUtils
31-
import com.owncloud.android.utils.DisplayUtils.SVG_SIZE
32-
import com.owncloud.android.utils.glide.CustomGlideStreamLoader
33-
import com.owncloud.android.utils.glide.CustomGlideUriLoader
34-
import com.owncloud.android.utils.svg.SVGorImage
35-
import com.owncloud.android.utils.svg.SvgOrImageBitmapTranscoder
36-
import com.owncloud.android.utils.svg.SvgOrImageDecoder
3728
import dagger.android.AndroidInjection
3829
import kotlinx.coroutines.CoroutineScope
3930
import kotlinx.coroutines.Dispatchers
4031
import kotlinx.coroutines.launch
41-
import java.io.InputStream
32+
import kotlinx.coroutines.withContext
4233
import javax.inject.Inject
4334

4435
class DashboardWidgetService : RemoteViewsService() {
@@ -172,54 +163,36 @@ class StackRemoteViewsFactory(
172163
}
173164
}
174165

175-
@Suppress("TooGenericExceptionCaught")
176166
private fun loadIcon(widgetItem: DashboardWidgetItem, remoteViews: RemoteViews) {
177-
val isIconSVG = widgetItem.iconUrl.toUri().encodedPath!!.endsWith(".svg")
178-
val source: FutureTarget<Bitmap> = if (isIconSVG) {
179-
loadSVGIcon(widgetItem)
180-
} else {
181-
loadBitmapIcon(widgetItem)
167+
CoroutineScope(Dispatchers.IO).launch {
168+
val client = OwnCloudClientManagerFactory.getDefaultSingleton()
169+
.getNextcloudClientFor(userAccountManager.user.toOwnCloudAccount(), context)
170+
val pictureDrawable = GlideHelper.getDrawable(context, client, widgetItem.iconUrl)
171+
val bitmap = pictureDrawable?.toBitmap() ?: return@launch
172+
173+
withContext(Dispatchers.Main) {
174+
remoteViews.setRemoteImageView(bitmap)
175+
return@withContext
176+
}
182177
}
178+
}
183179

180+
@Suppress("TooGenericExceptionCaught")
181+
private fun RemoteViews.setRemoteImageView(source: Bitmap) {
184182
try {
185183
val bitmap: Bitmap = if (widgetConfiguration.roundIcon) {
186-
BitmapUtils.roundBitmap(source.get())
184+
BitmapUtils.roundBitmap(source)
187185
} else {
188-
source.get()
186+
source
189187
}
190188

191-
remoteViews.setImageViewBitmap(R.id.icon, bitmap)
189+
setImageViewBitmap(R.id.icon, bitmap)
192190
} catch (e: Exception) {
193191
Log_OC.d(TAG, "Error setting icon", e)
194-
remoteViews.setImageViewResource(R.id.icon, R.drawable.ic_dashboard)
192+
setImageViewResource(R.id.icon, R.drawable.ic_dashboard)
195193
}
196194
}
197195

198-
private fun loadSVGIcon(widgetItem: DashboardWidgetItem): FutureTarget<Bitmap> {
199-
return Glide.with(context)
200-
.using(
201-
CustomGlideUriLoader(userAccountManager.user, clientFactory),
202-
InputStream::class.java
203-
)
204-
.from(Uri::class.java)
205-
.`as`(SVGorImage::class.java)
206-
.transcode(SvgOrImageBitmapTranscoder(SVG_SIZE, SVG_SIZE), Bitmap::class.java)
207-
.sourceEncoder(StreamEncoder())
208-
.cacheDecoder(FileToStreamDecoder(SvgOrImageDecoder()))
209-
.decoder(SvgOrImageDecoder())
210-
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
211-
.load(widgetItem.iconUrl.toUri())
212-
.into(SVG_SIZE, SVG_SIZE)
213-
}
214-
215-
private fun loadBitmapIcon(widgetItem: DashboardWidgetItem): FutureTarget<Bitmap> {
216-
return Glide.with(context)
217-
.using(CustomGlideStreamLoader(widgetConfiguration.user.get(), clientFactory))
218-
.load(widgetItem.iconUrl)
219-
.asBitmap()
220-
.into(SVG_SIZE, SVG_SIZE)
221-
}
222-
223196
private fun updateTexts(widgetItem: DashboardWidgetItem, remoteViews: RemoteViews) {
224197
remoteViews.setTextViewText(R.id.title, widgetItem.title)
225198

app/src/main/java/com/nextcloud/client/widget/DashboardWidgetUpdater.kt

Lines changed: 21 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -11,29 +11,23 @@ import android.app.PendingIntent
1111
import android.appwidget.AppWidgetManager
1212
import android.content.Context
1313
import android.content.Intent
14-
import android.graphics.Bitmap
15-
import android.net.Uri
1614
import android.os.Build
1715
import android.view.View
1816
import android.widget.RemoteViews
17+
import androidx.core.graphics.drawable.toBitmap
1918
import androidx.core.net.toUri
20-
import com.bumptech.glide.Glide
21-
import com.bumptech.glide.load.engine.DiskCacheStrategy
22-
import com.bumptech.glide.load.model.StreamEncoder
23-
import com.bumptech.glide.load.resource.file.FileToStreamDecoder
24-
import com.bumptech.glide.request.animation.GlideAnimation
2519
import com.bumptech.glide.request.target.AppWidgetTarget
2620
import com.nextcloud.android.lib.resources.dashboard.DashboardButton
2721
import com.nextcloud.client.account.CurrentAccountProvider
2822
import com.nextcloud.client.network.ClientFactory
23+
import com.nextcloud.utils.GlideHelper
2924
import com.owncloud.android.R
25+
import com.owncloud.android.lib.common.OwnCloudClientManagerFactory
3026
import com.owncloud.android.utils.BitmapUtils
31-
import com.owncloud.android.utils.DisplayUtils.SVG_SIZE
32-
import com.owncloud.android.utils.glide.CustomGlideUriLoader
33-
import com.owncloud.android.utils.svg.SVGorImage
34-
import com.owncloud.android.utils.svg.SvgOrImageBitmapTranscoder
35-
import com.owncloud.android.utils.svg.SvgOrImageDecoder
36-
import java.io.InputStream
27+
import kotlinx.coroutines.CoroutineScope
28+
import kotlinx.coroutines.Dispatchers
29+
import kotlinx.coroutines.launch
30+
import kotlinx.coroutines.withContext
3731
import javax.inject.Inject
3832

3933
class DashboardWidgetUpdater @Inject constructor(
@@ -62,7 +56,10 @@ class DashboardWidgetUpdater @Inject constructor(
6256
setAddButton(addButton, appWidgetId, this)
6357
setPendingReload(this, appWidgetId)
6458
setPendingClick(this)
65-
loadIcon(appWidgetId, iconUrl, this)
59+
60+
if (iconUrl.isNotEmpty()) {
61+
loadIcon(appWidgetId, iconUrl, this)
62+
}
6663
}
6764

6865
appWidgetManager.run {
@@ -157,28 +154,17 @@ class DashboardWidgetUpdater @Inject constructor(
157154
// endregion
158155

159156
private fun loadIcon(appWidgetId: Int, iconUrl: String, remoteViews: RemoteViews) {
160-
val iconTarget = object : AppWidgetTarget(context, remoteViews, R.id.icon, appWidgetId) {
161-
override fun onResourceReady(resource: Bitmap?, glideAnimation: GlideAnimation<in Bitmap>?) {
162-
if (resource != null) {
163-
val tintedBitmap = BitmapUtils.tintImage(resource, R.color.black)
164-
super.onResourceReady(tintedBitmap, glideAnimation)
165-
}
157+
val target = AppWidgetTarget(context, R.id.icon, remoteViews, appWidgetId)
158+
CoroutineScope(Dispatchers.IO).launch {
159+
val client = OwnCloudClientManagerFactory.getDefaultSingleton()
160+
.getNextcloudClientFor(accountProvider.user.toOwnCloudAccount(), context)
161+
val drawable = GlideHelper.getDrawable(context, client, iconUrl)
162+
val bitmap = drawable?.toBitmap() ?: return@launch
163+
val tintedBitmap = BitmapUtils.tintImage(bitmap, R.color.black)
164+
165+
withContext(Dispatchers.Main) {
166+
target.onResourceReady(tintedBitmap, null)
166167
}
167168
}
168-
169-
Glide.with(context)
170-
.using(
171-
CustomGlideUriLoader(accountProvider.user, clientFactory),
172-
InputStream::class.java
173-
)
174-
.from(Uri::class.java)
175-
.`as`(SVGorImage::class.java)
176-
.transcode(SvgOrImageBitmapTranscoder(SVG_SIZE, SVG_SIZE), Bitmap::class.java)
177-
.sourceEncoder(StreamEncoder())
178-
.cacheDecoder(FileToStreamDecoder(SvgOrImageDecoder()))
179-
.decoder(SvgOrImageDecoder())
180-
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
181-
.load(iconUrl.toUri())
182-
.into(iconTarget)
183169
}
184170
}

0 commit comments

Comments
 (0)