-package eu.alefzero.owncloud;
-
-import java.io.File;
-import java.net.FileNameMap;
-import java.net.URI;
-import java.net.URLConnection;
-import java.util.ArrayList;
-import java.util.Stack;
-
-import android.accounts.Account;
-import android.accounts.AccountManager;
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.app.ListActivity;
-import android.app.ProgressDialog;
-import android.app.AlertDialog.Builder;
-import android.content.ContentValues;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.DialogInterface.OnCancelListener;
-import android.content.DialogInterface.OnClickListener;
-import android.database.Cursor;
-import android.net.Uri;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Parcelable;
-import android.provider.MediaStore.Images.Media;
-import android.util.Log;
-import android.view.View;
-import android.view.Window;
-import android.view.ViewGroup.LayoutParams;
-import android.widget.AdapterView;
-import android.widget.Button;
-import android.widget.EditText;
-import android.widget.LinearLayout;
-import android.widget.ListView;
-import android.widget.SimpleCursorAdapter;
-import android.widget.Toast;
-import android.widget.AdapterView.OnItemClickListener;
-import eu.alefzero.owncloud.authenticator.AccountAuthenticator;
-import eu.alefzero.owncloud.db.ProviderMeta;
-import eu.alefzero.owncloud.db.ProviderMeta.ProviderTableMeta;
-import eu.alefzero.webdav.WebdavUtils;
-
-public class Uploader extends ListActivity implements OnItemClickListener, android.view.View.OnClickListener {
- private static final String TAG = "ownCloudUploader";
-
- private Account mAccount;
- private AccountManager mAccountManager;
- private String mUsername, mPassword;
- private Cursor mCursor;
- private Stack<String> mParents;
- private Thread mUploadThread;
- private Handler mHandler;
- private ArrayList<Parcelable> mStreamsToUpload;
-
- private final static int DIALOG_NO_ACCOUNT = 0;
- 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;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- getWindow().requestFeature(Window.FEATURE_NO_TITLE);
- mParents = new Stack<String>();
- mHandler = new Handler();
- if (getIntent().hasExtra(Intent.EXTRA_STREAM)) {
- 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");
- showDialog(DIALOG_NO_ACCOUNT);
- } else if (accounts.length > 1) {
- Log.i(TAG, "More then one ownCloud is available");
- showDialog(DIALOG_MULTIPLE_ACCOUNT);
- } else {
- mAccount = accounts[0];
- setContentView(R.layout.uploader_layout);
- populateDirectoryList();
- }
- } else {
- showDialog(DIALOG_NO_STREAM);
- }
- }
-
- @Override
- protected Dialog onCreateDialog(final int id) {
- final AlertDialog.Builder builder = new Builder(this);
- switch (id) {
- case DIALOG_WAITING:
- ProgressDialog pDialog = new ProgressDialog(this);
- pDialog.setIndeterminate(false);
- pDialog.setCancelable(false);
- pDialog.setMessage(getResources().getString(R.string.uploader_info_uploading));
- return pDialog;
- case DIALOG_NO_ACCOUNT:
- builder.setIcon(android.R.drawable.ic_dialog_alert);
- builder.setTitle(R.string.uploader_wrn_no_account_title);
- builder.setMessage(R.string.uploader_wrn_no_account_text);
- builder.setCancelable(false);
- builder.setPositiveButton(R.string.uploader_wrn_no_account_setup_btn_text, new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- 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 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});
- startActivityForResult(intent, REQUEST_CODE_SETUP_ACCOUNT);
- } else {
- // since in API7 there is no direct call for account setup, so we need to
- // show our own AccountSetupAcricity, get desired results and setup
- // everything for ourself
- Intent intent = new Intent(getBaseContext(), AccountAuthenticator.class);
- startActivityForResult(intent, REQUEST_CODE_SETUP_ACCOUNT);
- }
- }
- });
- builder.setNegativeButton(R.string.uploader_wrn_no_account_quit_btn_text, new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- finish();
- }
- });
- 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");
- }
- 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) {
- ac[i] = mAccountManager.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE)[i].name;
- }
- builder.setTitle(R.string.common_choose_account);
- builder.setItems(ac, new OnClickListener() {
- public void onClick(DialogInterface dialog, int which) {
- mAccount = mAccountManager.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE)[which];
- populateDirectoryList();
- }
- });
- builder.setCancelable(true);
- builder.setOnCancelListener(new OnCancelListener() {
- public void onCancel(DialogInterface dialog) {
- dialog.cancel();
- finish();
- }
- });
- return builder.create();
- default:
- throw new IllegalArgumentException("Unknown dialog id: " + id);
- }
- }
-
- class a implements OnClickListener {
- String mPath;
- EditText mDirname;
- public a(String path, EditText dirname) {
- mPath = path; mDirname = dirname;
- }
- public void onClick(DialogInterface dialog, int which) {
- showDialog(DIALOG_WAITING);
- mUploadThread = new Thread(new BackgroundUploader(mPath+mDirname.getText().toString(), mStreamsToUpload, mHandler, true));
- mUploadThread.start();
- }
- }
-
- @Override
- public void onBackPressed() {
-
- if (mParents.size()==0) {
- super.onBackPressed();
- return;
- } else if (mParents.size() == 1) {
- mParents.pop();
- mCursor = managedQuery(ProviderTableMeta.CONTENT_URI,
- null,
- ProviderTableMeta.FILE_CONTENT_TYPE+"=?",
- new String[]{"DIR"},
- null);
- } else {
- mParents.pop();
- mCursor = managedQuery(Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_DIR, mParents.peek()),
- null,
- ProviderTableMeta.FILE_CONTENT_TYPE+"=?",
- new String[]{"DIR"},
- null);
- }
-
- SimpleCursorAdapter sca = new SimpleCursorAdapter(this, R.layout.uploader_list_item_layout,
- mCursor,
- new String[]{ProviderTableMeta.FILE_NAME},
- new int[]{R.id.textView1});
- setListAdapter(sca);
- }
-
- public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
- if (!mCursor.moveToPosition(position)) {
- throw new IndexOutOfBoundsException("Incorrect item selected");
- }
- String _id = mCursor.getString(mCursor.getColumnIndex(ProviderTableMeta._ID));
- mParents.push(_id);
-
- mCursor.close();
- mCursor = managedQuery(Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_DIR, _id),
- null,
- ProviderTableMeta.FILE_CONTENT_TYPE+"=?",
- new String[]{"DIR"},
- null);
- SimpleCursorAdapter sca = new SimpleCursorAdapter(this, R.layout.uploader_list_item_layout,
- mCursor,
- new String[]{ProviderTableMeta.FILE_NAME},
- new int[]{R.id.textView1});
- setListAdapter(sca);
- getListView().invalidate();
- }
-
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.uploader_choose_folder:
- String pathToUpload = null;
- 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");
- }
-
- showDialog(DIALOG_WAITING);
- mUploadThread = new Thread(new BackgroundUploader(pathToUpload, mStreamsToUpload, mHandler));
- mUploadThread.start();
-
- break;
- case android.R.id.button1: // dynamic action for create aditional dir
- showDialog(DIALOG_GET_DIRNAME);
- break;
- default:
- throw new IllegalArgumentException("Wrong element clicked");
- }
- }
-
- public void onUploadComplete(boolean uploadSucc, String message) {
- dismissDialog(DIALOG_WAITING);
- Log.i(TAG, "UploadSucc: " + uploadSucc + " message: " + message);
- if (uploadSucc) {
- Toast.makeText(this, getResources().getString(R.string.uploader_upload_succeed), Toast.LENGTH_SHORT).show();
- } else {
- Toast.makeText(this, getResources().getString(R.string.uploader_upload_failed) + message, Toast.LENGTH_LONG).show();
- }
- finish();
- }
-
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- Log.i(TAG, "result received. req: " + requestCode + " res: " + resultCode);
- if (requestCode == REQUEST_CODE_SETUP_ACCOUNT) {
- dismissDialog(DIALOG_NO_ACCOUNT);
- if (resultCode == RESULT_CANCELED) {
- finish();
- }
- Account[] accounts = mAccountManager.getAccountsByType(AccountAuthenticator.AUTH_TOKEN_TYPE);
- if (accounts.length == 0) {
- showDialog(DIALOG_NO_ACCOUNT);
- } else {
- // 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];
- populateDirectoryList();
- }
- }
- }
-
- private void populateDirectoryList() {
- mUsername = mAccount.name.substring(0, mAccount.name.indexOf('@'));
- mPassword = mAccountManager.getPassword(mAccount);
- setContentView(R.layout.uploader_layout);
- mCursor = managedQuery(ProviderMeta.ProviderTableMeta.CONTENT_URI,
- null,
- ProviderTableMeta.FILE_CONTENT_TYPE+"=? AND " + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?",
- new String[]{"DIR", mAccount.name},
- null);
-
- ListView lv = getListView();
- lv.setOnItemClickListener(this);
- SimpleCursorAdapter sca = new SimpleCursorAdapter(this,
- R.layout.uploader_list_item_layout,
- mCursor,
- new String[]{ProviderTableMeta.FILE_NAME},
- new int[]{R.id.textView1});
- setListAdapter(sca);
- Button btn = (Button) findViewById(R.id.uploader_choose_folder);
- btn.setOnClickListener(this);
- // insert create new directory for multiple items uploading
- if (getIntent().getAction().equals(Intent.ACTION_SEND_MULTIPLE)) {
- Button createDirBtn = new Button(this);
- createDirBtn.setId(android.R.id.button1);
- createDirBtn.setText(R.string.uploader_btn_create_dir_text);
- createDirBtn.setOnClickListener(this);
- ((LinearLayout)findViewById(R.id.linearLayout1)).addView(createDirBtn, LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
- }
- }
-
- private void prepareStreamsToUpload() {
- if (getIntent().getAction().equals(Intent.ACTION_SEND)) {
- mStreamsToUpload = new ArrayList<Parcelable>();
- mStreamsToUpload.add(getIntent().getParcelableExtra(Intent.EXTRA_STREAM));
- } else if (getIntent().getAction().equals(Intent.ACTION_SEND_MULTIPLE)) {
- mStreamsToUpload = getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM);
- } else {
- // unknow action inserted
- throw new IllegalArgumentException("Unknown action given: " + getIntent().getAction());
- }
- }
-
- public void PartialupdateUpload(String fileLocalPath, String filename, String filepath, String contentType, String contentLength) {
- ContentValues cv = new ContentValues();
- cv.put(ProviderTableMeta.FILE_NAME, filename);
- cv.put(ProviderTableMeta.FILE_PATH, filepath);
- cv.put(ProviderTableMeta.FILE_STORAGE_PATH, fileLocalPath);
- cv.put(ProviderTableMeta.FILE_MODIFIED, WebdavUtils.DISPLAY_DATE_FORMAT.format(new java.util.Date()));
- cv.put(ProviderTableMeta.FILE_CONTENT_TYPE, contentType);
- cv.put(ProviderTableMeta.FILE_CONTENT_LENGTH, contentLength);
- cv.put(ProviderTableMeta.FILE_ACCOUNT_OWNER, mAccount.name);
- Log.d(TAG, filename+" ++ "+filepath+" ++ " + contentLength + " ++ " + contentType + " ++ " + fileLocalPath);
- if (!mParents.empty()) {
- Cursor c = managedQuery(Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, mParents.peek()),
- null,
- null,
- null,
- null);
- c.moveToFirst();
- cv.put(ProviderTableMeta.FILE_PARENT, c.getString(c.getColumnIndex(ProviderTableMeta._ID)));
- c.close();
- }
- getContentResolver().insert(ProviderTableMeta.CONTENT_URI_FILE, cv);
- }
-
- class BackgroundUploader implements Runnable {
- private ArrayList<Parcelable> mUploadStreams;
- private Handler mHandler;
- private String mUploadPath;
- private boolean mCreateDir;
-
- public BackgroundUploader(String pathToUpload, ArrayList<Parcelable> streamsToUpload,
- Handler handler) {
- mUploadStreams = streamsToUpload;
- mHandler = handler;
- mUploadPath = pathToUpload.replace(" ", "%20");
- mCreateDir = false;
- }
-
- public BackgroundUploader(String pathToUpload, ArrayList<Parcelable> streamsToUpload,
- Handler handler, boolean createDir) {
- mUploadStreams = streamsToUpload;
- mHandler = handler;
- mUploadPath = pathToUpload.replace(" ", "%20");
- mCreateDir = createDir;
- }
-
- public void run() {
- WebdavClient wdc = new WebdavClient(Uri.parse(mAccountManager.getUserData(mAccount,
- AccountAuthenticator.KEY_OC_URL)));
- wdc.setCredentials(mUsername, mPassword);
- wdc.allowUnsignedCertificates();
-
- // create last directory in path if nessesary
- if (mCreateDir) {
- wdc.createDirectory(mUploadPath);
- }
-
- for (int i = 0; i < mUploadStreams.size(); ++i) {
- Uri uri = (Uri) mUploadStreams.get(i);
- if (uri.getScheme().equals("content")) {
- final Cursor c = getContentResolver().query((Uri) mUploadStreams.get(i), null, null, null, null);
- c.moveToFirst();
-
- if (!wdc.putFile(c.getString(c.getColumnIndex(Media.DATA)),
- mUploadPath+"/"+c.getString(c.getColumnIndex(Media.DISPLAY_NAME)),
- c.getString(c.getColumnIndex(Media.MIME_TYPE)))) {
- mHandler.post(new Runnable() {
- public void run() {
- Uploader.this.onUploadComplete(false, "Error while uploading file: " + c.getString(c.getColumnIndex(Media.DISPLAY_NAME)));
- }
- });
- }
- } else if (uri.getScheme().equals("file")) {
- final File file = new File(Uri.decode(uri.toString()).replace(uri.getScheme()+"://", ""));
- FileNameMap fileNameMap = URLConnection.getFileNameMap();
- String contentType = fileNameMap.getContentTypeFor(uri.toString());
- if (contentType == null) {
- contentType = "text/plain";
- }
- if (!wdc.putFile(file.getAbsolutePath(), mUploadPath+"/"+file.getName(), contentType)) {
- mHandler.post(new Runnable() {
- public void run() {
- Uploader.this.onUploadComplete(false, "Error while uploading file: " + file.getName());
- }
- });
- }
- }
-
- }
- mHandler.post(new Runnable() {
- public void run() {
- Uploader.this.onUploadComplete(true, null);
- }
- });
- }
-
- }
-
-}
+/* ownCloud Android client application\r
+ * Copyright (C) 2012 Bartek Przybylski\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation, either version 3 of the License, or\r
+ * (at your option) any later version.\r
+ *\r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.\r
+ *\r
+ */\r
+package eu.alefzero.owncloud;\r
+\r
+import java.io.File;\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.LinkedList;\r
+import java.util.List;\r
+import java.util.Stack;\r
+import java.util.Vector;\r
+\r
+import android.accounts.Account;\r
+import android.accounts.AccountManager;\r
+import android.app.AlertDialog;\r
+import android.app.AlertDialog.Builder;\r
+import android.app.Dialog;\r
+import android.app.ListActivity;\r
+import android.app.ProgressDialog;\r
+import android.content.Context;\r
+import android.content.DialogInterface;\r
+import android.content.DialogInterface.OnCancelListener;\r
+import android.content.DialogInterface.OnClickListener;\r
+import android.content.Intent;\r
+import android.database.Cursor;\r
+import android.net.Uri;\r
+import android.os.Bundle;\r
+import android.os.Parcelable;\r
+import android.provider.MediaStore.Images.Media;\r
+import android.util.Log;\r
+import android.view.View;\r
+import android.view.Window;\r
+import android.widget.AdapterView;\r
+import android.widget.AdapterView.OnItemClickListener;\r
+import android.widget.Button;\r
+import android.widget.EditText;\r
+import android.widget.SimpleAdapter;\r
+import eu.alefzero.owncloud.authenticator.AccountAuthenticator;\r
+import eu.alefzero.owncloud.datamodel.DataStorageManager;\r
+import eu.alefzero.owncloud.datamodel.FileDataStorageManager;\r
+import eu.alefzero.owncloud.datamodel.OCFile;\r
+import eu.alefzero.owncloud.files.services.FileUploader;\r
+import eu.alefzero.webdav.WebdavClient;\r
+\r
+/**\r
+ * This can be used to upload things to an ownCloud instance.\r
+ * \r
+ * @author Bartek Przybylski\r
+ * \r
+ */\r
+public class Uploader extends ListActivity implements OnItemClickListener, android.view.View.OnClickListener {\r
+ private static final String TAG = "ownCloudUploader";\r
+\r
+ private Account mAccount;\r
+ private AccountManager mAccountManager;\r
+ private Stack<String> mParents;\r
+ private ArrayList<Parcelable> mStreamsToUpload;\r
+ private boolean mCreateDir;\r
+ private String mUploadPath;\r
+ private static final String[] CONTENT_PROJECTION = { Media.DATA, Media.DISPLAY_NAME, Media.MIME_TYPE, Media.SIZE };\r
+ private DataStorageManager mStorageManager;\r
+ private OCFile mFile;\r
+\r
+ private final static int DIALOG_NO_ACCOUNT = 0;\r
+ private final static int DIALOG_WAITING = 1;\r
+ private final static int DIALOG_NO_STREAM = 2;\r
+ private final static int DIALOG_MULTIPLE_ACCOUNT = 3;\r
+ private final static int DIALOG_GET_DIRNAME = 4;\r
+\r
+ private final static int REQUEST_CODE_SETUP_ACCOUNT = 0;\r
+\r
+ @Override\r
+ protected void onCreate(Bundle savedInstanceState) {\r
+ super.onCreate(savedInstanceState);\r
+ getWindow().requestFeature(Window.FEATURE_NO_TITLE);\r
+ mParents = new Stack<String>();\r
+ mParents.add("");\r
+ if (getIntent().hasExtra(Intent.EXTRA_STREAM)) {\r
+ prepareStreamsToUpload();\r
+ mAccountManager = (AccountManager) getSystemService(Context.ACCOUNT_SERVICE);\r
+ Account[] accounts = mAccountManager.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE);\r
+ if (accounts.length == 0) {\r
+ Log.i(TAG, "No ownCloud account is available");\r
+ showDialog(DIALOG_NO_ACCOUNT);\r
+ } else if (accounts.length > 1) {\r
+ Log.i(TAG, "More then one ownCloud is available");\r
+ showDialog(DIALOG_MULTIPLE_ACCOUNT);\r
+ } else {\r
+ mAccount = accounts[0];\r
+ setContentView(R.layout.uploader_layout);\r
+ mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());\r
+ populateDirectoryList();\r
+ }\r
+ } else {\r
+ showDialog(DIALOG_NO_STREAM);\r
+ }\r
+ }\r
+ \r
+ @Override\r
+ protected Dialog onCreateDialog(final int id) {\r
+ final AlertDialog.Builder builder = new Builder(this);\r
+ switch (id) {\r
+ case DIALOG_WAITING:\r
+ ProgressDialog pDialog = new ProgressDialog(this);\r
+ pDialog.setIndeterminate(false);\r
+ pDialog.setCancelable(false);\r
+ pDialog.setMessage(getResources().getString(R.string.uploader_info_uploading));\r
+ return pDialog;\r
+ case DIALOG_NO_ACCOUNT:\r
+ builder.setIcon(android.R.drawable.ic_dialog_alert);\r
+ builder.setTitle(R.string.uploader_wrn_no_account_title);\r
+ builder.setMessage(R.string.uploader_wrn_no_account_text);\r
+ builder.setCancelable(false);\r
+ builder.setPositiveButton(R.string.uploader_wrn_no_account_setup_btn_text, new OnClickListener() {\r
+ public void onClick(DialogInterface dialog, int which) {\r
+ if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.ECLAIR_MR1) {\r
+ // using string value since in API7 this\r
+ // constatn is not defined\r
+ // in API7 < this constatant is defined in\r
+ // Settings.ADD_ACCOUNT_SETTINGS\r
+ // and Settings.EXTRA_AUTHORITIES\r
+ Intent intent = new Intent("android.settings.ADD_ACCOUNT_SETTINGS");\r
+ intent.putExtra("authorities", new String[] { AccountAuthenticator.AUTH_TOKEN_TYPE });\r
+ startActivityForResult(intent, REQUEST_CODE_SETUP_ACCOUNT);\r
+ } else {\r
+ // since in API7 there is no direct call for\r
+ // account setup, so we need to\r
+ // show our own AccountSetupAcricity, get\r
+ // desired results and setup\r
+ // everything for ourself\r
+ Intent intent = new Intent(getBaseContext(), AccountAuthenticator.class);\r
+ startActivityForResult(intent, REQUEST_CODE_SETUP_ACCOUNT);\r
+ }\r
+ }\r
+ });\r
+ builder.setNegativeButton(R.string.uploader_wrn_no_account_quit_btn_text, new OnClickListener() {\r
+ public void onClick(DialogInterface dialog, int which) {\r
+ finish();\r
+ }\r
+ });\r
+ return builder.create();\r
+ /*case DIALOG_GET_DIRNAME:\r
+ final EditText dirName = new EditText(getBaseContext());\r
+ builder.setView(dirName);\r
+ builder.setTitle(R.string.uploader_info_dirname);\r
+ String pathToUpload;\r
+ if (mParents.empty()) {\r
+ pathToUpload = "/";\r
+ } else {\r
+ mCursor = managedQuery(Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_FILE, mParents.peek()), null,\r
+ null, null, null);\r
+ mCursor.moveToFirst();\r
+ pathToUpload = mCursor.getString(mCursor.getColumnIndex(ProviderTableMeta.FILE_PATH))\r
+ + mCursor.getString(mCursor.getColumnIndex(ProviderTableMeta.FILE_NAME)).replace(" ", "%20"); // TODO don't make this ; use WebdavUtils.encode in the right moment\r
+ }\r
+ a a = new a(pathToUpload, dirName);\r
+ builder.setPositiveButton(R.string.common_ok, a);\r
+ builder.setNegativeButton(R.string.common_cancel, new OnClickListener() {\r
+ public void onClick(DialogInterface dialog, int which) {\r
+ dialog.cancel();\r
+ }\r
+ });\r
+ return builder.create();*/\r
+ case DIALOG_MULTIPLE_ACCOUNT:\r
+ CharSequence ac[] = new CharSequence[mAccountManager.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE).length];\r
+ for (int i = 0; i < ac.length; ++i) {\r
+ ac[i] = mAccountManager.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE)[i].name;\r
+ }\r
+ builder.setTitle(R.string.common_choose_account);\r
+ builder.setItems(ac, new OnClickListener() {\r
+ public void onClick(DialogInterface dialog, int which) {\r
+ mAccount = mAccountManager.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE)[which];\r
+ mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());\r
+ populateDirectoryList();\r
+ }\r
+ });\r
+ builder.setCancelable(true);\r
+ builder.setOnCancelListener(new OnCancelListener() {\r
+ public void onCancel(DialogInterface dialog) {\r
+ dialog.cancel();\r
+ finish();\r
+ }\r
+ });\r
+ return builder.create();\r
+ default:\r
+ throw new IllegalArgumentException("Unknown dialog id: " + id);\r
+ }\r
+ }\r
+\r
+ class a implements OnClickListener {\r
+ String mPath;\r
+ EditText mDirname;\r
+\r
+ public a(String path, EditText dirname) {\r
+ mPath = path; \r
+ mDirname = dirname;\r
+ }\r
+\r
+ public void onClick(DialogInterface dialog, int which) {\r
+ Uploader.this.mUploadPath = mPath + mDirname.getText().toString();\r
+ Uploader.this.mCreateDir = true;\r
+ uploadFiles();\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void onBackPressed() {\r
+\r
+ if (mParents.size() <= 1) {\r
+ super.onBackPressed();\r
+ return;\r
+ } else {\r
+ mParents.pop();\r
+ populateDirectoryList();\r
+ }\r
+ }\r
+\r
+ public void onItemClick(AdapterView<?> parent, View view, int position, long id) {\r
+ // click on folder in the list\r
+ Log.d(TAG, "on item click");\r
+ Vector<OCFile> tmpfiles = mStorageManager.getDirectoryContent(mFile);\r
+ if (tmpfiles == null) return;\r
+ // filter on dirtype\r
+ Vector<OCFile> files = new Vector<OCFile>();\r
+ for (OCFile f : tmpfiles)\r
+ if (f.isDirectory())\r
+ files.add(f);\r
+ if (files.size() < position) {\r
+ throw new IndexOutOfBoundsException("Incorrect item selected");\r
+ }\r
+ mParents.push(files.get(position).getFileName());\r
+ populateDirectoryList();\r
+ }\r
+\r
+ public void onClick(View v) {\r
+ // click on button\r
+ switch (v.getId()) {\r
+ case R.id.uploader_choose_folder:\r
+ mUploadPath = ""; // first element in mParents is root dir, represented by ""; init mUploadPath with "/" results in a "//" prefix\r
+ for (String p : mParents)\r
+ mUploadPath += p + OCFile.PATH_SEPARATOR;\r
+ Log.d(TAG, "Uploading file to dir " + mUploadPath);\r
+\r
+ uploadFiles();\r
+\r
+ break;\r
+ case android.R.id.button1: // dynamic action for create aditional dir\r
+ showDialog(DIALOG_GET_DIRNAME);\r
+ break;\r
+ default:\r
+ throw new IllegalArgumentException("Wrong element clicked");\r
+ }\r
+ }\r
+\r
+ @Override\r
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {\r
+ super.onActivityResult(requestCode, resultCode, data);\r
+ Log.i(TAG, "result received. req: " + requestCode + " res: " + resultCode);\r
+ if (requestCode == REQUEST_CODE_SETUP_ACCOUNT) {\r
+ dismissDialog(DIALOG_NO_ACCOUNT);\r
+ if (resultCode == RESULT_CANCELED) {\r
+ finish();\r
+ }\r
+ Account[] accounts = mAccountManager.getAccountsByType(AccountAuthenticator.AUTH_TOKEN_TYPE);\r
+ if (accounts.length == 0) {\r
+ showDialog(DIALOG_NO_ACCOUNT);\r
+ } else {\r
+ // there is no need for checking for is there more then one\r
+ // account at this point\r
+ // since account setup can set only one account at time\r
+ mAccount = accounts[0];\r
+ populateDirectoryList();\r
+ }\r
+ }\r
+ }\r
+\r
+ private void populateDirectoryList() {\r
+ setContentView(R.layout.uploader_layout);\r
+\r
+ String full_path = "";\r
+ for (String a : mParents)\r
+ full_path += a + "/";\r
+ \r
+ Log.d(TAG, "Populating view with content of : " + full_path);\r
+ \r
+ mFile = mStorageManager.getFileByPath(full_path);\r
+ if (mFile != null) {\r
+ Vector<OCFile> files = mStorageManager.getDirectoryContent(mFile);\r
+ if (files != null) {\r
+ List<HashMap<String, Object>> data = new LinkedList<HashMap<String,Object>>();\r
+ for (OCFile f : files) {\r
+ HashMap<String, Object> h = new HashMap<String, Object>();\r
+ if (f.isDirectory()) {\r
+ h.put("dirname", f.getFileName());\r
+ data.add(h);\r
+ }\r
+ }\r
+ SimpleAdapter sa = new SimpleAdapter(this,\r
+ data,\r
+ R.layout.uploader_list_item_layout,\r
+ new String[] {"dirname"},\r
+ new int[] {R.id.textView1});\r
+ setListAdapter(sa);\r
+ Button btn = (Button) findViewById(R.id.uploader_choose_folder);\r
+ btn.setOnClickListener(this);\r
+ getListView().setOnItemClickListener(this);\r
+ }\r
+ }\r
+ /*\r
+ mCursor = managedQuery(ProviderMeta.ProviderTableMeta.CONTENT_URI, null, ProviderTableMeta.FILE_NAME\r
+ + "=? AND " + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=?", new String[] { "/", mAccount.name }, null);\r
+\r
+ if (mCursor.moveToFirst()) {\r
+ mCursor = managedQuery(\r
+ ProviderMeta.ProviderTableMeta.CONTENT_URI,\r
+ null,\r
+ ProviderTableMeta.FILE_CONTENT_TYPE + "=? AND " + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND "\r
+ + ProviderTableMeta.FILE_PARENT + "=?",\r
+ new String[] { "DIR", mAccount.name,\r
+ mCursor.getString(mCursor.getColumnIndex(ProviderTableMeta._ID)) }, null);\r
+\r
+ ListView lv = getListView();\r
+ lv.setOnItemClickListener(this);\r
+ SimpleCursorAdapter sca = new SimpleCursorAdapter(this, R.layout.uploader_list_item_layout, mCursor,\r
+ new String[] { ProviderTableMeta.FILE_NAME }, new int[] { R.id.textView1 });\r
+ setListAdapter(sca);\r
+ Button btn = (Button) findViewById(R.id.uploader_choose_folder);\r
+ btn.setOnClickListener(this);\r
+ /*\r
+ * disable this until new server interaction service wont be created\r
+ * // insert create new directory for multiple items uploading if\r
+ * (getIntent().getAction().equals(Intent.ACTION_SEND_MULTIPLE)) {\r
+ * Button createDirBtn = new Button(this);\r
+ * createDirBtn.setId(android.R.id.button1);\r
+ * createDirBtn.setText(R.string.uploader_btn_create_dir_text);\r
+ * createDirBtn.setOnClickListener(this); ((LinearLayout)\r
+ * findViewById(R.id.linearLayout1)).addView( createDirBtn,\r
+ * LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); }\r
+ *\r
+ }*/\r
+ }\r
+\r
+ private void prepareStreamsToUpload() {\r
+ if (getIntent().getAction().equals(Intent.ACTION_SEND)) {\r
+ mStreamsToUpload = new ArrayList<Parcelable>();\r
+ mStreamsToUpload.add(getIntent().getParcelableExtra(Intent.EXTRA_STREAM));\r
+ } else if (getIntent().getAction().equals(Intent.ACTION_SEND_MULTIPLE)) {\r
+ mStreamsToUpload = getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM);\r
+ } else {\r
+ // unknow action inserted\r
+ throw new IllegalArgumentException("Unknown action given: " + getIntent().getAction());\r
+ }\r
+ }\r
+\r
+ public void uploadFiles() {\r
+ WebdavClient wdc = new WebdavClient(mAccount, getApplicationContext());\r
+ wdc.allowSelfsignedCertificates();\r
+\r
+ // create last directory in path if nessesary\r
+ if (mCreateDir) {\r
+ wdc.createDirectory(mUploadPath);\r
+ }\r
+\r
+ String[] local = new String[mStreamsToUpload.size()], remote = new String[mStreamsToUpload.size()];\r
+\r
+ for (int i = 0; i < mStreamsToUpload.size(); ++i) {\r
+ Uri uri = (Uri) mStreamsToUpload.get(i);\r
+ if (uri.getScheme().equals("content")) {\r
+ Cursor c = getContentResolver().query((Uri) mStreamsToUpload.get(i),\r
+ CONTENT_PROJECTION,\r
+ null,\r
+ null,\r
+ null);\r
+\r
+ if (!c.moveToFirst())\r
+ continue;\r
+\r
+ final String display_name = c.getString(c.getColumnIndex(Media.DISPLAY_NAME)),\r
+ data = c.getString(c.getColumnIndex(Media.DATA));\r
+ local[i] = data;\r
+ remote[i] = mUploadPath + display_name;\r
+ } else if (uri.getScheme().equals("file")) {\r
+ final File file = new File(Uri.decode(uri.toString()).replace(uri.getScheme() + "://", ""));\r
+ local[i] = file.getAbsolutePath();\r
+ remote[i] = mUploadPath + file.getName();\r
+ }\r
+\r
+ }\r
+ Intent intent = new Intent(getApplicationContext(), FileUploader.class);\r
+ intent.putExtra(FileUploader.KEY_UPLOAD_TYPE, FileUploader.UPLOAD_MULTIPLE_FILES);\r
+ intent.putExtra(FileUploader.KEY_LOCAL_FILE, local);\r
+ intent.putExtra(FileUploader.KEY_REMOTE_FILE, remote);\r
+ intent.putExtra(FileUploader.KEY_ACCOUNT, mAccount);\r
+ startService(intent);\r
+ finish();\r
+ }\r
+\r
+}\r