Bladeren bron

handle dir creation from filelist

Bartek Przybylski 13 jaren geleden
bovenliggende
commit
d8d535a0a2

+ 1 - 1
res/menu/menu.xml

@@ -2,5 +2,5 @@
 <menu
   xmlns:android="http://schemas.android.com/apk/res/android">
     <item android:title="Settings" android:icon="@android:drawable/ic_menu_preferences" android:id="@+id/settingsItem"></item>
-    <item android:id="@+id/item1" android:title="Create Directory" android:icon="@android:drawable/ic_menu_add"></item>
+    <item android:id="@+id/createDirectoryItem" android:title="Create Directory" android:icon="@android:drawable/ic_menu_add"></item>
 </menu>

+ 28 - 0
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;

+ 79 - 1
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);
+    }
+    
+  }
 }