version bump for GP
[pub/Android/ownCloud.git] / src / eu / alefzero / owncloud / Uploader.java
index a63010a..523db94 100644 (file)
@@ -19,20 +19,24 @@ package eu.alefzero.owncloud;
 \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.app.AlertDialog.Builder;\r
 import android.content.Context;\r
 import android.content.DialogInterface;\r
-import android.content.Intent;\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
@@ -42,16 +46,15 @@ import android.util.Log;
 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.ListView;\r
-import android.widget.SimpleCursorAdapter;\r
-import android.widget.AdapterView.OnItemClickListener;\r
+import android.widget.SimpleAdapter;\r
 import eu.alefzero.owncloud.authenticator.AccountAuthenticator;\r
-import eu.alefzero.owncloud.db.ProviderMeta;\r
-import eu.alefzero.owncloud.db.ProviderMeta.ProviderTableMeta;\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.owncloud.utils.OwnCloudVersion;\r
 import eu.alefzero.webdav.WebdavClient;\r
 \r
 /**\r
@@ -65,13 +68,13 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
 \r
     private Account mAccount;\r
     private AccountManager mAccountManager;\r
-    private String mUsername, mPassword;\r
-    private Cursor mCursor;\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
@@ -86,6 +89,7 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
         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
@@ -99,13 +103,14 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
             } 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
+    \r
     @Override\r
     protected Dialog onCreateDialog(final int id) {\r
         final AlertDialog.Builder builder = new Builder(this);\r
@@ -149,7 +154,7 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
                 }\r
             });\r
             return builder.create();\r
-        case DIALOG_GET_DIRNAME:\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
@@ -161,7 +166,7 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
                         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");\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
@@ -170,7 +175,7 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
                     dialog.cancel();\r
                 }\r
             });\r
-            return builder.create();\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
@@ -180,6 +185,7 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
             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
@@ -201,7 +207,7 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
         EditText mDirname;\r
 \r
         public a(String path, EditText dirname) {\r
-            mPath = path;\r
+            mPath = path; \r
             mDirname = dirname;\r
         }\r
 \r
@@ -215,57 +221,41 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
     @Override\r
     public void onBackPressed() {\r
 \r
-        if (mParents.size() == 0) {\r
+        if (mParents.size() <= 1) {\r
             super.onBackPressed();\r
             return;\r
-        } else if (mParents.size() == 1) {\r
-            mParents.pop();\r
-            mCursor = managedQuery(ProviderTableMeta.CONTENT_URI, null, ProviderTableMeta.FILE_CONTENT_TYPE + "=?",\r
-                    new String[] { "DIR" }, null);\r
         } else {\r
             mParents.pop();\r
-            mCursor = managedQuery(Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_DIR, mParents.peek()), null,\r
-                    ProviderTableMeta.FILE_CONTENT_TYPE + "=?", new String[] { "DIR" }, null);\r
+            populateDirectoryList();\r
         }\r
-\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
     }\r
 \r
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {\r
-        if (!mCursor.moveToPosition(position)) {\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
-        String _id = mCursor.getString(mCursor.getColumnIndex(ProviderTableMeta._ID));\r
-        mParents.push(_id);\r
-\r
-        mCursor.close();\r
-        mCursor = managedQuery(Uri.withAppendedPath(ProviderTableMeta.CONTENT_URI_DIR, _id), null,\r
-                ProviderTableMeta.FILE_CONTENT_TYPE + "=?", new String[] { "DIR" }, null);\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
-        getListView().invalidate();\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
-            String pathToUpload = null;\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)).replace(" ",\r
-                        "%20");\r
-            }\r
-            Log.d(TAG, "Uploading file to dir " + pathToUpload);\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
-            mUploadPath = pathToUpload;\r
-            mCreateDir = false;\r
             uploadFiles();\r
 \r
             break;\r
@@ -300,10 +290,38 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
     }\r
 \r
     private void populateDirectoryList() {\r
-        mUsername = mAccount.name.substring(0, mAccount.name.indexOf('@'));\r
-        mPassword = mAccountManager.getPassword(mAccount);\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
@@ -333,8 +351,8 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
              * createDirBtn.setOnClickListener(this); ((LinearLayout)\r
              * findViewById(R.id.linearLayout1)).addView( createDirBtn,\r
              * LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); }\r
-             */\r
-        }\r
+             *\r
+        }*/\r
     }\r
 \r
     private void prepareStreamsToUpload() {\r
@@ -350,15 +368,8 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
     }\r
 \r
     public void uploadFiles() {\r
-        OwnCloudVersion ocv = new OwnCloudVersion(mAccountManager.getUserData(mAccount,\r
-                AccountAuthenticator.KEY_OC_VERSION));\r
-        String base_url = mAccountManager.getUserData(mAccount, AccountAuthenticator.KEY_OC_BASE_URL);\r
-        String webdav_path = AccountUtils.getWebdavPath(ocv);\r
-        Uri oc_uri = Uri.parse(base_url + webdav_path);\r
-\r
-        WebdavClient wdc = new WebdavClient(oc_uri);\r
-        wdc.setCredentials(mUsername, mPassword);\r
-        wdc.allowUnsignedCertificates();\r
+        WebdavClient wdc = new WebdavClient(mAccount, getApplicationContext());\r
+        wdc.allowSelfsignedCertificates();\r
 \r
         // create last directory in path if nessesary\r
         if (mCreateDir) {\r
@@ -382,11 +393,11 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
                 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
+                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
+                remote[i] = mUploadPath + file.getName();\r
             }\r
 \r
         }\r