From 31de9aa29a155baddc457754635eca8051cb0b75 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 30 Sep 2026 11:15:49 +0200 Subject: [PATCH 1/5] dont use singleton instance for thumbnails Signed-off-by: alperozturk96 --- app/src/main/java/com/nextcloud/client/di/AppModule.java | 3 +-- .../java/com/nextcloud/utils/thumbnail/ThumbnailGenerator.kt | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/di/AppModule.java b/app/src/main/java/com/nextcloud/client/di/AppModule.java index 6df3a013d9e4..b4686f2c8fd5 100644 --- a/app/src/main/java/com/nextcloud/client/di/AppModule.java +++ b/app/src/main/java/com/nextcloud/client/di/AppModule.java @@ -236,7 +236,7 @@ AppNotificationManager notificationsManager(Context context, return new AppNotificationManagerImpl(context, context.getResources(), platformNotificationsManager, - viewThemeUtilsProvider.get()); + viewThemeUtilsProvider); } @Provides @@ -274,7 +274,6 @@ CertificateValidator certificateValidator() { } @Provides - @Singleton FolderThumbnailGenerator folderThumbnailGenerator( AppPreferences appPreferences, ViewThemeUtils viewThemeUtils, diff --git a/app/src/main/java/com/nextcloud/utils/thumbnail/ThumbnailGenerator.kt b/app/src/main/java/com/nextcloud/utils/thumbnail/ThumbnailGenerator.kt index b24d1aabaf2a..558650a08d60 100644 --- a/app/src/main/java/com/nextcloud/utils/thumbnail/ThumbnailGenerator.kt +++ b/app/src/main/java/com/nextcloud/utils/thumbnail/ThumbnailGenerator.kt @@ -10,9 +10,7 @@ package com.nextcloud.utils.thumbnail import android.widget.ImageView import com.owncloud.android.datamodel.OCFile import javax.inject.Inject -import javax.inject.Singleton -@Singleton class ThumbnailGenerator @Inject constructor( val fileThumbnailGenerator: FileThumbnailGenerator, val folderThumbnailGenerator: FolderThumbnailGenerator From 37ce1b588fc57a72736dd42973f5998c338139c9 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 30 Sep 2026 11:17:34 +0200 Subject: [PATCH 2/5] make the theme cache (memory-only) user account name aware instead url Signed-off-by: alperozturk96 --- .../android/utils/theme/MaterialSchemesProviderImpl.kt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/utils/theme/MaterialSchemesProviderImpl.kt b/app/src/main/java/com/owncloud/android/utils/theme/MaterialSchemesProviderImpl.kt index 91c7774a103b..60fac26c7916 100644 --- a/app/src/main/java/com/owncloud/android/utils/theme/MaterialSchemesProviderImpl.kt +++ b/app/src/main/java/com/owncloud/android/utils/theme/MaterialSchemesProviderImpl.kt @@ -29,14 +29,14 @@ internal class MaterialSchemesProviderImpl @Inject constructor( private val themeCache: MutableMap = ConcurrentHashMap() override fun getMaterialSchemesForUser(user: User): MaterialSchemes { - val url: String = user.server.uri.toString() + val accountName = user.accountName - if (!themeCache.containsKey(url)) { + if (!themeCache.containsKey(accountName)) { val capability = CapabilityUtils.getCapability(user, context) - themeCache[url] = getMaterialSchemesForCapability(capability) + themeCache[accountName] = getMaterialSchemesForCapability(capability) } - return themeCache[url]!! + return themeCache[accountName]!! } override fun getMaterialSchemesForCapability(capability: OCCapability): MaterialSchemes { From 2ee31cb41c4739e05af55d0ad12894a2d29c93b4 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 30 Sep 2026 11:18:24 +0200 Subject: [PATCH 3/5] set account name as well Signed-off-by: alperozturk96 --- .../owncloud/android/operations/GetCapabilitiesOperation.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/owncloud/android/operations/GetCapabilitiesOperation.java b/app/src/main/java/com/owncloud/android/operations/GetCapabilitiesOperation.java index 067727c519a8..7f0a08a2bde5 100644 --- a/app/src/main/java/com/owncloud/android/operations/GetCapabilitiesOperation.java +++ b/app/src/main/java/com/owncloud/android/operations/GetCapabilitiesOperation.java @@ -41,6 +41,7 @@ protected RemoteOperationResult run(OwnCloudClient client) { if (result.isSuccess() && result.getResultData() != null) { // Read data from the result OCCapability capability = result.getResultData(); + capability.setAccountName(storageManager.getUser().getAccountName()); // Save the capabilities into database storageManager.saveCapabilities(capability); From fe01e39ebe29408f890baf4c527e22f50f5abaaa Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Wed, 30 Sep 2026 11:19:27 +0200 Subject: [PATCH 4/5] use Provider for view theme utils since ViewThemeUtils can change and Provider can gives us retrieving multiple instances. Signed-off-by: alperozturk96 --- .../android/ui/adapter/UnifiedSearchListAdapterIT.kt | 2 +- .../client/notifications/AppNotificationManagerImpl.kt | 5 +++-- .../nextcloud/utils/thumbnail/FileThumbnailGenerator.kt | 7 ++++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/androidTest/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapterIT.kt b/app/src/androidTest/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapterIT.kt index 236d841f76ad..10e19ac4e5e7 100644 --- a/app/src/androidTest/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapterIT.kt +++ b/app/src/androidTest/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapterIT.kt @@ -142,7 +142,7 @@ class UnifiedSearchListAdapterIT : AbstractIT() { fileThumbnailGenerator = FileThumbnailGenerator( storageManager = Provider { sut.storageManager }, preferences = preferences, - viewThemeUtils = sut.viewThemeUtils, + viewThemeUtils = Provider { sut.viewThemeUtils }, context = targetContext, accountManager = accountManager ), diff --git a/app/src/main/java/com/nextcloud/client/notifications/AppNotificationManagerImpl.kt b/app/src/main/java/com/nextcloud/client/notifications/AppNotificationManagerImpl.kt index 2aed1d21e740..5d7d64729974 100644 --- a/app/src/main/java/com/nextcloud/client/notifications/AppNotificationManagerImpl.kt +++ b/app/src/main/java/com/nextcloud/client/notifications/AppNotificationManagerImpl.kt @@ -23,12 +23,13 @@ import com.owncloud.android.ui.preview.PreviewImageActivity import com.owncloud.android.ui.preview.PreviewImageFragment import com.owncloud.android.utils.theme.ViewThemeUtils import javax.inject.Inject +import javax.inject.Provider class AppNotificationManagerImpl @Inject constructor( private val context: Context, private val resources: Resources, private val platformNotificationsManager: NotificationManager, - private val viewThemeUtils: ViewThemeUtils + private val viewThemeUtils: Provider ) : AppNotificationManager { companion object { @@ -39,7 +40,7 @@ class AppNotificationManagerImpl @Inject constructor( private fun builder(channelId: String): NotificationCompat.Builder { val builder = NotificationCompat.Builder(context, channelId) - viewThemeUtils.androidx.themeNotificationCompatBuilder(context, builder) + viewThemeUtils.get().androidx.themeNotificationCompatBuilder(context, builder) return builder } diff --git a/app/src/main/java/com/nextcloud/utils/thumbnail/FileThumbnailGenerator.kt b/app/src/main/java/com/nextcloud/utils/thumbnail/FileThumbnailGenerator.kt index 91000ecbf005..49a32191b3c8 100644 --- a/app/src/main/java/com/nextcloud/utils/thumbnail/FileThumbnailGenerator.kt +++ b/app/src/main/java/com/nextcloud/utils/thumbnail/FileThumbnailGenerator.kt @@ -49,7 +49,7 @@ import kotlin.math.roundToInt class FileThumbnailGenerator @Inject constructor( private val storageManager: Provider, private val preferences: AppPreferences, - private val viewThemeUtils: ViewThemeUtils, + private val viewThemeUtils: Provider, private val context: Context, private val accountManager: UserAccountManager ) { @@ -222,10 +222,11 @@ class FileThumbnailGenerator @Inject constructor( } } - private fun OCFile.mimeIcon(): Drawable? = MimeTypeUtil.getFileTypeIcon(mimeType, fileName, context, viewThemeUtils) + private fun OCFile.mimeIcon(): Drawable? = + MimeTypeUtil.getFileTypeIcon(mimeType, fileName, context, viewThemeUtils.get()) private fun OCFile.placeholder(): Bitmap = synchronized(placeholders) { - placeholders.getOrPut(mimeType.orEmpty()) { + placeholders.getOrPut("${accountManager.user.accountName}:${mimeType.orEmpty()}") { val drawable = mimeIcon() ?: ResourcesCompat.getDrawable(context.resources, R.drawable.file_image, null) ?: Color.GRAY.toDrawable() From f9f16f7131b2b30b8f3bbcbac5e9b16f47fecdba Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 1 Oct 2026 14:28:26 +0200 Subject: [PATCH 5/5] OCCapability capability = result.getResultData(); already provides same Signed-off-by: alperozturk96 --- .../owncloud/android/operations/GetCapabilitiesOperation.java | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/main/java/com/owncloud/android/operations/GetCapabilitiesOperation.java b/app/src/main/java/com/owncloud/android/operations/GetCapabilitiesOperation.java index 7f0a08a2bde5..067727c519a8 100644 --- a/app/src/main/java/com/owncloud/android/operations/GetCapabilitiesOperation.java +++ b/app/src/main/java/com/owncloud/android/operations/GetCapabilitiesOperation.java @@ -41,7 +41,6 @@ protected RemoteOperationResult run(OwnCloudClient client) { if (result.isSuccess() && result.getResultData() != null) { // Read data from the result OCCapability capability = result.getResultData(); - capability.setAccountName(storageManager.getUser().getAccountName()); // Save the capabilities into database storageManager.saveCapabilities(capability);