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;
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;
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 = false;
+ private boolean mAccountSelected;
private final static int DIALOG_NO_ACCOUNT = 0;
private final static int DIALOG_WAITING = 1;
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";
protected void onCreate(Bundle savedInstanceState) {
prepareStreamsToUpload();
- super.onCreate(savedInstanceState);
-
if (savedInstanceState == null) {
mParents = new Stack<String>();
+ 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);
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
showDialog(DIALOG_MULTIPLE_ACCOUNT);
} else {
if (!savedAccount) {
- //mAccount = accounts[0];
- //mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());
setAccount(accounts[0]);
}
- // Part in onAccountSet
-// initTargetFolder();
-// populateDirectoryList();
-
}
} else {
}
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
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
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;
}
// 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);
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");
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) {
// "/" 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();
+ }
}
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) {
+
+ }
+
}