Adding cancellation to uploads (WIP)
[pub/Android/ownCloud.git] / src / com / owncloud / android / Uploader.java
index 718911d..7b66149 100644 (file)
@@ -30,6 +30,7 @@ import com.owncloud.android.datamodel.DataStorageManager;
 import com.owncloud.android.datamodel.FileDataStorageManager;\r
 import com.owncloud.android.datamodel.OCFile;\r
 import com.owncloud.android.files.services.FileUploader;\r
+import com.owncloud.android.network.OwnCloudClientUtils;\r
 \r
 import android.accounts.Account;\r
 import android.accounts.AccountManager;\r
@@ -56,6 +57,8 @@ import android.widget.AdapterView.OnItemClickListener;
 import android.widget.Button;\r
 import android.widget.EditText;\r
 import android.widget.SimpleAdapter;\r
+import android.widget.Toast;\r
+\r
 import com.owncloud.android.R;\r
 import eu.alefzero.webdav.WebdavClient;\r
 \r
@@ -82,7 +85,7 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
     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
+    //private final static int DIALOG_GET_DIRNAME = 4;\r
 \r
     private final static int REQUEST_CODE_SETUP_ACCOUNT = 0;\r
 \r
@@ -92,8 +95,9 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
         getWindow().requestFeature(Window.FEATURE_NO_TITLE);\r
         mParents = new Stack<String>();\r
         mParents.add("");\r
-        if (getIntent().hasExtra(Intent.EXTRA_STREAM)) {\r
-            prepareStreamsToUpload();\r
+        /*if (getIntent().hasExtra(Intent.EXTRA_STREAM)) {\r
+            prepareStreamsToUpload();*/\r
+        if (prepareStreamsToUpload()) {\r
             mAccountManager = (AccountManager) getSystemService(Context.ACCOUNT_SERVICE);\r
             Account[] accounts = mAccountManager.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE);\r
             if (accounts.length == 0) {\r
@@ -104,7 +108,6 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
                 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
@@ -129,6 +132,7 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
             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
+                @Override\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
@@ -151,6 +155,7 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
                 }\r
             });\r
             builder.setNegativeButton(R.string.uploader_wrn_no_account_quit_btn_text, new OnClickListener() {\r
+                @Override\r
                 public void onClick(DialogInterface dialog, int which) {\r
                     finish();\r
                 }\r
@@ -185,6 +190,7 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
             }\r
             builder.setTitle(R.string.common_choose_account);\r
             builder.setItems(ac, new OnClickListener() {\r
+                @Override\r
                 public void onClick(DialogInterface dialog, int which) {\r
                     mAccount = mAccountManager.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE)[which];\r
                     mStorageManager = new FileDataStorageManager(mAccount, getContentResolver());\r
@@ -193,12 +199,25 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
             });\r
             builder.setCancelable(true);\r
             builder.setOnCancelListener(new OnCancelListener() {\r
+                @Override\r
                 public void onCancel(DialogInterface dialog) {\r
                     dialog.cancel();\r
                     finish();\r
                 }\r
             });\r
             return builder.create();\r
+        case DIALOG_NO_STREAM:\r
+            builder.setIcon(android.R.drawable.ic_dialog_alert);\r
+            builder.setTitle(R.string.uploader_wrn_no_content_title);\r
+            builder.setMessage(R.string.uploader_wrn_no_content_text);\r
+            builder.setCancelable(false);\r
+            builder.setNegativeButton(R.string.common_cancel, new OnClickListener() {\r
+                @Override\r
+                public void onClick(DialogInterface dialog, int which) {\r
+                    finish();\r
+                }\r
+            });\r
+            return builder.create();\r
         default:\r
             throw new IllegalArgumentException("Unknown dialog id: " + id);\r
         }\r
@@ -213,6 +232,7 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
             mDirname = dirname;\r
         }\r
 \r
+        @Override\r
         public void onClick(DialogInterface dialog, int which) {\r
             Uploader.this.mUploadPath = mPath + mDirname.getText().toString();\r
             Uploader.this.mCreateDir = true;\r
@@ -232,6 +252,7 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
         }\r
     }\r
 \r
+    @Override\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
@@ -249,6 +270,7 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
         populateDirectoryList();\r
     }\r
 \r
+    @Override\r
     public void onClick(View v) {\r
         // click on button\r
         switch (v.getId()) {\r
@@ -261,9 +283,9 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
             uploadFiles();\r
 \r
             break;\r
-        case android.R.id.button1: // dynamic action for create aditional dir\r
+        /*case android.R.id.button1: // dynamic action for create aditional dir\r
             showDialog(DIALOG_GET_DIRNAME);\r
-            break;\r
+            break;*/\r
         default:\r
             throw new IllegalArgumentException("Wrong element clicked");\r
         }\r
@@ -357,59 +379,61 @@ public class Uploader extends ListActivity implements OnItemClickListener, andro
         }*/\r
     }\r
 \r
-    private void prepareStreamsToUpload() {\r
+    private boolean 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
+        return (mStreamsToUpload != null && mStreamsToUpload.get(0) != null);\r
     }\r
 \r
     public void uploadFiles() {\r
-        WebdavClient wdc = new WebdavClient(mAccount, getApplicationContext());\r
-        wdc.allowSelfsignedCertificates();\r
+        try {\r
+            WebdavClient wdc = OwnCloudClientUtils.createOwnCloudClient(mAccount, getApplicationContext());\r
 \r
-        // create last directory in path if nessesary\r
-        if (mCreateDir) {\r
-            wdc.createDirectory(mUploadPath);\r
-        }\r
+            // create last directory in path if necessary\r
+            if (mCreateDir) {\r
+                wdc.createDirectory(mUploadPath);\r
+            }\r
 \r
-        String[] local = new String[mStreamsToUpload.size()], remote = new String[mStreamsToUpload.size()];\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
+            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
+                    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
+        } catch (SecurityException e) {\r
+            Toast.makeText(this, getString(R.string.uploader_error_forbidden_content), Toast.LENGTH_LONG).show();\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