X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/e242c5a45fbb23c59800fd563ce35e3519ee55b5..00482b6dcb1e98da39df54374f7098b51d66bee5:/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 7d2b9234..f0e06953 100644 --- a/src/com/owncloud/android/ui/activity/Uploader.java +++ b/src/com/owncloud/android/ui/activity/Uploader.java @@ -2,6 +2,7 @@ * ownCloud Android client application * * @author Bartek Przybylski + * @author masensio * Copyright (C) 2012 Bartek Przybylski * Copyright (C) 2015 ownCloud Inc. * @@ -22,19 +23,13 @@ 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; @@ -52,13 +47,17 @@ 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; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentTransaction; +import android.support.v7.app.ActionBar; +import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; @@ -68,23 +67,20 @@ import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; -import com.actionbarsherlock.app.ActionBar; -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.OCFile; import com.owncloud.android.files.services.FileUploader; +import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.operations.RemoteOperation; 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.ui.dialog.LoadingDialog; 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; /** @@ -103,6 +99,10 @@ public class Uploader extends FileActivity private String mUploadPath; private OCFile mFile; private boolean mAccountSelected; + private boolean mAccountSelectionShowing; + + private ArrayList mRemoteCacheData; + private int mNumCacheFile; private final static int DIALOG_NO_ACCOUNT = 0; private final static int DIALOG_WAITING = 1; @@ -114,6 +114,11 @@ public class Uploader extends FileActivity private final static String KEY_PARENTS = "PARENTS"; private final static String KEY_FILE = "FILE"; private final static String KEY_ACCOUNT_SELECTED = "ACCOUNT_SELECTED"; + private final static String KEY_ACCOUNT_SELECTION_SHOWING = "ACCOUNT_SELECTION_SHOWING"; + private final static String KEY_NUM_CACHE_FILE = "NUM_CACHE_FILE"; + private final static String KEY_REMOTE_CACHE_DATA = "REMOTE_CACHE_DATA"; + + private static final String DIALOG_WAIT_COPY_FILE = "DIALOG_WAIT_COPY_FILE"; @Override protected void onCreate(Bundle savedInstanceState) { @@ -122,13 +127,27 @@ public class Uploader extends FileActivity if (savedInstanceState == null) { mParents = new Stack(); mAccountSelected = false; + mAccountSelectionShowing = false; + mNumCacheFile = 0; + + // ArrayList for files with path in private storage + mRemoteCacheData = new ArrayList(); } else { mParents = (Stack) savedInstanceState.getSerializable(KEY_PARENTS); mFile = savedInstanceState.getParcelable(KEY_FILE); mAccountSelected = savedInstanceState.getBoolean(KEY_ACCOUNT_SELECTED); + mAccountSelectionShowing = savedInstanceState.getBoolean(KEY_ACCOUNT_SELECTION_SHOWING); + mNumCacheFile = savedInstanceState.getInt(KEY_NUM_CACHE_FILE); + mRemoteCacheData = savedInstanceState.getStringArrayList(KEY_REMOTE_CACHE_DATA); } + super.onCreate(savedInstanceState); + if (mAccountSelected) { + setAccount((Account) savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT)); + } + + ActionBar actionBar = getSupportActionBar(); actionBar.setIcon(DisplayUtils.getSeasonalIconId()); @@ -142,9 +161,10 @@ public class Uploader extends FileActivity if (accounts.length == 0) { Log_OC.i(TAG, "No ownCloud account is available"); showDialog(DIALOG_NO_ACCOUNT); - } else if (accounts.length > 1 && !mAccountSelected) { + } else if (accounts.length > 1 && !mAccountSelected && !mAccountSelectionShowing) { Log_OC.i(TAG, "More than one ownCloud is available"); showDialog(DIALOG_MULTIPLE_ACCOUNT); + mAccountSelectionShowing = true; } else { if (!savedAccount) { setAccount(accounts[0]); @@ -173,6 +193,10 @@ public class Uploader extends FileActivity //outState.putParcelable(KEY_ACCOUNT, mAccount); outState.putParcelable(KEY_FILE, mFile); outState.putBoolean(KEY_ACCOUNT_SELECTED, mAccountSelected); + outState.putBoolean(KEY_ACCOUNT_SELECTION_SHOWING, mAccountSelectionShowing); + outState.putInt(KEY_NUM_CACHE_FILE, mNumCacheFile); + outState.putStringArrayList(KEY_REMOTE_CACHE_DATA, mRemoteCacheData); + outState.putParcelable(FileActivity.EXTRA_ACCOUNT, getAccount()); Log_OC.d(TAG, "onSaveInstanceState() end"); } @@ -196,7 +220,8 @@ public class Uploader extends FileActivity builder.setPositiveButton(R.string.uploader_wrn_no_account_setup_btn_text, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { - if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.ECLAIR_MR1) { + if (android.os.Build.VERSION.SDK_INT > + android.os.Build.VERSION_CODES.ECLAIR_MR1) { // using string value since in API7 this // constatn is not defined // in API7 < this constatant is defined in @@ -238,12 +263,14 @@ public class Uploader extends FileActivity onAccountSet(mAccountWasRestored); dialog.dismiss(); mAccountSelected = true; + mAccountSelectionShowing = false; } }); builder.setCancelable(true); builder.setOnCancelListener(new OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { + mAccountSelectionShowing = false; dialog.cancel(); finish(); } @@ -299,7 +326,8 @@ 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 = getStorageManager().getFolderContent(mFile); + // TODO Enable when "On Device" is recovered ? + Vector tmpfiles = getStorageManager().getFolderContent(mFile /*, false*/); if (tmpfiles.size() <= 0) return; // filter on dirtype Vector files = new Vector(); @@ -379,12 +407,13 @@ public class Uploader extends FileActivity actionBar.setHomeButtonEnabled(notRoot); String full_path = generatePath(mParents); - + Log_OC.d(TAG, "Populating view with content of : " + full_path); mFile = getStorageManager().getFileByPath(full_path); if (mFile != null) { - Vector files = getStorageManager().getFolderContent(mFile); + // TODO Enable when "On Device" is recovered ? + Vector files = getStorageManager().getFolderContent(mFile/*, false*/); List> data = new LinkedList>(); for (OCFile f : files) { HashMap h = new HashMap(); @@ -397,7 +426,7 @@ public class Uploader extends FileActivity data, R.layout.uploader_list_item_layout, new String[] {"dirname"}, - new int[] {R.id.textView1}); + new int[] {R.id.filename}); mListView.setAdapter(sa); Button btnChooseFolder = (Button) findViewById(R.id.uploader_choose_folder); @@ -434,6 +463,7 @@ public class Uploader extends FileActivity public void uploadFiles() { try { + // ArrayList for files with path in external storage ArrayList local = new ArrayList(); ArrayList remote = new ArrayList(); @@ -494,21 +524,7 @@ public class Uploader extends FileActivity 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")) { filePath = Uri.decode(uri.toString()).replace(uri.getScheme() + "://", ""); @@ -517,12 +533,24 @@ public class Uploader extends FileActivity filePath = splitedFilePath[1]; } final File file = new File(filePath); - local.add(file.getAbsolutePath()); - remote.add(mUploadPath + file.getName()); + data = file.getAbsolutePath(); + filePath = mUploadPath + file.getName(); } else { throw new SecurityException(); } + if (data == null) { + mRemoteCacheData.add(filePath); + CopyTmpFileAsyncTask copyTask = new CopyTmpFileAsyncTask(this); + Object[] params = { uri, filePath, mRemoteCacheData.size()-1, + getAccount().name, getContentResolver()}; + mNumCacheFile++; + showWaitingCopyDialog(); + copyTask.execute(params); + } else { + remote.add(filePath); + local.add(data); + } } else { throw new SecurityException(); @@ -610,6 +638,7 @@ public class Uploader extends FileActivity mParents.add(""); } else{ String[] dir_names = last_path.split("/"); + mParents.clear(); for (String dir : dir_names) mParents.add(dir); } @@ -640,10 +669,51 @@ public class Uploader extends FileActivity /** * Process the result of CopyTmpFileAsyncTask * @param result + * @param index */ @Override - public void OnCopyTmpFileTaskListener(String result) { + public void onTmpFileCopied(String result, int index) { + if (mNumCacheFile -- == 0) { + dismissWaitingCopyDialog(); + } + if (result != null) { + Intent intent = new Intent(getApplicationContext(), FileUploader.class); + intent.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_SINGLE_FILE); + intent.putExtra(FileUploader.KEY_LOCAL_FILE, result); + intent.putExtra(FileUploader.KEY_REMOTE_FILE, mRemoteCacheData.get(index)); + intent.putExtra(FileUploader.KEY_ACCOUNT, getAccount()); + startService(intent); + + } else { + String message = String.format(getString(R.string.uploader_error_forbidden_content), + getString(R.string.app_name)); + Toast.makeText(this, message, Toast.LENGTH_LONG).show(); + Log_OC.d(TAG, message); + } } +/** + * Show waiting for copy dialog + */ + public void showWaitingCopyDialog() { + // Construct dialog + LoadingDialog loading = new LoadingDialog( + getResources().getString(R.string.wait_for_tmp_copy_from_private_storage)); + FragmentManager fm = getSupportFragmentManager(); + FragmentTransaction ft = fm.beginTransaction(); + loading.show(ft, DIALOG_WAIT_COPY_FILE); + + } + + /** + * Dismiss waiting for copy dialog + */ + public void dismissWaitingCopyDialog(){ + Fragment frag = getSupportFragmentManager().findFragmentByTag(DIALOG_WAIT_COPY_FILE); + if (frag != null) { + LoadingDialog loading = (LoadingDialog) frag; + loading.dismiss(); + } + } }