Copy file to upload for all kind of files, not only for images.
[pub/Android/ownCloud.git] / src / com / owncloud / android / ui / activity / Uploader.java
index 55e7b62..7d2b923 100644 (file)
 package com.owncloud.android.ui.activity;
 
 import java.io.File;
+import java.io.FileDescriptor;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Stack;
 import java.util.Vector;
+import java.util.concurrent.ExecutionException;
 
 import android.accounts.Account;
 import android.accounts.AccountManager;
@@ -45,8 +52,10 @@ import android.content.res.Resources.NotFoundException;
 import android.database.Cursor;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.ParcelFileDescriptor;
 import android.os.Parcelable;
 import android.preference.PreferenceManager;
+import android.provider.MediaStore;
 import android.provider.MediaStore.Audio;
 import android.provider.MediaStore.Images;
 import android.provider.MediaStore.Video;
@@ -71,25 +80,27 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.operations.CreateFolderOperation;
 import com.owncloud.android.ui.dialog.CreateFolderDialogFragment;
+import com.owncloud.android.utils.CopyTmpFileAsyncTask;
 import com.owncloud.android.utils.DisplayUtils;
 import com.owncloud.android.utils.ErrorMessageAdapter;
+import com.owncloud.android.utils.FileStorageUtils;
+import com.owncloud.android.utils.UriUtils;
 
 
 /**
  * This can be used to upload things to an ownCloud instance.
  */
 public class Uploader extends FileActivity
-        implements OnItemClickListener, android.view.View.OnClickListener {
+        implements OnItemClickListener, android.view.View.OnClickListener,
+        CopyTmpFileAsyncTask.OnCopyTmpFileTaskListener {
 
     private static final String TAG = Uploader.class.getSimpleName();
 
-    //private Account mAccount;
     private AccountManager mAccountManager;
     private Stack<String> mParents;
     private ArrayList<Parcelable> mStreamsToUpload;
     private boolean mCreateDir;
     private String mUploadPath;
-    //private FileDataStorageManager mStorageManager;
     private OCFile mFile;
     private boolean mAccountSelected;
     
@@ -101,7 +112,6 @@ public class Uploader extends FileActivity
     private final static int REQUEST_CODE_SETUP_ACCOUNT = 0;
 
     private final static String KEY_PARENTS = "PARENTS";
-    private final static String KEY_ACCOUNT = "ACCOUNT";
     private final static String KEY_FILE = "FILE";
     private final static String KEY_ACCOUNT_SELECTED = "ACCOUNT_SELECTED";
 
@@ -114,9 +124,7 @@ public class Uploader extends FileActivity
             mAccountSelected = false;
         } else {
             mParents = (Stack<String>) savedInstanceState.getSerializable(KEY_PARENTS);
-//            mAccount = savedInstanceState.getParcelable(KEY_ACCOUNT);
             mFile = savedInstanceState.getParcelable(KEY_FILE);
-//            mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
             mAccountSelected = savedInstanceState.getBoolean(KEY_ACCOUNT_SELECTED);
         }
         super.onCreate(savedInstanceState);
@@ -124,30 +132,6 @@ public class Uploader extends FileActivity
         ActionBar actionBar = getSupportActionBar();
         actionBar.setIcon(DisplayUtils.getSeasonalIconId());
 
-
-//        if (somethingToUpload()) {
-//            mAccountManager = (AccountManager) getSystemService(Context.ACCOUNT_SERVICE);
-//            Account[] accounts = mAccountManager.getAccountsByType(MainApp.getAccountType());
-//            if (accounts.length == 0) {
-//                Log_OC.i(TAG, "No ownCloud account is available");
-//                showDialog(DIALOG_NO_ACCOUNT);
-//            } else if (accounts.length > 1 && !mAccountSelected) {
-//                Log_OC.i(TAG, "More than one ownCloud is available");
-//                showDialog(DIALOG_MULTIPLE_ACCOUNT);
-//            } else {
-//                if (savedInstanceState == null) {
-//                    mAccount = accounts[0];
-//                    mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
-//                }
-//                initTargetFolder();
-//                populateDirectoryList();
-//
-//            }
-//
-//        } else {
-//            showDialog(DIALOG_NO_STREAM);
-//        }
-
     }
 
     @Override
@@ -163,14 +147,8 @@ public class Uploader extends FileActivity
                 showDialog(DIALOG_MULTIPLE_ACCOUNT);
             } else {
                 if (!savedAccount) {
-                    //mAccount = accounts[0];
-                    //mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
                     setAccount(accounts[0]);
                 }
-                // Part in onAccountSet
-//                initTargetFolder();
-//                populateDirectoryList();
-
             }
 
         } else {
@@ -178,18 +156,6 @@ public class Uploader extends FileActivity
         }
 
         super.setAccount(account, savedAccount);
-
-//        Account oldAccount = mAccount;
-//        boolean validAccount = (account != null &&
-//                AccountUtils.setCurrentOwnCloudAccount(getApplicationContext(), account.name));
-//        if (validAccount) {
-//            mAccount = account;
-//            mAccountWasSet = true;
-//            mAccountWasRestored = (savedAccount || mAccount.equals(oldAccount));
-//
-//        } else {
-//            swapToDefaultAccount();
-//        }
     }
 
     @Override
@@ -197,12 +163,6 @@ public class Uploader extends FileActivity
         super.onAccountSet(mAccountWasRestored);
         initTargetFolder();
         populateDirectoryList();
-//        if (getAccount() != null) {
-//            mStorageManager = new FileDataStorageManager(getAccount(), getContentResolver());
-//
-//        } else {
-//            Log_OC.wtf(TAG, "onAccountChanged was called with NULL account associated!");
-//        }
     }
 
     @Override
@@ -276,9 +236,6 @@ public class Uploader extends FileActivity
                 public void onClick(DialogInterface dialog, int which) {
                     setAccount(mAccountManager.getAccountsByType(MainApp.getAccountType())[which]);
                     onAccountSet(mAccountWasRestored);
-//                    mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
-//                    initTargetFolder();
-//                    populateDirectoryList();
                     dialog.dismiss();
                     mAccountSelected = true;
                 }
@@ -484,69 +441,76 @@ public class Uploader extends FileActivity
             for (Parcelable mStream : mStreamsToUpload) {
                 
                 Uri uri = (Uri) mStream;
-                if (uri !=null) {
+                String data = null;
+                String filePath = "";
+
+                if (uri != null) {
                     if (uri.getScheme().equals("content")) {
-                        
-                       String mimeType = getContentResolver().getType(uri);
-                       
-                       if (mimeType.contains("image")) {
-                           String[] CONTENT_PROJECTION = { Images.Media.DATA,
-                                   Images.Media.DISPLAY_NAME, Images.Media.MIME_TYPE,
-                                   Images.Media.SIZE};
-                           Cursor c = getContentResolver().query(uri, CONTENT_PROJECTION, null,
-                                   null, null);
-                           c.moveToFirst();
-                           int index = c.getColumnIndex(Images.Media.DATA);
-                           String data = c.getString(index);
-                           local.add(data);
-                           remote.add(mUploadPath +
-                                   c.getString(c.getColumnIndex(Images.Media.DISPLAY_NAME)));
-                       
-                       }
-                       else if (mimeType.contains("video")) {
-                           String[] CONTENT_PROJECTION = { Video.Media.DATA,
+                        String mimeType = getContentResolver().getType(uri);
+
+                        if (mimeType.contains("image")) {
+                            String[] CONTENT_PROJECTION = { Images.Media.DATA,
+                                    Images.Media.DISPLAY_NAME, Images.Media.MIME_TYPE,
+                                    Images.Media.SIZE };
+                            Cursor c = getContentResolver().query(uri, CONTENT_PROJECTION, null,
+                                    null, null);
+                            c.moveToFirst();
+                            int index = c.getColumnIndex(Images.Media.DATA);
+                            data = c.getString(index);
+                            filePath = mUploadPath +
+                                    c.getString(c.getColumnIndex(Images.Media.DISPLAY_NAME));
+
+                        } else if (mimeType.contains("video")) {
+                            String[] CONTENT_PROJECTION = { Video.Media.DATA,
                                    Video.Media.DISPLAY_NAME, Video.Media.MIME_TYPE,
                                    Video.Media.SIZE, Video.Media.DATE_MODIFIED };
-                           Cursor c = getContentResolver().query(uri, CONTENT_PROJECTION, null,
+                            Cursor c = getContentResolver().query(uri, CONTENT_PROJECTION, null,
                                    null, null);
-                           c.moveToFirst();
-                           int index = c.getColumnIndex(Video.Media.DATA);
-                           String data = c.getString(index);
-                           local.add(data);
-                           remote.add(mUploadPath +
-                                   c.getString(c.getColumnIndex(Video.Media.DISPLAY_NAME)));
+                            c.moveToFirst();
+                            int index = c.getColumnIndex(Video.Media.DATA);
+                            data = c.getString(index);
+                            filePath = mUploadPath +
+                                   c.getString(c.getColumnIndex(Video.Media.DISPLAY_NAME));
                           
-                       }
-                       else if (mimeType.contains("audio")) {
-                           String[] CONTENT_PROJECTION = { Audio.Media.DATA,
+                        } else if (mimeType.contains("audio")) {
+                            String[] CONTENT_PROJECTION = { Audio.Media.DATA,
                                    Audio.Media.DISPLAY_NAME, Audio.Media.MIME_TYPE,
                                    Audio.Media.SIZE };
-                           Cursor c = getContentResolver().query(uri, CONTENT_PROJECTION, null,
+                            Cursor c = getContentResolver().query(uri, CONTENT_PROJECTION, null,
                                    null, null);
-                           c.moveToFirst();
-                           int index = c.getColumnIndex(Audio.Media.DATA);
-                           String data = c.getString(index);
-                           local.add(data);
-                           remote.add(mUploadPath +
-                                   c.getString(c.getColumnIndex(Audio.Media.DISPLAY_NAME)));
-                        
-                       }
-                       else {
-                           String filePath = Uri.decode(uri.toString()).replace(uri.getScheme() +
-                                   "://", "");
-                           // cut everything whats before mnt. It occurred to me that sometimes
-                           // apps send their name into the URI
-                           if (filePath.contains("mnt")) {
-                              String splitedFilePath[] = filePath.split("/mnt");
-                              filePath = splitedFilePath[1];
-                           }
-                           final File file = new File(filePath);
-                           local.add(file.getAbsolutePath());
-                           remote.add(mUploadPath + file.getName());
-                       }
+                            c.moveToFirst();
+                            int index = c.getColumnIndex(Audio.Media.DATA);
+                            data = c.getString(index);
+                            filePath = mUploadPath +
+                                   c.getString(c.getColumnIndex(Audio.Media.DISPLAY_NAME));
+
+                        } else  {
+                            Cursor cursor = getContentResolver().query(uri,
+                                   new String[]{MediaStore.MediaColumns.DISPLAY_NAME},
+                                   null, null, null);
+                            cursor.moveToFirst();
+                            int nameIndex = cursor.getColumnIndex(cursor.getColumnNames()[0]);
+                            if (nameIndex >= 0) {
+                               filePath = mUploadPath + cursor.getString(nameIndex);
+                            }
+                        }
+                        if (data == null) {
+                            CopyTmpFileAsyncTask copyTask = new CopyTmpFileAsyncTask(this);
+                            Object[] params = { uri, filePath };
+                            try {
+                                data = copyTask.execute(params).get();
+                            } catch (ExecutionException e) {
+                                Log_OC.e(TAG, "ExecutionException " + e);
+                            } catch (InterruptedException e) {
+                                Log_OC.e(TAG, "InterruptedException " + e);
+                            }
+                        }
+
+                        local.add(data);
+                        remote.add(filePath);
                         
                     } else if (uri.getScheme().equals("file")) {
-                        String filePath = Uri.decode(uri.toString()).replace(uri.getScheme() +
+                        filePath = Uri.decode(uri.toString()).replace(uri.getScheme() +
                                 "://", "");
                         if (filePath.contains("mnt")) {
                            String splitedFilePath[] = filePath.split("/mnt");
@@ -563,22 +527,22 @@ public class Uploader extends FileActivity
                 else {
                     throw new SecurityException();
                 }
-           
-            Intent intent = new Intent(getApplicationContext(), FileUploader.class);
-            intent.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_MULTIPLE_FILES);
-            intent.putExtra(FileUploader.KEY_LOCAL_FILE, local.toArray(new String[local.size()]));
-            intent.putExtra(FileUploader.KEY_REMOTE_FILE,
-                    remote.toArray(new String[remote.size()]));
-            intent.putExtra(FileUploader.KEY_ACCOUNT, getAccount());
-            startService(intent);
-
-            //Save the path to shared preferences
-            SharedPreferences.Editor appPrefs = PreferenceManager
-                    .getDefaultSharedPreferences(getApplicationContext()).edit();
-            appPrefs.putString("last_upload_path", mUploadPath);
-            appPrefs.apply();
-
-            finish();
+
+                Intent intent = new Intent(getApplicationContext(), FileUploader.class);
+                intent.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_MULTIPLE_FILES);
+                intent.putExtra(FileUploader.KEY_LOCAL_FILE, local.toArray(new String[local.size()]));
+                intent.putExtra(FileUploader.KEY_REMOTE_FILE,
+                        remote.toArray(new String[remote.size()]));
+                intent.putExtra(FileUploader.KEY_ACCOUNT, getAccount());
+                startService(intent);
+
+                //Save the path to shared preferences
+                SharedPreferences.Editor appPrefs = PreferenceManager
+                        .getDefaultSharedPreferences(getApplicationContext()).edit();
+                appPrefs.putString("last_upload_path", mUploadPath);
+                appPrefs.apply();
+
+                finish();
             }
             
         } catch (SecurityException e) {
@@ -644,16 +608,15 @@ public class Uploader extends FileActivity
         // "/" equals root-directory
         if(last_path.equals("/")) {
             mParents.add("");
-        }
-        else{
+        } else{
             String[] dir_names = last_path.split("/");
             for (String dir : dir_names)
                 mParents.add(dir);
         }
         //Make sure that path still exists, if it doesn't pop the stack and try the previous path
-            while(!getStorageManager().fileExists(generatePath(mParents)) && mParents.size() > 1){
-                mParents.pop();
-            }
+        while(!getStorageManager().fileExists(generatePath(mParents)) && mParents.size() > 1){
+            mParents.pop();
+        }
     }
 
     
@@ -661,17 +624,26 @@ public class Uploader extends FileActivity
     public boolean onOptionsItemSelected(MenuItem item) {
         boolean retval = true;
         switch (item.getItemId()) {
-        case android.R.id.home: {
-            if((mParents.size() > 1)) {                
-                onBackPressed(); 
-            }
-            break;
-        }
-        default:
-            retval = super.onOptionsItemSelected(item);
+            case android.R.id.home:
+                if((mParents.size() > 1)) {
+                    onBackPressed();
+                }
+                break;
+
+            default:
+                retval = super.onOptionsItemSelected(item);
         }
         return retval;
     }
 
-    
+
+    /**
+     * Process the result of CopyTmpFileAsyncTask
+     * @param result
+     */
+    @Override
+    public void OnCopyTmpFileTaskListener(String result) {
+
+    }
+
 }