Merge remote-tracking branch 'origin/oauth_login' into oauth_login
[pub/Android/ownCloud.git] / src / com / owncloud / android / ui / activity / FileDisplayActivity.java
index e6771e0..1d75e69 100644 (file)
@@ -39,6 +39,8 @@ import android.content.pm.PackageInfo;
 import android.content.pm.PackageManager.NameNotFoundException;\r
 import android.content.res.Resources.NotFoundException;\r
 import android.database.Cursor;\r
+import android.graphics.Bitmap;\r
+import android.graphics.drawable.BitmapDrawable;\r
 import android.net.Uri;\r
 import android.os.Bundle;\r
 import android.os.Handler;\r
@@ -71,12 +73,13 @@ import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
 import com.owncloud.android.files.services.FileObserverService;\r
 import com.owncloud.android.files.services.FileUploader;\r
 import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;\r
-import com.owncloud.android.network.OwnCloudClientUtils;\r
+import com.owncloud.android.operations.CreateFolderOperation;\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.operations.RenameFileOperation;\r
+import com.owncloud.android.operations.SynchronizeFileOperation;\r
 import com.owncloud.android.operations.RemoteOperationResult.ResultCode;\r
 import com.owncloud.android.syncadapter.FileSyncService;\r
 import com.owncloud.android.ui.dialog.SslValidatorDialog;\r
@@ -85,7 +88,6 @@ import com.owncloud.android.ui.fragment.FileDetailFragment;
 import com.owncloud.android.ui.fragment.OCFileListFragment;\r
 \r
 import com.owncloud.android.R;\r
-import eu.alefzero.webdav.WebdavClient;\r
 \r
 /**\r
  * Displays, what files the user has available in his ownCloud.\r
@@ -113,6 +115,7 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
     private OCFileListFragment mFileList;\r
     \r
     private boolean mDualPane;\r
+    private Handler mHandler;\r
     \r
     private static final int DIALOG_SETUP_ACCOUNT = 0;\r
     private static final int DIALOG_CREATE_DIR = 1;\r
@@ -127,11 +130,15 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
     private static final int ACTION_SELECT_MULTIPLE_FILES = 2;\r
     \r
     private static final String TAG = "FileDisplayActivity";\r
+\r
+    private static int[] mMenuIdentifiersToPatch = {R.id.about_app};\r
     \r
     @Override\r
     public void onCreate(Bundle savedInstanceState) {\r
         Log.d(getClass().toString(), "onCreate() start");\r
         super.onCreate(savedInstanceState);\r
+        \r
+        mHandler = new Handler();\r
 \r
         /// Load of parameters from received intent\r
         mCurrentDir = getIntent().getParcelableExtra(FileDetailFragment.EXTRA_FILE); // no check necessary, mCurrenDir == null if the parameter is not in the intent\r
@@ -210,7 +217,7 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
      */\r
     private void createFirstAccount() {\r
         Intent intent = new Intent(android.provider.Settings.ACTION_ADD_ACCOUNT);\r
-        intent.putExtra(android.provider.Settings.EXTRA_AUTHORITIES, new String[] { AccountAuthenticator.AUTH_TOKEN_TYPE });\r
+        intent.putExtra(android.provider.Settings.EXTRA_AUTHORITIES, new String[] { AccountAuthenticator.AUTHORITY });\r
         startActivity(intent);  // the new activity won't be created until this.onStart() and this.onResume() are finished;\r
     }\r
 \r
@@ -275,9 +282,32 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
     public boolean onCreateOptionsMenu(Menu menu) {\r
         MenuInflater inflater = getSherlock().getMenuInflater();\r
             inflater.inflate(R.menu.menu, menu);\r
+            \r
+            patchHiddenAccents(menu);\r
+            \r
             return true;\r
     }\r
 \r
+    /**\r
+     * Workaround for this: <a href="http://code.google.com/p/android/issues/detail?id=3974">http://code.google.com/p/android/issues/detail?id=3974</a> \r
+     * \r
+     * @param menu      Menu to patch\r
+     */\r
+    private void patchHiddenAccents(Menu menu) {\r
+        for (int i = 0; i < mMenuIdentifiersToPatch.length ; i++) {\r
+            MenuItem aboutItem = menu.findItem(mMenuIdentifiersToPatch[i]);\r
+            if (aboutItem != null && aboutItem.getIcon() instanceof BitmapDrawable) {\r
+                // Clip off the bottom three (density independent) pixels of transparent padding\r
+                Bitmap original = ((BitmapDrawable) aboutItem.getIcon()).getBitmap();\r
+                float scale = getResources().getDisplayMetrics().density;\r
+                int clippedHeight = (int) (original.getHeight() - (3 * scale));\r
+                Bitmap scaled = Bitmap.createBitmap(original, 0, 0, original.getWidth(), clippedHeight);\r
+                aboutItem.setIcon(new BitmapDrawable(getResources(), scaled));\r
+            }\r
+        }\r
+    }\r
+\r
+\r
     @Override\r
     public boolean onOptionsItemSelected(MenuItem item) {\r
         boolean retval = true;\r
@@ -316,12 +346,12 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
     }\r
 \r
     private void startSynchronization() {\r
-        ContentResolver.cancelSync(null, AccountAuthenticator.AUTH_TOKEN_TYPE);   // cancel the current synchronizations of any ownCloud account\r
+        ContentResolver.cancelSync(null, AccountAuthenticator.AUTHORITY);   // cancel the current synchronizations of any ownCloud account\r
         Bundle bundle = new Bundle();\r
         bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);\r
         ContentResolver.requestSync(\r
                 AccountUtils.getCurrentOwnCloudAccount(this),\r
-                AccountAuthenticator.AUTH_TOKEN_TYPE, bundle);\r
+                AccountAuthenticator.AUTHORITY, bundle);\r
     }\r
 \r
 \r
@@ -344,16 +374,16 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
      */\r
     public void onActivityResult(int requestCode, int resultCode, Intent data) {\r
         \r
-        if (requestCode == ACTION_SELECT_CONTENT_FROM_APPS && resultCode == RESULT_OK) {\r
-            requestSimpleUpload(data);\r
+        if (requestCode == ACTION_SELECT_CONTENT_FROM_APPS && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) {\r
+            requestSimpleUpload(data, resultCode);\r
             \r
-        } else if (requestCode == ACTION_SELECT_MULTIPLE_FILES && resultCode == RESULT_OK) {\r
-            requestMultipleUpload(data);\r
+        } else if (requestCode == ACTION_SELECT_MULTIPLE_FILES && (resultCode == RESULT_OK || resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)) {\r
+            requestMultipleUpload(data, resultCode);\r
             \r
         }\r
     }\r
 \r
-    private void requestMultipleUpload(Intent data) {\r
+    private void requestMultipleUpload(Intent data, int resultCode) {\r
         String[] filePaths = data.getStringArrayExtra(UploadFilesActivity.EXTRA_CHOSEN_FILES);\r
         if (filePaths != null) {\r
             String[] remotePaths = new String[filePaths.length];\r
@@ -372,6 +402,8 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
             i.putExtra(FileUploader.KEY_LOCAL_FILE, filePaths);\r
             i.putExtra(FileUploader.KEY_REMOTE_FILE, remotePaths);\r
             i.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_MULTIPLE_FILES);\r
+            if (resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)\r
+                i.putExtra(FileUploader.KEY_LOCAL_BEHAVIOUR, FileUploader.LOCAL_BEHAVIOUR_MOVE);\r
             startService(i);\r
             \r
         } else {\r
@@ -383,7 +415,7 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
     }\r
 \r
 \r
-    private void requestSimpleUpload(Intent data) {\r
+    private void requestSimpleUpload(Intent data, int resultCode) {\r
         String filepath = null;\r
         try {\r
             Uri selectedImageUri = data.getData();\r
@@ -423,6 +455,8 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
         i.putExtra(FileUploader.KEY_LOCAL_FILE, filepath);\r
         i.putExtra(FileUploader.KEY_REMOTE_FILE, remotepath);\r
         i.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_SINGLE_FILE);\r
+        if (resultCode == UploadFilesActivity.RESULT_OK_AND_MOVE)\r
+            i.putExtra(FileUploader.KEY_LOCAL_BEHAVIOUR, FileUploader.LOCAL_BEHAVIOUR_MOVE);\r
         startService(i);\r
     }\r
 \r
@@ -563,7 +597,8 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
                     dialog.dismiss();\r
                 }\r
             });\r
-            builder.setNegativeButton(R.string.common_exit, new OnClickListener() {\r
+            String message = String.format(getString(R.string.common_exit), getString(R.string.app_name));\r
+            builder.setNegativeButton(message, new OnClickListener() {\r
                 public void onClick(DialogInterface dialog, int which) {\r
                     dialog.dismiss();\r
                     finish();\r
@@ -579,7 +614,7 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
             PackageInfo pkg;\r
             try {\r
                 pkg = getPackageManager().getPackageInfo(getPackageName(), 0);\r
-                builder.setMessage(String.format(getString(R.string.about_message), pkg.versionName));\r
+                builder.setMessage(String.format(getString(R.string.about_message), getString(R.string.app_name), pkg.versionName));\r
                 builder.setIcon(android.R.drawable.ic_menu_info_details);\r
                 dialog = builder.create();\r
             } catch (NameNotFoundException e) {\r
@@ -619,8 +654,12 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
                             \r
                             // Create directory\r
                             path += directoryName + OCFile.PATH_SEPARATOR;\r
-                            Thread thread = new Thread(new DirectoryCreator(path,  AccountUtils.getCurrentOwnCloudAccount(FileDisplayActivity.this), new Handler()));\r
-                            thread.start();\r
+                            RemoteOperation operation = new CreateFolderOperation(path, mCurrentDir.getFileId(), mStorageManager);\r
+                            operation.execute(  AccountUtils.getCurrentOwnCloudAccount(FileDisplayActivity.this), \r
+                                                FileDisplayActivity.this, \r
+                                                FileDisplayActivity.this, \r
+                                                mHandler,\r
+                                                FileDisplayActivity.this);\r
                             \r
                             dialog.dismiss();\r
                             \r
@@ -655,6 +694,7 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
                     if (item == 0) {\r
                         //if (!mDualPane) { \r
                             Intent action = new Intent(FileDisplayActivity.this, UploadFilesActivity.class);\r
+                            action.putExtra(UploadFilesActivity.EXTRA_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(FileDisplayActivity.this));\r
                             startActivityForResult(action, ACTION_SELECT_MULTIPLE_FILES);\r
                         //} else {\r
                             // TODO create and handle new fragment LocalFileListFragment\r
@@ -737,56 +777,6 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
         return !mDirectories.isEmpty();\r
     }\r
 \r
-    private class DirectoryCreator implements Runnable {\r
-        private String mTargetPath;\r
-        private Account mAccount;\r
-        private Handler mHandler; \r
-    \r
-        public DirectoryCreator(String targetPath, Account account, Handler handler) {\r
-            mTargetPath = targetPath;\r
-            mAccount = account;\r
-            mHandler = handler;\r
-        }\r
-    \r
-        @Override\r
-        public void run() {\r
-            WebdavClient wdc = OwnCloudClientUtils.createOwnCloudClient(mAccount, getApplicationContext());\r
-            boolean created = wdc.createDirectory(mTargetPath);\r
-            if (created) {\r
-                mHandler.post(new Runnable() {\r
-                    @Override\r
-                    public void run() { \r
-                        dismissDialog(DIALOG_SHORT_WAIT);\r
-                        \r
-                        // Save new directory in local database\r
-                        OCFile newDir = new OCFile(mTargetPath);\r
-                        newDir.setMimetype("DIR");\r
-                        newDir.setParentId(mCurrentDir.getFileId());\r
-                        mStorageManager.saveFile(newDir);\r
-    \r
-                        // Display the new folder right away\r
-                        mFileList.listDirectory();\r
-                    }\r
-                });\r
-                \r
-            } else {\r
-                mHandler.post(new Runnable() {\r
-                    @Override\r
-                    public void run() {\r
-                        dismissDialog(DIALOG_SHORT_WAIT);\r
-                        try {\r
-                            Toast msg = Toast.makeText(FileDisplayActivity.this, R.string.create_dir_fail_msg, Toast.LENGTH_LONG); \r
-                            msg.show();\r
-                        \r
-                        } catch (NotFoundException e) {\r
-                            Log.e(TAG, "Error while trying to show fail message " , e);\r
-                        }\r
-                    }\r
-                });\r
-            }\r
-        }\r
-    \r
-    }\r
 \r
     // Custom array adapter to override text colors\r
     private class CustomArrayAdapter<T> extends ArrayAdapter<T> {\r
@@ -852,6 +842,7 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
                 }\r
                 \r
                 setSupportProgressBarIndeterminateVisibility(inProgress);\r
+                removeStickyBroadcast(intent);\r
                 \r
             }\r
             \r
@@ -1083,9 +1074,39 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
                 \r
         } else if (operation instanceof RenameFileOperation) {\r
             onRenameFileOperationFinish((RenameFileOperation)operation, result);\r
+            \r
+        } else if (operation instanceof SynchronizeFileOperation) {\r
+            onSynchronizeFileOperationFinish((SynchronizeFileOperation)operation, result);\r
+            \r
+        } else if (operation instanceof CreateFolderOperation) {\r
+            onCreateFolderOperationFinish((CreateFolderOperation)operation, result);\r
         }\r
     }\r
-    \r
+\r
+    /**\r
+     * Updates the view associated to the activity after the finish of an operation trying create a new folder\r
+     * \r
+     * @param operation     Creation operation performed.\r
+     * @param result        Result of the creation.\r
+     */\r
+    private void onCreateFolderOperationFinish(CreateFolderOperation operation, RemoteOperationResult result) {\r
+        if (result.isSuccess()) {\r
+            dismissDialog(DIALOG_SHORT_WAIT);\r
+            mFileList.listDirectory();\r
+            \r
+        } else {\r
+            dismissDialog(DIALOG_SHORT_WAIT);\r
+            try {\r
+                Toast msg = Toast.makeText(FileDisplayActivity.this, R.string.create_dir_fail_msg, Toast.LENGTH_LONG); \r
+                msg.show();\r
+                    \r
+            } catch (NotFoundException e) {\r
+                Log.e(TAG, "Error while trying to show fail message " , e);\r
+            }\r
+        }\r
+    }\r
+\r
+\r
     /**\r
      * Updates the view associated to the activity after the finish of an operation trying to remove a \r
      * file. \r
@@ -1159,6 +1180,34 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
     }\r
 \r
 \r
+    private void onSynchronizeFileOperationFinish(SynchronizeFileOperation operation, RemoteOperationResult result) {\r
+        dismissDialog(DIALOG_SHORT_WAIT);\r
+        OCFile syncedFile = operation.getLocalFile();\r
+        if (!result.isSuccess()) {\r
+            if (result.getCode() == ResultCode.SYNC_CONFLICT) {\r
+                Intent i = new Intent(this, ConflictsResolveActivity.class);\r
+                i.putExtra(ConflictsResolveActivity.EXTRA_FILE, syncedFile);\r
+                i.putExtra(ConflictsResolveActivity.EXTRA_ACCOUNT, AccountUtils.getCurrentOwnCloudAccount(this));\r
+                startActivity(i);\r
+                \r
+            } else {\r
+                Toast msg = Toast.makeText(this, R.string.sync_file_fail_msg, Toast.LENGTH_LONG); \r
+                msg.show();\r
+            }\r
+            \r
+        } else {\r
+            if (operation.transferWasRequested()) {\r
+                mFileList.listDirectory();\r
+                onTransferStateChanged(syncedFile, true, true);\r
+                \r
+            } else {\r
+                Toast msg = Toast.makeText(this, R.string.sync_file_nothing_to_do_msg, Toast.LENGTH_LONG); \r
+                msg.show();\r
+            }\r
+        }\r
+    }\r
+\r
+\r
     /**\r
      * {@inheritDoc}\r
      */\r