Better failure handling in files renaming and removal
authorDavid A. Velasco <dvelasco@solidgear.es>
Mon, 30 Jul 2012 13:11:59 +0000 (15:11 +0200)
committerDavid A. Velasco <dvelasco@solidgear.es>
Mon, 30 Jul 2012 13:11:59 +0000 (15:11 +0200)
AndroidManifest.xml
res/values/strings.xml
src/eu/alefzero/owncloud/ui/activity/FileDetailActivity.java
src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java
src/eu/alefzero/owncloud/ui/fragment/FileDetailFragment.java

index 2e1a9fa..5026493 100644 (file)
@@ -18,7 +18,7 @@
  -->\r
 <manifest package="eu.alefzero.owncloud"\r
     android:versionCode="1"\r
-    android:versionName="0.1.191B" xmlns:android="http://schemas.android.com/apk/res/android">\r
+    android:versionName="0.1.192B" xmlns:android="http://schemas.android.com/apk/res/android">\r
 \r
     <uses-permission android:name="android.permission.GET_ACCOUNTS" />\r
     <uses-permission android:name="android.permission.USE_CREDENTIALS" />\r
index cf8adf5..c0f0de0 100644 (file)
     <string name="remove_success_msg">"Successful removal"</string>
     <string name="remove_fail_msg">"Removal could not be completed"</string>
     
+    <string name="rename_local_fail_msg">"Local copy could not be renamed; try a differente new name"</string>
+    <string name="rename_server_fail_msg">"Rename could not be completed"</string>
+        
     <string name="create_dir_fail_msg">Directory could not be created</string>
     
     <string name="wait_a_moment">Wait a moment</string>
index e481cdb..461485c 100644 (file)
 package eu.alefzero.owncloud.ui.activity;\r
 \r
 import android.accounts.Account;\r
+import android.app.Dialog;\r
+import android.app.ProgressDialog;\r
 import android.content.Intent;\r
 import android.content.res.Configuration;\r
 import android.os.Bundle;\r
 import android.support.v4.app.FragmentTransaction;\r
-import android.util.Log;\r
 \r
 import com.actionbarsherlock.app.ActionBar;\r
 import com.actionbarsherlock.app.SherlockFragmentActivity;\r
@@ -32,7 +33,6 @@ import eu.alefzero.owncloud.R;
 import eu.alefzero.owncloud.datamodel.OCFile;\r
 import eu.alefzero.owncloud.files.services.FileDownloader;\r
 import eu.alefzero.owncloud.ui.fragment.FileDetailFragment;\r
-import eu.alefzero.owncloud.ui.fragment.FileListFragment;\r
 \r
 /**\r
  * This activity displays the details of a file like its name, its size and so\r
@@ -43,6 +43,8 @@ import eu.alefzero.owncloud.ui.fragment.FileListFragment;
  */\r
 public class FileDetailActivity extends SherlockFragmentActivity implements FileDetailFragment.ContainerActivity {\r
     \r
+    public static final int DIALOG_SHORT_WAIT = 0;\r
+    \r
     private boolean mConfigurationChangedToLandscape = false;\r
 \r
     @Override\r
@@ -110,6 +112,27 @@ public class FileDetailActivity extends SherlockFragmentActivity implements File
         finish();\r
     }\r
     \r
+    \r
+    @Override\r
+    protected Dialog onCreateDialog(int id) {\r
+        Dialog dialog = null;\r
+        switch (id) {\r
+        case DIALOG_SHORT_WAIT: {\r
+            ProgressDialog working_dialog = new ProgressDialog(this);\r
+            working_dialog.setMessage(getResources().getString(\r
+                    R.string.wait_a_moment));\r
+            working_dialog.setIndeterminate(true);\r
+            working_dialog.setCancelable(false);\r
+            dialog = working_dialog;\r
+            break;\r
+        }\r
+        default:\r
+            dialog = null;\r
+        }\r
+        return dialog;\r
+    }\r
+    \r
+    \r
     /**\r
      * {@inheritDoc}\r
      */\r
@@ -117,6 +140,5 @@ public class FileDetailActivity extends SherlockFragmentActivity implements File
     public void onFileStateChanged() {\r
         // nothing to do here!\r
     }\r
-    \r
 \r
 }\r
index b4365d0..c440847 100644 (file)
@@ -107,7 +107,7 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
     private static final int DIALOG_SETUP_ACCOUNT = 0;\r
     private static final int DIALOG_CREATE_DIR = 1;\r
     private static final int DIALOG_ABOUT_APP = 2;\r
-    private static final int DIALOG_SHORT_WAIT = 3;\r
+    public static final int DIALOG_SHORT_WAIT = 3;\r
     \r
     private static final int ACTION_SELECT_FILE = 1;\r
     \r
index d7fb886..a31541a 100644 (file)
@@ -82,6 +82,7 @@ import eu.alefzero.owncloud.datamodel.FileDataStorageManager;
 import eu.alefzero.owncloud.datamodel.OCFile;\r
 import eu.alefzero.owncloud.files.services.FileDownloader;\r
 import eu.alefzero.owncloud.files.services.FileUploader;\r
+import eu.alefzero.owncloud.ui.activity.FileDetailActivity;\r
 import eu.alefzero.owncloud.ui.activity.FileDisplayActivity;\r
 import eu.alefzero.owncloud.utils.OwnCloudVersion;\r
 import eu.alefzero.webdav.WebdavClient;\r
@@ -338,10 +339,11 @@ public class FileDetailFragment extends SherlockFragment implements
     @Override\r
     public void onConfirmation(String callerTag) {\r
         if (callerTag.equals(FTAG_CONFIRMATION)) {\r
-            Log.e("ASD","onConfirmation");\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
+                boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;\r
+                getActivity().showDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);\r
             }\r
         }\r
     }\r
@@ -765,15 +767,24 @@ public class FileDetailFragment extends SherlockFragment implements
                         newFile.setMimetype(mFile.getMimetype());\r
                         newFile.setModificationTimestamp(mFile.getModificationTimestamp());\r
                         newFile.setParentId(mFile.getParentId());\r
+                        boolean localRenameFails = false;\r
                         if (mFile.isDown()) {\r
                             File f = new File(mFile.getStoragePath());\r
                             Log.e(TAG, f.getAbsolutePath());\r
-                            f.renameTo(new File(f.getParent() + File.separator + newFilename)); // TODO check if fails\r
+                            localRenameFails = !(f.renameTo(new File(f.getParent() + File.separator + newFilename)));\r
                             Log.e(TAG, f.getParent() + File.separator + newFilename);\r
                             newFile.setStoragePath(f.getParent() + File.separator + newFilename);\r
                         }\r
                         \r
-                        new Thread(new RenameRunnable(mFile, newFile, mAccount, new Handler())).start();\r
+                        if (localRenameFails) {\r
+                            Toast msg = Toast.makeText(getActivity(), R.string.rename_local_fail_msg, Toast.LENGTH_LONG); \r
+                            msg.show();\r
+                            \r
+                        } else {\r
+                            new Thread(new RenameRunnable(mFile, newFile, mAccount, new Handler())).start();\r
+                            boolean inDisplayActivity = getActivity() instanceof FileDisplayActivity;\r
+                            getActivity().showDialog((inDisplayActivity)? FileDisplayActivity.DIALOG_SHORT_WAIT : FileDetailActivity.DIALOG_SHORT_WAIT);\r
+                        }\r
 \r
                     }\r
                 }\r
@@ -810,29 +821,52 @@ public class FileDetailFragment extends SherlockFragment implements
             LocalMoveMethod move = new LocalMoveMethod(baseUrl + webdav_path + WebdavUtils.encodePath(mOld.getRemotePath()),\r
                                              Uri.parse(baseUrl).getPath() == null ? "" : Uri.parse(baseUrl).getPath() + webdav_path + WebdavUtils.encodePath(mNew.getRemotePath()));\r
             \r
+            boolean success = false;\r
             try {\r
                 int status = wc.executeMethod(move);\r
-                if (move.succeeded()) {\r
-                    FileDataStorageManager fdsm = new FileDataStorageManager(mAccount, getActivity().getContentResolver());\r
-                    fdsm.removeFile(mOld);\r
-                    fdsm.saveFile(mNew);\r
-                    mFile = mNew;\r
-                    mHandler.post(new Runnable() {\r
-                        @Override\r
-                        public void run() { \r
-                            updateFileDetails(mFile, mAccount);\r
-                            mContainerActivity.onFileStateChanged();\r
-                        }\r
-                    });\r
-                }\r
-                Log.e("ASD", ""+move.getQueryString());\r
-                Log.d("move", "returned status " + status);\r
+                success = move.succeeded();\r
+                Log.d(TAG, "Move returned status: " + status);\r
+                \r
             } catch (HttpException e) {\r
-                // TODO Auto-generated catch block\r
-                e.printStackTrace();\r
+                Log.e(TAG, "HTTP Exception renaming file " + mOld.getRemotePath() + " to " + mNew.getRemotePath(), e);\r
+                \r
             } catch (IOException e) {\r
-                // TODO Auto-generated catch block\r
-                e.printStackTrace();\r
+                Log.e(TAG, "I/O Exception renaming file " + mOld.getRemotePath() + " to " + mNew.getRemotePath(), e);\r
+                \r
+            } catch (Exception e) {\r
+                Log.e(TAG, "Unexpected exception renaming file " + mOld.getRemotePath() + " to " + mNew.getRemotePath(), e);\r
+            }\r
+            \r
+            if (success) {\r
+                FileDataStorageManager fdsm = new FileDataStorageManager(mAccount, getActivity().getContentResolver());\r
+                fdsm.removeFile(mOld);\r
+                fdsm.saveFile(mNew);\r
+                mFile = mNew;\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
+                        updateFileDetails(mFile, mAccount);\r
+                        mContainerActivity.onFileStateChanged();\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.rename_server_fail_msg, Toast.LENGTH_LONG); \r
+                            msg.show();\r
+                            \r
+                        } catch (NotFoundException e) {\r
+                            e.printStackTrace();\r
+                        }\r
+                    }\r
+                });\r
             }\r
         }\r
         private class LocalMoveMethod extends DavMethodBase {\r
@@ -918,9 +952,6 @@ public class FileDetailFragment extends SherlockFragment implements
     \r
     private class RemoveRunnable implements Runnable {\r
         \r
-        /** Arbitrary timeout for deletion */\r
-        public final static int DELETION_TIMEOUT = 5000;\r
-        \r
         Account mAccount;\r
         OCFile mFileToRemove;\r
         Handler mHandler;\r
@@ -943,59 +974,65 @@ public class FileDetailFragment extends SherlockFragment implements
             DeleteMethod delete = new DeleteMethod(baseUrl + webdav_path + WebdavUtils.encodePath(mFileToRemove.getRemotePath()));\r
             \r
             boolean success = false;\r
+            int status = -1;\r
             try {\r
-                int status = wc.executeMethod(delete, DELETION_TIMEOUT);\r
-                if (delete.succeeded()) {\r
-                    FileDataStorageManager fdsm = new FileDataStorageManager(mAccount, getActivity().getContentResolver());\r
-                    fdsm.removeFile(mFileToRemove);\r
-                    mHandler.post(new Runnable() {\r
-                        @Override\r
-                        public void run() { \r
-                            try {\r
-                                Toast msg = Toast.makeText(getActivity().getApplicationContext(), R.string.remove_success_msg, Toast.LENGTH_LONG);\r
-                                msg.show();\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)); // 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
-                    success = true;\r
-                }\r
-                Log.e("ASD", ""+ delete.getQueryString());\r
-                Log.d("delete", "returned status " + status);\r
+                status = wc.executeMethod(delete);\r
+                success = (delete.succeeded());\r
+                Log.d(TAG, "Delete: returned status " + status);\r
                 \r
             } catch (HttpException e) {\r
-                e.printStackTrace();\r
+                Log.e(TAG, "HTTP Exception removing file " + mFileToRemove.getRemotePath(), e);\r
                 \r
             } catch (IOException e) {\r
-                e.printStackTrace();\r
+                Log.e(TAG, "I/O Exception removing file " + mFileToRemove.getRemotePath(), e);\r
                 \r
-            } finally {\r
-                if (!success) {\r
-                    mHandler.post(new Runnable() {\r
-                        @Override\r
-                        public void run() {\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
+            } catch (Exception e) {\r
+                Log.e(TAG, "Unexpected exception removing file " + mFileToRemove.getRemotePath(), e);\r
+            }\r
+            \r
+            if (success) {\r
+                FileDataStorageManager fdsm = new FileDataStorageManager(mAccount, getActivity().getContentResolver());\r
+                fdsm.removeFile(mFileToRemove);\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
+                });\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