Explorar o código

Move all Theme classes to DI

Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>

Move all Theme classes to DI

Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>

Move all Theme classes to DI

Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>
tobiasKaminsky %!s(int64=3) %!d(string=hai) anos
pai
achega
349a045b46
Modificáronse 100 ficheiros con 1584 adicións e 608 borrados
  1. 3 1
      app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java
  2. 2 1
      app/src/main/java/com/nextcloud/client/di/AppComponent.java
  3. 14 8
      app/src/main/java/com/nextcloud/client/di/AppModule.java
  4. 259 60
      app/src/main/java/com/nextcloud/client/di/ComponentsModule.java
  5. 132 0
      app/src/main/java/com/nextcloud/client/di/ThemeModule.java
  6. 13 3
      app/src/main/java/com/nextcloud/client/jobs/BackgroundJobFactory.kt
  7. 25 5
      app/src/main/java/com/nextcloud/client/jobs/MediaFoldersDetectionWork.kt
  8. 4 3
      app/src/main/java/com/nextcloud/client/jobs/NotificationWork.kt
  9. 6 5
      app/src/main/java/com/nextcloud/client/logger/ui/LogsActivity.kt
  10. 4 1
      app/src/main/java/com/nextcloud/client/media/PlayerService.kt
  11. 3 2
      app/src/main/java/com/nextcloud/client/notifications/AppNotificationManagerImpl.kt
  12. 2 1
      app/src/main/java/com/nextcloud/client/onboarding/WhatsNewActivity.java
  13. 11 4
      app/src/main/java/com/nextcloud/ui/ChooseAccountDialogFragment.kt
  14. 17 9
      app/src/main/java/com/nextcloud/ui/SetStatusDialogFragment.kt
  15. 35 6
      app/src/main/java/com/owncloud/android/MainApp.java
  16. 5 2
      app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java
  17. 8 2
      app/src/main/java/com/owncloud/android/authentication/DeepLinkLoginActivity.java
  18. 23 7
      app/src/main/java/com/owncloud/android/datamodel/MediaProvider.java
  19. 35 20
      app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java
  20. 14 5
      app/src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java
  21. 16 15
      app/src/main/java/com/owncloud/android/files/services/FileDownloader.java
  22. 4 3
      app/src/main/java/com/owncloud/android/files/services/FileUploader.java
  23. 15 7
      app/src/main/java/com/owncloud/android/media/MediaControlView.java
  24. 23 9
      app/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java
  25. 3 1
      app/src/main/java/com/owncloud/android/syncadapter/FileSyncService.java
  26. 17 6
      app/src/main/java/com/owncloud/android/ui/AvatarGroupLayout.java
  27. 13 9
      app/src/main/java/com/owncloud/android/ui/ThemeableSwitchPreference.java
  28. 4 3
      app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java
  29. 4 6
      app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.java
  30. 22 16
      app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java
  31. 7 4
      app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java
  32. 1 2
      app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java
  33. 16 9
      app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java
  34. 3 2
      app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java
  35. 7 11
      app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java
  36. 13 5
      app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java
  37. 3 4
      app/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java
  38. 14 13
      app/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java
  39. 18 15
      app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java
  40. 19 13
      app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java
  41. 7 4
      app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.java
  42. 0 0
      app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.java
  43. 22 9
      app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt
  44. 5 1
      app/src/main/java/com/owncloud/android/ui/activity/TextEditorWebView.kt
  45. 21 9
      app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java
  46. 10 9
      app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java
  47. 5 3
      app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java
  48. 4 6
      app/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java
  49. 13 3
      app/src/main/java/com/owncloud/android/ui/adapter/ActivityAndVersionListAdapter.java
  50. 17 3
      app/src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java
  51. 9 3
      app/src/main/java/com/owncloud/android/ui/adapter/GalleryAdapter.kt
  52. 10 2
      app/src/main/java/com/owncloud/android/ui/adapter/LinkShareViewHolder.java
  53. 27 8
      app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java
  54. 18 11
      app/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java
  55. 19 5
      app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java
  56. 8 4
      app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt
  57. 5 4
      app/src/main/java/com/owncloud/android/ui/adapter/RichDocumentsTemplateAdapter.java
  58. 11 5
      app/src/main/java/com/owncloud/android/ui/adapter/ShareViewHolder.java
  59. 20 8
      app/src/main/java/com/owncloud/android/ui/adapter/ShareeListAdapter.java
  60. 17 4
      app/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.java
  61. 16 7
      app/src/main/java/com/owncloud/android/ui/adapter/TemplateAdapter.java
  62. 19 6
      app/src/main/java/com/owncloud/android/ui/adapter/TrashbinListAdapter.java
  63. 6 2
      app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchHeaderViewHolder.kt
  64. 6 3
      app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt
  65. 16 11
      app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapter.kt
  66. 18 5
      app/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java
  67. 25 12
      app/src/main/java/com/owncloud/android/ui/adapter/UploaderAdapter.java
  68. 19 10
      app/src/main/java/com/owncloud/android/ui/adapter/UserListAdapter.java
  69. 10 2
      app/src/main/java/com/owncloud/android/ui/asynctasks/RetrieveHoverCardAsyncTask.java
  70. 5 1
      app/src/main/java/com/owncloud/android/ui/dialog/AccountRemovalConfirmationDialog.java
  71. 15 6
      app/src/main/java/com/owncloud/android/ui/dialog/ChooseRichDocumentsTemplateDialogFragment.java
  72. 20 7
      app/src/main/java/com/owncloud/android/ui/dialog/ChooseTemplateDialogFragment.java
  73. 10 2
      app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java
  74. 25 8
      app/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.java
  75. 17 9
      app/src/main/java/com/owncloud/android/ui/dialog/CreateFolderDialogFragment.java
  76. 10 6
      app/src/main/java/com/owncloud/android/ui/dialog/ExpirationDatePickerDialogFragment.java
  77. 6 2
      app/src/main/java/com/owncloud/android/ui/dialog/IndeterminateProgressDialog.java
  78. 6 2
      app/src/main/java/com/owncloud/android/ui/dialog/LoadingDialog.java
  79. 10 2
      app/src/main/java/com/owncloud/android/ui/dialog/LocalStoragePathPickerDialogFragment.java
  80. 7 1
      app/src/main/java/com/owncloud/android/ui/dialog/MultipleAccountsDialog.java
  81. 11 5
      app/src/main/java/com/owncloud/android/ui/dialog/NoteDialogFragment.java
  82. 11 6
      app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.java
  83. 15 9
      app/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java
  84. 9 4
      app/src/main/java/com/owncloud/android/ui/dialog/RenamePublicShareDialogFragment.java
  85. 13 7
      app/src/main/java/com/owncloud/android/ui/dialog/SendShareDialog.java
  86. 12 5
      app/src/main/java/com/owncloud/android/ui/dialog/SetupEncryptionDialogFragment.java
  87. 14 6
      app/src/main/java/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java
  88. 10 4
      app/src/main/java/com/owncloud/android/ui/dialog/SortingOrderDialogFragment.java
  89. 13 4
      app/src/main/java/com/owncloud/android/ui/dialog/StoragePermissionDialogFragment.kt
  90. 2 2
      app/src/main/java/com/owncloud/android/ui/dialog/SyncFileNotEnoughSpaceDialogFragment.java
  91. 15 8
      app/src/main/java/com/owncloud/android/ui/dialog/SyncedFolderPreferencesDialogFragment.java
  92. 9 5
      app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java
  93. 8 3
      app/src/main/java/com/owncloud/android/ui/fragment/FeatureFragment.java
  94. 15 6
      app/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java
  95. 5 2
      app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java
  96. 21 6
      app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java
  97. 3 1
      app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.java
  98. 6 1
      app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java
  99. 21 11
      app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.java
  100. 20 10
      app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

+ 3 - 1
app/src/androidTest/java/com/owncloud/android/ui/dialog/DialogFragmentIT.java

@@ -436,7 +436,9 @@ public class DialogFragmentIT extends AbstractIT {
 
         ProfileBottomSheetDialog sut = new ProfileBottomSheetDialog(fda,
                                                                     user,
-                                                                    hoverCard);
+                                                                    hoverCard,
+                                                                    fda.themeColorUtils,
+                                                                    fda.themeDrawableUtils);
 
         fda.runOnUiThread(sut::show);
 

+ 2 - 1
app/src/main/java/com/nextcloud/client/di/AppComponent.java

@@ -47,7 +47,8 @@ import dagger.android.support.AndroidSupportInjectionModule;
     OnboardingModule.class,
     ViewModelModule.class,
     JobsModule.class,
-    IntegrationsModule.class
+    IntegrationsModule.class,
+    ThemeModule.class
 })
 @Singleton
 public interface AppComponent {

+ 14 - 8
app/src/main/java/com/nextcloud/client/di/AppModule.java

@@ -64,6 +64,7 @@ import com.owncloud.android.ui.activities.data.activities.RemoteActivitiesReposi
 import com.owncloud.android.ui.activities.data.files.FilesRepository;
 import com.owncloud.android.ui.activities.data.files.FilesServiceApiImpl;
 import com.owncloud.android.ui.activities.data.files.RemoteFilesRepository;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
 
 import org.greenrobot.eventbus.EventBus;
 
@@ -81,7 +82,7 @@ class AppModule {
 
     @Provides
     AccountManager accountManager(Application application) {
-        return (AccountManager)application.getSystemService(Context.ACCOUNT_SERVICE);
+        return (AccountManager) application.getSystemService(Context.ACCOUNT_SERVICE);
     }
 
     @Provides
@@ -108,7 +109,7 @@ class AppModule {
     UserAccountManager userAccountManager(
         Context context,
         AccountManager accountManager
-    ) {
+                                         ) {
         return new UserAccountManagerImpl(context, accountManager);
     }
 
@@ -165,7 +166,7 @@ class AppModule {
     @Singleton
     Logger logger(Context context, Clock clock) {
         File logDir = new File(context.getFilesDir(), "logs");
-        FileLogHandler handler = new FileLogHandler(logDir, "log.txt", 1024*1024);
+        FileLogHandler handler = new FileLogHandler(logDir, "log.txt", 1024 * 1024);
         LoggerImpl logger = new LoggerImpl(clock, handler, new Handler(), 1000);
         logger.start();
         return logger;
@@ -174,7 +175,7 @@ class AppModule {
     @Provides
     @Singleton
     LogsRepository logsRepository(Logger logger) {
-        return (LogsRepository)logger;
+        return (LogsRepository) logger;
     }
 
     @Provides
@@ -194,12 +195,12 @@ class AppModule {
 
     @Provides
     NotificationManager notificationManager(Context context) {
-        return (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
+        return (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
     }
 
     @Provides
     AudioManager audioManager(Context context) {
-        return (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
+        return (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
     }
 
     @Provides
@@ -226,8 +227,13 @@ class AppModule {
 
     @Provides
     @Singleton
-    AppNotificationManager notificationsManager(Context context, NotificationManager platformNotificationsManager) {
-        return new AppNotificationManagerImpl(context, context.getResources(), platformNotificationsManager);
+    AppNotificationManager notificationsManager(Context context,
+                                                NotificationManager platformNotificationsManager,
+                                                ThemeColorUtils themeColorUtils) {
+        return new AppNotificationManagerImpl(context,
+                                              context.getResources(),
+                                              platformNotificationsManager,
+                                              themeColorUtils);
     }
 
     @Provides

+ 259 - 60
app/src/main/java/com/nextcloud/client/di/ComponentsModule.java

@@ -24,11 +24,14 @@ import com.nextcloud.client.etm.EtmActivity;
 import com.nextcloud.client.files.downloader.FileTransferService;
 import com.nextcloud.client.jobs.NotificationWork;
 import com.nextcloud.client.logger.ui.LogsActivity;
+import com.nextcloud.client.logger.ui.LogsViewModel;
 import com.nextcloud.client.media.PlayerService;
+import com.nextcloud.client.migrations.Migrations;
 import com.nextcloud.client.onboarding.FirstRunActivity;
 import com.nextcloud.client.onboarding.WhatsNewActivity;
 import com.nextcloud.ui.ChooseAccountDialogFragment;
 import com.nextcloud.ui.SetStatusDialogFragment;
+import com.owncloud.android.MainApp;
 import com.owncloud.android.authentication.AuthenticatorActivity;
 import com.owncloud.android.authentication.DeepLinkLoginActivity;
 import com.owncloud.android.files.BootupBroadcastReceiver;
@@ -50,6 +53,7 @@ import com.owncloud.android.ui.activity.CopyToClipboardActivity;
 import com.owncloud.android.ui.activity.DrawerActivity;
 import com.owncloud.android.ui.activity.ErrorsWhileCopyingHandlerActivity;
 import com.owncloud.android.ui.activity.ExternalSiteWebView;
+import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.ui.activity.FilePickerActivity;
 import com.owncloud.android.ui.activity.FolderPickerActivity;
@@ -65,86 +69,184 @@ import com.owncloud.android.ui.activity.ShareActivity;
 import com.owncloud.android.ui.activity.SsoGrantPermissionActivity;
 import com.owncloud.android.ui.activity.SyncedFoldersActivity;
 import com.owncloud.android.ui.activity.TextEditorWebView;
+import com.owncloud.android.ui.activity.ToolbarActivity;
 import com.owncloud.android.ui.activity.UploadFilesActivity;
 import com.owncloud.android.ui.activity.UploadListActivity;
 import com.owncloud.android.ui.activity.UserInfoActivity;
 import com.owncloud.android.ui.dialog.AccountRemovalConfirmationDialog;
 import com.owncloud.android.ui.dialog.ChooseRichDocumentsTemplateDialogFragment;
 import com.owncloud.android.ui.dialog.ChooseTemplateDialogFragment;
+import com.owncloud.android.ui.dialog.ConfirmationDialogFragment;
+import com.owncloud.android.ui.dialog.ConflictsResolveDialog;
+import com.owncloud.android.ui.dialog.CreateFolderDialogFragment;
+import com.owncloud.android.ui.dialog.ExpirationDatePickerDialogFragment;
+import com.owncloud.android.ui.dialog.IndeterminateProgressDialog;
+import com.owncloud.android.ui.dialog.LoadingDialog;
+import com.owncloud.android.ui.dialog.LocalStoragePathPickerDialogFragment;
 import com.owncloud.android.ui.dialog.MultipleAccountsDialog;
+import com.owncloud.android.ui.dialog.NoteDialogFragment;
+import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment;
+import com.owncloud.android.ui.dialog.RenamePublicShareDialogFragment;
+import com.owncloud.android.ui.dialog.SendShareDialog;
+import com.owncloud.android.ui.dialog.SetupEncryptionDialogFragment;
+import com.owncloud.android.ui.dialog.SharePasswordDialogFragment;
+import com.owncloud.android.ui.dialog.SortingOrderDialogFragment;
+import com.owncloud.android.ui.dialog.StoragePermissionDialogFragment;
+import com.owncloud.android.ui.dialog.SyncedFolderPreferencesDialogFragment;
 import com.owncloud.android.ui.fragment.ExtendedListFragment;
+import com.owncloud.android.ui.fragment.FeatureFragment;
 import com.owncloud.android.ui.fragment.FileDetailActivitiesFragment;
 import com.owncloud.android.ui.fragment.FileDetailFragment;
 import com.owncloud.android.ui.fragment.FileDetailSharingFragment;
 import com.owncloud.android.ui.fragment.GalleryFragment;
 import com.owncloud.android.ui.fragment.LocalFileListFragment;
+import com.owncloud.android.ui.fragment.OCFileListBottomSheetDialog;
 import com.owncloud.android.ui.fragment.OCFileListFragment;
 import com.owncloud.android.ui.fragment.SharedListFragment;
 import com.owncloud.android.ui.fragment.UnifiedSearchFragment;
 import com.owncloud.android.ui.fragment.contactsbackup.BackupFragment;
 import com.owncloud.android.ui.fragment.contactsbackup.BackupListFragment;
+import com.owncloud.android.ui.preview.FileDownloadFragment;
 import com.owncloud.android.ui.preview.PreviewImageActivity;
 import com.owncloud.android.ui.preview.PreviewImageFragment;
 import com.owncloud.android.ui.preview.PreviewMediaFragment;
-import com.owncloud.android.ui.preview.pdf.PreviewPdfFragment;
 import com.owncloud.android.ui.preview.PreviewTextFileFragment;
 import com.owncloud.android.ui.preview.PreviewTextFragment;
 import com.owncloud.android.ui.preview.PreviewTextStringFragment;
 import com.owncloud.android.ui.preview.PreviewVideoActivity;
+import com.owncloud.android.ui.preview.pdf.PreviewPdfFragment;
 import com.owncloud.android.ui.trashbin.TrashbinActivity;
 
 import dagger.Module;
 import dagger.android.ContributesAndroidInjector;
 
 /**
- * Register classes that require dependency injection. This class is used by Dagger compiler
- * only.
+ * Register classes that require dependency injection. This class is used by Dagger compiler only.
  */
 @Module
 abstract class ComponentsModule {
-    @ContributesAndroidInjector abstract ActivitiesActivity activitiesActivity();
-    @ContributesAndroidInjector abstract AuthenticatorActivity authenticatorActivity();
-    @ContributesAndroidInjector abstract BaseActivity baseActivity();
-    @ContributesAndroidInjector abstract ConflictsResolveActivity conflictsResolveActivity();
-    @ContributesAndroidInjector abstract ContactsPreferenceActivity contactsPreferenceActivity();
-    @ContributesAndroidInjector abstract CopyToClipboardActivity copyToClipboardActivity();
-    @ContributesAndroidInjector abstract DeepLinkLoginActivity deepLinkLoginActivity();
-    @ContributesAndroidInjector abstract DrawerActivity drawerActivity();
-    @ContributesAndroidInjector abstract ErrorsWhileCopyingHandlerActivity errorsWhileCopyingHandlerActivity();
-    @ContributesAndroidInjector abstract ExternalSiteWebView externalSiteWebView();
-    @ContributesAndroidInjector abstract FileDisplayActivity fileDisplayActivity();
-    @ContributesAndroidInjector abstract FilePickerActivity filePickerActivity();
-    @ContributesAndroidInjector abstract FirstRunActivity firstRunActivity();
-    @ContributesAndroidInjector abstract FolderPickerActivity folderPickerActivity();
-    @ContributesAndroidInjector abstract LogsActivity logsActivity();
-    @ContributesAndroidInjector abstract ManageAccountsActivity manageAccountsActivity();
-    @ContributesAndroidInjector abstract ManageSpaceActivity manageSpaceActivity();
-    @ContributesAndroidInjector abstract NotificationsActivity notificationsActivity();
-    @ContributesAndroidInjector abstract CommunityActivity participateActivity();
-    @ContributesAndroidInjector abstract PassCodeActivity passCodeActivity();
-    @ContributesAndroidInjector abstract PreviewImageActivity previewImageActivity();
-    @ContributesAndroidInjector abstract PreviewVideoActivity previewVideoActivity();
-    @ContributesAndroidInjector abstract ReceiveExternalFilesActivity receiveExternalFilesActivity();
-    @ContributesAndroidInjector abstract RequestCredentialsActivity requestCredentialsActivity();
-    @ContributesAndroidInjector abstract SettingsActivity settingsActivity();
-    @ContributesAndroidInjector abstract ShareActivity shareActivity();
-    @ContributesAndroidInjector abstract SsoGrantPermissionActivity ssoGrantPermissionActivity();
-    @ContributesAndroidInjector abstract SyncedFoldersActivity syncedFoldersActivity();
-    @ContributesAndroidInjector abstract TrashbinActivity trashbinActivity();
-    @ContributesAndroidInjector abstract UploadFilesActivity uploadFilesActivity();
-    @ContributesAndroidInjector abstract UploadListActivity uploadListActivity();
-    @ContributesAndroidInjector abstract UserInfoActivity userInfoActivity();
-    @ContributesAndroidInjector abstract WhatsNewActivity whatsNewActivity();
-    @ContributesAndroidInjector abstract EtmActivity etmActivity();
-
-    @ContributesAndroidInjector abstract RichDocumentsEditorWebView richDocumentsWebView();
-    @ContributesAndroidInjector abstract TextEditorWebView textEditorWebView();
-
-    @ContributesAndroidInjector abstract ExtendedListFragment extendedListFragment();
-    @ContributesAndroidInjector abstract FileDetailFragment fileDetailFragment();
-    @ContributesAndroidInjector abstract LocalFileListFragment localFileListFragment();
-    @ContributesAndroidInjector abstract OCFileListFragment ocFileListFragment();
-    @ContributesAndroidInjector abstract FileDetailActivitiesFragment fileDetailActivitiesFragment();
+    @ContributesAndroidInjector
+    abstract ActivitiesActivity activitiesActivity();
+
+    @ContributesAndroidInjector
+    abstract AuthenticatorActivity authenticatorActivity();
+
+    @ContributesAndroidInjector
+    abstract BaseActivity baseActivity();
+
+    @ContributesAndroidInjector
+    abstract ConflictsResolveActivity conflictsResolveActivity();
+
+    @ContributesAndroidInjector
+    abstract ContactsPreferenceActivity contactsPreferenceActivity();
+
+    @ContributesAndroidInjector
+    abstract CopyToClipboardActivity copyToClipboardActivity();
+
+    @ContributesAndroidInjector
+    abstract DeepLinkLoginActivity deepLinkLoginActivity();
+
+    @ContributesAndroidInjector
+    abstract DrawerActivity drawerActivity();
+
+    @ContributesAndroidInjector
+    abstract ErrorsWhileCopyingHandlerActivity errorsWhileCopyingHandlerActivity();
+
+    @ContributesAndroidInjector
+    abstract ExternalSiteWebView externalSiteWebView();
+
+    @ContributesAndroidInjector
+    abstract FileDisplayActivity fileDisplayActivity();
+
+    @ContributesAndroidInjector
+    abstract FilePickerActivity filePickerActivity();
+
+    @ContributesAndroidInjector
+    abstract FirstRunActivity firstRunActivity();
+
+    @ContributesAndroidInjector
+    abstract FolderPickerActivity folderPickerActivity();
+
+    @ContributesAndroidInjector
+    abstract LogsActivity logsActivity();
+
+    @ContributesAndroidInjector
+    abstract ManageAccountsActivity manageAccountsActivity();
+
+    @ContributesAndroidInjector
+    abstract ManageSpaceActivity manageSpaceActivity();
+
+    @ContributesAndroidInjector
+    abstract NotificationsActivity notificationsActivity();
+
+    @ContributesAndroidInjector
+    abstract CommunityActivity participateActivity();
+
+    @ContributesAndroidInjector
+    abstract PassCodeActivity passCodeActivity();
+
+    @ContributesAndroidInjector
+    abstract PreviewImageActivity previewImageActivity();
+
+    @ContributesAndroidInjector
+    abstract PreviewVideoActivity previewVideoActivity();
+
+    @ContributesAndroidInjector
+    abstract ReceiveExternalFilesActivity receiveExternalFilesActivity();
+
+    @ContributesAndroidInjector
+    abstract RequestCredentialsActivity requestCredentialsActivity();
+
+    @ContributesAndroidInjector
+    abstract SettingsActivity settingsActivity();
+
+    @ContributesAndroidInjector
+    abstract ShareActivity shareActivity();
+
+    @ContributesAndroidInjector
+    abstract SsoGrantPermissionActivity ssoGrantPermissionActivity();
+
+    @ContributesAndroidInjector
+    abstract SyncedFoldersActivity syncedFoldersActivity();
+
+    @ContributesAndroidInjector
+    abstract TrashbinActivity trashbinActivity();
+
+    @ContributesAndroidInjector
+    abstract UploadFilesActivity uploadFilesActivity();
+
+    @ContributesAndroidInjector
+    abstract UploadListActivity uploadListActivity();
+
+    @ContributesAndroidInjector
+    abstract UserInfoActivity userInfoActivity();
+
+    @ContributesAndroidInjector
+    abstract WhatsNewActivity whatsNewActivity();
+
+    @ContributesAndroidInjector
+    abstract EtmActivity etmActivity();
+
+    @ContributesAndroidInjector
+    abstract RichDocumentsEditorWebView richDocumentsWebView();
+
+    @ContributesAndroidInjector
+    abstract TextEditorWebView textEditorWebView();
+
+    @ContributesAndroidInjector
+    abstract ExtendedListFragment extendedListFragment();
+
+    @ContributesAndroidInjector
+    abstract FileDetailFragment fileDetailFragment();
+
+    @ContributesAndroidInjector
+    abstract LocalFileListFragment localFileListFragment();
+
+    @ContributesAndroidInjector
+    abstract OCFileListFragment ocFileListFragment();
+
+    @ContributesAndroidInjector
+    abstract FileDetailActivitiesFragment fileDetailActivitiesFragment();
 
     @ContributesAndroidInjector
     abstract FileDetailSharingFragment fileDetailSharingFragment();
@@ -179,8 +281,11 @@ abstract class ComponentsModule {
     @ContributesAndroidInjector
     abstract SetStatusDialogFragment setStatusDialogFragment();
 
-    @ContributesAndroidInjector abstract PreviewTextFileFragment previewTextFileFragment();
-    @ContributesAndroidInjector abstract PreviewTextStringFragment previewTextStringFragment();
+    @ContributesAndroidInjector
+    abstract PreviewTextFileFragment previewTextFileFragment();
+
+    @ContributesAndroidInjector
+    abstract PreviewTextStringFragment previewTextStringFragment();
 
     @ContributesAndroidInjector
     abstract UnifiedSearchFragment searchFragment();
@@ -200,23 +305,117 @@ abstract class ComponentsModule {
     @ContributesAndroidInjector
     abstract FileDownloader fileDownloader();
 
-    @ContributesAndroidInjector abstract BootupBroadcastReceiver bootupBroadcastReceiver();
-    @ContributesAndroidInjector abstract NotificationWork.NotificationReceiver notificationWorkBroadcastReceiver();
+    @ContributesAndroidInjector
+    abstract BootupBroadcastReceiver bootupBroadcastReceiver();
+
+    @ContributesAndroidInjector
+    abstract NotificationWork.NotificationReceiver notificationWorkBroadcastReceiver();
+
+    @ContributesAndroidInjector
+    abstract FileContentProvider fileContentProvider();
+
+    @ContributesAndroidInjector
+    abstract UsersAndGroupsSearchProvider usersAndGroupsSearchProvider();
 
-    @ContributesAndroidInjector abstract FileContentProvider fileContentProvider();
-    @ContributesAndroidInjector abstract UsersAndGroupsSearchProvider usersAndGroupsSearchProvider();
-    @ContributesAndroidInjector abstract DiskLruImageCacheFileProvider diskLruImageCacheFileProvider();
-    @ContributesAndroidInjector abstract DocumentsStorageProvider documentsStorageProvider();
-    
-    @ContributesAndroidInjector abstract AccountManagerService accountManagerService();
-    @ContributesAndroidInjector abstract OperationsService operationsService();
-    @ContributesAndroidInjector abstract PlayerService playerService();
-    @ContributesAndroidInjector abstract FileTransferService fileDownloaderService();
-    @ContributesAndroidInjector abstract FileSyncService fileSyncService();
+    @ContributesAndroidInjector
+    abstract DiskLruImageCacheFileProvider diskLruImageCacheFileProvider();
+
+    @ContributesAndroidInjector
+    abstract DocumentsStorageProvider documentsStorageProvider();
+
+    @ContributesAndroidInjector
+    abstract AccountManagerService accountManagerService();
+
+    @ContributesAndroidInjector
+    abstract OperationsService operationsService();
+
+    @ContributesAndroidInjector
+    abstract PlayerService playerService();
+
+    @ContributesAndroidInjector
+    abstract FileTransferService fileDownloaderService();
+
+    @ContributesAndroidInjector
+    abstract FileSyncService fileSyncService();
 
     @ContributesAndroidInjector
     abstract PreviewPdfFragment previewPDFFragment();
 
     @ContributesAndroidInjector
     abstract SharedListFragment sharedFragment();
+
+    @ContributesAndroidInjector
+    abstract FeatureFragment featureFragment();
+
+    @ContributesAndroidInjector
+    abstract IndeterminateProgressDialog indeterminateProgressDialog();
+
+    @ContributesAndroidInjector
+    abstract SortingOrderDialogFragment sortingOrderDialogFragment();
+
+    @ContributesAndroidInjector
+    abstract ConfirmationDialogFragment confirmationDialogFragment();
+
+    @ContributesAndroidInjector
+    abstract ConflictsResolveDialog conflictsResolveDialog();
+
+    @ContributesAndroidInjector
+    abstract CreateFolderDialogFragment createFolderDialogFragment();
+
+    @ContributesAndroidInjector
+    abstract ExpirationDatePickerDialogFragment expirationDatePickerDialogFragment();
+
+    @ContributesAndroidInjector
+    abstract FileActivity fileActivity();
+
+    @ContributesAndroidInjector
+    abstract FileDownloadFragment fileDownloadFragment();
+
+    @ContributesAndroidInjector
+    abstract LoadingDialog loadingDialog();
+
+    @ContributesAndroidInjector
+    abstract LocalStoragePathPickerDialogFragment localStoragePathPickerDialogFragment();
+
+    @ContributesAndroidInjector
+    abstract LogsViewModel logsViewModel();
+
+    @ContributesAndroidInjector
+    abstract MainApp mainApp();
+
+    @ContributesAndroidInjector
+    abstract Migrations migrations();
+
+    @ContributesAndroidInjector
+    abstract NoteDialogFragment noteDialogFragment();
+
+    @ContributesAndroidInjector
+    abstract NotificationWork notificationWork();
+
+    @ContributesAndroidInjector
+    abstract OCFileListBottomSheetDialog ocFileListBottomSheetDialog();
+
+    @ContributesAndroidInjector
+    abstract RemoveFilesDialogFragment removeFilesDialogFragment();
+
+    @ContributesAndroidInjector
+    abstract RenamePublicShareDialogFragment renamePublicShareDialogFragment();
+
+    @ContributesAndroidInjector
+    abstract SendShareDialog sendShareDialog();
+
+    @ContributesAndroidInjector
+    abstract SetupEncryptionDialogFragment setupEncryptionDialogFragment();
+
+    @ContributesAndroidInjector
+    abstract SharePasswordDialogFragment sharePasswordDialogFragment();
+
+    @ContributesAndroidInjector
+    abstract SyncedFolderPreferencesDialogFragment syncedFolderPreferencesDialogFragment();
+
+    @ContributesAndroidInjector
+    abstract ToolbarActivity toolbarActivity();
+
+    @ContributesAndroidInjector
+    abstract StoragePermissionDialogFragment storagePermissionDialogFragment();
 }

+ 132 - 0
app/src/main/java/com/nextcloud/client/di/ThemeModule.java

@@ -0,0 +1,132 @@
+/*
+ * Nextcloud Android client application
+ *
+ * @author Chris Narkiewicz
+ * Copyright (C) 2019 Chris Narkiewicz <hello@ezaquarii.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+package com.nextcloud.client.di;
+
+import android.content.Context;
+
+import com.owncloud.android.utils.theme.ThemeAvatarUtils;
+import com.owncloud.android.utils.theme.ThemeBarUtils;
+import com.owncloud.android.utils.theme.ThemeButtonUtils;
+import com.owncloud.android.utils.theme.ThemeCheckableUtils;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeDrawableUtils;
+import com.owncloud.android.utils.theme.ThemeFabUtils;
+import com.owncloud.android.utils.theme.ThemeLayoutUtils;
+import com.owncloud.android.utils.theme.ThemeMenuUtils;
+import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
+import com.owncloud.android.utils.theme.ThemeTextInputUtils;
+import com.owncloud.android.utils.theme.ThemeTextUtils;
+import com.owncloud.android.utils.theme.ThemeToolbarUtils;
+import com.owncloud.android.utils.theme.ThemeUtils;
+
+import javax.inject.Singleton;
+
+import dagger.Module;
+import dagger.Provides;
+
+@Module
+class ThemeModule {
+    @Provides
+    @Singleton
+    ThemeColorUtils themeColorUtils() {
+        return new ThemeColorUtils();
+    }
+
+    @Provides
+    @Singleton
+    ThemeFabUtils themeFabUtils(ThemeColorUtils themeColorUtils, ThemeDrawableUtils themeDrawableUtils) {
+        return new ThemeFabUtils(themeColorUtils, themeDrawableUtils);
+    }
+
+    @Provides
+    @Singleton
+    ThemeLayoutUtils themeLayoutUtils(ThemeColorUtils themeColorUtils) {
+        return new ThemeLayoutUtils(themeColorUtils);
+    }
+
+    @Provides
+    @Singleton
+    ThemeToolbarUtils themeToolbarUtils(ThemeColorUtils themeColorUtils,
+                                        ThemeDrawableUtils themeDrawableUtils,
+                                        ThemeTextInputUtils themeTextInputUtils) {
+        return new ThemeToolbarUtils(themeColorUtils, themeDrawableUtils, themeTextInputUtils);
+    }
+
+    @Provides
+    @Singleton
+    ThemeDrawableUtils themeDrawableUtils(Context context) {
+        return new ThemeDrawableUtils(context);
+    }
+
+    @Provides
+    @Singleton
+    ThemeUtils themeUtils() {
+        return new ThemeUtils();
+    }
+
+    @Provides
+    @Singleton
+    ThemeMenuUtils themeMenuUtils() {
+        return new ThemeMenuUtils();
+    }
+
+    @Provides
+    @Singleton
+    ThemeSnackbarUtils themeSnackbarUtils() {
+        return new ThemeSnackbarUtils();
+    }
+
+    @Provides
+    @Singleton
+    ThemeTextUtils themeTextUtils() {
+        return new ThemeTextUtils();
+    }
+
+    @Provides
+    @Singleton
+    ThemeButtonUtils themeButtonUtils() {
+        return new ThemeButtonUtils();
+    }
+
+    @Provides
+    @Singleton
+    ThemeBarUtils themeBarUtils() {
+        return new ThemeBarUtils();
+    }
+
+    @Provides
+    @Singleton
+    ThemeTextInputUtils themeTextInputUtils() {
+        return new ThemeTextInputUtils();
+    }
+
+    @Provides
+    @Singleton
+    ThemeCheckableUtils themeCheckableUtils() {
+        return new ThemeCheckableUtils();
+    }
+
+    @Provides
+    @Singleton
+    ThemeAvatarUtils themeAvatarUtils() {
+        return new ThemeAvatarUtils();
+    }
+}

+ 13 - 3
app/src/main/java/com/nextcloud/client/jobs/BackgroundJobFactory.kt

@@ -40,6 +40,9 @@ import com.nextcloud.client.preferences.AppPreferences
 import com.owncloud.android.datamodel.ArbitraryDataProvider
 import com.owncloud.android.datamodel.SyncedFolderProvider
 import com.owncloud.android.datamodel.UploadsStorageManager
+import com.owncloud.android.utils.theme.ThemeButtonUtils
+import com.owncloud.android.utils.theme.ThemeColorUtils
+import com.owncloud.android.utils.theme.ThemeSnackbarUtils
 import org.greenrobot.eventbus.EventBus
 import javax.inject.Inject
 import javax.inject.Provider
@@ -63,7 +66,10 @@ class BackgroundJobFactory @Inject constructor(
     private val connectivityService: ConnectivityService,
     private val notificationManager: NotificationManager,
     private val eventBus: EventBus,
-    private val deckApi: DeckApi
+    private val deckApi: DeckApi,
+    private val themeColorUtils: ThemeColorUtils,
+    private val themeSnackbarUtils: ThemeSnackbarUtils,
+    private val themeButtonUtils: ThemeButtonUtils
 ) : WorkerFactory() {
 
     @SuppressLint("NewApi")
@@ -192,7 +198,10 @@ class BackgroundJobFactory @Inject constructor(
             contentResolver,
             accountManager,
             preferences,
-            clock
+            clock,
+            themeColorUtils,
+            themeSnackbarUtils,
+            themeButtonUtils
         )
     }
 
@@ -202,7 +211,8 @@ class BackgroundJobFactory @Inject constructor(
             params,
             notificationManager,
             accountManager,
-            deckApi
+            deckApi,
+            themeColorUtils
         )
     }
 

+ 25 - 5
app/src/main/java/com/nextcloud/client/jobs/MediaFoldersDetectionWork.kt

@@ -55,8 +55,9 @@ import com.owncloud.android.ui.activity.ManageAccountsActivity.PENDING_FOR_REMOV
 import com.owncloud.android.ui.activity.SyncedFoldersActivity
 import com.owncloud.android.ui.notifications.NotificationUtils
 import com.owncloud.android.utils.SyncedFolderUtils
+import com.owncloud.android.utils.theme.ThemeButtonUtils
 import com.owncloud.android.utils.theme.ThemeColorUtils
-import java.util.ArrayList
+import com.owncloud.android.utils.theme.ThemeSnackbarUtils
 import java.util.Random
 
 @Suppress("LongParameterList") // dependencies injection
@@ -67,7 +68,10 @@ class MediaFoldersDetectionWork constructor(
     private val contentResolver: ContentResolver,
     private val userAccountManager: UserAccountManager,
     private val preferences: AppPreferences,
-    private val clock: Clock
+    private val clock: Clock,
+    private val themeColorUtils: ThemeColorUtils,
+    private val themeSnackbarUtils: ThemeSnackbarUtils,
+    private val themeButtonUtils: ThemeButtonUtils
 ) : Worker(context, params) {
 
     companion object {
@@ -88,8 +92,24 @@ class MediaFoldersDetectionWork constructor(
         val syncedFolderProvider = SyncedFolderProvider(contentResolver, preferences, clock)
         val gson = Gson()
         val mediaFoldersModel: MediaFoldersModel
-        val imageMediaFolders = MediaProvider.getImageFolders(contentResolver, 1, null, true)
-        val videoMediaFolders = MediaProvider.getVideoFolders(contentResolver, 1, null, true)
+        val imageMediaFolders = MediaProvider.getImageFolders(
+            contentResolver,
+            1,
+            null,
+            true,
+            themeColorUtils,
+            themeSnackbarUtils,
+            themeButtonUtils
+        )
+        val videoMediaFolders = MediaProvider.getVideoFolders(
+            contentResolver,
+            1,
+            null,
+            true,
+            themeColorUtils,
+            themeSnackbarUtils,
+            themeButtonUtils
+        )
         val imageMediaFolderPaths: MutableList<String> = ArrayList()
         val videoMediaFolderPaths: MutableList<String> = ArrayList()
         for (imageMediaFolder in imageMediaFolders) {
@@ -206,7 +226,7 @@ class MediaFoldersDetectionWork constructor(
         )
             .setSmallIcon(R.drawable.notification_icon)
             .setLargeIcon(BitmapFactory.decodeResource(context.resources, R.drawable.notification_icon))
-            .setColor(ThemeColorUtils.primaryColor(context))
+            .setColor(themeColorUtils.primaryColor(context))
             .setSubText(user.accountName)
             .setContentTitle(contentTitle)
             .setContentText(subtitle)

+ 4 - 3
app/src/main/java/com/nextcloud/client/jobs/NotificationWork.kt

@@ -75,7 +75,8 @@ class NotificationWork constructor(
     params: WorkerParameters,
     private val notificationManager: NotificationManager,
     private val accountManager: UserAccountManager,
-    private val deckApi: DeckApi
+    private val deckApi: DeckApi,
+    private val themeColorUtils: ThemeColorUtils
 ) : Worker(context, params) {
 
     companion object {
@@ -167,7 +168,7 @@ class NotificationWork constructor(
         val notificationBuilder = NotificationCompat.Builder(context, NotificationUtils.NOTIFICATION_CHANNEL_PUSH)
             .setSmallIcon(R.drawable.notification_icon)
             .setLargeIcon(BitmapFactory.decodeResource(context.resources, R.drawable.notification_icon))
-            .setColor(ThemeColorUtils.primaryColor(user.toPlatformAccount(), false, context))
+            .setColor(themeColorUtils.primaryColor(user.toPlatformAccount(), false, context))
             .setShowWhen(true)
             .setSubText(user.accountName)
             .setContentTitle(notification.getSubject())
@@ -222,7 +223,7 @@ class NotificationWork constructor(
             NotificationCompat.Builder(context, NotificationUtils.NOTIFICATION_CHANNEL_PUSH)
                 .setSmallIcon(R.drawable.notification_icon)
                 .setLargeIcon(BitmapFactory.decodeResource(context.resources, R.drawable.notification_icon))
-                .setColor(ThemeColorUtils.primaryColor(user.toPlatformAccount(), false, context))
+                .setColor(themeColorUtils.primaryColor(user.toPlatformAccount(), false, context))
                 .setShowWhen(true)
                 .setSubText(user.accountName)
                 .setContentTitle(context.getString(R.string.new_notification))

+ 6 - 5
app/src/main/java/com/nextcloud/client/logger/ui/LogsActivity.kt

@@ -34,13 +34,14 @@ import com.owncloud.android.R
 import com.owncloud.android.databinding.LogsActivityBinding
 import com.owncloud.android.ui.activity.ToolbarActivity
 import com.owncloud.android.utils.theme.ThemeBarUtils
-import com.owncloud.android.utils.theme.ThemeToolbarUtils
 import javax.inject.Inject
 
 class LogsActivity : ToolbarActivity() {
 
     @Inject
     protected lateinit var viewModelFactory: ViewModelFactory
+    @Inject
+    protected lateinit var themeBarUtils: ThemeBarUtils
     private lateinit var vm: LogsViewModel
     private lateinit var binding: LogsActivityBinding
     private lateinit var logsAdapter: LogsAdapter
@@ -65,7 +66,7 @@ class LogsActivity : ToolbarActivity() {
         }
 
         findViewById<ProgressBar>(R.id.logs_loading_progress).apply {
-            ThemeBarUtils.themeProgressBar(context, this)
+            themeBarUtils.themeProgressBar(context, this, themeColorUtils)
         }
 
         logsAdapter = LogsAdapter(this)
@@ -79,9 +80,9 @@ class LogsActivity : ToolbarActivity() {
 
         setupToolbar()
         supportActionBar?.setDisplayHomeAsUpEnabled(true)
-        supportActionBar?.apply { ThemeToolbarUtils.setColoredTitle(this, getString(R.string.logs_title), baseContext) }
+        supportActionBar?.apply { themeToolbarUtils.setColoredTitle(this, getString(R.string.logs_title), baseContext) }
 
-        ThemeToolbarUtils.tintBackButton(supportActionBar, baseContext)
+        themeToolbarUtils.tintBackButton(supportActionBar, baseContext)
     }
 
     override fun onCreateOptionsMenu(menu: Menu): Boolean {
@@ -89,7 +90,7 @@ class LogsActivity : ToolbarActivity() {
         (menu.findItem(R.id.action_search).actionView as SearchView).apply {
             setOnQueryTextListener(searchBoxListener)
 
-            ThemeToolbarUtils.themeSearchView(this, context)
+            themeToolbarUtils.themeSearchView(this, context)
         }
         return super.onCreateOptionsMenu(menu)
     }

+ 4 - 1
app/src/main/java/com/nextcloud/client/media/PlayerService.kt

@@ -89,6 +89,9 @@ class PlayerService : Service() {
     @Inject
     protected lateinit var clientFactory: ClientFactory
 
+    @Inject
+    protected lateinit var themeColorUtils: ThemeColorUtils
+
     private lateinit var player: Player
     private lateinit var notificationBuilder: NotificationCompat.Builder
     private var isRunning = false
@@ -98,7 +101,7 @@ class PlayerService : Service() {
         AndroidInjection.inject(this)
         player = Player(applicationContext, clientFactory, playerListener, audioManager)
         notificationBuilder = NotificationCompat.Builder(this)
-        notificationBuilder.color = ThemeColorUtils.primaryColor(this)
+        notificationBuilder.color = themeColorUtils.primaryColor(this)
 
         val stop = Intent(this, PlayerService::class.java)
         stop.action = ACTION_STOP

+ 3 - 2
app/src/main/java/com/nextcloud/client/notifications/AppNotificationManagerImpl.kt

@@ -22,7 +22,8 @@ import javax.inject.Inject
 class AppNotificationManagerImpl @Inject constructor(
     private val context: Context,
     private val resources: Resources,
-    private val platformNotificationsManager: NotificationManager
+    private val platformNotificationsManager: NotificationManager,
+    private val themeColorUtils: ThemeColorUtils
 ) : AppNotificationManager {
 
     companion object {
@@ -31,7 +32,7 @@ class AppNotificationManagerImpl @Inject constructor(
     }
 
     private fun builder(channelId: String): NotificationCompat.Builder {
-        val color = ThemeColorUtils.primaryColor(context, true)
+        val color = themeColorUtils.primaryColor(context, true)
         return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             NotificationCompat.Builder(context, channelId).setColor(color)
         } else {

+ 2 - 1
app/src/main/java/com/nextcloud/client/onboarding/WhatsNewActivity.java

@@ -56,6 +56,7 @@ public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPa
     @Inject AppPreferences preferences;
     @Inject AppInfo appInfo;
     @Inject OnboardingService onboarding;
+    @Inject ThemeButtonUtils themeButtonUtils;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -85,7 +86,7 @@ public class WhatsNewActivity extends FragmentActivity implements ViewPager.OnPa
         mPager.addOnPageChangeListener(this);
 
         mForwardFinishButton = findViewById(R.id.forward);
-        ThemeButtonUtils.colorImageButton(mForwardFinishButton, fontColor);
+        themeButtonUtils.colorImageButton(mForwardFinishButton, fontColor);
 
         mForwardFinishButton.setOnClickListener(view -> {
             if (mProgress.hasNextStep()) {

+ 11 - 4
app/src/main/java/com/nextcloud/ui/ChooseAccountDialogFragment.kt

@@ -50,7 +50,6 @@ import com.owncloud.android.utils.DisplayUtils
 import com.owncloud.android.utils.DisplayUtils.AvatarGenerationListener
 import com.owncloud.android.utils.theme.ThemeColorUtils
 import com.owncloud.android.utils.theme.ThemeDrawableUtils
-import java.util.ArrayList
 import javax.inject.Inject
 
 private const val ARG_CURRENT_USER_PARAM = "currentUser"
@@ -73,6 +72,12 @@ class ChooseAccountDialogFragment :
     @Inject
     lateinit var clientFactory: ClientFactory
 
+    @Inject
+    lateinit var themeColorUtils: ThemeColorUtils
+
+    @Inject
+    lateinit var themeDrawableUtils: ThemeDrawableUtils
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         arguments?.let {
@@ -112,9 +117,9 @@ class ChooseAccountDialogFragment :
             binding.currentAccount.account.text = user.accountName
 
             // Defining user right indicator
-            val icon = ThemeDrawableUtils.tintDrawable(
+            val icon = themeDrawableUtils.tintDrawable(
                 ContextCompat.getDrawable(requireContext(), R.drawable.ic_check_circle),
-                ThemeColorUtils.primaryColor(requireContext(), true)
+                themeColorUtils.primaryColor(requireContext(), true)
             )
             binding.currentAccount.accountMenu.setImageDrawable(icon)
 
@@ -125,7 +130,9 @@ class ChooseAccountDialogFragment :
                 getAccountListItems(),
                 this,
                 false,
-                false
+                false,
+                themeColorUtils,
+                themeDrawableUtils
             )
 
             binding.accountsList.adapter = adapter

+ 17 - 9
app/src/main/java/com/nextcloud/ui/SetStatusDialogFragment.kt

@@ -59,7 +59,6 @@ import com.owncloud.android.utils.theme.ThemeTextInputUtils
 import com.vanniktech.emoji.EmojiManager
 import com.vanniktech.emoji.EmojiPopup
 import com.vanniktech.emoji.google.GoogleEmojiProvider
-import java.util.ArrayList
 import java.util.Calendar
 import java.util.Locale
 import javax.inject.Inject
@@ -107,6 +106,15 @@ class SetStatusDialogFragment :
     @Inject
     lateinit var clientFactory: ClientFactory
 
+    @Inject
+    lateinit var themeColorUtils: ThemeColorUtils
+
+    @Inject
+    lateinit var themeButtonUtils: ThemeButtonUtils
+
+    @Inject
+    lateinit var themeTextInputUtils: ThemeTextInputUtils
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
         arguments?.let {
@@ -212,12 +220,12 @@ class SetStatusDialogFragment :
             }
         }
 
-        binding.clearStatus.setTextColor(ThemeColorUtils.primaryColor(context, true))
-        ThemeButtonUtils.colorPrimaryButton(binding.setStatus, context)
-        ThemeTextInputUtils.colorTextInput(
+        binding.clearStatus.setTextColor(themeColorUtils.primaryColor(context, true))
+        themeButtonUtils.colorPrimaryButton(binding.setStatus, context, themeColorUtils)
+        themeTextInputUtils.colorTextInput(
             binding.customStatusInputContainer,
             binding.customStatusInput,
-            ThemeColorUtils.primaryColor(activity)
+            themeColorUtils.primaryColor(activity)
         )
     }
 
@@ -327,19 +335,19 @@ class SetStatusDialogFragment :
         when (statusType) {
             StatusType.ONLINE -> {
                 clearTopStatus()
-                binding.onlineStatus.setBackgroundColor(ThemeColorUtils.primaryColor(context))
+                binding.onlineStatus.setBackgroundColor(themeColorUtils.primaryColor(context))
             }
             StatusType.AWAY -> {
                 clearTopStatus()
-                binding.awayStatus.setBackgroundColor(ThemeColorUtils.primaryColor(context))
+                binding.awayStatus.setBackgroundColor(themeColorUtils.primaryColor(context))
             }
             StatusType.DND -> {
                 clearTopStatus()
-                binding.dndStatus.setBackgroundColor(ThemeColorUtils.primaryColor(context))
+                binding.dndStatus.setBackgroundColor(themeColorUtils.primaryColor(context))
             }
             StatusType.INVISIBLE -> {
                 clearTopStatus()
-                binding.invisibleStatus.setBackgroundColor(ThemeColorUtils.primaryColor(context))
+                binding.invisibleStatus.setBackgroundColor(themeColorUtils.primaryColor(context))
             }
             else -> clearTopStatus()
         }

+ 35 - 6
app/src/main/java/com/owncloud/android/MainApp.java

@@ -77,6 +77,9 @@ import com.owncloud.android.utils.FilesSyncHelper;
 import com.owncloud.android.utils.PermissionUtil;
 import com.owncloud.android.utils.ReceiversHelper;
 import com.owncloud.android.utils.SecurityUtils;
+import com.owncloud.android.utils.theme.ThemeButtonUtils;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
 
 import org.conscrypt.Conscrypt;
 import org.greenrobot.eventbus.EventBus;
@@ -172,6 +175,11 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
     @Inject
     PassCodeManager passCodeManager;
 
+    @Inject ThemeColorUtils themeColorUtils;
+
+    @Inject ThemeSnackbarUtils themeSnackbarUtils;
+    @Inject ThemeButtonUtils themeButtonUtils;
+
     @SuppressWarnings("unused")
     private boolean mBound;
 
@@ -290,7 +298,10 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
                            connectivityService,
                            powerManagementService,
                            backgroundJobManager,
-                           clock);
+                           clock,
+                           themeColorUtils,
+                           themeSnackbarUtils,
+                           themeButtonUtils);
         initContactsBackup(accountManager, backgroundJobManager);
         notificationChannels();
 
@@ -448,7 +459,10 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
         final ConnectivityService connectivityService,
         final PowerManagementService powerManagementService,
         final BackgroundJobManager backgroundJobManager,
-        final Clock clock
+        final Clock clock,
+        final ThemeColorUtils themeColorUtils,
+        final ThemeSnackbarUtils themeSnackbarUtils,
+        final ThemeButtonUtils themeButtonUtils
                                          ) {
         updateToAutoUpload();
         cleanOldEntries(clock);
@@ -456,7 +470,7 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
 
         if (getAppContext() != null) {
             if (PermissionUtil.checkExternalStoragePermission(getAppContext())) {
-                splitOutAutoUploadEntries(clock);
+                splitOutAutoUploadEntries(clock, themeColorUtils, themeSnackbarUtils, themeButtonUtils);
             } else {
                 preferences.setAutoUploadSplitEntriesEnabled(true);
             }
@@ -678,7 +692,10 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
         }
     }
 
-    private static void splitOutAutoUploadEntries(Clock clock) {
+    private static void splitOutAutoUploadEntries(Clock clock,
+                                                  ThemeColorUtils themeColorUtils,
+                                                  ThemeSnackbarUtils themeSnackbarUtils,
+                                                  ThemeButtonUtils themeButtonUtils) {
         Context context = getAppContext();
         AppPreferences preferences = AppPreferencesImpl.fromContext(context);
         if (!preferences.isAutoUploadSplitEntriesEnabled()) {
@@ -689,8 +706,20 @@ public class MainApp extends MultiDexApplication implements HasAndroidInjector {
 
             SyncedFolderProvider syncedFolderProvider = new SyncedFolderProvider(contentResolver, preferences, clock);
 
-            final List<MediaFolder> imageMediaFolders = MediaProvider.getImageFolders(contentResolver, 1, null, true);
-            final List<MediaFolder> videoMediaFolders = MediaProvider.getVideoFolders(contentResolver, 1, null, true);
+            final List<MediaFolder> imageMediaFolders = MediaProvider.getImageFolders(contentResolver,
+                                                                                      1,
+                                                                                      null,
+                                                                                      true,
+                                                                                      themeColorUtils,
+                                                                                      themeSnackbarUtils,
+                                                                                      themeButtonUtils);
+            final List<MediaFolder> videoMediaFolders = MediaProvider.getVideoFolders(contentResolver,
+                                                                                      1,
+                                                                                      null,
+                                                                                      true,
+                                                                                      themeColorUtils,
+                                                                                      themeSnackbarUtils,
+                                                                                      themeButtonUtils);
 
             ArrayList<Long> idsToDelete = new ArrayList<>();
             List<SyncedFolder> syncedFolders = syncedFolderProvider.getSyncedFolders();

+ 5 - 2
app/src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java

@@ -233,6 +233,9 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
     @Inject OnboardingService onboarding;
     @Inject DeviceInfo deviceInfo;
     @Inject PassCodeManager passCodeManager;
+    @Inject ThemeToolbarUtils themeToolbarUtils;
+    @Inject ThemeDrawableUtils themeDrawableUtils;
+
     private boolean onlyAdd = false;
     @SuppressLint("ResourceAsColor") @ColorInt
     private int primaryColor = R.color.primary;
@@ -436,7 +439,7 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
                 accountSetupWebviewBinding.loginWebviewProgressBar.setVisibility(View.GONE);
                 accountSetupWebviewBinding.loginWebview.setVisibility(View.VISIBLE);
 
-                ThemeToolbarUtils.colorStatusBar(AuthenticatorActivity.this, primaryColor);
+                themeToolbarUtils.colorStatusBar(AuthenticatorActivity.this, primaryColor);
                 getWindow().setNavigationBarColor(primaryColor);
             }
 
@@ -526,7 +529,7 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
 
         if (deviceInfo.hasCamera(this)) {
             accountSetupBinding.scanQr.setOnClickListener(v -> onScan());
-            ThemeDrawableUtils.tintDrawable(accountSetupBinding.scanQr.getDrawable(),
+            themeDrawableUtils.tintDrawable(accountSetupBinding.scanQr.getDrawable(),
                                             getResources().getColor(R.color.login_text_color));
         } else {
             accountSetupBinding.scanQr.setVisibility(View.GONE);

+ 8 - 2
app/src/main/java/com/owncloud/android/authentication/DeepLinkLoginActivity.java

@@ -5,10 +5,16 @@ import android.os.Bundle;
 import android.widget.TextView;
 import android.widget.Toast;
 
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
 
-public class DeepLinkLoginActivity extends AuthenticatorActivity {
+import javax.inject.Inject;
+
+public class DeepLinkLoginActivity extends AuthenticatorActivity implements Injectable {
+    @Inject
+    public ThemeColorUtils themeColorUtils;
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -29,7 +35,7 @@ public class DeepLinkLoginActivity extends AuthenticatorActivity {
                 LoginUrlInfo loginUrlInfo = parseLoginDataUrl(prefix, data.toString());
 
                 TextView loginText = findViewById(R.id.loginInfo);
-                loginText.setTextColor(ThemeColorUtils.fontColor(this));
+                loginText.setTextColor(themeColorUtils.fontColor(this));
                 loginText.setText(String.format("Login with %1$s to %2$s", loginUrlInfo.username,
                                                 loginUrlInfo.serverAddress));
             } catch (IllegalArgumentException e) {

+ 23 - 7
app/src/main/java/com/owncloud/android/datamodel/MediaProvider.java

@@ -29,6 +29,9 @@ import android.util.Log;
 
 import com.owncloud.android.MainApp;
 import com.owncloud.android.utils.PermissionUtil;
+import com.owncloud.android.utils.theme.ThemeButtonUtils;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -69,10 +72,15 @@ public final class MediaProvider {
      * @param itemLimit       the number of media items (usually images) to be returned per media folder.
      * @return list with media folders
      */
-    public static List<MediaFolder> getImageFolders(ContentResolver contentResolver, int itemLimit,
-                                                    @Nullable final AppCompatActivity activity, boolean getWithoutActivity) {
+    public static List<MediaFolder> getImageFolders(ContentResolver contentResolver,
+                                                    int itemLimit,
+                                                    @Nullable final AppCompatActivity activity,
+                                                    boolean getWithoutActivity,
+                                                    ThemeColorUtils themeColorUtils,
+                                                    ThemeSnackbarUtils themeSnackbarUtils,
+                                                    ThemeButtonUtils themeButtonUtils) {
         // check permissions
-        checkPermissions(activity);
+        checkPermissions(activity, themeColorUtils, themeSnackbarUtils, themeButtonUtils);
 
         // query media/image folders
         Cursor cursorFolders = null;
@@ -169,17 +177,25 @@ public final class MediaProvider {
         return filePath != null && filePath.lastIndexOf('/') > 0 && new File(filePath).exists();
     }
 
-    private static void checkPermissions(@Nullable AppCompatActivity activity) {
+    private static void checkPermissions(@Nullable AppCompatActivity activity,
+                                         ThemeColorUtils themeColorUtils,
+                                         ThemeSnackbarUtils themeSnackbarUtils,
+                                         ThemeButtonUtils themeButtonUtils) {
         if (activity != null &&
             !PermissionUtil.checkExternalStoragePermission(activity.getApplicationContext())) {
             PermissionUtil.requestExternalStoragePermission(activity, true);
         }
     }
 
-    public static List<MediaFolder> getVideoFolders(ContentResolver contentResolver, int itemLimit,
-                                                    @Nullable final AppCompatActivity activity, boolean getWithoutActivity) {
+    public static List<MediaFolder> getVideoFolders(ContentResolver contentResolver,
+                                                    int itemLimit,
+                                                    @Nullable final AppCompatActivity activity,
+                                                    boolean getWithoutActivity,
+                                                    ThemeColorUtils themeColorUtils,
+                                                    ThemeSnackbarUtils themeSnackbarUtils,
+                                                    ThemeButtonUtils themeButtonUtils) {
         // check permissions
-        checkPermissions(activity);
+        checkPermissions(activity, themeColorUtils, themeSnackbarUtils, themeButtonUtils);
 
         // query media/image folders
         Cursor cursorFolders = null;

+ 35 - 20
app/src/main/java/com/owncloud/android/datamodel/ThumbnailsCacheManager.java

@@ -65,6 +65,8 @@ import com.owncloud.android.utils.BitmapUtils;
 import com.owncloud.android.utils.DisplayUtils.AvatarGenerationListener;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.MimeTypeUtil;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 
 import org.apache.commons.httpclient.HttpStatus;
 import org.apache.commons.httpclient.methods.GetMethod;
@@ -251,14 +253,14 @@ public final class ThumbnailsCacheManager {
     }
 
     public static class ResizedImageGenerationTask extends AsyncTask<Object, Void, Bitmap> {
-        private FileFragment fileFragment;
-        private FileDataStorageManager storageManager;
-        private User user;
-        private WeakReference<ImageView> imageViewReference;
-        private WeakReference<FrameLayout> frameLayoutReference;
+        private final FileFragment fileFragment;
+        private final FileDataStorageManager storageManager;
+        private final User user;
+        private final WeakReference<ImageView> imageViewReference;
+        private final WeakReference<FrameLayout> frameLayoutReference;
         private OCFile file;
-        private ConnectivityService connectivityService;
-        private int backgroundColor;
+        private final ConnectivityService connectivityService;
+        private final int backgroundColor;
 
 
         public ResizedImageGenerationTask(FileFragment fileFragment,
@@ -416,8 +418,8 @@ public final class ThumbnailsCacheManager {
     }
 
     public static class ThumbnailGenerationTaskObject {
-        private Object file;
-        private String imageKey;
+        private final Object file;
+        private final String imageKey;
 
         public ThumbnailGenerationTaskObject(Object file, String imageKey) {
             this.file = file;
@@ -738,15 +740,23 @@ public final class ThumbnailsCacheManager {
         private static final int IMAGE_KEY_PARAMS_LENGTH = 2;
 
         private enum Type {IMAGE, VIDEO}
+
         private final WeakReference<ImageView> mImageViewReference;
         private File mFile;
         private String mImageKey;
-        private Context mContext;
-
-        public MediaThumbnailGenerationTask(ImageView imageView, Context context) {
+        private final Context mContext;
+        private final ThemeColorUtils themeColorUtils;
+        private final ThemeDrawableUtils themeDrawableUtils;
+
+        public MediaThumbnailGenerationTask(ImageView imageView,
+                                            Context context,
+                                            ThemeColorUtils themeColorUtils,
+                                            ThemeDrawableUtils themeDrawableUtils) {
             // Use a WeakReference to ensure the ImageView can be garbage collected
             mImageViewReference = new WeakReference<>(imageView);
             mContext = context;
+            this.themeColorUtils = themeColorUtils;
+            this.themeDrawableUtils = themeDrawableUtils;
         }
 
         @Override
@@ -793,13 +803,18 @@ public final class ThumbnailsCacheManager {
                 } else {
                     if (mFile != null) {
                         if (mFile.isDirectory()) {
-                            imageView.setImageDrawable(MimeTypeUtil.getDefaultFolderIcon(mContext));
+                            imageView.setImageDrawable(MimeTypeUtil.getDefaultFolderIcon(mContext,
+                                                                                         themeColorUtils,
+                                                                                         themeDrawableUtils));
                         } else {
                             if (MimeTypeUtil.isVideo(mFile)) {
                                 imageView.setImageBitmap(ThumbnailsCacheManager.mDefaultVideo);
                             } else {
-                                imageView.setImageDrawable(MimeTypeUtil.getFileTypeIcon(null, mFile.getName(),
-                                        mContext));
+                                imageView.setImageDrawable(MimeTypeUtil.getFileTypeIcon(null,
+                                                                                        mFile.getName(),
+                                                                                        mContext,
+                                                                                        themeColorUtils,
+                                                                                        themeDrawableUtils));
                             }
                         }
                     }
@@ -870,11 +885,11 @@ public final class ThumbnailsCacheManager {
         private final Object mCallContext;
         private final Resources mResources;
         private final float mAvatarRadius;
-        private User user;
-        private String mUserId;
-        private String displayName;
-        private String mServerName;
-        private Context mContext;
+        private final User user;
+        private final String mUserId;
+        private final String displayName;
+        private final String mServerName;
+        private final Context mContext;
 
 
         public AvatarGenerationTask(AvatarGenerationListener avatarGenerationListener,

+ 14 - 5
app/src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java

@@ -36,6 +36,9 @@ import com.nextcloud.client.preferences.AppPreferences;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.datamodel.UploadsStorageManager;
 import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.utils.theme.ThemeButtonUtils;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
 
 import javax.inject.Inject;
 
@@ -57,12 +60,15 @@ public class BootupBroadcastReceiver extends BroadcastReceiver {
     @Inject PowerManagementService powerManagementService;
     @Inject BackgroundJobManager backgroundJobManager;
     @Inject Clock clock;
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeSnackbarUtils themeSnackbarUtils;
+    @Inject ThemeButtonUtils themeButtonUtils;
 
     /**
-     * Receives broadcast intent reporting that the system was just boot up.
-     **
-     * @param   context     The context where the receiver is running.
-     * @param   intent      The intent received.
+     * Receives broadcast intent reporting that the system was just boot up. *
+     *
+     * @param context The context where the receiver is running.
+     * @param intent  The intent received.
      */
     @Override
     public void onReceive(Context context, Intent intent) {
@@ -75,7 +81,10 @@ public class BootupBroadcastReceiver extends BroadcastReceiver {
                                        connectivityService,
                                        powerManagementService,
                                        backgroundJobManager,
-                                       clock);
+                                       clock,
+                                       themeColorUtils,
+                                       themeSnackbarUtils,
+                                       themeButtonUtils);
             MainApp.initContactsBackup(accountManager, backgroundJobManager);
         } else {
             Log_OC.d(TAG, "Getting wrong intent: " + intent.getAction());

+ 16 - 15
app/src/main/java/com/owncloud/android/files/services/FileDownloader.java

@@ -125,6 +125,7 @@ public class FileDownloader extends Service
     @Inject UserAccountManager accountManager;
     @Inject UploadsStorageManager uploadsStorageManager;
     @Inject LocalBroadcastManager localBroadcastManager;
+    @Inject ThemeColorUtils themeColorUtils;
 
     public static String getDownloadAddedMessage() {
         return FileDownloader.class.getName() + DOWNLOAD_ADDED_MESSAGE;
@@ -150,11 +151,11 @@ public class FileDownloader extends Service
         mBinder = new FileDownloaderBinder();
 
         NotificationCompat.Builder builder = new NotificationCompat.Builder(this).setContentTitle(
-                getApplicationContext().getResources().getString(R.string.app_name))
-                .setContentText(getApplicationContext().getResources().getString(R.string.foreground_service_download))
-                .setSmallIcon(R.drawable.notification_icon)
-                .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.notification_icon))
-                .setColor(ThemeColorUtils.primaryColor(getApplicationContext(), true));
+            getApplicationContext().getResources().getString(R.string.app_name))
+            .setContentText(getApplicationContext().getResources().getString(R.string.foreground_service_download))
+            .setSmallIcon(R.drawable.notification_icon)
+            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.notification_icon))
+            .setColor(themeColorUtils.primaryColor(getApplicationContext(), true));
 
         if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
             builder.setChannelId(NotificationUtils.NOTIFICATION_CHANNEL_DOWNLOAD);
@@ -538,17 +539,17 @@ public class FileDownloader extends Service
     private void notifyDownloadStart(DownloadFileOperation download) {
         /// create status notification with a progress bar
         mLastPercent = 0;
-        mNotificationBuilder = NotificationUtils.newNotificationBuilder(this);
+        mNotificationBuilder = NotificationUtils.newNotificationBuilder(this, themeColorUtils);
         mNotificationBuilder
-                .setSmallIcon(R.drawable.notification_icon)
-                .setTicker(getString(R.string.downloader_download_in_progress_ticker))
-                .setContentTitle(getString(R.string.downloader_download_in_progress_ticker))
-                .setOngoing(true)
-                .setProgress(100, 0, download.getSize() < 0)
-                .setContentText(
-                        String.format(getString(R.string.downloader_download_in_progress_content), 0,
-                                new File(download.getSavePath()).getName())
-                );
+            .setSmallIcon(R.drawable.notification_icon)
+            .setTicker(getString(R.string.downloader_download_in_progress_ticker))
+            .setContentTitle(getString(R.string.downloader_download_in_progress_ticker))
+            .setOngoing(true)
+            .setProgress(100, 0, download.getSize() < 0)
+            .setContentText(
+                String.format(getString(R.string.downloader_download_in_progress_content), 0,
+                              new File(download.getSavePath()).getName())
+                           );
 
         if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
             mNotificationBuilder.setChannelId(NotificationUtils.NOTIFICATION_CHANNEL_DOWNLOAD);

+ 4 - 3
app/src/main/java/com/owncloud/android/files/services/FileUploader.java

@@ -194,6 +194,7 @@ public class FileUploader extends Service
     @Inject ConnectivityService connectivityService;
     @Inject PowerManagementService powerManagementService;
     @Inject LocalBroadcastManager localBroadcastManager;
+    @Inject ThemeColorUtils themeColorUtils;
 
     private IndexedForest<UploadFileOperation> mPendingUploads = new IndexedForest<>();
 
@@ -234,7 +235,7 @@ public class FileUploader extends Service
             .setContentText(getApplicationContext().getResources().getString(R.string.foreground_service_upload))
             .setSmallIcon(R.drawable.notification_icon)
             .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.notification_icon))
-            .setColor(ThemeColorUtils.primaryColor(getApplicationContext(), true));
+            .setColor(themeColorUtils.primaryColor(getApplicationContext(), true));
 
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             builder.setChannelId(NotificationUtils.NOTIFICATION_CHANNEL_UPLOAD);
@@ -700,7 +701,7 @@ public class FileUploader extends Service
     private void notifyUploadStart(UploadFileOperation upload) {
         // / create status notification with a progress bar
         mLastPercent = 0;
-        mNotificationBuilder = NotificationUtils.newNotificationBuilder(this);
+        mNotificationBuilder = NotificationUtils.newNotificationBuilder(this, themeColorUtils);
         mNotificationBuilder
             .setOngoing(true)
             .setSmallIcon(R.drawable.notification_icon)
@@ -709,7 +710,7 @@ public class FileUploader extends Service
             .setProgress(100, 0, false)
             .setContentText(
                 String.format(getString(R.string.uploader_upload_in_progress_content), 0, upload.getFileName())
-            );
+                           );
 
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
             mNotificationBuilder.setChannelId(NotificationUtils.NOTIFICATION_CHANNEL_UPLOAD);

+ 15 - 7
app/src/main/java/com/owncloud/android/media/MediaControlView.java

@@ -59,7 +59,7 @@ public class MediaControlView extends FrameLayout implements OnClickListener, On
     private static final int SHOW_PROGRESS = 1;
 
     private MediaPlayerControl playerControl;
-    private View root;
+    private final View root;
     private ProgressBar progressBar;
     private TextView endTime;
     private TextView currentTime;
@@ -67,13 +67,21 @@ public class MediaControlView extends FrameLayout implements OnClickListener, On
     private ImageButton pauseButton;
     private ImageButton forwardButton;
     private ImageButton rewindButton;
+    private final ThemeColorUtils themeColorUtils;
+    private final ThemeBarUtils themeBarUtils;
 
-    public MediaControlView(Context context, AttributeSet attrs) {
+    public MediaControlView(Context context,
+                            AttributeSet attrs,
+                            ThemeColorUtils themeColorUtils,
+                            ThemeBarUtils themeBarUtils) {
         super(context, attrs);
 
+        this.themeColorUtils = themeColorUtils;
+        this.themeBarUtils = themeBarUtils;
+
         FrameLayout.LayoutParams frameParams = new FrameLayout.LayoutParams(
-                ViewGroup.LayoutParams.MATCH_PARENT,
-                ViewGroup.LayoutParams.MATCH_PARENT
+            ViewGroup.LayoutParams.MATCH_PARENT,
+            ViewGroup.LayoutParams.MATCH_PARENT
         );
         LayoutInflater inflate = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         root = inflate.inflate(R.layout.media_control, null);
@@ -125,10 +133,10 @@ public class MediaControlView extends FrameLayout implements OnClickListener, On
         if (progressBar != null) {
             if (progressBar instanceof SeekBar) {
                 SeekBar seeker = (SeekBar) progressBar;
-                ThemeBarUtils.colorHorizontalSeekBar(seeker, getContext());
+                themeBarUtils.colorHorizontalSeekBar(seeker, getContext(), themeColorUtils);
                 seeker.setOnSeekBarChangeListener(this);
             } else {
-                ThemeBarUtils.colorHorizontalProgressBar(progressBar, ThemeColorUtils.primaryAccentColor(getContext()));
+                themeBarUtils.colorHorizontalProgressBar(progressBar, themeColorUtils.primaryAccentColor(getContext()));
             }
             progressBar.setMax(1000);
         }
@@ -161,7 +169,7 @@ public class MediaControlView extends FrameLayout implements OnClickListener, On
         }
     }
 
-    private Handler handler = new Handler() {
+    private final Handler handler = new Handler() {
         @Override
         public void handleMessage(Message msg) {
             if (msg.what == SHOW_PROGRESS) {

+ 23 - 9
app/src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java

@@ -106,35 +106,49 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
     /** Counter of conflicts found between local and remote files */
     private int mConflictsFound;
 
-    /** Counter of failed operations in synchronization of kept-in-sync files */
+    /**
+     * Counter of failed operations in synchronization of kept-in-sync files
+     */
     private int mFailsInFavouritesFound;
 
-    /** Map of remote and local paths to files that where locally stored in a location out
-     * of the ownCloud folder and couldn't be copied automatically into it */
+    /**
+     * Map of remote and local paths to files that where locally stored in a location out of the ownCloud folder and
+     * couldn't be copied automatically into it
+     */
     private Map<String, String> mForgottenLocalFiles;
 
-    /** {@link SyncResult} instance to return to the system when the synchronization finish */
+    /**
+     * {@link SyncResult} instance to return to the system when the synchronization finish
+     */
     private SyncResult mSyncResult;
 
+    private final ThemeColorUtils themeColorUtils;
+
     /**
      * Creates a {@link FileSyncAdapter}
-     *
+     * <p>
      * {@inheritDoc}
      */
-    public FileSyncAdapter(Context context, boolean autoInitialize, UserAccountManager userAccountManager) {
+    public FileSyncAdapter(Context context,
+                           boolean autoInitialize,
+                           UserAccountManager userAccountManager,
+                           ThemeColorUtils themeColorUtils) {
         super(context, autoInitialize, userAccountManager);
+        this.themeColorUtils = themeColorUtils;
     }
 
     /**
      * Creates a {@link FileSyncAdapter}
-     *
+     * <p>
      * {@inheritDoc}
      */
     public FileSyncAdapter(Context context,
                            boolean autoInitialize,
                            boolean allowParallelSyncs,
-                           UserAccountManager userAccountManager) {
+                           UserAccountManager userAccountManager,
+                           ThemeColorUtils themeColorUtils) {
         super(context, autoInitialize, allowParallelSyncs, userAccountManager);
+        this.themeColorUtils = themeColorUtils;
     }
 
 
@@ -510,7 +524,7 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
     private NotificationCompat.Builder createNotificationBuilder() {
         NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getContext());
         notificationBuilder.setSmallIcon(R.drawable.notification_icon).setAutoCancel(true);
-        notificationBuilder.setColor(ThemeColorUtils.primaryColor(getContext(), true));
+        notificationBuilder.setColor(themeColorUtils.primaryColor(getContext(), true));
         return notificationBuilder;
     }
 

+ 3 - 1
app/src/main/java/com/owncloud/android/syncadapter/FileSyncService.java

@@ -25,6 +25,7 @@ import android.content.Intent;
 import android.os.IBinder;
 
 import com.nextcloud.client.account.UserAccountManager;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
 
 import javax.inject.Inject;
 
@@ -43,6 +44,7 @@ public class FileSyncService extends Service {
     private static final Object syncAdapterLock = new Object();
 
     @Inject UserAccountManager userAccountManager;
+    @Inject ThemeColorUtils themeColorUtils;
 
     /*
      * {@inheritDoc}
@@ -52,7 +54,7 @@ public class FileSyncService extends Service {
         AndroidInjection.inject(this);
         synchronized (syncAdapterLock) {
             if (syncAdapter == null) {
-                syncAdapter = new FileSyncAdapter(getApplicationContext(), true, userAccountManager);
+                syncAdapter = new FileSyncAdapter(getApplicationContext(), true, userAccountManager, themeColorUtils);
             }
         }
     }

+ 17 - 6
app/src/main/java/com/owncloud/android/ui/AvatarGroupLayout.java

@@ -39,6 +39,7 @@ import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.shares.ShareeUser;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.theme.ThemeAvatarUtils;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
 import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 
 import java.util.List;
@@ -83,7 +84,11 @@ public class AvatarGroupLayout extends RelativeLayout implements DisplayUtils.Av
         DrawableCompat.setTint(borderDrawable, ContextCompat.getColor(context, R.color.bg_default));
     }
 
-    public void setAvatars(@NonNull User user, @NonNull List<ShareeUser> sharees) {
+    public void setAvatars(@NonNull User user,
+                           @NonNull List<ShareeUser> sharees,
+                           ThemeColorUtils themeColorUtils,
+                           ThemeDrawableUtils themeDrawableUtils,
+                           ThemeAvatarUtils themeAvatarUtils) {
         @NonNull Context context = getContext();
         removeAllViews();
         RelativeLayout.LayoutParams avatarLayoutParams;
@@ -109,7 +114,7 @@ public class AvatarGroupLayout extends RelativeLayout implements DisplayUtils.Av
 
             if (avatarCount == 0 && sharees.size() > MAX_AVATAR_COUNT) {
                 avatar.setImageResource(R.drawable.ic_people);
-                ThemeDrawableUtils.setIconColor(avatar.getDrawable());
+                themeDrawableUtils.setIconColor(avatar.getDrawable());
             } else {
                 sharee = sharees.get(avatarCount);
                 switch (sharee.getShareType()) {
@@ -117,10 +122,15 @@ public class AvatarGroupLayout extends RelativeLayout implements DisplayUtils.Av
                     case EMAIL:
                     case ROOM:
                     case CIRCLE:
-                        ThemeAvatarUtils.createAvatar(sharee.getShareType(), avatar, context);
+                        themeAvatarUtils.createAvatar(sharee.getShareType(), avatar, context, themeColorUtils);
                         break;
                     case FEDERATED:
-                        showFederatedShareAvatar(context, sharee.getUserId(), avatarRadius, resources, avatar);
+                        showFederatedShareAvatar(context,
+                                                 sharee.getUserId(),
+                                                 avatarRadius,
+                                                 resources,
+                                                 avatar,
+                                                 themeDrawableUtils);
                         break;
                     default:
                         avatar.setTag(sharee);
@@ -148,7 +158,8 @@ public class AvatarGroupLayout extends RelativeLayout implements DisplayUtils.Av
                                           String user,
                                           float avatarRadius,
                                           Resources resources,
-                                          ImageView avatar) {
+                                          ImageView avatar,
+                                          ThemeDrawableUtils themeDrawableUtils) {
         // maybe federated share
         String[] split = user.split("@");
         String userId = split[0];
@@ -162,7 +173,7 @@ public class AvatarGroupLayout extends RelativeLayout implements DisplayUtils.Av
             placeholder = TextDrawable.createAvatarByUserId(userId, avatarRadius);
         } catch (Exception e) {
             Log_OC.e(TAG, "Error calculating RGB value for active account icon.", e);
-            placeholder = ThemeDrawableUtils.tintDrawable(ResourcesCompat.getDrawable(resources,
+            placeholder = themeDrawableUtils.tintDrawable(ResourcesCompat.getDrawable(resources,
                                                                                       R.drawable.account_circle_white,
                                                                                       null),
                                                           R.color.black);

+ 13 - 9
app/src/main/java/com/owncloud/android/ui/ThemeableSwitchPreference.java

@@ -29,18 +29,22 @@ import android.view.View;
 import android.view.ViewGroup;
 import android.widget.Switch;
 
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
 
+import javax.inject.Inject;
+
 import androidx.appcompat.app.AppCompatDelegate;
 import androidx.core.graphics.drawable.DrawableCompat;
 
 
 /**
- * Themeable switch preference
- * TODO Migrate to androidx
+ * Themeable switch preference TODO Migrate to androidx
  */
-public class ThemeableSwitchPreference extends SwitchPreference {
+public class ThemeableSwitchPreference extends SwitchPreference implements Injectable {
+
+    @Inject ThemeColorUtils themeColorUtils;
 
     public ThemeableSwitchPreference(Context context) {
         super(context);
@@ -74,19 +78,19 @@ public class ThemeableSwitchPreference extends SwitchPreference {
                 Switch switchView = (Switch) child;
 
                 if(thumbColorStateList == null && trackColorStateList == null) {
-                    int thumbColor = ThemeColorUtils.primaryAccentColor(getContext());
-                    if (ThemeColorUtils.darkTheme(getContext()) &&
+                    int thumbColor = themeColorUtils.primaryAccentColor(getContext());
+                    if (themeColorUtils.darkTheme(getContext()) &&
                         AppCompatDelegate.getDefaultNightMode() == AppCompatDelegate.MODE_NIGHT_YES) {
                         thumbColor = Color.WHITE;
                     }
                     int trackColor = Color.argb(77, Color.red(thumbColor), Color.green(thumbColor), Color.blue(thumbColor));
                     int trackColorUnchecked = getContext().getResources().getColor(R.color.switch_track_color_unchecked);
                     thumbColorStateList = new ColorStateList(
-                            new int[][]{new int[]{android.R.attr.state_checked}, new int[]{}},
-                            new int[]{thumbColor, getContext().getResources().getColor(R.color.switch_thumb_color_unchecked)});
+                        new int[][]{new int[]{android.R.attr.state_checked}, new int[]{}},
+                        new int[]{thumbColor, getContext().getResources().getColor(R.color.switch_thumb_color_unchecked)});
                     trackColorStateList = new ColorStateList(
-                            new int[][]{new int[]{android.R.attr.state_checked},
-                                new int[]{}},
+                        new int[][]{new int[]{android.R.attr.state_checked},
+                            new int[]{}},
                             new int[]{trackColor, trackColorUnchecked});
                 }
 

+ 4 - 3
app/src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java

@@ -41,7 +41,6 @@ import com.owncloud.android.ui.interfaces.ActivityListInterface;
 import com.owncloud.android.ui.preview.PreviewImageActivity;
 import com.owncloud.android.ui.preview.PreviewImageFragment;
 import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.theme.ThemeLayoutUtils;
 
 import java.util.List;
 
@@ -85,7 +84,7 @@ public class ActivitiesActivity extends DrawerActivity implements ActivityListIn
         // setup toolbar
         setupToolbar();
 
-        ThemeLayoutUtils.colorSwipeRefreshLayout(this, binding.swipeContainingList);
+        themeLayoutUtils.colorSwipeRefreshLayout(this, binding.swipeContainingList);
 
         // setup drawer
         setupDrawer(R.id.nav_activity);
@@ -114,7 +113,9 @@ public class ActivitiesActivity extends DrawerActivity implements ActivityListIn
                                           getUserAccountManager(),
                                           this,
                                           clientFactory,
-                                          false);
+                                          false,
+                                          themeColorUtils,
+                                          themeDrawableUtils);
         binding.list.setAdapter(adapter);
 
         LinearLayoutManager layoutManager = new LinearLayoutManager(this);

+ 4 - 6
app/src/main/java/com/owncloud/android/ui/activity/CommunityActivity.java

@@ -31,8 +31,6 @@ import com.google.android.material.button.MaterialButton;
 import com.owncloud.android.R;
 import com.owncloud.android.databinding.CommunityLayoutBinding;
 import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
 
 /**
  * Activity providing information about ways to participate in the app's development.
@@ -66,7 +64,7 @@ public class CommunityActivity extends DrawerActivity {
         contributeForumView.setMovementMethod(LinkMovementMethod.getInstance());
         contributeForumView.setText(Html.fromHtml(getString(R.string.community_contribute_forum_text) + " " +
                                                       getString(R.string.community_contribute_forum_text_link,
-                                                                ThemeColorUtils.primaryColorToHexString(this),
+                                                                themeColorUtils.primaryColorToHexString(this),
                                                                 getString(R.string.help_link),
                                                                 getString(R.string.community_contribute_forum_forum))));
 
@@ -74,7 +72,7 @@ public class CommunityActivity extends DrawerActivity {
         contributeTranslationView.setMovementMethod(LinkMovementMethod.getInstance());
         contributeTranslationView.setText(Html.fromHtml(
             getString(R.string.community_contribute_translate_link,
-                      ThemeColorUtils.primaryColorToHexString(this),
+                      themeColorUtils.primaryColorToHexString(this),
                       getString(R.string.translation_link),
                       getString(R.string.community_contribute_translate_translate)) + " " +
                 getString(R.string.community_contribute_translate_text)));
@@ -84,11 +82,11 @@ public class CommunityActivity extends DrawerActivity {
         contributeGithubView.setText(Html.fromHtml(
             getString(R.string.community_contribute_github_text,
                       getString(R.string.community_contribute_github_text_link,
-                                ThemeColorUtils.primaryColorToHexString(this),
+                                themeColorUtils.primaryColorToHexString(this),
                                 getString(R.string.contributing_link)))));
 
         MaterialButton reportButton = binding.communityTestingReport;
-        ThemeButtonUtils.colorPrimaryButton(reportButton, this);
+        themeButtonUtils.colorPrimaryButton(reportButton, this, themeColorUtils);
         reportButton.setOnClickListener(v -> DisplayUtils.startLinkIntent(this, R.string.report_issue_link));
 
         binding.communityBetaFdroid.setOnClickListener(

+ 22 - 16
app/src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java

@@ -114,8 +114,6 @@ import com.owncloud.android.utils.svg.SvgOrImageBitmapTranscoder;
 import com.owncloud.android.utils.svg.SvgOrImageDecoder;
 import com.owncloud.android.utils.theme.CapabilityUtils;
 import com.owncloud.android.utils.theme.ThemeBarUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 import com.owncloud.android.utils.theme.ThemeMenuUtils;
 
 import org.greenrobot.eventbus.EventBus;
@@ -212,6 +210,12 @@ public abstract class DrawerActivity extends ToolbarActivity
     @Inject
     ClientFactory clientFactory;
 
+    @Inject
+    ThemeMenuUtils themeMenuUtils;
+
+    @Inject
+    ThemeBarUtils themeBarUtils;
+
     /**
      * Initializes the drawer, its content and highlights the menu item with the given id. This method needs to be
      * called after the content view has been set.
@@ -284,8 +288,8 @@ public abstract class DrawerActivity extends ToolbarActivity
                                                          R.drawable.ic_arrow_back,
                                                          null);
         mDrawerToggle.setHomeAsUpIndicator(
-            ThemeDrawableUtils.tintDrawable(backArrow, ThemeColorUtils.appBarPrimaryFontColor(this)));
-        mDrawerToggle.getDrawerArrowDrawable().setColor(ThemeColorUtils.appBarPrimaryFontColor(this));
+            themeDrawableUtils.tintDrawable(backArrow, themeColorUtils.appBarPrimaryFontColor(this)));
+        mDrawerToggle.getDrawerArrowDrawable().setColor(themeColorUtils.appBarPrimaryFontColor(this));
     }
 
     /**
@@ -296,7 +300,7 @@ public abstract class DrawerActivity extends ToolbarActivity
         mQuotaProgressBar = (ProgressBar) findQuotaViewById(R.id.drawer_quota_ProgressBar);
         mQuotaTextPercentage = (TextView) findQuotaViewById(R.id.drawer_quota_percentage);
         mQuotaTextLink = (TextView) findQuotaViewById(R.id.drawer_quota_link);
-        ThemeBarUtils.colorProgressBar(mQuotaProgressBar, ThemeColorUtils.primaryColor(this));
+        themeBarUtils.colorProgressBar(mQuotaProgressBar, themeColorUtils.primaryColor(this));
     }
 
     public void updateHeader() {
@@ -305,11 +309,11 @@ public abstract class DrawerActivity extends ToolbarActivity
 
             OCCapability capability = getCapabilities();
             String logo = capability.getServerLogo();
-            int primaryColor = ThemeColorUtils.primaryColor(getAccount(), false, this);
+            int primaryColor = themeColorUtils.primaryColor(getAccount(), false, this);
 
             // set background to primary color
             LinearLayout drawerHeader = mNavigationViewHeader.findViewById(R.id.drawer_header_view);
-            drawerHeader.setBackgroundColor(ThemeColorUtils.unchangedPrimaryColor(getAccount(), this));
+            drawerHeader.setBackgroundColor(themeColorUtils.unchangedPrimaryColor(getAccount(), this));
 
             if (!TextUtils.isEmpty(logo) && URLUtil.isValidUrl(logo)) {
                 // background image
@@ -370,7 +374,7 @@ public abstract class DrawerActivity extends ToolbarActivity
         if (!TextUtils.isEmpty(name)) {
             TextView serverName = mNavigationViewHeader.findViewById(R.id.drawer_header_server_name);
             serverName.setText(name);
-            serverName.setTextColor(ThemeColorUtils.unchangedFontColor(this));
+            serverName.setTextColor(themeColorUtils.unchangedFontColor(this));
         }
 
     }
@@ -379,7 +383,7 @@ public abstract class DrawerActivity extends ToolbarActivity
      * setup drawer header, basically the logo color
      */
     private void setupDrawerHeader(FrameLayout drawerHeader) {
-        drawerHeader.setBackgroundColor(ThemeColorUtils.primaryColor(getAccount(), true, this));
+        drawerHeader.setBackgroundColor(themeColorUtils.primaryColor(getAccount(), true, this));
     }
 
     /**
@@ -691,7 +695,9 @@ public abstract class DrawerActivity extends ToolbarActivity
 
         mQuotaProgressBar.setProgress(relative);
 
-        ThemeBarUtils.colorProgressBar(mQuotaProgressBar, DisplayUtils.getRelativeInfoColor(this, relative));
+        themeBarUtils.colorProgressBar(mQuotaProgressBar, DisplayUtils.getRelativeInfoColor(this,
+                                                                                            relative,
+                                                                                            themeColorUtils));
 
         updateQuotaLink();
         showQuota(true);
@@ -779,7 +785,7 @@ public abstract class DrawerActivity extends ToolbarActivity
             mCheckedMenuItem = menuItemId;
             MenuItem currentItem = mNavigationView.getMenu().findItem(menuItemId);
             int drawerColor = getResources().getColor(R.color.drawer_text_color);
-            int activeColor = ThemeColorUtils.primaryColor(null, true, true, this);
+            int activeColor = themeColorUtils.primaryColor(null, true, true, this);
 
             currentItem.setChecked(true);
 
@@ -788,11 +794,11 @@ public abstract class DrawerActivity extends ToolbarActivity
                 MenuItem menuItem = mNavigationView.getMenu().getItem(i);
                 if (menuItem.getIcon() != null) {
                     if (menuItem == currentItem) {
-                        ThemeDrawableUtils.tintDrawable(currentItem.getIcon(), activeColor);
-                        ThemeMenuUtils.tintMenuItemText(currentItem, activeColor);
+                        themeDrawableUtils.tintDrawable(currentItem.getIcon(), activeColor);
+                        themeMenuUtils.tintMenuItemText(currentItem, activeColor);
                     } else {
-                        ThemeDrawableUtils.tintDrawable(menuItem.getIcon(), drawerColor);
-                        ThemeMenuUtils.tintMenuItemText(menuItem, drawerColor);
+                        themeDrawableUtils.tintDrawable(menuItem.getIcon(), drawerColor);
+                        themeMenuUtils.tintMenuItemText(menuItem, drawerColor);
                     }
                 }
             }
@@ -912,7 +918,7 @@ public abstract class DrawerActivity extends ToolbarActivity
 
         if (menuItem != null) {
             if (drawable != null) {
-                menuItem.setIcon(ThemeDrawableUtils.tintDrawable(drawable, greyColor));
+                menuItem.setIcon(themeDrawableUtils.tintDrawable(drawable, greyColor));
             } else {
                 menuItem.setIcon(R.drawable.ic_link);
             }

+ 7 - 4
app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java

@@ -43,7 +43,6 @@ import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.MimeTypeUtil;
-import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
 
 public abstract class EditorWebView extends ExternalSiteWebView {
     protected Snackbar loadingSnackbar;
@@ -79,7 +78,7 @@ public abstract class EditorWebView extends ExternalSiteWebView {
                                                                     R.string.timeout_richDocuments, Snackbar.LENGTH_INDEFINITE)
                         .setAction(R.string.common_back, v -> closeView());
 
-                    ThemeSnackbarUtils.colorSnackbar(getApplicationContext(), snackbar);
+                    themeSnackbarUtils.colorSnackbar(getApplicationContext(), snackbar);
                     setLoadingSnackbar(snackbar);
                     snackbar.show();
                 }
@@ -158,7 +157,9 @@ public abstract class EditorWebView extends ExternalSiteWebView {
                                                                               file.isSharedViaLink(),
                                                                               file.isEncrypted(),
                                                                               file.getMountType(),
-                                                                              this));
+                                                                              this,
+                                                                              themeColorUtils,
+                                                                              themeDrawableUtils));
         } else {
             if ((MimeTypeUtil.isImage(file) || MimeTypeUtil.isVideo(file)) && file.getRemoteId() != null) {
                 // Thumbnail in cache?
@@ -181,7 +182,9 @@ public abstract class EditorWebView extends ExternalSiteWebView {
                 Drawable icon = MimeTypeUtil.getFileTypeIcon(file.getMimeType(),
                                                              file.getFileName(),
                                                              user,
-                                                             getApplicationContext());
+                                                             getApplicationContext(),
+                                                             themeColorUtils,
+                                                             themeDrawableUtils);
                 binding.thumbnail.setImageDrawable(icon);
             }
         }

+ 1 - 2
app/src/main/java/com/owncloud/android/ui/activity/ExternalSiteWebView.java

@@ -39,7 +39,6 @@ import com.owncloud.android.databinding.ExternalsiteWebviewBinding;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.ui.NextcloudWebViewClient;
 import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.theme.ThemeToolbarUtils;
 
 import java.io.InputStream;
 
@@ -203,7 +202,7 @@ public class ExternalSiteWebView extends FileActivity {
     private void setupActionBar(String title) {
         ActionBar actionBar = getSupportActionBar();
         if (actionBar != null) {
-            ThemeToolbarUtils.setColoredTitle(actionBar, title, this);
+            themeToolbarUtils.setColoredTitle(actionBar, title, this);
 
             if (showSidebar) {
                 actionBar.setDisplayHomeAsUpEnabled(true);

+ 16 - 9
app/src/main/java/com/owncloud/android/ui/activity/FileActivity.java

@@ -93,7 +93,6 @@ import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.ErrorMessageAdapter;
 import com.owncloud.android.utils.FilesSyncHelper;
 import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
-import com.owncloud.android.utils.theme.ThemeToolbarUtils;
 
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
@@ -172,6 +171,9 @@ public abstract class FileActivity extends DrawerActivity
     @Inject
     BackgroundJobManager backgroundJobManager;
 
+    @Inject
+    ThemeSnackbarUtils themeSnackbarUtils;
+
     @Override
     public void showFiles(boolean onDeviceOnly) {
         // must be specialized in subclasses
@@ -200,9 +202,11 @@ public abstract class FileActivity extends DrawerActivity
             mFile = savedInstanceState.getParcelable(FileActivity.EXTRA_FILE);
             mFromNotification = savedInstanceState.getBoolean(FileActivity.EXTRA_FROM_NOTIFICATION);
             mFileOperationsHelper.setOpIdWaitingFor(
-                    savedInstanceState.getLong(KEY_WAITING_FOR_OP_ID, Long.MAX_VALUE)
-                    );
-            ThemeToolbarUtils.setColoredTitle(getSupportActionBar(), savedInstanceState.getString(KEY_ACTION_BAR_TITLE), this);
+                savedInstanceState.getLong(KEY_WAITING_FOR_OP_ID, Long.MAX_VALUE)
+                                                   );
+            themeToolbarUtils.setColoredTitle(getSupportActionBar(),
+                                              savedInstanceState.getString(KEY_ACTION_BAR_TITLE),
+                                              this);
         } else {
             User user = getIntent().getParcelableExtra(FileActivity.EXTRA_USER);
             mFile = getIntent().getParcelableExtra(FileActivity.EXTRA_FILE);
@@ -692,12 +696,15 @@ public abstract class FileActivity extends DrawerActivity
         }
     }
 
-    public static void copyAndShareFileLink(FileActivity activity, OCFile file, String link) {
+    public static void copyAndShareFileLink(FileActivity activity,
+                                            OCFile file,
+                                            String link,
+                                            ThemeSnackbarUtils themeSnackbarUtils) {
         ClipboardUtil.copyToClipboard(activity, link, false);
         Snackbar snackbar = Snackbar.make(activity.findViewById(android.R.id.content), R.string.clipboard_text_copied,
                                           Snackbar.LENGTH_LONG)
             .setAction(R.string.share, v -> showShareLinkDialog(activity, file, link));
-        ThemeSnackbarUtils.colorSnackbar(activity, snackbar);
+        themeSnackbarUtils.colorSnackbar(activity, snackbar);
         snackbar.show();
     }
 
@@ -766,7 +773,7 @@ public abstract class FileActivity extends DrawerActivity
                 snackbar = Snackbar.make(sharingFragment.getView(), result.getMessage(), Snackbar.LENGTH_LONG);
             }
 
-            ThemeSnackbarUtils.colorSnackbar(this, snackbar);
+            themeSnackbarUtils.colorSnackbar(this, snackbar);
             snackbar.show();
         }
     }
@@ -791,7 +798,7 @@ public abstract class FileActivity extends DrawerActivity
                 }
             }
 
-            copyAndShareFileLink(this, file, link);
+            copyAndShareFileLink(this, file, link, themeSnackbarUtils);
 
             if (sharingFragment != null) {
                 sharingFragment.onUpdateShareInformation(result, file);
@@ -821,7 +828,7 @@ public abstract class FileActivity extends DrawerActivity
                                                                                            operation,
                                                                                            getResources()),
                                                   Snackbar.LENGTH_LONG);
-                ThemeSnackbarUtils.colorSnackbar(this, snackbar);
+                themeSnackbarUtils.colorSnackbar(this, snackbar);
                 snackbar.show();
             }
         }

+ 3 - 2
app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -305,7 +305,8 @@ public class FileDisplayActivity extends FileActivity
                     .create();
 
                 alertDialog.show();
-                ThemeButtonUtils.themeBorderlessButton(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE));
+                themeButtonUtils.themeBorderlessButton(themeColorUtils,
+                                                       alertDialog.getButton(AlertDialog.BUTTON_POSITIVE));
             } catch (WindowManager.BadTokenException e) {
                 Log_OC.e(TAG, "Error showing wrong storage info, so skipping it: " + e.getMessage());
             }
@@ -655,7 +656,7 @@ public class FileDisplayActivity extends FileActivity
             searchView.setIconified(false);
         });
 
-        ThemeToolbarUtils.themeSearchView(searchView, this);
+        themeToolbarUtils.themeSearchView(searchView, this);
 
         // populate list of menu items to show/hide when drawer is opened/closed
         mDrawerMenuItemstoShowHideList = new ArrayList<>(1);

+ 7 - 11
app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java

@@ -56,10 +56,6 @@ import com.owncloud.android.utils.DataHolderUtil;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.ErrorMessageAdapter;
 import com.owncloud.android.utils.FileSortOrder;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeToolbarUtils;
-import com.owncloud.android.utils.theme.ThemeUtils;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -133,11 +129,11 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C
                     mDoNotEnterEncryptedFolder = true;
                     break;
                 default:
-                    caption = ThemeUtils.getDefaultDisplayNameForRootFolder(this);
+                    caption = themeUtils.getDefaultDisplayNameForRootFolder(this);
                     break;
             }
         } else {
-            caption = ThemeUtils.getDefaultDisplayNameForRootFolder(this);
+            caption = themeUtils.getDefaultDisplayNameForRootFolder(this);
         }
 
         if (getIntent().getParcelableExtra(EXTRA_CURRENT_FOLDER) != null) {
@@ -385,9 +381,9 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C
             actionBar.setDisplayHomeAsUpEnabled(!atRoot);
             actionBar.setHomeButtonEnabled(!atRoot);
 
-            ThemeToolbarUtils.tintBackButton(actionBar, this);
+            themeToolbarUtils.tintBackButton(actionBar, this);
 
-            ThemeToolbarUtils.setColoredTitle(getSupportActionBar(), atRoot ? caption : currentDir.getFileName(), this);
+            themeToolbarUtils.setColoredTitle(getSupportActionBar(), atRoot ? caption : currentDir.getFileName(), this);
         }
     }
 
@@ -399,15 +395,15 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C
         mChooseBtn = findViewById(R.id.folder_picker_btn_choose);
 
         if (mChooseBtn != null) {
-            ThemeButtonUtils.colorPrimaryButton(mChooseBtn, this);
+            themeButtonUtils.colorPrimaryButton(mChooseBtn, this, themeColorUtils);
             mChooseBtn.setOnClickListener(this);
         }
 
         if (mCancelBtn != null) {
             if (this instanceof FilePickerActivity) {
-                ThemeButtonUtils.colorPrimaryButton(mCancelBtn, this);
+                themeButtonUtils.colorPrimaryButton(mCancelBtn, this, themeColorUtils);
             } else {
-                mCancelBtn.setTextColor(ThemeColorUtils.primaryColor(this, true));
+                mCancelBtn.setTextColor(themeColorUtils.primaryColor(this, true));
             }
             mCancelBtn.setOnClickListener(this);
         }

+ 13 - 5
app/src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java

@@ -59,7 +59,6 @@ import com.owncloud.android.ui.adapter.UserListItem;
 import com.owncloud.android.ui.dialog.AccountRemovalConfirmationDialog;
 import com.owncloud.android.ui.events.AccountRemovedEvent;
 import com.owncloud.android.ui.helpers.FileOperationsHelper;
-import com.owncloud.android.utils.theme.ThemeToolbarUtils;
 
 import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
@@ -136,7 +135,7 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap
 
         // set title Action bar
         updateActionBarTitleAndHomeButtonByString(getResources().getString(R.string.prefs_manage_accounts));
-        ThemeToolbarUtils.tintBackButton(actionBar, this);
+        themeToolbarUtils.tintBackButton(actionBar, this);
 
         List<User> users = accountManager.getAllUsers();
         originalUsers = toAccountNames(users);
@@ -154,7 +153,10 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap
                                               accountManager,
                                               getUserListItems(),
                                               this,
-                                              multipleAccountsSupported, true);
+                                              multipleAccountsSupported,
+                                              true,
+                                              themeColorUtils,
+                                              themeDrawableUtils);
 
         recyclerView.setAdapter(userListAdapter);
         recyclerView.setLayoutManager(new LinearLayoutManager(this));
@@ -306,7 +308,10 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap
                                       accountManager,
                                       getUserListItems(),
                                       this,
-                                      multipleAccountsSupported, false);
+                                      multipleAccountsSupported,
+                                      false,
+                                      themeColorUtils,
+                                      themeDrawableUtils);
                                   recyclerView.setAdapter(userListAdapter);
                                   runOnUiThread(() -> userListAdapter.notifyDataSetChanged());
                               } catch (OperationCanceledException e) {
@@ -357,7 +362,10 @@ public class ManageAccountsActivity extends FileActivity implements UserListAdap
                                                       accountManager,
                                                       userListItemArray,
                                                       this,
-                                                      multipleAccountsSupported, false);
+                                                      multipleAccountsSupported,
+                                                      false,
+                                                      themeColorUtils,
+                                                      themeDrawableUtils);
                 recyclerView.setAdapter(userListAdapter);
             } else {
                 onBackPressed();

+ 3 - 4
app/src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java

@@ -49,7 +49,6 @@ import com.owncloud.android.ui.asynctasks.DeleteAllNotificationsTask;
 import com.owncloud.android.ui.notifications.NotificationsContract;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.PushUtils;
-import com.owncloud.android.utils.theme.ThemeLayoutUtils;
 
 import java.util.List;
 
@@ -101,8 +100,8 @@ public class NotificationsActivity extends DrawerActivity implements Notificatio
 
         updateActionBarTitleAndHomeButtonByString(getString(R.string.drawer_item_notifications));
 
-        ThemeLayoutUtils.colorSwipeRefreshLayout(this, binding.swipeContainingList);
-        ThemeLayoutUtils.colorSwipeRefreshLayout(this, binding.swipeContainingEmpty);
+        themeLayoutUtils.colorSwipeRefreshLayout(this, binding.swipeContainingList);
+        themeLayoutUtils.colorSwipeRefreshLayout(this, binding.swipeContainingEmpty);
 
         // setup drawer
         setupDrawer(R.id.nav_notifications);
@@ -259,7 +258,7 @@ public class NotificationsActivity extends DrawerActivity implements Notificatio
     private void initializeAdapter() {
         initializeClient();
         if (adapter == null) {
-            adapter = new NotificationListAdapter(client, this);
+            adapter = new NotificationListAdapter(client, this, themeColorUtils, themeButtonUtils);
             binding.list.setAdapter(adapter);
         }
     }

+ 14 - 13
app/src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java

@@ -25,7 +25,6 @@ package com.owncloud.android.ui.activity;
 
 import android.content.Intent;
 import android.os.Bundle;
-import android.os.SystemClock;
 import android.text.Editable;
 import android.text.TextUtils;
 import android.text.TextWatcher;
@@ -39,7 +38,6 @@ import android.widget.EditText;
 import com.google.android.material.snackbar.Snackbar;
 import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
-import com.nextcloud.client.preferences.AppPreferencesImpl;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.PassCodeManager;
 import com.owncloud.android.databinding.PasscodelockBinding;
@@ -76,9 +74,12 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
 
     @Inject AppPreferences preferences;
     @Inject PassCodeManager passCodeManager;
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeTextInputUtils themeTextInputUtils;
+    @Inject ThemeButtonUtils themeButtonUtils;
     private PasscodelockBinding binding;
     private final EditText[] passCodeEditTexts = new EditText[4];
-    private String [] passCodeDigits = {"","","",""};
+    private String[] passCodeDigits = {"", "", "", ""};
     private boolean confirmingPassCode;
     private boolean changed = true; // to control that only one blocks jump
 
@@ -95,26 +96,26 @@ public class PassCodeActivity extends AppCompatActivity implements Injectable {
         binding = PasscodelockBinding.inflate(getLayoutInflater());
         setContentView(binding.getRoot());
 
-        int elementColor = ThemeColorUtils.primaryColor(this, true);
+        int elementColor = themeColorUtils.primaryColor(this, true);
 
-        ThemeButtonUtils.themeBorderlessButton(ThemeColorUtils.primaryColor(this, true), binding.cancel);
+        themeButtonUtils.themeBorderlessButton(themeColorUtils.primaryColor(this, true), binding.cancel);
 
         passCodeEditTexts[0] = binding.txt0;
-        ThemeTextInputUtils.colorEditText(passCodeEditTexts[0], elementColor);
-        ThemeTextInputUtils.themeEditText(this, passCodeEditTexts[0], false);
+        themeTextInputUtils.colorEditText(passCodeEditTexts[0], elementColor);
+        themeTextInputUtils.themeEditText(this, passCodeEditTexts[0], false, themeColorUtils);
         passCodeEditTexts[0].requestFocus();
 
         passCodeEditTexts[1] = binding.txt1;
-        ThemeTextInputUtils.colorEditText(passCodeEditTexts[1], elementColor);
-        ThemeTextInputUtils.themeEditText(this, passCodeEditTexts[1], false);
+        themeTextInputUtils.colorEditText(passCodeEditTexts[1], elementColor);
+        themeTextInputUtils.themeEditText(this, passCodeEditTexts[1], false, themeColorUtils);
 
         passCodeEditTexts[2] = binding.txt2;
-        ThemeTextInputUtils.colorEditText(passCodeEditTexts[2], elementColor);
-        ThemeTextInputUtils.themeEditText(this, passCodeEditTexts[2], false);
+        themeTextInputUtils.colorEditText(passCodeEditTexts[2], elementColor);
+        themeTextInputUtils.themeEditText(this, passCodeEditTexts[2], false, themeColorUtils);
 
         passCodeEditTexts[3] = binding.txt3;
-        ThemeTextInputUtils.colorEditText(passCodeEditTexts[3], elementColor);
-        ThemeTextInputUtils.themeEditText(this, passCodeEditTexts[3], false);
+        themeTextInputUtils.colorEditText(passCodeEditTexts[3], elementColor);
+        themeTextInputUtils.themeEditText(this, passCodeEditTexts[3], false, themeColorUtils);
 
         Window window = getWindow();
         if (window != null) {

+ 18 - 15
app/src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java

@@ -91,11 +91,8 @@ import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.ErrorMessageAdapter;
 import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.MimeType;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 import com.owncloud.android.utils.theme.ThemeTextInputUtils;
-import com.owncloud.android.utils.theme.ThemeToolbarUtils;
 
 import java.io.File;
 import java.io.FileWriter;
@@ -147,6 +144,8 @@ public class ReceiveExternalFilesActivity extends FileActivity
 
     @Inject AppPreferences preferences;
     @Inject LocalBroadcastManager localBroadcastManager;
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeTextInputUtils themeTextInputUtils;
     private AccountManager mAccountManager;
     private Stack<String> mParents = new Stack<>();
     private List<Parcelable> mStreamsToUpload;
@@ -328,6 +327,8 @@ public class ReceiveExternalFilesActivity extends FileActivity
 
         private Spinner mSpinner;
         @Inject AppPreferences preferences;
+        @Inject ThemeColorUtils themeColorUtils;
+        @Inject ThemeTextInputUtils themeTextInputUtils;
 
         public static DialogInputUploadFilename newInstance(String subjectText, String extraText) {
             DialogInputUploadFilename dialog = new DialogInputUploadFilename();
@@ -422,7 +423,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
             final TextInputLayout userInputContainer = view.findViewById(R.id.user_input_container);
             setFilename(userInput, selectPos);
             userInput.requestFocus();
-            ThemeTextInputUtils.colorTextInput(userInputContainer, userInput, ThemeColorUtils.primaryColor(getContext()));
+            themeTextInputUtils.colorTextInput(userInputContainer, userInput, themeColorUtils.primaryColor(getContext()));
 
             final Spinner spinner = view.findViewById(R.id.file_type);
             setupSpinner(adapter, selectPos, userInput, spinner);
@@ -706,7 +707,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
         ActionBar actionBar = getSupportActionBar();
 
         if (isHaveMultipleAccount()) {
-            ThemeToolbarUtils.setColoredSubtitle(actionBar, getAccount().name, this);
+            themeToolbarUtils.setColoredSubtitle(actionBar, getAccount().name, this);
         } else if (actionBar != null) {
             actionBar.setSubtitle(null);
         }
@@ -729,9 +730,9 @@ public class ReceiveExternalFilesActivity extends FileActivity
 
         if (actionBar != null) {
             if (TextUtils.isEmpty(current_dir)) {
-                ThemeToolbarUtils.setColoredTitle(actionBar, R.string.uploader_top_message, this);
+                themeToolbarUtils.setColoredTitle(actionBar, R.string.uploader_top_message, this);
             } else {
-                ThemeToolbarUtils.setColoredTitle(actionBar, current_dir, this);
+                themeToolbarUtils.setColoredTitle(actionBar, current_dir, this);
             }
 
             actionBar.setDisplayHomeAsUpEnabled(notRoot);
@@ -767,28 +768,30 @@ public class ReceiveExternalFilesActivity extends FileActivity
                                                          new String[]{"dirname"},
                                                          new int[]{R.id.filename},
                                                          getStorageManager(),
-                                                         getUser().get());
+                                                         getUser().get(),
+                                                         themeColorUtils,
+                                                         themeDrawableUtils);
 
                 mListView.setAdapter(sa);
             }
             MaterialButton btnChooseFolder = findViewById(R.id.uploader_choose_folder);
-            ThemeButtonUtils.colorPrimaryButton(btnChooseFolder, this);
+            themeButtonUtils.colorPrimaryButton(btnChooseFolder, this, themeColorUtils);
             btnChooseFolder.setOnClickListener(this);
 
             if (mFile.canWrite()) {
                 btnChooseFolder.setEnabled(true);
-                ThemeButtonUtils.colorPrimaryButton(btnChooseFolder, this);
+                themeButtonUtils.colorPrimaryButton(btnChooseFolder, this, themeColorUtils);
             } else {
                 btnChooseFolder.setEnabled(false);
                 btnChooseFolder.setBackgroundColor(Color.GRAY);
             }
 
-            ThemeToolbarUtils.colorStatusBar(this);
+            themeToolbarUtils.colorStatusBar(this);
 
-            ThemeToolbarUtils.tintBackButton(actionBar, this);
+            themeToolbarUtils.tintBackButton(actionBar, this);
 
             Button btnNewFolder = findViewById(R.id.uploader_cancel);
-            btnNewFolder.setTextColor(ThemeColorUtils.primaryColor(this, true));
+            btnNewFolder.setTextColor(themeColorUtils.primaryColor(this, true));
             btnNewFolder.setOnClickListener(this);
 
             mListView.setOnItemClickListener(this);
@@ -814,7 +817,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
                 mEmptyListHeadline.setText(headline);
                 mEmptyListMessage.setText(message);
                 mEmptyListIcon.setImageDrawable(
-                    ThemeDrawableUtils.tintDrawable(icon, ThemeColorUtils.primaryColor(this, true)));
+                    themeDrawableUtils.tintDrawable(icon, themeColorUtils.primaryColor(this, true)));
                 mEmptyListIcon.setVisibility(View.VISIBLE);
                 mEmptyListMessage.setVisibility(View.VISIBLE);
             }
@@ -1039,7 +1042,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
         newFolderMenuItem.setEnabled(mFile.canWrite());
 
         // hacky as no default way is provided
-        ThemeToolbarUtils.themeSearchView(searchView, this);
+        themeToolbarUtils.themeSearchView(searchView, this);
 
         return true;
     }

+ 19 - 13
app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java

@@ -139,11 +139,16 @@ public class SettingsActivity extends ThemedPreferenceActivity
     @Inject AppPreferences preferences;
     @Inject UserAccountManager accountManager;
     @Inject ClientFactory clientFactory;
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeToolbarUtils themeToolbarUtils;
+    @Inject ThemeUtils themeUtils;
+    @Inject ThemeTextUtils themeTextUtils;
+    @Inject ThemeButtonUtils themeButtonUtils;
 
     @SuppressWarnings("deprecation")
     @Override
     public void onCreate(Bundle savedInstanceState) {
-        if (ThemeUtils.themingEnabled(this)) {
+        if (themeUtils.themingEnabled(this)) {
             setTheme(R.style.FallbackThemingTheme);
         }
 
@@ -157,7 +162,7 @@ public class SettingsActivity extends ThemedPreferenceActivity
         // Register context menu for list of preferences.
         registerForContextMenu(getListView());
 
-        int accentColor = ThemeColorUtils.primaryAccentColor(this);
+        int accentColor = themeColorUtils.primaryAccentColor(this);
         String appVersion = getAppVersion();
         PreferenceScreen preferenceScreen = (PreferenceScreen) findPreference("preference_screen");
 
@@ -190,7 +195,7 @@ public class SettingsActivity extends ThemedPreferenceActivity
         PreferenceCategory preferenceCategoryDev = (PreferenceCategory) findPreference("dev_category");
 
         if (getResources().getBoolean(R.bool.is_beta)) {
-            preferenceCategoryDev.setTitle(ThemeTextUtils.getColoredTitle(getString(R.string.prefs_category_dev),
+            preferenceCategoryDev.setTitle(themeTextUtils.getColoredTitle(getString(R.string.prefs_category_dev),
                                                                           accentColor));
 
             /* Link to dev apks */
@@ -230,7 +235,7 @@ public class SettingsActivity extends ThemedPreferenceActivity
 
     private void setupAboutCategory(int accentColor, String appVersion) {
         PreferenceCategory preferenceCategoryAbout = (PreferenceCategory) findPreference("about");
-        preferenceCategoryAbout.setTitle(ThemeTextUtils.getColoredTitle(getString(R.string.prefs_category_about),
+        preferenceCategoryAbout.setTitle(themeTextUtils.getColoredTitle(getString(R.string.prefs_category_about),
                                                                         accentColor));
 
         /* About App */
@@ -316,7 +321,7 @@ public class SettingsActivity extends ThemedPreferenceActivity
 
     private void setupMoreCategory(int accentColor) {
         PreferenceCategory preferenceCategoryMore = (PreferenceCategory) findPreference("more");
-        preferenceCategoryMore.setTitle(ThemeTextUtils.getColoredTitle(getString(R.string.prefs_category_more),
+        preferenceCategoryMore.setTitle(themeTextUtils.getColoredTitle(getString(R.string.prefs_category_more),
                                                                        accentColor));
 
         setupAutoUploadPreference(preferenceCategoryMore);
@@ -508,7 +513,7 @@ public class SettingsActivity extends ThemedPreferenceActivity
 
     private void setupDetailsCategory(int accentColor, PreferenceScreen preferenceScreen) {
         PreferenceCategory preferenceCategoryDetails = (PreferenceCategory) findPreference("details");
-        preferenceCategoryDetails.setTitle(ThemeTextUtils.getColoredTitle(getString(R.string.prefs_category_details),
+        preferenceCategoryDetails.setTitle(themeTextUtils.getColoredTitle(getString(R.string.prefs_category_details),
                                                                           accentColor));
 
         boolean fPassCodeEnabled = getResources().getBoolean(R.bool.passcode_enabled);
@@ -604,7 +609,7 @@ public class SettingsActivity extends ThemedPreferenceActivity
     private void setupAutoUploadCategory(int accentColor, PreferenceScreen preferenceScreen) {
         PreferenceCategory preferenceCategorySyncedFolders =
                 (PreferenceCategory) findPreference("synced_folders_category");
-        preferenceCategorySyncedFolders.setTitle(ThemeTextUtils.getColoredTitle(getString(R.string.drawer_synced_folders),
+        preferenceCategorySyncedFolders.setTitle(themeTextUtils.getColoredTitle(getString(R.string.drawer_synced_folders),
                                                                                 accentColor));
 
         if (!getResources().getBoolean(R.bool.syncedFolder_light)) {
@@ -674,7 +679,7 @@ public class SettingsActivity extends ThemedPreferenceActivity
 
     private void setupGeneralCategory(int accentColor) {
         PreferenceCategory preferenceCategoryGeneral = (PreferenceCategory) findPreference("general");
-        preferenceCategoryGeneral.setTitle(ThemeTextUtils.getColoredTitle(getString(R.string.prefs_category_general),
+        preferenceCategoryGeneral.setTitle(themeTextUtils.getColoredTitle(getString(R.string.prefs_category_general),
                                                                           accentColor));
 
         prefStoragePath = (ListPreference) findPreference(AppPreferencesImpl.STORAGE_PATH);
@@ -756,12 +761,12 @@ public class SettingsActivity extends ThemedPreferenceActivity
         ActionBar actionBar = getDelegate().getSupportActionBar();
 
         if (actionBar != null) {
-            ThemeToolbarUtils.setColoredTitle(actionBar, getString(R.string.actionbar_settings), this);
-            ThemeToolbarUtils.colorStatusBar(this);
-            actionBar.setBackgroundDrawable(new ColorDrawable(ThemeColorUtils.primaryAppbarColor(this)));
+            themeToolbarUtils.setColoredTitle(actionBar, getString(R.string.actionbar_settings), this);
+            themeToolbarUtils.colorStatusBar(this);
+            actionBar.setBackgroundDrawable(new ColorDrawable(themeColorUtils.primaryAppbarColor(this)));
 
             actionBar.setDisplayHomeAsUpEnabled(true);
-            ThemeToolbarUtils.tintBackButton(actionBar, this);
+            themeToolbarUtils.tintBackButton(actionBar, this);
         }
     }
 
@@ -879,7 +884,8 @@ public class SettingsActivity extends ThemedPreferenceActivity
                     .create();
 
                 alertDialog.show();
-                ThemeButtonUtils.themeBorderlessButton(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE));
+                themeButtonUtils.themeBorderlessButton(themeColorUtils,
+                                                       alertDialog.getButton(AlertDialog.BUTTON_POSITIVE));
             }
         }
     }

+ 7 - 4
app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.java

@@ -43,7 +43,6 @@ import com.owncloud.android.ui.fragment.FileDetailSharingFragment;
 import com.owncloud.android.ui.fragment.FileDetailsSharingProcessFragment;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.MimeTypeUtil;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
 
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentTransaction;
@@ -78,12 +77,16 @@ public class ShareActivity extends FileActivity {
                                                                                   file.isSharedViaLink(),
                                                                                   file.isEncrypted(),
                                                                                   file.getMountType(),
-                                                                                  this));
+                                                                                  this,
+                                                                                  themeColorUtils,
+                                                                                  themeDrawableUtils));
         } else {
             binding.shareFileIcon.setImageDrawable(MimeTypeUtil.getFileTypeIcon(file.getMimeType(),
                                                                                 file.getFileName(),
                                                                                 optionalUser.get(),
-                                                                                this));
+                                                                                this,
+                                                                                themeColorUtils,
+                                                                                themeDrawableUtils));
             if (MimeTypeUtil.isImage(file)) {
                 String remoteId = String.valueOf(file.getRemoteId());
                 Bitmap thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(remoteId);
@@ -96,7 +99,7 @@ public class ShareActivity extends FileActivity {
         // Name
         binding.shareFileName.setText(getResources().getString(R.string.share_file, file.getFileName()));
 
-        binding.shareHeaderDivider.getBackground().setColorFilter(ThemeColorUtils.primaryAccentColor(this),
+        binding.shareHeaderDivider.getBackground().setColorFilter(themeColorUtils.primaryAccentColor(this),
                                                                   PorterDuff.Mode.SRC_ATOP);
 
         // Size

+ 0 - 0
app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.java


+ 22 - 9
app/src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.kt

@@ -67,7 +67,6 @@ import com.owncloud.android.ui.dialog.parcel.SyncedFolderParcelable
 import com.owncloud.android.utils.PermissionUtil
 import com.owncloud.android.utils.SyncedFolderUtils
 import com.owncloud.android.utils.theme.ThemeButtonUtils
-import com.owncloud.android.utils.theme.ThemeUtils
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Job
@@ -157,6 +156,9 @@ class SyncedFoldersActivity :
     @Inject
     lateinit var backgroundJobManager: BackgroundJobManager
 
+    @Inject
+    lateinit var themeButtonUtils: ThemeButtonUtils
+
     private lateinit var binding: SyncedFoldersLayoutBinding
     private lateinit var adapter: SyncedFolderAdapter
     private lateinit var syncedFolderProvider: SyncedFolderProvider
@@ -202,7 +204,7 @@ class SyncedFoldersActivity :
         }
 
         setupContent()
-        if (ThemeUtils.themingEnabled(this)) {
+        if (themeUtils.themingEnabled(this)) {
             setTheme(R.style.FallbackThemingTheme)
         }
         binding.emptyList.emptyListViewAction.setOnClickListener { showHiddenItems() }
@@ -236,7 +238,7 @@ class SyncedFoldersActivity :
             .setTitle(R.string.autoupload_disable_power_save_check)
             .setMessage(getString(R.string.power_save_check_dialog_message))
             .show()
-        ThemeButtonUtils.themeBorderlessButton(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE))
+        themeButtonUtils.themeBorderlessButton(themeColorUtils, alertDialog.getButton(AlertDialog.BUTTON_POSITIVE))
     }
 
     /**
@@ -245,10 +247,10 @@ class SyncedFoldersActivity :
     private fun setupContent() {
         val gridWidth = resources.getInteger(R.integer.media_grid_width)
         val lightVersion = resources.getBoolean(R.bool.syncedFolder_light)
-        adapter = SyncedFolderAdapter(this, clock, gridWidth, this, lightVersion)
+        adapter = SyncedFolderAdapter(this, clock, gridWidth, this, lightVersion, themeColorUtils, themeDrawableUtils)
         syncedFolderProvider = SyncedFolderProvider(contentResolver, preferences, clock)
         binding.emptyList.emptyListIcon.setImageResource(R.drawable.nav_synced_folders)
-        ThemeButtonUtils.colorPrimaryButton(binding.emptyList.emptyListViewAction, this)
+        themeButtonUtils.colorPrimaryButton(binding.emptyList.emptyListViewAction, this, themeColorUtils)
         val lm = GridLayoutManager(this, gridWidth)
         adapter.setLayoutManager(lm)
         val spacing = resources.getDimensionPixelSize(R.dimen.media_grid_spacing)
@@ -281,12 +283,22 @@ class SyncedFoldersActivity :
             loadJob?.cancel()
             val mediaFolders = MediaProvider.getImageFolders(
                 contentResolver,
-                perFolderMediaItemLimit, this@SyncedFoldersActivity, false
+                perFolderMediaItemLimit,
+                this@SyncedFoldersActivity,
+                false,
+                themeColorUtils,
+                themeSnackbarUtils,
+                themeButtonUtils
             )
             mediaFolders.addAll(
                 MediaProvider.getVideoFolders(
-                    contentResolver, perFolderMediaItemLimit,
-                    this@SyncedFoldersActivity, false
+                    contentResolver,
+                    perFolderMediaItemLimit,
+                    this@SyncedFoldersActivity,
+                    false,
+                    themeColorUtils,
+                    themeSnackbarUtils,
+                    themeButtonUtils
                 )
             )
             val syncedFolderArrayList = syncedFolderProvider.syncedFolders
@@ -787,7 +799,8 @@ class SyncedFoldersActivity :
                 .setIcon(R.drawable.ic_battery_alert)
             if (lifecycle.currentState.isAtLeast(Lifecycle.State.RESUMED)) {
                 val alertDialog = alertDialogBuilder.show()
-                ThemeButtonUtils.themeBorderlessButton(
+                themeButtonUtils.themeBorderlessButton(
+                    themeColorUtils,
                     alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
                     alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL)
                 )

+ 5 - 1
app/src/main/java/com/owncloud/android/ui/activity/TextEditorWebView.kt

@@ -37,9 +37,13 @@ import javax.inject.Inject
 class TextEditorWebView : EditorWebView() {
     @Inject
     lateinit var appInfo: AppInfo
+
     @Inject
     lateinit var deviceInfo: DeviceInfo
 
+    @Inject
+    lateinit var themeUtils: ThemeUtils
+
     @SuppressLint("AddJavascriptInterface") // suppress warning as webview is only used > Lollipop
     override fun postOnCreate() {
         super.postOnCreate()
@@ -63,7 +67,7 @@ class TextEditorWebView : EditorWebView() {
                 WebSettingsCompat.DARK_STRATEGY_WEB_THEME_DARKENING_ONLY
             )
         }
-        if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK) && ThemeUtils.isDarkModeActive(this)) {
+        if (WebViewFeature.isFeatureSupported(WebViewFeature.FORCE_DARK) && themeUtils.isDarkModeActive(this)) {
             WebSettingsCompat.setForceDark(getWebView().settings, WebSettingsCompat.FORCE_DARK_ON)
         }
 

+ 21 - 9
app/src/main/java/com/owncloud/android/ui/activity/ToolbarActivity.java

@@ -38,14 +38,19 @@ import com.google.android.material.appbar.AppBarLayout;
 import com.google.android.material.button.MaterialButton;
 import com.google.android.material.card.MaterialCardView;
 import com.google.android.material.textview.MaterialTextView;
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
+import com.owncloud.android.utils.theme.ThemeButtonUtils;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
 import com.owncloud.android.utils.theme.ThemeDrawableUtils;
+import com.owncloud.android.utils.theme.ThemeLayoutUtils;
 import com.owncloud.android.utils.theme.ThemeToolbarUtils;
 import com.owncloud.android.utils.theme.ThemeUtils;
 
+import javax.inject.Inject;
+
 import androidx.annotation.StringRes;
 import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.app.ActionBar;
@@ -56,7 +61,7 @@ import androidx.core.content.ContextCompat;
 /**
  * Base class providing toolbar registration functionality, see {@link #setupToolbar(boolean, boolean)}.
  */
-public abstract class ToolbarActivity extends BaseActivity {
+public abstract class ToolbarActivity extends BaseActivity implements Injectable {
     protected MaterialButton mMenuButton;
     protected MaterialTextView mSearchText;
     protected MaterialButton mSwitchAccountButton;
@@ -72,16 +77,23 @@ public abstract class ToolbarActivity extends BaseActivity {
     protected AppCompatSpinner mToolbarSpinner;
     private boolean isHomeSearchToolbarShow = false;
 
+    @Inject public ThemeColorUtils themeColorUtils;
+    @Inject public ThemeLayoutUtils themeLayoutUtils;
+    @Inject public ThemeToolbarUtils themeToolbarUtils;
+    @Inject public ThemeUtils themeUtils;
+    @Inject public ThemeDrawableUtils themeDrawableUtils;
+    @Inject public ThemeButtonUtils themeButtonUtils;
+
     /**
      * Toolbar setup that must be called in implementer's {@link #onCreate} after {@link #setContentView} if they want
      * to use the toolbar.
      */
     private void setupToolbar(boolean isHomeSearchToolbarShow, boolean showSortListButtonGroup) {
-        int fontColor = ThemeColorUtils.appBarPrimaryFontColor(this);
+        int fontColor = themeColorUtils.appBarPrimaryFontColor(this);
 
         mToolbar = findViewById(R.id.toolbar);
         setSupportActionBar(mToolbar);
-        ThemeToolbarUtils.colorStatusBar(this);
+        themeToolbarUtils.colorStatusBar(this);
 
         mAppBar = findViewById(R.id.appbar);
         mDefaultToolbar = findViewById(R.id.default_toolbar);
@@ -106,11 +118,11 @@ public abstract class ToolbarActivity extends BaseActivity {
         mToolbarSpinner = findViewById(R.id.toolbar_spinner);
 
         if (mToolbar.getOverflowIcon() != null) {
-            ThemeDrawableUtils.tintDrawable(mToolbar.getOverflowIcon(), fontColor);
+            themeDrawableUtils.tintDrawable(mToolbar.getOverflowIcon(), fontColor);
         }
 
         if (mToolbar.getNavigationIcon() != null) {
-            ThemeDrawableUtils.tintDrawable(mToolbar.getNavigationIcon(), fontColor);
+            themeDrawableUtils.tintDrawable(mToolbar.getNavigationIcon(), fontColor);
         }
     }
 
@@ -129,7 +141,7 @@ public abstract class ToolbarActivity extends BaseActivity {
         String title;
         boolean isRoot = isRoot(chosenFile);
 
-        title = isRoot ? ThemeUtils.getDefaultDisplayNameForRootFolder(this) : chosenFile.getFileName();
+        title = isRoot ? themeUtils.getDefaultDisplayNameForRootFolder(this) : chosenFile.getFileName();
         updateActionBarTitleAndHomeButtonByString(title);
 
         if (mAppBar != null) {
@@ -161,13 +173,13 @@ public abstract class ToolbarActivity extends BaseActivity {
                                                                                 R.animator.appbar_elevation_off));
             mDefaultToolbar.setVisibility(View.GONE);
             mHomeSearchToolbar.setVisibility(View.VISIBLE);
-            ThemeToolbarUtils.colorStatusBar(this, ContextCompat.getColor(this, R.color.bg_default));
+            themeToolbarUtils.colorStatusBar(this, ContextCompat.getColor(this, R.color.bg_default));
         } else {
             mAppBar.setStateListAnimator(AnimatorInflater.loadStateListAnimator(mAppBar.getContext(),
                                                                                 R.animator.appbar_elevation_on));
             mDefaultToolbar.setVisibility(View.VISIBLE);
             mHomeSearchToolbar.setVisibility(View.GONE);
-            ThemeToolbarUtils.colorStatusBar(this);
+            themeToolbarUtils.colorStatusBar(this);
         }
     }
 
@@ -183,7 +195,7 @@ public abstract class ToolbarActivity extends BaseActivity {
 
         // set & color the chosen title
         ActionBar actionBar = getSupportActionBar();
-        ThemeToolbarUtils.setColoredTitle(actionBar, titleToSet, this);
+        themeToolbarUtils.setColoredTitle(actionBar, titleToSet, this);
 
         // set home button properties
         if (actionBar != null) {

+ 10 - 9
app/src/main/java/com/owncloud/android/ui/activity/UploadFilesActivity.java

@@ -55,7 +55,7 @@ import com.owncloud.android.ui.fragment.LocalFileListFragment;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.PermissionUtil;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
+import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
 import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 import com.owncloud.android.utils.theme.ThemeToolbarUtils;
@@ -102,6 +102,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
     private static final String WAIT_DIALOG_TAG = "WAIT";
 
     @Inject AppPreferences preferences;
+    @Inject ThemeSnackbarUtils themeSnackbarUtils;
     private Account mAccountOnCreation;
     private ArrayAdapter<String> mDirectories;
     private boolean mLocalFolderPickerMode;
@@ -188,11 +189,11 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
 
         // Set input controllers
         MaterialButton cancelButton = findViewById(R.id.upload_files_btn_cancel);
-        cancelButton.setTextColor(ThemeColorUtils.primaryColor(this, true));
+        cancelButton.setTextColor(themeColorUtils.primaryColor(this, true));
         cancelButton.setOnClickListener(this);
 
         uploadButton = findViewById(R.id.upload_files_btn_upload);
-        ThemeButtonUtils.colorPrimaryButton(uploadButton, this);
+        themeButtonUtils.colorPrimaryButton(uploadButton, this, themeColorUtils);
         uploadButton.setOnClickListener(this);
         uploadButton.setEnabled(mLocalFolderPickerMode);
 
@@ -203,7 +204,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
 
         List<String> behaviours = new ArrayList<>();
         behaviours.add(getString(R.string.uploader_upload_files_behaviour_move_to_nextcloud_folder,
-                                 ThemeUtils.getDefaultDisplayNameForRootFolder(this)));
+                                 themeUtils.getDefaultDisplayNameForRootFolder(this)));
         behaviours.add(getString(R.string.uploader_upload_files_behaviour_only_upload));
         behaviours.add(getString(R.string.uploader_upload_files_behaviour_upload_and_delete_from_source));
 
@@ -226,7 +227,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
             actionBar.setDisplayHomeAsUpEnabled(mCurrentDir != null);
             actionBar.setDisplayShowTitleEnabled(false);
 
-            ThemeToolbarUtils.tintBackButton(actionBar, this);
+            themeToolbarUtils.tintBackButton(actionBar, this);
         }
 
         showToolbarSpinner();
@@ -297,11 +298,11 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
             setSelectAllMenuItem(selectAll, mSelectAll);
         }
 
-        int fontColor = ThemeColorUtils.appBarPrimaryFontColor(this);
+        int fontColor = themeColorUtils.appBarPrimaryFontColor(this);
         final MenuItem item = menu.findItem(R.id.action_search);
         mSearchView = (SearchView) MenuItemCompat.getActionView(item);
-        ThemeToolbarUtils.themeSearchView(mSearchView, this);
-        ThemeDrawableUtils.tintDrawable(menu.findItem(R.id.action_choose_storage_path).getIcon(), fontColor);
+        themeToolbarUtils.themeSearchView(mSearchView, this);
+        themeDrawableUtils.tintDrawable(menu.findItem(R.id.action_choose_storage_path).getIcon(), fontColor);
 
         mSearchView.setOnSearchClickListener(v -> mToolbarSpinner.setVisibility(View.GONE));
 
@@ -469,7 +470,7 @@ public class UploadFilesActivity extends DrawerActivity implements LocalFileList
                 selectAll.setIcon(R.drawable.ic_select_none);
             } else {
                 selectAll.setIcon(
-                    ThemeDrawableUtils.tintDrawable(R.drawable.ic_select_all, ThemeColorUtils.primaryColor(this)));
+                    themeDrawableUtils.tintDrawable(R.drawable.ic_select_all, themeColorUtils.primaryColor(this)));
             }
             updateUploadButtonActive();
         }

+ 5 - 3
app/src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java

@@ -56,7 +56,6 @@ import com.owncloud.android.operations.CheckCurrentCredentialsOperation;
 import com.owncloud.android.ui.adapter.UploadListAdapter;
 import com.owncloud.android.ui.decoration.MediaGridItemDecoration;
 import com.owncloud.android.utils.FilesSyncHelper;
-import com.owncloud.android.utils.theme.ThemeLayoutUtils;
 
 import javax.inject.Inject;
 
@@ -155,7 +154,10 @@ public class UploadListActivity extends FileActivity {
                                                   userAccountManager,
                                                   connectivityService,
                                                   powerManagementService,
-                                                  clock);
+                                                  clock,
+                                                  themeColorUtils,
+                                                  themeDrawableUtils,
+                                                  themeBarUtils);
 
         final GridLayoutManager lm = new GridLayoutManager(this, 1);
         uploadListAdapter.setLayoutManager(lm);
@@ -165,7 +167,7 @@ public class UploadListActivity extends FileActivity {
         binding.list.setLayoutManager(lm);
         binding.list.setAdapter(uploadListAdapter);
 
-        ThemeLayoutUtils.colorSwipeRefreshLayout(this, swipeListRefreshLayout);
+        themeLayoutUtils.colorSwipeRefreshLayout(this, swipeListRefreshLayout);
         swipeListRefreshLayout.setOnRefreshListener(this::refresh);
 
         loadItems();

+ 4 - 6
app/src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java

@@ -61,8 +61,6 @@ import com.owncloud.android.ui.dialog.AccountRemovalConfirmationDialog;
 import com.owncloud.android.ui.events.TokenPushEvent;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.PushUtils;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
-import com.owncloud.android.utils.theme.ThemeToolbarUtils;
 
 import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
@@ -136,11 +134,11 @@ public class UserInfoActivity extends DrawerActivity implements Injectable {
         if (actionBar != null) {
             actionBar.setDisplayHomeAsUpEnabled(true);
             actionBar.setDisplayShowHomeEnabled(true);
-            ThemeToolbarUtils.tintBackButton(actionBar, this);
+            themeToolbarUtils.tintBackButton(actionBar, this);
         }
 
         binding.userinfoList.setAdapter(
-            new UserInfoAdapter(null, ThemeColorUtils.primaryColor(getAccount(), true, this)));
+            new UserInfoAdapter(null, themeColorUtils.primaryColor(getAccount(), true, this)));
 
         if (userInfo != null) {
             populateUserInfoUi(userInfo);
@@ -209,7 +207,7 @@ public class UserInfoActivity extends DrawerActivity implements Injectable {
             if (backgroundImageView != null) {
 
                 String background = getStorageManager().getCapability(user.getAccountName()).getServerBackground();
-                int primaryColor = ThemeColorUtils.primaryColor(getAccount(), false, this);
+                int primaryColor = themeColorUtils.primaryColor(getAccount(), false, this);
 
                 if (URLUtil.isValidUrl(background)) {
                     // background image
@@ -257,7 +255,7 @@ public class UserInfoActivity extends DrawerActivity implements Injectable {
                                binding.userinfoIcon,
                                this);
 
-        int tint = ThemeColorUtils.primaryColor(user.toPlatformAccount(), true, this);
+        int tint = themeColorUtils.primaryColor(user.toPlatformAccount(), true, this);
 
         if (!TextUtils.isEmpty(userInfo.getDisplayName())) {
             binding.userinfoFullName.setText(userInfo.getDisplayName());

+ 13 - 3
app/src/main/java/com/owncloud/android/ui/adapter/ActivityAndVersionListAdapter.java

@@ -40,6 +40,8 @@ import com.owncloud.android.lib.resources.files.model.FileVersion;
 import com.owncloud.android.ui.interfaces.ActivityListInterface;
 import com.owncloud.android.ui.interfaces.VersionListInterface;
 import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 
 import java.util.Collections;
 import java.util.Date;
@@ -58,9 +60,17 @@ public class ActivityAndVersionListAdapter extends ActivityListAdapter {
         CurrentAccountProvider currentAccountProvider,
         ActivityListInterface activityListInterface,
         VersionListInterface.View versionListInterface,
-        ClientFactory clientFactory
-    ) {
-        super(context, currentAccountProvider, activityListInterface, clientFactory, true);
+        ClientFactory clientFactory,
+        ThemeColorUtils themeColorUtils,
+        ThemeDrawableUtils themeDrawableUtils
+                                        ) {
+        super(context,
+              currentAccountProvider,
+              activityListInterface,
+              clientFactory,
+              true,
+              themeColorUtils,
+              themeDrawableUtils);
 
         this.versionListInterface = versionListInterface;
     }

+ 17 - 3
app/src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java

@@ -72,6 +72,8 @@ import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.glide.CustomGlideStreamLoader;
 import com.owncloud.android.utils.svg.SvgBitmapTranscoder;
 import com.owncloud.android.utils.svg.SvgDecoder;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -98,13 +100,17 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
     private ClientFactory clientFactory;
     protected List<Object> values;
     private boolean isDetailView;
+    private ThemeColorUtils themeColorUtils;
+    private ThemeDrawableUtils themeDrawableUtils;
 
     public ActivityListAdapter(
         Context context,
         CurrentAccountProvider currentAccountProvider,
         ActivityListInterface activityListInterface,
         ClientFactory clientFactory,
-        boolean isDetailView) {
+        boolean isDetailView,
+        ThemeColorUtils themeColorUtils,
+        ThemeDrawableUtils themeDrawableUtils) {
         this.values = new ArrayList<>();
         this.context = context;
         this.currentAccountProvider = currentAccountProvider;
@@ -112,6 +118,8 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
         this.clientFactory = clientFactory;
         px = getThumbnailDimension();
         this.isDetailView = isDetailView;
+        this.themeColorUtils = themeColorUtils;
+        this.themeDrawableUtils = themeDrawableUtils;
     }
 
     public void setActivityItems(List<Object> activityItems, NextcloudClient client, boolean clear) {
@@ -278,9 +286,15 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
                 .into(imageView);
         } else {
             if (MimeTypeUtil.isFolder(previewObject.getMimeType())) {
-                imageView.setImageDrawable(MimeTypeUtil.getDefaultFolderIcon(context));
+                imageView.setImageDrawable(MimeTypeUtil.getDefaultFolderIcon(context,
+                                                                             themeColorUtils,
+                                                                             themeDrawableUtils));
             } else {
-                imageView.setImageDrawable(MimeTypeUtil.getFileTypeIcon(previewObject.getMimeType(), "", context));
+                imageView.setImageDrawable(MimeTypeUtil.getFileTypeIcon(previewObject.getMimeType(),
+                                                                        "",
+                                                                        context,
+                                                                        themeColorUtils,
+                                                                        themeDrawableUtils));
             }
         }
 

+ 9 - 3
app/src/main/java/com/owncloud/android/ui/adapter/GalleryAdapter.kt

@@ -43,6 +43,8 @@ import com.owncloud.android.ui.interfaces.OCFileListFragmentInterface
 import com.owncloud.android.utils.DisplayUtils
 import com.owncloud.android.utils.FileSortOrder
 import com.owncloud.android.utils.FileStorageUtils
+import com.owncloud.android.utils.theme.ThemeColorUtils
+import com.owncloud.android.utils.theme.ThemeDrawableUtils
 import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView.SectionedAdapter
 import java.util.Calendar
 import java.util.Date
@@ -52,10 +54,12 @@ class GalleryAdapter(
     user: User,
     ocFileListFragmentInterface: OCFileListFragmentInterface,
     preferences: AppPreferences,
-    transferServiceGetter: ComponentsGetter
+    transferServiceGetter: ComponentsGetter,
+    themeColorUtils: ThemeColorUtils,
+    themeDrawableUtils: ThemeDrawableUtils
 ) : SectionedRecyclerViewAdapter<SectionedViewHolder>(), CommonOCFileListAdapterInterface, SectionedAdapter {
     private var files: List<GalleryItems> = mutableListOf()
-    private var ocFileListDelegate: OCFileListDelegate
+    private val ocFileListDelegate: OCFileListDelegate
     private var storageManager: FileDataStorageManager
 
     init {
@@ -71,7 +75,9 @@ class GalleryAdapter(
             true,
             transferServiceGetter,
             showMetadata = false,
-            showShareAvatar = false
+            showShareAvatar = false,
+            themeColorUtils,
+            themeDrawableUtils
         )
     }
 

+ 10 - 2
app/src/main/java/com/owncloud/android/ui/adapter/LinkShareViewHolder.java

@@ -36,6 +36,7 @@ import com.owncloud.android.lib.resources.shares.OCShare;
 import com.owncloud.android.lib.resources.shares.ShareType;
 import com.owncloud.android.ui.fragment.util.SharingMenuHelper;
 import com.owncloud.android.utils.theme.ThemeAvatarUtils;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
 
 import androidx.annotation.NonNull;
 import androidx.core.content.res.ResourcesCompat;
@@ -44,15 +45,22 @@ import androidx.recyclerview.widget.RecyclerView;
 class LinkShareViewHolder extends RecyclerView.ViewHolder {
     private FileDetailsShareLinkShareItemBinding binding;
     private Context context;
+    private ThemeColorUtils themeColorUtils;
+    private ThemeAvatarUtils themeAvatarUtils;
 
     public LinkShareViewHolder(@NonNull View itemView) {
         super(itemView);
     }
 
-    public LinkShareViewHolder(FileDetailsShareLinkShareItemBinding binding, Context context) {
+    public LinkShareViewHolder(FileDetailsShareLinkShareItemBinding binding,
+                               Context context,
+                               ThemeColorUtils themeColorUtils,
+                               ThemeAvatarUtils themeAvatarUtils) {
         this(binding.getRoot());
         this.binding = binding;
         this.context = context;
+        this.themeColorUtils = themeColorUtils;
+        this.themeAvatarUtils = themeAvatarUtils;
     }
 
     public void bind(OCShare publicShare, ShareeListAdapterListener listener) {
@@ -75,7 +83,7 @@ class LinkShareViewHolder extends RecyclerView.ViewHolder {
                 binding.name.setText(R.string.share_link);
             }
 
-            ThemeAvatarUtils.colorIconImageViewWithBackground(binding.icon, context);
+            themeAvatarUtils.colorIconImageViewWithBackground(binding.icon, context, themeColorUtils);
         }
 
         String permissionName = SharingMenuHelper.getPermissionName(context, publicShare);

+ 27 - 8
app/src/main/java/com/owncloud/android/ui/adapter/LocalFileListAdapter.java

@@ -73,18 +73,27 @@ public class LocalFileListAdapter extends RecyclerView.Adapter<RecyclerView.View
     private boolean gridView = false;
     private LocalFileListFragmentInterface localFileListFragmentInterface;
     private Set<File> checkedFiles;
+    private ThemeColorUtils themeColorUtils;
+    private ThemeDrawableUtils themeDrawableUtils;
 
     private static final int VIEWTYPE_ITEM = 0;
     private static final int VIEWTYPE_FOOTER = 1;
     private static final int VIEWTYPE_IMAGE = 2;
 
-    public LocalFileListAdapter(boolean localFolderPickerMode, File directory,
-                                LocalFileListFragmentInterface localFileListFragmentInterface, AppPreferences preferences, Context context) {
+    public LocalFileListAdapter(boolean localFolderPickerMode,
+                                File directory,
+                                LocalFileListFragmentInterface localFileListFragmentInterface,
+                                AppPreferences preferences,
+                                Context context,
+                                ThemeColorUtils themeColorUtils,
+                                ThemeDrawableUtils themeDrawableUtils) {
         this.preferences = preferences;
         mContext = context;
         mLocalFolderPicker = localFolderPickerMode;
         this.localFileListFragmentInterface = localFileListFragmentInterface;
         checkedFiles = new HashSet<>();
+        this.themeColorUtils = themeColorUtils;
+        this.themeDrawableUtils = themeDrawableUtils;
 
         swapDirectory(directory);
     }
@@ -173,8 +182,8 @@ public class LocalFileListAdapter extends RecyclerView.Adapter<RecyclerView.View
                         gridViewHolder.itemLayout.setBackgroundColor(mContext.getResources()
                                                                          .getColor(R.color.selected_item_background));
                         gridViewHolder.checkbox.setImageDrawable(
-                            ThemeDrawableUtils.tintDrawable(R.drawable.ic_checkbox_marked,
-                                                            ThemeColorUtils.primaryColor(mContext)));
+                            themeDrawableUtils.tintDrawable(R.drawable.ic_checkbox_marked,
+                                                            themeColorUtils.primaryColor(mContext)));
                     } else {
                         gridViewHolder.itemLayout.setBackgroundColor(mContext.getResources().getColor(R.color.bg_default));
                         gridViewHolder.checkbox.setImageResource(R.drawable.ic_checkbox_blank_outline);
@@ -184,7 +193,7 @@ public class LocalFileListAdapter extends RecyclerView.Adapter<RecyclerView.View
                 }
 
                 gridViewHolder.thumbnail.setTag(file.hashCode());
-                setThumbnail(file, gridViewHolder.thumbnail, mContext);
+                setThumbnail(file, gridViewHolder.thumbnail, mContext, themeColorUtils, themeDrawableUtils);
 
                 gridViewHolder.itemLayout.setOnClickListener(v -> localFileListFragmentInterface
                     .onItemClicked(finalFile));
@@ -219,9 +228,15 @@ public class LocalFileListAdapter extends RecyclerView.Adapter<RecyclerView.View
         }
     }
 
-    public static void setThumbnail(File file, ImageView thumbnailView, Context context) {
+    public static void setThumbnail(File file,
+                                    ImageView thumbnailView,
+                                    Context context,
+                                    ThemeColorUtils themeColorUtils,
+                                    ThemeDrawableUtils themeDrawableUtils) {
         if (file.isDirectory()) {
-            thumbnailView.setImageDrawable(MimeTypeUtil.getDefaultFolderIcon(context));
+            thumbnailView.setImageDrawable(MimeTypeUtil.getDefaultFolderIcon(context,
+                                                                             themeColorUtils,
+                                                                             themeDrawableUtils));
         } else {
             thumbnailView.setImageResource(R.drawable.file);
 
@@ -264,7 +279,11 @@ public class LocalFileListAdapter extends RecyclerView.Adapter<RecyclerView.View
                     } // else, already being generated, don't restart it
                 }
             } else {
-                thumbnailView.setImageDrawable(MimeTypeUtil.getFileTypeIcon(null, file.getName(), context));
+                thumbnailView.setImageDrawable(MimeTypeUtil.getFileTypeIcon(null,
+                                                                            file.getName(),
+                                                                            context,
+                                                                            themeColorUtils,
+                                                                            themeDrawableUtils));
             }
         }
     }

+ 18 - 11
app/src/main/java/com/owncloud/android/ui/adapter/NotificationListAdapter.java

@@ -76,17 +76,24 @@ import androidx.recyclerview.widget.RecyclerView;
 public class NotificationListAdapter extends RecyclerView.Adapter<NotificationListAdapter.NotificationViewHolder> {
     private static final String FILE = "file";
     private static final String ACTION_TYPE_WEB = "WEB";
-    private StyleSpan styleSpanBold = new StyleSpan(Typeface.BOLD);
-    private ForegroundColorSpan foregroundColorSpanBlack;
-
-    private List<Notification> notificationsList;
-    private OwnCloudClient client;
-    private NotificationsActivity notificationsActivity;
-
-    public NotificationListAdapter(OwnCloudClient client, NotificationsActivity notificationsActivity) {
+    private final StyleSpan styleSpanBold = new StyleSpan(Typeface.BOLD);
+    private final ForegroundColorSpan foregroundColorSpanBlack;
+
+    private final List<Notification> notificationsList;
+    private final OwnCloudClient client;
+    private final NotificationsActivity notificationsActivity;
+    private final ThemeColorUtils themeColorUtils;
+    private final ThemeButtonUtils themeButtonUtils;
+
+    public NotificationListAdapter(OwnCloudClient client,
+                                   NotificationsActivity notificationsActivity,
+                                   ThemeColorUtils themeColorUtils,
+                                   ThemeButtonUtils themeButtonUtils) {
         this.notificationsList = new ArrayList<>();
         this.client = client;
         this.notificationsActivity = notificationsActivity;
+        this.themeColorUtils = themeColorUtils;
+        this.themeButtonUtils = themeButtonUtils;
         foregroundColorSpanBlack = new ForegroundColorSpan(
             notificationsActivity.getResources().getColor(R.color.text_color));
     }
@@ -175,7 +182,7 @@ public class NotificationListAdapter extends RecyclerView.Adapter<NotificationLi
             0
                          );
 
-        int primaryColor = ThemeColorUtils.primaryColor(notificationsActivity);
+        int primaryColor = themeColorUtils.primaryColor(notificationsActivity);
         
         List<Action> overflowActions = new ArrayList<>();
         
@@ -208,7 +215,7 @@ public class NotificationListAdapter extends RecyclerView.Adapter<NotificationLi
                         }
                     });
 
-                    ThemeButtonUtils.colorPrimaryButton(button, notificationsActivity);
+                    themeButtonUtils.colorPrimaryButton(button, notificationsActivity, themeColorUtils);
                     holder.binding.buttons.addView(button);
                 } else {
                     overflowActions.add(action);
@@ -262,7 +269,7 @@ public class NotificationListAdapter extends RecyclerView.Adapter<NotificationLi
                 button = new MaterialButton(notificationsActivity);
 
                 if (action.primary) {
-                    ThemeButtonUtils.colorPrimaryButton(button, notificationsActivity);
+                    themeButtonUtils.colorPrimaryButton(button, notificationsActivity, themeColorUtils);
                 } else {
                     button.setBackgroundColor(resources.getColor(R.color.grey_200));
                     button.setTextColor(primaryColor);

+ 19 - 5
app/src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java

@@ -71,7 +71,9 @@ import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.theme.CapabilityUtils;
+import com.owncloud.android.utils.theme.ThemeAvatarUtils;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView;
 
 import java.io.File;
@@ -124,6 +126,9 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
     private FileSortOrder sortOrder;
 
     private final SimpleDateFormat dateFormat = new SimpleDateFormat("MMMM yyyy", Locale.getDefault());
+    private final ThemeColorUtils themeColorUtils;
+    private final ThemeDrawableUtils themeDrawableUtils;
+    private final ThemeAvatarUtils themeAvatarUtils;
 
     public OCFileListAdapter(
         Activity activity,
@@ -132,7 +137,10 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
         ComponentsGetter transferServiceGetter,
         OCFileListFragmentInterface ocFileListFragmentInterface,
         boolean argHideItemOptions,
-        boolean gridView
+        boolean gridView,
+        ThemeColorUtils themeColorUtils,
+        ThemeDrawableUtils themeDrawableUtils,
+        ThemeAvatarUtils themeAvatarUtils
                             ) {
         this.ocFileListFragmentInterface = ocFileListFragmentInterface;
         this.activity = activity;
@@ -151,6 +159,10 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
             .getUserData(this.user.toPlatformAccount(),
                          com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_USER_ID);
 
+        this.themeColorUtils = themeColorUtils;
+        this.themeDrawableUtils = themeDrawableUtils;
+        this.themeAvatarUtils = themeAvatarUtils;
+
         ocFileListDelegate = new OCFileListDelegate(activity,
                                                     ocFileListFragmentInterface,
                                                     user,
@@ -163,7 +175,9 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
                                                     CapabilityUtils
                                                         .getCapability(activity)
                                                         .getVersion()
-                                                        .isShareesOnDavSupported());
+                                                        .isShareesOnDavSupported(),
+                                                    themeColorUtils,
+                                                    themeDrawableUtils);
 
         // initialise thumbnails cache on background thread
         new ThumbnailsCacheManager.InitDiskCacheTask().execute();
@@ -345,14 +359,14 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
             OCFileListFooterViewHolder footerViewHolder = (OCFileListFooterViewHolder) holder;
             footerViewHolder.getFooterText().setText(getFooterText());
             footerViewHolder.getLoadingProgressBar().getIndeterminateDrawable()
-                .setColorFilter(ThemeColorUtils.primaryColor(activity), PorterDuff.Mode.SRC_IN);
+                .setColorFilter(themeColorUtils.primaryColor(activity), PorterDuff.Mode.SRC_IN);
             footerViewHolder.getLoadingProgressBar().setVisibility(
                 ocFileListFragmentInterface.isLoading() ? View.VISIBLE : View.GONE);
         } else if (holder instanceof OCFileListHeaderViewHolder) {
             OCFileListHeaderViewHolder headerViewHolder = (OCFileListHeaderViewHolder) holder;
             String text = currentDirectory.getRichWorkspace();
 
-            PreviewTextFragment.setText(headerViewHolder.getHeaderText(), text, null, activity, true, true);
+            PreviewTextFragment.setText(headerViewHolder.getHeaderText(), text, null, activity, true, true, themeColorUtils);
             headerViewHolder.getHeaderView().setOnClickListener(v -> ocFileListFragmentInterface.onHeaderClicked());
         } else {
             ListGridImageViewHolder gridViewHolder = (ListGridImageViewHolder) holder;
@@ -396,7 +410,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
 
             Log_OC.d(this, "sharees of " + file.getFileName() + ": " + sharees);
 
-            holder.getSharedAvatars().setAvatars(user, sharees);
+            holder.getSharedAvatars().setAvatars(user, sharees,themeColorUtils, themeDrawableUtils, themeAvatarUtils);
             holder.getSharedAvatars().setOnClickListener(
                 view -> ocFileListFragmentInterface.onShareIconClick(file));
         } else {

+ 8 - 4
app/src/main/java/com/owncloud/android/ui/adapter/OCFileListDelegate.kt

@@ -47,7 +47,9 @@ class OCFileListDelegate(
     private val gridView: Boolean,
     private val transferServiceGetter: ComponentsGetter,
     private val showMetadata: Boolean,
-    private var showShareAvatar: Boolean
+    private var showShareAvatar: Boolean,
+    private var themeColorUtils: ThemeColorUtils,
+    private var themeDrawableUtils: ThemeDrawableUtils
 ) {
     private val checkedFiles: MutableSet<OCFile> = HashSet()
     private var highlightedItem: OCFile? = null
@@ -98,7 +100,9 @@ class OCFileListDelegate(
             gridView,
             context,
             gridViewHolder.shimmerThumbnail,
-            preferences
+            preferences,
+            themeColorUtils,
+            themeDrawableUtils
         )
         // item layout + click listeners
         bindGridItemLayout(file, gridViewHolder)
@@ -152,9 +156,9 @@ class OCFileListDelegate(
                     .getColor(R.color.selected_item_background)
             )
             gridViewHolder.checkbox.setImageDrawable(
-                ThemeDrawableUtils.tintDrawable(
+                themeDrawableUtils.tintDrawable(
                     R.drawable.ic_checkbox_marked,
-                    ThemeColorUtils.primaryColor(context)
+                    themeColorUtils.primaryColor(context)
                 )
             )
         } else {

+ 5 - 4
app/src/main/java/com/owncloud/android/ui/adapter/RichDocumentsTemplateAdapter.java

@@ -35,8 +35,8 @@ import com.owncloud.android.databinding.TemplateButtonBinding;
 import com.owncloud.android.datamodel.Template;
 import com.owncloud.android.ui.dialog.ChooseRichDocumentsTemplateDialogFragment;
 import com.owncloud.android.utils.NextcloudServer;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
 import com.owncloud.android.utils.glide.CustomGlideStreamLoader;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -64,14 +64,15 @@ public class RichDocumentsTemplateAdapter extends RecyclerView.Adapter<RichDocum
         ClickListener clickListener,
         Context context,
         CurrentAccountProvider currentAccountProvider,
-        ClientFactory clientFactory
-    ) {
+        ClientFactory clientFactory,
+        ThemeColorUtils themeColorUtils
+                                       ) {
         this.clickListener = clickListener;
         this.type = type;
         this.context = context;
         this.currentAccountProvider = currentAccountProvider;
         this.clientFactory = clientFactory;
-        colorSelected = ThemeColorUtils.primaryColor(context, true);
+        colorSelected = themeColorUtils.primaryColor(context, true);
         colorUnselected = context.getResources().getColor(R.color.grey_200);
     }
 

+ 11 - 5
app/src/main/java/com/owncloud/android/ui/adapter/ShareViewHolder.java

@@ -26,7 +26,6 @@ package com.owncloud.android.ui.adapter;
 
 import android.content.Context;
 import android.text.TextUtils;
-import android.util.Log;
 import android.view.View;
 import android.widget.ImageView;
 
@@ -38,6 +37,7 @@ import com.owncloud.android.ui.TextDrawable;
 import com.owncloud.android.ui.fragment.util.SharingMenuHelper;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.theme.ThemeAvatarUtils;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
 
 import androidx.annotation.DrawableRes;
 import androidx.annotation.NonNull;
@@ -48,6 +48,8 @@ class ShareViewHolder extends RecyclerView.ViewHolder {
     private float avatarRadiusDimension;
     private User user;
     private Context context;
+    private ThemeColorUtils themeColorUtils;
+    private ThemeAvatarUtils themeAvatarUtils;
 
     public ShareViewHolder(@NonNull View itemView) {
         super(itemView);
@@ -55,11 +57,15 @@ class ShareViewHolder extends RecyclerView.ViewHolder {
 
     public ShareViewHolder(FileDetailsShareShareItemBinding binding,
                            User user,
-                           Context context) {
+                           Context context,
+                           ThemeColorUtils themeColorUtils,
+                           ThemeAvatarUtils themeAvatarUtils) {
         this(binding.getRoot());
         this.binding = binding;
         this.user = user;
         this.context = context;
+        this.themeColorUtils = themeColorUtils;
+        this.themeAvatarUtils = themeAvatarUtils;
     }
 
     public void bind(OCShare share,
@@ -74,14 +80,14 @@ class ShareViewHolder extends RecyclerView.ViewHolder {
         switch (share.getShareType()) {
             case GROUP:
                 name = context.getString(R.string.share_group_clarification, name);
-                ThemeAvatarUtils.createAvatar(share.getShareType(), binding.icon, context);
+                themeAvatarUtils.createAvatar(share.getShareType(), binding.icon, context, themeColorUtils);
                 break;
             case ROOM:
                 name = context.getString(R.string.share_room_clarification, name);
-                ThemeAvatarUtils.createAvatar(share.getShareType(), binding.icon, context);
+                themeAvatarUtils.createAvatar(share.getShareType(), binding.icon, context, themeColorUtils);
                 break;
             case CIRCLE:
-                ThemeAvatarUtils.createAvatar(share.getShareType(), binding.icon, context);
+                themeAvatarUtils.createAvatar(share.getShareType(), binding.icon, context, themeColorUtils);
                 break;
             case FEDERATED:
                 name = context.getString(R.string.share_remote_clarification, name);

+ 20 - 8
app/src/main/java/com/owncloud/android/ui/adapter/ShareeListAdapter.java

@@ -40,6 +40,8 @@ import com.owncloud.android.lib.resources.shares.OCShare;
 import com.owncloud.android.lib.resources.shares.ShareType;
 import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.theme.ThemeAvatarUtils;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
 
 import java.util.ArrayList;
 import java.util.Collections;
@@ -54,23 +56,29 @@ import androidx.recyclerview.widget.RecyclerView;
 public class ShareeListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
     implements DisplayUtils.AvatarGenerationListener {
 
-    private ShareeListAdapterListener listener;
-    private FileActivity fileActivity;
+    private final ShareeListAdapterListener listener;
+    private final FileActivity fileActivity;
     private List<OCShare> shares;
-    private float avatarRadiusDimension;
-    private String userId;
-    private User user;
+    private final float avatarRadiusDimension;
+    private final String userId;
+    private final User user;
+    private final ThemeColorUtils themeColorUtils;
+    private final ThemeAvatarUtils themeAvatarUtils;
 
     public ShareeListAdapter(FileActivity fileActivity,
                              List<OCShare> shares,
                              ShareeListAdapterListener listener,
                              String userId,
-                             User user) {
+                             User user,
+                             ThemeColorUtils themeColorUtils,
+                             ThemeAvatarUtils themeAvatarUtils) {
         this.fileActivity = fileActivity;
         this.shares = shares;
         this.listener = listener;
         this.userId = userId;
         this.user = user;
+        this.themeColorUtils = themeColorUtils;
+        this.themeAvatarUtils = themeAvatarUtils;
 
         avatarRadiusDimension = fileActivity.getResources().getDimension(R.dimen.user_icon_radius);
 
@@ -92,7 +100,9 @@ public class ShareeListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
                     FileDetailsShareLinkShareItemBinding.inflate(LayoutInflater.from(fileActivity),
                                                                  parent,
                                                                  false),
-                    fileActivity);
+                    fileActivity,
+                    themeColorUtils,
+                    themeAvatarUtils);
             case NEW_PUBLIC_LINK:
                 return new NewLinkShareViewHolder(
                     FileDetailsSharePublicLinkAddNewItemBinding.inflate(LayoutInflater.from(fileActivity),
@@ -108,7 +118,9 @@ public class ShareeListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
                                                                                     parent,
                                                                                     false),
                                            user,
-                                           fileActivity);
+                                           fileActivity,
+                                           themeColorUtils,
+                                           themeAvatarUtils);
         }
     }
 

+ 17 - 4
app/src/main/java/com/owncloud/android/ui/adapter/SyncedFolderAdapter.java

@@ -70,9 +70,17 @@ public class SyncedFolderAdapter extends SectionedRecyclerViewAdapter<SectionedV
     private static final int VIEW_TYPE_HEADER = 2;
     private static final int VIEW_TYPE_FOOTER = 3;
     private boolean hideItems;
+    private final ThemeColorUtils themeColorUtils;
+    private final ThemeDrawableUtils themeDrawableUtils;
     private final Executor thumbnailThreadPool;
 
-    public SyncedFolderAdapter(Context context, Clock clock, int gridWidth, ClickListener listener, boolean light) {
+    public SyncedFolderAdapter(Context context,
+                               Clock clock,
+                               int gridWidth,
+                               ClickListener listener,
+                               boolean light,
+                               ThemeColorUtils themeColorUtils,
+                               ThemeDrawableUtils themeDrawableUtils) {
         this.context = context;
         this.clock = clock;
         this.gridWidth = gridWidth;
@@ -82,6 +90,8 @@ public class SyncedFolderAdapter extends SectionedRecyclerViewAdapter<SectionedV
         filteredSyncFolderItems = new ArrayList<>();
         this.light = light;
         this.hideItems = true;
+        this.themeColorUtils = themeColorUtils;
+        this.themeDrawableUtils = themeDrawableUtils;
         this.thumbnailThreadPool = Executors.newCachedThreadPool();
 
         shouldShowHeadersForEmptySections(true);
@@ -336,7 +346,10 @@ public class SyncedFolderAdapter extends SectionedRecyclerViewAdapter<SectionedV
             File file = new File(filteredSyncFolderItems.get(section).getFilePaths().get(relativePosition));
 
             ThumbnailsCacheManager.MediaThumbnailGenerationTask task =
-                    new ThumbnailsCacheManager.MediaThumbnailGenerationTask(holder.binding.thumbnail, context);
+                new ThumbnailsCacheManager.MediaThumbnailGenerationTask(holder.binding.thumbnail,
+                                                                        context,
+                                                                        themeColorUtils,
+                                                                        themeDrawableUtils);
 
             ThumbnailsCacheManager.AsyncMediaThumbnailDrawable asyncDrawable =
                     new ThumbnailsCacheManager.AsyncMediaThumbnailDrawable(
@@ -444,9 +457,9 @@ public class SyncedFolderAdapter extends SectionedRecyclerViewAdapter<SectionedV
     private void setSyncButtonActiveIcon(ImageButton syncStatusButton, boolean enabled) {
         if (enabled) {
             syncStatusButton.setImageDrawable(
-                ThemeDrawableUtils.tintDrawable(
+                themeDrawableUtils.tintDrawable(
                     R.drawable.ic_cloud_sync_on,
-                    ThemeColorUtils.primaryColor(context, true)));
+                    themeColorUtils.primaryColor(context, true)));
         } else {
             syncStatusButton.setImageResource(R.drawable.ic_cloud_sync_off);
         }

+ 16 - 7
app/src/main/java/com/owncloud/android/ui/adapter/TemplateAdapter.java

@@ -38,8 +38,9 @@ import com.owncloud.android.databinding.TemplateButtonBinding;
 import com.owncloud.android.lib.common.Template;
 import com.owncloud.android.lib.common.TemplateList;
 import com.owncloud.android.utils.MimeTypeUtil;
-import com.owncloud.android.utils.theme.ThemeColorUtils;
 import com.owncloud.android.utils.glide.CustomGlideStreamLoader;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 
 import java.util.ArrayList;
 
@@ -60,21 +61,27 @@ public class TemplateAdapter extends RecyclerView.Adapter<TemplateAdapter.ViewHo
     private Template selectedTemplate;
     private final int colorSelected;
     private final int colorUnselected;
+    private final ThemeColorUtils themeColorUtils;
+    private final ThemeDrawableUtils themeDrawableUtils;
 
     public TemplateAdapter(
         String mimetype,
         ClickListener clickListener,
         Context context,
         CurrentAccountProvider currentAccountProvider,
-        ClientFactory clientFactory
-    ) {
+        ClientFactory clientFactory,
+        ThemeColorUtils themeColorUtils,
+        ThemeDrawableUtils themeDrawableUtils
+                          ) {
         this.mimetype = mimetype;
         this.clickListener = clickListener;
         this.context = context;
         this.currentAccountProvider = currentAccountProvider;
         this.clientFactory = clientFactory;
-        colorSelected = ThemeColorUtils.primaryColor(context, true);
+        colorSelected = themeColorUtils.primaryColor(context, true);
         colorUnselected = context.getResources().getColor(R.color.grey_200);
+        this.themeColorUtils = themeColorUtils;
+        this.themeDrawableUtils = themeDrawableUtils;
     }
 
     @NonNull
@@ -89,7 +96,7 @@ public class TemplateAdapter extends RecyclerView.Adapter<TemplateAdapter.ViewHo
 
     @Override
     public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
-        holder.setData(new ArrayList<>(templateList.getTemplates().values()).get(position));
+        holder.setData(new ArrayList<>(templateList.getTemplates().values()).get(position), themeColorUtils, themeDrawableUtils);
     }
 
     public void setTemplateList(TemplateList templateList) {
@@ -128,13 +135,15 @@ public class TemplateAdapter extends RecyclerView.Adapter<TemplateAdapter.ViewHo
             }
         }
 
-        public void setData(Template template) {
+        public void setData(Template template, ThemeColorUtils themeColorUtils, ThemeDrawableUtils themeDrawableUtils) {
             this.template = template;
 
             Drawable placeholder = MimeTypeUtil.getFileTypeIcon(mimetype,
                                                                 template.getTitle(),
                                                                 currentAccountProvider.getUser(),
-                                                                context);
+                                                                context,
+                                                                themeColorUtils,
+                                                                themeDrawableUtils);
 
             Glide.with(context).using(new CustomGlideStreamLoader(currentAccountProvider.getUser(), clientFactory))
                 .load(template.getPreview())

+ 19 - 6
app/src/main/java/com/owncloud/android/ui/adapter/TrashbinListAdapter.java

@@ -42,6 +42,8 @@ import com.owncloud.android.ui.interfaces.TrashbinActivityInterface;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.MimeTypeUtil;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -67,22 +69,27 @@ public class TrashbinListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
     private final User user;
     private final FileDataStorageManager storageManager;
     private final AppPreferences preferences;
-
     private final List<ThumbnailsCacheManager.ThumbnailGenerationTask> asyncTasks = new ArrayList<>();
+    private final ThemeColorUtils themeColorUtils;
+    private final ThemeDrawableUtils themeDrawableUtils;
 
     public TrashbinListAdapter(
         TrashbinActivityInterface trashbinActivityInterface,
         FileDataStorageManager storageManager,
         AppPreferences preferences,
         Context context,
-        User user
-    ) {
+        User user,
+        ThemeColorUtils themeColorUtils,
+        ThemeDrawableUtils themeDrawableUtils
+                              ) {
         this.files = new ArrayList<>();
         this.trashbinActivityInterface = trashbinActivityInterface;
         this.user = user;
         this.storageManager = storageManager;
         this.preferences = preferences;
         this.context = context;
+        this.themeColorUtils = themeColorUtils;
+        this.themeDrawableUtils = themeDrawableUtils;
     }
 
     public void setTrashbinFiles(List<Object> trashbinFiles, boolean clear) {
@@ -218,7 +225,9 @@ public class TrashbinListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
 
     private void setThumbnail(TrashbinFile file, ImageView thumbnailView) {
         if (file.isFolder()) {
-            thumbnailView.setImageDrawable(MimeTypeUtil.getDefaultFolderIcon(context));
+            thumbnailView.setImageDrawable(MimeTypeUtil.getDefaultFolderIcon(context,
+                                                                             themeColorUtils,
+                                                                             themeDrawableUtils));
         } else {
             if ((MimeTypeUtil.isImage(file) || MimeTypeUtil.isVideo(file)) && file.getRemoteId() != null) {
                 // Thumbnail in cache?
@@ -260,8 +269,12 @@ public class TrashbinListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
                     thumbnailView.setBackgroundColor(context.getResources().getColor(R.color.bg_default));
                 }
             } else {
-                thumbnailView.setImageDrawable(MimeTypeUtil.getFileTypeIcon(file.getMimeType(), file.getFileName(),
-                                                                            user, context));
+                thumbnailView.setImageDrawable(MimeTypeUtil.getFileTypeIcon(file.getMimeType(),
+                                                                            file.getFileName(),
+                                                                            user,
+                                                                            context,
+                                                                            themeColorUtils,
+                                                                            themeDrawableUtils));
             }
         }
     }

+ 6 - 2
app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchHeaderViewHolder.kt

@@ -27,11 +27,15 @@ import com.owncloud.android.databinding.UnifiedSearchHeaderBinding
 import com.owncloud.android.ui.unifiedsearch.UnifiedSearchSection
 import com.owncloud.android.utils.theme.ThemeColorUtils
 
-class UnifiedSearchHeaderViewHolder(val binding: UnifiedSearchHeaderBinding, val context: Context) :
+class UnifiedSearchHeaderViewHolder(
+    val binding: UnifiedSearchHeaderBinding,
+    val themeColorUtils: ThemeColorUtils,
+    val context: Context
+) :
     SectionedViewHolder(binding.root) {
 
     fun bind(section: UnifiedSearchSection) {
         binding.title.text = section.name
-        binding.title.setTextColor(ThemeColorUtils.primaryColor(context))
+        binding.title.setTextColor(themeColorUtils.primaryColor(context))
     }
 }

+ 6 - 3
app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchItemViewHolder.kt

@@ -43,6 +43,7 @@ import com.owncloud.android.utils.BitmapUtils
 import com.owncloud.android.utils.MimeTypeUtil
 import com.owncloud.android.utils.glide.CustomGlideStreamLoader
 import com.owncloud.android.utils.theme.ThemeColorUtils
+import com.owncloud.android.utils.theme.ThemeDrawableUtils
 
 @Suppress("LongParameterList")
 class UnifiedSearchItemViewHolder(
@@ -51,7 +52,9 @@ class UnifiedSearchItemViewHolder(
     val clientFactory: ClientFactory,
     private val storageManager: FileDataStorageManager,
     private val listInterface: UnifiedSearchListInterface,
-    val context: Context
+    val context: Context,
+    private val themeColorUtils: ThemeColorUtils,
+    private val themeDrawableUtils: ThemeDrawableUtils
 ) :
     SectionedViewHolder(binding.root) {
 
@@ -98,10 +101,10 @@ class UnifiedSearchItemViewHolder(
                 startsWith("icon-deck") ->
                     ResourcesCompat.getDrawable(context.resources, R.drawable.ic_deck, null)
                 else ->
-                    MimeTypeUtil.getFileTypeIcon(mimetype, entry.title, context)
+                    MimeTypeUtil.getFileTypeIcon(mimetype, entry.title, context, themeColorUtils, themeDrawableUtils)
             }
         }
-        val color = ThemeColorUtils.primaryColor(context)
+        val color = themeColorUtils.primaryColor(context)
         drawable!!.colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP)
         return drawable
     }

+ 16 - 11
app/src/main/java/com/owncloud/android/ui/adapter/UnifiedSearchListAdapter.kt

@@ -24,23 +24,24 @@
 package com.owncloud.android.ui.adapter
 
 import android.content.Context
-import com.owncloud.android.datamodel.FileDataStorageManager
-import com.owncloud.android.ui.interfaces.UnifiedSearchListInterface
-import com.nextcloud.client.account.User
-import com.nextcloud.client.network.ClientFactory
-import com.afollestad.sectionedrecyclerview.SectionedRecyclerViewAdapter
-import com.afollestad.sectionedrecyclerview.SectionedViewHolder
-import android.view.ViewGroup
 import android.view.LayoutInflater
 import android.view.View
+import android.view.ViewGroup
+import com.afollestad.sectionedrecyclerview.SectionedRecyclerViewAdapter
+import com.afollestad.sectionedrecyclerview.SectionedViewHolder
+import com.nextcloud.client.account.User
+import com.nextcloud.client.network.ClientFactory
 import com.owncloud.android.R
 import com.owncloud.android.databinding.UnifiedSearchEmptyBinding
 import com.owncloud.android.databinding.UnifiedSearchFooterBinding
 import com.owncloud.android.databinding.UnifiedSearchHeaderBinding
 import com.owncloud.android.databinding.UnifiedSearchItemBinding
+import com.owncloud.android.datamodel.FileDataStorageManager
 import com.owncloud.android.datamodel.ThumbnailsCacheManager.InitDiskCacheTask
+import com.owncloud.android.ui.interfaces.UnifiedSearchListInterface
 import com.owncloud.android.ui.unifiedsearch.UnifiedSearchSection
-import java.lang.IllegalArgumentException
+import com.owncloud.android.utils.theme.ThemeColorUtils
+import com.owncloud.android.utils.theme.ThemeDrawableUtils
 
 /**
  * This Adapter populates a SectionedRecyclerView with search results by unified search
@@ -50,7 +51,9 @@ class UnifiedSearchListAdapter(
     private val listInterface: UnifiedSearchListInterface,
     private val user: User,
     private val clientFactory: ClientFactory,
-    private val context: Context
+    private val context: Context,
+    private val themeColorUtils: ThemeColorUtils,
+    private val themeDrawableUtils: ThemeDrawableUtils
 ) : SectionedRecyclerViewAdapter<SectionedViewHolder>() {
     companion object {
         private const val VIEW_TYPE_EMPTY = Int.MAX_VALUE
@@ -65,7 +68,7 @@ class UnifiedSearchListAdapter(
                 val binding = UnifiedSearchHeaderBinding.inflate(
                     layoutInflater, parent, false
                 )
-                UnifiedSearchHeaderViewHolder(binding, context)
+                UnifiedSearchHeaderViewHolder(binding, themeColorUtils, context)
             }
             VIEW_TYPE_FOOTER -> {
                 val binding = UnifiedSearchFooterBinding.inflate(
@@ -85,7 +88,9 @@ class UnifiedSearchListAdapter(
                     clientFactory,
                     storageManager,
                     listInterface,
-                    context
+                    context,
+                    themeColorUtils,
+                    themeDrawableUtils
                 )
             }
             VIEW_TYPE_EMPTY -> {

+ 18 - 5
app/src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java

@@ -67,6 +67,7 @@ import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.theme.ThemeBarUtils;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 
 import java.io.File;
 import java.util.Arrays;
@@ -89,6 +90,9 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
     private Clock clock;
     private UploadGroup[] uploadGroups;
     private boolean showUser;
+    private ThemeColorUtils themeColorUtils;
+    private ThemeDrawableUtils themeDrawableUtils;
+    private ThemeBarUtils themeBarUtils;
 
     @Override
     public int getSectionCount() {
@@ -109,7 +113,7 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
         headerViewHolder.binding.uploadListTitle.setText(
             String.format(parentActivity.getString(R.string.uploads_view_group_header),
                           group.getGroupName(), group.getGroupItemCount()));
-        headerViewHolder.binding.uploadListTitle.setTextColor(ThemeColorUtils.primaryAccentColor(parentActivity));
+        headerViewHolder.binding.uploadListTitle.setTextColor(themeColorUtils.primaryAccentColor(parentActivity));
 
         headerViewHolder.binding.uploadListTitle.setOnClickListener(v -> toggleSectionExpanded(section));
 
@@ -167,7 +171,10 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
                              final UserAccountManager accountManager,
                              final ConnectivityService connectivityService,
                              final PowerManagementService powerManagementService,
-                             final Clock clock) {
+                             final Clock clock,
+                             final ThemeColorUtils themeColorUtils,
+                             final ThemeDrawableUtils themeDrawableUtils,
+                             final ThemeBarUtils themeBarUtils) {
         Log_OC.d(TAG, "UploadListAdapter");
         this.parentActivity = fileActivity;
         this.uploadsStorageManager = uploadsStorageManager;
@@ -176,6 +183,10 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
         this.connectivityService = connectivityService;
         this.powerManagementService = powerManagementService;
         this.clock = clock;
+        this.themeColorUtils = themeColorUtils;
+        this.themeDrawableUtils = themeDrawableUtils;
+        this.themeBarUtils = themeBarUtils;
+
         uploadGroups = new UploadGroup[3];
 
         shouldShowHeadersForEmptySections(false);
@@ -269,8 +280,8 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
         String status = getStatusText(item);
         switch (item.getUploadStatus()) {
             case UPLOAD_IN_PROGRESS:
-                ThemeBarUtils.colorHorizontalProgressBar(itemViewHolder.binding.uploadProgressBar,
-                                                         ThemeColorUtils.primaryAccentColor(parentActivity));
+                themeBarUtils.colorHorizontalProgressBar(itemViewHolder.binding.uploadProgressBar,
+                                                         themeColorUtils.primaryAccentColor(parentActivity));
                 itemViewHolder.binding.uploadProgressBar.setProgress(0);
                 itemViewHolder.binding.uploadProgressBar.setVisibility(View.VISIBLE);
 
@@ -483,7 +494,9 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
                 final Drawable icon = MimeTypeUtil.getFileTypeIcon(item.getMimeType(),
                                                                    fileName,
                                                                    user,
-                                                                   parentActivity);
+                                                                   parentActivity,
+                                                                   themeColorUtils,
+                                                                   themeDrawableUtils);
                 itemViewHolder.binding.thumbnail.setImageDrawable(icon);
             }
         }

+ 25 - 12
app/src/main/java/com/owncloud/android/ui/adapter/UploaderAdapter.java

@@ -38,6 +38,8 @@ import com.owncloud.android.datamodel.ThumbnailsCacheManager;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager.AsyncThumbnailDrawable;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.MimeTypeUtil;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 
 import java.util.HashMap;
 import java.util.List;
@@ -45,20 +47,29 @@ import java.util.Map;
 
 public class UploaderAdapter extends SimpleAdapter {
 
-    private Context mContext;
-    private User user;
-    private FileDataStorageManager mStorageManager;
-    private LayoutInflater inflater;
+    private final Context mContext;
+    private final User user;
+    private final FileDataStorageManager mStorageManager;
+    private final LayoutInflater inflater;
+    private final ThemeColorUtils themeColorUtils;
+    private final ThemeDrawableUtils themeDrawableUtils;
 
     public UploaderAdapter(Context context,
-                           List<? extends Map<String, ?>> data, int resource, String[] from,
-                           int[] to, FileDataStorageManager storageManager, User user) {
+                           List<? extends Map<String, ?>> data,
+                           int resource,
+                           String[] from,
+                           int[] to,
+                           FileDataStorageManager storageManager,
+                           User user,
+                           ThemeColorUtils themeColorUtils,
+                           ThemeDrawableUtils themeDrawableUtils) {
         super(context, data, resource, from, to);
         this.user = user;
         mStorageManager = storageManager;
         mContext = context;
-        inflater = (LayoutInflater) mContext
-                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+        this.themeColorUtils = themeColorUtils;
+        this.themeDrawableUtils = themeDrawableUtils;
     }
 
     @Override
@@ -99,7 +110,9 @@ public class UploaderAdapter extends SimpleAdapter {
                                                                  file.isEncrypted(),
                                                                  user,
                                                                  file.getMountType(),
-                                                                 mContext);
+                                                                 mContext,
+                                                                 themeColorUtils,
+                                                                 themeDrawableUtils);
             fileIcon.setImageDrawable(icon);
         } else {
             // get Thumbnail if file is image
@@ -135,13 +148,13 @@ public class UploaderAdapter extends SimpleAdapter {
                 final Drawable icon = MimeTypeUtil.getFileTypeIcon(file.getMimeType(),
                                                                    file.getFileName(),
                                                                    user,
-                                                                   mContext);
+                                                                   mContext,
+                                                                   themeColorUtils,
+                                                                   themeDrawableUtils);
                 fileIcon.setImageDrawable(icon);
             }
         }
 
         return vi;
     }
-
-
 }

+ 19 - 10
app/src/main/java/com/owncloud/android/ui/adapter/UserListAdapter.java

@@ -58,24 +58,28 @@ public class UserListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
                                 implements DisplayUtils.AvatarGenerationListener {
     private static final String TAG = UserListAdapter.class.getSimpleName();
 
-    private float accountAvatarRadiusDimension;
+    private final float accountAvatarRadiusDimension;
     private final BaseActivity context;
     private List<UserListItem> values;
     private Listener accountListAdapterListener;
-    private UserAccountManager accountManager;
+    private final UserAccountManager accountManager;
 
     public static final String KEY_DISPLAY_NAME = "DISPLAY_NAME";
     public static final int KEY_USER_INFO_REQUEST_CODE = 13;
-    private ClickListener clickListener;
-    private boolean showAddAccount;
-    private boolean showDotsMenu;
+    private final ClickListener clickListener;
+    private final boolean showAddAccount;
+    private final boolean showDotsMenu;
+    private final ThemeColorUtils themeColorUtils;
+    private final ThemeDrawableUtils themeDrawableUtils;
 
     public UserListAdapter(BaseActivity context,
                            UserAccountManager accountManager,
                            List<UserListItem> values,
                            ClickListener clickListener,
                            boolean showAddAccount,
-                           boolean showDotsMenu) {
+                           boolean showDotsMenu,
+                           ThemeColorUtils themeColorUtils,
+                           ThemeDrawableUtils themeDrawableUtils) {
         this.context = context;
         this.accountManager = accountManager;
         this.values = values;
@@ -86,6 +90,8 @@ public class UserListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
         this.clickListener = clickListener;
         this.showAddAccount = showAddAccount;
         this.showDotsMenu = showDotsMenu;
+        this.themeColorUtils = themeColorUtils;
+        this.themeDrawableUtils = themeDrawableUtils;
     }
 
     @Override
@@ -100,7 +106,10 @@ public class UserListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
     public @NonNull
     RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
         if (UserListItem.TYPE_ACCOUNT == viewType) {
-            return new AccountViewHolderItem(AccountItemBinding.inflate(LayoutInflater.from(context), parent, false));
+            return new AccountViewHolderItem(AccountItemBinding.inflate(LayoutInflater.from(context),
+                                                                        parent,
+                                                                        false),
+                                             themeDrawableUtils);
         } else {
             return new AddAccountViewHolderItem(
                 AccountActionBinding.inflate(LayoutInflater.from(context), parent, false));
@@ -186,14 +195,14 @@ public class UserListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolde
      */
     class AccountViewHolderItem extends RecyclerView.ViewHolder implements View.OnClickListener {
 
-        private AccountItemBinding binding;
+        private final AccountItemBinding binding;
         private User user;
 
-        AccountViewHolderItem(@NonNull AccountItemBinding binding) {
+        AccountViewHolderItem(@NonNull AccountItemBinding binding, ThemeDrawableUtils themeDrawableUtils) {
             super(binding.getRoot());
             this.binding = binding;
 
-            ThemeDrawableUtils.tintDrawable(binding.ticker.getDrawable(), ThemeColorUtils.primaryColor(context, true));
+            themeDrawableUtils.tintDrawable(binding.ticker.getDrawable(), themeColorUtils.primaryColor(context, true));
 
             binding.getRoot().setOnClickListener(this);
             if (showDotsMenu) {

+ 10 - 2
app/src/main/java/com/owncloud/android/ui/asynctasks/RetrieveHoverCardAsyncTask.java

@@ -32,6 +32,8 @@ import com.owncloud.android.R;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 import com.owncloud.android.ui.fragment.ProfileBottomSheetDialog;
 import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 
 import java.lang.ref.WeakReference;
 
@@ -43,15 +45,21 @@ public class RetrieveHoverCardAsyncTask extends AsyncTask<Void, Void, HoverCard>
     private final String userId;
     private final WeakReference<FragmentActivity> activityWeakReference;
     private final ClientFactory clientFactory;
+    private final ThemeColorUtils themeColorUtils;
+    private final ThemeDrawableUtils themeDrawableUtils;
 
     public RetrieveHoverCardAsyncTask(User user,
                                       String userId,
                                       FragmentActivity activity,
-                                      ClientFactory clientFactory) {
+                                      ClientFactory clientFactory,
+                                      ThemeColorUtils themeColorUtils,
+                                      ThemeDrawableUtils themeDrawableUtils) {
         this.user = user;
         this.userId = userId;
         this.activityWeakReference = new WeakReference<>(activity);
         this.clientFactory = clientFactory;
+        this.themeColorUtils = themeColorUtils;
+        this.themeDrawableUtils = themeDrawableUtils;
     }
 
     @Override
@@ -76,7 +84,7 @@ public class RetrieveHoverCardAsyncTask extends AsyncTask<Void, Void, HoverCard>
 
         if (activity != null && activity.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) {
             if (hoverCard.getActions().size() > 0) {
-                new ProfileBottomSheetDialog(activity, user, hoverCard).show();
+                new ProfileBottomSheetDialog(activity, user, hoverCard, themeColorUtils, themeDrawableUtils).show();
             } else {
                 DisplayUtils.showSnackMessage(activity, R.string.no_actions);
             }

+ 5 - 1
app/src/main/java/com/owncloud/android/ui/dialog/AccountRemovalConfirmationDialog.java

@@ -30,6 +30,7 @@ import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.jobs.BackgroundJobManager;
 import com.owncloud.android.R;
 import com.owncloud.android.utils.theme.ThemeButtonUtils;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
 
 import javax.inject.Inject;
 
@@ -42,6 +43,8 @@ public class AccountRemovalConfirmationDialog extends DialogFragment implements
     private static final String KEY_USER = "USER";
 
     @Inject BackgroundJobManager backgroundJobManager;
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeButtonUtils themeButtonUtils;
     private User user;
 
     public static AccountRemovalConfirmationDialog newInstance(User user) {
@@ -66,7 +69,8 @@ public class AccountRemovalConfirmationDialog extends DialogFragment implements
 
         AlertDialog alertDialog = (AlertDialog) getDialog();
 
-        ThemeButtonUtils.themeBorderlessButton(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
+        themeButtonUtils.themeBorderlessButton(themeColorUtils,
+                                               alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
                                                alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
     }
 

+ 15 - 6
app/src/main/java/com/owncloud/android/ui/dialog/ChooseRichDocumentsTemplateDialogFragment.java

@@ -83,11 +83,14 @@ public class ChooseRichDocumentsTemplateDialogFragment extends DialogFragment im
     private static final String DOT = ".";
     public static final int SINGLE_TEMPLATE = 1;
 
+    @Inject CurrentAccountProvider currentAccount;
+    @Inject ClientFactory clientFactory;
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeButtonUtils themeButtonUtils;
+    @Inject ThemeTextInputUtils themeTextInputUtils;
     private RichDocumentsTemplateAdapter adapter;
     private OCFile parentFolder;
     private OwnCloudClient client;
-    @Inject CurrentAccountProvider currentAccount;
-    @Inject ClientFactory clientFactory;
     private Button positiveButton;
 
     public enum Type {
@@ -115,7 +118,8 @@ public class ChooseRichDocumentsTemplateDialogFragment extends DialogFragment im
         AlertDialog alertDialog = (AlertDialog) getDialog();
 
         positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
-        ThemeButtonUtils.themeBorderlessButton(positiveButton,
+        themeButtonUtils.themeBorderlessButton(themeColorUtils,
+                                               positiveButton,
                                                alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
         positiveButton.setOnClickListener(this);
         positiveButton.setEnabled(false);
@@ -150,16 +154,21 @@ public class ChooseRichDocumentsTemplateDialogFragment extends DialogFragment im
         View view = binding.getRoot();
 
         binding.filename.requestFocus();
-        ThemeTextInputUtils.colorTextInput(binding.filenameContainer,
+        themeTextInputUtils.colorTextInput(binding.filenameContainer,
                                            binding.filename,
-                                           ThemeColorUtils.primaryColor(getContext()));
+                                           themeColorUtils.primaryColor(getContext()));
 
         Type type = Type.valueOf(arguments.getString(ARG_TYPE));
         new FetchTemplateTask(this, client).execute(type);
 
         binding.list.setHasFixedSize(true);
         binding.list.setLayoutManager(new GridLayoutManager(activity, 2));
-        adapter = new RichDocumentsTemplateAdapter(type, this, getContext(), currentAccount, clientFactory);
+        adapter = new RichDocumentsTemplateAdapter(type,
+                                                   this,
+                                                   getContext(),
+                                                   currentAccount,
+                                                   clientFactory,
+                                                   themeColorUtils);
         binding.list.setAdapter(adapter);
 
         // Build the dialog

+ 20 - 7
app/src/main/java/com/owncloud/android/ui/dialog/ChooseTemplateDialogFragment.java

@@ -64,6 +64,7 @@ import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.theme.ThemeButtonUtils;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 import com.owncloud.android.utils.theme.ThemeTextInputUtils;
 
 import java.lang.ref.WeakReference;
@@ -88,13 +89,17 @@ public class ChooseTemplateDialogFragment extends DialogFragment implements View
     private static final String DOT = ".";
     public static final int SINGLE_TEMPLATE = 1;
 
+    @Inject ClientFactory clientFactory;
+    @Inject CurrentAccountProvider currentAccount;
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeDrawableUtils themeDrawableUtils;
+    @Inject ThemeButtonUtils themeButtonUtils;
+    @Inject ThemeTextInputUtils themeTextInputUtils;
     private TemplateAdapter adapter;
     private OCFile parentFolder;
     private String title;
-    @Inject ClientFactory clientFactory;
-    private Creator creator;
-    @Inject CurrentAccountProvider currentAccount;
     private Button positiveButton;
+    private Creator creator;
 
     public enum Type {
         DOCUMENT,
@@ -121,7 +126,9 @@ public class ChooseTemplateDialogFragment extends DialogFragment implements View
         AlertDialog alertDialog = (AlertDialog) getDialog();
 
         positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
-        ThemeButtonUtils.themeBorderlessButton(positiveButton, alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
+        themeButtonUtils.themeBorderlessButton(themeColorUtils,
+                                               positiveButton,
+                                               alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
         positiveButton.setOnClickListener(this);
         positiveButton.setEnabled(false);
 
@@ -157,9 +164,9 @@ public class ChooseTemplateDialogFragment extends DialogFragment implements View
         View view = binding.getRoot();
 
         binding.filename.requestFocus();
-        ThemeTextInputUtils.colorTextInput(binding.filenameContainer,
+        themeTextInputUtils.colorTextInput(binding.filenameContainer,
                                            binding.filename,
-                                           ThemeColorUtils.primaryColor(getContext()));
+                                           themeColorUtils.primaryColor(getContext()));
 
         binding.filename.setOnKeyListener((v, keyCode, event) -> {
             checkEnablingCreateButton();
@@ -192,7 +199,13 @@ public class ChooseTemplateDialogFragment extends DialogFragment implements View
 
         binding.list.setHasFixedSize(true);
         binding.list.setLayoutManager(new GridLayoutManager(activity, 2));
-        adapter = new TemplateAdapter(creator.getMimetype(), this, getContext(), currentAccount, clientFactory);
+        adapter = new TemplateAdapter(creator.getMimetype(),
+                                      this,
+                                      getContext(),
+                                      currentAccount,
+                                      clientFactory,
+                                      themeColorUtils,
+                                      themeDrawableUtils);
         binding.list.setAdapter(adapter);
 
         // Build the dialog

+ 10 - 2
app/src/main/java/com/owncloud/android/ui/dialog/ConfirmationDialogFragment.java

@@ -20,15 +20,19 @@ import android.app.Activity;
 import android.app.Dialog;
 import android.os.Bundle;
 
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.utils.theme.ThemeButtonUtils;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
+
+import javax.inject.Inject;
 
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
 
 
-public class ConfirmationDialogFragment extends DialogFragment {
+public class ConfirmationDialogFragment extends DialogFragment implements Injectable {
 
     final static String ARG_MESSAGE_RESOURCE_ID = "resource_id";
     final static String ARG_MESSAGE_ARGUMENTS = "string_array";
@@ -40,6 +44,9 @@ public class ConfirmationDialogFragment extends DialogFragment {
 
     public static final String FTAG_CONFIRMATION = "CONFIRMATION_FRAGMENT";
 
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeButtonUtils themeButtonUtils;
+
     private ConfirmationDialogFragmentListener mListener;
 
     /**
@@ -77,7 +84,8 @@ public class ConfirmationDialogFragment extends DialogFragment {
 
         AlertDialog alertDialog = (AlertDialog) getDialog();
 
-        ThemeButtonUtils.themeBorderlessButton(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
+        themeButtonUtils.themeBorderlessButton(themeColorUtils,
+                                               alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
                                                alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE),
                                                alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
     }

+ 25 - 8
app/src/main/java/com/owncloud/android/ui/dialog/ConflictsResolveDialog.java

@@ -30,6 +30,7 @@ import android.widget.Button;
 import android.widget.Toast;
 
 import com.nextcloud.client.account.User;
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.databinding.ConflictResolveDialogBinding;
 import com.owncloud.android.datamodel.FileDataStorageManager;
@@ -41,11 +42,14 @@ import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.theme.ThemeButtonUtils;
 import com.owncloud.android.utils.theme.ThemeCheckableUtils;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
@@ -58,7 +62,7 @@ import androidx.fragment.app.FragmentTransaction;
 /**
  * Dialog which will be displayed to user upon keep-in-sync file conflict.
  */
-public class ConflictsResolveDialog extends DialogFragment {
+public class ConflictsResolveDialog extends DialogFragment implements Injectable {
 
     private ConflictResolveDialogBinding binding;
 
@@ -66,8 +70,12 @@ public class ConflictsResolveDialog extends DialogFragment {
     private File newFile;
     public OnConflictDecisionMadeListener listener;
     private User user;
-    private List<ThumbnailsCacheManager.ThumbnailGenerationTask> asyncTasks = new ArrayList<>();
+    private final List<ThumbnailsCacheManager.ThumbnailGenerationTask> asyncTasks = new ArrayList<>();
     private Button positiveButton;
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeDrawableUtils themeDrawableUtils;
+    @Inject ThemeButtonUtils themeButtonUtils;
+    @Inject ThemeCheckableUtils themeCheckableUtils;
 
     private static final String KEY_NEW_FILE = "file";
     private static final String KEY_EXISTING_FILE = "ocfile";
@@ -115,7 +123,9 @@ public class ConflictsResolveDialog extends DialogFragment {
         }
 
         positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
-        ThemeButtonUtils.themeBorderlessButton(positiveButton, alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
+        themeButtonUtils.themeBorderlessButton(themeColorUtils,
+                                               positiveButton,
+                                               alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
         positiveButton.setEnabled(false);
     }
 
@@ -151,7 +161,7 @@ public class ConflictsResolveDialog extends DialogFragment {
         // Inflate the layout for the dialog
         binding = ConflictResolveDialogBinding.inflate(requireActivity().getLayoutInflater());
 
-        ThemeCheckableUtils.tintCheckbox(ThemeColorUtils.primaryColor(getContext()),
+        themeCheckableUtils.tintCheckbox(themeColorUtils.primaryColor(getContext()),
                                          binding.newCheckbox,
                                          binding.existingCheckbox);
 
@@ -188,7 +198,11 @@ public class ConflictsResolveDialog extends DialogFragment {
         binding.newSize.setText(DisplayUtils.bytesToHumanReadable(newFile.length()));
         binding.newTimestamp.setText(DisplayUtils.getRelativeTimestamp(getContext(), newFile.lastModified()));
         binding.newThumbnail.setTag(newFile.hashCode());
-        LocalFileListAdapter.setThumbnail(newFile, binding.newThumbnail, getContext());
+        LocalFileListAdapter.setThumbnail(newFile,
+                                          binding.newThumbnail,
+                                          getContext(),
+                                          themeColorUtils,
+                                          themeDrawableUtils);
 
         // set info for existing file
         binding.existingSize.setText(DisplayUtils.bytesToHumanReadable(existingFile.getFileLength()));
@@ -203,11 +217,14 @@ public class ConflictsResolveDialog extends DialogFragment {
                                                              requireContext().getContentResolver()),
                                   asyncTasks,
                                   false,
-                                  getContext());
+                                  getContext(),
+                                  null,
+                                  null,
+                                  themeColorUtils,
+                                  themeDrawableUtils);
 
-        View.OnClickListener checkBoxClickListener = v -> {
+        View.OnClickListener checkBoxClickListener = v ->
             positiveButton.setEnabled(binding.newCheckbox.isChecked() || binding.existingCheckbox.isChecked());
-        };
 
         binding.newCheckbox.setOnClickListener(checkBoxClickListener);
         binding.existingCheckbox.setOnClickListener(checkBoxClickListener);

+ 17 - 9
app/src/main/java/com/owncloud/android/ui/dialog/CreateFolderDialogFragment.java

@@ -30,6 +30,7 @@ import android.view.Window;
 import android.view.WindowManager.LayoutParams;
 import android.widget.TextView;
 
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.databinding.EditBoxDialogBinding;
 import com.owncloud.android.datamodel.OCFile;
@@ -40,29 +41,35 @@ import com.owncloud.android.utils.theme.ThemeButtonUtils;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
 import com.owncloud.android.utils.theme.ThemeTextInputUtils;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
 
 /**
- *  Dialog to input the name for a new folder to create.
- *
- *  Triggers the folder creation when name is confirmed.
+ * Dialog to input the name for a new folder to create.
+ * <p>
+ * Triggers the folder creation when name is confirmed.
  */
 public class CreateFolderDialogFragment
-        extends DialogFragment implements DialogInterface.OnClickListener {
+    extends DialogFragment implements DialogInterface.OnClickListener, Injectable {
 
     private static final String ARG_PARENT_FOLDER = "PARENT_FOLDER";
 
     public static final String CREATE_FOLDER_FRAGMENT = "CREATE_FOLDER_FRAGMENT";
 
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeButtonUtils themeButtonUtils;
+    @Inject ThemeTextInputUtils themeTextInputUtils;
+
     private OCFile mParentFolder;
 
     /**
      * Public factory method to create new CreateFolderDialogFragment instances.
      *
-     * @param parentFolder            Folder to create
-     * @return                        Dialog ready to show.
+     * @param parentFolder Folder to create
+     * @return Dialog ready to show.
      */
     public static CreateFolderDialogFragment newInstance(OCFile parentFolder) {
         CreateFolderDialogFragment frag = new CreateFolderDialogFragment();
@@ -79,14 +86,15 @@ public class CreateFolderDialogFragment
 
         AlertDialog alertDialog = (AlertDialog) getDialog();
 
-        ThemeButtonUtils.themeBorderlessButton(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
+        themeButtonUtils.themeBorderlessButton(themeColorUtils,
+                                               alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
                                                alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
     }
 
     @NonNull
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        int primaryColor = ThemeColorUtils.primaryColor(getActivity());
+        int primaryColor = themeColorUtils.primaryColor(getActivity());
         mParentFolder = getArguments().getParcelable(ARG_PARENT_FOLDER);
 
         // Inflate the layout for the dialog
@@ -97,7 +105,7 @@ public class CreateFolderDialogFragment
         // Setup layout
         binding.userInput.setText("");
         binding.userInput.requestFocus();
-        ThemeTextInputUtils.colorTextInput(binding.userInputContainer, binding.userInput, primaryColor);
+        themeTextInputUtils.colorTextInput(binding.userInputContainer, binding.userInput, primaryColor);
 
         // Build the dialog
         AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

+ 10 - 6
app/src/main/java/com/owncloud/android/ui/dialog/ExpirationDatePickerDialogFragment.java

@@ -30,20 +30,23 @@ import android.os.Bundle;
 import android.text.format.DateUtils;
 import android.widget.DatePicker;
 
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
 
 import java.util.Calendar;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.fragment.app.DialogFragment;
 
 /**
- *  Dialog requesting a date after today.
+ * Dialog requesting a date after today.
  */
 public class ExpirationDatePickerDialogFragment
-        extends DialogFragment
-        implements DatePickerDialog.OnDateSetListener {
+    extends DialogFragment
+    implements DatePickerDialog.OnDateSetListener, Injectable {
 
     /** Tag for FragmentsManager */
     public static final String DATE_PICKER_DIALOG = "DATE_PICKER_DIALOG";
@@ -51,6 +54,7 @@ public class ExpirationDatePickerDialogFragment
     /** Parameter constant for date chosen initially */
     private static final String ARG_CHOSEN_DATE_IN_MILLIS = "CHOSEN_DATE_IN_MILLIS";
 
+    @Inject ThemeColorUtils themeColorUtils;
     private OnExpiryDateListener onExpiryDateListener;
 
     /**
@@ -110,9 +114,9 @@ public class ExpirationDatePickerDialogFragment
         }
 
         dialog.show();
-        dialog.getButton(DatePickerDialog.BUTTON_NEUTRAL).setTextColor(ThemeColorUtils.primaryColor(getContext(), true));
-        dialog.getButton(DatePickerDialog.BUTTON_NEGATIVE).setTextColor(ThemeColorUtils.primaryColor(getContext(), true));
-        dialog.getButton(DatePickerDialog.BUTTON_POSITIVE).setTextColor(ThemeColorUtils.primaryColor(getContext(), true));
+        dialog.getButton(DatePickerDialog.BUTTON_NEUTRAL).setTextColor(themeColorUtils.primaryColor(getContext(), true));
+        dialog.getButton(DatePickerDialog.BUTTON_NEGATIVE).setTextColor(themeColorUtils.primaryColor(getContext(), true));
+        dialog.getButton(DatePickerDialog.BUTTON_POSITIVE).setTextColor(themeColorUtils.primaryColor(getContext(), true));
 
         // Prevent days in the past may be chosen
         DatePicker picker = dialog.getDatePicker();

+ 6 - 2
app/src/main/java/com/owncloud/android/ui/dialog/IndeterminateProgressDialog.java

@@ -27,18 +27,22 @@ import android.os.Bundle;
 import android.view.KeyEvent;
 import android.widget.ProgressBar;
 
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.fragment.app.DialogFragment;
 
 
-public class IndeterminateProgressDialog extends DialogFragment {
+public class IndeterminateProgressDialog extends DialogFragment implements Injectable {
 
     private static final String ARG_MESSAGE_ID = IndeterminateProgressDialog.class.getCanonicalName() + ".ARG_MESSAGE_ID";
     private static final String ARG_CANCELABLE = IndeterminateProgressDialog.class.getCanonicalName() + ".ARG_CANCELABLE";
 
+    @Inject ThemeColorUtils themeColorUtils;
 
     /**
      * Public factory method to get dialog instances.
@@ -71,7 +75,7 @@ public class IndeterminateProgressDialog extends DialogFragment {
             @Override
             public void onShow(DialogInterface dialog) {
                 ProgressBar v = progressDialog.findViewById(android.R.id.progress);
-                v.getIndeterminateDrawable().setColorFilter(ThemeColorUtils.primaryAccentColor(getContext()),
+                v.getIndeterminateDrawable().setColorFilter(themeColorUtils.primaryAccentColor(getContext()),
                                                             android.graphics.PorterDuff.Mode.MULTIPLY);
 
             }

+ 6 - 2
app/src/main/java/com/owncloud/android/ui/dialog/LoadingDialog.java

@@ -28,14 +28,18 @@ import android.view.Window;
 import android.widget.ProgressBar;
 import android.widget.TextView;
 
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.fragment.app.DialogFragment;
 
-public class LoadingDialog extends DialogFragment {
+public class LoadingDialog extends DialogFragment implements Injectable {
 
+    @Inject ThemeColorUtils themeColorUtils;
     private String mMessage;
 
     @Override
@@ -62,7 +66,7 @@ public class LoadingDialog extends DialogFragment {
 
         // set progress wheel color
         ProgressBar progressBar = v.findViewById(R.id.loadingBar);
-        progressBar.getIndeterminateDrawable().setColorFilter(ThemeColorUtils.primaryAccentColor(getContext()),
+        progressBar.getIndeterminateDrawable().setColorFilter(themeColorUtils.primaryAccentColor(getContext()),
                                                               PorterDuff.Mode.SRC_IN);
 
         return v;

+ 10 - 2
app/src/main/java/com/owncloud/android/ui/dialog/LocalStoragePathPickerDialogFragment.java

@@ -27,12 +27,14 @@ import android.os.Environment;
 import android.view.LayoutInflater;
 import android.view.View;
 
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.databinding.StoragePathDialogBinding;
 import com.owncloud.android.ui.adapter.StoragePathAdapter;
 import com.owncloud.android.ui.adapter.StoragePathItem;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.theme.ThemeButtonUtils;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -40,6 +42,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
@@ -50,12 +54,15 @@ import androidx.recyclerview.widget.LinearLayoutManager;
  * Picker dialog for choosing a (storage) path.
  */
 public class LocalStoragePathPickerDialogFragment extends DialogFragment
-    implements DialogInterface.OnClickListener, StoragePathAdapter.StoragePathAdapterListener {
+    implements DialogInterface.OnClickListener, StoragePathAdapter.StoragePathAdapterListener, Injectable {
 
     public static final String LOCAL_STORAGE_PATH_PICKER_FRAGMENT = "LOCAL_STORAGE_PATH_PICKER_FRAGMENT";
 
     private static Set<String> internalStoragePaths = new HashSet<>();
 
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeButtonUtils themeButtonUtils;
+
     static {
         internalStoragePaths.add("/storage/emulated/legacy");
         internalStoragePaths.add("/storage/emulated/0");
@@ -75,7 +82,8 @@ public class LocalStoragePathPickerDialogFragment extends DialogFragment
         AlertDialog alertDialog = (AlertDialog) getDialog();
 
         if (alertDialog != null) {
-            ThemeButtonUtils.themeBorderlessButton(alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE));
+            themeButtonUtils.themeBorderlessButton(themeColorUtils,
+                                                   alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE));
         }
     }
 

+ 7 - 1
app/src/main/java/com/owncloud/android/ui/dialog/MultipleAccountsDialog.java

@@ -42,6 +42,8 @@ import com.owncloud.android.databinding.MultipleAccountsBinding;
 import com.owncloud.android.ui.activity.ReceiveExternalFilesActivity;
 import com.owncloud.android.ui.adapter.UserListAdapter;
 import com.owncloud.android.ui.adapter.UserListItem;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -56,6 +58,8 @@ import androidx.recyclerview.widget.LinearLayoutManager;
 public class MultipleAccountsDialog extends DialogFragment implements Injectable, UserListAdapter.ClickListener {
 
     @Inject UserAccountManager accountManager;
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeDrawableUtils themeDrawableUtils;
 
     @NonNull
     @Override
@@ -77,7 +81,9 @@ public class MultipleAccountsDialog extends DialogFragment implements Injectable
                                                       getAccountListItems(),
                                                       this,
                                                       false,
-                                                      false);
+                                                      false,
+                                                      themeColorUtils,
+                                                      themeDrawableUtils);
 
         binding.list.setHasFixedSize(true);
         binding.list.setLayoutManager(new LinearLayoutManager(activity));

+ 11 - 5
app/src/main/java/com/owncloud/android/ui/dialog/NoteDialogFragment.java

@@ -29,6 +29,7 @@ import android.view.View;
 import android.view.Window;
 import android.view.WindowManager.LayoutParams;
 
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.databinding.NoteDialogBinding;
 import com.owncloud.android.lib.resources.shares.OCShare;
@@ -38,6 +39,8 @@ import com.owncloud.android.utils.theme.ThemeButtonUtils;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
 import com.owncloud.android.utils.theme.ThemeTextInputUtils;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
@@ -46,11 +49,13 @@ import androidx.fragment.app.DialogFragment;
 /**
  * Dialog to input a multiline note for a share
  */
-public class NoteDialogFragment extends DialogFragment implements DialogInterface.OnClickListener {
+public class NoteDialogFragment extends DialogFragment implements DialogInterface.OnClickListener, Injectable {
 
     private static final String ARG_SHARE = "SHARE";
 
-    public static final String NOTE_FRAGMENT = "NOTE_FRAGMENT";
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeButtonUtils themeButtonUtils;
+    @Inject ThemeTextInputUtils themeTextInputUtils;
 
     private OCShare share;
     private NoteDialogBinding binding;
@@ -81,14 +86,15 @@ public class NoteDialogFragment extends DialogFragment implements DialogInterfac
 
         AlertDialog alertDialog = (AlertDialog) getDialog();
 
-        ThemeButtonUtils.themeBorderlessButton(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
+        themeButtonUtils.themeBorderlessButton(themeColorUtils,
+                                               alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
                                                alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
     }
 
     @NonNull
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        int primaryColor = ThemeColorUtils.primaryColor(getContext());
+        int primaryColor = themeColorUtils.primaryColor(getContext());
 
         // Inflate the layout for the dialog
         LayoutInflater inflater = requireActivity().getLayoutInflater();
@@ -98,7 +104,7 @@ public class NoteDialogFragment extends DialogFragment implements DialogInterfac
         // Setup layout
         binding.noteText.setText(share.getNote());
         binding.noteText.requestFocus();
-        ThemeTextInputUtils.colorTextInput(binding.noteContainer, binding.noteText, primaryColor);
+        themeTextInputUtils.colorTextInput(binding.noteContainer, binding.noteText, primaryColor);
 
         // Build the dialog
         AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity());

+ 11 - 6
app/src/main/java/com/owncloud/android/ui/dialog/RemoveFilesDialogFragment.java

@@ -23,6 +23,7 @@ import android.app.Dialog;
 import android.os.Bundle;
 import android.view.ActionMode;
 
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.ui.activity.ComponentsGetter;
@@ -32,20 +33,24 @@ import com.owncloud.android.utils.theme.ThemeColorUtils;
 import java.util.ArrayList;
 import java.util.Collection;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.AlertDialog;
 
 /**
- *  Dialog requiring confirmation before removing a collection of given OCFiles.
- *
- *  Triggers the removal according to the user response.
+ * Dialog requiring confirmation before removing a collection of given OCFiles.
+ * <p>
+ * Triggers the removal according to the user response.
  */
 public class RemoveFilesDialogFragment extends ConfirmationDialogFragment implements
-        ConfirmationDialogFragmentListener {
+    ConfirmationDialogFragmentListener, Injectable {
 
     private static final int SINGLE_SELECTION = 1;
     private static final String ARG_TARGET_FILES = "TARGET_FILES";
 
+    @Inject ThemeColorUtils themeColorUtils;
+
     private Collection<OCFile> mTargetFiles;
     private ActionMode actionMode;
 
@@ -54,7 +59,7 @@ public class RemoveFilesDialogFragment extends ConfirmationDialogFragment implem
      *
      * @param files           Files to remove.
      * @param actionMode      ActionMode to finish on confirmation
-     * @return                Dialog ready to show.
+     * @return Dialog ready to show.
      */
     public static RemoveFilesDialogFragment newInstance(ArrayList<OCFile> files, ActionMode actionMode) {
         RemoveFilesDialogFragment dialogFragment = newInstance(files);
@@ -128,7 +133,7 @@ public class RemoveFilesDialogFragment extends ConfirmationDialogFragment implem
     public void onStart() {
         super.onStart();
 
-        int color = ThemeColorUtils.primaryAccentColor(getActivity());
+        int color = themeColorUtils.primaryAccentColor(getActivity());
 
         AlertDialog alertDialog = (AlertDialog) getDialog();
 

+ 15 - 9
app/src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java

@@ -37,6 +37,7 @@ import android.view.View;
 import android.view.Window;
 import android.view.WindowManager.LayoutParams;
 
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.databinding.EditBoxDialogBinding;
 import com.owncloud.android.datamodel.OCFile;
@@ -46,21 +47,26 @@ import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
 import com.owncloud.android.utils.theme.ThemeTextInputUtils;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
 
 
 /**
- *  Dialog to input a new name for a file or folder to rename.
- *
- *  Triggers the rename operation when name is confirmed.
+ * Dialog to input a new name for a file or folder to rename.
+ * <p>
+ * Triggers the rename operation when name is confirmed.
  */
 public class RenameFileDialogFragment
-    extends DialogFragment implements DialogInterface.OnClickListener {
+    extends DialogFragment implements DialogInterface.OnClickListener, Injectable {
 
     private static final String ARG_TARGET_FILE = "TARGET_FILE";
 
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeTextInputUtils themeTextInputUtils;
+
     private EditBoxDialogBinding binding;
     private OCFile mTargetFile;
 
@@ -68,7 +74,7 @@ public class RenameFileDialogFragment
      * Public factory method to create new RenameFileDialogFragment instances.
      *
      * @param file            File to rename.
-     * @return                Dialog ready to show.
+     * @return Dialog ready to show.
      */
     public static RenameFileDialogFragment newInstance(OCFile file) {
         RenameFileDialogFragment frag = new RenameFileDialogFragment();
@@ -83,7 +89,7 @@ public class RenameFileDialogFragment
     public void onStart() {
         super.onStart();
 
-        int color = ThemeColorUtils.primaryAccentColor(getContext());
+        int color = themeColorUtils.primaryAccentColor(getContext());
 
         AlertDialog alertDialog = (AlertDialog) getDialog();
 
@@ -106,9 +112,9 @@ public class RenameFileDialogFragment
         // Setup layout
         String currentName = mTargetFile.getFileName();
         binding.userInput.setText(currentName);
-        ThemeTextInputUtils.colorTextInput(binding.userInputContainer,
+        themeTextInputUtils.colorTextInput(binding.userInputContainer,
                                            binding.userInput,
-                                           ThemeColorUtils.primaryColor(getActivity()));
+                                           themeColorUtils.primaryColor(getActivity()));
         int extensionStart = mTargetFile.isFolder() ? -1 : currentName.lastIndexOf('.');
         int selectionEnd = extensionStart >= 0 ? extensionStart : currentName.length();
         binding.userInput.setSelection(0, selectionEnd);
@@ -192,4 +198,4 @@ public class RenameFileDialogFragment
         super.onDestroyView();
         binding = null;
     }
-}
+}

+ 9 - 4
app/src/main/java/com/owncloud/android/ui/dialog/RenamePublicShareDialogFragment.java

@@ -32,6 +32,7 @@ import android.view.Window;
 import android.view.WindowManager.LayoutParams;
 import android.widget.EditText;
 
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.databinding.EditBoxDialogBinding;
 import com.owncloud.android.lib.resources.shares.OCShare;
@@ -39,6 +40,8 @@ import com.owncloud.android.ui.activity.ComponentsGetter;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
@@ -47,12 +50,14 @@ import androidx.fragment.app.DialogFragment;
  * Dialog to rename a public share
  */
 public class RenamePublicShareDialogFragment
-    extends DialogFragment implements DialogInterface.OnClickListener {
+    extends DialogFragment implements DialogInterface.OnClickListener, Injectable {
 
     private static final String ARG_PUBLIC_SHARE = "PUBLIC_SHARE";
 
     public static final String RENAME_PUBLIC_SHARE_FRAGMENT = "RENAME_PUBLIC_SHARE_FRAGMENT";
 
+    @Inject ThemeColorUtils themeColorUtils;
+
     private EditBoxDialogBinding binding;
     private OCShare publicShare;
 
@@ -69,7 +74,7 @@ public class RenamePublicShareDialogFragment
     public void onStart() {
         super.onStart();
 
-        int color = ThemeColorUtils.primaryAccentColor(getContext());
+        int color = themeColorUtils.primaryAccentColor(getContext());
 
         AlertDialog alertDialog = (AlertDialog) getDialog();
 
@@ -82,7 +87,7 @@ public class RenamePublicShareDialogFragment
     @NonNull
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        int accentColor = ThemeColorUtils.primaryAccentColor(getContext());
+        int accentColor = themeColorUtils.primaryAccentColor(getContext());
         publicShare = requireArguments().getParcelable(ARG_PUBLIC_SHARE);
 
         // Inflate the layout for the dialog
@@ -95,7 +100,7 @@ public class RenamePublicShareDialogFragment
         inputText.setText(publicShare.getLabel());
         inputText.requestFocus();
         inputText.getBackground().setColorFilter(accentColor, PorterDuff.Mode.SRC_ATOP);
-        inputText.setHighlightColor(ThemeColorUtils.primaryColor(getActivity()));
+        inputText.setHighlightColor(themeColorUtils.primaryColor(getActivity()));
 
         // Build the dialog
         AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity());

+ 13 - 7
app/src/main/java/com/owncloud/android/ui/dialog/SendShareDialog.java

@@ -16,6 +16,7 @@ import android.widget.TextView;
 import com.google.android.material.bottomsheet.BottomSheetBehavior;
 import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
 import com.google.android.material.snackbar.Snackbar;
+import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.utils.IntentUtil;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.OCFile;
@@ -28,10 +29,13 @@ import com.owncloud.android.ui.components.SendButtonData;
 import com.owncloud.android.ui.helpers.FileOperationsHelper;
 import com.owncloud.android.utils.MimeTypeUtil;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.recyclerview.widget.GridLayoutManager;
@@ -59,7 +63,7 @@ import androidx.recyclerview.widget.RecyclerView;
  * You should have received a copy of the GNU Affero General Public License
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
-public class SendShareDialog extends BottomSheetDialogFragment {
+public class SendShareDialog extends BottomSheetDialogFragment implements Injectable {
 
     private static final String KEY_OCFILE = "KEY_OCFILE";
     private static final String KEY_SHARING_PUBLIC_PASSWORD_ENFORCED = "KEY_SHARING_PUBLIC_PASSWORD_ENFORCED";
@@ -75,6 +79,8 @@ public class SendShareDialog extends BottomSheetDialogFragment {
     private boolean sharingPublicPasswordEnforced;
     private boolean sharingPublicAskForPassword;
     private FileOperationsHelper fileOperationsHelper;
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeSnackbarUtils themeSnackbarUtils;
 
     public static SendShareDialog newInstance(OCFile file, boolean hideNcSharingOptions, OCCapability capability) {
 
@@ -125,11 +131,11 @@ public class SendShareDialog extends BottomSheetDialogFragment {
 
         // Share via link button
         TextView shareLinkText = view.findViewById(R.id.share_link_button);
-        shareLinkText.setOnClickListener(v -> shareByLink());
+        shareLinkText.setOnClickListener(v -> shareByLink(themeSnackbarUtils));
 
         ImageView shareLinkImageView = view.findViewById(R.id.share_link_icon);
         themeShareButtonImage(shareLinkImageView);
-        shareLinkImageView.setOnClickListener(v -> shareByLink());
+        shareLinkImageView.setOnClickListener(v -> shareByLink(themeSnackbarUtils));
 
         if (hideNcSharingOptions) {
             sendShareButtons.setVisibility(View.GONE);
@@ -179,9 +185,9 @@ public class SendShareDialog extends BottomSheetDialogFragment {
         BottomSheetBehavior.from((View) requireView().getParent()).setState(BottomSheetBehavior.STATE_EXPANDED);
     }
 
-    private void shareByLink() {
+    private void shareByLink(ThemeSnackbarUtils themeSnackbarUtils) {
         if (file.isSharedViaLink()) {
-            ((FileActivity) getActivity()).getFileOperationsHelper().getFileWithLink(file);
+            ((FileActivity) getActivity()).getFileOperationsHelper().getFileWithLink(file, themeSnackbarUtils);
         } else if (sharingPublicPasswordEnforced || sharingPublicAskForPassword) {
             // password enforced by server, request to the user before trying to create
             requestPasswordForShareViaLink();
@@ -201,10 +207,10 @@ public class SendShareDialog extends BottomSheetDialogFragment {
     }
 
     private void themeShareButtonImage(ImageView shareImageView) {
-        shareImageView.getBackground().setColorFilter(ThemeColorUtils.primaryColor(getContext().getApplicationContext(),
+        shareImageView.getBackground().setColorFilter(themeColorUtils.primaryColor(getContext().getApplicationContext(),
                                                                                    true),
                                                       PorterDuff.Mode.SRC_IN);
-        shareImageView.getDrawable().mutate().setColorFilter(ThemeColorUtils.fontColor(getContext().getApplicationContext()),
+        shareImageView.getDrawable().mutate().setColorFilter(themeColorUtils.fontColor(getContext().getApplicationContext()),
                                                              PorterDuff.Mode.SRC_IN);
     }
 

+ 12 - 5
app/src/main/java/com/owncloud/android/ui/dialog/SetupEncryptionDialogFragment.java

@@ -34,6 +34,7 @@ import android.widget.Button;
 import android.widget.TextView;
 
 import com.nextcloud.client.account.User;
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.ArbitraryDataProvider;
 import com.owncloud.android.lib.common.accounts.AccountUtils;
@@ -56,6 +57,8 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.Locale;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.app.AlertDialog;
@@ -70,7 +73,7 @@ import static com.owncloud.android.utils.EncryptionUtils.generateKey;
 /*
  *  Dialog to setup encryption
  */
-public class SetupEncryptionDialogFragment extends DialogFragment {
+public class SetupEncryptionDialogFragment extends DialogFragment implements Injectable {
 
     public static final String SUCCESS = "SUCCESS";
     public static final int SETUP_ENCRYPTION_RESULT_CODE = 101;
@@ -86,6 +89,9 @@ public class SetupEncryptionDialogFragment extends DialogFragment {
     private static final String KEY_FAILED = "KEY_FAILED";
     private static final String KEY_GENERATE = "KEY_GENERATE";
 
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeButtonUtils themeButtonUtils;
+
     private User user;
     private TextView textView;
     private TextView passphraseTextView;
@@ -119,7 +125,8 @@ public class SetupEncryptionDialogFragment extends DialogFragment {
 
         positiveButton = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
         neutralButton = alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL);
-        ThemeButtonUtils.themeBorderlessButton(positiveButton,
+        themeButtonUtils.themeBorderlessButton(themeColorUtils,
+                                               positiveButton,
                                                neutralButton);
 
         task = new DownloadKeysAsyncTask();
@@ -129,7 +136,7 @@ public class SetupEncryptionDialogFragment extends DialogFragment {
     @NonNull
     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState) {
-        int primaryColor = ThemeColorUtils.primaryColor(getContext());
+        int primaryColor = themeColorUtils.primaryColor(getContext());
         user = getArguments().getParcelable(ARG_USER);
 
         arbitraryDataProvider = new ArbitraryDataProvider(getContext().getContentResolver());
@@ -437,7 +444,7 @@ public class SetupEncryptionDialogFragment extends DialogFragment {
         positiveButton.setVisibility(View.VISIBLE);
 
         neutralButton.setVisibility(View.VISIBLE);
-        ThemeButtonUtils.themeBorderlessButton(positiveButton, neutralButton);
+        themeButtonUtils.themeBorderlessButton(themeColorUtils, positiveButton, neutralButton);
 
         keyResult = KEY_GENERATE;
     }
@@ -451,7 +458,7 @@ public class SetupEncryptionDialogFragment extends DialogFragment {
         passphraseTextView.setVisibility(View.GONE);
         positiveButton.setText(R.string.end_to_end_encryption_dialog_close);
         positiveButton.setVisibility(View.VISIBLE);
-        positiveButton.setTextColor(ThemeColorUtils.primaryAccentColor(getContext()));
+        positiveButton.setTextColor(themeColorUtils.primaryAccentColor(getContext()));
     }
 
     @VisibleForTesting

+ 14 - 6
app/src/main/java/com/owncloud/android/ui/dialog/SharePasswordDialogFragment.java

@@ -29,6 +29,7 @@ import android.view.View;
 import android.view.Window;
 import android.view.WindowManager;
 
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.databinding.PasswordDialogBinding;
 import com.owncloud.android.datamodel.OCFile;
@@ -39,16 +40,18 @@ import com.owncloud.android.utils.theme.ThemeButtonUtils;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
 import com.owncloud.android.utils.theme.ThemeTextInputUtils;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
 
 /**
  * Dialog to input the password for sharing a file/folder.
- *
+ * <p>
  * Triggers the share when the password is introduced.
  */
-public class SharePasswordDialogFragment extends DialogFragment implements DialogInterface.OnClickListener {
+public class SharePasswordDialogFragment extends DialogFragment implements DialogInterface.OnClickListener, Injectable {
 
     private static final String ARG_FILE = "FILE";
     private static final String ARG_SHARE = "SHARE";
@@ -56,6 +59,10 @@ public class SharePasswordDialogFragment extends DialogFragment implements Dialo
     private static final String ARG_ASK_FOR_PASSWORD = "ASK_FOR_PASSWORD";
     public static final String PASSWORD_FRAGMENT = "PASSWORD_FRAGMENT";
 
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeButtonUtils themeButtonUtils;
+    @Inject ThemeTextInputUtils themeTextInputUtils;
+
     private PasswordDialogBinding binding;
     private OCFile file;
     private OCShare share;
@@ -68,9 +75,10 @@ public class SharePasswordDialogFragment extends DialogFragment implements Dialo
 
         AlertDialog alertDialog = (AlertDialog) getDialog();
         if (alertDialog != null) {
-            ThemeButtonUtils.themeBorderlessButton(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
+            themeButtonUtils.themeBorderlessButton(themeColorUtils,
+                                                   alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
                                                    alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE));
-            ThemeButtonUtils.themeBorderlessButton(getResources().getColor(R.color.highlight_textColor_Warning),
+            themeButtonUtils.themeBorderlessButton(getResources().getColor(R.color.highlight_textColor_Warning),
                                                    alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL));
 
             alertDialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(v -> {
@@ -155,9 +163,9 @@ public class SharePasswordDialogFragment extends DialogFragment implements Dialo
 
         // Setup layout
         binding.sharePassword.setText("");
-        ThemeTextInputUtils.colorTextInput(binding.sharePasswordContainer,
+        themeTextInputUtils.colorTextInput(binding.sharePasswordContainer,
                                            binding.sharePassword,
-                                           ThemeColorUtils.primaryColor(getActivity()));
+                                           themeColorUtils.primaryColor(getActivity()));
         binding.sharePassword.requestFocus();
 
         int negativeButtonCaption;

+ 10 - 4
app/src/main/java/com/owncloud/android/ui/dialog/SortingOrderDialogFragment.java

@@ -31,19 +31,22 @@ import android.widget.ImageButton;
 import android.widget.TextView;
 
 import com.google.android.material.button.MaterialButton;
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.theme.ThemeButtonUtils;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.fragment.app.DialogFragment;
 
 /**
  * Dialog to show and choose the sorting order for the file listing.
  */
-public class SortingOrderDialogFragment extends DialogFragment {
+public class SortingOrderDialogFragment extends DialogFragment implements Injectable {
 
     private final static String TAG = SortingOrderDialogFragment.class.getSimpleName();
 
@@ -55,6 +58,9 @@ public class SortingOrderDialogFragment extends DialogFragment {
     private MaterialButton mCancel;
     private String mCurrentSortOrderName;
 
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeButtonUtils themeButtonUtils;
+
     public static SortingOrderDialogFragment newInstance(FileSortOrder sortOrder) {
         SortingOrderDialogFragment dialogFragment = new SortingOrderDialogFragment();
 
@@ -96,7 +102,7 @@ public class SortingOrderDialogFragment extends DialogFragment {
      */
     private void setupDialogElements(View view) {
         mCancel = view.findViewById(R.id.cancel);
-        mCancel.setTextColor(ThemeColorUtils.primaryAccentColor(getContext()));
+        mCancel.setTextColor(themeColorUtils.primaryAccentColor(getContext()));
 
         mTaggedViews = new View[12];
         mTaggedViews[0] = view.findViewById(R.id.sortByNameAscending);
@@ -131,13 +137,13 @@ public class SortingOrderDialogFragment extends DialogFragment {
      * tints the icon reflecting the actual sorting choice in the apps primary color.
      */
     private void setupActiveOrderSelection() {
-        final int color = ThemeColorUtils.primaryColor(null, true, true, getContext());
+        final int color = themeColorUtils.primaryColor(null, true, true, getContext());
         for (View view: mTaggedViews) {
             if (!((FileSortOrder) view.getTag()).name.equals(mCurrentSortOrderName)) {
                 continue;
             }
             if (view instanceof ImageButton) {
-                ThemeButtonUtils.colorImageButton((ImageButton)view, color);
+                themeButtonUtils.colorImageButton((ImageButton) view, color);
             }
             if (view instanceof TextView) {
                 ((TextView)view).setTextColor(color);

+ 13 - 4
app/src/main/java/com/owncloud/android/ui/dialog/StoragePermissionDialogFragment.kt

@@ -28,10 +28,13 @@ import androidx.annotation.RequiresApi
 import androidx.appcompat.app.AlertDialog
 import androidx.fragment.app.DialogFragment
 import com.google.android.material.dialog.MaterialAlertDialogBuilder
+import com.nextcloud.client.di.Injectable
 import com.owncloud.android.R
 import com.owncloud.android.databinding.StoragePermissionDialogBinding
 import com.owncloud.android.ui.dialog.StoragePermissionDialogFragment.Listener
 import com.owncloud.android.utils.theme.ThemeButtonUtils
+import com.owncloud.android.utils.theme.ThemeColorUtils
+import javax.inject.Inject
 
 /**
  * Dialog that shows permission options in SDK >= 30
@@ -44,14 +47,20 @@ import com.owncloud.android.utils.theme.ThemeButtonUtils
  */
 @RequiresApi(Build.VERSION_CODES.R)
 class StoragePermissionDialogFragment(val listener: Listener, val permissionRequired: Boolean = false) :
-    DialogFragment() {
+    DialogFragment(), Injectable {
     private lateinit var binding: StoragePermissionDialogBinding
 
+    @Inject
+    lateinit var themeButtonUtils: ThemeButtonUtils
+
+    @Inject
+    lateinit var themeColorUtils: ThemeColorUtils
+
     override fun onStart() {
         super.onStart()
         dialog?.let {
             val alertDialog = it as AlertDialog
-            ThemeButtonUtils.themeBorderlessButton(alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE))
+            themeButtonUtils.themeBorderlessButton(themeColorUtils, alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE))
         }
     }
 
@@ -68,12 +77,12 @@ class StoragePermissionDialogFragment(val listener: Listener, val permissionRequ
         binding.storagePermissionExplanation.text = getString(explanationResource, getString(R.string.app_name))
 
         // Setup layout
-        ThemeButtonUtils.colorPrimaryButton(binding.btnFullAccess, context)
+        themeButtonUtils.colorPrimaryButton(binding.btnFullAccess, context, themeColorUtils)
         binding.btnFullAccess.setOnClickListener {
             listener.onClickFullAccess()
             dismiss()
         }
-        ThemeButtonUtils.themeBorderlessButton(binding.btnReadOnly)
+        themeButtonUtils.themeBorderlessButton(themeColorUtils, binding.btnReadOnly)
         binding.btnReadOnly.setOnClickListener {
             listener.onClickMediaReadOnly()
             dismiss()

+ 2 - 2
app/src/main/java/com/owncloud/android/ui/dialog/SyncFileNotEnoughSpaceDialogFragment.java

@@ -30,7 +30,6 @@ import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.ui.dialog.ConfirmationDialogFragment.ConfirmationDialogFragmentListener;
 import com.owncloud.android.ui.fragment.OCFileListFragment;
 import com.owncloud.android.utils.DisplayUtils;
-import com.owncloud.android.utils.theme.ThemeButtonUtils;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
@@ -83,7 +82,8 @@ public class SyncFileNotEnoughSpaceDialogFragment extends ConfirmationDialogFrag
         AlertDialog alertDialog = (AlertDialog) getDialog();
 
         if (alertDialog != null) {
-            ThemeButtonUtils.themeBorderlessButton(alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
+            themeButtonUtils.themeBorderlessButton(themeColorUtils,
+                                                   alertDialog.getButton(AlertDialog.BUTTON_POSITIVE),
                                                    alertDialog.getButton(AlertDialog.BUTTON_NEUTRAL),
                                                    alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE));
         }

+ 15 - 8
app/src/main/java/com/owncloud/android/ui/dialog/SyncedFolderPreferencesDialogFragment.java

@@ -36,6 +36,7 @@ import android.view.ViewGroup;
 import android.widget.TextView;
 
 import com.google.android.material.button.MaterialButton;
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.MediaFolderType;
 import com.owncloud.android.datamodel.SyncedFolderDisplayItem;
@@ -52,6 +53,8 @@ import com.owncloud.android.utils.theme.ThemeColorUtils;
 
 import java.io.File;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.AlertDialog;
@@ -63,9 +66,10 @@ import static com.owncloud.android.datamodel.SyncedFolderDisplayItem.UNPERSISTED
 import static com.owncloud.android.ui.activity.UploadFilesActivity.REQUEST_CODE_KEY;
 
 /**
- * Dialog to show the preferences/configuration of a synced folder allowing the user to change the different parameters.
+ * Dialog to show the preferences/configuration of a synced folder allowing the user to change the different
+ * parameters.
  */
-public class SyncedFolderPreferencesDialogFragment extends DialogFragment {
+public class SyncedFolderPreferencesDialogFragment extends DialogFragment implements Injectable {
 
     public static final String SYNCED_FOLDER_PARCELABLE = "SyncedFolderParcelable";
     public static final int REQUEST_CODE__SELECT_REMOTE_FOLDER = 0;
@@ -77,6 +81,9 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment {
     private final static float alphaEnabled = 1.0f;
     private final static float alphaDisabled = 0.7f;
 
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeButtonUtils themeButtonUtils;
+    @Inject ThemeCheckableUtils themeCheckableUtils;
     protected View mView;
     private CharSequence[] mUploadBehaviorItemStrings;
     private CharSequence[] mNameCollisionPolicyItemStrings;
@@ -153,7 +160,7 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment {
      * @param view the parent view
      */
     private void setupDialogElements(View view) {
-        int accentColor = ThemeColorUtils.primaryAccentColor(getContext());
+        int accentColor = themeColorUtils.primaryAccentColor(getContext());
 
         if (mSyncedFolder.getType().getId() > MediaFolderType.CUSTOM.getId()) {
             // hide local folder chooser and delete for non-custom folders
@@ -179,7 +186,7 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment {
 
         // find/saves UI elements
         mEnabledSwitch = view.findViewById(R.id.sync_enabled);
-        ThemeCheckableUtils.tintSwitch(mEnabledSwitch);
+        themeCheckableUtils.tintSwitch(mEnabledSwitch, themeColorUtils);
 
         mLocalFolderPath = view.findViewById(R.id.synced_folders_settings_local_folder_path);
 
@@ -195,7 +202,7 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment {
         mUploadUseSubfoldersCheckbox = view.findViewById(
                 R.id.setting_instant_upload_path_use_subfolders_checkbox);
 
-        ThemeCheckableUtils.tintCheckbox(accentColor,
+        themeCheckableUtils.tintCheckbox(accentColor,
                                          mUploadOnWifiCheckbox,
                                          mUploadOnChargingCheckbox,
                                          mUploadExistingCheckbox,
@@ -208,7 +215,7 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment {
         mCancel = view.findViewById(R.id.cancel);
         mSave = view.findViewById(R.id.save);
 
-        ThemeButtonUtils.themeBorderlessButton(mCancel, mSave);
+        themeButtonUtils.themeBorderlessButton(themeColorUtils, mCancel, mSave);
 
         // Set values
         setEnabled(mSyncedFolder.isEnabled());
@@ -354,13 +361,13 @@ public class SyncedFolderPreferencesDialogFragment extends DialogFragment {
         view.findViewById(R.id.setting_instant_name_collision_policy_container).setAlpha(alpha);
 
         if (enable) {
-            ThemeCheckableUtils.tintCheckbox(ThemeColorUtils.primaryAccentColor(getContext()),
+            themeCheckableUtils.tintCheckbox(themeColorUtils.primaryAccentColor(getContext()),
                                              mUploadOnWifiCheckbox,
                                              mUploadOnChargingCheckbox,
                                              mUploadExistingCheckbox,
                                              mUploadUseSubfoldersCheckbox);
         } else {
-            ThemeCheckableUtils.tintCheckbox(Color.GRAY,
+            themeCheckableUtils.tintCheckbox(Color.GRAY,
                                              mUploadOnWifiCheckbox,
                                              mUploadOnChargingCheckbox,
                                              mUploadExistingCheckbox,

+ 9 - 5
app/src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java

@@ -116,6 +116,10 @@ public class ExtendedListFragment extends Fragment implements
 
     @Inject AppPreferences preferences;
     @Inject UserAccountManager accountManager;
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeLayoutUtils themeLayoutUtils;
+    @Inject ThemeToolbarUtils themeToolbarUtils;
+    @Inject ThemeDrawableUtils themeDrawableUtils;
     private ScaleGestureDetector mScaleGestureDetector;
     protected SwipeRefreshLayout mRefreshListLayout;
     protected MaterialButton mSortButton;
@@ -182,10 +186,10 @@ public class ExtendedListFragment extends Fragment implements
         closeButton = searchView.findViewById(androidx.appcompat.R.id.search_close_btn);
         searchView.setOnQueryTextListener(this);
         searchView.setOnCloseListener(this);
-        ThemeToolbarUtils.themeSearchView(searchView, requireContext());
+        themeToolbarUtils.themeSearchView(searchView, requireContext());
 
         SearchView.SearchAutoComplete theTextArea = searchView.findViewById(R.id.search_src_text);
-        theTextArea.setHighlightColor(ThemeColorUtils.primaryAccentColor(getContext()));
+        theTextArea.setHighlightColor(themeColorUtils.primaryAccentColor(getContext()));
 
         final Handler handler = new Handler();
 
@@ -343,7 +347,7 @@ public class ExtendedListFragment extends Fragment implements
 
         // Pull-down to refresh layout
         mRefreshListLayout = binding.swipeContainingList;
-        ThemeLayoutUtils.colorSwipeRefreshLayout(getContext(), mRefreshListLayout);
+        themeLayoutUtils.colorSwipeRefreshLayout(getContext(), mRefreshListLayout);
         mRefreshListLayout.setOnRefreshListener(this);
 
         mSortButton = getActivity().findViewById(R.id.sort_button);
@@ -583,8 +587,8 @@ public class ExtendedListFragment extends Fragment implements
                     if (tintIcon) {
                         if (getContext() != null) {
                             mEmptyListIcon.setImageDrawable(
-                                ThemeDrawableUtils.tintDrawable(icon,
-                                                                ThemeColorUtils.primaryColor(getContext(),true)));
+                                themeDrawableUtils.tintDrawable(icon,
+                                                                themeColorUtils.primaryColor(getContext(), true)));
                         }
                     } else {
                         mEmptyListIcon.setImageResource(icon);

+ 8 - 3
app/src/main/java/com/owncloud/android/ui/fragment/FeatureFragment.java

@@ -13,17 +13,21 @@ import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
 
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.features.FeatureItem;
 import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.fragment.app.Fragment;
 
 
-public class FeatureFragment extends Fragment {
+public class FeatureFragment extends Fragment implements Injectable {
     private FeatureItem item;
+    @Inject ThemeDrawableUtils themeDrawableUtils;
 
     static public FeatureFragment newInstance(FeatureItem item) {
         FeatureFragment f = new FeatureFragment();
@@ -41,14 +45,15 @@ public class FeatureFragment extends Fragment {
 
     @Nullable
     @Override
-    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
+    public View onCreateView(@NonNull LayoutInflater inflater,
+                             @Nullable ViewGroup container,
                              @Nullable Bundle savedInstanceState) {
         View view = inflater.inflate(R.layout.whats_new_element, container, false);
         int fontColor = getResources().getColor(R.color.login_text_color);
 
         ImageView whatsNewImage = view.findViewById(R.id.whatsNewImage);
         if (item.shouldShowImage()) {
-            whatsNewImage.setImageDrawable(ThemeDrawableUtils.tintDrawable(item.getImage(), fontColor));
+            whatsNewImage.setImageDrawable(themeDrawableUtils.tintDrawable(item.getImage(), fontColor));
         }
 
         TextView whatsNewTitle = view.findViewById(R.id.whatsNewTitle);

+ 15 - 6
app/src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java

@@ -60,8 +60,10 @@ import com.owncloud.android.ui.interfaces.ActivityListInterface;
 import com.owncloud.android.ui.interfaces.VersionListInterface;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 import com.owncloud.android.utils.theme.ThemeLayoutUtils;
 import com.owncloud.android.utils.theme.ThemeTextInputUtils;
+import com.owncloud.android.utils.theme.ThemeToolbarUtils;
 
 import org.apache.commons.httpclient.HttpStatus;
 import org.greenrobot.eventbus.EventBus;
@@ -112,6 +114,11 @@ public class FileDetailActivitiesFragment extends Fragment implements
     @Inject UserAccountManager accountManager;
     @Inject ClientFactory clientFactory;
     @Inject ContentResolver contentResolver;
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeLayoutUtils themeLayoutUtils;
+    @Inject ThemeToolbarUtils themeToolbarUtils;
+    @Inject ThemeDrawableUtils themeDrawableUtils;
+    @Inject ThemeTextInputUtils themeTextInputUtils;
 
     public static FileDetailActivitiesFragment newInstance(OCFile file, User user) {
         FileDetailActivitiesFragment fragment = new FileDetailActivitiesFragment();
@@ -139,13 +146,13 @@ public class FileDetailActivitiesFragment extends Fragment implements
             user = savedInstanceState.getParcelable(ARG_USER);
         }
 
-        binding = FileDetailsActivitiesFragmentBinding.inflate(inflater,container,false);
+        binding = FileDetailsActivitiesFragmentBinding.inflate(inflater, container, false);
         View view = binding.getRoot();
 
         setupView();
 
-        ThemeLayoutUtils.colorSwipeRefreshLayout(getContext(), binding.swipeContainingEmpty);
-        ThemeLayoutUtils.colorSwipeRefreshLayout(getContext(), binding.swipeContainingList);
+        themeLayoutUtils.colorSwipeRefreshLayout(getContext(), binding.swipeContainingEmpty);
+        themeLayoutUtils.colorSwipeRefreshLayout(getContext(), binding.swipeContainingList);
 
         fetchAndSetData(-1);
 
@@ -176,9 +183,9 @@ public class FileDetailActivitiesFragment extends Fragment implements
 
         binding.submitComment.setOnClickListener(v -> submitComment());
 
-        ThemeTextInputUtils.colorTextInput(binding.commentInputFieldContainer,
+        themeTextInputUtils.colorTextInput(binding.commentInputFieldContainer,
                                            binding.commentInputField,
-                                           ThemeColorUtils.primaryColor(getContext()));
+                                           themeColorUtils.primaryColor(getContext()));
 
         DisplayUtils.setAvatar(user,
                                this,
@@ -236,7 +243,9 @@ public class FileDetailActivitiesFragment extends Fragment implements
                                                     accountManager,
                                                     this,
                                                     this,
-                                                    clientFactory
+                                                    clientFactory,
+                                                    themeColorUtils,
+                                                    themeDrawableUtils
         );
         binding.list.setAdapter(adapter);
 

+ 5 - 2
app/src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java

@@ -112,6 +112,9 @@ public class FileDetailFragment extends FileFragment implements OnClickListener,
     @Inject UserAccountManager accountManager;
     @Inject ClientFactory clientFactory;
     @Inject FileDataStorageManager storageManager;
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeLayoutUtils themeLayoutUtils;
+    @Inject ThemeBarUtils themeBarUtils;
 
     /**
      * Public factory method to create new FileDetailFragment instances.
@@ -223,7 +226,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener,
     @Override
     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
         if (getFile() != null && user != null) {
-            ThemeBarUtils.colorHorizontalProgressBar(binding.progressBar, ThemeColorUtils.primaryAccentColor(getContext()));
+            themeBarUtils.colorHorizontalProgressBar(binding.progressBar, themeColorUtils.primaryAccentColor(getContext()));
             progressListener = new ProgressListener(binding.progressBar);
             binding.cancelBtn.setOnClickListener(this);
             binding.favorite.setOnClickListener(this);
@@ -249,7 +252,7 @@ public class FileDetailFragment extends FileFragment implements OnClickListener,
         binding.tabLayout.addTab(binding.tabLayout.newTab().setText(R.string.drawer_item_activities).setIcon(R.drawable.ic_activity));
         binding.tabLayout.addTab(binding.tabLayout.newTab().setText(R.string.share_dialog_title).setIcon(R.drawable.shared_via_users));
 
-        ThemeLayoutUtils.colorTabLayout(getContext().getApplicationContext(), binding.tabLayout);
+        themeLayoutUtils.colorTabLayout(getContext().getApplicationContext(), binding.tabLayout);
 
         final FileDetailTabAdapter adapter = new FileDetailTabAdapter(getFragmentManager(), getFile(), user);
         binding.pager.setAdapter(adapter);

+ 21 - 6
app/src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java

@@ -61,6 +61,10 @@ import com.owncloud.android.ui.fragment.util.FileDetailSharingFragmentHelper;
 import com.owncloud.android.ui.helpers.FileOperationsHelper;
 import com.owncloud.android.utils.ClipboardUtil;
 import com.owncloud.android.utils.DisplayUtils;
+import com.owncloud.android.utils.theme.ThemeAvatarUtils;
+import com.owncloud.android.utils.theme.ThemeColorUtils;
+import com.owncloud.android.utils.theme.ThemeDrawableUtils;
+import com.owncloud.android.utils.theme.ThemeSnackbarUtils;
 import com.owncloud.android.utils.theme.ThemeToolbarUtils;
 
 import java.util.ArrayList;
@@ -96,8 +100,12 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
     private OnEditShareListener onEditShareListener;
 
     @Inject UserAccountManager accountManager;
-
     @Inject ClientFactory clientFactory;
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeToolbarUtils themeToolbarUtils;
+    @Inject ThemeSnackbarUtils themeSnackbarUtils;
+    @Inject ThemeDrawableUtils themeDrawableUtils;
+    @Inject ThemeAvatarUtils themeAvatarUtils;
 
     public static FileDetailSharingFragment newInstance(OCFile file, User user) {
         FileDetailSharingFragment fragment = new FileDetailSharingFragment();
@@ -162,7 +170,9 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
                                                             new ArrayList<>(),
                                                             this,
                                                             userId,
-                                                            user));
+                                                            user,
+                                                            themeColorUtils,
+                                                            themeAvatarUtils));
         binding.sharesList.setLayoutManager(new LinearLayoutManager(getContext()));
 
         setupView();
@@ -196,7 +206,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
             (SearchManager) fileActivity.getSystemService(Context.SEARCH_SERVICE),
             binding.searchView,
             fileActivity.getComponentName());
-        ThemeToolbarUtils.themeSearchView(binding.searchView, requireContext());
+        themeToolbarUtils.themeSearchView(binding.searchView, requireContext());
 
         if (file.canReshare()) {
             binding.searchView.setQueryHint(getResources().getString(R.string.share_search));
@@ -279,7 +289,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
     private void showSendLinkTo(OCShare publicShare) {
         if (file.isSharedViaLink()) {
             if (TextUtils.isEmpty(publicShare.getShareLink())) {
-                fileOperationsHelper.getFileWithLink(file);
+                fileOperationsHelper.getFileWithLink(file, themeSnackbarUtils);
             } else {
                 FileDisplayActivity.showShareLinkDialog(fileActivity, file, publicShare.getShareLink());
             }
@@ -289,7 +299,7 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
     public void copyLink(OCShare share) {
         if (file.isSharedViaLink()) {
             if (TextUtils.isEmpty(share.getShareLink())) {
-                fileOperationsHelper.getFileWithLink(file);
+                fileOperationsHelper.getFileWithLink(file, themeSnackbarUtils);
             } else {
                 ClipboardUtil.copyToClipboard(getActivity(), share.getShareLink());
             }
@@ -381,7 +391,12 @@ public class FileDetailSharingFragment extends Fragment implements ShareeListAda
     @Override
     public void showProfileBottomSheet(User user, String shareWith) {
         if (user.getServer().getVersion().isNewerOrEqual(NextcloudVersion.Companion.getNextcloud_23())) {
-            new RetrieveHoverCardAsyncTask(user, shareWith, fileActivity, clientFactory).execute();
+            new RetrieveHoverCardAsyncTask(user,
+                                           shareWith,
+                                           fileActivity,
+                                           clientFactory,
+                                           themeColorUtils,
+                                           themeDrawableUtils).execute();
         }
     }
 

+ 3 - 1
app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.java

@@ -105,7 +105,9 @@ public class GalleryFragment extends OCFileListFragment {
                                       accountManager.getUser(),
                                       this,
                                       preferences,
-                                      mContainerActivity);
+                                      mContainerActivity,
+                                      themeColorUtils,
+                                      themeDrawableUtils);
 
 //        val spacing = resources.getDimensionPixelSize(R.dimen.media_grid_spacing)
 //        binding.list.addItemDecoration(MediaGridItemDecoration(spacing))

+ 6 - 1
app/src/main/java/com/owncloud/android/ui/fragment/LocalFileListFragment.java

@@ -131,7 +131,12 @@ public class LocalFileListFragment extends ExtendedListFragment implements
         super.onActivityCreated(savedInstanceState);
 
         mAdapter = new LocalFileListAdapter(mContainerActivity.isFolderPickerMode(),
-                                            mContainerActivity.getInitialDirectory(), this, preferences, getActivity());
+                                            mContainerActivity.getInitialDirectory(),
+                                            this,
+                                            preferences,
+                                            getActivity(),
+                                            themeColorUtils,
+                                            themeDrawableUtils);
         setRecyclerViewAdapter(mAdapter);
 
         listDirectory(mContainerActivity.getInitialDirectory());

+ 21 - 11
app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.java

@@ -29,6 +29,7 @@ import com.google.android.material.bottomsheet.BottomSheetDialog;
 import com.google.gson.Gson;
 import com.nextcloud.client.account.User;
 import com.nextcloud.client.device.DeviceInfo;
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.R;
 import com.owncloud.android.databinding.FileListActionsBottomSheetCreatorBinding;
 import com.owncloud.android.databinding.FileListActionsBottomSheetFragmentBinding;
@@ -45,10 +46,16 @@ import com.owncloud.android.utils.theme.ThemeColorUtils;
 import com.owncloud.android.utils.theme.ThemeDrawableUtils;
 import com.owncloud.android.utils.theme.ThemeUtils;
 
+import javax.inject.Inject;
+
 /**
  * FAB menu {@link android.app.Dialog} styled as a bottom sheet for main actions.
  */
-public class OCFileListBottomSheetDialog extends BottomSheetDialog {
+public class OCFileListBottomSheetDialog extends BottomSheetDialog implements Injectable {
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeUtils themeUtils;
+    @Inject ThemeDrawableUtils themeDrawableUtils;
+
     private FileListActionsBottomSheetFragmentBinding binding;
     private final OCFileListBottomSheetActions actions;
     private final FileActivity fileActivity;
@@ -79,14 +86,14 @@ public class OCFileListBottomSheetDialog extends BottomSheetDialog {
             getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
         }
 
-        int primaryColor = ThemeColorUtils.primaryColor(getContext(), true);
-        ThemeDrawableUtils.tintDrawable(binding.menuIconUploadFiles.getDrawable(), primaryColor);
-        ThemeDrawableUtils.tintDrawable(binding.menuIconUploadFromApp.getDrawable(), primaryColor);
-        ThemeDrawableUtils.tintDrawable(binding.menuIconDirectCameraUpload.getDrawable(), primaryColor);
-        ThemeDrawableUtils.tintDrawable(binding.menuIconMkdir.getDrawable(), primaryColor);
+        int primaryColor = themeColorUtils.primaryColor(getContext(), true);
+        themeDrawableUtils.tintDrawable(binding.menuIconUploadFiles.getDrawable(), primaryColor);
+        themeDrawableUtils.tintDrawable(binding.menuIconUploadFromApp.getDrawable(), primaryColor);
+        themeDrawableUtils.tintDrawable(binding.menuIconDirectCameraUpload.getDrawable(), primaryColor);
+        themeDrawableUtils.tintDrawable(binding.menuIconMkdir.getDrawable(), primaryColor);
 
         binding.addToCloud.setText(getContext().getResources().getString(R.string.add_to_cloud,
-                ThemeUtils.getDefaultDisplayNameForRootFolder(getContext())));
+                                                                         themeUtils.getDefaultDisplayNameForRootFolder(getContext())));
 
         OCCapability capability = fileActivity.getCapabilities();
         if (capability != null &&
@@ -118,10 +125,13 @@ public class OCFileListBottomSheetDialog extends BottomSheetDialog {
                                       fileActivity.getString(R.string.create_new),
                                       creator.getName()));
 
-                    creatorViewBinding.creatorThumbnail.setImageDrawable(MimeTypeUtil.getFileTypeIcon(creator.getMimetype(),
-                                                                            creator.getExtension(),
-                                                                            user,
-                                                                            getContext()));
+                    creatorViewBinding.creatorThumbnail.setImageDrawable(
+                        MimeTypeUtil.getFileTypeIcon(creator.getMimetype(),
+                                                     creator.getExtension(),
+                                                     user,
+                                                     getContext(),
+                                                     themeColorUtils,
+                                                     themeDrawableUtils));
 
                     creatorView.setOnClickListener(v -> {
                         actions.showTemplate(creator, creatorViewBinding.creatorName.getText().toString());

+ 20 - 10
app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -103,6 +103,7 @@ import com.owncloud.android.utils.EncryptionUtils;
 import com.owncloud.android.utils.FileSortOrder;
 import com.owncloud.android.utils.FileStorageUtils;
 import com.owncloud.android.utils.MimeTypeUtil;
+import com.owncloud.android.utils.theme.ThemeAvatarUtils;
 import com.owncloud.android.utils.theme.ThemeColorUtils;
 import com.owncloud.android.utils.theme.ThemeFabUtils;
 import com.owncloud.android.utils.theme.ThemeToolbarUtils;
@@ -187,6 +188,12 @@ public class OCFileListFragment extends ExtendedListFragment implements
     @Inject UserAccountManager accountManager;
     @Inject ClientFactory clientFactory;
     @Inject Throttler throttler;
+    @Inject ThemeColorUtils themeColorUtils;
+    @Inject ThemeFabUtils themeFabUtils;
+    @Inject ThemeToolbarUtils themeToolbarUtils;
+    @Inject ThemeUtils themeUtils;
+    @Inject ThemeAvatarUtils themeAvatarUtils;
+
     protected FileFragment.ContainerActivity mContainerActivity;
 
     protected OCFile mFile;
@@ -306,7 +313,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
         mFabMain = requireActivity().findViewById(R.id.fab_main);
 
         if (mFabMain != null) { // is not available in FolderPickerActivity
-            ThemeFabUtils.colorFloatingActionButton(mFabMain, R.drawable.ic_plus, requireContext());
+            themeFabUtils.colorFloatingActionButton(mFabMain, R.drawable.ic_plus, requireContext());
         }
 
         Log_OC.i(TAG, "onCreateView() end");
@@ -409,7 +416,10 @@ public class OCFileListFragment extends ExtendedListFragment implements
             mContainerActivity,
             this,
             hideItemOptions,
-            isGridViewPreferred(mFile)
+            isGridViewPreferred(mFile),
+            themeColorUtils,
+            themeDrawableUtils,
+            themeAvatarUtils
         );
 
         setRecyclerViewAdapter(mAdapter);
@@ -451,7 +461,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
         FileActivity activity = (FileActivity) getActivity();
 
         if (mFabMain != null) { // is not available in FolderPickerActivity
-            ThemeFabUtils.colorFloatingActionButton(mFabMain, R.drawable.ic_plus, requireContext());
+            themeFabUtils.colorFloatingActionButton(mFabMain, R.drawable.ic_plus, requireContext());
             mFabMain.setOnClickListener(v -> new OCFileListBottomSheetDialog(activity,
                                                                              this,
                                                                              deviceInfo,
@@ -695,7 +705,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
             mode.invalidate();
 
             //set actionMode color
-            ThemeToolbarUtils.colorStatusBar(getActivity(), ThemeColorUtils.actionModeColor(requireContext()));
+            themeToolbarUtils.colorStatusBar(getActivity(), themeColorUtils.actionModeColor(requireContext()));
 
             // hide FAB in multi selection mode
             setFabVisible(false);
@@ -1418,7 +1428,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
                     setTitle(R.string.drawer_item_shared);
                     break;
                 default:
-                    setTitle(ThemeUtils.getDefaultDisplayNameForRootFolder(getContext()));
+                    setTitle(themeUtils.getDefaultDisplayNameForRootFolder(getContext()));
                     break;
             }
         }
@@ -1478,7 +1488,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
         menuItemAddRemoveValue = MenuItemAddRemove.ADD_GRID_AND_SORT_WITH_SEARCH;
         if (getActivity() != null) {
             getActivity().invalidateOptionsMenu();
-            setTitle(ThemeUtils.getDefaultDisplayNameForRootFolder(getContext()));
+            setTitle(themeUtils.getDefaultDisplayNameForRootFolder(getContext()));
         }
 
         getActivity().getIntent().removeExtra(OCFileListFragment.SEARCH_EVENT);
@@ -1638,7 +1648,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
                 ActionBar actionBar = ((FileDisplayActivity) getActivity()).getSupportActionBar();
 
                 if (actionBar != null) {
-                    ThemeToolbarUtils.setColoredTitle(actionBar, title, getContext());
+                    themeToolbarUtils.setColoredTitle(actionBar, title, getContext());
                 }
             }
         });
@@ -1789,7 +1799,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
             getActivity().runOnUiThread(() -> {
                 if (visible) {
                     mFabMain.show();
-                    ThemeFabUtils.colorFloatingActionButton(mFabMain, requireContext());
+                    themeFabUtils.colorFloatingActionButton(mFabMain, requireContext());
                 } else {
                     mFabMain.hide();
                 }
@@ -1839,10 +1849,10 @@ public class OCFileListFragment extends ExtendedListFragment implements
             getActivity().runOnUiThread(() -> {
                 if (enabled) {
                     mFabMain.setEnabled(true);
-                    ThemeFabUtils.colorFloatingActionButton(mFabMain, requireContext());
+                    themeFabUtils.colorFloatingActionButton(mFabMain, requireContext());
                 } else {
                     mFabMain.setEnabled(false);
-                    ThemeFabUtils.colorFloatingActionButton(mFabMain, requireContext(), Color.GRAY);
+                    themeFabUtils.colorFloatingActionButton(mFabMain, requireContext(), Color.GRAY);
                 }
             });
         }

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio