X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/c0da8a93f24f4f87256e71c32f3c2a300d22e62f..e242c5a45fbb23c59800fd563ce35e3519ee55b5:/src/com/owncloud/android/ui/activity/Uploader.java diff --git a/src/com/owncloud/android/ui/activity/Uploader.java b/src/com/owncloud/android/ui/activity/Uploader.java index edd2f5db..7d2b9234 100644 --- a/src/com/owncloud/android/ui/activity/Uploader.java +++ b/src/com/owncloud/android/ui/activity/Uploader.java @@ -22,12 +22,19 @@ 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; @@ -64,7 +73,6 @@ import com.actionbarsherlock.view.MenuItem; import com.owncloud.android.MainApp; import com.owncloud.android.R; import com.owncloud.android.authentication.AccountAuthenticator; -import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.datamodel.OCFile; import com.owncloud.android.files.services.FileUploader; import com.owncloud.android.lib.common.operations.RemoteOperation; @@ -72,27 +80,29 @@ 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 mParents; private ArrayList mStreamsToUpload; private boolean mCreateDir; private String mUploadPath; - private FileDataStorageManager mStorageManager; private OCFile mFile; - private boolean mAccountSelected = false; + private boolean mAccountSelected; private final static int DIALOG_NO_ACCOUNT = 0; private final static int DIALOG_WAITING = 1; @@ -102,28 +112,31 @@ 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"; @Override protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + prepareStreamsToUpload(); if (savedInstanceState == null) { mParents = new Stack(); + mAccountSelected = false; } else { mParents = (Stack) 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); ActionBar actionBar = getSupportActionBar(); actionBar.setIcon(DisplayUtils.getSeasonalIconId()); - if (prepareStreamsToUpload()) { + } + + @Override + protected void setAccount(Account account, boolean savedAccount) { + if (somethingToUpload()) { mAccountManager = (AccountManager) getSystemService(Context.ACCOUNT_SERVICE); Account[] accounts = mAccountManager.getAccountsByType(MainApp.getAccountType()); if (accounts.length == 0) { @@ -133,19 +146,23 @@ public class Uploader extends FileActivity 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()); + if (!savedAccount) { + setAccount(accounts[0]); } - initTargetFolder(); - populateDirectoryList(); - } - + } else { showDialog(DIALOG_NO_STREAM); } + super.setAccount(account, savedAccount); + } + + @Override + protected void onAccountSet(boolean stateWasRecovered) { + super.onAccountSet(mAccountWasRestored); + initTargetFolder(); + populateDirectoryList(); } @Override @@ -153,7 +170,7 @@ public class Uploader extends FileActivity Log_OC.d(TAG, "onSaveInstanceState() start"); super.onSaveInstanceState(outState); outState.putSerializable(KEY_PARENTS, mParents); - outState.putParcelable(KEY_ACCOUNT, mAccount); + //outState.putParcelable(KEY_ACCOUNT, mAccount); outState.putParcelable(KEY_FILE, mFile); outState.putBoolean(KEY_ACCOUNT_SELECTED, mAccountSelected); @@ -217,10 +234,8 @@ public class Uploader extends FileActivity builder.setItems(ac, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - mAccount = mAccountManager.getAccountsByType(MainApp.getAccountType())[which]; - mStorageManager = new FileDataStorageManager(mAccount, getContentResolver()); - initTargetFolder(); - populateDirectoryList(); + setAccount(mAccountManager.getAccountsByType(MainApp.getAccountType())[which]); + onAccountSet(mAccountWasRestored); dialog.dismiss(); mAccountSelected = true; } @@ -284,7 +299,7 @@ public class Uploader extends FileActivity public void onItemClick(AdapterView parent, View view, int position, long id) { // click on folder in the list Log_OC.d(TAG, "on item click"); - Vector tmpfiles = mStorageManager.getFolderContent(mFile); + Vector tmpfiles = getStorageManager().getFolderContent(mFile); if (tmpfiles.size() <= 0) return; // filter on dirtype Vector files = new Vector(); @@ -303,7 +318,8 @@ public class Uploader extends FileActivity // click on button switch (v.getId()) { case R.id.uploader_choose_folder: - mUploadPath = ""; // first element in mParents is root dir, represented by ""; init mUploadPath with "/" results in a "//" prefix + 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_OC.d(TAG, "Uploading file to dir " + mUploadPath); @@ -339,7 +355,7 @@ public class Uploader extends FileActivity // there is no need for checking for is there more then one // account at this point // since account setup can set only one account at time - mAccount = accounts[0]; + setAccount(accounts[0]); populateDirectoryList(); } } @@ -366,9 +382,9 @@ public class Uploader extends FileActivity Log_OC.d(TAG, "Populating view with content of : " + full_path); - mFile = mStorageManager.getFileByPath(full_path); + mFile = getStorageManager().getFileByPath(full_path); if (mFile != null) { - Vector files = mStorageManager.getFolderContent(mFile); + Vector files = getStorageManager().getFolderContent(mFile); List> data = new LinkedList>(); for (OCFile f : files) { HashMap h = new HashMap(); @@ -402,13 +418,16 @@ public class Uploader extends FileActivity return full_path; } - private boolean prepareStreamsToUpload() { + private void prepareStreamsToUpload() { if (getIntent().getAction().equals(Intent.ACTION_SEND)) { mStreamsToUpload = new ArrayList(); mStreamsToUpload.add(getIntent().getParcelableExtra(Intent.EXTRA_STREAM)); } else if (getIntent().getAction().equals(Intent.ACTION_SEND_MULTIPLE)) { mStreamsToUpload = getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM); } + } + + private boolean somethingToUpload() { return (mStreamsToUpload != null && mStreamsToUpload.get(0) != null); } @@ -422,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"); @@ -501,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, mAccount); - 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) { @@ -570,7 +596,7 @@ public class Uploader extends FileActivity * The target account has to be chosen before this method is called. */ private void initTargetFolder() { - if (mStorageManager == null) { + if (getStorageManager() == null) { throw new IllegalStateException("Do not call this method before " + "initializing mStorageManager"); } @@ -582,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(!mStorageManager.fileExists(generatePath(mParents)) && mParents.size() > 1){ - mParents.pop(); - } + while(!getStorageManager().fileExists(generatePath(mParents)) && mParents.size() > 1){ + mParents.pop(); + } } @@ -599,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) { + + } + }