Browse Source

Merge pull request #8727 from nextcloud/migrate-synchronize-folder-operation-to-new-user-model

Migrate SynchronizeFolderOperation to new User model
Álvaro Brey 3 years ago
parent
commit
302c927bec
20 changed files with 145 additions and 107 deletions
  1. 1 1
      src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java
  2. 1 1
      src/androidTest/java/com/owncloud/android/DownloadIT.java
  3. 1 1
      src/androidTest/java/com/owncloud/android/UploadIT.java
  4. 8 8
      src/androidTest/java/com/owncloud/android/datamodel/FileDataStorageManagerIT.java
  5. 3 3
      src/main/java/com/nextcloud/client/di/ComponentsModule.java
  6. 29 28
      src/main/java/com/owncloud/android/operations/RefreshFolderOperation.java
  7. 1 1
      src/main/java/com/owncloud/android/operations/SynchronizeFolderOperation.java
  8. 22 9
      src/main/java/com/owncloud/android/providers/DocumentsStorageProvider.java
  9. 16 4
      src/main/java/com/owncloud/android/syncadapter/AbstractOwnCloudSyncAdapter.java
  10. 17 14
      src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java
  11. 11 2
      src/main/java/com/owncloud/android/syncadapter/FileSyncService.java
  12. 1 1
      src/main/java/com/owncloud/android/ui/activities/data/files/FilesServiceApiImpl.java
  13. 2 2
      src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.java
  14. 1 1
      src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.java
  15. 1 1
      src/main/java/com/owncloud/android/ui/activity/ReceiveExternalFilesActivity.java
  16. 3 3
      src/main/java/com/owncloud/android/ui/adapter/OCFileListAdapter.java
  17. 4 4
      src/main/java/com/owncloud/android/ui/adapter/UploadListAdapter.java
  18. 13 12
      src/main/java/com/owncloud/android/ui/asynctasks/FetchRemoteFileTask.java
  19. 5 7
      src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java
  20. 5 4
      src/main/java/com/owncloud/android/utils/FileStorageUtils.java

+ 1 - 1
src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java

@@ -245,7 +245,7 @@ public abstract class AbstractOnServerIT extends AbstractIT {
                                               false,
                                               false,
                                               getStorageManager(),
-                                              account,
+                                              user,
                                               targetContext
         ).execute(client).isSuccess());
     }

+ 1 - 1
src/androidTest/java/com/owncloud/android/DownloadIT.java

@@ -55,7 +55,7 @@ public class DownloadIT extends AbstractOnServerIT {
                                                                   false,
                                                                   true,
                                                                   getStorageManager(),
-                                                                  account,
+                                                                  user,
                                                                   targetContext)
             .execute(client);
 

+ 1 - 1
src/androidTest/java/com/owncloud/android/UploadIT.java

@@ -104,7 +104,7 @@ public class UploadIT extends AbstractOnServerIT {
                                                                   false,
                                                                   true,
                                                                   getStorageManager(),
-                                                                  account,
+                                                                  user,
                                                                   targetContext)
             .execute(client);
 

+ 8 - 8
src/androidTest/java/com/owncloud/android/datamodel/FileDataStorageManagerIT.java

@@ -122,7 +122,7 @@ abstract public class FileDataStorageManagerIT extends AbstractOnServerIT {
                                               false,
                                               false,
                                               sut,
-                                              account,
+                                              user,
                                               targetContext).execute(client).isSuccess());
 
         assertTrue(new RefreshFolderOperation(sut.getFileByDecryptedRemotePath("/1/"),
@@ -130,7 +130,7 @@ abstract public class FileDataStorageManagerIT extends AbstractOnServerIT {
                                               false,
                                               false,
                                               sut,
-                                              account,
+                                              user,
                                               targetContext).execute(client).isSuccess());
 
         assertTrue(new RefreshFolderOperation(sut.getFileByDecryptedRemotePath("/1/1/"),
@@ -138,7 +138,7 @@ abstract public class FileDataStorageManagerIT extends AbstractOnServerIT {
                                               false,
                                               false,
                                               sut,
-                                              account,
+                                              user,
                                               targetContext).execute(client).isSuccess());
 
         assertEquals(3, sut.getFolderContent(sut.getFileByDecryptedRemotePath("/1/1/"), false).size());
@@ -199,7 +199,7 @@ abstract public class FileDataStorageManagerIT extends AbstractOnServerIT {
                                               false,
                                               false,
                                               sut,
-                                              account,
+                                              user,
                                               targetContext).execute(client).isSuccess());
 
 
@@ -295,7 +295,7 @@ abstract public class FileDataStorageManagerIT extends AbstractOnServerIT {
                                               false,
                                               false,
                                               sut,
-                                              account,
+                                              user,
                                               targetContext).execute(client).isSuccess());
 
 
@@ -316,7 +316,7 @@ abstract public class FileDataStorageManagerIT extends AbstractOnServerIT {
                                               false,
                                               false,
                                               sut,
-                                              account,
+                                              user,
                                               targetContext).execute(client).isSuccess());
 
         assertTrue(new RefreshFolderOperation(sut.getFileByDecryptedRemotePath("/1/"),
@@ -324,7 +324,7 @@ abstract public class FileDataStorageManagerIT extends AbstractOnServerIT {
                                               false,
                                               false,
                                               sut,
-                                              account,
+                                              user,
                                               targetContext).execute(client).isSuccess());
 
         assertTrue(new RefreshFolderOperation(sut.getFileByDecryptedRemotePath("/1/1/"),
@@ -332,7 +332,7 @@ abstract public class FileDataStorageManagerIT extends AbstractOnServerIT {
                                               false,
                                               false,
                                               sut,
-                                              account,
+                                              user,
                                               targetContext).execute(client).isSuccess());
 
         OCFile newFile = new OCFile("/1/1/1.txt");

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

@@ -39,6 +39,7 @@ import com.owncloud.android.providers.FileContentProvider;
 import com.owncloud.android.providers.UsersAndGroupsSearchProvider;
 import com.owncloud.android.services.AccountManagerService;
 import com.owncloud.android.services.OperationsService;
+import com.owncloud.android.syncadapter.FileSyncService;
 import com.owncloud.android.ui.activities.ActivitiesActivity;
 import com.owncloud.android.ui.activity.BaseActivity;
 import com.owncloud.android.ui.activity.CommunityActivity;
@@ -205,7 +206,6 @@ abstract class ComponentsModule {
     @ContributesAndroidInjector abstract AccountManagerService accountManagerService();
     @ContributesAndroidInjector abstract OperationsService operationsService();
     @ContributesAndroidInjector abstract PlayerService playerService();
-
-    @ContributesAndroidInjector
-    abstract FileTransferService fileDownloaderService();
+    @ContributesAndroidInjector abstract FileTransferService fileDownloaderService();
+    @ContributesAndroidInjector abstract FileSyncService fileSyncService();
 }

+ 29 - 28
src/main/java/com/owncloud/android/operations/RefreshFolderOperation.java

@@ -26,6 +26,7 @@ import android.util.Log;
 
 import com.google.gson.Gson;
 import com.nextcloud.android.lib.resources.directediting.DirectEditingObtainRemoteOperation;
+import com.nextcloud.client.account.User;
 import com.nextcloud.common.NextcloudClient;
 import com.owncloud.android.datamodel.ArbitraryDataProvider;
 import com.owncloud.android.datamodel.DecryptedFolderMetadata;
@@ -97,7 +98,7 @@ public class RefreshFolderOperation extends RemoteOperation {
     private FileDataStorageManager mStorageManager;
 
     /** Account where the file to synchronize belongs */
-    private Account mAccount;
+    private User user;
 
     /** Android context; necessary to send requests to the download service */
     private Context mContext;
@@ -148,7 +149,7 @@ public class RefreshFolderOperation extends RemoteOperation {
      *                                  be fetched and updated even though the 'eTag' did not
      *                                  change.
      * @param   dataStorageManager      Interface with the local database.
-     * @param   account                 ownCloud account where the folder is located.
+     * @param   user                 ownCloud account where the folder is located.
      * @param   context                 Application context.
      */
     public RefreshFolderOperation(OCFile folder,
@@ -156,13 +157,13 @@ public class RefreshFolderOperation extends RemoteOperation {
                                   boolean syncFullAccount,
                                   boolean ignoreETag,
                                   FileDataStorageManager dataStorageManager,
-                                  Account account,
+                                  User user,
                                   Context context) {
         mLocalFolder = folder;
         mCurrentSyncTime = currentSyncTime;
         mSyncFullAccount = syncFullAccount;
         mStorageManager = dataStorageManager;
-        mAccount = account;
+        this.user = user;
         mContext = context;
         mForgottenLocalFiles = new HashMap<>();
         mRemoteFolderChanged = false;
@@ -177,13 +178,13 @@ public class RefreshFolderOperation extends RemoteOperation {
                                   boolean ignoreETag,
                                   boolean onlyFileMetadata,
                                   FileDataStorageManager dataStorageManager,
-                                  Account account,
+                                  User user,
                                   Context context) {
         mLocalFolder = folder;
         mCurrentSyncTime = currentSyncTime;
         mSyncFullAccount = syncFullAccount;
         mStorageManager = dataStorageManager;
-        mAccount = account;
+        this.user = user;
         mContext = context;
         mForgottenLocalFiles = new HashMap<>();
         mRemoteFolderChanged = false;
@@ -272,7 +273,7 @@ public class RefreshFolderOperation extends RemoteOperation {
     }
 
     private void updateOCVersion(OwnCloudClient client) {
-        UpdateOCVersionOperation update = new UpdateOCVersionOperation(mAccount, mContext);
+        UpdateOCVersionOperation update = new UpdateOCVersionOperation(user.toPlatformAccount(), mContext);
         RemoteOperationResult result = update.execute(client);
         if (result.isSuccess()) {
             // Update Capabilities for this account
@@ -282,7 +283,7 @@ public class RefreshFolderOperation extends RemoteOperation {
 
     private void updateUserProfile() {
         try {
-            NextcloudClient nextcloudClient = OwnCloudClientFactory.createNextcloudClient(mAccount, mContext);
+            NextcloudClient nextcloudClient = OwnCloudClientFactory.createNextcloudClient(user.toPlatformAccount(), mContext);
 
             RemoteOperationResult<UserInfo> result = new GetUserProfileOperation(mStorageManager).execute(nextcloudClient);
             if (!result.isSuccess()) {
@@ -297,12 +298,12 @@ public class RefreshFolderOperation extends RemoteOperation {
 
     private void updateCapabilities() {
         ArbitraryDataProvider arbitraryDataProvider = new ArbitraryDataProvider(mContext.getContentResolver());
-        String oldDirectEditingEtag = arbitraryDataProvider.getValue(mAccount,
+        String oldDirectEditingEtag = arbitraryDataProvider.getValue(user,
                                                                      ArbitraryDataProvider.DIRECT_EDITING_ETAG);
 
         RemoteOperationResult result = new GetCapabilitiesOperation(mStorageManager).execute(mContext);
         if (result.isSuccess()) {
-            String newDirectEditingEtag = mStorageManager.getCapability(mAccount.name).getDirectEditingEtag();
+            String newDirectEditingEtag = mStorageManager.getCapability(user.getAccountName()).getDirectEditingEtag();
 
             if (!oldDirectEditingEtag.equalsIgnoreCase(newDirectEditingEtag)) {
                 updateDirectEditing(arbitraryDataProvider, newDirectEditingEtag);
@@ -315,18 +316,18 @@ public class RefreshFolderOperation extends RemoteOperation {
     }
 
     private void updateDirectEditing(ArbitraryDataProvider arbitraryDataProvider, String newDirectEditingEtag) {
-        RemoteOperationResult<DirectEditing> result = new DirectEditingObtainRemoteOperation().execute(mAccount,
+        RemoteOperationResult<DirectEditing> result = new DirectEditingObtainRemoteOperation().execute(user.toPlatformAccount(),
                                                                                                        mContext);
 
         if (result.isSuccess()) {
             DirectEditing directEditing = result.getResultData();
             String json = new Gson().toJson(directEditing);
-            arbitraryDataProvider.storeOrUpdateKeyValue(mAccount.name, ArbitraryDataProvider.DIRECT_EDITING, json);
+            arbitraryDataProvider.storeOrUpdateKeyValue(user.getAccountName(), ArbitraryDataProvider.DIRECT_EDITING, json);
         } else {
-            arbitraryDataProvider.deleteKeyForAccount(mAccount.name, ArbitraryDataProvider.DIRECT_EDITING);
+            arbitraryDataProvider.deleteKeyForAccount(user.getAccountName(), ArbitraryDataProvider.DIRECT_EDITING);
         }
 
-        arbitraryDataProvider.storeOrUpdateKeyValue(mAccount.name,
+        arbitraryDataProvider.storeOrUpdateKeyValue(user.getAccountName(),
                                                     ArbitraryDataProvider.DIRECT_EDITING_ETAG,
                                                     newDirectEditingEtag);
     }
@@ -335,7 +336,7 @@ public class RefreshFolderOperation extends RemoteOperation {
         NextcloudClient client;
 
         try {
-            client = OwnCloudClientFactory.createNextcloudClient(mAccount, mContext);
+            client = OwnCloudClientFactory.createNextcloudClient(user.toPlatformAccount(), mContext);
         } catch (AccountUtils.AccountNotFoundException | NullPointerException e) {
             Log_OC.e(this, "Update of predefined status not possible!");
             return;
@@ -347,9 +348,9 @@ public class RefreshFolderOperation extends RemoteOperation {
         if (result.isSuccess()) {
             ArrayList<PredefinedStatus> predefinedStatuses = result.getResultData();
             String json = new Gson().toJson(predefinedStatuses);
-            arbitraryDataProvider.storeOrUpdateKeyValue(mAccount.name, ArbitraryDataProvider.PREDEFINED_STATUS, json);
+            arbitraryDataProvider.storeOrUpdateKeyValue(user.getAccountName(), ArbitraryDataProvider.PREDEFINED_STATUS, json);
         } else {
-            arbitraryDataProvider.deleteKeyForAccount(mAccount.name, ArbitraryDataProvider.PREDEFINED_STATUS);
+            arbitraryDataProvider.deleteKeyForAccount(user.getAccountName(), ArbitraryDataProvider.PREDEFINED_STATUS);
         }
     }
 
@@ -358,7 +359,7 @@ public class RefreshFolderOperation extends RemoteOperation {
         RemoteOperationResult result;
         String remotePath = mLocalFolder.getRemotePath();
 
-        Log_OC.d(TAG, "Checking changes in " + mAccount.name + remotePath);
+        Log_OC.d(TAG, "Checking changes in " + user.getAccountName() + remotePath);
 
         // remote request
         result = new ReadFileRemoteOperation(remotePath).execute(client);
@@ -372,13 +373,13 @@ public class RefreshFolderOperation extends RemoteOperation {
                 if (remoteFolderETag != null) {
                     mRemoteFolderChanged = !(remoteFolderETag.equalsIgnoreCase(mLocalFolder.getEtag()));
                 } else {
-                    Log_OC.e(TAG, "Checked " + mAccount.name + remotePath + ": No ETag received from server");
+                    Log_OC.e(TAG, "Checked " + user.getAccountName() + remotePath + ": No ETag received from server");
                 }
             }
 
             result = new RemoteOperationResult(ResultCode.OK);
 
-            Log_OC.i(TAG, "Checked " + mAccount.name + remotePath + " : " +
+            Log_OC.i(TAG, "Checked " + user.getAccountName() + remotePath + " : " +
                     (mRemoteFolderChanged ? "changed" : "not changed"));
 
         } else {
@@ -387,10 +388,10 @@ public class RefreshFolderOperation extends RemoteOperation {
                 removeLocalFolder();
             }
             if (result.isException()) {
-                Log_OC.e(TAG, "Checked " + mAccount.name + remotePath + " : " +
+                Log_OC.e(TAG, "Checked " + user.getAccountName() + remotePath + " : " +
                         result.getLogMessage(), result.getException());
             } else {
-                Log_OC.e(TAG, "Checked " + mAccount.name + remotePath + " : " +
+                Log_OC.e(TAG, "Checked " + user.getAccountName() + remotePath + " : " +
                         result.getLogMessage());
             }
         }
@@ -402,7 +403,7 @@ public class RefreshFolderOperation extends RemoteOperation {
     private RemoteOperationResult fetchAndSyncRemoteFolder(OwnCloudClient client) {
         String remotePath = mLocalFolder.getRemotePath();
         RemoteOperationResult result = new ReadFolderRemoteOperation(remotePath).execute(client);
-        Log_OC.d(TAG, "Synchronizing " + mAccount.name + remotePath);
+        Log_OC.d(TAG, "Synchronizing " + user.getAccountName() + remotePath);
 
         if (result.isSuccess()) {
             synchronizeData(result.getData());
@@ -422,7 +423,7 @@ public class RefreshFolderOperation extends RemoteOperation {
 
     private void removeLocalFolder() {
         if (mStorageManager.fileExists(mLocalFolder.getFileId())) {
-            String currentSavePath = FileStorageUtils.getSavePath(mAccount.name);
+            String currentSavePath = FileStorageUtils.getSavePath(user.getAccountName());
             mStorageManager.removeFolder(
                     mLocalFolder,
                     true,
@@ -470,7 +471,7 @@ public class RefreshFolderOperation extends RemoteOperation {
         DecryptedFolderMetadata metadata = getDecryptedFolderMetadata(encryptedAncestor,
                                                                       mLocalFolder,
                                                                       getClient(),
-                                                                      mAccount,
+                                                                      user.toPlatformAccount(),
                                                                       mContext);
 
         // get current data about local contents of the folder to synchronize
@@ -507,7 +508,7 @@ public class RefreshFolderOperation extends RemoteOperation {
             setLocalFileDataOnUpdatedFile(remoteFile, localFile, updatedFile, mRemoteFolderChanged);
 
             // check and fix, if needed, local storage path
-            FileStorageUtils.searchForLocalFileInDefaultPath(updatedFile, mAccount);
+            FileStorageUtils.searchForLocalFileInDefaultPath(updatedFile, user.getAccountName());
 
             // update file name for encrypted files
             if (metadata != null) {
@@ -585,7 +586,7 @@ public class RefreshFolderOperation extends RemoteOperation {
             );
             if (localFile.isEncrypted()) {
                 if (mLocalFolder.getStoragePath() == null) {
-                    updatedFile.setStoragePath(FileStorageUtils.getDefaultSavePathFor(mAccount.name, mLocalFolder) +
+                    updatedFile.setStoragePath(FileStorageUtils.getDefaultSavePathFor(user.getAccountName(), mLocalFolder) +
                                                    localFile.getFileName());
                 } else {
                     updatedFile.setStoragePath(mLocalFolder.getStoragePath() +
@@ -717,7 +718,7 @@ public class RefreshFolderOperation extends RemoteOperation {
     private void sendLocalBroadcast(String event, String dirRemotePath, RemoteOperationResult result) {
         Log_OC.d(TAG, "Send broadcast " + event);
         Intent intent = new Intent(event);
-        intent.putExtra(FileSyncAdapter.EXTRA_ACCOUNT_NAME, mAccount.name);
+        intent.putExtra(FileSyncAdapter.EXTRA_ACCOUNT_NAME, user.getAccountName());
 
         if (dirRemotePath != null) {
             intent.putExtra(FileSyncAdapter.EXTRA_FOLDER_PATH, dirRemotePath);

+ 1 - 1
src/main/java/com/owncloud/android/operations/SynchronizeFolderOperation.java

@@ -319,7 +319,7 @@ public class SynchronizeFolderOperation extends SyncOperation {
             updateLocalStateData(remoteFile, localFile, updatedFile);
 
             /// check and fix, if needed, local storage path
-            FileStorageUtils.searchForLocalFileInDefaultPath(updatedFile, user.toPlatformAccount());
+            FileStorageUtils.searchForLocalFileInDefaultPath(updatedFile, user.getAccountName());
 
             // update file name for encrypted files
             if (metadata != null) {

+ 22 - 9
src/main/java/com/owncloud/android/providers/DocumentsStorageProvider.java

@@ -44,6 +44,8 @@ import android.util.Log;
 import android.util.SparseArray;
 import android.widget.Toast;
 
+import com.nextcloud.client.account.AnonymousUser;
+import com.nextcloud.client.account.User;
 import com.nextcloud.client.account.UserAccountManager;
 import com.nextcloud.client.account.UserAccountManagerImpl;
 import com.nextcloud.client.files.downloader.DownloadTask;
@@ -91,6 +93,7 @@ import java.util.concurrent.TimeUnit;
 
 import androidx.annotation.NonNull;
 import androidx.annotation.VisibleForTesting;
+import dagger.android.AndroidInjection;
 
 import static android.os.ParcelFileDescriptor.MODE_READ_ONLY;
 import static android.os.ParcelFileDescriptor.MODE_WRITE_ONLY;
@@ -376,11 +379,16 @@ public class DocumentsStorageProvider extends DocumentsProvider {
         }
 
         Context context = getNonNullContext();
-        Account account = document.getAccount();
+        User user = document.getUser();
 
-        RemoteOperationResult updateParent = new RefreshFolderOperation(targetFolder.getFile(), System.currentTimeMillis(),
-                                                                        false, false, true, storageManager,
-                                                                        account, context)
+        RemoteOperationResult updateParent = new RefreshFolderOperation(targetFolder.getFile(),
+                                                                        System.currentTimeMillis(),
+                                                                        false,
+                                                                        false,
+                                                                        true,
+                                                                        storageManager,
+                                                                        user,
+                                                                        context)
             .execute(targetFolder.getClient());
 
         if (!updateParent.isSuccess()) {
@@ -480,7 +488,7 @@ public class DocumentsStorageProvider extends DocumentsProvider {
 
         RemoteOperationResult updateParent = new RefreshFolderOperation(targetFolder.getFile(), System.currentTimeMillis(),
                                                                         false, false, true, storageManager,
-                                                                        targetFolder.getAccount(), context)
+                                                                        targetFolder.getUser(), context)
             .execute(targetFolder.getClient());
 
         if (!updateParent.isSuccess()) {
@@ -497,10 +505,10 @@ public class DocumentsStorageProvider extends DocumentsProvider {
 
     private String createFile(Document targetFolder, String displayName, String mimeType) throws FileNotFoundException {
 
-        Account account = targetFolder.getAccount();
+        User user = targetFolder.getUser();
 
         // create dummy file
-        File tempDir = new File(FileStorageUtils.getTemporalPath(account.name));
+        File tempDir = new File(FileStorageUtils.getTemporalPath(user.getAccountName()));
 
         if (!tempDir.exists() && !tempDir.mkdirs()) {
             throw new FileNotFoundException("Temp folder could not be created: " + tempDir.getAbsolutePath());
@@ -547,7 +555,7 @@ public class DocumentsStorageProvider extends DocumentsProvider {
                                                                         false,
                                                                         true,
                                                                         targetFolder.getStorageManager(),
-                                                                        account,
+                                                                        user,
                                                                         context)
             .execute(client);
 
@@ -742,7 +750,7 @@ public class DocumentsStorageProvider extends DocumentsProvider {
                                               true,
                                               true,
                                               folder.getStorageManager(),
-                                              folder.getAccount(),
+                                              folder.getUser(),
                                               MainApp.getAppContext())
                 .execute(folder.getClient());
         }
@@ -791,6 +799,11 @@ public class DocumentsStorageProvider extends DocumentsProvider {
             return getStorageManager().getAccount();
         }
 
+        public User getUser() {
+            Account account = getAccount();
+            return accountManager.getUser(account.name).orElseGet(accountManager::getAnonymousUser);
+        }
+
         public OCFile getFile() {
             return getStorageManager().getFileById(fileId);
         }

+ 16 - 4
src/main/java/com/owncloud/android/syncadapter/AbstractOwnCloudSyncAdapter.java

@@ -31,6 +31,8 @@ import android.content.AbstractThreadedSyncAdapter;
 import android.content.ContentProviderClient;
 import android.content.Context;
 
+import com.nextcloud.client.account.User;
+import com.nextcloud.client.account.UserAccountManager;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.lib.common.OwnCloudAccount;
 import com.owncloud.android.lib.common.OwnCloudClient;
@@ -52,18 +54,22 @@ abstract class AbstractOwnCloudSyncAdapter extends
     private Account account;
     private ContentProviderClient contentProviderClient;
     private FileDataStorageManager storageManager;
-
+    private final UserAccountManager userAccountManager;
     private OwnCloudClient client;
 
-    AbstractOwnCloudSyncAdapter(Context context, boolean autoInitialize) {
+    AbstractOwnCloudSyncAdapter(Context context, boolean autoInitialize, UserAccountManager userAccountManager) {
         super(context, autoInitialize);
         this.setAccountManager(AccountManager.get(context));
+        this.userAccountManager = userAccountManager;
     }
 
-    AbstractOwnCloudSyncAdapter(Context context, boolean autoInitialize,
-                                       boolean allowParallelSyncs) {
+    AbstractOwnCloudSyncAdapter(Context context,
+                                boolean autoInitialize,
+                                boolean allowParallelSyncs,
+                                UserAccountManager userAccountManager) {
         super(context, autoInitialize, allowParallelSyncs);
         this.setAccountManager(AccountManager.get(context));
+        this.userAccountManager = userAccountManager;
     }
 
     void initClientForCurrentAccount() throws OperationCanceledException,
@@ -81,6 +87,12 @@ abstract class AbstractOwnCloudSyncAdapter extends
         return this.account;
     }
 
+    public User getUser() {
+        Account account = getAccount();
+        String accountName = account != null ? account.name : null;
+        return userAccountManager.getUser(accountName).orElseGet(userAccountManager::getAnonymousUser);
+    }
+
     public ContentProviderClient getContentProviderClient() {
         return this.contentProviderClient;
     }

+ 17 - 14
src/main/java/com/owncloud/android/syncadapter/FileSyncAdapter.java

@@ -34,6 +34,9 @@ import android.content.Intent;
 import android.content.SyncResult;
 import android.os.Bundle;
 
+import com.nextcloud.client.account.User;
+import com.nextcloud.client.account.UserAccountManager;
+import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.AuthenticatorActivity;
 import com.owncloud.android.datamodel.FileDataStorageManager;
@@ -120,18 +123,20 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
      *
      * {@inheritDoc}
      */
-    public FileSyncAdapter(Context context, boolean autoInitialize) {
-        super(context, autoInitialize);
+    public FileSyncAdapter(Context context, boolean autoInitialize, UserAccountManager userAccountManager) {
+        super(context, autoInitialize, userAccountManager);
     }
 
-
     /**
      * Creates a {@link FileSyncAdapter}
      *
      * {@inheritDoc}
      */
-    public FileSyncAdapter(Context context, boolean autoInitialize, boolean allowParallelSyncs) {
-        super(context, autoInitialize, allowParallelSyncs);
+    public FileSyncAdapter(Context context,
+                           boolean autoInitialize,
+                           boolean allowParallelSyncs,
+                           UserAccountManager userAccountManager) {
+        super(context, autoInitialize, allowParallelSyncs, userAccountManager);
     }
 
 
@@ -258,17 +263,15 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
         }
 
         // folder synchronization
-        RefreshFolderOperation synchFolderOp = new RefreshFolderOperation( folder,
-                                                                                   mCurrentSyncTime,
-                                                                                   true,
-                                                                                   false,
-                                                                                   getStorageManager(),
-                                                                                   getAccount(),
-                                                                                   getContext()
-                                                                                  );
+        RefreshFolderOperation synchFolderOp = new RefreshFolderOperation(folder,
+                                                                          mCurrentSyncTime,
+                                                                          true,
+                                                                          false,
+                                                                          getStorageManager(),
+                                                                          getUser(),
+                                                                          getContext());
         RemoteOperationResult result = synchFolderOp.execute(getClient());
 
-
         // synchronized folder -> notice to UI - ALWAYS, although !result.isSuccess
         sendLocalBroadcast(EVENT_FULL_SYNC_FOLDER_CONTENTS_SYNCED, folder.getRemotePath(), result);
 

+ 11 - 2
src/main/java/com/owncloud/android/syncadapter/FileSyncService.java

@@ -24,6 +24,12 @@ import android.app.Service;
 import android.content.Intent;
 import android.os.IBinder;
 
+import com.nextcloud.client.account.UserAccountManager;
+
+import javax.inject.Inject;
+
+import dagger.android.AndroidInjection;
+
 /**
  * Background service for synchronizing remote files with their local state.
  * 
@@ -35,15 +41,18 @@ public class FileSyncService extends Service {
     private static FileSyncAdapter syncAdapter;
     // Object to use as a thread-safe lock
     private static final Object syncAdapterLock = new Object();
-    
+
+    @Inject UserAccountManager userAccountManager;
+
     /*
      * {@inheritDoc}
      */
     @Override
     public void onCreate() {
+        AndroidInjection.inject(this);
         synchronized (syncAdapterLock) {
             if (syncAdapter == null) {
-                syncAdapter = new FileSyncAdapter(getApplicationContext(), true);
+                syncAdapter = new FileSyncAdapter(getApplicationContext(), true, userAccountManager);
             }
         }
     }

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

@@ -111,7 +111,7 @@ public class FilesServiceApiImpl implements FilesServiceApi {
                                                                                    false,
                                                                                    true,
                                                                                    baseActivity.getStorageManager(),
-                                                                                   baseActivity.getAccount(),
+                                                                                   baseActivity.getUser().orElseThrow(RuntimeException::new),
                                                                                    context);
                         synchFolderOp.execute(ownCloudClient);
                     }

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

@@ -2051,7 +2051,7 @@ public class FileDisplayActivity extends FileActivity
                                         false,
                                         ignoreETag,
                                         getStorageManager(),
-                                        getAccount(),
+                                        getUser().orElseThrow(RuntimeException::new),
                                         getApplicationContext()
                                 );
                                 synchFolderOp.execute(
@@ -2506,7 +2506,7 @@ public class FileDisplayActivity extends FileActivity
             storageManager = new FileDataStorageManager(user.toPlatformAccount(), getContentResolver());
         }
 
-        FetchRemoteFileTask fetchRemoteFileTask = new FetchRemoteFileTask(user.toPlatformAccount(),
+        FetchRemoteFileTask fetchRemoteFileTask = new FetchRemoteFileTask(user,
                                                                           fileId,
                                                                           storageManager,
                                                                           this);

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

@@ -256,7 +256,7 @@ public class FolderPickerActivity extends FileActivity implements FileFragment.C
                                                                             false,
                                                                             ignoreETag,
                                                                             getStorageManager(),
-                                                                            getAccount(),
+                                                                            getUser().orElseThrow(RuntimeException::new),
                                                                             getApplicationContext());
 
         refreshFolderOperation.execute(getAccount(), this, null, null);

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

@@ -835,7 +835,7 @@ public class ReceiveExternalFilesActivity extends FileActivity
                                                                         false,
                                                                         false,
                                                                         getStorageManager(),
-                                                                        getAccount(),
+                                                                        getUser().orElseThrow(RuntimeException::new),
                                                                         getApplicationContext()
                                                                       );
         syncFolderOp.execute(getAccount(), this, null, null);

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

@@ -920,7 +920,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
 
                 if (result.isSuccess()) {
                     OCFile file = FileStorageUtils.fillOCFile((RemoteFile) result.getData().get(0));
-                    FileStorageUtils.searchForLocalFileInDefaultPath(file, user.toPlatformAccount());
+                    FileStorageUtils.searchForLocalFileInDefaultPath(file, user.getAccountName());
                     file = mStorageManager.saveFileWithParent(file, activity);
 
                     ShareType newShareType = ocShare.getShareType();
@@ -980,7 +980,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
 
         for (Object remoteFile : objects) {
             OCFile ocFile = FileStorageUtils.fillOCFile((RemoteFile) remoteFile);
-            FileStorageUtils.searchForLocalFileInDefaultPath(ocFile, user.toPlatformAccount());
+            FileStorageUtils.searchForLocalFileInDefaultPath(ocFile, user.getAccountName());
 
             try {
                 if (ExtendedListFragment.SearchType.GALLERY_SEARCH == searchType) {
@@ -997,7 +997,7 @@ public class OCFileListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
                                                                                             true,
                                                                                             false,
                                                                                             mStorageManager,
-                                                                                            user.toPlatformAccount(),
+                                                                                            user,
                                                                                             activity);
                         refreshFolderOperation.execute(user.toPlatformAccount(), activity);
                     }

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

@@ -498,7 +498,7 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
         if (ocFile == null) { // Remote file doesn't exist, try to refresh folder
             OCFile folder = storageManager.getFileByPath(new File(remotePath).getParent() + "/");
             if (folder != null && folder.isFolder()) {
-                this.refreshFolder(itemViewHolder, user.toPlatformAccount(), folder, (caller, result) -> {
+                this.refreshFolder(itemViewHolder, user, folder, (caller, result) -> {
                     itemViewHolder.binding.uploadStatus.setText(status);
                     if (result.isSuccess()) {
                         OCFile file = storageManager.getFileByPath(remotePath);
@@ -550,7 +550,7 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
 
     private void refreshFolder(
         ItemViewHolder view,
-        Account account,
+        User user,
         OCFile folder,
         OnRemoteOperationListener listener) {
         view.binding.uploadListItemLayout.setClickable(false);
@@ -562,9 +562,9 @@ public class UploadListAdapter extends SectionedRecyclerViewAdapter<SectionedVie
                                    false,
                                    true,
                                    storageManager,
-                                   account,
+                                   user,
                                    context)
-            .execute(account, context, (caller, result) -> {
+            .execute(user.toPlatformAccount(), context, (caller, result) -> {
                 view.binding.uploadListItemLayout.setClickable(true);
                 listener.onRemoteOperationFinish(caller, result);
             }, parentActivity.getHandler());

+ 13 - 12
src/main/java/com/owncloud/android/ui/asynctasks/FetchRemoteFileTask.java

@@ -21,10 +21,10 @@
 
 package com.owncloud.android.ui.asynctasks;
 
-import android.accounts.Account;
 import android.os.AsyncTask;
 import android.text.TextUtils;
 
+import com.nextcloud.client.account.User;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.FileDataStorageManager;
@@ -43,16 +43,16 @@ import com.owncloud.android.utils.FileStorageUtils;
 import static com.owncloud.android.lib.resources.files.SearchRemoteOperation.SearchType.FILE_ID_SEARCH;
 
 public class FetchRemoteFileTask extends AsyncTask<Void, Void, String> {
-    private Account account;
-    private String fileId;
-    private FileDataStorageManager storageManager;
-    private FileDisplayActivity fileDisplayActivity;
+    private final User user;
+    private final String fileId;
+    private final FileDataStorageManager storageManager;
+    private final FileDisplayActivity fileDisplayActivity;
 
-    public FetchRemoteFileTask(Account account,
+    public FetchRemoteFileTask(User user,
                                String fileId,
                                FileDataStorageManager storageManager,
                                FileDisplayActivity fileDisplayActivity) {
-        this.account = account;
+        this.user = user;
         this.fileId = fileId;
         this.storageManager = storageManager;
         this.fileDisplayActivity = fileDisplayActivity;
@@ -65,7 +65,8 @@ public class FetchRemoteFileTask extends AsyncTask<Void, Void, String> {
         SearchRemoteOperation searchRemoteOperation = new SearchRemoteOperation(fileId,
                                                                                 FILE_ID_SEARCH,
                                                                                 false);
-        RemoteOperationResult remoteOperationResult = searchRemoteOperation.execute(account, fileDisplayActivity);
+        RemoteOperationResult remoteOperationResult = searchRemoteOperation.execute(user.toPlatformAccount(),
+                                                                                    fileDisplayActivity);
 
         if (remoteOperationResult.isSuccess() && remoteOperationResult.getData() != null) {
             if (remoteOperationResult.getData().isEmpty()) {
@@ -74,7 +75,7 @@ public class FetchRemoteFileTask extends AsyncTask<Void, Void, String> {
             String remotePath = ((RemoteFile) remoteOperationResult.getData().get(0)).getRemotePath();
 
             ReadFileRemoteOperation operation = new ReadFileRemoteOperation(remotePath);
-            RemoteOperationResult result = operation.execute(account, fileDisplayActivity);
+            RemoteOperationResult result = operation.execute(user.toPlatformAccount(), fileDisplayActivity);
 
             if (!result.isSuccess()) {
                 Exception exception = result.getException();
@@ -90,7 +91,7 @@ public class FetchRemoteFileTask extends AsyncTask<Void, Void, String> {
             RemoteFile remoteFile = (RemoteFile) result.getData().get(0);
 
             OCFile ocFile = FileStorageUtils.fillOCFile(remoteFile);
-            FileStorageUtils.searchForLocalFileInDefaultPath(ocFile, account);
+            FileStorageUtils.searchForLocalFileInDefaultPath(ocFile, user.getAccountName());
             ocFile = storageManager.saveFileWithParent(ocFile, fileDisplayActivity);
 
             // also sync folder content
@@ -107,9 +108,9 @@ public class FetchRemoteFileTask extends AsyncTask<Void, Void, String> {
                                                                                 true,
                                                                                 true,
                                                                                 storageManager,
-                                                                                account,
+                                                                                user,
                                                                                 fileDisplayActivity);
-            refreshFolderOperation.execute(account, fileDisplayActivity);
+            refreshFolderOperation.execute(user.toPlatformAccount(), fileDisplayActivity);
 
             fileDisplayActivity.setFile(ocFile);
         } else {

+ 5 - 7
src/main/java/com/owncloud/android/ui/fragment/contactsbackup/ContactsBackupFragment.java

@@ -95,7 +95,7 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi
 
     private CompoundButton.OnCheckedChangeListener onCheckedChangeListener;
     private ArbitraryDataProvider arbitraryDataProvider;
-    private Account account;
+    private User user;
     private boolean showSidebar = true;
 
     public static ContactsBackupFragment create(boolean showSidebar) {
@@ -124,9 +124,7 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi
         }
 
         final ContactsPreferenceActivity contactsPreferenceActivity = (ContactsPreferenceActivity) getActivity();
-
-        account = contactsPreferenceActivity.getAccount();
-        User user = contactsPreferenceActivity.getUser().orElseThrow(RuntimeException::new);
+        user = contactsPreferenceActivity.getUser().orElseThrow(RuntimeException::new);
 
         ActionBar actionBar = contactsPreferenceActivity != null ? contactsPreferenceActivity.getSupportActionBar() : null;
 
@@ -214,9 +212,9 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi
 
                 if (folder != null) {
                     RefreshFolderOperation operation = new RefreshFolderOperation(folder, System.currentTimeMillis(),
-                            false, false, storageManager, account, getContext());
+                            false, false, storageManager, user, getContext());
 
-                    RemoteOperationResult result = operation.execute(account, context);
+                    RemoteOperationResult result = operation.execute(user.toPlatformAccount(), context);
                     return result.isSuccess();
                 } else {
                     return Boolean.FALSE;
@@ -341,7 +339,7 @@ public class ContactsBackupFragment extends FileFragment implements DatePickerDi
             backgroundJobManager.cancelPeriodicContactsBackup(user);
         }
 
-        arbitraryDataProvider.storeOrUpdateKeyValue(account.name, PREFERENCE_CONTACTS_AUTOMATIC_BACKUP,
+        arbitraryDataProvider.storeOrUpdateKeyValue(user.getAccountName(), PREFERENCE_CONTACTS_AUTOMATIC_BACKUP,
                 String.valueOf(enabled));
     }
 

+ 5 - 4
src/main/java/com/owncloud/android/utils/FileStorageUtils.java

@@ -31,6 +31,7 @@ import android.text.TextUtils;
 import android.util.Log;
 import android.webkit.MimeTypeMap;
 
+import com.nextcloud.client.account.User;
 import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.FileDataStorageManager;
@@ -331,12 +332,12 @@ public final class FileStorageUtils {
      * This should be changed in the near future to avoid any chance of data loss, but we need to add some options
      * to limit hard automatic synchronizations to wifi, unless the user wants otherwise.
      *
-     * @param file      File to associate a possible 'lost' local file.
-     * @param account   Account holding file.
+     * @param file         File to associate a possible 'lost' local file.
+     * @param accountName  File owner account name.
      */
-    public static void searchForLocalFileInDefaultPath(OCFile file, Account account) {
+    public static void searchForLocalFileInDefaultPath(OCFile file, String accountName) {
         if ((file.getStoragePath() == null || !new File(file.getStoragePath()).exists()) && !file.isFolder()) {
-            File f = new File(FileStorageUtils.getDefaultSavePathFor(account.name, file));
+            File f = new File(FileStorageUtils.getDefaultSavePathFor(accountName, file));
             if (f.exists()) {
                 file.setStoragePath(f.getAbsolutePath());
                 file.setLastSyncDateForData(f.lastModified());