Merge branch 'develop' into fixForCrashedSharedContents
authorDavid A. Velasco <dvelasco@solidgear.es>
Fri, 3 May 2013 12:25:02 +0000 (14:25 +0200)
committerDavid A. Velasco <dvelasco@solidgear.es>
Fri, 3 May 2013 12:25:02 +0000 (14:25 +0200)
Conflicts:
src/com/owncloud/android/Uploader.java

1  2 
src/com/owncloud/android/Uploader.java

@@@ -3,9 -3,8 +3,8 @@@
   *   Copyright (C) 2012-2013 ownCloud Inc.
   *
   *   This program is free software: you can redistribute it and/or modify
-  *   it under the terms of the GNU General Public License as published by
-  *   the Free Software Foundation, either version 2 of the License, or
-  *   (at your option) any later version.
+  *   it under the terms of the GNU General Public License version 2,
+  *   as published by the Free Software Foundation.
   *
   *   This program is distributed in the hope that it will be useful,
   *   but WITHOUT ANY WARRANTY; without even the implied warranty of
@@@ -16,6 -15,7 +15,7 @@@
   *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
   *
   */
  package com.owncloud.android;
  
  import java.io.File;
@@@ -26,6 -26,12 +26,6 @@@ import java.util.List
  import java.util.Stack;
  import java.util.Vector;
  
 -import com.owncloud.android.authentication.AccountAuthenticator;
 -import com.owncloud.android.datamodel.DataStorageManager;
 -import com.owncloud.android.datamodel.FileDataStorageManager;
 -import com.owncloud.android.datamodel.OCFile;
 -import com.owncloud.android.files.services.FileUploader;
 -
  import android.accounts.Account;
  import android.accounts.AccountManager;
  import android.app.AlertDialog;
@@@ -42,10 -48,7 +42,9 @@@ import android.database.Cursor
  import android.net.Uri;
  import android.os.Bundle;
  import android.os.Parcelable;
 -import android.provider.MediaStore.Images.Media;
 +import android.provider.MediaStore.Audio;
 +import android.provider.MediaStore.Images;
 +import android.provider.MediaStore.Video;
- import android.util.Log;
  import android.view.View;
  import android.view.Window;
  import android.widget.AdapterView;
@@@ -55,14 -58,7 +54,13 @@@ import android.widget.EditText
  import android.widget.SimpleAdapter;
  import android.widget.Toast;
  
- import com.owncloud.android.authenticator.AccountAuthenticator;
++import com.owncloud.android.authentication.AccountAuthenticator;
 +import com.owncloud.android.datamodel.DataStorageManager;
 +import com.owncloud.android.datamodel.FileDataStorageManager;
 +import com.owncloud.android.datamodel.OCFile;
 +import com.owncloud.android.files.services.FileUploader;
- import com.owncloud.android.network.OwnCloudClientUtils;
 +
- import eu.alefzero.webdav.WebdavClient;
+ import com.owncloud.android.R;
  
  /**
   * This can be used to upload things to an ownCloud instance.
@@@ -79,6 -75,7 +77,6 @@@ public class Uploader extends ListActiv
      private ArrayList<Parcelable> mStreamsToUpload;
      private boolean mCreateDir;
      private String mUploadPath;
 -    private static final String[] CONTENT_PROJECTION = { Media.DATA, Media.DISPLAY_NAME, Media.MIME_TYPE, Media.SIZE };
      private DataStorageManager mStorageManager;
      private OCFile mFile;
  
@@@ -86,7 -83,7 +84,6 @@@
      private final static int DIALOG_WAITING = 1;
      private final static int DIALOG_NO_STREAM = 2;
      private final static int DIALOG_MULTIPLE_ACCOUNT = 3;
--    //private final static int DIALOG_GET_DIRNAME = 4;
  
      private final static int REQUEST_CODE_SETUP_ACCOUNT = 0;
  
          getWindow().requestFeature(Window.FEATURE_NO_TITLE);
          mParents = new Stack<String>();
          mParents.add("");
--        /*if (getIntent().hasExtra(Intent.EXTRA_STREAM)) {
--            prepareStreamsToUpload();*/
          if (prepareStreamsToUpload()) {
              mAccountManager = (AccountManager) getSystemService(Context.ACCOUNT_SERVICE);
              Account[] accounts = mAccountManager.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE);
              if (accounts.length == 0) {
-                 Log.i(TAG, "No ownCloud account is available");
+                 Log_OC.i(TAG, "No ownCloud account is available");
                  showDialog(DIALOG_NO_ACCOUNT);
              } else if (accounts.length > 1) {
-                 Log.i(TAG, "More then one ownCloud is available");
+                 Log_OC.i(TAG, "More then one ownCloud is available");
                  showDialog(DIALOG_MULTIPLE_ACCOUNT);
              } else {
                  mAccount = accounts[0];
                          // in API7 < this constatant is defined in
                          // Settings.ADD_ACCOUNT_SETTINGS
                          // and Settings.EXTRA_AUTHORITIES
-                         Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS");
-                         intent.putExtra("authorities", new String[] { AccountAuthenticator.AUTH_TOKEN_TYPE });
+                         Intent intent = new Intent(android.provider.Settings.ACTION_ADD_ACCOUNT);
+                         intent.putExtra("authorities", new String[] { AccountAuthenticator.AUTHORITY });
                          startActivityForResult(intent, REQUEST_CODE_SETUP_ACCOUNT);
                      } else {
                          // since in API7 there is no direct call for
                  }
              });
              return builder.create();
 -        /*case DIALOG_GET_DIRNAME:
 -            final EditText dirName = new EditText(getBaseContext());
 -            builder.setView(dirName);
 -            builder.setTitle(R.string.uploader_info_dirname);
 -            String pathToUpload;
 -            if (mParents.empty()) {
 -                pathToUpload = "/";
 -            } else {
 -                mCursor = managedQuery(Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, mParents.peek()), null,
 -                        null, null, null);
 -                mCursor.moveToFirst();
 -                pathToUpload = mCursor.getString(mCursor.getColumnIndex(ProviderTableMeta.FILE_PATH))
 -                        + mCursor.getString(mCursor.getColumnIndex(ProviderTableMeta.FILE_NAME)).replace(" ", "%20");   // TODO don't make this ; use WebdavUtils.encode in the right moment
 -            }
 -            a a = new a(pathToUpload, dirName);
 -            builder.setPositiveButton(R.string.common_ok, a);
 -            builder.setNegativeButton(R.string.common_cancel, new OnClickListener() {
 -                public void onClick(DialogInterface dialog, int which) {
 -                    dialog.cancel();
 -                }
 -            });
 -            return builder.create();*/
          case DIALOG_MULTIPLE_ACCOUNT:
              CharSequence ac[] = new CharSequence[mAccountManager.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE).length];
              for (int i = 0; i < ac.length; ++i) {
      @Override
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
          // click on folder in the list
-         Log.d(TAG, "on item click");
+         Log_OC.d(TAG, "on item click");
          Vector<OCFile> tmpfiles = mStorageManager.getDirectoryContent(mFile);
          if (tmpfiles.size() <= 0) return;
          // filter on dirtype
              mUploadPath = "";   // first element in mParents is root dir, represented by ""; init mUploadPath with "/" results in a "//" prefix
              for (String p : mParents)
                  mUploadPath += p + OCFile.PATH_SEPARATOR;
-             Log.d(TAG, "Uploading file to dir " + mUploadPath);
+             Log_OC.d(TAG, "Uploading file to dir " + mUploadPath);
  
              uploadFiles();
  
              break;
 -        /*case android.R.id.button1: // dynamic action for create aditional dir
 -            showDialog(DIALOG_GET_DIRNAME);
 -            break;*/
          default:
              throw new IllegalArgumentException("Wrong element clicked");
          }
      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          super.onActivityResult(requestCode, resultCode, data);
-         Log.i(TAG, "result received. req: " + requestCode + " res: " + resultCode);
+         Log_OC.i(TAG, "result received. req: " + requestCode + " res: " + resultCode);
          if (requestCode == REQUEST_CODE_SETUP_ACCOUNT) {
              dismissDialog(DIALOG_NO_ACCOUNT);
              if (resultCode == RESULT_CANCELED) {
          for (String a : mParents)
              full_path += a + "/";
          
-         Log.d(TAG, "Populating view with content of : " + full_path);
+         Log_OC.d(TAG, "Populating view with content of : " + full_path);
          
          mFile = mStorageManager.getFileByPath(full_path);
          if (mFile != null) {
  
      public void uploadFiles() {
          try {
-             WebdavClient webdav = OwnCloudClientUtils.createOwnCloudClient(mAccount, getApplicationContext());
++            //WebdavClient webdav = OwnCloudClientUtils.createOwnCloudClient(mAccount, getApplicationContext());
 +
 +            ArrayList<String> local = new ArrayList<String>();
 +            ArrayList<String> remote = new ArrayList<String>();
 +            
+             /* TODO - mCreateDir can never be true at this moment; we will replace wdc.createDirectory by CreateFolderOperation when that is fixed 
+             WebdavClient wdc = OwnCloudClientUtils.createOwnCloudClient(mAccount, getApplicationContext());
              // create last directory in path if necessary
              if (mCreateDir) {
-                 webdav.createDirectory(mUploadPath);
+                 wdc.createDirectory(mUploadPath);
              }
 -
 -            String[] local = new String[mStreamsToUpload.size()], remote = new String[mStreamsToUpload.size()];
 -
 -            for (int i = 0; i < mStreamsToUpload.size(); ++i) {
 -                Uri uri = (Uri) mStreamsToUpload.get(i);
 -                if (uri.getScheme().equals("content")) {
 -                    Cursor c = getContentResolver().query((Uri) mStreamsToUpload.get(i),
 -                                                      CONTENT_PROJECTION,
 -                                                      null,
 -                                                      null,
 -                                                      null);
 -
 -                    if (!c.moveToFirst())
 -                        continue;
 -
 -                    final String display_name = c.getString(c.getColumnIndex(Media.DISPLAY_NAME)),
 -                                data = c.getString(c.getColumnIndex(Media.DATA));
 -                    local[i] = data;
 -                    remote[i] = mUploadPath + display_name;
 -                } else if (uri.getScheme().equals("file")) {
 -                    final File file = new File(Uri.decode(uri.toString()).replace(uri.getScheme() + "://", ""));
 -                    local[i] = file.getAbsolutePath();
 -                    remote[i] = mUploadPath + file.getName();
+             */
++            
 +            // this checks the mimeType 
 +            for (Parcelable mStream : mStreamsToUpload) {
 +                
 +                Uri uri = (Uri) mStream;
 +                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, Video.Media.DISPLAY_NAME, Video.Media.MIME_TYPE, Video.Media.SIZE, Video.Media.DATE_MODIFIED };
 +                           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)));
 +                          
 +                       }
 +                       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, 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 occured 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());
 +                       }
 +                        
 +                    } else if (uri.getScheme().equals("file")) {
 +                        String filePath = Uri.decode(uri.toString()).replace(uri.getScheme() + "://", "");
 +                        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());
 +                    }
 +                    else {
 +                        throw new SecurityException();
 +                    }
                  }
 -
 -            }
 +                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);
 -            intent.putExtra(FileUploader.KEY_REMOTE_FILE, remote);
 +            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, mAccount);
              startService(intent);
              finish();
 +            }
+             
          } catch (SecurityException e) {
              String message = String.format(getString(R.string.uploader_error_forbidden_content), getString(R.string.app_name));
              Toast.makeText(this, message, Toast.LENGTH_LONG).show();