Refactored remove file operation (inherits RemoteOperation, so generates RemoteOperat...
[pub/Android/ownCloud.git] / src / com / owncloud / android / ui / fragment / FileDetailFragment.java
index 10b44ad..ef76a54 100644 (file)
@@ -33,7 +33,6 @@ import org.apache.http.client.utils.URLEncodedUtils;
 import org.apache.http.message.BasicNameValuePair;\r
 import org.apache.http.protocol.HTTP;\r
 import org.apache.jackrabbit.webdav.client.methods.DavMethodBase;\r
-import org.apache.jackrabbit.webdav.client.methods.DeleteMethod;\r
 import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;\r
 import org.json.JSONObject;\r
 \r
@@ -78,10 +77,15 @@ import com.owncloud.android.authenticator.AccountAuthenticator;
 import com.owncloud.android.datamodel.FileDataStorageManager;\r
 import com.owncloud.android.datamodel.OCFile;\r
 import com.owncloud.android.files.services.FileDownloader;\r
+import com.owncloud.android.files.services.FileObserverService;\r
 import com.owncloud.android.files.services.FileUploader;\r
 import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;\r
 import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;\r
 import com.owncloud.android.network.OwnCloudClientUtils;\r
+import com.owncloud.android.operations.OnRemoteOperationListener;\r
+import com.owncloud.android.operations.RemoteOperation;\r
+import com.owncloud.android.operations.RemoteOperationResult;\r
+import com.owncloud.android.operations.RemoveFileOperation;\r
 import com.owncloud.android.ui.activity.FileDetailActivity;\r
 import com.owncloud.android.ui.activity.FileDisplayActivity;\r
 import com.owncloud.android.ui.activity.TransferServiceGetter;\r
@@ -98,7 +102,7 @@ import eu.alefzero.webdav.WebdavUtils;
  * \r
  */\r
 public class FileDetailFragment extends SherlockFragment implements\r
-        OnClickListener, ConfirmationDialogFragment.ConfirmationDialogFragmentListener {\r
+        OnClickListener, ConfirmationDialogFragment.ConfirmationDialogFragmentListener, OnRemoteOperationListener {\r
 \r
     public static final String EXTRA_FILE = "FILE";\r
     public static final String EXTRA_ACCOUNT = "ACCOUNT";\r
@@ -113,6 +117,9 @@ public class FileDetailFragment extends SherlockFragment implements
     \r
     private DownloadFinishReceiver mDownloadFinishReceiver;\r
     private UploadFinishReceiver mUploadFinishReceiver;\r
+    \r
+    private Handler mHandler;\r
+    private RemoteOperation mLastRemoteOperation;\r
 \r
     private static final String TAG = "FileDetailFragment";\r
     public static final String FTAG = "FileDetails"; \r
@@ -149,6 +156,13 @@ public class FileDetailFragment extends SherlockFragment implements
         }\r
     }\r
     \r
+    \r
+    @Override\r
+    public void onCreate(Bundle savedInstanceState) {\r
+        super.onCreate(savedInstanceState);\r
+        mHandler = new Handler();\r
+    }\r
+    \r
 \r
     @Override\r
     public View onCreateView(LayoutInflater inflater, ViewGroup container,\r
@@ -247,6 +261,7 @@ public class FileDetailFragment extends SherlockFragment implements
             case R.id.fdDownloadBtn: {\r
                 //if (FileDownloader.isDownloading(mAccount, mFile.getRemotePath())) {\r
                 FileDownloaderBinder downloaderBinder = mContainerActivity.getFileDownloaderBinder();\r
+                FileUploaderBinder uploaderBinder = mContainerActivity.getFileUploaderBinder();\r
                 if (downloaderBinder != null && downloaderBinder.isDownloading(mAccount, mFile)) {\r
                     downloaderBinder.cancel(mAccount, mFile);\r
                     if (mFile.isDown()) {\r
@@ -254,6 +269,26 @@ public class FileDetailFragment extends SherlockFragment implements
                     } else {\r
                         setButtonsForRemote();\r
                     }\r
+\r
+                } else if (uploaderBinder != null && uploaderBinder.isUploading(mAccount, mFile)) {\r
+                    uploaderBinder.cancel(mAccount, mFile);\r
+                    if (!mFile.fileExists()) {\r
+                        // TODO make something better\r
+                        if (getActivity() instanceof FileDisplayActivity) {\r
+                            // double pane\r
+                            FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();\r
+                            transaction.replace(R.id.file_details_container, new FileDetailFragment(null, null), FTAG); // empty FileDetailFragment\r
+                            transaction.commit();\r
+                            mContainerActivity.onFileStateChanged();\r
+                        } else {\r
+                            getActivity().finish();\r
+                        }\r
+                        \r
+                    } else if (mFile.isDown()) {\r
+                        setButtonsForDown();\r
+                    } else {\r
+                        setButtonsForRemote();\r
+                    }\r
                     \r
                 } else {\r
                     Intent i = new Intent(getActivity(), FileDownloader.class);\r
@@ -281,7 +316,7 @@ public class FileDetailFragment extends SherlockFragment implements
                 } else {\r
                     mContainerActivity.onFileStateChanged();    // put inside 'else' to not call it twice (here, and in the virtual click on fdDownloadBtn)\r
                 }\r
-                /*\r
+                \r
                 Intent intent = new Intent(getActivity().getApplicationContext(),\r
                                            FileObserverService.class);\r
                 intent.putExtra(FileObserverService.KEY_FILE_CMD,\r
@@ -289,8 +324,9 @@ public class FileDetailFragment extends SherlockFragment implements
                                    FileObserverService.CMD_ADD_OBSERVED_FILE:\r
                                    FileObserverService.CMD_DEL_OBSERVED_FILE));\r
                 intent.putExtra(FileObserverService.KEY_CMD_ARG, mFile.getStoragePath());\r
+                Log.e(TAG, "starting observer service");\r
                 getActivity().startService(intent);\r
-                */\r
+                \r
                 break;\r
             }\r
             case R.id.fdRenameBtn: {\r
@@ -367,7 +403,12 @@ public class FileDetailFragment extends SherlockFragment implements
         if (callerTag.equals(FTAG_CONFIRMATION)) {\r
             FileDataStorageManager fdsm = new FileDataStorageManager(mAccount, getActivity().getContentResolver());\r
             if (fdsm.getFileById(mFile.getFileId()) != null) {\r
-                new Thread(new RemoveRunnable(mFile, mAccount, new Handler())).start();\r
+                mLastRemoteOperation = new RemoveFileOperation( mFile, \r
+                                                                true, \r
+                                                                new FileDataStorageManager(mAccount, getActivity().getContentResolver()));\r
+                WebdavClient wc = OwnCloudClientUtils.createOwnCloudClient(mAccount, getSherlockActivity().getApplicationContext());\r
+                mLastRemoteOperation.execute(wc, this, mHandler);\r
+                \r
                 boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;\r
                 getActivity().showDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);\r
             }\r
@@ -534,6 +575,7 @@ public class FileDetailFragment extends SherlockFragment implements
             ((Button) getView().findViewById(R.id.fdOpenBtn)).setEnabled(false);\r
             ((Button) getView().findViewById(R.id.fdRenameBtn)).setEnabled(false);\r
             ((Button) getView().findViewById(R.id.fdRemoveBtn)).setEnabled(false);\r
+            getView().findViewById(R.id.fdKeepInSync).setEnabled(false);\r
         }\r
     }\r
     \r
@@ -549,6 +591,7 @@ public class FileDetailFragment extends SherlockFragment implements
             ((Button) getView().findViewById(R.id.fdOpenBtn)).setEnabled(true);\r
             ((Button) getView().findViewById(R.id.fdRenameBtn)).setEnabled(true);\r
             ((Button) getView().findViewById(R.id.fdRemoveBtn)).setEnabled(true);\r
+            getView().findViewById(R.id.fdKeepInSync).setEnabled(true);\r
         }\r
     }\r
 \r
@@ -563,6 +606,7 @@ public class FileDetailFragment extends SherlockFragment implements
             ((Button) getView().findViewById(R.id.fdOpenBtn)).setEnabled(false);\r
             ((Button) getView().findViewById(R.id.fdRenameBtn)).setEnabled(true);\r
             ((Button) getView().findViewById(R.id.fdRemoveBtn)).setEnabled(true);\r
+            getView().findViewById(R.id.fdKeepInSync).setEnabled(true);\r
         }\r
     }\r
     \r
@@ -981,97 +1025,6 @@ public class FileDetailFragment extends SherlockFragment implements
         \r
     }\r
     \r
-    private class RemoveRunnable implements Runnable {\r
-        \r
-        Account mAccount;\r
-        OCFile mFileToRemove;\r
-        Handler mHandler;\r
-        \r
-        public RemoveRunnable(OCFile fileToRemove, Account account, Handler handler) {\r
-            mFileToRemove = fileToRemove;\r
-            mAccount = account;\r
-            mHandler = handler;\r
-        }\r
-        \r
-        public void run() {\r
-            WebdavClient wc = OwnCloudClientUtils.createOwnCloudClient(mAccount, getSherlockActivity().getApplicationContext());\r
-            AccountManager am = AccountManager.get(getSherlockActivity());\r
-            String baseUrl = am.getUserData(mAccount, AccountAuthenticator.KEY_OC_BASE_URL);\r
-            OwnCloudVersion ocv = new OwnCloudVersion(am.getUserData(mAccount, AccountAuthenticator.KEY_OC_VERSION));\r
-            String webdav_path = AccountUtils.getWebdavPath(ocv);\r
-            Log.d("ASD", ""+baseUrl + webdav_path + WebdavUtils.encodePath(mFileToRemove.getRemotePath()));\r
-\r
-            DeleteMethod delete = new DeleteMethod(baseUrl + webdav_path + WebdavUtils.encodePath(mFileToRemove.getRemotePath()));\r
-            \r
-            boolean success = false;\r
-            int status = -1;\r
-            try {\r
-                status = wc.executeMethod(delete);\r
-                success = (delete.succeeded());\r
-                delete.getResponseBodyAsString();   // exhaust the response, although not interesting\r
-                Log.d(TAG, "Delete: returned status " + status);\r
-                \r
-            } catch (HttpException e) {\r
-                Log.e(TAG, "HTTP Exception removing file " + mFileToRemove.getRemotePath(), e);\r
-                \r
-            } catch (IOException e) {\r
-                Log.e(TAG, "I/O Exception removing file " + mFileToRemove.getRemotePath(), e);\r
-                \r
-            } catch (Exception e) {\r
-                Log.e(TAG, "Unexpected exception removing file " + mFileToRemove.getRemotePath(), e);\r
-                \r
-            } finally {\r
-                delete.releaseConnection();\r
-            }\r
-            \r
-            if (success) {\r
-                FileDataStorageManager fdsm = new FileDataStorageManager(mAccount, getActivity().getContentResolver());\r
-                fdsm.removeFile(mFileToRemove, true);\r
-                mHandler.post(new Runnable() {\r
-                    @Override\r
-                    public void run() {\r
-                        boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;\r
-                        getActivity().dismissDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);\r
-                        try {\r
-                            Toast msg = Toast.makeText(getActivity().getApplicationContext(), R.string.remove_success_msg, Toast.LENGTH_LONG);\r
-                            msg.show();\r
-                            if (inDisplayActivity) {\r
-                                // double pane\r
-                                FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();\r
-                                transaction.replace(R.id.file_details_container, new FileDetailFragment(null, null)); // empty FileDetailFragment\r
-                                transaction.commit();\r
-                                mContainerActivity.onFileStateChanged();\r
-                                \r
-                            } else {\r
-                                getActivity().finish();\r
-                            }\r
-                            \r
-                        } catch (NotFoundException e) {\r
-                            e.printStackTrace();\r
-                        }\r
-                    }\r
-                });\r
-                \r
-            } else {\r
-                mHandler.post(new Runnable() {\r
-                    @Override\r
-                    public void run() {\r
-                        boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;\r
-                        getActivity().dismissDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);\r
-                        try {\r
-                            Toast msg = Toast.makeText(getActivity(), R.string.remove_fail_msg, Toast.LENGTH_LONG); \r
-                            msg.show();\r
-                            \r
-                        } catch (NotFoundException e) {\r
-                            e.printStackTrace();\r
-                        }\r
-                    }\r
-                });\r
-            }\r
-        }\r
-        \r
-    }\r
-    \r
     class BitmapLoader extends AsyncTask<String, Void, Bitmap> {\r
         @SuppressLint({ "NewApi", "NewApi", "NewApi" }) // to avoid Lint errors since Android SDK r20\r
                @Override\r
@@ -1145,6 +1098,39 @@ public class FileDetailFragment extends SherlockFragment implements
         }\r
         \r
     }\r
+\r
+    /**\r
+     * {@inheritDoc}\r
+     */\r
+    @Override\r
+    public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {\r
+        if (operation.equals(mLastRemoteOperation)) {\r
+            if (operation instanceof RemoveFileOperation) {\r
+                boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;\r
+                getActivity().dismissDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);\r
+                if (result.isSuccess()) {\r
+                    Toast msg = Toast.makeText(getActivity().getApplicationContext(), R.string.remove_success_msg, Toast.LENGTH_LONG);\r
+                    msg.show();\r
+                    if (inDisplayActivity) {\r
+                        // double pane\r
+                        FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();\r
+                        transaction.replace(R.id.file_details_container, new FileDetailFragment(null, null)); // empty FileDetailFragment\r
+                        transaction.commit();\r
+                        mContainerActivity.onFileStateChanged();\r
+                    } else {\r
+                        getActivity().finish();\r
+                    }\r
+                    \r
+                } else {\r
+                    Toast msg = Toast.makeText(getActivity(), R.string.remove_fail_msg, Toast.LENGTH_LONG); \r
+                    msg.show();\r
+                    if (result.isSslRecoverableException()) {\r
+                        // TODO\r
+                    }\r
+                }\r
+            }\r
+        }\r
+    }\r
     \r
 \r
 }\r