Ver código fonte

delete local file on restore
refresh file list / activity list on succesfull restore

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

tobiasKaminsky 6 anos atrás
pai
commit
4da8a94a75

+ 10 - 0
src/main/java/com/owncloud/android/services/OperationsService.java

@@ -52,6 +52,7 @@ import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
 import com.owncloud.android.lib.common.operations.RemoteOperation;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 import com.owncloud.android.lib.common.utils.Log_OC;
+import com.owncloud.android.lib.resources.files.FileVersion;
 import com.owncloud.android.lib.resources.shares.ShareType;
 import com.owncloud.android.lib.resources.status.OwnCloudVersion;
 import com.owncloud.android.lib.resources.users.GetRemoteUserInfoOperation;
@@ -65,6 +66,7 @@ import com.owncloud.android.operations.MoveFileOperation;
 import com.owncloud.android.operations.OAuth2GetAccessToken;
 import com.owncloud.android.operations.RemoveFileOperation;
 import com.owncloud.android.operations.RenameFileOperation;
+import com.owncloud.android.operations.RestoreFileVersionOperation;
 import com.owncloud.android.operations.SynchronizeFileOperation;
 import com.owncloud.android.operations.SynchronizeFolderOperation;
 import com.owncloud.android.operations.UnshareOperation;
@@ -93,6 +95,7 @@ public class OperationsService extends Service {
     public static final String EXTRA_RESULT = "RESULT";
     public static final String EXTRA_NEW_PARENT_PATH = "NEW_PARENT_PATH";
     public static final String EXTRA_FILE = "FILE";
+    public static final String EXTRA_FILE_VERSION = "FILE_VERSION";
     public static final String EXTRA_SHARE_PASSWORD = "SHARE_PASSWORD";
     public static final String EXTRA_SHARE_TYPE = "SHARE_TYPE";
     public static final String EXTRA_SHARE_WITH = "SHARE_WITH";
@@ -100,6 +103,7 @@ public class OperationsService extends Service {
     public static final String EXTRA_SHARE_PERMISSIONS = "SHARE_PERMISSIONS";
     public static final String EXTRA_SHARE_PUBLIC_UPLOAD = "SHARE_PUBLIC_UPLOAD";
     public static final String EXTRA_SHARE_ID = "SHARE_ID";
+    public static final String EXTRA_USER_ID = "USER_ID";
 
     public static final String EXTRA_COOKIE = "COOKIE";
 
@@ -119,6 +123,7 @@ public class OperationsService extends Service {
     public static final String ACTION_MOVE_FILE = "MOVE_FILE";
     public static final String ACTION_COPY_FILE = "COPY_FILE";
     public static final String ACTION_CHECK_CURRENT_CREDENTIALS = "CHECK_CURRENT_CREDENTIALS";
+    public static final String ACTION_RESTORE_VERSION = "RESTORE_VERSION";
 
     public static final String ACTION_OPERATION_ADDED = OperationsService.class.getName() + ".OPERATION_ADDED";
     public static final String ACTION_OPERATION_FINISHED = OperationsService.class.getName() + ".OPERATION_FINISHED";
@@ -691,6 +696,11 @@ public class OperationsService extends Service {
                 } else if (action.equals(ACTION_CHECK_CURRENT_CREDENTIALS)) {
                     // Check validity of currently stored credentials for a given account
                     operation = new CheckCurrentCredentialsOperation(account);
+                } else if (action.equals(ACTION_RESTORE_VERSION)) {
+                    FileVersion fileVersion = operationIntent.getParcelableExtra(EXTRA_FILE_VERSION);
+                    String userId = operationIntent.getStringExtra(EXTRA_USER_ID);
+                    operation = new RestoreFileVersionOperation(fileVersion.getRemoteId(), fileVersion.getFileName(),
+                            userId);
                 }
             }
                 

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

@@ -95,6 +95,7 @@ import com.owncloud.android.operations.MoveFileOperation;
 import com.owncloud.android.operations.RefreshFolderOperation;
 import com.owncloud.android.operations.RemoveFileOperation;
 import com.owncloud.android.operations.RenameFileOperation;
+import com.owncloud.android.operations.RestoreFileVersionOperation;
 import com.owncloud.android.operations.SynchronizeFileOperation;
 import com.owncloud.android.operations.UnshareOperation;
 import com.owncloud.android.operations.UpdateSharePermissionsOperation;
@@ -137,6 +138,7 @@ import org.parceler.Parcels;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 
 import static com.owncloud.android.db.PreferenceManager.getSortOrder;
 
@@ -1726,6 +1728,8 @@ public class FileDisplayActivity extends HookActivity
             onUpdateShareInformation(result, R.string.updating_share_failed);
         } else if (operation instanceof UnshareOperation) {
             onUpdateShareInformation(result, R.string.unsharing_failed);
+        } else if (operation instanceof RestoreFileVersionOperation) {
+            onRestoreFileVersionOperationFinish((RestoreFileVersionOperation) operation, result);
         }
     }
 
@@ -1766,7 +1770,11 @@ public class FileDisplayActivity extends HookActivity
             OCFile removedFile = operation.getFile();
             tryStopPlaying(removedFile);
             FileFragment second = getSecondFragment();
-            if (second != null && removedFile.equals(second.getFile())) {
+
+            // check if file is still available, if so do nothing
+            boolean fileAvailable = getStorageManager().fileExists(removedFile.getFileId());
+
+            if (second != null && !fileAvailable && removedFile.equals(second.getFile())) {
                 if (second instanceof PreviewMediaFragment) {
                     ((PreviewMediaFragment) second).stopPreview(true);
                 }
@@ -1785,6 +1793,29 @@ public class FileDisplayActivity extends HookActivity
         }
     }
 
+    private void onRestoreFileVersionOperationFinish(RestoreFileVersionOperation operation,
+                                                     RemoteOperationResult result) {
+
+        if (result.isSuccess()) {
+            OCFile file = getFile();
+
+            if (file.isDown()) {
+                List<OCFile> list = new ArrayList<>();
+                list.add(file);
+                getFileOperationsHelper().removeFiles(list, true, true);
+            }
+
+            OCFile parent = getStorageManager().getFileById(file.getParentId());
+            startSyncFolderOperation(parent, true, true);
+
+            if (getSecondFragment() instanceof FileDetailFragment) {
+                FileDetailFragment fileDetailFragment = (FileDetailFragment) getSecondFragment();
+                fileDetailFragment.getFileDetailActivitiesFragment().reload();
+            }
+        }
+
+    }
+
     public void setMediaServiceConnection() {
         mMediaServiceConnection = newMediaConnection();// mediaServiceConnection;
         bindService(new Intent(this, MediaService.class), mMediaServiceConnection, Context.BIND_AUTO_CREATE);
@@ -2093,7 +2124,25 @@ public class FileDisplayActivity extends HookActivity
      * @param ignoreETag If 'true', the data from the server will be fetched and sync'ed even if the eTag
      *                   didn't change.
      */
-    public void startSyncFolderOperation(final OCFile folder, final boolean ignoreETag) {
+    public void startSyncFolderOperation(OCFile folder, boolean ignoreETag) {
+        startSyncFolderOperation(folder, ignoreETag, false);
+    }
+
+    /**
+     * Starts an operation to refresh the requested folder.
+     * <p/>
+     * The operation is run in a new background thread created on the fly.
+     * <p/>
+     * The refresh updates is a "light sync": properties of regular files in folder are updated (including
+     * associated shares), but not their contents. Only the contents of files marked to be kept-in-sync are
+     * synchronized too.
+     *
+     * @param folder      Folder to refresh.
+     * @param ignoreETag  If 'true', the data from the server will be fetched and sync'ed even if the eTag
+     *                    didn't change.
+     * @param ignoreFocus reloads file list even without focus, e.g. on tablet mode, focus can still be in detail view
+     */
+    public void startSyncFolderOperation(final OCFile folder, final boolean ignoreETag, boolean ignoreFocus) {
 
         // the execution is slightly delayed to allow the activity get the window focus if it's being started
         // or if the method is called from a dialog that is being dismissed
@@ -2102,7 +2151,7 @@ public class FileDisplayActivity extends HookActivity
                     new Runnable() {
                         @Override
                         public void run() {
-                            if (hasWindowFocus()) {
+                            if (ignoreFocus || hasWindowFocus()) {
                                 long currentSyncTime = System.currentTimeMillis();
                                 mSyncInProgress = true;
 

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

@@ -113,19 +113,7 @@ public class ActivityAndVersionListAdapter extends ActivityListAdapter {
             versionViewHolder.time.setText(DateFormat.format("HH:mm", new Date(fileVersion.getModifiedTimestamp())
                     .getTime()));
 
-            versionViewHolder.restore.setOnClickListener(v -> versionListInterface.onRestoreClicked(fileVersion,
-                    new VersionListInterface.Callback() {
-                        @Override
-                        public void onSuccess(FileVersion fileVersion) {
-                            versionListInterface.onSuccess(context.getString(
-                                    R.string.file_version_restored_successfully));
-                        }
-
-                        @Override
-                        public void onError(String error) {
-                            versionListInterface.onError(error);
-                        }
-                    }));
+            versionViewHolder.restore.setOnClickListener(v -> versionListInterface.onRestoreClicked(fileVersion));
         } else {
             super.onBindViewHolder(holder, position);
         }

+ 7 - 1
src/main/java/com/owncloud/android/ui/adapter/FileDetailTabAdapter.java

@@ -37,6 +37,7 @@ public class FileDetailTabAdapter extends FragmentStatePagerAdapter {
     private Account account;
 
     private FileDetailSharingFragment fileDetailSharingFragment;
+    private FileDetailActivitiesFragment fileDetailActivitiesFragment;
 
     public FileDetailTabAdapter(FragmentManager fm, OCFile file, Account account) {
         super(fm);
@@ -49,7 +50,8 @@ public class FileDetailTabAdapter extends FragmentStatePagerAdapter {
     public Fragment getItem(int position) {
         switch (position) {
             case 0:
-                return FileDetailActivitiesFragment.newInstance(file, account);
+                fileDetailActivitiesFragment = FileDetailActivitiesFragment.newInstance(file, account);
+                return fileDetailActivitiesFragment; 
             case 1:
                 fileDetailSharingFragment = FileDetailSharingFragment.newInstance(file, account);
                 return fileDetailSharingFragment;
@@ -62,6 +64,10 @@ public class FileDetailTabAdapter extends FragmentStatePagerAdapter {
         return fileDetailSharingFragment;
     }
 
+    public FileDetailActivitiesFragment getFileDetailActivitiesFragment() {
+        return fileDetailActivitiesFragment;
+    }
+
     @Override
     public int getCount() {
         return 2;

+ 7 - 66
src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java

@@ -26,7 +26,6 @@ import android.accounts.AuthenticatorException;
 import android.accounts.OperationCanceledException;
 import android.content.Context;
 import android.graphics.PorterDuff;
-import android.os.AsyncTask;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.design.widget.Snackbar;
@@ -59,7 +58,6 @@ import com.owncloud.android.lib.resources.files.FileVersion;
 import com.owncloud.android.lib.resources.files.ReadFileVersionsOperation;
 import com.owncloud.android.lib.resources.status.OCCapability;
 import com.owncloud.android.lib.resources.status.OwnCloudVersion;
-import com.owncloud.android.operations.RestoreFileVersionOperation;
 import com.owncloud.android.ui.activity.ComponentsGetter;
 import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.adapter.ActivityAndVersionListAdapter;
@@ -70,7 +68,6 @@ import com.owncloud.android.utils.ThemeUtils;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.List;
 
 import butterknife.BindString;
 import butterknife.BindView;
@@ -232,6 +229,10 @@ public class FileDetailActivitiesFragment extends Fragment implements ActivityLi
         });
     }
 
+    public void reload() {
+        fetchAndSetData(null);
+    }
+
     /**
      * @param pageUrl String
      */
@@ -398,67 +399,7 @@ public class FileDetailActivitiesFragment extends Fragment implements ActivityLi
     }
 
     @Override
-    public void onRestoreClicked(FileVersion fileVersion, VersionListInterface.Callback callback) {
-        new RestoreFileVersionTask(fileVersion, userId, ownCloudClient, storageManager, operationsHelper, file,
-                callback).execute();
-    }
-
-    // TODO extract according to MVP, will be in following PR
-    private static class RestoreFileVersionTask extends AsyncTask<Void, Void, Boolean> {
-
-        private FileVersion fileVersion;
-        private String userId;
-        private OwnCloudClient client;
-        private FileOperationsHelper operationsHelper;
-        private FileDataStorageManager storageManager;
-        private OCFile ocFile;
-        private VersionListInterface.Callback callback;
-
-        private RestoreFileVersionTask(FileVersion fileVersion, String userId, OwnCloudClient client,
-                                       FileDataStorageManager storageManager, FileOperationsHelper operationsHelper,
-                                       OCFile ocFile,
-                                       VersionListInterface.Callback callback) {
-            this.fileVersion = fileVersion;
-            this.userId = userId;
-            this.client = client;
-            this.storageManager = storageManager;
-            this.operationsHelper = operationsHelper;
-            this.ocFile = ocFile;
-            this.callback = callback;
-        }
-
-        @Override
-        protected Boolean doInBackground(Void... voids) {
-
-            RestoreFileVersionOperation restoreFileVersionOperation = new RestoreFileVersionOperation(
-                    fileVersion.getRemoteId(), fileVersion.getFileName(), userId);
-
-            RemoteOperationResult result = restoreFileVersionOperation.execute(client);
-
-            if (result.isSuccess() && ocFile.isDown()) {
-                List<OCFile> list = new ArrayList<>();
-                list.add(ocFile);
-                operationsHelper.removeFiles(list, true, true);
-            }
-            
-            return result.isSuccess();
-        }
-
-        @Override
-        protected void onPostExecute(Boolean success) {
-            super.onPostExecute(success);
-
-            if (success) {
-                callback.onSuccess(fileVersion);
-            } else {
-                callback.onError("error");
-
-            }
-
-            // TODO refactor to MVP
-            // if true, delete old local copy && update file list
-
-            // callback.onResult(success);
-        }
+    public void onRestoreClicked(FileVersion fileVersion) {
+        operationsHelper.restoreFileVersion(fileVersion, userId);
     }
-}
+}

+ 9 - 0
src/main/java/com/owncloud/android/ui/fragment/FileDetailFragment.java

@@ -183,6 +183,15 @@ public class FileDetailFragment extends FileFragment implements OnClickListener
         return ((FileDetailTabAdapter)viewPager.getAdapter()).getFileDetailSharingFragment();
     }
 
+    /**
+     * return the reference to the file detail activity fragment to communicate with it.
+     *
+     * @return reference to the {@link FileDetailSharingFragment}
+     */
+    public FileDetailActivitiesFragment getFileDetailActivitiesFragment() {
+        return ((FileDetailTabAdapter) viewPager.getAdapter()).getFileDetailActivitiesFragment();
+    }
+
     @Override
     public void onResume() {
         super.onResume();

+ 23 - 0
src/main/java/com/owncloud/android/ui/helpers/FileOperationsHelper.java

@@ -53,6 +53,7 @@ import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.lib.resources.files.CheckEtagOperation;
+import com.owncloud.android.lib.resources.files.FileVersion;
 import com.owncloud.android.lib.resources.shares.OCShare;
 import com.owncloud.android.lib.resources.shares.ShareType;
 import com.owncloud.android.lib.resources.status.OwnCloudVersion;
@@ -426,6 +427,28 @@ public class FileOperationsHelper {
         }
     }
 
+    /**
+     * Helper method to revert to a file version. Starts a request to do it in {@link OperationsService}
+     *
+     * @param fileVersion The file version to restore
+     * @param userId      userId of current account
+     */
+    public void restoreFileVersion(FileVersion fileVersion, String userId) {
+        if (fileVersion != null) {
+            mFileActivity.showLoadingDialog(mFileActivity.getApplicationContext().
+                    getString(R.string.wait_a_moment));
+
+            Intent service = new Intent(mFileActivity, OperationsService.class);
+            service.setAction(OperationsService.ACTION_RESTORE_VERSION);
+            service.putExtra(OperationsService.EXTRA_ACCOUNT, mFileActivity.getAccount());
+            service.putExtra(OperationsService.EXTRA_FILE_VERSION, fileVersion);
+            service.putExtra(OperationsService.EXTRA_USER_ID, userId);
+            mWaitingForOpId = mFileActivity.getOperationsServiceBinder().queueNewOperation(service);
+        } else {
+            Log_OC.e(TAG, "Trying to restore a NULL FileVersion");
+        }
+    }
+
 
     /**
      * @return 'True' if the server supports the Share API

+ 1 - 7
src/main/java/com/owncloud/android/ui/interfaces/VersionListInterface.java

@@ -26,16 +26,10 @@ import com.owncloud.android.lib.resources.files.FileVersion;
 public interface VersionListInterface {
 
     interface View {
-        void onRestoreClicked(FileVersion fileVersion, Callback callback);
+        void onRestoreClicked(FileVersion fileVersion);
 
         void onSuccess(String message);
 
         void onError(String message);
     }
-    
-    interface Callback {
-        void onSuccess(FileVersion fileVersion);
-
-        void onError(String error);
-    }
 }