Browse Source

Migrate current account getter from AccountUtils to UserAccountManager

The implementation delegates calls to the old code, so there should
be no regressions in functionality.

Signed-off-by: Chris Narkiewicz <hello@ezaquarii.com>
Chris Narkiewicz 6 năm trước cách đây
mục cha
commit
442394f949
61 tập tin đã thay đổi với 725 bổ sung295 xóa
  1. 1 0
      gradle.properties
  2. 9 9
      src/androidTest/java/com/owncloud/android/AbstractIT.java
  3. 2 2
      src/androidTest/java/com/owncloud/android/FileIT.java
  4. 24 6
      src/androidTest/java/com/owncloud/android/UploadIT.java
  5. 4 1
      src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.java
  6. 20 0
      src/main/java/com/nextcloud/client/account/CurrentAccountProvider.java
  7. 1 1
      src/main/java/com/nextcloud/client/account/UserAccountManager.java
  8. 10 1
      src/main/java/com/nextcloud/client/account/UserAccountManagerImpl.java
  9. 44 1
      src/main/java/com/nextcloud/client/di/AppModule.java
  10. 13 0
      src/main/java/com/nextcloud/client/di/ComponentsModule.java
  11. 3 0
      src/main/java/com/nextcloud/client/preferences/AppPreferences.java
  12. 12 0
      src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java
  13. 28 15
      src/main/java/com/owncloud/android/MainApp.java
  14. 7 1
      src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java
  15. 16 7
      src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java
  16. 4 3
      src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java
  17. 21 5
      src/main/java/com/owncloud/android/files/services/FileUploader.java
  18. 10 2
      src/main/java/com/owncloud/android/jobs/AccountRemovalJob.java
  19. 9 2
      src/main/java/com/owncloud/android/jobs/FilesSyncJob.java
  20. 14 4
      src/main/java/com/owncloud/android/jobs/NCJobCreator.java
  21. 8 6
      src/main/java/com/owncloud/android/operations/UploadFileOperation.java
  22. 9 1
      src/main/java/com/owncloud/android/providers/DiskLruImageCacheFileProvider.java
  23. 15 2
      src/main/java/com/owncloud/android/providers/UsersAndGroupsSearchProvider.java
  24. 15 6
      src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java
  25. 0 41
      src/main/java/com/owncloud/android/ui/activities/data/Injection.java
  26. 17 5
      src/main/java/com/owncloud/android/ui/activities/data/activities/ActivitiesServiceApiImpl.java
  27. 22 5
      src/main/java/com/owncloud/android/ui/activities/data/files/FilesServiceApiImpl.java
  28. 1 1
      src/main/java/com/owncloud/android/ui/activities/data/files/RemoteFilesRepository.java
  29. 13 3
      src/main/java/com/owncloud/android/ui/activity/BaseActivity.java
  30. 7 1
      src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java
  31. 13 14
      src/main/java/com/owncloud/android/ui/activity/DrawerActivity.java
  32. 3 2
      src/main/java/com/owncloud/android/ui/activity/FileActivity.java
  33. 8 10
      src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java
  34. 8 5
      src/main/java/com/owncloud/android/ui/activity/ManageAccountsActivity.java
  35. 9 2
      src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java
  36. 10 5
      src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java
  37. 10 1
      src/main/java/com/owncloud/android/ui/activity/RichDocumentsWebView.java
  38. 4 3
      src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java
  39. 9 3
      src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.java
  40. 18 11
      src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java
  41. 2 3
      src/main/java/com/owncloud/android/ui/activity/UserInfoActivity.java
  42. 4 3
      src/main/java/com/owncloud/android/ui/adapter/AccountListAdapter.java
  43. 33 4
      src/main/java/com/owncloud/android/ui/adapter/ActivityAndVersionListAdapter.java
  44. 16 4
      src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java
  45. 33 20
      src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java
  46. 14 3
      src/main/java/com/owncloud/android/ui/adapter/TemplateAdapter.java
  47. 8 3
      src/main/java/com/owncloud/android/ui/adapter/TrashbinListAdapter.java
  48. 11 5
      src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java
  49. 11 4
      src/main/java/com/owncloud/android/ui/dialog/ChooseTemplateDialogFragment.java
  50. 8 6
      src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java
  51. 17 3
      src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java
  52. 29 8
      src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java
  53. 10 5
      src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java
  54. 6 2
      src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java
  55. 11 9
      src/main/java/com/owncloud/android/ui/trashbin/RemoteTrashbinRepository.java
  56. 10 2
      src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.java
  57. 7 3
      src/main/java/com/owncloud/android/utils/DisplayUtils.java
  58. 3 3
      src/main/java/com/owncloud/android/utils/FilesSyncHelper.java
  59. 16 6
      src/main/java/com/owncloud/android/utils/ReceiversHelper.java
  60. 12 2
      src/main/java/com/owncloud/android/utils/glide/CustomGlideStreamLoader.java
  61. 13 10
      src/main/java/com/owncloud/android/utils/glide/HttpStreamFetcher.java

+ 1 - 0
gradle.properties

@@ -5,3 +5,4 @@ NC_TEST_SERVER_PASSWORD=test
 android.enableJetifier=true
 android.useAndroidX=true
 android.debug.obsoleteApi=true
+

+ 9 - 9
src/androidTest/java/com/owncloud/android/AbstractIT.java

@@ -38,22 +38,22 @@ public abstract class AbstractIT {
 
     protected static OwnCloudClient client;
     static Account account;
-    protected static Context context;
+    protected static Context targetContext;
 
     @BeforeClass
     public static void beforeAll() {
         try {
-            context = InstrumentationRegistry.getInstrumentation().getTargetContext();
+            targetContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
             Bundle arguments = androidx.test.platform.app.InstrumentationRegistry.getArguments();
 
             Uri baseUrl = Uri.parse(arguments.getString("TEST_SERVER_URL"));
             String username = arguments.getString("TEST_SERVER_USERNAME");
             String password = arguments.getString("TEST_SERVER_PASSWORD");
 
-            Account temp = new Account(username + "@" + baseUrl, MainApp.getAccountType(context));
+            Account temp = new Account(username + "@" + baseUrl, MainApp.getAccountType(targetContext));
 
-            if (!com.owncloud.android.authentication.AccountUtils.exists(temp, context)) {
-                AccountManager accountManager = AccountManager.get(context);
+            if (!com.owncloud.android.authentication.AccountUtils.exists(temp, targetContext)) {
+                AccountManager accountManager = AccountManager.get(targetContext);
                 accountManager.addAccountExplicitly(temp, password, null);
                 accountManager.setUserData(temp, AccountUtils.Constants.KEY_OC_ACCOUNT_VERSION,
                         Integer.toString(com.owncloud.android.authentication.AccountUtils.ACCOUNT_VERSION));
@@ -62,14 +62,14 @@ public abstract class AbstractIT {
                 accountManager.setUserData(temp, AccountUtils.Constants.KEY_USER_ID, username);
             }
 
-            account = com.owncloud.android.authentication.AccountUtils.getOwnCloudAccountByName(context,
-                    username + "@" + baseUrl);
+            account = com.owncloud.android.authentication.AccountUtils.getOwnCloudAccountByName(targetContext,
+                                                                                                username + "@" + baseUrl);
 
             if (account == null) {
                 throw new ActivityNotFoundException();
             }
 
-            client = OwnCloudClientFactory.createOwnCloudClient(account, context);
+            client = OwnCloudClientFactory.createOwnCloudClient(account, targetContext);
 
             createDummyFiles();
 
@@ -86,7 +86,7 @@ public abstract class AbstractIT {
     }
 
     FileDataStorageManager getStorageManager() {
-        return new FileDataStorageManager(account, context.getContentResolver());
+        return new FileDataStorageManager(account, targetContext.getContentResolver());
     }
 
     private static void createDummyFiles() throws IOException {

+ 2 - 2
src/androidTest/java/com/owncloud/android/FileIT.java

@@ -35,7 +35,7 @@ public class FileIT extends AbstractIT {
         assertTrue(getStorageManager().getFileByPath(path).isFolder());
 
         // cleanup
-        new RemoveFileOperation(path, false, account, false, context).execute(client, getStorageManager());
+        new RemoveFileOperation(path, false, account, false, targetContext).execute(client, getStorageManager());
     }
 
     @Test
@@ -52,6 +52,6 @@ public class FileIT extends AbstractIT {
         assertTrue(getStorageManager().getFileByPath(path).isFolder());
 
         // cleanup
-        new RemoveFileOperation("/testFolder/", false, account, false, context).execute(client, getStorageManager());
+        new RemoveFileOperation("/testFolder/", false, account, false, targetContext).execute(client, getStorageManager());
     }
 }

+ 24 - 6
src/androidTest/java/com/owncloud/android/UploadIT.java

@@ -1,5 +1,10 @@
 package com.owncloud.android;
 
+import android.content.ContentResolver;
+
+import com.nextcloud.client.account.CurrentAccountProvider;
+import com.owncloud.android.authentication.AccountUtils;
+import com.owncloud.android.datamodel.UploadsStorageManager;
 import com.owncloud.android.db.OCUpload;
 import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
@@ -7,6 +12,7 @@ import com.owncloud.android.operations.RemoveFileOperation;
 import com.owncloud.android.operations.UploadFileOperation;
 import com.owncloud.android.utils.FileStorageUtils;
 
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -21,6 +27,16 @@ import static junit.framework.TestCase.assertTrue;
 @RunWith(AndroidJUnit4.class)
 public class UploadIT extends AbstractIT {
 
+
+    private UploadsStorageManager storageManager;
+
+    @Before
+    public void setUp() {
+        final ContentResolver contentResolver = targetContext.getContentResolver();
+        final CurrentAccountProvider currentAccountProvider = () -> AccountUtils.getCurrentOwnCloudAccount(targetContext);
+        storageManager = new UploadsStorageManager(currentAccountProvider, contentResolver, targetContext);
+    }
+
     @Test
     public void testEmptyUpload() {
         OCUpload ocUpload = new OCUpload(FileStorageUtils.getSavePath(account.name) + "/empty.txt",
@@ -31,7 +47,7 @@ public class UploadIT extends AbstractIT {
         assertTrue(result.toString(), result.isSuccess());
 
         // cleanup
-        new RemoveFileOperation("/testUpload/", false, account, false, context).execute(client, getStorageManager());
+        new RemoveFileOperation("/testUpload/", false, account, false, targetContext).execute(client, getStorageManager());
     }
 
     @Test
@@ -44,7 +60,7 @@ public class UploadIT extends AbstractIT {
         assertTrue(result.toString(), result.isSuccess());
 
         // cleanup
-        new RemoveFileOperation("/testUpload/", false, account, false, context).execute(client, getStorageManager());
+        new RemoveFileOperation("/testUpload/", false, account, false, targetContext).execute(client, getStorageManager());
     }
 
     @Test
@@ -57,17 +73,18 @@ public class UploadIT extends AbstractIT {
         assertTrue(result.toString(), result.isSuccess());
 
         // cleanup
-        new RemoveFileOperation("/testUpload/", false, account, false, context).execute(client, getStorageManager());
+        new RemoveFileOperation("/testUpload/", false, account, false, targetContext).execute(client, getStorageManager());
     }
 
     public RemoteOperationResult testUpload(OCUpload ocUpload) {
         UploadFileOperation newUpload = new UploadFileOperation(
+            storageManager,
             account,
             null,
             ocUpload,
             false,
             FileUploader.LOCAL_BEHAVIOUR_COPY,
-            context,
+            targetContext,
             false,
             false
         );
@@ -85,12 +102,13 @@ public class UploadIT extends AbstractIT {
         OCUpload ocUpload = new OCUpload(FileStorageUtils.getSavePath(account.name) + "/empty.txt",
                 "/testUpload/2/3/4/1.txt", account.name);
         UploadFileOperation newUpload = new UploadFileOperation(
+                storageManager,
                 account,
                 null,
                 ocUpload,
                 false,
                 FileUploader.LOCAL_BEHAVIOUR_COPY,
-                context,
+                targetContext,
                 false,
                 false
         );
@@ -104,6 +122,6 @@ public class UploadIT extends AbstractIT {
         assertTrue(result.toString(), result.isSuccess());
 
         // cleanup
-        new RemoveFileOperation("/testUpload/", false, account, false, context).execute(client, getStorageManager());
+        new RemoveFileOperation("/testUpload/", false, account, false, targetContext).execute(client, getStorageManager());
     }
 }

+ 4 - 1
src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.java

@@ -4,6 +4,7 @@ import android.accounts.Account;
 import android.content.ContentResolver;
 import android.content.Context;
 
+import com.nextcloud.client.account.CurrentAccountProvider;
 import com.owncloud.android.db.OCUpload;
 
 import org.junit.After;
@@ -14,6 +15,7 @@ import org.junit.runner.RunWith;
 
 import java.io.File;
 
+import androidx.annotation.Nullable;
 import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
@@ -28,12 +30,13 @@ public class UploadStorageManagerTest {
 
     private Account[] Accounts;
     private UploadsStorageManager uploadsStorageManager;
+    private CurrentAccountProvider currentAccountProvider = () -> null;
 
     @Before
     public void setUp() {
         Context instrumentationCtx = InstrumentationRegistry.getTargetContext();
         ContentResolver contentResolver = instrumentationCtx.getContentResolver();
-        uploadsStorageManager = new UploadsStorageManager(contentResolver, instrumentationCtx);
+        uploadsStorageManager = new UploadsStorageManager(currentAccountProvider, contentResolver, instrumentationCtx);
         Accounts = new Account[]{new Account("A", "A"), new Account("B", "B")};
     }
 

+ 20 - 0
src/main/java/com/nextcloud/client/account/CurrentAccountProvider.java

@@ -0,0 +1,20 @@
+package com.nextcloud.client.account;
+
+import android.accounts.Account;
+
+import androidx.annotation.Nullable;
+
+/**
+ * This interface provides access to currently selected user Account.
+ * @see UserAccountManager
+ */
+@FunctionalInterface
+public interface CurrentAccountProvider {
+    /**
+     *  Get currently active account.
+     *
+     * @return Currently selected {@link Account} or first valid {@link Account} registered in OS or null, if not available at all.
+     */
+    @Nullable
+    Account getCurrentAccount();
+}

+ 1 - 1
src/main/java/com/nextcloud/client/account/UserAccountManager.java

@@ -23,7 +23,7 @@ import android.accounts.Account;
 
 import androidx.annotation.NonNull;
 
-public interface UserAccountManager {
+public interface UserAccountManager extends CurrentAccountProvider {
 
     int ACCOUNT_VERSION = 1;
     int ACCOUNT_VERSION_WITH_PROPER_ID = 2;

+ 10 - 1
src/main/java/com/nextcloud/client/account/UserAccountManagerImpl.java

@@ -39,6 +39,7 @@ import com.owncloud.android.lib.resources.users.GetRemoteUserInfoOperation;
 import javax.inject.Inject;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 
 public class UserAccountManagerImpl implements UserAccountManager {
 
@@ -49,7 +50,10 @@ public class UserAccountManagerImpl implements UserAccountManager {
     private AccountManager accountManager;
 
     @Inject
-    public UserAccountManagerImpl(Context context, AccountManager accountManager) {
+    public UserAccountManagerImpl(
+        Context context,
+        AccountManager accountManager
+    ) {
         this.context = context;
         this.accountManager = accountManager;
     }
@@ -60,6 +64,11 @@ public class UserAccountManagerImpl implements UserAccountManager {
         return accountManager.getAccountsByType(getAccountType());
     }
 
+    @Nullable
+    public Account getCurrentAccount() {
+        return AccountUtils.getCurrentOwnCloudAccount(context);
+    }
+
     public void updateAccountVersion() {
         Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(context);
 

+ 44 - 1
src/main/java/com/nextcloud/client/di/AppModule.java

@@ -22,12 +22,23 @@ package com.nextcloud.client.di;
 
 import android.accounts.AccountManager;
 import android.app.Application;
+import android.content.ContentResolver;
 import android.content.Context;
 
+import com.nextcloud.client.account.CurrentAccountProvider;
 import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.account.UserAccountManagerImpl;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.nextcloud.client.preferences.AppPreferencesImpl;
+import com.owncloud.android.datamodel.ArbitraryDataProvider;
+import com.owncloud.android.datamodel.UploadsStorageManager;
+import com.owncloud.android.ui.activities.data.activities.ActivitiesRepository;
+import com.owncloud.android.ui.activities.data.activities.ActivitiesServiceApi;
+import com.owncloud.android.ui.activities.data.activities.ActivitiesServiceApiImpl;
+import com.owncloud.android.ui.activities.data.activities.RemoteActivitiesRepository;
+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 dagger.Module;
 import dagger.Provides;
@@ -51,7 +62,39 @@ class AppModule {
     }
 
     @Provides
-    UserAccountManager userAccountManager(Context context, AccountManager accountManager) {
+    UserAccountManager userAccountManager(
+        Context context,
+        AccountManager accountManager
+    ) {
         return new UserAccountManagerImpl(context, accountManager);
     }
+
+    @Provides
+    ArbitraryDataProvider arbitraryDataProvider(Context context) {
+        final ContentResolver resolver = context.getContentResolver();
+        return new ArbitraryDataProvider(resolver);
+    }
+
+    @Provides
+    ActivitiesServiceApi activitiesServiceApi(UserAccountManager accountManager) {
+        return new ActivitiesServiceApiImpl(accountManager);
+    }
+
+    @Provides
+    ActivitiesRepository activitiesRepository(ActivitiesServiceApi api) {
+        return new RemoteActivitiesRepository(api);
+    }
+
+    @Provides
+    FilesRepository filesRepository(UserAccountManager accountManager) {
+        return new RemoteFilesRepository(new FilesServiceApiImpl(accountManager));
+    }
+
+    @Provides UploadsStorageManager uploadsStorageManager(Context context, CurrentAccountProvider currentAccountProvider) {
+        return new UploadsStorageManager(currentAccountProvider, context.getContentResolver(), context);
+    }
+
+    @Provides CurrentAccountProvider currentAccountProvider(UserAccountManager accountManager) {
+        return accountManager;
+    }
 }

+ 13 - 0
src/main/java/com/nextcloud/client/di/ComponentsModule.java

@@ -23,8 +23,12 @@ package com.nextcloud.client.di;
 import com.owncloud.android.authentication.AuthenticatorActivity;
 import com.owncloud.android.authentication.DeepLinkLoginActivity;
 import com.owncloud.android.files.BootupBroadcastReceiver;
+import com.owncloud.android.files.services.FileUploader;
+import com.owncloud.android.providers.DiskLruImageCacheFileProvider;
 import com.owncloud.android.providers.DocumentsStorageProvider;
+import com.owncloud.android.providers.UsersAndGroupsSearchProvider;
 import com.owncloud.android.ui.activities.ActivitiesActivity;
+import com.owncloud.android.ui.activity.BaseActivity;
 import com.owncloud.android.ui.activity.ConflictsResolveActivity;
 import com.owncloud.android.ui.activity.ContactsPreferenceActivity;
 import com.owncloud.android.ui.activity.CopyToClipboardActivity;
@@ -53,8 +57,10 @@ import com.owncloud.android.ui.activity.UploadListActivity;
 import com.owncloud.android.ui.activity.UploadPathActivity;
 import com.owncloud.android.ui.activity.UserInfoActivity;
 import com.owncloud.android.ui.activity.WhatsNewActivity;
+import com.owncloud.android.ui.dialog.ChooseTemplateDialogFragment;
 import com.owncloud.android.ui.errorhandling.ErrorShowActivity;
 import com.owncloud.android.ui.fragment.ExtendedListFragment;
+import com.owncloud.android.ui.fragment.FileDetailActivitiesFragment;
 import com.owncloud.android.ui.fragment.FileDetailFragment;
 import com.owncloud.android.ui.fragment.LocalFileListFragment;
 import com.owncloud.android.ui.fragment.OCFileListFragment;
@@ -73,6 +79,7 @@ import dagger.android.ContributesAndroidInjector;
 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();
@@ -111,8 +118,14 @@ abstract class ComponentsModule {
     @ContributesAndroidInjector abstract FileDetailFragment fileDetailFragment();
     @ContributesAndroidInjector abstract LocalFileListFragment localFileListFragment();
     @ContributesAndroidInjector abstract OCFileListFragment ocFileListFragment();
+    @ContributesAndroidInjector abstract FileDetailActivitiesFragment fileDetailActivitiesFragment();
+    @ContributesAndroidInjector abstract ChooseTemplateDialogFragment chooseTemplateDialogFragment();
+
+    @ContributesAndroidInjector abstract FileUploader fileUploader();
 
     @ContributesAndroidInjector abstract BootupBroadcastReceiver bootupBroadcastReceiver();
 
     @ContributesAndroidInjector abstract DocumentsStorageProvider documentsStorageProvider();
+    @ContributesAndroidInjector abstract UsersAndGroupsSearchProvider usersAndGroupsSearchProvider();
+    @ContributesAndroidInjector abstract DiskLruImageCacheFileProvider diskLruImageCacheFileProvider();
 }

+ 3 - 0
src/main/java/com/nextcloud/client/preferences/AppPreferences.java

@@ -280,4 +280,7 @@ public interface AppPreferences {
     void setStoragePath(String path);
 
     void removeKeysMigrationPreference();
+
+    String getCurrentAccountName();
+    void setCurrentAccountName(String accountName);
 }

+ 12 - 0
src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java

@@ -25,6 +25,7 @@ import android.accounts.Account;
 import android.annotation.SuppressLint;
 import android.content.Context;
 import android.content.SharedPreferences;
+
 import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.datamodel.ArbitraryDataProvider;
 import com.owncloud.android.datamodel.FileDataStorageManager;
@@ -68,6 +69,7 @@ public final class AppPreferencesImpl implements AppPreferences {
     private static final String PREF__LOCK_TIMESTAMP = "lock_timestamp";
     private static final String PREF__SHOW_MEDIA_SCAN_NOTIFICATIONS = "show_media_scan_notifications";
     private static final String PREF__LOCK = SettingsActivity.PREFERENCE_LOCK;
+    private static final String PREF__SELECTED_ACCOUNT_NAME = "select_oc_account";
 
     private final Context context;
     private final SharedPreferences preferences;
@@ -424,6 +426,16 @@ public final class AppPreferencesImpl implements AppPreferences {
         preferences.edit().remove(AppPreferencesImpl.PREF__KEYS_MIGRATION).commit(); // commit synchronously
     }
 
+    @Override
+    public String getCurrentAccountName() {
+        return preferences.getString(PREF__SELECTED_ACCOUNT_NAME, null);
+    }
+
+    @Override
+    public void setCurrentAccountName(String accountName) {
+        preferences.edit().putString(PREF__SELECTED_ACCOUNT_NAME, accountName).apply();
+    }
+
     /**
      * Get preference value for a folder.
      * If folder is not set itself, it finds an ancestor that is set.

+ 28 - 15
src/main/java/com/owncloud/android/MainApp.java

@@ -58,6 +58,7 @@ import com.owncloud.android.datamodel.MediaProvider;
 import com.owncloud.android.datamodel.SyncedFolder;
 import com.owncloud.android.datamodel.SyncedFolderProvider;
 import com.owncloud.android.datamodel.ThumbnailsCacheManager;
+import com.owncloud.android.datamodel.UploadsStorageManager;
 import com.owncloud.android.datastorage.DataStorageProvider;
 import com.owncloud.android.datastorage.StoragePoint;
 import com.owncloud.android.jobs.MediaFoldersDetectionJob;
@@ -135,25 +136,28 @@ public class MainApp extends MultiDexApplication implements
     private static boolean mOnlyOnDevice;
 
     @Inject
-    AppPreferences preferences;
+    protected AppPreferences preferences;
 
     @Inject
-    DispatchingAndroidInjector<Activity> dispatchingActivityInjector;
+    protected DispatchingAndroidInjector<Activity> dispatchingActivityInjector;
 
     @Inject
-    DispatchingAndroidInjector<Fragment> dispatchingFragmentInjector;
+    protected DispatchingAndroidInjector<Fragment> dispatchingFragmentInjector;
 
     @Inject
-    DispatchingAndroidInjector<Service> dispatchingServiceInjector;
+    protected DispatchingAndroidInjector<Service> dispatchingServiceInjector;
 
     @Inject
-    DispatchingAndroidInjector<ContentProvider> dispatchingContentProviderInjector;
+    protected DispatchingAndroidInjector<ContentProvider> dispatchingContentProviderInjector;
 
     @Inject
-    DispatchingAndroidInjector<BroadcastReceiver> dispatchingBroadcastReceiverInjector;
+    protected DispatchingAndroidInjector<BroadcastReceiver> dispatchingBroadcastReceiverInjector;
 
     @Inject
-    UserAccountManager accountManager;
+    protected UserAccountManager accountManager;
+
+    @Inject
+    protected UploadsStorageManager uploadsStorageManager;
 
     private PassCodeManager passCodeManager;
 
@@ -176,7 +180,14 @@ public class MainApp extends MultiDexApplication implements
 
         registerActivityLifecycleCallbacks(new ActivityInjector());
 
-        JobManager.create(this).addJobCreator(new NCJobCreator(getApplicationContext(), accountManager, preferences));
+        JobManager.create(this).addJobCreator(
+            new NCJobCreator(
+                getApplicationContext(),
+                accountManager,
+                preferences,
+                uploadsStorageManager
+            )
+        );
         MainApp.mContext = getApplicationContext();
 
         new SecurityUtils();
@@ -217,7 +228,7 @@ public class MainApp extends MultiDexApplication implements
             }
         }
 
-        initSyncOperations(accountManager);
+        initSyncOperations(uploadsStorageManager, accountManager);
         initContactsBackup(accountManager);
         notificationChannels();
 
@@ -342,7 +353,10 @@ public class MainApp extends MultiDexApplication implements
         }
     }
 
-    public static void initSyncOperations(UserAccountManager accountManager) {
+    public static void initSyncOperations(
+        final UploadsStorageManager uploadsStorageManager,
+        final UserAccountManager accountManager
+    ) {
         updateToAutoUpload();
         cleanOldEntries();
         updateAutoUploadEntries();
@@ -360,18 +374,17 @@ public class MainApp extends MultiDexApplication implements
         initiateExistingAutoUploadEntries();
 
         FilesSyncHelper.scheduleFilesSyncIfNeeded(mContext);
-        FilesSyncHelper.restartJobsIfNeeded(accountManager);
+        FilesSyncHelper.restartJobsIfNeeded(uploadsStorageManager, accountManager);
         FilesSyncHelper.scheduleOfflineSyncIfNeeded();
 
-        ReceiversHelper.registerNetworkChangeReceiver(accountManager);
+        ReceiversHelper.registerNetworkChangeReceiver(uploadsStorageManager, accountManager);
 
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
-            ReceiversHelper.registerPowerChangeReceiver(accountManager
-            );
+            ReceiversHelper.registerPowerChangeReceiver(uploadsStorageManager, accountManager);
         }
 
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-            ReceiversHelper.registerPowerSaveReceiver(accountManager);
+            ReceiversHelper.registerPowerSaveReceiver(uploadsStorageManager, accountManager);
         }
     }
 

+ 7 - 1
src/main/java/com/owncloud/android/authentication/AuthenticatorActivity.java

@@ -88,6 +88,7 @@ import android.widget.TextView.OnEditorActionListener;
 import com.blikoon.qrcodescanner.QrCodeActivity;
 import com.google.android.material.snackbar.Snackbar;
 import com.google.android.material.textfield.TextInputLayout;
+import com.nextcloud.client.account.UserAccountManager;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.SsoWebViewClient.SsoWebViewClientListener;
@@ -133,6 +134,8 @@ import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.fragment.app.DialogFragment;
@@ -262,6 +265,9 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
     private TextInputLayout mPasswordInputLayout;
     private boolean forceOldLoginMethod;
 
+    @Inject
+    protected UserAccountManager accountManager;
+
     /**
      * {@inheritDoc}
      *
@@ -1976,7 +1982,7 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity
             }
 
             /// add the new account as default in preferences, if there is none already
-            Account defaultAccount = AccountUtils.getCurrentOwnCloudAccount(this);
+            Account defaultAccount = accountManager.getCurrentAccount();
             if (defaultAccount == null) {
                 SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit();
                 editor.putString("select_oc_account", accountName);

+ 16 - 7
src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.java

@@ -4,7 +4,10 @@
  * @author LukeOwncloud
  * @author David A. Velasco
  * @author masensio
+ * @author Chris Narkiewicz
+ *
  * Copyright (C) 2016 ownCloud Inc.
+ * 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 General Public License version 2,
@@ -27,7 +30,7 @@ import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
 
-import com.owncloud.android.authentication.AccountUtils;
+import com.nextcloud.client.account.CurrentAccountProvider;
 import com.owncloud.android.db.OCUpload;
 import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
 import com.owncloud.android.db.UploadResult;
@@ -53,13 +56,19 @@ public class UploadsStorageManager extends Observable {
 
     private ContentResolver mContentResolver;
     private Context mContext;
+    private CurrentAccountProvider currentAccountProvider;
 
-    public UploadsStorageManager(ContentResolver contentResolver, Context context) {
+    public UploadsStorageManager(
+        CurrentAccountProvider currentAccountProvider,
+        ContentResolver contentResolver,
+        Context context
+    ) {
         if (contentResolver == null) {
             throw new IllegalArgumentException("Cannot create an instance with a NULL contentResolver");
         }
         mContentResolver = contentResolver;
         mContext = context;
+        this.currentAccountProvider = currentAccountProvider;
     }
 
     /**
@@ -340,7 +349,7 @@ public class UploadsStorageManager extends Observable {
     }
 
     public OCUpload[] getCurrentAndPendingUploadsForCurrentAccount() {
-        Account account = AccountUtils.getCurrentOwnCloudAccount(mContext);
+        Account account = currentAccountProvider.getCurrentAccount();
 
         if (account != null) {
             return getUploads(
@@ -379,7 +388,7 @@ public class UploadsStorageManager extends Observable {
     }
 
     public OCUpload[] getFinishedUploadsForCurrentAccount() {
-        Account account = AccountUtils.getCurrentOwnCloudAccount(mContext);
+        Account account = currentAccountProvider.getCurrentAccount();
 
         if (account != null) {
             return getUploads(ProviderTableMeta.UPLOADS_STATUS + "==" + UploadStatus.UPLOAD_SUCCEEDED.value + AND +
@@ -398,7 +407,7 @@ public class UploadsStorageManager extends Observable {
     }
 
     public OCUpload[] getFailedButNotDelayedUploadsForCurrentAccount() {
-        Account account = AccountUtils.getCurrentOwnCloudAccount(mContext);
+        Account account = currentAccountProvider.getCurrentAccount();
 
         if (account != null) {
             return getUploads(ProviderTableMeta.UPLOADS_STATUS + "==" + UploadStatus.UPLOAD_FAILED.value +
@@ -441,7 +450,7 @@ public class UploadsStorageManager extends Observable {
     }
 
     public long clearFailedButNotDelayedUploads() {
-        Account account = AccountUtils.getCurrentOwnCloudAccount(mContext);
+        Account account = currentAccountProvider.getCurrentAccount();
 
         long result = 0;
         if (account != null) {
@@ -469,7 +478,7 @@ public class UploadsStorageManager extends Observable {
     }
 
     public long clearSuccessfulUploads() {
-        Account account = AccountUtils.getCurrentOwnCloudAccount(mContext);
+        Account account = currentAccountProvider.getCurrentAccount();
 
         long result = 0;
         if (account != null) {

+ 4 - 3
src/main/java/com/owncloud/android/files/BootupBroadcastReceiver.java

@@ -29,6 +29,7 @@ import android.content.Intent;
 
 import com.nextcloud.client.account.UserAccountManager;
 import com.owncloud.android.MainApp;
+import com.owncloud.android.datamodel.UploadsStorageManager;
 import com.owncloud.android.lib.common.utils.Log_OC;
 
 import javax.inject.Inject;
@@ -44,8 +45,8 @@ public class BootupBroadcastReceiver extends BroadcastReceiver {
 
     private static final String TAG = BootupBroadcastReceiver.class.getSimpleName();
 
-    @Inject
-    UserAccountManager accountManager;
+    @Inject UserAccountManager accountManager;
+    @Inject UploadsStorageManager uploadsStorageManager;
 
     /**
      * Receives broadcast intent reporting that the system was just boot up.
@@ -58,7 +59,7 @@ public class BootupBroadcastReceiver extends BroadcastReceiver {
         AndroidInjection.inject(this, context);
 
         if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
-            MainApp.initSyncOperations(accountManager);
+            MainApp.initSyncOperations(uploadsStorageManager, accountManager);
             MainApp.initContactsBackup(accountManager);
         } else {
             Log_OC.d(TAG, "Getting wrong intent: " + intent.getAction());

+ 21 - 5
src/main/java/com/owncloud/android/files/services/FileUploader.java

@@ -5,9 +5,11 @@
  *  @author masensio
  *  @author LukeOwnCloud
  *  @author David A. Velasco
+ *  @author Chris Narkiewicz
  *
  *  Copyright (C) 2012 Bartek Przybylski
  *  Copyright (C) 2012-2016 ownCloud Inc.
+ *  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 General Public License version 2,
@@ -46,6 +48,7 @@ import android.util.Pair;
 
 import com.evernote.android.job.JobRequest;
 import com.evernote.android.job.util.Device;
+import com.nextcloud.client.account.UserAccountManager;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.AccountUtils;
@@ -74,6 +77,8 @@ import com.owncloud.android.utils.ErrorMessageAdapter;
 import com.owncloud.android.utils.PowerUtils;
 import com.owncloud.android.utils.ThemeUtils;
 
+import org.jetbrains.annotations.NotNull;
+
 import java.io.File;
 import java.util.AbstractList;
 import java.util.HashMap;
@@ -82,8 +87,11 @@ import java.util.Map;
 import java.util.Vector;
 
 import javax.annotation.Nullable;
+import javax.inject.Inject;
 
+import androidx.annotation.NonNull;
 import androidx.core.app.NotificationCompat;
+import dagger.android.AndroidInjection;
 
 /**
  * Service for uploading files. Invoke using context.startService(...).
@@ -121,6 +129,9 @@ public class FileUploader extends Service
 
     private Notification mNotification;
 
+    @Inject
+    protected UserAccountManager accountManager;
+
     /**
      * Call this Service with only this Intent key if all pending uploads are to be retried.
      */
@@ -174,7 +185,7 @@ public class FileUploader extends Service
     private Account mCurrentAccount;
     private FileDataStorageManager mStorageManager;
     //since there can be only one instance of an Android service, there also just one db connection.
-    private UploadsStorageManager mUploadsStorageManager;
+    @Inject UploadsStorageManager mUploadsStorageManager;
 
     private IndexedForest<UploadFileOperation> mPendingUploads = new IndexedForest<>();
 
@@ -386,8 +397,12 @@ public class FileUploader extends Service
          * @param uploadResult      If not null, only failed uploads with the result specified will be retried;
          *                          otherwise, failed uploads due to any result will be retried.
          */
-        public void retryFailedUploads(Context context, Account account, UploadResult uploadResult) {
-            UploadsStorageManager uploadsStorageManager = new UploadsStorageManager(context.getContentResolver(), context);
+        public void retryFailedUploads(
+            @NonNull final Context context,
+            @Nullable Account account,
+            @NotNull final UploadsStorageManager uploadsStorageManager,
+            @Nullable final UploadResult uploadResult
+        ) {
             OCUpload[] failedUploads = uploadsStorageManager.getFailedUploads();
             Account currentAccount = null;
             boolean resultMatch;
@@ -451,6 +466,7 @@ public class FileUploader extends Service
     @Override
     public void onCreate() {
         super.onCreate();
+        AndroidInjection.inject(this);
         Log_OC.d(TAG, "Creating service");
         mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
         HandlerThread thread = new HandlerThread("FileUploaderThread",
@@ -460,8 +476,6 @@ public class FileUploader extends Service
         mServiceHandler = new ServiceHandler(mServiceLooper, this);
         mBinder = new FileUploaderBinder();
 
-        mUploadsStorageManager = new UploadsStorageManager(getContentResolver(), getApplicationContext());
-
         NotificationCompat.Builder builder = new NotificationCompat.Builder(this).setContentTitle(
                 getApplicationContext().getResources().getString(R.string.app_name))
                 .setContentText(getApplicationContext().getResources().getString(R.string.foreground_service_upload))
@@ -627,6 +641,7 @@ public class FileUploader extends Service
 
 
                     newUpload = new UploadFileOperation(
+                        mUploadsStorageManager,
                             account,
                             file,
                             ocUpload,
@@ -685,6 +700,7 @@ public class FileUploader extends Service
             whileChargingOnly = upload.isWhileChargingOnly();
 
             UploadFileOperation newUpload = new UploadFileOperation(
+                    mUploadsStorageManager,
                     account,
                     null,
                     upload,

+ 10 - 2
src/main/java/com/owncloud/android/jobs/AccountRemovalJob.java

@@ -2,8 +2,11 @@
  * Nextcloud Android client application
  *
  * @author Tobias Kaminsky
+ * @author Chris Narkiewicz
+ *
  * Copyright (C) 2017 Tobias Kaminsky
  * Copyright (C) 2017 Nextcloud GmbH.
+ * 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
@@ -63,6 +66,13 @@ public class AccountRemovalJob extends Job implements AccountManagerCallback<Boo
     public static final String TAG = "AccountRemovalJob";
     public static final String ACCOUNT = "account";
 
+    private UploadsStorageManager uploadsStorageManager;
+
+    public AccountRemovalJob(UploadsStorageManager uploadStorageManager) {
+        this.uploadsStorageManager = uploadStorageManager;
+
+    }
+
     @NonNull
     @Override
     protected Result onRunJob(Params params) {
@@ -109,8 +119,6 @@ public class AccountRemovalJob extends Job implements AccountManagerCallback<Boo
 
             syncedFolderProvider.deleteSyncFoldersForAccount(account);
 
-            UploadsStorageManager uploadsStorageManager = new UploadsStorageManager(context.getContentResolver(),
-                    context);
             uploadsStorageManager.removeAccountUploads(account);
 
             FilesystemDataProvider filesystemDataProvider = new FilesystemDataProvider(context.getContentResolver());

+ 9 - 2
src/main/java/com/owncloud/android/jobs/FilesSyncJob.java

@@ -43,6 +43,7 @@ import com.owncloud.android.datamodel.FilesystemDataProvider;
 import com.owncloud.android.datamodel.MediaFolderType;
 import com.owncloud.android.datamodel.SyncedFolder;
 import com.owncloud.android.datamodel.SyncedFolderProvider;
+import com.owncloud.android.datamodel.UploadsStorageManager;
 import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.operations.UploadFileOperation;
@@ -77,10 +78,16 @@ public class FilesSyncJob extends Job {
 
     private UserAccountManager userAccountManager;
     private AppPreferences preferences;
+    private UploadsStorageManager uploadsStorageManager;
 
-    public FilesSyncJob(UserAccountManager userAccountManager, AppPreferences preferences) {
+    public FilesSyncJob(
+        final UserAccountManager userAccountManager,
+        final AppPreferences preferences,
+        final UploadsStorageManager uploadsStorageManager
+    ) {
         this.userAccountManager = userAccountManager;
         this.preferences = preferences;
+        this.uploadsStorageManager = uploadsStorageManager;
     }
 
     @NonNull
@@ -109,7 +116,7 @@ public class FilesSyncJob extends Job {
         boolean lightVersion = resources.getBoolean(R.bool.syncedFolder_light);
 
         final boolean skipCustom = bundle.getBoolean(SKIP_CUSTOM, false);
-        FilesSyncHelper.restartJobsIfNeeded(userAccountManager);
+        FilesSyncHelper.restartJobsIfNeeded(uploadsStorageManager, userAccountManager);
         FilesSyncHelper.insertAllDBEntries(preferences, skipCustom);
 
         // Create all the providers we'll need

+ 14 - 4
src/main/java/com/owncloud/android/jobs/NCJobCreator.java

@@ -1,11 +1,13 @@
-/**
+/*
  * Nextcloud Android client application
  *
  * @author Mario Danic
  * @author Chris Narkiewicz
+ *
  * Copyright (C) 2017 Mario Danic
  * Copyright (C) 2017 Nextcloud GmbH
  * Copyright (C) 2019 Chris Narkiewicz <hello@ezaquarii.com>
+ *
  * <p>
  * 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
@@ -28,6 +30,7 @@ import com.evernote.android.job.Job;
 import com.evernote.android.job.JobCreator;
 import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.preferences.AppPreferences;
+import com.owncloud.android.datamodel.UploadsStorageManager;
 
 import androidx.annotation.NonNull;
 
@@ -40,11 +43,18 @@ public class NCJobCreator implements JobCreator {
     private final Context context;
     private final UserAccountManager accountManager;
     private final AppPreferences preferences;
+    private final UploadsStorageManager uploadsStorageManager;
 
-    public NCJobCreator(Context context, UserAccountManager accountManager, AppPreferences preferences) {
+    public NCJobCreator(
+        Context context,
+        UserAccountManager accountManager,
+        AppPreferences preferences,
+        UploadsStorageManager uploadsStorageManager
+    ) {
         this.context = context;
         this.accountManager = accountManager;
         this.preferences = preferences;
+        this.uploadsStorageManager = uploadsStorageManager;
     }
 
     @Override
@@ -55,9 +65,9 @@ public class NCJobCreator implements JobCreator {
             case ContactsImportJob.TAG:
                 return new ContactsImportJob();
             case AccountRemovalJob.TAG:
-                return new AccountRemovalJob();
+                return new AccountRemovalJob(uploadsStorageManager);
             case FilesSyncJob.TAG:
-                return new FilesSyncJob(accountManager, preferences);
+                return new FilesSyncJob(accountManager, preferences, uploadsStorageManager);
             case OfflineSyncJob.TAG:
                 return new OfflineSyncJob(accountManager);
             case NotificationJob.TAG:

+ 8 - 6
src/main/java/com/owncloud/android/operations/UploadFileOperation.java

@@ -2,7 +2,9 @@
  * ownCloud Android client application
  *
  * @author David A. Velasco
+ * @author Chris Narkiewicz
  * Copyright (C) 2016 ownCloud GmbH.
+ * 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 General Public License version 2,
@@ -142,9 +144,9 @@ public class UploadFileOperation extends SyncOperation {
 
     private RequestEntity mEntity;
 
-    private Account mAccount;
-    private OCUpload mUpload;
-    private UploadsStorageManager uploadsStorageManager;
+    final private Account mAccount;
+    final private OCUpload mUpload;
+    final private UploadsStorageManager uploadsStorageManager;
 
     private boolean encryptedAncestor;
 
@@ -174,7 +176,8 @@ public class UploadFileOperation extends SyncOperation {
         return newFile;
     }
 
-    public UploadFileOperation(Account account,
+    public UploadFileOperation(UploadsStorageManager uploadsStorageManager,
+                               Account account,
                                OCFile file,
                                OCUpload upload,
                                boolean forceOverwrite,
@@ -195,6 +198,7 @@ public class UploadFileOperation extends SyncOperation {
                             + upload.getLocalPath());
         }
 
+        this.uploadsStorageManager = uploadsStorageManager;
         mAccount = account;
         mUpload = upload;
         if (file == null) {
@@ -352,8 +356,6 @@ public class UploadFileOperation extends SyncOperation {
         mCancellationRequested.set(false);
         mUploadStarted.set(true);
 
-        uploadsStorageManager = new UploadsStorageManager(mContext.getContentResolver(), mContext);
-
         for (OCUpload ocUpload : uploadsStorageManager.getAllStoredUploads()) {
             if (ocUpload.getUploadId() == getOCUploadId()) {
                 ocUpload.setFileSize(0);

+ 9 - 1
src/main/java/com/owncloud/android/providers/DiskLruImageCacheFileProvider.java

@@ -31,6 +31,7 @@ import android.net.Uri;
 import android.os.ParcelFileDescriptor;
 import android.provider.OpenableColumns;
 
+import com.nextcloud.client.account.UserAccountManager;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.datamodel.FileDataStorageManager;
@@ -43,18 +44,25 @@ import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
+import dagger.android.AndroidInjection;
 
 public class DiskLruImageCacheFileProvider extends ContentProvider {
     public static final String TAG = DiskLruImageCacheFileProvider.class.getSimpleName();
 
+    @Inject
+    protected UserAccountManager accountManager;
+
     @Override
     public boolean onCreate() {
+        AndroidInjection.inject(this);
         return true;
     }
 
     private OCFile getFile(Uri uri) {
-        Account account = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext());
+        Account account = accountManager.getCurrentAccount();
         FileDataStorageManager fileDataStorageManager = new FileDataStorageManager(account,
                 MainApp.getAppContext().getContentResolver());
 

+ 15 - 2
src/main/java/com/owncloud/android/providers/UsersAndGroupsSearchProvider.java

@@ -34,6 +34,7 @@ import android.os.Looper;
 import android.provider.BaseColumns;
 import android.widget.Toast;
 
+import com.nextcloud.client.account.UserAccountManager;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.datamodel.FileDataStorageManager;
@@ -53,8 +54,11 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import dagger.android.AndroidInjection;
 
 
 /**
@@ -89,6 +93,9 @@ public class UsersAndGroupsSearchProvider extends ContentProvider {
 
     private UriMatcher mUriMatcher;
 
+    @Inject
+    protected UserAccountManager accountManager;
+
     private static Map<String, ShareType> sShareTypes = new HashMap<>();
 
     public static ShareType getShareType(String authority) {
@@ -96,6 +103,10 @@ public class UsersAndGroupsSearchProvider extends ContentProvider {
         return sShareTypes.get(authority);
     }
 
+    private static void setActionShareWith(@NonNull Context context) {
+        ACTION_SHARE_WITH = context.getResources().getString(R.string.users_and_groups_share_with);
+    }
+
     @Nullable
     @Override
     public String getType(@NonNull Uri uri) {
@@ -105,12 +116,14 @@ public class UsersAndGroupsSearchProvider extends ContentProvider {
 
     @Override
     public boolean onCreate() {
+        AndroidInjection.inject(this);
+
         if (getContext() == null) {
             return false;
         }
 
         String AUTHORITY = getContext().getResources().getString(R.string.users_and_groups_search_authority);
-        ACTION_SHARE_WITH = getContext().getResources().getString(R.string.users_and_groups_share_with);
+        setActionShareWith(getContext());
         DATA_USER = AUTHORITY + ".data.user";
         DATA_GROUP = AUTHORITY + ".data.group";
         DATA_ROOM = AUTHORITY + ".data.room";
@@ -168,7 +181,7 @@ public class UsersAndGroupsSearchProvider extends ContentProvider {
 
         // need to trust on the AccountUtils to get the current account since the query in the client side is not
         // directly started by our code, but from SearchView implementation
-        Account account = AccountUtils.getCurrentOwnCloudAccount(getContext());
+        Account account = accountManager.getCurrentAccount();
 
         if (account == null) {
             throw new IllegalArgumentException("Account may not be null!");

+ 15 - 6
src/main/java/com/owncloud/android/ui/activities/ActivitiesActivity.java

@@ -37,7 +37,8 @@ import com.owncloud.android.lib.common.OwnCloudClient;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.activities.model.RichObject;
 import com.owncloud.android.lib.resources.files.FileUtils;
-import com.owncloud.android.ui.activities.data.Injection;
+import com.owncloud.android.ui.activities.data.activities.ActivitiesRepository;
+import com.owncloud.android.ui.activities.data.files.FilesRepository;
 import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
 import com.owncloud.android.ui.adapter.ActivityListAdapter;
@@ -49,6 +50,8 @@ import com.owncloud.android.utils.ThemeUtils;
 
 import java.util.List;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.ActionBar;
 import androidx.recyclerview.widget.LinearLayoutManager;
@@ -99,15 +102,15 @@ public class ActivitiesActivity extends FileActivity implements ActivityListInte
     private boolean isLoadingActivities;
 
     private ActivitiesContract.ActionListener mActionListener;
+    @Inject ActivitiesRepository activitiesRepository;
+    @Inject FilesRepository filesRepository;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         Log_OC.v(TAG, "onCreate() start");
         super.onCreate(savedInstanceState);
 
-        mActionListener = new ActivitiesPresenter(Injection.provideActivitiesRepository(),
-                Injection.provideFilesRepository(),
-                this);
+        mActionListener = new ActivitiesPresenter(activitiesRepository, filesRepository, this);
 
         setContentView(R.layout.activity_list_layout);
         unbinder = ButterKnife.bind(this);
@@ -171,7 +174,7 @@ public class ActivitiesActivity extends FileActivity implements ActivityListInte
                 PorterDuff.Mode.SRC_IN);
 
         FileDataStorageManager storageManager = new FileDataStorageManager(getAccount(), getContentResolver());
-        adapter = new ActivityListAdapter(this, this, storageManager, getCapabilities(), false);
+        adapter = new ActivityListAdapter(this, getUserAccountManager(), this, storageManager, getCapabilities(), false);
         recyclerView.setAdapter(adapter);
 
         LinearLayoutManager layoutManager = new LinearLayoutManager(this);
@@ -198,7 +201,13 @@ public class ActivitiesActivity extends FileActivity implements ActivityListInte
 
         if (getResources().getBoolean(R.bool.bottom_toolbar_enabled)) {
             bottomNavigationView.setVisibility(View.VISIBLE);
-            DisplayUtils.setupBottomBar(bottomNavigationView, getResources(), this, -1);
+            DisplayUtils.setupBottomBar(
+                getUserAccountManager().getCurrentAccount(),
+                bottomNavigationView,
+                getResources(),
+                this,
+                -1
+            );
         }
 
         mActionListener.loadActivities(null);

+ 0 - 41
src/main/java/com/owncloud/android/ui/activities/data/Injection.java

@@ -1,41 +0,0 @@
-/**
- *   Nextcloud Android client application
- *
- *   Copyright (C) 2018 Edvard Holst
- *
- *   This program is free software; you can redistribute it and/or
- *   modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
- *   License as published by the Free Software Foundation; either
- *   version 3 of the License, or 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.owncloud.android.ui.activities.data;
-
-import com.owncloud.android.ui.activities.data.activities.ActivitiesRepository;
-import com.owncloud.android.ui.activities.data.activities.ActivitiesServiceApiImpl;
-import com.owncloud.android.ui.activities.data.activities.ActivityRepositories;
-import com.owncloud.android.ui.activities.data.files.FileRepositories;
-import com.owncloud.android.ui.activities.data.files.FilesRepository;
-import com.owncloud.android.ui.activities.data.files.FilesServiceApiImpl;
-
-public class Injection {
-
-    private Injection () {
-        // Required empty constructor
-    }
-
-    public static ActivitiesRepository provideActivitiesRepository() {
-        return ActivityRepositories.getRepository(new ActivitiesServiceApiImpl());
-    }
-
-    public static FilesRepository provideFilesRepository() {
-        return FileRepositories.getRepository(new FilesServiceApiImpl());
-    }
-}

+ 17 - 5
src/main/java/com/owncloud/android/ui/activities/data/activities/ActivitiesServiceApiImpl.java

@@ -1,7 +1,11 @@
 /*
  *   Nextcloud Android client application
  *
+ *   @author Edvard Holst
+ *   @author Chris Narkiewicz
+ *
  *   Copyright (C) 2018 Edvard Holst
+ *   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
@@ -24,6 +28,7 @@ import android.accounts.OperationCanceledException;
 import android.content.Context;
 import android.os.AsyncTask;
 
+import com.nextcloud.client.account.UserAccountManager;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.AccountUtils;
@@ -46,10 +51,16 @@ import java.util.List;
 public class ActivitiesServiceApiImpl implements ActivitiesServiceApi {
 
     private static final String TAG = ActivitiesServiceApiImpl.class.getSimpleName();
+    private UserAccountManager accountManager;
+
+    public ActivitiesServiceApiImpl(UserAccountManager accountManager) {
+        this.accountManager = accountManager;
+    }
 
     @Override
     public void getAllActivities(String pageUrl, ActivitiesServiceCallback<List<Object>> callback) {
-        GetActivityListTask getActivityListTask = new GetActivityListTask(pageUrl, callback);
+        Account account = accountManager.getCurrentAccount();
+        GetActivityListTask getActivityListTask = new GetActivityListTask(account, pageUrl, callback);
         getActivityListTask.execute();
     }
 
@@ -57,11 +68,13 @@ public class ActivitiesServiceApiImpl implements ActivitiesServiceApi {
 
         private final ActivitiesServiceCallback<List<Object>> callback;
         private List<Object> activities;
+        private Account account;
         private String pageUrl;
         private String errorMessage;
         private OwnCloudClient ownCloudClient;
 
-        private GetActivityListTask(String pageUrl, ActivitiesServiceCallback<List<Object>> callback) {
+        private GetActivityListTask(Account account, String pageUrl, ActivitiesServiceCallback<List<Object>> callback) {
+            this.account = account;
             this.pageUrl = pageUrl;
             this.callback = callback;
             activities = new ArrayList<>();
@@ -71,13 +84,12 @@ public class ActivitiesServiceApiImpl implements ActivitiesServiceApi {
         @Override
         protected Boolean doInBackground(Void... voids) {
             final Context context = MainApp.getAppContext();
-            final Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(context);
             OwnCloudAccount ocAccount;
             try {
-                ocAccount = new OwnCloudAccount(currentAccount, context);
+                ocAccount = new OwnCloudAccount(account, context);
                 ownCloudClient = OwnCloudClientManagerFactory.getDefaultSingleton().
                         getClientFor(ocAccount, MainApp.getAppContext());
-                ownCloudClient.setOwnCloudVersion(AccountUtils.getServerVersion(currentAccount));
+                ownCloudClient.setOwnCloudVersion(AccountUtils.getServerVersion(account));
 
                 GetActivitiesRemoteOperation getRemoteNotificationOperation = new GetActivitiesRemoteOperation();
                 if (pageUrl != null) {

+ 22 - 5
src/main/java/com/owncloud/android/ui/activities/data/files/FilesServiceApiImpl.java

@@ -1,7 +1,11 @@
 /*
  *   Nextcloud Android client application
  *
+ *   @author Chris Narkiewicz
+ *   @author Edvard Holst
+ *
  *   Copyright (C) 2018 Edvard Holst
+ *   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
@@ -24,6 +28,7 @@ import android.accounts.OperationCanceledException;
 import android.content.Context;
 import android.os.AsyncTask;
 
+import com.nextcloud.client.account.UserAccountManager;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.AccountUtils;
@@ -49,9 +54,20 @@ public class FilesServiceApiImpl implements FilesServiceApi {
 
     private static final String TAG = FilesServiceApiImpl.class.getSimpleName();
 
+    private UserAccountManager accountManager;
+
+    public FilesServiceApiImpl(UserAccountManager accountManager) {
+        this.accountManager = accountManager;
+    }
+
     @Override
     public void readRemoteFile(String fileUrl, BaseActivity activity, FilesServiceCallback<OCFile> callback) {
-        ReadRemoteFileTask readRemoteFileTask = new ReadRemoteFileTask(fileUrl, activity, callback);
+        ReadRemoteFileTask readRemoteFileTask = new ReadRemoteFileTask(
+            accountManager.getCurrentAccount(),
+            fileUrl,
+            activity,
+            callback
+        );
         readRemoteFileTask.execute();
     }
 
@@ -62,24 +78,25 @@ public class FilesServiceApiImpl implements FilesServiceApi {
         // TODO: Figure out a better way to do this than passing a BaseActivity reference.
         private final BaseActivity baseActivity;
         private final String fileUrl;
+        private final Account account;
 
-        private ReadRemoteFileTask(String fileUrl, BaseActivity baseActivity, FilesServiceCallback<OCFile> callback) {
+        private ReadRemoteFileTask(Account account, String fileUrl, BaseActivity baseActivity, FilesServiceCallback<OCFile> callback) {
             this.callback = callback;
             this.baseActivity = baseActivity;
             this.fileUrl = fileUrl;
+            this.account = account;
         }
 
         @Override
         protected Boolean doInBackground(Void... voids) {
-            final Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext());
             final Context context = MainApp.getAppContext();
             OwnCloudAccount ocAccount;
             OwnCloudClient ownCloudClient;
             try {
-                ocAccount = new OwnCloudAccount(currentAccount, context);
+                ocAccount = new OwnCloudAccount(account, context);
                 ownCloudClient = OwnCloudClientManagerFactory.getDefaultSingleton().
                         getClientFor(ocAccount, MainApp.getAppContext());
-                ownCloudClient.setOwnCloudVersion(AccountUtils.getServerVersion(currentAccount));
+                ownCloudClient.setOwnCloudVersion(AccountUtils.getServerVersion(account));
                 // always update file as it could be an old state saved in database
                 RemoteOperationResult resultRemoteFileOp = new ReadFileRemoteOperation(fileUrl).execute(ownCloudClient);
 

+ 1 - 1
src/main/java/com/owncloud/android/ui/activities/data/files/RemoteFilesRepository.java

@@ -23,7 +23,7 @@ import com.owncloud.android.ui.activity.BaseActivity;
 
 import androidx.annotation.NonNull;
 
-class RemoteFilesRepository implements FilesRepository {
+public class RemoteFilesRepository implements FilesRepository {
 
     private final FilesServiceApi filesServiceApi;
 

+ 13 - 3
src/main/java/com/owncloud/android/ui/activity/BaseActivity.java

@@ -9,6 +9,8 @@ import android.content.Intent;
 import android.os.Bundle;
 import android.os.Handler;
 
+import com.nextcloud.client.account.UserAccountManager;
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.datamodel.FileDataStorageManager;
@@ -16,12 +18,14 @@ import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.status.OCCapability;
 
+import javax.inject.Inject;
+
 import androidx.appcompat.app.AppCompatActivity;
 
 /**
  * Base activity with common behaviour for activities dealing with ownCloud {@link Account}s .
  */
-public abstract class BaseActivity extends AppCompatActivity {
+public abstract class BaseActivity extends AppCompatActivity implements Injectable {
     private static final String TAG = BaseActivity.class.getSimpleName();
 
     /**
@@ -49,10 +53,16 @@ public abstract class BaseActivity extends AppCompatActivity {
      */
     private FileDataStorageManager mStorageManager;
 
+    @Inject UserAccountManager accountManager;
+
+    public UserAccountManager getUserAccountManager() {
+        return accountManager;
+    }
+
     @Override
     protected void onNewIntent (Intent intent) {
         Log_OC.v(TAG, "onNewIntent() start");
-        Account current = AccountUtils.getCurrentOwnCloudAccount(this);
+        Account current = accountManager.getCurrentAccount();
         if (current != null && mCurrentAccount != null && !mCurrentAccount.name.equals(current.name)) {
             mCurrentAccount = current;
         }
@@ -108,7 +118,7 @@ public abstract class BaseActivity extends AppCompatActivity {
      */
     protected void swapToDefaultAccount() {
         // default to the most recently used account
-        Account newAccount = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());
+        Account newAccount = accountManager.getCurrentAccount();
         if (newAccount == null) {
             /// no account available: force account creation
             createAccount(true);

+ 7 - 1
src/main/java/com/owncloud/android/ui/activity/ContactsPreferenceActivity.java

@@ -109,7 +109,13 @@ public class ContactsPreferenceActivity extends FileActivity implements FileFrag
 
         if (getResources().getBoolean(R.bool.bottom_toolbar_enabled)) {
             bottomNavigationView.setVisibility(View.VISIBLE);
-            DisplayUtils.setupBottomBar(bottomNavigationView, getResources(), this, -1);
+            DisplayUtils.setupBottomBar(
+                getUserAccountManager().getCurrentAccount(),
+                bottomNavigationView,
+                getResources(),
+                this,
+                -1
+            );
         }
     }
 

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

@@ -356,7 +356,7 @@ public abstract class DrawerActivity extends ToolbarActivity
             navigationView.getMenu().setGroupVisible(R.id.drawer_menu_accounts, false);
         }
 
-        Account account = AccountUtils.getCurrentOwnCloudAccount(this);
+        Account account = accountManager.getCurrentAccount();
         filterDrawerMenu(navigationView.getMenu(), account);
     }
 
@@ -545,11 +545,10 @@ public abstract class DrawerActivity extends ToolbarActivity
      * @param accountName The account name to be set
      */
     private void accountClicked(String accountName) {
-        if (!AccountUtils.getCurrentOwnCloudAccount(getApplicationContext()).name.equals(accountName)) {
+        final Account currentAccount = accountManager.getCurrentAccount();
+        if (currentAccount != null && !TextUtils.equals(currentAccount.name, accountName)) {
             AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), accountName);
-
             fetchExternalLinks(true);
-
             restart();
         }
     }
@@ -654,7 +653,7 @@ public abstract class DrawerActivity extends ToolbarActivity
         if (mNavigationView != null && mDrawerLayout != null) {
             if (persistingAccounts.size() > 0) {
                 repopulateAccountList(persistingAccounts);
-                setAccountInDrawer(AccountUtils.getCurrentOwnCloudAccount(this));
+                setAccountInDrawer(accountManager.getCurrentAccount());
                 populateDrawerOwnCloudAccounts();
 
                 // activate second/end account avatar
@@ -974,15 +973,15 @@ public abstract class DrawerActivity extends ToolbarActivity
         // set user space information
         Thread t = new Thread(new Runnable() {
             public void run() {
-                Context context = MainApp.getAppContext();
-                Account account = AccountUtils.getCurrentOwnCloudAccount(context);
+                final Account currentAccount = accountManager.getCurrentAccount();
 
-                if (account == null) {
+                if (currentAccount == null) {
                     return;
                 }
 
+                final Context context = MainApp.getAppContext();
                 AccountManager mAccountMgr = AccountManager.get(context);
-                String userId = mAccountMgr.getUserData(account,
+                String userId = mAccountMgr.getUserData(currentAccount,
                         com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_USER_ID);
 
                 RemoteOperation getQuotaInfoOperation;
@@ -992,7 +991,7 @@ public abstract class DrawerActivity extends ToolbarActivity
                     getQuotaInfoOperation = new GetRemoteUserInfoOperation(userId);
                 }
 
-                RemoteOperationResult result = getQuotaInfoOperation.execute(account, context);
+                RemoteOperationResult result = getQuotaInfoOperation.execute(currentAccount, context);
 
                 if (result.isSuccess() && result.getData() != null) {
                     final UserInfo userInfo = (UserInfo) result.getData().get(0);
@@ -1000,7 +999,7 @@ public abstract class DrawerActivity extends ToolbarActivity
 
                     // Since we always call this method, might as well put it here
                     if (userInfo.getId() != null) {
-                        mAccountMgr.setUserData(account,
+                        mAccountMgr.setUserData(currentAccount,
                                 com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_USER_ID,
                                 userInfo.getId());
                     }
@@ -1252,7 +1251,7 @@ public abstract class DrawerActivity extends ToolbarActivity
 
             // current account has changed
             if (data.getBooleanExtra(ManageAccountsActivity.KEY_CURRENT_ACCOUNT_CHANGED, false)) {
-                setAccount(AccountUtils.getCurrentOwnCloudAccount(this));
+                setAccount(accountManager.getCurrentAccount());
                 updateAccountList();
                 restart();
             } else {
@@ -1334,7 +1333,7 @@ public abstract class DrawerActivity extends ToolbarActivity
             }
         }
 
-        Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(this);
+        Account currentAccount = accountManager.getCurrentAccount();
 
         mAvatars[0] = currentAccount;
         int j = 0;
@@ -1416,7 +1415,7 @@ public abstract class DrawerActivity extends ToolbarActivity
                     getCapabilities.execute(getStorageManager(), getBaseContext());
                 }
 
-                Account account = AccountUtils.getCurrentOwnCloudAccount(this);
+                Account account = accountManager.getCurrentAccount();
 
                 if (account != null && getStorageManager() != null &&
                         getStorageManager().getCapability(account.name) != null &&

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

@@ -141,7 +141,8 @@ public abstract class FileActivity extends DrawerActivity
     private ServiceConnection mDownloadServiceConnection;
     private ServiceConnection mUploadServiceConnection;
 
-    @Inject UserAccountManager accountManager;
+    @Inject
+    protected UserAccountManager accountManager;
 
     @Override
     public void showFiles(boolean onDeviceOnly) {
@@ -160,7 +161,7 @@ public abstract class FileActivity extends DrawerActivity
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         mHandler = new Handler();
-        mFileOperationsHelper = new FileOperationsHelper(this);
+        mFileOperationsHelper = new FileOperationsHelper(this, getUserAccountManager());
         Account account = null;
 
         if (savedInstanceState != null) {

+ 8 - 10
src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -58,16 +58,15 @@ import android.widget.ImageView;
 
 import com.google.android.material.bottomnavigation.BottomNavigationView;
 import com.google.android.material.snackbar.Snackbar;
-import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.di.Injectable;
+import com.nextcloud.client.preferences.AppPreferences;
+import com.nextcloud.client.preferences.AppPreferencesImpl;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.ArbitraryDataProvider;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.VirtualFolderType;
-import com.nextcloud.client.preferences.AppPreferences;
-import com.nextcloud.client.preferences.AppPreferencesImpl;
 import com.owncloud.android.files.services.FileDownloader;
 import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
 import com.owncloud.android.files.services.FileUploader;
@@ -214,7 +213,6 @@ public class FileDisplayActivity extends FileActivity
 
     private SearchView searchView;
     @Inject AppPreferences preferences;
-    @Inject UserAccountManager accountManager;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -2367,7 +2365,7 @@ public class FileDisplayActivity extends FileActivity
         if (showPreview) {
             startActivity(showDetailsIntent);
         } else {
-            FileOperationsHelper fileOperationsHelper = new FileOperationsHelper(this);
+            FileOperationsHelper fileOperationsHelper = new FileOperationsHelper(this, getUserAccountManager());
             fileOperationsHelper.startSyncForFileAndIntent(file, showDetailsIntent);
         }
     }
@@ -2386,7 +2384,7 @@ public class FileDisplayActivity extends FileActivity
         if (showPreview) {
             startActivity(showDetailsIntent);
         } else {
-            FileOperationsHelper fileOperationsHelper = new FileOperationsHelper(this);
+            FileOperationsHelper fileOperationsHelper = new FileOperationsHelper(this, getUserAccountManager());
             fileOperationsHelper.startSyncForFileAndIntent(file, showDetailsIntent);
         }
     }
@@ -2413,7 +2411,7 @@ public class FileDisplayActivity extends FileActivity
             previewIntent.putExtra(EXTRA_FILE, file);
             previewIntent.putExtra(PreviewVideoActivity.EXTRA_START_POSITION, startPlaybackPosition);
             previewIntent.putExtra(PreviewVideoActivity.EXTRA_AUTOPLAY, autoplay);
-            FileOperationsHelper fileOperationsHelper = new FileOperationsHelper(this);
+            FileOperationsHelper fileOperationsHelper = new FileOperationsHelper(this, getUserAccountManager());
             fileOperationsHelper.startSyncForFileAndIntent(file, previewIntent);
         }
     }
@@ -2440,7 +2438,7 @@ public class FileDisplayActivity extends FileActivity
             Intent previewIntent = new Intent();
             previewIntent.putExtra(EXTRA_FILE, file);
             previewIntent.putExtra(TEXT_PREVIEW, true);
-            FileOperationsHelper fileOperationsHelper = new FileOperationsHelper(this);
+            FileOperationsHelper fileOperationsHelper = new FileOperationsHelper(this, getUserAccountManager());
             fileOperationsHelper.startSyncForFileAndIntent(file, previewIntent);
         }
     }
@@ -2570,9 +2568,9 @@ public class FileDisplayActivity extends FileActivity
     @Subscribe(threadMode = ThreadMode.BACKGROUND)
     public void onMessageEvent(TokenPushEvent event) {
         if (!preferences.isKeysReInitEnabled()) {
-            PushUtils.reinitKeys(accountManager);
+            PushUtils.reinitKeys(getUserAccountManager());
         } else {
-            PushUtils.pushRegistrationToServer(accountManager, preferences.getPushToken());
+            PushUtils.pushRegistrationToServer(getUserAccountManager(), preferences.getPushToken());
         }
     }
 

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

@@ -2,7 +2,9 @@
  * ownCloud Android client application
  *
  * @author Andy Scherzinger
+ * @author Chris Narkiewicz
  * Copyright (C) 2016 ownCloud Inc.
+ * Copyright (C) 2019 Chris Narkiewicz <hello@ezaquarii.com>
  * <p/>
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2,
@@ -117,7 +119,7 @@ public class ManageAccountsActivity extends FileActivity
         Account[] accountList = AccountManager.get(this).getAccountsByType(MainApp.getAccountType(this));
         mOriginalAccounts = DisplayUtils.toAccountNameSet(Arrays.asList(accountList));
 
-        Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(this);
+        Account currentAccount = getUserAccountManager().getCurrentAccount();
 
         if (currentAccount != null) {
             mOriginalCurrentAccount = currentAccount.name;
@@ -128,7 +130,7 @@ public class ManageAccountsActivity extends FileActivity
 
         arbitraryDataProvider = new ArbitraryDataProvider(getContentResolver());
 
-        mAccountListAdapter = new AccountListAdapter(this, getAccountListItems(), mTintedCheck);
+        mAccountListAdapter = new AccountListAdapter(this, getUserAccountManager(), getAccountListItems(), mTintedCheck);
 
         mListView.setAdapter(mAccountListAdapter);
 
@@ -213,7 +215,7 @@ public class ManageAccountsActivity extends FileActivity
      * @return true if account list has changed, false if not
      */
     private boolean hasCurrentAccountChanged() {
-        Account account = AccountUtils.getCurrentOwnCloudAccount(this);
+        Account account = getUserAccountManager().getCurrentAccount();
         if (account == null) {
             return true;
         } else {
@@ -297,6 +299,7 @@ public class ManageAccountsActivity extends FileActivity
                                 AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), name);
                                 mAccountListAdapter = new AccountListAdapter(
                                         ManageAccountsActivity.this,
+                                        getUserAccountManager(),
                                         getAccountListItems(),
                                         mTintedCheck
                                 );
@@ -340,7 +343,7 @@ public class ManageAccountsActivity extends FileActivity
                 }
             }
 
-            if (AccountUtils.getCurrentOwnCloudAccount(this) == null) {
+            if (getUserAccountManager().getCurrentAccount() == null) {
                 String accountName = "";
                 Account[] accounts = AccountManager.get(this).getAccountsByType(MainApp.getAccountType(this));
                 if (accounts.length != 0) {
@@ -351,7 +354,7 @@ public class ManageAccountsActivity extends FileActivity
 
             List<AccountListItem> accountListItemArray = getAccountListItems();
             if (accountListItemArray.size() > SINGLE_ACCOUNT) {
-                mAccountListAdapter = new AccountListAdapter(this, accountListItemArray, mTintedCheck);
+                mAccountListAdapter = new AccountListAdapter(this, getUserAccountManager(), accountListItemArray, mTintedCheck);
                 mListView.setAdapter(mAccountListAdapter);
             } else {
                 onBackPressed();

+ 9 - 2
src/main/java/com/owncloud/android/ui/activity/NotificationsActivity.java

@@ -3,8 +3,10 @@
  *
  * @author Andy Scherzinger
  * @author Mario Danic
+ * @author Chris Narkiewicz
  * Copyright (C) 2017 Andy Scherzinger
  * Copyright (C) 2017 Mario Danic
+ * 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
@@ -126,7 +128,7 @@ public class NotificationsActivity extends FileActivity implements Notifications
 
             if (account != null && (currentAccount == null || !account.equalsIgnoreCase(currentAccount.name))) {
                 AccountUtils.setCurrentOwnCloudAccount(this, account);
-                setAccount(AccountUtils.getCurrentOwnCloudAccount(this));
+                setAccount(getUserAccountManager().getCurrentAccount());
                 currentAccount = getAccount();
             }
         }
@@ -244,7 +246,12 @@ public class NotificationsActivity extends FileActivity implements Notifications
 
         if (getResources().getBoolean(R.bool.bottom_toolbar_enabled)) {
             bottomNavigationView.setVisibility(View.VISIBLE);
-            DisplayUtils.setupBottomBar(bottomNavigationView, getResources(), this, -1);
+            DisplayUtils.setupBottomBar(
+                getUserAccountManager().getCurrentAccount(),
+                bottomNavigationView,
+                getResources(),
+                this,
+                -1);
         }
 
         fetchAndSetData();

+ 10 - 5
src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java

@@ -5,8 +5,10 @@
  *  @author masensio
  *  @author Juan Carlos González Cabrero
  *  @author David A. Velasco
+ *  @author Chris Narkiewicz
  *  Copyright (C) 2012  Bartek Przybylski
  *  Copyright (C) 2016 ownCloud Inc.
+ *  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 General Public License version 2,
@@ -73,6 +75,7 @@ import androidx.core.view.MenuItemCompat;
 import androidx.fragment.app.DialogFragment;
 import androidx.fragment.app.FragmentManager;
 
+import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.owncloud.android.MainApp;
@@ -285,10 +288,12 @@ public class ReceiveExternalFilesActivity extends FileActivity
         }
     }
 
-    public static class DialogMultipleAccount extends DialogFragment {
+    public static class DialogMultipleAccount extends DialogFragment implements Injectable {
         private AccountListAdapter mAccountListAdapter;
         private Drawable mTintedCheck;
 
+        @Inject UserAccountManager accountManager;
+
         @NonNull
         @Override
         public Dialog onCreateDialog(Bundle savedInstanceState) {
@@ -299,14 +304,14 @@ public class ReceiveExternalFilesActivity extends FileActivity
             int tint = ThemeUtils.primaryColor(getContext());
             DrawableCompat.setTint(mTintedCheck, tint);
 
-            mAccountListAdapter = new AccountListAdapter(parent, getAccountListItems(parent), mTintedCheck);
+            mAccountListAdapter = new AccountListAdapter(parent, accountManager, getAccountListItems(parent), mTintedCheck);
 
             builder.setTitle(R.string.common_choose_account);
             builder.setAdapter(mAccountListAdapter, (dialog, which) -> {
-                final ReceiveExternalFilesActivity parent1 = (ReceiveExternalFilesActivity) getActivity();
-                parent1.setAccount(parent1.mAccountManager.getAccountsByType(
+                final ReceiveExternalFilesActivity parentActivity = (ReceiveExternalFilesActivity) getActivity();
+                parentActivity.setAccount(parentActivity.mAccountManager.getAccountsByType(
                         MainApp.getAccountType(getActivity()))[which], false);
-                parent1.onAccountSet(parent1.mAccountWasRestored);
+                parentActivity.onAccountSet(parentActivity.mAccountWasRestored);
                 dialog.dismiss();
             });
             builder.setCancelable(true);

+ 10 - 1
src/main/java/com/owncloud/android/ui/activity/RichDocumentsWebView.java

@@ -2,8 +2,11 @@
  * Nextcloud Android client application
  *
  * @author Tobias Kaminsky
+ * @author Chris Narkiewicz
+ *
  * Copyright (C) 2018 Tobias Kaminsky
  * Copyright (C) 2018 Nextcloud GmbH.
+ * 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 General Public License as published by
@@ -44,6 +47,7 @@ import android.widget.Toast;
 
 import com.bumptech.glide.Glide;
 import com.google.android.material.snackbar.Snackbar;
+import com.nextcloud.client.account.CurrentAccountProvider;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.datamodel.OCFile;
@@ -62,6 +66,8 @@ import org.parceler.Parcels;
 
 import java.lang.ref.WeakReference;
 
+import javax.inject.Inject;
+
 import androidx.annotation.RequiresApi;
 import butterknife.BindView;
 import butterknife.ButterKnife;
@@ -94,6 +100,9 @@ public class RichDocumentsWebView extends ExternalSiteWebView {
     @BindView(R.id.filename)
     TextView fileName;
 
+    @Inject
+    protected CurrentAccountProvider currentAccountProvider;
+
     @SuppressLint("AddJavascriptInterface") // suppress warning as webview is only used >= Lollipop
     @Override
     protected void onCreate(Bundle savedInstanceState) {
@@ -131,7 +140,7 @@ public class RichDocumentsWebView extends ExternalSiteWebView {
                     break;
             }
 
-            Glide.with(this).using(new CustomGlideStreamLoader()).load(template.getThumbnailLink())
+            Glide.with(this).using(new CustomGlideStreamLoader(currentAccountProvider)).load(template.getThumbnailLink())
                 .placeholder(placeholder)
                 .error(placeholder)
                 .into(thumbnail);

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

@@ -4,6 +4,7 @@
  *   @author Bartek Przybylski
  *   @author David A. Velasco
  *   @author Chris Narkiewicz
+ *
  *   Copyright (C) 2011  Bartek Przybylski
  *   Copyright (C) 2016 ownCloud Inc.
  *   Copyright (C) 2016 Nextcloud
@@ -126,8 +127,9 @@ public class SettingsActivity extends PreferenceActivity
     private String pendingLock;
 
     private Account account;
-    private ArbitraryDataProvider arbitraryDataProvider;
+    @Inject ArbitraryDataProvider arbitraryDataProvider;
     @Inject AppPreferences preferences;
+    @Inject UserAccountManager accountManager;
 
     @SuppressWarnings("deprecation")
     @Override
@@ -151,8 +153,7 @@ public class SettingsActivity extends PreferenceActivity
         String appVersion = getAppVersion();
         PreferenceScreen preferenceScreen = (PreferenceScreen) findPreference("preference_screen");
 
-        account = AccountUtils.getCurrentOwnCloudAccount(getApplicationContext());
-        arbitraryDataProvider = new ArbitraryDataProvider(getContentResolver());
+        account = accountManager.getCurrentAccount();
 
         // retrieve user's base uri
         setupBaseUri();

+ 9 - 3
src/main/java/com/owncloud/android/ui/activity/SyncedFoldersActivity.java

@@ -133,7 +133,7 @@ public class SyncedFoldersActivity extends FileActivity implements SyncedFolderA
 
             if (account != null && currentAccount != null && !account.equalsIgnoreCase(currentAccount.name)) {
                 AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), account);
-                setAccount(AccountUtils.getCurrentOwnCloudAccount(this));
+                setAccount(getUserAccountManager().getCurrentAccount());
             }
 
             path = getIntent().getStringExtra(MediaFoldersDetectionJob.KEY_MEDIA_FOLDER_PATH);
@@ -205,7 +205,13 @@ public class SyncedFoldersActivity extends FileActivity implements SyncedFolderA
 
         if (getResources().getBoolean(R.bool.bottom_toolbar_enabled)) {
             bottomNavigationView.setVisibility(View.VISIBLE);
-            DisplayUtils.setupBottomBar(bottomNavigationView, getResources(), this, -1);
+            DisplayUtils.setupBottomBar(
+                getUserAccountManager().getCurrentAccount(),
+                bottomNavigationView,
+                getResources(),
+                this,
+                -1
+            );
         }
 
         load(gridWidth * 2, false);
@@ -228,7 +234,7 @@ public class SyncedFoldersActivity extends FileActivity implements SyncedFolderA
 
         List<SyncedFolder> syncedFolderArrayList = mSyncedFolderProvider.getSyncedFolders();
         List<SyncedFolder> currentAccountSyncedFoldersList = new ArrayList<>();
-        Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(this);
+        Account currentAccount = getUserAccountManager().getCurrentAccount();
         for (SyncedFolder syncedFolder : syncedFolderArrayList) {
             if (currentAccount != null && syncedFolder.getAccount().equals(currentAccount.name)) {
 

+ 18 - 11
src/main/java/com/owncloud/android/ui/activity/UploadListActivity.java

@@ -81,8 +81,6 @@ public class UploadListActivity extends FileActivity {
 
     private static final String TAG = UploadListActivity.class.getSimpleName();
 
-    private UploadsStorageManager uploadStorageManager;
-
     private UploadMessagesReceiver uploadMessagesReceiver;
 
     private UploadListAdapter uploadListAdapter;
@@ -108,7 +106,12 @@ public class UploadListActivity extends FileActivity {
     public String noResultsMessage;
 
     private Unbinder unbinder;
-    @Inject UserAccountManager userAccountManager;
+
+    @Inject
+    protected UserAccountManager userAccountManager;
+
+    @Inject
+    protected UploadsStorageManager uploadsStorageManager;
 
     @Override
     public void showFiles(boolean onDeviceOnly) {
@@ -122,8 +125,6 @@ public class UploadListActivity extends FileActivity {
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        uploadStorageManager = new UploadsStorageManager(getContentResolver(), getApplicationContext());
-
         setContentView(R.layout.upload_list_layout);
         unbinder = ButterKnife.bind(this);
 
@@ -150,7 +151,13 @@ public class UploadListActivity extends FileActivity {
 
         if (getResources().getBoolean(R.bool.bottom_toolbar_enabled)) {
             bottomNavigationView.setVisibility(View.VISIBLE);
-            DisplayUtils.setupBottomBar(bottomNavigationView, getResources(), this, -1);
+            DisplayUtils.setupBottomBar(
+                getUserAccountManager().getCurrentAccount(),
+                bottomNavigationView,
+                getResources(),
+                this,
+                -1
+            );
         }
     }
 
@@ -165,7 +172,7 @@ public class UploadListActivity extends FileActivity {
         emptyContentHeadline.setText(noResultsHeadline);
         emptyContentMessage.setText(noResultsMessage);
 
-        uploadListAdapter = new UploadListAdapter(this);
+        uploadListAdapter = new UploadListAdapter(this, uploadsStorageManager);
 
         final GridLayoutManager lm = new GridLayoutManager(this, 1);
         uploadListAdapter.setLayoutManager(lm);
@@ -209,7 +216,7 @@ public class UploadListActivity extends FileActivity {
 
         // retry failed uploads
         FileUploader.UploadRequester requester = new FileUploader.UploadRequester();
-        new Thread(() -> requester.retryFailedUploads(this, null, null)).start();
+        new Thread(() -> requester.retryFailedUploads(this, null, uploadsStorageManager,null)).start();
 
         // update UI
         uploadListAdapter.loadUploadItemsFromDb();
@@ -266,7 +273,7 @@ public class UploadListActivity extends FileActivity {
                 }
                 break;
             case R.id.action_clear_failed_uploads:
-                uploadStorageManager.clearFailedButNotDelayedUploads();
+                uploadsStorageManager.clearFailedButNotDelayedUploads();
                 uploadListAdapter.loadUploadItemsFromDb();
                 break;
 
@@ -281,7 +288,7 @@ public class UploadListActivity extends FileActivity {
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
         if (requestCode == FileActivity.REQUEST_CODE__UPDATE_CREDENTIALS && resultCode == RESULT_OK) {
-            FilesSyncHelper.restartJobsIfNeeded(userAccountManager);
+            FilesSyncHelper.restartJobsIfNeeded(uploadsStorageManager, userAccountManager);
         }
     }
 
@@ -301,7 +308,7 @@ public class UploadListActivity extends FileActivity {
 
             } else {
                 // already updated -> just retry!
-                FilesSyncHelper.restartJobsIfNeeded(userAccountManager);
+                FilesSyncHelper.restartJobsIfNeeded(uploadsStorageManager, userAccountManager);
             }
 
         } else {

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

@@ -120,7 +120,6 @@ public class UserInfoActivity extends FileActivity implements Injectable {
     @BindString(R.string.user_information_retrieval_error) protected String sorryMessage;
 
     @Inject AppPreferences preferences;
-    @Inject UserAccountManager accountManager;
     private float mCurrentAccountAvatarRadiusDimension;
 
     private Unbinder unbinder;
@@ -145,7 +144,7 @@ public class UserInfoActivity extends FileActivity implements Injectable {
         setContentView(R.layout.user_info_layout);
         unbinder = ButterKnife.bind(this);
 
-        setAccount(AccountUtils.getCurrentOwnCloudAccount(this));
+        setAccount(getUserAccountManager().getCurrentAccount());
         onAccountSet(false);
 
         boolean useBackgroundImage = URLUtil.isValidUrl(
@@ -447,7 +446,7 @@ public class UserInfoActivity extends FileActivity implements Injectable {
 
     @Subscribe(threadMode = ThreadMode.BACKGROUND)
     public void onMessageEvent(TokenPushEvent event) {
-        PushUtils.pushRegistrationToServer(accountManager, preferences.getPushToken());
+        PushUtils.pushRegistrationToServer(getUserAccountManager(), preferences.getPushToken());
     }
 
 

+ 4 - 3
src/main/java/com/owncloud/android/ui/adapter/AccountListAdapter.java

@@ -33,7 +33,6 @@ import android.widget.TextView;
 
 import com.nextcloud.client.account.UserAccountManager;
 import com.owncloud.android.R;
-import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.lib.common.OwnCloudAccount;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.ui.activity.BaseActivity;
@@ -54,10 +53,12 @@ public class AccountListAdapter extends ArrayAdapter<AccountListItem> implements
     private List<AccountListItem> mValues;
     private AccountListAdapterListener mListener;
     private Drawable mTintedCheck;
+    private UserAccountManager accountManager;
 
-    public AccountListAdapter(BaseActivity context, List<AccountListItem> values, Drawable tintedCheck) {
+    public AccountListAdapter(BaseActivity context, UserAccountManager accountManager, List<AccountListItem> values, Drawable tintedCheck) {
         super(context, -1, values);
         this.mContext = context;
+        this.accountManager = accountManager;
         this.mValues = values;
         if (context instanceof AccountListAdapterListener) {
             this.mListener = (AccountListAdapterListener) context;
@@ -149,7 +150,7 @@ public class AccountListAdapter extends ArrayAdapter<AccountListItem> implements
     }
 
     private void setCurrentlyActiveState(AccountViewHolderItem viewHolder, Account account) {
-        Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(getContext());
+        Account currentAccount = accountManager.getCurrentAccount();
         if (currentAccount != null && currentAccount.name.equals(account.name)) {
             viewHolder.checkViewItem.setVisibility(View.VISIBLE);
         } else {

+ 33 - 4
src/main/java/com/owncloud/android/ui/adapter/ActivityAndVersionListAdapter.java

@@ -1,3 +1,26 @@
+/*
+ * Nextcloud Android client application
+ *
+ * @author Chris Narkiewicz
+ * @author Tobias Kaminsky
+ *
+ * Copyright (C) 2019 Tobias Kaminsky
+ * 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.owncloud.android.ui.adapter;
 
 import android.content.Context;
@@ -8,6 +31,7 @@ import android.view.ViewGroup;
 import android.widget.ImageView;
 import android.widget.TextView;
 
+import com.nextcloud.client.account.CurrentAccountProvider;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.lib.common.OwnCloudClient;
@@ -32,10 +56,15 @@ public class ActivityAndVersionListAdapter extends ActivityListAdapter {
     private static final int VERSION_TYPE = 102;
     private VersionListInterface.View versionListInterface;
 
-    public ActivityAndVersionListAdapter(Context context, ActivityListInterface activityListInterface,
-                                         VersionListInterface.View versionListInterface,
-                                         FileDataStorageManager storageManager, OCCapability capability) {
-        super(context, activityListInterface, storageManager, capability, true);
+    public ActivityAndVersionListAdapter(
+        Context context,
+        CurrentAccountProvider currentAccountProvider,
+        ActivityListInterface activityListInterface,
+        VersionListInterface.View versionListInterface,
+        FileDataStorageManager storageManager,
+        OCCapability capability
+    ) {
+        super(context, currentAccountProvider, activityListInterface, storageManager, capability, true);
 
         this.versionListInterface = versionListInterface;
     }

+ 16 - 4
src/main/java/com/owncloud/android/ui/adapter/ActivityListAdapter.java

@@ -2,7 +2,10 @@
  * Nextcloud Android client application
  *
  * @author Alejandro Bautista
+ * @author Chris Narkiewicz
+ *
  * Copyright (C) 2017 Alejandro Bautista
+ * 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
@@ -48,6 +51,7 @@ import com.bumptech.glide.load.engine.DiskCacheStrategy;
 import com.bumptech.glide.load.model.StreamEncoder;
 import com.bumptech.glide.load.resource.file.FileToStreamDecoder;
 import com.caverock.androidsvg.SVG;
+import com.nextcloud.client.account.CurrentAccountProvider;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.FileDataStorageManager;
@@ -90,15 +94,23 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
     protected OwnCloudClient client;
 
     protected Context context;
+    private CurrentAccountProvider currentAccountProvider;
     private FileDataStorageManager storageManager;
     private OCCapability capability;
     protected List<Object> values;
     private boolean isDetailView;
 
-    public ActivityListAdapter(Context context, ActivityListInterface activityListInterface,
-                               FileDataStorageManager storageManager, OCCapability capability, boolean isDetailView) {
+    public ActivityListAdapter(
+        Context context,
+        CurrentAccountProvider currentAccountProvider,
+        ActivityListInterface activityListInterface,
+        FileDataStorageManager storageManager,
+        OCCapability capability,
+        boolean isDetailView
+    ) {
         this.values = new ArrayList<>();
         this.context = context;
+        this.currentAccountProvider = currentAccountProvider;
         this.activityListInterface = activityListInterface;
         this.storageManager = storageManager;
         this.capability = capability;
@@ -237,7 +249,7 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
 
         if (MimeTypeUtil.isImageOrVideo(previewObject.getMimeType())) {
             int placeholder = R.drawable.file;
-            Glide.with(context).using(new CustomGlideStreamLoader()).load(previewObject.getSource()).
+            Glide.with(context).using(new CustomGlideStreamLoader(currentAccountProvider)).load(previewObject.getSource()).
                 placeholder(placeholder).error(placeholder).into(imageView);
         } else {
             if (MimeTypeUtil.isFolder(previewObject.getMimeType())) {
@@ -288,7 +300,7 @@ public class ActivityListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
                 String uri = client.getBaseUri() + "/index.php/apps/files/api/v1/thumbnail/" + px + "/" + px +
                     Uri.encode(file.getRemotePath(), "/");
 
-                Glide.with(context).using(new CustomGlideStreamLoader()).load(uri).placeholder(placeholder)
+                Glide.with(context).using(new CustomGlideStreamLoader(currentAccountProvider)).load(uri).placeholder(placeholder)
                     .error(placeholder).into(fileIcon); // using custom fetcher
 
             } else {

+ 33 - 20
src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java

@@ -2,8 +2,11 @@
  * Nextcloud Android client application
  *
  * @author Tobias Kaminsky
+ * @author Chris Narkiewicz
+ *
  * Copyright (C) 2018 Tobias Kaminsky
  * Copyright (C) 2018 Nextcloud
+ * 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
@@ -107,7 +110,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
     private Set<OCFile> checkedFiles;
 
     private FileDataStorageManager mStorageManager;
-    private Account mAccount;
+    private Account account;
     private OCFileListFragmentInterface ocFileListFragmentInterface;
 
     private FilesFilter mFilesFilter;
@@ -121,14 +124,20 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
     private List<ThumbnailsCacheManager.ThumbnailGenerationTask> asyncTasks = new ArrayList<>();
     private boolean onlyOnDevice;
 
-    public OCFileListAdapter(Context context, AppPreferences preferences, ComponentsGetter transferServiceGetter,
-                             OCFileListFragmentInterface ocFileListFragmentInterface, boolean argHideItemOptions,
-                             boolean gridView) {
+    public OCFileListAdapter(
+        Context context,
+        Account account,
+        AppPreferences preferences,
+        ComponentsGetter transferServiceGetter,
+        OCFileListFragmentInterface ocFileListFragmentInterface,
+        boolean argHideItemOptions,
+        boolean gridView
+    ) {
 
         this.ocFileListFragmentInterface = ocFileListFragmentInterface;
         mContext = context;
         this.preferences = preferences;
-        mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext);
+        this.account = account;
         mHideItemOptions = argHideItemOptions;
         this.gridView = gridView;
         checkedFiles = new HashSet<>();
@@ -331,7 +340,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
                         showFederatedShareAvatar(file, avatarRadius, resources, itemViewHolder);
                     } else {
                         itemViewHolder.sharedAvatar.setTag(file.getOwnerId());
-                        DisplayUtils.setAvatar(mAccount, file.getOwnerId(), this, avatarRadius, resources,
+                        DisplayUtils.setAvatar(account, file.getOwnerId(), this, avatarRadius, resources,
                                                itemViewHolder.sharedAvatar, mContext);
                     }
 
@@ -369,17 +378,17 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
 
             gridViewHolder.localFileIndicator.setVisibility(View.INVISIBLE);   // default first
 
-            if (operationsServiceBinder != null && operationsServiceBinder.isSynchronizing(mAccount, file)) {
+            if (operationsServiceBinder != null && operationsServiceBinder.isSynchronizing(account, file)) {
                 //synchronizing
                 gridViewHolder.localFileIndicator.setImageResource(R.drawable.ic_synchronizing);
                 gridViewHolder.localFileIndicator.setVisibility(View.VISIBLE);
 
-            } else if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, file)) {
+            } else if (downloaderBinder != null && downloaderBinder.isDownloading(account, file)) {
                 // downloading
                 gridViewHolder.localFileIndicator.setImageResource(R.drawable.ic_synchronizing);
                 gridViewHolder.localFileIndicator.setVisibility(View.VISIBLE);
 
-            } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, file)) {
+            } else if (uploaderBinder != null && uploaderBinder.isUploading(account, file)) {
                 //uploading
                 gridViewHolder.localFileIndicator.setImageResource(R.drawable.ic_synchronizing);
                 gridViewHolder.localFileIndicator.setVisibility(View.VISIBLE);
@@ -485,12 +494,12 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
                         try {
                             final ThumbnailsCacheManager.ThumbnailGenerationTask task =
                                 new ThumbnailsCacheManager.ThumbnailGenerationTask(thumbnailView, mStorageManager,
-                                                                                   mAccount, asyncTasks);
+                                                                                   account, asyncTasks);
 
                             if (thumbnail == null) {
                                 thumbnail = BitmapUtils.drawableToBitmap(
                                     MimeTypeUtil.getFileTypeIcon(file.getMimeType(), file.getFileName(),
-                                                                 mAccount, mContext));
+                                                                 account, mContext));
                             }
                             final ThumbnailsCacheManager.AsyncThumbnailDrawable asyncDrawable =
                                 new ThumbnailsCacheManager.AsyncThumbnailDrawable(mContext.getResources(),
@@ -510,7 +519,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
                 }
             } else {
                 thumbnailView.setImageDrawable(MimeTypeUtil.getFileTypeIcon(file.getMimeType(), file.getFileName(),
-                                                                            mAccount, mContext));
+                                                                            account, mContext));
             }
         }
     }
@@ -589,7 +598,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
                 sharedIconView.setImageResource(R.drawable.ic_unshared);
                 sharedIconView.setContentDescription(mContext.getString(R.string.shared_icon_share));
             }
-            if (AccountUtils.accountOwnsFile(file, mAccount)) {
+            if (AccountUtils.accountOwnsFile(file, account)) {
                 sharedIconView.setOnClickListener(view -> ocFileListFragmentInterface.onShareIconClick(file));
             } else {
                 sharedIconView.setOnClickListener(view -> ocFileListFragmentInterface.showShareDetailView(file));
@@ -606,13 +615,17 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
      * @param updatedStorageManager Optional updated storage manager; used to replace
      * @param limitToMimeType       show only files of this mimeType
      */
-    public void swapDirectory(OCFile directory, FileDataStorageManager updatedStorageManager,
-                              boolean onlyOnDevice, String limitToMimeType) {
+    public void swapDirectory(
+        Account account,
+        OCFile directory,
+        FileDataStorageManager updatedStorageManager,
+        boolean onlyOnDevice, String limitToMimeType
+    ) {
         this.onlyOnDevice = onlyOnDevice;
 
         if (updatedStorageManager != null && !updatedStorageManager.equals(mStorageManager)) {
             mStorageManager = updatedStorageManager;
-            mAccount = AccountUtils.getCurrentOwnCloudAccount(mContext);
+            this.account = account;
         }
         if (mStorageManager != null) {
             mFiles = mStorageManager.getFolderContent(directory, onlyOnDevice);
@@ -639,7 +652,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
 
     private void searchForLocalFileInDefaultPath(OCFile file) {
         if (file.getStoragePath() == null && !file.isFolder()) {
-            File f = new File(FileStorageUtils.getDefaultSavePathFor(mAccount.name, file));
+            File f = new File(FileStorageUtils.getDefaultSavePathFor(account.name, file));
             if (f.exists()) {
                 file.setStoragePath(f.getAbsolutePath());
                 file.setLastSyncDateForData(f.lastModified());
@@ -690,7 +703,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
                 shares.add(ocShare);
 
                 // get ocFile from Server to have an up-to-date copy
-                RemoteOperationResult result = new ReadFileRemoteOperation(ocShare.getPath()).execute(mAccount,
+                RemoteOperationResult result = new ReadFileRemoteOperation(ocShare.getPath()).execute(account,
                                                                                                       mContext);
 
                 if (result.isSuccess()) {
@@ -750,8 +763,8 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
                 if (ocFile.isFolder()) {
                     long currentSyncTime = System.currentTimeMillis();
                     RemoteOperation refreshFolderOperation = new RefreshFolderOperation(ocFile, currentSyncTime, false,
-                                                                                        false, mStorageManager, mAccount, mContext);
-                    refreshFolderOperation.execute(mAccount, mContext);
+                                                                                        false, mStorageManager, account, mContext);
+                    refreshFolderOperation.execute(account, mContext);
                 }
 
                 if (!onlyImages || MimeTypeUtil.isImage(ocFile)) {

+ 14 - 3
src/main/java/com/owncloud/android/ui/adapter/TemplateAdapter.java

@@ -2,8 +2,11 @@
  * Nextcloud Android client application
  *
  * @author Tobias Kaminsky
+ * @author Chris Narkiewicz
+ *
  * Copyright (C) 2018 Tobias Kaminsky
  * Copyright (C) 2018 Nextcloud GmbH.
+ * 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
@@ -29,6 +32,7 @@ import android.widget.ImageView;
 import android.widget.TextView;
 
 import com.bumptech.glide.Glide;
+import com.nextcloud.client.account.CurrentAccountProvider;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.Template;
 import com.owncloud.android.ui.dialog.ChooseTemplateDialogFragment;
@@ -51,11 +55,18 @@ public class TemplateAdapter extends RecyclerView.Adapter<TemplateAdapter.ViewHo
     private ClickListener clickListener;
     private Context context;
     private ChooseTemplateDialogFragment.Type type;
-
-    public TemplateAdapter(ChooseTemplateDialogFragment.Type type, ClickListener clickListener, Context context) {
+    private CurrentAccountProvider currentAccountProvider;
+
+    public TemplateAdapter(
+        ChooseTemplateDialogFragment.Type type,
+        ClickListener clickListener,
+        Context context,
+        CurrentAccountProvider currentAccountProvider
+    ) {
         this.clickListener = clickListener;
         this.type = type;
         this.context = context;
+        this.currentAccountProvider = currentAccountProvider;
     }
 
     @NonNull
@@ -124,7 +135,7 @@ public class TemplateAdapter extends RecyclerView.Adapter<TemplateAdapter.ViewHo
                     break;
             }
 
-            Glide.with(context).using(new CustomGlideStreamLoader()).load(template.getThumbnailLink())
+            Glide.with(context).using(new CustomGlideStreamLoader(currentAccountProvider)).load(template.getThumbnailLink())
                     .placeholder(placeholder)
                     .error(placeholder)
                     .into(thumbnail);

+ 8 - 3
src/main/java/com/owncloud/android/ui/adapter/TrashbinListAdapter.java

@@ -69,11 +69,16 @@ public class TrashbinListAdapter extends RecyclerView.Adapter<RecyclerView.ViewH
 
     private final List<ThumbnailsCacheManager.ThumbnailGenerationTask> asyncTasks = new ArrayList<>();
 
-    public TrashbinListAdapter(TrashbinActivityInterface trashbinActivityInterface,
-                               FileDataStorageManager storageManager, AppPreferences preferences, Context context) {
+    public TrashbinListAdapter(
+        TrashbinActivityInterface trashbinActivityInterface,
+        FileDataStorageManager storageManager,
+        AppPreferences preferences,
+        Context context,
+        Account account
+    ) {
         this.files = new ArrayList<>();
         this.trashbinActivityInterface = trashbinActivityInterface;
-        this.account = AccountUtils.getCurrentOwnCloudAccount(context);
+        this.account = account;
         this.storageManager = storageManager;
         this.preferences = preferences;
         this.context = context;

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

@@ -2,8 +2,10 @@
  * Nextcloud Android client application
  *
  * @author Tobias Kaminsky
+ * @author Chris Narkiewicz
  * Copyright (C) 2018 Tobias Kaminsky
  * Copyright (C) 2018 Nextcloud
+ * 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
@@ -122,7 +124,12 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
                     break;
                 case FAILED:
                     new Thread(() -> new FileUploader.UploadRequester()
-                        .retryFailedUploads(parentActivity, null, null)).start();
+                        .retryFailedUploads(
+                            parentActivity,
+                            null,
+                            uploadsStorageManager,
+                            null))
+                        .start();
                     break;
 
                 default:
@@ -139,11 +146,10 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
         // not needed
     }
 
-    public UploadListAdapter(FileActivity fileActivity) {
+    public UploadListAdapter(final FileActivity fileActivity, final UploadsStorageManager uploadsStorageManager) {
         Log_OC.d(TAG, "UploadListAdapter");
-        parentActivity = fileActivity;
-        uploadsStorageManager = new UploadsStorageManager(parentActivity.getContentResolver(),
-                                                          parentActivity.getApplicationContext());
+        this.parentActivity = fileActivity;
+        this.uploadsStorageManager = uploadsStorageManager;
         uploadGroups = new UploadGroup[3];
 
         shouldShowHeadersForEmptySections(false);

+ 11 - 4
src/main/java/com/owncloud/android/ui/dialog/ChooseTemplateDialogFragment.java

@@ -2,8 +2,11 @@
  * Nextcloud Android client application
  *
  * @author Tobias Kaminsky
+ * @author Chris Narkiewicz
+ *
  * Copyright (C) 2018 Tobias Kaminsky
  * Copyright (C) 2018 Nextcloud GmbH.
+ * 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 General Public License as published by
@@ -36,9 +39,10 @@ import android.view.Window;
 import android.view.WindowManager.LayoutParams;
 import android.widget.EditText;
 
+import com.nextcloud.client.account.CurrentAccountProvider;
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
-import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.datamodel.Template;
 import com.owncloud.android.files.CreateFileFromTemplateOperation;
@@ -60,6 +64,8 @@ import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.AlertDialog;
 import androidx.fragment.app.DialogFragment;
@@ -72,7 +78,7 @@ import butterknife.ButterKnife;
  * Dialog to show templates for new documents/spreadsheets/presentations.
  */
 public class ChooseTemplateDialogFragment extends DialogFragment implements DialogInterface.OnClickListener,
-    TemplateAdapter.ClickListener {
+    TemplateAdapter.ClickListener, Injectable {
 
     private static final String ARG_PARENT_FOLDER = "PARENT_FOLDER";
     private static final String ARG_TYPE = "TYPE";
@@ -82,6 +88,7 @@ public class ChooseTemplateDialogFragment extends DialogFragment implements Dial
     private TemplateAdapter adapter;
     private OCFile parentFolder;
     private OwnCloudClient client;
+    @Inject CurrentAccountProvider currentAccount;
 
     public enum Type {
         DOCUMENT,
@@ -144,7 +151,7 @@ public class ChooseTemplateDialogFragment extends DialogFragment implements Dial
         fileName.getBackground().setColorFilter(accentColor, PorterDuff.Mode.SRC_ATOP);
 
         try {
-            Account account = AccountUtils.getCurrentOwnCloudAccount(activity);
+            Account account = currentAccount.getCurrentAccount();
             OwnCloudAccount ocAccount = new OwnCloudAccount(account, activity);
             client = OwnCloudClientManagerFactory.getDefaultSingleton().getClientFor(ocAccount, getContext());
 
@@ -155,7 +162,7 @@ public class ChooseTemplateDialogFragment extends DialogFragment implements Dial
 
         listView.setHasFixedSize(true);
         listView.setLayoutManager(new GridLayoutManager(activity, 2));
-        adapter = new TemplateAdapter(type, this, getContext());
+        adapter = new TemplateAdapter(type, this, getContext(), currentAccount);
         listView.setAdapter(adapter);
 
         // Build the dialog

+ 8 - 6
src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java

@@ -2,9 +2,12 @@
  * ownCloud Android client application
  *
  * @author Mario Danic
+ * @author Chris Narkiewicz
+ *
  * Copyright (C) 2017 Mario Danic
  * Copyright (C) 2012 Bartek Przybylski
  * Copyright (C) 2012-2016 ownCloud Inc.
+ * 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 General Public License version 2,
@@ -52,6 +55,7 @@ import android.widget.TextView;
 
 import com.google.android.material.bottomnavigation.BottomNavigationView;
 import com.google.android.material.floatingactionbutton.FloatingActionButton;
+import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.owncloud.android.MainApp;
@@ -111,6 +115,7 @@ public class ExtendedListFragment extends Fragment implements
     private int maxColumnSizeLandscape = 10;
 
     @Inject AppPreferences preferences;
+    @Inject UserAccountManager accountManager;
     private ScaleGestureDetector mScaleGestureDetector;
     protected SwipeRefreshLayout mRefreshListLayout;
     protected LinearLayout mEmptyListContainer;
@@ -222,8 +227,7 @@ public class ExtendedListFragment extends Fragment implements
                                 setFabVisible(!hasFocus);
                             }
 
-                            boolean searchSupported = AccountUtils.hasSearchSupport(AccountUtils.
-                                    getCurrentOwnCloudAccount(MainApp.getAppContext()));
+                            boolean searchSupported = AccountUtils.hasSearchSupport(accountManager.getCurrentAccount());
 
                             if (getResources().getBoolean(R.bool.bottom_toolbar_enabled) && searchSupported) {
                                 BottomNavigationView bottomNavigationView = getActivity().
@@ -313,8 +317,7 @@ public class ExtendedListFragment extends Fragment implements
                 handler.postDelayed(new Runnable() {
                     @Override
                     public void run() {
-                        if (AccountUtils.hasSearchSupport(AccountUtils.
-                                getCurrentOwnCloudAccount(MainApp.getAppContext()))) {
+                        if (AccountUtils.hasSearchSupport(accountManager.getCurrentAccount())) {
                             EventBus.getDefault().post(new SearchEvent(query,
                                 SearchRemoteOperation.SearchType.FILE_SEARCH, SearchEvent.UnsetType.NO_UNSET));
                         } else {
@@ -400,8 +403,7 @@ public class ExtendedListFragment extends Fragment implements
         mFabMain = v.findViewById(R.id.fab_main);
         ThemeUtils.tintFloatingActionButton(mFabMain, R.drawable.ic_plus, getContext());
 
-        boolean searchSupported = AccountUtils.hasSearchSupport(AccountUtils.
-                getCurrentOwnCloudAccount(MainApp.getAppContext()));
+        boolean searchSupported = AccountUtils.hasSearchSupport(accountManager.getCurrentAccount());
 
         if (getResources().getBoolean(R.bool.bottom_toolbar_enabled) && searchSupported) {
             RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mFabMain.getLayoutParams();

+ 17 - 3
src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java

@@ -2,7 +2,10 @@
  * Nextcloud Android client application
  *
  * @author Andy Scherzinger
+ * @author Chris Narkiewicz
+ *
  * Copyright (C) 2018 Andy Scherzinger
+ * 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
@@ -39,6 +42,8 @@ import android.widget.TextView;
 
 import com.google.android.material.snackbar.Snackbar;
 import com.google.android.material.textfield.TextInputEditText;
+import com.nextcloud.client.account.CurrentAccountProvider;
+import com.nextcloud.client.di.Injectable;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.AccountUtils;
@@ -73,6 +78,8 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.inject.Inject;
+
 import androidx.annotation.NonNull;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentActivity;
@@ -85,7 +92,11 @@ import butterknife.ButterKnife;
 import butterknife.OnClick;
 import butterknife.Unbinder;
 
-public class FileDetailActivitiesFragment extends Fragment implements ActivityListInterface, VersionListInterface.View {
+public class FileDetailActivitiesFragment extends Fragment implements
+    ActivityListInterface,
+    VersionListInterface.View,
+    Injectable {
+
     private static final String TAG = FileDetailActivitiesFragment.class.getSimpleName();
 
     private static final String ARG_FILE = "FILE";
@@ -139,6 +150,9 @@ public class FileDetailActivitiesFragment extends Fragment implements ActivityLi
     private FileOperationsHelper operationsHelper;
     private VersionListInterface.CommentCallback callback;
 
+    @Inject
+    protected CurrentAccountProvider accountManager;
+
     public static FileDetailActivitiesFragment newInstance(OCFile file, Account account) {
         FileDetailActivitiesFragment fragment = new FileDetailActivitiesFragment();
         Bundle args = new Bundle();
@@ -251,7 +265,7 @@ public class FileDetailActivitiesFragment extends Fragment implements ActivityLi
                 PorterDuff.Mode.SRC_IN);
         emptyContentIcon.setImageDrawable(getResources().getDrawable(R.drawable.ic_activity_light_grey));
 
-        adapter = new ActivityAndVersionListAdapter(getContext(), this, this, storageManager, capability);
+        adapter = new ActivityAndVersionListAdapter(getContext(), accountManager, this, this, storageManager, capability);
         recyclerView.setAdapter(adapter);
 
         LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
@@ -285,7 +299,7 @@ public class FileDetailActivitiesFragment extends Fragment implements ActivityLi
      * @param pageUrl String
      */
     private void fetchAndSetData(String pageUrl) {
-        final Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext());
+        final Account currentAccount = accountManager.getCurrentAccount();
         final Context context = MainApp.getAppContext();
         final FragmentActivity activity = getActivity();
 

+ 29 - 8
src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -5,6 +5,7 @@
  * @author masensio
  * @author David A. Velasco
  * @author Andy Scherzinger
+ * @author Chris Narkiewicz
  * Copyright (C) 2011  Bartek Przybylski
  * Copyright (C) 2016 ownCloud Inc.
  * Copyright (C) 2018 Andy Scherzinger
@@ -49,6 +50,7 @@ import android.widget.RelativeLayout;
 
 import com.google.android.material.bottomnavigation.BottomNavigationView;
 import com.google.android.material.snackbar.Snackbar;
+import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.di.Injectable;
 import com.nextcloud.client.preferences.AppPreferences;
 import com.owncloud.android.MainApp;
@@ -167,6 +169,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
     private static final int SINGLE_SELECTION = 1;
 
     @Inject AppPreferences preferences;
+    @Inject UserAccountManager accountManager;
     private FileFragment.ContainerActivity mContainerActivity;
 
     private OCFile mFile;
@@ -279,7 +282,12 @@ public class OCFileListFragment extends ExtendedListFragment implements
 
         if (getResources().getBoolean(R.bool.bottom_toolbar_enabled)) {
             bottomNavigationView.setVisibility(View.VISIBLE);
-            DisplayUtils.setupBottomBar(bottomNavigationView, getResources(), getActivity(), R.id.nav_bar_files);
+            DisplayUtils.setupBottomBar(
+                accountManager.getCurrentAccount(),
+                bottomNavigationView, getResources(),
+                getActivity(),
+                R.id.nav_bar_files
+            );
         }
 
         if (!getResources().getBoolean(R.bool.bottom_toolbar_enabled) || savedInstanceState != null) {
@@ -345,8 +353,15 @@ public class OCFileListFragment extends ExtendedListFragment implements
         mLimitToMimeType = args != null ? args.getString(ARG_MIMETYPE, "") : "";
         boolean hideItemOptions = args != null && args.getBoolean(ARG_HIDE_ITEM_OPTIONS, false);
 
-        mAdapter = new OCFileListAdapter(getActivity(), preferences, mContainerActivity, this, hideItemOptions,
-                isGridViewPreferred(mFile));
+        mAdapter = new OCFileListAdapter(
+            getActivity(),
+            accountManager.getCurrentAccount(),
+            preferences,
+            mContainerActivity,
+            this,
+            hideItemOptions,
+            isGridViewPreferred(mFile)
+        );
         setRecyclerViewAdapter(mAdapter);
 
         mHideFab = args != null && args.getBoolean(ARG_HIDE_FAB, false);
@@ -927,7 +942,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
                             mContainerActivity.getFileOperationsHelper().openFile(file);
                         }
                     } else {
-                        Account account = AccountUtils.getCurrentOwnCloudAccount(getContext());
+                        Account account = accountManager.getCurrentAccount();
                         OCCapability capability = mContainerActivity.getStorageManager().getCapability(account.name);
 
                         if (PreviewMediaFragment.canBePreviewed(file) && AccountUtils.getServerVersion(account)
@@ -1160,7 +1175,13 @@ public class OCFileListFragment extends ExtendedListFragment implements
                     });
                 }
 
-                mAdapter.swapDirectory(directory, storageManager, onlyOnDevice, mLimitToMimeType);
+                mAdapter.swapDirectory(
+                    accountManager.getCurrentAccount(),
+                    directory,
+                    storageManager,
+                    onlyOnDevice,
+                    mLimitToMimeType
+                );
                 if (mFile == null || !mFile.equals(directory)) {
                     getRecyclerView().scrollToPosition(0);
                 }
@@ -1402,7 +1423,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
 
     @Subscribe(threadMode = ThreadMode.BACKGROUND)
     public void onMessageEvent(FavoriteEvent event) {
-        Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext());
+        Account currentAccount = accountManager.getCurrentAccount();
 
         OwnCloudAccount ocAccount;
         AccountManager mAccountMgr = AccountManager.get(getActivity());
@@ -1482,7 +1503,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
             new Handler(Looper.getMainLooper()).post(switchViewsRunnable);
         }
 
-        final Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext());
+        final Account currentAccount = accountManager.getCurrentAccount();
 
         final RemoteOperation remoteOperation;
         if (currentSearchType != SearchType.SHARED_FILTER) {
@@ -1553,7 +1574,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
 
     @Subscribe(threadMode = ThreadMode.BACKGROUND)
     public void onMessageEvent(EncryptionEvent event) {
-        Account currentAccount = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext());
+        Account currentAccount = accountManager.getCurrentAccount();
 
         OwnCloudAccount ocAccount;
         try {

+ 10 - 5
src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java

@@ -5,8 +5,11 @@
  * @author David A. Velasco
  * @author Juan Carlos González Cabrero
  * @author Andy Scherzinger
+ * @author Chris Narkiewicz
+ *
  * Copyright (C) 2015 ownCloud Inc.
  * Copyright (C) 2018 Andy Scherzinger
+ * 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 General Public License version 2,
@@ -42,9 +45,9 @@ import android.webkit.MimeTypeMap;
 
 import com.evernote.android.job.JobRequest;
 import com.evernote.android.job.util.Device;
+import com.nextcloud.client.account.CurrentAccountProvider;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
-import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.datamodel.OCFile;
 import com.owncloud.android.files.StreamMediaFileOperation;
@@ -110,11 +113,14 @@ public class FileOperationsHelper {
     private static final String FILE_EXTENSION_DESKTOP = "desktop";
     private static final String FILE_EXTENSION_WEBLOC = "webloc";
     private FileActivity mFileActivity;
+    private CurrentAccountProvider currentAccount;
     /// Identifier of operation in progress which result shouldn't be lost
     private long mWaitingForOpId = Long.MAX_VALUE;
 
-    public FileOperationsHelper(FileActivity fileActivity) {
+    public FileOperationsHelper(FileActivity fileActivity, CurrentAccountProvider currentAccount) {
         mFileActivity = fileActivity;
+        this.currentAccount = currentAccount;
+
     }
 
     @Nullable
@@ -280,7 +286,7 @@ public class FileOperationsHelper {
             new Thread(new Runnable() {
                 @Override
                 public void run() {
-                    Account account = AccountUtils.getCurrentOwnCloudAccount(mFileActivity);
+                    Account account = currentAccount.getCurrentAccount();
                     FileDataStorageManager storageManager =
                             new FileDataStorageManager(account, mFileActivity.getContentResolver());
                     // a fresh object is needed; many things could have occurred to the file
@@ -391,9 +397,8 @@ public class FileOperationsHelper {
 
     public void streamMediaFile(OCFile file) {
         mFileActivity.showLoadingDialog(mFileActivity.getString(R.string.wait_a_moment));
-
+        final Account account = currentAccount.getCurrentAccount();
         new Thread(() -> {
-            Account account = AccountUtils.getCurrentOwnCloudAccount(mFileActivity);
             StreamMediaFileOperation sfo = new StreamMediaFileOperation(file.getLocalId());
             RemoteOperationResult result = sfo.execute(account, mFileActivity);
 

+ 6 - 2
src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.java

@@ -2,7 +2,10 @@
  *   ownCloud Android client application
  *
  *   @author David A. Velasco
+ *   @author Chris Narkiewicz
+ *
  *   Copyright (C) 2016  ownCloud Inc.
+ *   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 General Public License version 2,
@@ -19,6 +22,7 @@
  */
 package com.owncloud.android.ui.preview;
 
+import android.accounts.Account;
 import android.annotation.SuppressLint;
 import android.content.BroadcastReceiver;
 import android.content.ComponentName;
@@ -361,11 +365,11 @@ public class PreviewImageActivity extends FileActivity implements
     @SuppressFBWarnings("DLS")
     @Override
     public void showDetails(OCFile file) {
+        final Account currentAccount = getUserAccountManager().getCurrentAccount();
         final Intent showDetailsIntent = new Intent(this, FileDisplayActivity.class);
         showDetailsIntent.setAction(FileDisplayActivity.ACTION_DETAILS);
         showDetailsIntent.putExtra(FileActivity.EXTRA_FILE, file);
-        showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT,
-                AccountUtils.getCurrentOwnCloudAccount(this));
+        showDetailsIntent.putExtra(FileActivity.EXTRA_ACCOUNT, currentAccount);
         showDetailsIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
         startActivity(showDetailsIntent);
         finish();

+ 11 - 9
src/main/java/com/owncloud/android/ui/trashbin/RemoteTrashbinRepository.java

@@ -2,8 +2,11 @@
  * Nextcloud Android client application
  *
  * @author Tobias Kaminsky
+ * @author Chris Narkiewicz
+ *
  * Copyright (C) 2018 Tobias Kaminsky
  * Copyright (C) 2018 Nextcloud GmbH.
+ * 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 General Public License as published by
@@ -26,7 +29,6 @@ import android.content.Context;
 import android.os.AsyncTask;
 
 import com.owncloud.android.R;
-import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.lib.common.OwnCloudAccount;
 import com.owncloud.android.lib.common.OwnCloudClient;
 import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
@@ -49,19 +51,19 @@ public class RemoteTrashbinRepository implements TrashbinRepository {
     private String userId;
     private OwnCloudClient client;
 
-    RemoteTrashbinRepository(Context context) {
-        AccountManager accountManager = AccountManager.get(context);
-        Account account = AccountUtils.getCurrentOwnCloudAccount(context);
-
+    RemoteTrashbinRepository(final Context context, final Account account) {
+        AccountManager platformAccountManager = AccountManager.get(context);
         try {
-            OwnCloudAccount ocAccount = new OwnCloudAccount(account, context);
-            client = OwnCloudClientManagerFactory.getDefaultSingleton().getClientFor(ocAccount, context);
+            OwnCloudAccount nextcloudAccount = new OwnCloudAccount(account, context);
+            client = OwnCloudClientManagerFactory.getDefaultSingleton().getClientFor(nextcloudAccount, context);
         } catch (Exception e) {
             Log_OC.e(TAG, e.getMessage());
         }
 
-        userId = accountManager.getUserData(account,
-                com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_USER_ID);
+        userId = platformAccountManager.getUserData(
+            account,
+            com.owncloud.android.lib.common.accounts.AccountUtils.Constants.KEY_USER_ID
+        );
     }
 
     public void removeTrashbinFile(TrashbinFile file, OperationCallback callback) {

+ 10 - 2
src/main/java/com/owncloud/android/ui/trashbin/TrashbinActivity.java

@@ -2,8 +2,11 @@
  * Nextcloud Android client application
  *
  * @author Tobias Kaminsky
+ * @author Chris Narkiewicz
+ *
  * Copyright (C) 2018 Tobias Kaminsky
  * Copyright (C) 2018 Nextcloud GmbH.
+ * 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 General Public License as published by
@@ -20,6 +23,7 @@
  */
 package com.owncloud.android.ui.trashbin;
 
+import android.accounts.Account;
 import android.content.Intent;
 import android.os.Bundle;
 import android.view.Menu;
@@ -98,7 +102,9 @@ public class TrashbinActivity extends FileActivity implements
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
-        trashbinPresenter = new TrashbinPresenter(new RemoteTrashbinRepository(this), this);
+        final Account currentAccount = getUserAccountManager().getCurrentAccount();
+        final RemoteTrashbinRepository trashRepository = new RemoteTrashbinRepository(this, currentAccount);
+        trashbinPresenter = new TrashbinPresenter(trashRepository, this);
 
         setContentView(R.layout.trashbin_activity);
         unbinder = ButterKnife.bind(this);
@@ -135,7 +141,9 @@ public class TrashbinActivity extends FileActivity implements
             this,
             getStorageManager(),
             preferences,
-            this);
+            this,
+            getUserAccountManager().getCurrentAccount()
+        );
         recyclerView.setAdapter(trashbinListAdapter);
         recyclerView.setHasFixedSize(true);
         recyclerView.setHasFooter(true);

+ 7 - 3
src/main/java/com/owncloud/android/utils/DisplayUtils.java

@@ -557,12 +557,16 @@ public final class DisplayUtils {
         }
     }
 
-    public static void setupBottomBar(BottomNavigationView view, Resources resources, final Activity activity,
-                                      int checkedMenuItem) {
+    public static void setupBottomBar(
+        Account account,
+        BottomNavigationView view,
+        Resources resources,
+        final Activity activity,
+        int checkedMenuItem
+    ) {
 
         Menu menu = view.getMenu();
 
-        Account account = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext());
         boolean searchSupported = AccountUtils.hasSearchSupport(account);
 
         if (!searchSupported) {

+ 3 - 3
src/main/java/com/owncloud/android/utils/FilesSyncHelper.java

@@ -3,6 +3,7 @@
  *
  * @author Mario Danic
  * @author Chris Narkiewicz
+ *
  * Copyright (C) 2017 Mario Danic
  * Copyright (C) 2017 Nextcloud
  * Copyright (C) 2019 Chris Narkiewicz <hello@ezaquarii.com>
@@ -214,14 +215,13 @@ public final class FilesSyncHelper {
         }
     }
 
-    public static void restartJobsIfNeeded(UserAccountManager accountManager) {
+    public static void restartJobsIfNeeded(UploadsStorageManager uploadsStorageManager, UserAccountManager accountManager) {
         final Context context = MainApp.getAppContext();
 
         FileUploader.UploadRequester uploadRequester = new FileUploader.UploadRequester();
 
         boolean accountExists;
 
-        UploadsStorageManager uploadsStorageManager = new UploadsStorageManager(context.getContentResolver(), context);
         OCUpload[] failedUploads = uploadsStorageManager.getFailedUploads();
 
         for (OCUpload failedUpload : failedUploads) {
@@ -243,7 +243,7 @@ public final class FilesSyncHelper {
         new Thread(() -> {
             if (!Device.getNetworkType(context).equals(JobRequest.NetworkType.ANY) &&
                     !ConnectivityUtils.isInternetWalled(context)) {
-                uploadRequester.retryFailedUploads(context, null, null);
+                uploadRequester.retryFailedUploads(context, null, uploadsStorageManager, null);
             }
         }).start();
     }

+ 16 - 6
src/main/java/com/owncloud/android/utils/ReceiversHelper.java

@@ -31,6 +31,7 @@ import com.evernote.android.job.JobRequest;
 import com.evernote.android.job.util.Device;
 import com.nextcloud.client.account.UserAccountManager;
 import com.owncloud.android.MainApp;
+import com.owncloud.android.datamodel.UploadsStorageManager;
 
 /**
  * Helper for setting up network and power receivers
@@ -41,7 +42,10 @@ public final class ReceiversHelper {
         // utility class -> private constructor
     }
 
-    public static void registerNetworkChangeReceiver(final UserAccountManager accountManager) {
+    public static void registerNetworkChangeReceiver(
+        final UploadsStorageManager uploadsStorageManager,
+        final UserAccountManager accountManager
+    ) {
         Context context = MainApp.getAppContext();
 
         IntentFilter intentFilter = new IntentFilter();
@@ -52,7 +56,7 @@ public final class ReceiversHelper {
             @Override
             public void onReceive(Context context, Intent intent) {
                 if (!Device.getNetworkType(context).equals(JobRequest.NetworkType.ANY)) {
-                    FilesSyncHelper.restartJobsIfNeeded(accountManager);
+                    FilesSyncHelper.restartJobsIfNeeded(uploadsStorageManager, accountManager);
                 }
             }
         };
@@ -60,7 +64,10 @@ public final class ReceiversHelper {
         context.registerReceiver(broadcastReceiver, intentFilter);
     }
 
-    public static void registerPowerChangeReceiver(final UserAccountManager accountManager) {
+    public static void registerPowerChangeReceiver(
+        final UploadsStorageManager uploadsStorageManager,
+        final UserAccountManager accountManager
+    ) {
         Context context = MainApp.getAppContext();
 
         IntentFilter intentFilter = new IntentFilter();
@@ -71,7 +78,7 @@ public final class ReceiversHelper {
             @Override
             public void onReceive(Context context, Intent intent) {
                 if (Intent.ACTION_POWER_CONNECTED.equals(intent.getAction())) {
-                    FilesSyncHelper.restartJobsIfNeeded(accountManager);
+                    FilesSyncHelper.restartJobsIfNeeded(uploadsStorageManager, accountManager);
                 }
             }
         };
@@ -79,7 +86,10 @@ public final class ReceiversHelper {
         context.registerReceiver(broadcastReceiver, intentFilter);
     }
 
-    public static void registerPowerSaveReceiver(final UserAccountManager accountManager) {
+    public static void registerPowerSaveReceiver(
+        final UploadsStorageManager uploadsStorageManager,
+        final UserAccountManager accountManager
+    ) {
         Context context = MainApp.getAppContext();
 
         IntentFilter intentFilter = new IntentFilter();
@@ -89,7 +99,7 @@ public final class ReceiversHelper {
             @Override
             public void onReceive(Context context, Intent intent) {
                 if (!PowerUtils.isPowerSaveMode(context)) {
-                    FilesSyncHelper.restartJobsIfNeeded(accountManager);
+                    FilesSyncHelper.restartJobsIfNeeded(uploadsStorageManager, accountManager);
                 }
             }
         };

+ 12 - 2
src/main/java/com/owncloud/android/utils/glide/CustomGlideStreamLoader.java

@@ -2,7 +2,10 @@
  * Nextcloud Android client application
  *
  * @author Alejandro Bautista
+ * @author Chris Narkiewicz
+ *
  * Copyright (C) 2017 Alejandro Bautista
+ * 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
@@ -21,16 +24,23 @@ package com.owncloud.android.utils.glide;
 
 import com.bumptech.glide.load.data.DataFetcher;
 import com.bumptech.glide.load.model.stream.StreamModelLoader;
+import com.nextcloud.client.account.CurrentAccountProvider;
 
 import java.io.InputStream;
 
 /**
  * Custom Model for OwnCloudClient
  */
-
 public class CustomGlideStreamLoader implements StreamModelLoader<String> {
+
+    private final CurrentAccountProvider currentAccount;
+
+    public CustomGlideStreamLoader(CurrentAccountProvider currentAccount) {
+        this.currentAccount = currentAccount;
+    }
+
     @Override
     public DataFetcher<InputStream> getResourceFetcher(String url, int width, int height) {
-        return new HttpStreamFetcher(url);
+        return new HttpStreamFetcher(currentAccount, url);
     }
 }

+ 13 - 10
src/main/java/com/owncloud/android/utils/glide/HttpStreamFetcher.java

@@ -2,7 +2,10 @@
  * Nextcloud Android client application
  *
  * @author Alejandro Bautista
+ * @author Chris Narkiewicz
+ *
  * Copyright (C) 2017 Alejandro Bautista
+ * 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
@@ -23,6 +26,7 @@ import android.accounts.Account;
 
 import com.bumptech.glide.Priority;
 import com.bumptech.glide.load.data.DataFetcher;
+import com.nextcloud.client.account.CurrentAccountProvider;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.authentication.AccountUtils;
 import com.owncloud.android.lib.common.OwnCloudAccount;
@@ -39,29 +43,28 @@ import java.io.InputStream;
 /**
  * Fetcher with OwnCloudClient
  */
-
 public class HttpStreamFetcher implements DataFetcher<InputStream> {
 
     private static final String TAG = HttpStreamFetcher.class.getName();
-    private final String mURL;
-
-    public HttpStreamFetcher(String url) {
-        this.mURL = url;
+    private final String url;
+    private final CurrentAccountProvider currentAccount;
 
+    HttpStreamFetcher(final CurrentAccountProvider currentAccount, final String url) {
+        this.currentAccount = currentAccount;
+        this.url = url;
     }
 
     @Override
     public InputStream loadData(Priority priority) throws Exception {
-
-        Account mAccount = AccountUtils.getCurrentOwnCloudAccount(MainApp.getAppContext());
-        OwnCloudAccount ocAccount = new OwnCloudAccount(mAccount, MainApp.getAppContext());
+        Account account = currentAccount.getCurrentAccount();
+        OwnCloudAccount ocAccount = new OwnCloudAccount(account, MainApp.getAppContext());
         OwnCloudClient mClient = OwnCloudClientManagerFactory.getDefaultSingleton().
                 getClientFor(ocAccount, MainApp.getAppContext());
 
         if (mClient != null) {
             GetMethod get;
             try {
-                get = new GetMethod(mURL);
+                get = new GetMethod(url);
                 get.setRequestHeader("Cookie", "nc_sameSiteCookielax=true;nc_sameSiteCookiestrict=true");
                 get.setRequestHeader(RemoteOperation.OCS_API_HEADER, RemoteOperation.OCS_API_HEADER_VALUE);
                 int status = mClient.executeMethod(get);
@@ -84,7 +87,7 @@ public class HttpStreamFetcher implements DataFetcher<InputStream> {
 
     @Override
     public String getId() {
-        return mURL;
+        return url;
     }
 
     @Override