diff --git a/res/menu/menu.xml b/res/menu/menu.xml index b6d54d38b2..7ffd43ab51 100644 --- a/res/menu/menu.xml +++ b/res/menu/menu.xml @@ -2,5 +2,5 @@ - + diff --git a/src/eu/alefzero/owncloud/datamodel/OCFile.java b/src/eu/alefzero/owncloud/datamodel/OCFile.java index 57853c4060..045e9fa75e 100644 --- a/src/eu/alefzero/owncloud/datamodel/OCFile.java +++ b/src/eu/alefzero/owncloud/datamodel/OCFile.java @@ -74,6 +74,28 @@ public class OCFile { return new_file; } + public static OCFile createNewFile(ContentResolver contentResolver, Account a, + String path, int length, int creation_timestamp, int modified_timestamp, + String mimetype, long parent_id) { + OCFile new_file = new OCFile(contentResolver, a); + Cursor c = new_file.cr_.query(ProviderTableMeta.CONTENT_URI_FILE, null, + ProviderTableMeta.FILE_ACCOUNT_OWNER + "=? AND " + + ProviderTableMeta.FILE_PATH + "=?", new String[]{new_file.account_.name, + path}, null); + if (c.moveToFirst()) + new_file.setFileData(c); + c.close(); + + new_file.path_ = path; + new_file.length_ = length; + new_file.creation_timestamp_ = creation_timestamp; + new_file.modified_timestamp_ = modified_timestamp; + new_file.mimetype_ = mimetype; + new_file.parent_id_ = parent_id; + + return new_file; + } + public OCFile(ContentResolver cr, Account account, long id) { cr_ = cr; account_ = account; @@ -244,6 +266,12 @@ public class OCFile { cp_ = cp; resetData(); } + + private OCFile(ContentResolver cr, Account account) { + account_ = account; + cr_ = cr; + resetData(); + } private void resetData() { id_ = -1; diff --git a/src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java b/src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java index d138ee5890..a7546283bd 100644 --- a/src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java +++ b/src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java @@ -22,9 +22,12 @@ import android.accounts.Account; import android.accounts.AccountManager; import android.app.AlertDialog; import android.app.Dialog; +import android.app.AlertDialog.Builder; import android.content.DialogInterface; import android.content.DialogInterface.OnCancelListener; +import android.content.DialogInterface.OnClickListener; import android.content.Intent; +import android.net.Uri; import android.os.Bundle; import android.support.v4.app.ActionBar; import android.support.v4.app.ActionBar.OnNavigationListener; @@ -32,10 +35,12 @@ import android.support.v4.view.Menu; import android.support.v4.view.MenuItem; import android.view.MenuInflater; import android.widget.ArrayAdapter; +import android.widget.EditText; import eu.alefzero.owncloud.R; -import eu.alefzero.owncloud.R.id; import eu.alefzero.owncloud.authenticator.AccountAuthenticator; +import eu.alefzero.owncloud.datamodel.OCFile; import eu.alefzero.owncloud.ui.fragment.FileList; +import eu.alefzero.webdav.WebdavClient; /** * Displays, what files the user has available in his ownCloud. @@ -57,6 +62,46 @@ public class FileDisplayActivity extends android.support.v4.app.FragmentActivity return !mDirectories.isEmpty(); } + @Override + protected Dialog onCreateDialog(int id, Bundle args) { + final AlertDialog.Builder builder = new Builder(this); + final EditText dirName = new EditText(getBaseContext()); + builder.setView(dirName); + builder.setTitle(R.string.uploader_info_dirname); + + builder.setPositiveButton(R.string.common_ok, new OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + String s = dirName.getText().toString(); + if (s.trim().isEmpty()) { + dialog.cancel(); + return; + } + AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE); + // following account choosing is incorrect and needs to be replaced + // with some sort of session mechanism + Account a = am.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE)[0]; + + String path = ""; + for (int i = mDirectories.getCount()-2; i >= 0; --i) { + path += "/" + mDirectories.getItem(i); + } + OCFile parent = new OCFile(getContentResolver(), a, path+"/"); + path += "/" + s + "/"; + Thread thread = new Thread(new DirectoryCreator(path, a, am)); + thread.start(); + OCFile.createNewFile(getContentResolver(), a, path, 0, 0, 0, "DIR", parent.getFileId()).save(); + + dialog.dismiss(); + } + }); + builder.setNegativeButton(R.string.common_cancel, new OnClickListener() { + public void onClick(DialogInterface dialog, int which) { + dialog.cancel(); + } + }); + return builder.create(); + } + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -73,9 +118,16 @@ public class FileDisplayActivity extends android.support.v4.app.FragmentActivity public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.settingsItem : + { Intent i = new Intent(this, Preferences.class); startActivity(i); break; + } + case R.id.createDirectoryItem: + { + showDialog(0); + break; + } } return true; } @@ -142,4 +194,30 @@ public class FileDisplayActivity extends android.support.v4.app.FragmentActivity } ((FileList)getSupportFragmentManager().findFragmentById(R.id.fileList)).onBackPressed(); } + + private class DirectoryCreator implements Runnable { + private String mTargetPath; + private Account mAccount; + private AccountManager mAm; + + public DirectoryCreator(String targetPath, Account account, AccountManager am) { + mTargetPath = targetPath; + mAccount = account; + mAm = am; + } + + @Override + public void run() { + WebdavClient wdc = new WebdavClient(Uri.parse(mAm.getUserData(mAccount, + AccountAuthenticator.KEY_OC_URL))); + + String username = mAccount.name.substring(0, mAccount.name.lastIndexOf('@')); + String password = mAm.getPassword(mAccount); + + wdc.setCredentials(username, password); + wdc.allowUnsignedCertificates(); + wdc.createDirectory(mTargetPath); + } + + } } \ No newline at end of file