keep file in sync and initial commit for file sharing
authorBartek Przybylski <bart.p.pl@gmail.com>
Sun, 8 Jul 2012 14:57:48 +0000 (16:57 +0200)
committerBartek Przybylski <bart.p.pl@gmail.com>
Sun, 8 Jul 2012 14:57:48 +0000 (16:57 +0200)
14 files changed:
res/drawable/ic_favorite.png [new file with mode: 0644]
res/layout/file_details_fragment.xml
res/layout/list_layout.xml
res/values/strings.xml
src/eu/alefzero/owncloud/CrashlogSendActivity.java
src/eu/alefzero/owncloud/datamodel/FileDataStorageManager.java
src/eu/alefzero/owncloud/datamodel/OCFile.java
src/eu/alefzero/owncloud/db/ProviderMeta.java
src/eu/alefzero/owncloud/providers/FileContentProvider.java
src/eu/alefzero/owncloud/syncadapter/FileSyncAdapter.java
src/eu/alefzero/owncloud/ui/activity/FileDisplayActivity.java
src/eu/alefzero/owncloud/ui/adapter/FileListListAdapter.java
src/eu/alefzero/owncloud/ui/fragment/FileDetailFragment.java
src/eu/alefzero/webdav/WebdavClient.java

diff --git a/res/drawable/ic_favorite.png b/res/drawable/ic_favorite.png
new file mode 100644 (file)
index 0000000..27edbd4
Binary files /dev/null and b/res/drawable/ic_favorite.png differ
index 777f244..9198e3f 100644 (file)
                 android:id="@+id/fdPreviewAndDL"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_below="@+id/fdDetailsContainer" >
+                android:layout_below="@+id/fdDetailsContainer"
+                android:gravity="center_horizontal" >
+
+                <CheckBox
+                    android:id="@+id/fdKeepInSync"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_centerHorizontal="true"
+                    android:text="@string/fd_keep_in_sync" />
 
                 <ImageView
                     android:id="@+id/fdPreview"
                     android:layout_width="match_parent"
                     android:layout_height="match_parent"
+                    android:layout_below="@id/fdKeepInSync"
                     android:layout_centerHorizontal="true"
                     android:layout_marginTop="16dp"
                     android:src="@drawable/owncloud_logo" />
 
-                <Button
-                    android:id="@+id/fdDownloadBtn"
-                    android:layout_width="wrap_content"
+                <LinearLayout
+                    android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:layout_centerHorizontal="true"
-                    android:layout_below="@+id/fdPreview"
-                    android:layout_marginTop="12dp"
-                    android:text="@string/filedetails_download" />
+                    android:layout_below="@id/fdPreview"
+                    android:gravity="center_horizontal" >
+
+                    <Button
+                        android:id="@+id/fdDownloadBtn"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="12dp"
+                        android:text="@string/filedetails_download" />
+
+                    <Button
+                        android:id="@+id/fdRemoveBtn"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="12dp"
+                        android:text="Remove" />
+<!-- 
+                    <Button
+                        android:id="@+id/fdShareBtn"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="12dp"
+                        android:text="@string/common_share" />
+ -->
+                </LinearLayout>
             </RelativeLayout>
+
         </RelativeLayout>
     </ScrollView>
 
index a8a101d..bf6dade 100644 (file)
             android:layout_gravity="center_vertical|center"
             android:layout_margin="4dp"
             android:src="@drawable/ic_menu_archive" />
+
+        <ImageView
+            android:id="@+id/imageView3"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="bottom"
+            android:layout_weight=".1"
+            android:maxHeight="15dip"
+            android:src="@drawable/ic_favorite" />
         
     </FrameLayout>
 
index 7c47342..e28d058 100644 (file)
     
     <string name="extensions_avail_title">Extensions available!</string>
     <string name="extensions_avail_message">Looks like your ownCloud instance is supporting advanced extensions. Would you like to see extensions available for android ?</string>
+    <string name="fd_keep_in_sync">Keep file up to date</string>
+    <string name="common_share">Share</string>
 </resources>
index fd0c58d..9ff83f6 100644 (file)
@@ -43,7 +43,7 @@ import eu.alefzero.webdav.FileRequestEntity;
 public class CrashlogSendActivity extends SherlockActivity implements OnClickListener, OnCancelListener {
     
     private static final String TAG = "CrashlogSendActivity";
-    private static final String CRASHLOG_SUBMIT_URL = "";
+    private static final String CRASHLOG_SUBMIT_URL = "http://alefzero.eu/a/crashlog/";
     private static final int DIALOG_SUBMIT = 5;
     
     private String mLogFilename;
index 0ad0d1b..1feb424 100644 (file)
@@ -101,6 +101,7 @@ public class FileDataStorageManager implements DataStorageManager {
             cv.put(ProviderTableMeta.FILE_STORAGE_PATH, file.getStoragePath());
         cv.put(ProviderTableMeta.FILE_ACCOUNT_OWNER, mAccount.name);
         cv.put(ProviderTableMeta.FILE_LAST_SYNC_DATE, file.getLastSyncDate());
+        cv.put(ProviderTableMeta.FILE_KEEP_IN_SYNC, file.keepInSync() ? 1 : 0);
 
         if (fileExists(file.getRemotePath())) {
             OCFile tmpfile = getFileByPath(file.getRemotePath());
@@ -303,6 +304,8 @@ public class FileDataStorageManager implements DataStorageManager {
                     .getColumnIndex(ProviderTableMeta.FILE_MODIFIED)));
             file.setLastSyncDate(c.getLong(c
                     .getColumnIndex(ProviderTableMeta.FILE_LAST_SYNC_DATE)));
+            file.setKeepInSync(c.getInt(
+                                c.getColumnIndex(ProviderTableMeta.FILE_KEEP_IN_SYNC)) == 1 ? true : false);
         }
         return file;
     }
index ca454d1..ce9c03b 100644 (file)
@@ -50,6 +50,7 @@ public class OCFile implements Parcelable, Comparable<OCFile> {
     private String mMimeType;
     private boolean mNeedsUpdating;
     private long mLastSyncDate;
+    private boolean mKeepInSync;
 
     /**
      * Create new {@link OCFile} with given path
@@ -87,8 +88,25 @@ public class OCFile implements Parcelable, Comparable<OCFile> {
         mLocalPath = source.readString();
         mMimeType = source.readString();
         mNeedsUpdating = source.readInt() == 0;
+        mKeepInSync = source.readInt() == 1;
+        mLastSyncDate = source.readLong();
     }
 
+    @Override
+    public void writeToParcel(Parcel dest, int flags) {
+        dest.writeLong(mId);
+        dest.writeLong(mParentId);
+        dest.writeLong(mLength);
+        dest.writeLong(mCreationTimestamp);
+        dest.writeLong(mModifiedTimestamp);
+        dest.writeString(mRemotePath);
+        dest.writeString(mLocalPath);
+        dest.writeString(mMimeType);
+        dest.writeInt(mNeedsUpdating ? 1 : 0);
+        dest.writeInt(mKeepInSync ? 1 : 0);
+        dest.writeLong(mLastSyncDate);
+    }
+    
     /**
      * Gets the ID of the file
      * 
@@ -248,6 +266,8 @@ public class OCFile implements Parcelable, Comparable<OCFile> {
         mCreationTimestamp = 0;
         mModifiedTimestamp = 0;
         mLastSyncDate = 0;
+        mKeepInSync = false;
+        mNeedsUpdating = false;
     }
 
     /**
@@ -321,26 +341,20 @@ public class OCFile implements Parcelable, Comparable<OCFile> {
         mLastSyncDate = lastSyncDate;
     }
 
+    public void setKeepInSync(boolean keepInSync) {
+        mKeepInSync = keepInSync;
+    }
+    
+    public boolean keepInSync() {
+        return mKeepInSync;
+    }
+    
     @Override
     public int describeContents() {
         return this.hashCode();
     }
 
     @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeLong(mId);
-        dest.writeLong(mParentId);
-        dest.writeLong(mLength);
-        dest.writeLong(mCreationTimestamp);
-        dest.writeLong(mModifiedTimestamp);
-        dest.writeString(mRemotePath);
-        dest.writeString(mLocalPath);
-        dest.writeString(mMimeType);
-        dest.writeInt(mNeedsUpdating ? 1 : 0);
-        dest.writeLong(mLastSyncDate);
-    }
-
-    @Override
     public int compareTo(OCFile another) {
         if (isDirectory() && another.isDirectory()) {
             return getRemotePath().toLowerCase().compareTo(another.getRemotePath().toLowerCase());
index 79f285a..62c0ace 100644 (file)
@@ -31,7 +31,7 @@ public class ProviderMeta {
     public static final String AUTHORITY_FILES = "org.owncloud";\r
     public static final String DB_FILE = "owncloud.db";\r
     public static final String DB_NAME = "filelist";\r
-    public static final int DB_VERSION = 1;\r
+    public static final int DB_VERSION = 2;\r
 \r
     private ProviderMeta() {\r
     }\r
@@ -58,6 +58,7 @@ public class ProviderMeta {
         public static final String FILE_PATH = "path";\r
         public static final String FILE_ACCOUNT_OWNER = "file_owner";\r
         public static final String FILE_LAST_SYNC_DATE = "last_sync_date";\r
+        public static final String FILE_KEEP_IN_SYNC = "keep_in_sync";\r
 \r
         public static final String DEFAULT_SORT_ORDER = FILE_NAME\r
                 + " collate nocase asc";\r
index b54aa21..160476a 100644 (file)
@@ -35,6 +35,7 @@ import android.database.sqlite.SQLiteOpenHelper;
 import android.database.sqlite.SQLiteQueryBuilder;\r
 import android.net.Uri;\r
 import android.text.TextUtils;\r
+import android.util.Log;\r
 \r
 /**\r
  * The ContentProvider for the ownCloud App.\r
@@ -68,6 +69,8 @@ public class FileContentProvider extends ContentProvider {
                 ProviderTableMeta.FILE_STORAGE_PATH);\r
         mProjectionMap.put(ProviderTableMeta.FILE_LAST_SYNC_DATE,\r
                 ProviderTableMeta.FILE_LAST_SYNC_DATE);\r
+        mProjectionMap.put(ProviderTableMeta.FILE_KEEP_IN_SYNC,\r
+                ProviderTableMeta.FILE_KEEP_IN_SYNC);\r
     }\r
 \r
     private static final int SINGLE_FILE = 1;\r
@@ -216,7 +219,11 @@ public class FileContentProvider extends ContentProvider {
 \r
         @Override\r
         public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {\r
-\r
+            if (oldVersion == 1 && newVersion >= 2) {\r
+                db.execSQL("ALTER TABLE " + ProviderTableMeta.DB_NAME +\r
+                           " ADD COLUMN " + ProviderTableMeta.FILE_KEEP_IN_SYNC  + " INTEGER " +\r
+                           " DEFAULT 0");\r
+            }\r
         }\r
 \r
     }\r
index d3b6fc2..73b74ed 100644 (file)
@@ -19,6 +19,7 @@
 package eu.alefzero.owncloud.syncadapter;\r
 \r
 import java.io.IOException;\r
+import java.io.ObjectInputStream.GetField;\r
 import java.util.Vector;\r
 \r
 import org.apache.jackrabbit.webdav.DavException;\r
@@ -36,6 +37,7 @@ import android.os.Bundle;
 import android.util.Log;\r
 import eu.alefzero.owncloud.datamodel.FileDataStorageManager;\r
 import eu.alefzero.owncloud.datamodel.OCFile;\r
+import eu.alefzero.owncloud.files.services.FileDownloader;\r
 import eu.alefzero.webdav.WebdavEntry;\r
 \r
 /**\r
@@ -118,6 +120,17 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
                 WebdavEntry we = new WebdavEntry(resp.getResponses()[i], getUri().getPath());\r
                 OCFile file = fillOCFile(we);\r
                 file.setParentId(parentId);\r
+                if (getStorageManager().getFileByPath(file.getRemotePath()) != null &&\r
+                    getStorageManager().getFileByPath(file.getRemotePath()).keepInSync() &&\r
+                    file.getModificationTimestamp() > getStorageManager().getFileByPath(file.getRemotePath())\r
+                                                                         .getModificationTimestamp()) {\r
+                    Intent intent = new Intent(this.getContext(), FileDownloader.class);\r
+                    intent.putExtra(FileDownloader.EXTRA_ACCOUNT, getAccount());\r
+                    intent.putExtra(FileDownloader.EXTRA_FILE_PATH, file.getURLDecodedRemotePath());\r
+                    intent.putExtra(FileDownloader.EXTRA_REMOTE_PATH, file.getRemotePath());\r
+                    file.setKeepInSync(true);\r
+                    getContext().startService(intent);\r
+                }\r
                 getStorageManager().saveFile(file);\r
                 if (parentId == 0)\r
                     parentId = file.getFileId();\r
index e0eccf9..1463759 100644 (file)
@@ -111,7 +111,7 @@ public class FileDisplayActivity extends SherlockFragmentActivity implements
         requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);\r
         setSupportProgressBarIndeterminateVisibility(false);\r
 \r
-        Thread.setDefaultUncaughtExceptionHandler(new CrashHandler(getApplicationContext()));\r
+//        Thread.setDefaultUncaughtExceptionHandler(new CrashHandler(getApplicationContext()));\r
 \r
         if(savedInstanceState != null) {\r
             mDirs = savedInstanceState.getStringArray(KEY_DIR_ARRAY);\r
index 6008d16..646a1ca 100644 (file)
@@ -120,9 +120,17 @@ public class FileListListAdapter implements ListAdapter {
                 view.findViewById(R.id.last_mod).setVisibility(View.VISIBLE);\r
                 ((TextView)view.findViewById(R.id.file_size)).setText(DisplayUtils.bytesToHumanReadable(file.getFileLength()));\r
                 ((TextView)view.findViewById(R.id.last_mod)).setText(DisplayUtils.unixTimeToHumanReadable(file.getModificationTimestamp()));\r
+                // this if-else is needed even thoe fav icon is visible by default\r
+                // because android reuses views in listview\r
+                if (!file.keepInSync()) {\r
+                    view.findViewById(R.id.imageView3).setVisibility(View.GONE);\r
+                } else {\r
+                    view.findViewById(R.id.imageView3).setVisibility(View.VISIBLE);\r
+                }\r
             } else {\r
                view.findViewById(R.id.file_size).setVisibility(View.GONE);\r
                view.findViewById(R.id.last_mod).setVisibility(View.GONE);\r
+               view.findViewById(R.id.imageView3).setVisibility(View.GONE);\r
             }\r
         }\r
 \r
index 505ff6c..a8f0d81 100644 (file)
  */\r
 package eu.alefzero.owncloud.ui.fragment;\r
 \r
+import java.io.IOException;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.apache.commons.httpclient.HostConfiguration;\r
+import org.apache.commons.httpclient.HttpException;\r
+import org.apache.commons.httpclient.cookie.CookiePolicy;\r
+import org.apache.commons.httpclient.methods.GetMethod;\r
+import org.apache.commons.httpclient.methods.PostMethod;\r
+import org.apache.commons.httpclient.methods.StringRequestEntity;\r
+import org.apache.commons.httpclient.params.HttpConnectionManagerParams;\r
+import org.apache.commons.httpclient.params.HttpMethodParams;\r
+import org.apache.http.HttpStatus;\r
+import org.apache.http.NameValuePair;\r
+import org.apache.http.client.utils.URLEncodedUtils;\r
+import org.apache.http.message.BasicNameValuePair;\r
+import org.apache.http.protocol.HTTP;\r
+import org.apache.jackrabbit.webdav.client.methods.PropFindMethod;\r
+import org.json.JSONException;\r
+import org.json.JSONObject;\r
+\r
 import android.accounts.Account;\r
 import android.accounts.AccountManager;\r
 import android.content.ActivityNotFoundException;\r
@@ -27,27 +48,36 @@ import android.content.IntentFilter;
 import android.graphics.Bitmap;\r
 import android.graphics.BitmapFactory;\r
 import android.graphics.BitmapFactory.Options;\r
+import android.graphics.Point;\r
 import android.graphics.drawable.BitmapDrawable;\r
 import android.graphics.drawable.Drawable;\r
 import android.net.Uri;\r
 import android.os.Bundle;\r
+import android.preference.PreferenceActivity.Header;\r
 import android.util.Log;\r
+import android.view.Display;\r
 import android.view.LayoutInflater;\r
 import android.view.View;\r
 import android.view.View.OnClickListener;\r
 import android.view.ViewGroup;\r
 import android.webkit.MimeTypeMap;\r
 import android.widget.Button;\r
+import android.widget.CheckBox;\r
 import android.widget.ImageView;\r
 import android.widget.TextView;\r
 import android.widget.Toast;\r
 \r
 import com.actionbarsherlock.app.SherlockFragment;\r
 \r
+import eu.alefzero.owncloud.AccountUtils;\r
 import eu.alefzero.owncloud.DisplayUtils;\r
 import eu.alefzero.owncloud.R;\r
+import eu.alefzero.owncloud.authenticator.AccountAuthenticator;\r
+import eu.alefzero.owncloud.datamodel.FileDataStorageManager;\r
 import eu.alefzero.owncloud.datamodel.OCFile;\r
 import eu.alefzero.owncloud.files.services.FileDownloader;\r
+import eu.alefzero.owncloud.utils.OwnCloudVersion;\r
+import eu.alefzero.webdav.WebdavClient;\r
 \r
 /**\r
  * This Fragment is used to display the details about a file.\r
@@ -155,14 +185,27 @@ public class FileDetailFragment extends SherlockFragment implements
 \r
     @Override\r
     public void onClick(View v) {\r
-        Toast.makeText(getActivity(), "Downloading", Toast.LENGTH_LONG).show();\r
-        Intent i = new Intent(getActivity(), FileDownloader.class);\r
-        i.putExtra(FileDownloader.EXTRA_ACCOUNT, mAccount);\r
-        i.putExtra(FileDownloader.EXTRA_REMOTE_PATH, mFile.getRemotePath());\r
-        i.putExtra(FileDownloader.EXTRA_FILE_PATH, mFile.getURLDecodedRemotePath());\r
-        i.putExtra(FileDownloader.EXTRA_FILE_SIZE, mFile.getFileLength());\r
-        v.setEnabled(false);\r
-        getActivity().startService(i);\r
+        if (v.getId() == R.id.fdDownloadBtn) {\r
+            Toast.makeText(getActivity(), "Downloading", Toast.LENGTH_LONG).show();\r
+            Intent i = new Intent(getActivity(), FileDownloader.class);\r
+            i.putExtra(FileDownloader.EXTRA_ACCOUNT, mAccount);\r
+            i.putExtra(FileDownloader.EXTRA_REMOTE_PATH, mFile.getRemotePath());\r
+            i.putExtra(FileDownloader.EXTRA_FILE_PATH, mFile.getURLDecodedRemotePath());\r
+            i.putExtra(FileDownloader.EXTRA_FILE_SIZE, mFile.getFileLength());\r
+            v.setEnabled(false);\r
+            getActivity().startService(i);\r
+        } else if (v.getId() == R.id.fdKeepInSync) {\r
+            CheckBox cb = (CheckBox) getView().findViewById(R.id.fdKeepInSync);\r
+            mFile.setKeepInSync(cb.isChecked());\r
+            FileDataStorageManager fdsm = new FileDataStorageManager(mAccount, getActivity().getApplicationContext().getContentResolver());\r
+            fdsm.saveFile(mFile);\r
+            if (mFile.keepInSync() && !mFile.isDownloaded()) {\r
+                onClick(getView().findViewById(R.id.fdDownloadBtn));\r
+            }\r
+        }/* else if (v.getId() == R.id.fdShareBtn) {\r
+            Thread t = new Thread(new ShareRunnable(mFile.getRemotePath()));\r
+            t.start();\r
+        }*/\r
     }\r
 \r
 \r
@@ -215,6 +258,11 @@ public class FileDetailFragment extends SherlockFragment implements
            \r
             setTimeModified(mFile.getModificationTimestamp());\r
             \r
+            CheckBox cb = (CheckBox)getView().findViewById(R.id.fdKeepInSync);\r
+            cb.setChecked(mFile.keepInSync());\r
+            cb.setOnClickListener(this);\r
+            //getView().findViewById(R.id.fdShareBtn).setOnClickListener(this);\r
+            \r
             if (mFile.getStoragePath() != null) {\r
                 // Update preview\r
                 ImageView preview = (ImageView) getView().findViewById(R.id.fdPreview);\r
@@ -236,13 +284,29 @@ public class FileDetailFragment extends SherlockFragment implements
                             int width = options.outWidth;\r
                             int height = options.outHeight;\r
                             int scale = 1;\r
+                            boolean recycle = false;\r
                             if (width >= 2048 || height >= 2048) {\r
                                 scale = (int) (Math.ceil(Math.max(height, width)/2048.));\r
                                 options.inSampleSize = scale;\r
-                                bmp.recycle();\r
-\r
-                                bmp = BitmapFactory.decodeFile(mFile.getStoragePath(), options);\r
+                                recycle = true;\r
                             }\r
+                                Display display = getActivity().getWindowManager().getDefaultDisplay();\r
+                                Point size = new Point();\r
+                                display.getSize(size);\r
+                                int screenwidth = size.x;\r
+\r
+                                Log.e("ASD", "W " + width + " SW " + screenwidth);\r
+\r
+                                if (width > screenwidth) {\r
+                                    scale = (int) (Math.ceil(Math.max(height, width)/screenwidth));\r
+                                    options.inSampleSize = scale;\r
+                                    recycle = true;\r
+                                }\r
+                            \r
+\r
+                            if (recycle) bmp.recycle();\r
+                            bmp = BitmapFactory.decodeFile(mFile.getStoragePath(), options);\r
+                            \r
                         }\r
                         if (bmp != null) {\r
                             preview.setImageBitmap(bmp);\r
@@ -406,4 +470,118 @@ public class FileDetailFragment extends SherlockFragment implements
         \r
     }\r
     \r
+    // this is a temporary class for sharing purposes, it need to be replacead in transfer service\r
+    private class ShareRunnable implements Runnable {\r
+        private String mPath;\r
+\r
+        public ShareRunnable(String path) {\r
+            mPath = path;\r
+        }\r
+        \r
+        public void run() {\r
+            AccountManager am = AccountManager.get(getActivity());\r
+            Account account = AccountUtils.getCurrentOwnCloudAccount(getActivity());\r
+            OwnCloudVersion ocv = new OwnCloudVersion(am.getUserData(account, AccountAuthenticator.KEY_OC_VERSION));\r
+            String url = am.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL) + AccountUtils.getWebdavPath(ocv);\r
+\r
+            Log.d("share", "sharing for version " + ocv.toString());\r
+\r
+            if (ocv.compareTo(new OwnCloudVersion(0x040000)) >= 0) {\r
+                String APPS_PATH = "/apps/files_sharing/";\r
+                String SHARE_PATH = "ajax/share.php";\r
+\r
+                String SHARED_PATH = "/apps/files_sharing/get.php?token=";\r
+                \r
+                final String WEBDAV_SCRIPT = "webdav.php";\r
+                final String WEBDAV_FILES_LOCATION = "/files/";\r
+                \r
+                WebdavClient wc = new WebdavClient();\r
+                HttpConnectionManagerParams params = new HttpConnectionManagerParams();\r
+                params.setMaxConnectionsPerHost(wc.getHostConfiguration(), 5);\r
+\r
+                //wc.getParams().setParameter("http.protocol.single-cookie-header", true);\r
+                //wc.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);\r
+\r
+                PostMethod post = new PostMethod(am.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL) + APPS_PATH + SHARE_PATH);\r
+\r
+                post.addRequestHeader("Content-type","application/x-www-form-urlencoded; charset=UTF-8" );\r
+                post.addRequestHeader("Referer", am.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL));\r
+                List<NameValuePair> formparams = new ArrayList<NameValuePair>();\r
+                Log.d("share", mPath+"");\r
+                formparams.add(new BasicNameValuePair("sources",mPath));\r
+                formparams.add(new BasicNameValuePair("uid_shared_with", "public"));\r
+                formparams.add(new BasicNameValuePair("permissions", "0"));\r
+                post.setRequestEntity(new StringRequestEntity(URLEncodedUtils.format(formparams, HTTP.UTF_8)));\r
+\r
+                int status;\r
+                try {\r
+                    PropFindMethod find = new PropFindMethod(url+"/");\r
+                    find.addRequestHeader("Referer", am.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL));\r
+                    Log.d("sharer", ""+ url+"/");\r
+                    wc.setCredentials(account.name.substring(0, account.name.lastIndexOf('@')), am.getPassword(account));\r
+                    \r
+                    for (org.apache.commons.httpclient.Header a : find.getRequestHeaders()) {\r
+                        Log.d("sharer-h", a.getName() + ":"+a.getValue());\r
+                    }\r
+                    \r
+                    int status2 = wc.executeMethod(find);\r
+\r
+                    Log.d("sharer", "propstatus "+status2);\r
+                    \r
+                    GetMethod get = new GetMethod(am.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL) + "/");\r
+                    get.addRequestHeader("Referer", am.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL));\r
+                    \r
+                    status2 = wc.executeMethod(get);\r
+\r
+                    Log.d("sharer", "getstatus "+status2);\r
+                    Log.d("sharer", "" + get.getResponseBodyAsString());\r
+                    \r
+                    for (org.apache.commons.httpclient.Header a : get.getResponseHeaders()) {\r
+                        Log.d("sharer", a.getName() + ":"+a.getValue());\r
+                    }\r
+\r
+                    status = wc.executeMethod(post);\r
+                    for (org.apache.commons.httpclient.Header a : post.getRequestHeaders()) {\r
+                        Log.d("sharer-h", a.getName() + ":"+a.getValue());\r
+                    }\r
+                    for (org.apache.commons.httpclient.Header a : post.getResponseHeaders()) {\r
+                        Log.d("sharer", a.getName() + ":"+a.getValue());\r
+                    }\r
+                    String resp = post.getResponseBodyAsString();\r
+                    Log.d("share", ""+post.getURI().toString());\r
+                    Log.d("share", "returned status " + status);\r
+                    Log.d("share", " " +resp);\r
+                    \r
+                    if(status != HttpStatus.SC_OK ||resp == null || resp.equals("") || resp.startsWith("false")) {\r
+                        return;\r
+                     }\r
+\r
+                    JSONObject jsonObject = new JSONObject (resp);\r
+                    String jsonStatus = jsonObject.getString("status");\r
+                    if(!jsonStatus.equals("success")) throw new Exception("Error while sharing file status != success");\r
+                    \r
+                    String token = jsonObject.getString("data");\r
+                    String uri = am.getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL) + SHARED_PATH + token; \r
+                    Log.d("Actions:shareFile ok", "url: " + uri);   \r
+                    \r
+                } catch (HttpException e) {\r
+                    // TODO Auto-generated catch block\r
+                    e.printStackTrace();\r
+                } catch (IOException e) {\r
+                    // TODO Auto-generated catch block\r
+                    e.printStackTrace();\r
+                } catch (JSONException e) {\r
+                    // TODO Auto-generated catch block\r
+                    e.printStackTrace();\r
+                } catch (Exception e) {\r
+                    // TODO Auto-generated catch block\r
+                    e.printStackTrace();\r
+                }\r
+                \r
+            } else if (ocv.compareTo(new OwnCloudVersion(0x030000)) >= 0) {\r
+                \r
+            }\r
+        }\r
+    }\r
+    \r
 }\r
index fd1ec50..8d2934c 100644 (file)
@@ -21,10 +21,12 @@ import java.io.BufferedInputStream;
 import java.io.File;\r
 import java.io.FileOutputStream;\r
 import java.io.IOException;\r
-import java.util.HashMap;\r
 \r
 import org.apache.commons.httpclient.Credentials;\r
 import org.apache.commons.httpclient.HttpClient;\r
+import org.apache.commons.httpclient.HttpConnectionManager;\r
+import org.apache.commons.httpclient.HttpVersion;\r
+import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;\r
 import org.apache.commons.httpclient.UsernamePasswordCredentials;\r
 import org.apache.commons.httpclient.auth.AuthScope;\r
 import org.apache.commons.httpclient.methods.GetMethod;\r
@@ -33,6 +35,7 @@ import org.apache.commons.httpclient.methods.PutMethod;
 import org.apache.commons.httpclient.params.HttpMethodParams;\r
 import org.apache.commons.httpclient.protocol.Protocol;\r
 import org.apache.http.HttpStatus;\r
+import org.apache.http.params.CoreProtocolPNames;\r
 import org.apache.jackrabbit.webdav.client.methods.DavMethod;\r
 import org.apache.jackrabbit.webdav.client.methods.DeleteMethod;\r
 import org.apache.jackrabbit.webdav.client.methods.MkColMethod;\r
@@ -54,7 +57,16 @@ public class WebdavClient extends HttpClient {
     final private static String TAG = "WebdavClient";\r
     private static final String USER_AGENT = "Android-ownCloud";\r
     private OnDatatransferProgressListener mDataTransferListener;\r
-    private static HashMap<String, WebdavClient> clients = new HashMap<String, WebdavClient>();\r
+    static private MultiThreadedHttpConnectionManager mConnManager = null;\r
+    \r
+    static public MultiThreadedHttpConnectionManager getMultiThreadedConnManager() {\r
+        if (mConnManager == null) {\r
+            mConnManager = new MultiThreadedHttpConnectionManager();\r
+            mConnManager.setMaxConnectionsPerHost(5);\r
+            mConnManager.setMaxTotalConnections(5);\r
+        }\r
+        return mConnManager;\r
+    }\r
     \r
     /**\r
      * Creates a WebdavClient setup for the current account\r
@@ -62,7 +74,7 @@ public class WebdavClient extends HttpClient {
      * @param context The application context\r
      * @return\r
      */\r
-    public WebdavClient (Account account, Context context){\r
+    public WebdavClient (Account account, Context context) {\r
         OwnCloudVersion ownCloudVersion = new OwnCloudVersion(AccountManager.get(context).getUserData(account,\r
                 AccountAuthenticator.KEY_OC_VERSION));\r
         String baseUrl = AccountManager.get(context).getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL);\r
@@ -71,15 +83,20 @@ public class WebdavClient extends HttpClient {
         String password = AccountManager.get(context).getPassword(account);\r
         \r
         mUri = Uri.parse(baseUrl + webDavPath);\r
-        getParams().setParameter(HttpMethodParams.USER_AGENT, USER_AGENT);\r
+\r
         setCredentials(username, password);\r
-        allowSelfsignedCertificates();\r
     }\r
     \r
-    public WebdavClient(){}\r
+    public WebdavClient() {\r
+        super(getMultiThreadedConnManager());\r
+        \r
+        getParams().setParameter(HttpMethodParams.USER_AGENT, USER_AGENT);\r
+        getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);\r
+        allowSelfsignedCertificates();\r
+    }\r
 \r
     public void setCredentials(String username, String password) {\r
-        getParams().setAuthenticationPreemptive(true);\r
+        //getParams().setAuthenticationPreemptive(true);\r
         getState().setCredentials(AuthScope.ANY,\r
                 getCredentials(username, password));\r
     }\r