messy rename file
[pub/Android/ownCloud.git] / src / eu / alefzero / owncloud / ui / fragment / FileDetailFragment.java
index cd26b2a..7ac2e98 100644 (file)
@@ -34,6 +34,8 @@ import org.apache.http.NameValuePair;
 import org.apache.http.client.utils.URLEncodedUtils;\r
 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.MoveMethod;\r
 import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;\r
 import org.json.JSONException;\r
 import org.json.JSONObject;\r
@@ -43,6 +45,8 @@ import android.accounts.AccountManager;
 import android.content.ActivityNotFoundException;\r
 import android.content.BroadcastReceiver;\r
 import android.content.Context;\r
+import android.content.DialogInterface;\r
+import android.content.DialogInterface.OnDismissListener;\r
 import android.content.Intent;\r
 import android.content.IntentFilter;\r
 import android.graphics.Bitmap;\r
@@ -63,10 +67,12 @@ import android.view.ViewGroup;
 import android.webkit.MimeTypeMap;\r
 import android.widget.Button;\r
 import android.widget.CheckBox;\r
+import android.widget.EditText;\r
 import android.widget.ImageView;\r
 import android.widget.TextView;\r
 import android.widget.Toast;\r
 \r
+import com.actionbarsherlock.app.SherlockDialogFragment;\r
 import com.actionbarsherlock.app.SherlockFragment;\r
 \r
 import eu.alefzero.owncloud.AccountUtils;\r
@@ -183,26 +189,43 @@ public class FileDetailFragment extends SherlockFragment implements
         return super.getView() == null ? mView : super.getView();\r
     }\r
 \r
+    \r
+    \r
     @Override\r
     public void onClick(View v) {\r
-        if (v.getId() == R.id.fdDownloadBtn) {\r
-            //Toast.makeText(getActivity(), "Downloading", Toast.LENGTH_LONG).show();\r
-            Intent i = new Intent(getActivity(), FileDownloader.class);\r
-            i.putExtra(FileDownloader.EXTRA_ACCOUNT, mAccount);\r
-            i.putExtra(FileDownloader.EXTRA_REMOTE_PATH, mFile.getRemotePath());\r
-            i.putExtra(FileDownloader.EXTRA_FILE_PATH, mFile.getURLDecodedRemotePath());\r
-            i.putExtra(FileDownloader.EXTRA_FILE_SIZE, mFile.getFileLength());\r
-            v.setEnabled(false);\r
-            getActivity().startService(i);\r
-        } else if (v.getId() == R.id.fdKeepInSync) {\r
-            CheckBox cb = (CheckBox) getView().findViewById(R.id.fdKeepInSync);\r
-            mFile.setKeepInSync(cb.isChecked());\r
-            FileDataStorageManager fdsm = new FileDataStorageManager(mAccount, getActivity().getApplicationContext().getContentResolver());\r
-            fdsm.saveFile(mFile);\r
-            if (mFile.keepInSync() && !mFile.isDownloaded()) {\r
-                onClick(getView().findViewById(R.id.fdDownloadBtn));\r
+        switch (v.getId()) {\r
+            case R.id.fdDownloadBtn: {\r
+                //Toast.makeText(getActivity(), "Downloading", Toast.LENGTH_LONG).show();\r
+                Intent i = new Intent(getActivity(), FileDownloader.class);\r
+                i.putExtra(FileDownloader.EXTRA_ACCOUNT, mAccount);\r
+                i.putExtra(FileDownloader.EXTRA_REMOTE_PATH, mFile.getRemotePath());\r
+                i.putExtra(FileDownloader.EXTRA_FILE_PATH, mFile.getURLDecodedRemotePath());\r
+                i.putExtra(FileDownloader.EXTRA_FILE_SIZE, mFile.getFileLength());\r
+                v.setEnabled(false);\r
+                getActivity().startService(i);\r
+                break;\r
+            }\r
+            case R.id.fdKeepInSync: {\r
+                CheckBox cb = (CheckBox) getView().findViewById(R.id.fdKeepInSync);\r
+                mFile.setKeepInSync(cb.isChecked());\r
+                FileDataStorageManager fdsm = new FileDataStorageManager(mAccount, getActivity().getApplicationContext().getContentResolver());\r
+                fdsm.saveFile(mFile);\r
+                if (mFile.keepInSync() && !mFile.isDownloaded()) {\r
+                    onClick(getView().findViewById(R.id.fdDownloadBtn));\r
+                }\r
+                break;\r
             }\r
-        }/* else if (v.getId() == R.id.fdShareBtn) {\r
+            case R.id.fdRenameBtn: {\r
+                EditNameFragment dialog = EditNameFragment.newInstance(mFile.getFileName());\r
+                dialog.show(getFragmentManager(), "nameeditdialog");\r
+                dialog.setOnDismissListener(this);\r
+                break;\r
+            }\r
+            default:\r
+                Log.e(TAG, "Incorrect view clicked!");\r
+        }\r
+        \r
+        /* else if (v.getId() == R.id.fdShareBtn) {\r
             Thread t = new Thread(new ShareRunnable(mFile.getRemotePath()));\r
             t.start();\r
         }*/\r
@@ -262,6 +285,7 @@ public class FileDetailFragment extends SherlockFragment implements
             cb.setChecked(mFile.keepInSync());\r
             cb.setOnClickListener(this);\r
             //getView().findViewById(R.id.fdShareBtn).setOnClickListener(this);\r
+            getView().findViewById(R.id.fdRenameBtn).setOnClickListener(this);\r
             \r
             if (mFile.getStoragePath() != null) {\r
                 // Update preview\r
@@ -590,4 +614,149 @@ public class FileDetailFragment extends SherlockFragment implements
         }\r
     }\r
     \r
+    public void onDismiss(EditNameFragment dialog) {\r
+        Log.e("ASD","ondismiss");\r
+        if (dialog instanceof EditNameFragment) {\r
+            if (((EditNameFragment)dialog).getResult()) {\r
+                String newFilename = ((EditNameFragment)dialog).getNewFilename();\r
+                Log.d(TAG, "name edit dialog dismissed with new name " + newFilename);\r
+                if (!newFilename.equals(mFile.getFileName())) {\r
+                    FileDataStorageManager fdsm = new FileDataStorageManager(mAccount, getActivity().getContentResolver());\r
+                    if (fdsm.getFileById(mFile.getFileId()) != null) {\r
+                        OCFile newFile = new OCFile(fdsm.getFileById(mFile.getParentId()).getRemotePath()+"/"+newFilename);\r
+                        newFile.setCreationTimestamp(mFile.getCreationTimestamp());\r
+                        newFile.setFileId(mFile.getFileId());\r
+                        newFile.setFileLength(mFile.getFileLength());\r
+                        newFile.setKeepInSync(mFile.keepInSync());\r
+                        newFile.setLastSyncDate(mFile.getLastSyncDate());\r
+                        newFile.setMimetype(mFile.getMimetype());\r
+                        newFile.setModificationTimestamp(mFile.getModificationTimestamp());\r
+                        newFile.setParentId(mFile.getParentId());\r
+                        newFile.setStoragePath(mFile.getStoragePath());\r
+                        fdsm.removeFile(mFile);\r
+                        fdsm.saveFile(newFile);\r
+                        new Thread(new RenameRunnable(mFile, newFile, mAccount)).start();\r
+                        mFile = newFile;\r
+                        updateFileDetails(mFile, mAccount);\r
+                    }\r
+                }\r
+            }\r
+        } else {\r
+            Log.e(TAG, "Unknown dialog intance passed to onDismissDalog: " + dialog.getClass().getCanonicalName());\r
+        }\r
+        \r
+    }\r
+    \r
+    private class RenameRunnable implements Runnable {\r
+        \r
+        Account mAccount;\r
+        OCFile mOld, mNew;\r
+        \r
+        public RenameRunnable(OCFile oldFile, OCFile newFile, Account account) {\r
+            mOld = oldFile;\r
+            mNew = newFile;\r
+            mAccount = account;\r
+        }\r
+        \r
+        public void run() {\r
+            WebdavClient wc = new WebdavClient(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 + mOld.getRemotePath());\r
+\r
+            \r
+            Log.e("ASD", Uri.parse(baseUrl).getPath() == null ? "" : Uri.parse(baseUrl).getPath() + webdav_path + mNew.getRemotePath());\r
+            LocalMoveMethod move = new LocalMoveMethod(baseUrl + webdav_path + mOld.getRemotePath(),\r
+                                             Uri.parse(baseUrl).getPath() == null ? "" : Uri.parse(baseUrl).getPath() + webdav_path + mNew.getRemotePath());\r
+            \r
+            try {\r
+                int status = wc.executeMethod(move);\r
+                Log.e("ASD", ""+move.getQueryString());\r
+                Log.d("move", "returned status " + status);\r
+            } catch (HttpException e) {\r
+                // TODO Auto-generated catch block\r
+                e.printStackTrace();\r
+            } catch (IOException e) {\r
+                // TODO Auto-generated catch block\r
+                e.printStackTrace();\r
+            }\r
+        }\r
+        private class LocalMoveMethod extends DavMethodBase {\r
+\r
+            public LocalMoveMethod(String uri, String dest) {\r
+                super(uri);\r
+                addRequestHeader(new org.apache.commons.httpclient.Header("Destination", dest));\r
+            }\r
+\r
+            @Override\r
+            public String getName() {\r
+                return "MOVE";\r
+            }\r
+\r
+            @Override\r
+            protected boolean isSuccess(int status) {\r
+                return status == 201 || status == 204;\r
+            }\r
+            \r
+        }\r
+    }\r
+    \r
+    private static class EditNameFragment extends SherlockDialogFragment implements OnClickListener {\r
+\r
+        private String mNewFilename;\r
+        private boolean mResult;\r
+        private FileDetailFragment mListener;\r
+        \r
+        static public EditNameFragment newInstance(String filename) {\r
+            EditNameFragment f = new EditNameFragment();\r
+            Bundle args = new Bundle();\r
+            args.putString("filename", filename);\r
+            f.setArguments(args);\r
+            return f;\r
+        }\r
+        \r
+        @Override\r
+        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\r
+            View v = inflater.inflate(R.layout.edit_box_dialog, container, false);\r
+\r
+            String currentName = getArguments().getString("filename", "");\r
+            \r
+            ((Button)v.findViewById(R.id.cancel)).setOnClickListener(this);\r
+            ((Button)v.findViewById(R.id.ok)).setOnClickListener(this);\r
+            ((TextView)v.findViewById(R.id.user_input)).setText(currentName);\r
+\r
+            mResult = false;\r
+            return v;\r
+        }\r
+        \r
+        @Override\r
+        public void onClick(View view) {\r
+            switch (view.getId()) {\r
+                case R.id.ok: {\r
+                    mNewFilename = ((TextView)getView().findViewById(R.id.user_input)).getText().toString();\r
+                    mResult = true;\r
+                }\r
+                case R.id.cancel: { // fallthought\r
+                    dismiss();\r
+                    mListener.onDismiss(this);\r
+                }\r
+            }\r
+        }\r
+        \r
+        void setOnDismissListener(FileDetailFragment listener) {\r
+            mListener = listener;\r
+        }\r
+        \r
+        public String getNewFilename() {\r
+            return mNewFilename;\r
+        }\r
+        \r
+        // true if user click ok\r
+        public boolean getResult() {\r
+            return mResult;\r
+        }\r
+        \r
+    }\r
 }\r