X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/5d49850c2593b68523051571925157939041f68d..5d843eec5dee5d7acc568d714ad464ee16e74ccb:/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 66359f3d..b6c8a236 100644 --- a/src/com/owncloud/android/ui/activity/Uploader.java +++ b/src/com/owncloud/android/ui/activity/Uploader.java @@ -1,6 +1,9 @@ -/* ownCloud Android client application +/** + * ownCloud Android client application + * + * @author Bartek Przybylski * Copyright (C) 2012 Bartek Przybylski - * Copyright (C) 2012-2013 ownCloud Inc. + * Copyright (C) 2015 ownCloud Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -26,14 +29,6 @@ import java.util.List; import java.util.Stack; import java.util.Vector; -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.utils.Log_OC; - import android.accounts.Account; import android.accounts.AccountManager; import android.app.AlertDialog; @@ -46,6 +41,7 @@ import android.content.DialogInterface.OnCancelListener; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.SharedPreferences; +import android.content.res.Resources.NotFoundException; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; @@ -59,22 +55,34 @@ import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.EditText; +import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.Toast; import com.actionbarsherlock.app.ActionBar; -import com.actionbarsherlock.app.SherlockListActivity; 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; +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.DisplayUtils; +import com.owncloud.android.utils.ErrorMessageAdapter; + /** * This can be used to upload things to an ownCloud instance. - * - * @author Bartek Przybylski - * */ -public class Uploader extends SherlockListActivity implements OnItemClickListener, android.view.View.OnClickListener { - private static final String TAG = "ownCloudUploader"; +public class Uploader extends FileActivity + implements OnItemClickListener, android.view.View.OnClickListener { + + private static final String TAG = Uploader.class.getSimpleName(); private Account mAccount; private AccountManager mAccountManager; @@ -84,7 +92,8 @@ public class Uploader extends SherlockListActivity implements OnItemClickListene private String mUploadPath; private FileDataStorageManager mStorageManager; private OCFile mFile; - + private boolean mAccountSelected = false; + private final static int DIALOG_NO_ACCOUNT = 0; private final static int DIALOG_WAITING = 1; private final static int DIALOG_NO_STREAM = 2; @@ -92,10 +101,24 @@ public class Uploader extends SherlockListActivity implements OnItemClickListene 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); - mParents = new Stack(); + + if (savedInstanceState == null) { + mParents = new Stack(); + } 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); + } ActionBar actionBar = getSupportActionBar(); actionBar.setIcon(DisplayUtils.getSeasonalIconId()); @@ -106,8 +129,8 @@ public class Uploader extends SherlockListActivity implements OnItemClickListene if (accounts.length == 0) { Log_OC.i(TAG, "No ownCloud account is available"); showDialog(DIALOG_NO_ACCOUNT); - } else if (accounts.length > 1) { - Log_OC.i(TAG, "More then one ownCloud is available"); + } else if (accounts.length > 1 && !mAccountSelected) { + Log_OC.i(TAG, "More than one ownCloud is available"); showDialog(DIALOG_MULTIPLE_ACCOUNT); } else { mAccount = accounts[0]; @@ -120,8 +143,21 @@ public class Uploader extends SherlockListActivity implements OnItemClickListene } else { showDialog(DIALOG_NO_STREAM); } + } - + + @Override + protected void onSaveInstanceState(Bundle outState) { + Log_OC.d(TAG, "onSaveInstanceState() start"); + super.onSaveInstanceState(outState); + outState.putSerializable(KEY_PARENTS, mParents); + outState.putParcelable(KEY_ACCOUNT, mAccount); + outState.putParcelable(KEY_FILE, mFile); + outState.putBoolean(KEY_ACCOUNT_SELECTED, mAccountSelected); + + Log_OC.d(TAG, "onSaveInstanceState() end"); + } + @Override protected Dialog onCreateDialog(final int id) { final AlertDialog.Builder builder = new Builder(this); @@ -135,7 +171,8 @@ public class Uploader extends SherlockListActivity implements OnItemClickListene case DIALOG_NO_ACCOUNT: builder.setIcon(android.R.drawable.ic_dialog_alert); builder.setTitle(R.string.uploader_wrn_no_account_title); - builder.setMessage(String.format(getString(R.string.uploader_wrn_no_account_text), getString(R.string.app_name))); + builder.setMessage(String.format( + getString(R.string.uploader_wrn_no_account_text), getString(R.string.app_name))); builder.setCancelable(false); builder.setPositiveButton(R.string.uploader_wrn_no_account_setup_btn_text, new OnClickListener() { @Override @@ -168,9 +205,11 @@ public class Uploader extends SherlockListActivity implements OnItemClickListene }); return builder.create(); case DIALOG_MULTIPLE_ACCOUNT: - CharSequence ac[] = new CharSequence[mAccountManager.getAccountsByType(MainApp.getAccountType()).length]; + CharSequence ac[] = new CharSequence[ + mAccountManager.getAccountsByType(MainApp.getAccountType()).length]; for (int i = 0; i < ac.length; ++i) { - ac[i] = mAccountManager.getAccountsByType(MainApp.getAccountType())[i].name; + ac[i] = DisplayUtils.convertIdn( + mAccountManager.getAccountsByType(MainApp.getAccountType())[i].name, false); } builder.setTitle(R.string.common_choose_account); builder.setItems(ac, new OnClickListener() { @@ -180,6 +219,8 @@ public class Uploader extends SherlockListActivity implements OnItemClickListene mStorageManager = new FileDataStorageManager(mAccount, getContentResolver()); initTargetFolder(); populateDirectoryList(); + dialog.dismiss(); + mAccountSelected = true; } }); builder.setCancelable(true); @@ -268,6 +309,13 @@ public class Uploader extends SherlockListActivity implements OnItemClickListene uploadFiles(); break; + + case R.id.uploader_new_folder: + CreateFolderDialogFragment dialog = CreateFolderDialogFragment.newInstance(mFile); + dialog.show(getSupportFragmentManager(), "createdirdialog"); + break; + + default: throw new IllegalArgumentException("Wrong element clicked"); } @@ -297,6 +345,8 @@ public class Uploader extends SherlockListActivity implements OnItemClickListene private void populateDirectoryList() { setContentView(R.layout.uploader_layout); + + ListView mListView = (ListView) findViewById(android.R.id.list); String current_dir = mParents.peek(); if(current_dir.equals("")){ @@ -330,10 +380,15 @@ public class Uploader extends SherlockListActivity implements OnItemClickListene R.layout.uploader_list_item_layout, new String[] {"dirname"}, new int[] {R.id.textView1}); - setListAdapter(sa); - Button btn = (Button) findViewById(R.id.uploader_choose_folder); - btn.setOnClickListener(this); - getListView().setOnItemClickListener(this); + + mListView.setAdapter(sa); + Button btnChooseFolder = (Button) findViewById(R.id.uploader_choose_folder); + btnChooseFolder.setOnClickListener(this); + + Button btnNewFolder = (Button) findViewById(R.id.uploader_new_folder); + btnNewFolder.setOnClickListener(this); + + mListView.setOnItemClickListener(this); } } @@ -371,38 +426,52 @@ public class Uploader extends SherlockListActivity implements OnItemClickListene 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); + 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))); + 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); + 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))); + 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); + 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))); + 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 + 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]; @@ -413,7 +482,8 @@ public class Uploader extends SherlockListActivity implements OnItemClickListene } } else if (uri.getScheme().equals("file")) { - String filePath = Uri.decode(uri.toString()).replace(uri.getScheme() + "://", ""); + String filePath = Uri.decode(uri.toString()).replace(uri.getScheme() + + "://", ""); if (filePath.contains("mnt")) { String splitedFilePath[] = filePath.split("/mnt"); filePath = splitedFilePath[1]; @@ -433,7 +503,8 @@ public class Uploader extends SherlockListActivity implements OnItemClickListene 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_REMOTE_FILE, + remote.toArray(new String[remote.size()])); intent.putExtra(FileUploader.KEY_ACCOUNT, mAccount); startService(intent); @@ -447,11 +518,50 @@ public class Uploader extends SherlockListActivity implements OnItemClickListene } } catch (SecurityException e) { - String message = String.format(getString(R.string.uploader_error_forbidden_content), getString(R.string.app_name)); + String message = String.format(getString(R.string.uploader_error_forbidden_content), + getString(R.string.app_name)); Toast.makeText(this, message, Toast.LENGTH_LONG).show(); } } + @Override + public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) { + super.onRemoteOperationFinish(operation, result); + + + if (operation instanceof CreateFolderOperation) { + onCreateFolderOperationFinish((CreateFolderOperation)operation, result); + } + + } + + /** + * Updates the view associated to the activity after the finish of an operation + * trying create a new folder + * + * @param operation Creation operation performed. + * @param result Result of the creation. + */ + private void onCreateFolderOperationFinish(CreateFolderOperation operation, + RemoteOperationResult result) { + if (result.isSuccess()) { + dismissLoadingDialog(); + populateDirectoryList(); + } else { + dismissLoadingDialog(); + try { + Toast msg = Toast.makeText(this, + ErrorMessageAdapter.getErrorCauseMessage(result, operation, getResources()), + Toast.LENGTH_LONG); + msg.show(); + + } catch (NotFoundException e) { + Log_OC.e(TAG, "Error while trying to show fail message " , e); + } + } + } + + /** * Loads the target folder initialize shown to the user. * @@ -459,7 +569,8 @@ public class Uploader extends SherlockListActivity implements OnItemClickListene */ private void initTargetFolder() { if (mStorageManager == null) { - throw new IllegalStateException("Do not call this method before initializing mStorageManager"); + throw new IllegalStateException("Do not call this method before " + + "initializing mStorageManager"); } SharedPreferences appPreferences = PreferenceManager