Merge branch 'master' into develop
authormasensio <masensio@solidgear.es>
Mon, 24 Feb 2014 12:16:57 +0000 (13:16 +0100)
committermasensio <masensio@solidgear.es>
Mon, 24 Feb 2014 12:16:57 +0000 (13:16 +0100)
1  2 
owncloud-android-library
res/values/strings.xml
src/com/owncloud/android/authentication/AuthenticatorActivity.java
src/com/owncloud/android/datamodel/FileDataStorageManager.java
src/com/owncloud/android/files/FileOperationsHelper.java
src/com/owncloud/android/files/services/FileUploader.java
src/com/owncloud/android/operations/SynchronizeFolderOperation.java
src/com/owncloud/android/operations/UnshareLinkOperation.java
src/com/owncloud/android/operations/UpdateOCVersionOperation.java
src/com/owncloud/android/syncadapter/FileSyncAdapter.java

diff --combined owncloud-android-library
@@@ -1,1 -1,1 +1,1 @@@
- Subproject commit 1df8349e216bd264b9e4e48f32b4c839ef973870
 -Subproject commit b3ac14f575da5100eecff00de744d9330b668f66
++Subproject commit cd4414a7bda686c84e1ca75dd10bcbf9b3f57f83
diff --combined res/values/strings.xml
@@@ -11,7 -11,7 +11,7 @@@
      <string name="actionbar_mkdir">Create directory</string>
      <string name="actionbar_settings">Settings</string>
      <string name="actionbar_see_details">Details</string>
 -    
 +    <string name="actionbar_send_file">Send</string>
      <string name="prefs_category_general">General</string>
      <string name="prefs_category_more">More</string>
      <string name="prefs_accounts">Accounts</string>
      <string name="sync_fail_in_favourites_content">Contents of %1$d files could not be sync\'ed (%2$d conflicts)</string>
      <string name="sync_foreign_files_forgotten_ticker">Some local files were forgotten</string>
      <string name="sync_foreign_files_forgotten_content">%1$d files out of the %2$s directory could not be copied into</string>
-     <string name="sync_foreign_files_forgotten_explanation">As of version 1.3.16, files uploaded from this device are copied into the local %1$s folder to prevent data loss when a single file is synced with multiple accounts.\n\nDue to this change, all files uploaded in previous versions of this app were copied into the %2$s folder. However, an error prevented the completion of this operation during account synchronization. You may either leave the file(s) as is and remove the link to %3$s, or move the file(s) into the %1$s directory and retain the link to %4$s.\n\nListed below are the local file(s), and the the remote file(s) in %5$s they were linked to.</string>
+     <string name="sync_foreign_files_forgotten_explanation">As of version 1.3.16, files uploaded from this device are copied into the local %1$s folder to prevent data loss when a single file is synced with multiple accounts.\n\nDue to this change, all files uploaded in previous versions of this app were copied into the %2$s folder. However, an error prevented the completion of this operation during account synchronization. You may either leave the file(s) as is and remove the link to %3$s, or move the file(s) into the %1$s directory and retain the link to %4$s.\n\nListed below are the local file(s), and the remote file(s) in %5$s they were linked to.</string>
        <string name="sync_current_folder_was_removed">Folder %1$s does not exist anymore</string>    
      <string name="foreign_files_move">"Move all"</string>
      <string name="foreign_files_success">"All files were moved"</string>
        <string name="share_link_file_error">An error occurred while trying to share this file or folder</string>
        <string name="unshare_link_file_no_exist">Unable to unshare this file or folder. It does not exist.</string>
        <string name="unshare_link_file_error">An error occurred while trying to unshare this file or folder</string>
+       <string name="copy_link">Copy link</string>     
+       <string name="clipboard_text_copied">Copied to clipboard</string>
  </resources>
@@@ -36,7 -36,6 +36,6 @@@ import android.support.v4.app.Fragment
  import android.text.Editable;\r
  import android.text.InputType;\r
  import android.text.TextWatcher;\r
- import android.util.Log;\r
  import android.view.KeyEvent;\r
  import android.view.MotionEvent;\r
  import android.view.View;\r
@@@ -54,25 -53,25 +53,25 @@@ import com.actionbarsherlock.app.Sherlo
  import com.owncloud.android.MainApp;\r
  import com.owncloud.android.R;\r
  import com.owncloud.android.authentication.SsoWebViewClient.SsoWebViewClientListener;\r
 -import com.owncloud.android.lib.accounts.AccountTypeUtils;\r
 -import com.owncloud.android.lib.accounts.OwnCloudAccount;\r
 -import com.owncloud.android.lib.network.OwnCloudClientFactory;\r
 -import com.owncloud.android.lib.network.OwnCloudClient;\r
 +import com.owncloud.android.lib.common.accounts.AccountTypeUtils;\r
 +import com.owncloud.android.lib.common.accounts.AccountUtils.Constants;\r
 +import com.owncloud.android.lib.common.OwnCloudClientFactory;\r
 +import com.owncloud.android.lib.common.OwnCloudClient;\r
  import com.owncloud.android.operations.OAuth2GetAccessToken;\r
  
 -import com.owncloud.android.lib.operations.common.OnRemoteOperationListener;\r
 -import com.owncloud.android.lib.operations.remote.OwnCloudServerCheckOperation;\r
 -import com.owncloud.android.lib.operations.common.RemoteOperation;\r
 -import com.owncloud.android.lib.operations.common.RemoteOperationResult;\r
 -import com.owncloud.android.lib.operations.common.RemoteOperationResult.ResultCode;\r
 -import com.owncloud.android.lib.operations.remote.ExistenceCheckRemoteOperation;\r
 -import com.owncloud.android.lib.operations.remote.GetUserNameRemoteOperation;\r
 +import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;\r
 +import com.owncloud.android.lib.resources.status.GetRemoteStatusOperation;\r
 +import com.owncloud.android.lib.common.operations.RemoteOperation;\r
 +import com.owncloud.android.lib.common.operations.RemoteOperationResult;\r
 +import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;\r
 +import com.owncloud.android.lib.resources.files.ExistenceCheckRemoteOperation;\r
 +import com.owncloud.android.lib.resources.users.GetRemoteUserNameOperation;\r
  
  import com.owncloud.android.ui.dialog.SamlWebViewDialog;\r
  import com.owncloud.android.ui.dialog.SslValidatorDialog;\r
  import com.owncloud.android.ui.dialog.SslValidatorDialog.OnSslValidatorListener;\r
  import com.owncloud.android.utils.Log_OC;\r
 -import com.owncloud.android.lib.utils.OwnCloudVersion;\r
 +import com.owncloud.android.lib.resources.status.OwnCloudVersion;\r
  \r
  /**\r
   * This Activity is used to add an ownCloud account to the App\r
@@@ -95,6 -94,7 +94,7 @@@ implements  OnRemoteOperationListener, 
      private static final String KEY_AUTH_MESSAGE_TEXT = "AUTH_MESSAGE_TEXT";\r
      private static final String KEY_HOST_URL_TEXT = "HOST_URL_TEXT";\r
      private static final String KEY_OC_VERSION = "OC_VERSION";\r
+     private static final String KEY_OC_VERSION_STRING = "OC_VERSION_STRING";\r
      private static final String KEY_ACCOUNT = "ACCOUNT";\r
      private static final String KEY_SERVER_VALID = "SERVER_VALID";\r
      private static final String KEY_SERVER_CHECKED = "SERVER_CHECKED";\r
      private static final String KEY_AUTH_STATUS_TEXT = "AUTH_STATUS_TEXT";\r
      private static final String KEY_AUTH_STATUS_ICON = "AUTH_STATUS_ICON";\r
      private static final String KEY_REFRESH_BUTTON_ENABLED = "KEY_REFRESH_BUTTON_ENABLED";\r
--    private static final String KEY_IS_SHARED_SUPPORTED = "KEY_IS_SHARE_SUPPORTED";\r
++    //private static final String KEY_IS_SHARED_SUPPORTED = "KEY_IS_SHARE_SUPPORTED";\r
  \r
      private static final String AUTH_ON = "on";\r
      private static final String AUTH_OFF = "off";\r
      \r
      private String mHostBaseUrl;\r
      private OwnCloudVersion mDiscoveredVersion;\r
-     private boolean mIsSharedSupported;\r
  \r
      private String mAuthMessageText;\r
      private int mAuthMessageVisibility, mServerStatusText, mServerStatusIcon;\r
  \r
      private final Handler mHandler = new Handler();\r
      private Thread mOperationThread;\r
 -    private OwnCloudServerCheckOperation mOcServerChkOperation;\r
 +    private GetRemoteStatusOperation mOcServerChkOperation;\r
      private ExistenceCheckRemoteOperation mAuthCheckOperation;\r
      private RemoteOperationResult mLastSslUntrustedServerResult;\r
  \r
              mServerIsChecked = false;\r
              mIsSslConn = false;\r
              mAuthStatusText = mAuthStatusIcon = 0;\r
-             mIsSharedSupported = false;\r
  \r
              /// retrieve extras from intent\r
              mAccount = getIntent().getExtras().getParcelable(EXTRA_ACCOUNT);\r
--            if (mAccount != null) {\r
 -                String ocVersion = mAccountMgr.getUserData(mAccount, OwnCloudAccount.Constants.KEY_OC_VERSION);\r
 -                String ocVersionString = mAccountMgr.getUserData(mAccount, OwnCloudAccount.Constants.KEY_OC_VERSION_STRING);\r
++            if (mAccount != null) {
 +                String ocVersion = mAccountMgr.getUserData(mAccount, Constants.KEY_OC_VERSION);\r
++                String ocVersionString = mAccountMgr.getUserData(mAccount, Constants.KEY_OC_VERSION_STRING);
                  if (ocVersion != null) {\r
-                     mDiscoveredVersion = new OwnCloudVersion(ocVersion);\r
+                     mDiscoveredVersion = new OwnCloudVersion(ocVersion, ocVersionString);\r
                  }\r
 -                mHostBaseUrl = normalizeUrl(mAccountMgr.getUserData(mAccount, OwnCloudAccount.Constants.KEY_OC_BASE_URL));\r
 +                mHostBaseUrl = normalizeUrl(mAccountMgr.getUserData(mAccount, Constants.KEY_OC_BASE_URL));\r
                  mHostUrlInput.setText(mHostBaseUrl);\r
                  String userName = mAccount.name.substring(0, mAccount.name.lastIndexOf('@'));\r
--                mUsernameInput.setText(userName);\r
-                 mIsSharedSupported = Boolean.getBoolean(mAccountMgr.getUserData(mAccount, Constants.KEY_SUPPORTS_SHARE_API));\r
++                mUsernameInput.setText(userName);
                  \r
              }\r
              initAuthorizationMethod();  // checks intent and setup.xml to determine mCurrentAuthorizationMethod\r
              \r
              /// server data\r
              String ocVersion = savedInstanceState.getString(KEY_OC_VERSION);\r
-             mIsSharedSupported = savedInstanceState.getBoolean(KEY_IS_SHARED_SUPPORTED, false);\r
+             String ocVersionString = savedInstanceState.getString(KEY_OC_VERSION_STRING);\r
              if (ocVersion != null) {\r
-                 mDiscoveredVersion = new OwnCloudVersion(ocVersion);\r
+                 mDiscoveredVersion = new OwnCloudVersion(ocVersion, ocVersionString);\r
              }\r
              mHostBaseUrl = savedInstanceState.getString(KEY_HOST_URL_TEXT);\r
  \r
          if (mAuthTokenType == null) {    \r
              if (mAccount != null) {\r
                  /// same authentication method than the one used to create the account to update\r
 -                oAuthRequired = (mAccountMgr.getUserData(mAccount, OwnCloudAccount.Constants.KEY_SUPPORTS_OAUTH2) != null);\r
 -                samlWebSsoRequired = (mAccountMgr.getUserData(mAccount, OwnCloudAccount.Constants.KEY_SUPPORTS_SAML_WEB_SSO) != null);\r
 +                oAuthRequired = (mAccountMgr.getUserData(mAccount, Constants.KEY_SUPPORTS_OAUTH2) != null);\r
 +                samlWebSsoRequired = (mAccountMgr.getUserData(mAccount, Constants.KEY_SUPPORTS_SAML_WEB_SSO) != null);\r
              \r
              } else {\r
                  /// use the one set in setup.xml\r
  \r
          /// server data\r
          if (mDiscoveredVersion != null) {\r
-             outState.putString(KEY_OC_VERSION, mDiscoveredVersion.toString());\r
+             outState.putString(KEY_OC_VERSION, mDiscoveredVersion.getVersion());\r
+             outState.putString(KEY_OC_VERSION_STRING, mDiscoveredVersion.getVersionString());\r
          }\r
          outState.putString(KEY_HOST_URL_TEXT, mHostBaseUrl);\r
-         outState.putBoolean(KEY_IS_SHARED_SUPPORTED, mIsSharedSupported);\r
  \r
          /// account data, if updating\r
          if (mAccount != null) {\r
          \r
          mServerIsValid = false;\r
          mServerIsChecked = false;\r
-         mIsSharedSupported = false;\r
          mOkButton.setEnabled(false);\r
          mDiscoveredVersion = null;\r
          hideRefreshButton();\r
              mServerStatusText = R.string.auth_testing_connection;\r
              mServerStatusIcon = R.drawable.progress_small;\r
              showServerStatus();\r
 -            mOcServerChkOperation = new  OwnCloudServerCheckOperation(uri, this);\r
 +            mOcServerChkOperation = new  GetRemoteStatusOperation(uri, this);\r
              OwnCloudClient client = OwnCloudClientFactory.createOwnCloudClient(Uri.parse(uri), this, true);\r
              mOperationThread = mOcServerChkOperation.execute(client, this, mHandler);\r
          } else {\r
      @Override\r
      public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) {\r
  \r
 -        if (operation instanceof OwnCloudServerCheckOperation) {\r
 -            onOcServerCheckFinish((OwnCloudServerCheckOperation) operation, result);\r
 +        if (operation instanceof GetRemoteStatusOperation) {\r
 +            onOcServerCheckFinish((GetRemoteStatusOperation) operation, result);\r
  \r
          } else if (operation instanceof OAuth2GetAccessToken) {\r
              onGetOAuthAccessTokenFinish((OAuth2GetAccessToken)operation, result);\r
              } else {\r
                  onAuthorizationCheckFinish((ExistenceCheckRemoteOperation)operation, result);\r
              }\r
 -        } else if (operation instanceof GetUserNameRemoteOperation) {\r
 -            onGetUserNameFinish((GetUserNameRemoteOperation) operation, result);\r
 +        } else if (operation instanceof GetRemoteUserNameOperation) {\r
 +            onGetUserNameFinish((GetRemoteUserNameOperation) operation, result);\r
               \r
          }\r
          \r
      }\r
  \r
 -    private void onGetUserNameFinish(GetUserNameRemoteOperation operation, RemoteOperationResult result) {\r
 +    private void onGetUserNameFinish(GetRemoteUserNameOperation operation, RemoteOperationResult result) {\r
          if (result.isSuccess()) {\r
              boolean success = false;\r
              String username = operation.getUserName();\r
       * @param operation     Server check performed.\r
       * @param result        Result of the check.\r
       */\r
 -    private void onOcServerCheckFinish(OwnCloudServerCheckOperation operation, RemoteOperationResult result) {\r
 +    private void onOcServerCheckFinish(GetRemoteStatusOperation operation, RemoteOperationResult result) {\r
          if (operation.equals(mOcServerChkOperation)) {\r
              /// save result state\r
              mServerIsChecked = true;\r
              /// allow or not the user try to access the server\r
              mOkButton.setEnabled(mServerIsValid);\r
              \r
-             /// retrieve if is supported the Share API\r
-             mIsSharedSupported = operation.isSharedSupported();\r
\r
          }   // else nothing ; only the last check operation is considered; \r
          // multiple can be triggered if the user amends a URL before a previous check can be triggered\r
      }\r
              if (isOAuth || isSaml) {\r
                  mAccountMgr.setAuthToken(mAccount, mAuthTokenType, mAuthToken);\r
              }\r
--            /// add user data to the new account; TODO probably can be done in the last parameter addAccountExplicitly, or in KEY_USERDATA\r
-             mAccountMgr.setUserData(mAccount, Constants.KEY_OC_VERSION,    mDiscoveredVersion.toString());\r
 -            mAccountMgr.setUserData(mAccount, OwnCloudAccount.Constants.KEY_OC_VERSION,         mDiscoveredVersion.getVersion());\r
 -            mAccountMgr.setUserData(mAccount, OwnCloudAccount.Constants.KEY_OC_VERSION_STRING,  mDiscoveredVersion.getVersionString());\r
 -            mAccountMgr.setUserData(mAccount, OwnCloudAccount.Constants.KEY_OC_BASE_URL,   mHostBaseUrl);\r
++            /// add user data to the new account; TODO probably can be done in the last parameter addAccountExplicitly, or in KEY_USERDATA
++            mAccountMgr.setUserData(mAccount, Constants.KEY_OC_VERSION,         mDiscoveredVersion.getVersion());\r
++            mAccountMgr.setUserData(mAccount, Constants.KEY_OC_VERSION_STRING,  mDiscoveredVersion.getVersionString());\r
 +            mAccountMgr.setUserData(mAccount, Constants.KEY_OC_BASE_URL,   mHostBaseUrl);\r
-             mAccountMgr.setUserData(mAccount, Constants.KEY_SUPPORTS_SHARE_API, Boolean.toString(mIsSharedSupported));\r
++            
              if (isSaml) {\r
 -                mAccountMgr.setUserData(mAccount, OwnCloudAccount.Constants.KEY_SUPPORTS_SAML_WEB_SSO, "TRUE"); \r
 +                mAccountMgr.setUserData(mAccount, Constants.KEY_SUPPORTS_SAML_WEB_SSO, "TRUE"); \r
              } else if (isOAuth) {\r
 -                mAccountMgr.setUserData(mAccount, OwnCloudAccount.Constants.KEY_SUPPORTS_OAUTH2, "TRUE");  \r
 +                mAccountMgr.setUserData(mAccount, Constants.KEY_SUPPORTS_OAUTH2, "TRUE");  \r
              }\r
      \r
              setAccountAuthenticatorResult(intent.getExtras());\r
          if (sessionCookie != null && sessionCookie.length() > 0) {\r
              mAuthToken = sessionCookie;\r
  \r
 -            GetUserNameRemoteOperation getUserOperation = new GetUserNameRemoteOperation();            \r
 +            GetRemoteUserNameOperation getUserOperation = new GetRemoteUserNameOperation();            \r
              OwnCloudClient client = OwnCloudClientFactory.createOwnCloudClient(Uri.parse(mHostBaseUrl), getApplicationContext(), true);\r
              client.setSsoSessionCookie(mAuthToken);\r
              getUserOperation.execute(client, this, mHandler);\r
@@@ -27,9 -27,9 +27,9 @@@ import java.util.Vector
  
  import com.owncloud.android.MainApp;
  import com.owncloud.android.db.ProviderMeta.ProviderTableMeta;
 -import com.owncloud.android.lib.operations.common.OCShare;
 -import com.owncloud.android.lib.operations.common.ShareType;
 -import com.owncloud.android.lib.utils.FileUtils;
 +import com.owncloud.android.lib.resources.shares.OCShare;
 +import com.owncloud.android.lib.resources.shares.ShareType;
 +import com.owncloud.android.lib.resources.files.FileUtils;
  import com.owncloud.android.utils.FileStorageUtils;
  import com.owncloud.android.utils.Log_OC;
  
@@@ -858,8 -858,33 +858,33 @@@ public class FileDataStorageManager 
          return share;
      }
  
-     public OCShare getShareByPath(String path) {
-         Cursor c = getShareCursorForValue(ProviderTableMeta.OCSHARES_PATH, path);
+     public OCShare getFirstShareByPathAndType(String path, ShareType type) {
+         Cursor c = null;
+         if (getContentResolver() != null) {
+             c = getContentResolver().query(
+                     ProviderTableMeta.CONTENT_URI_SHARE,
+                     null,
+                     ProviderTableMeta.OCSHARES_PATH + "=? AND "
+                             + ProviderTableMeta.OCSHARES_SHARE_TYPE + "=? AND "
+                             + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?",
+                     new String[] { path, Integer.toString(type.getValue()), mAccount.name },
+                     null);
+         } else {
+             try {
+                 c = getContentProviderClient().query(
+                         ProviderTableMeta.CONTENT_URI_SHARE,
+                         null,
+                         ProviderTableMeta.OCSHARES_PATH + "=? AND "
+                                 + ProviderTableMeta.OCSHARES_SHARE_TYPE + "=? AND "
+                                 + ProviderTableMeta.OCSHARES_ACCOUNT_OWNER + "=?",
+                         new String[] { path, Integer.toString(type.getValue()), mAccount.name }, 
+                         null);
+             } catch (RemoteException e) {
+                 Log_OC.e(TAG, "Could not get file details: " + e.getMessage());
+                 c = null;
+             }
+         }
          OCShare share = null;
          if (c.moveToFirst()) {
              share = createShareInstance(c);
@@@ -28,11 -28,12 +28,13 @@@ import android.widget.Toast
  
  import com.owncloud.android.R;
  import com.owncloud.android.datamodel.OCFile;
 -import com.owncloud.android.lib.accounts.OwnCloudAccount;
 -import com.owncloud.android.lib.network.webdav.WebdavUtils;
 -import com.owncloud.android.lib.utils.OwnCloudVersion;
++
 +import com.owncloud.android.lib.common.accounts.AccountUtils.Constants;
 +import com.owncloud.android.lib.common.network.WebdavUtils;
++import com.owncloud.android.lib.resources.status.OwnCloudVersion;
  import com.owncloud.android.services.OperationsService;
  import com.owncloud.android.ui.activity.FileActivity;
- import com.owncloud.android.ui.dialog.ActivityChooserDialog;
+ import com.owncloud.android.ui.dialog.ShareLinkToDialog;
  import com.owncloud.android.utils.Log_OC;
  
  /**
@@@ -88,7 -89,7 +90,7 @@@ public class FileOperationsHelper 
                  String link = "https://fake.url";
                  Intent intent = createShareWithLinkIntent(link);
                  String[] packagesToExclude = new String[] { callerActivity.getPackageName() };
-                 DialogFragment chooserDialog = ActivityChooserDialog.newInstance(intent, packagesToExclude, file);
+                 DialogFragment chooserDialog = ShareLinkToDialog.newInstance(intent, packagesToExclude, file);
                  chooserDialog.show(callerActivity.getSupportFragmentManager(), FTAG_CHOOSER_DIALOG);
                  
              } else {
      public boolean isSharedSupported(FileActivity callerActivity) {
          if (callerActivity.getAccount() != null) {
              AccountManager accountManager = AccountManager.get(callerActivity);
-             return Boolean.parseBoolean(accountManager.getUserData(callerActivity.getAccount(), Constants.KEY_SUPPORTS_SHARE_API));
 -            String version = accountManager.getUserData(callerActivity.getAccount(), OwnCloudAccount.Constants.KEY_OC_VERSION);
 -            String versionString = accountManager.getUserData(callerActivity.getAccount(), OwnCloudAccount.Constants.KEY_OC_VERSION_STRING);
++
++            String version = accountManager.getUserData(callerActivity.getAccount(), Constants.KEY_OC_VERSION);
++            String versionString = accountManager.getUserData(callerActivity.getAccount(), Constants.KEY_OC_VERSION_STRING);
+             return (new OwnCloudVersion(version, versionString)).isSharedSupported();
+             //return Boolean.parseBoolean(accountManager.getUserData(callerActivity.getAccount(), OwnCloudAccount.Constants.KEY_SUPPORTS_SHARE_API));
          }
          return false;
      }
@@@ -34,19 -34,19 +34,19 @@@ import com.owncloud.android.datamodel.F
  import com.owncloud.android.datamodel.OCFile;
  import com.owncloud.android.db.DbHandler;
  import com.owncloud.android.operations.CreateFolderOperation;
 -import com.owncloud.android.lib.operations.common.RemoteFile;
 -import com.owncloud.android.lib.operations.common.RemoteOperation;
 -import com.owncloud.android.lib.operations.common.RemoteOperationResult;
 +import com.owncloud.android.lib.resources.files.RemoteFile;
 +import com.owncloud.android.lib.common.operations.RemoteOperation;
 +import com.owncloud.android.lib.common.operations.RemoteOperationResult;
  import com.owncloud.android.operations.UploadFileOperation;
 -import com.owncloud.android.lib.operations.common.RemoteOperationResult.ResultCode;
 -import com.owncloud.android.lib.operations.remote.ExistenceCheckRemoteOperation;
 -import com.owncloud.android.lib.operations.remote.ReadRemoteFileOperation;
 -import com.owncloud.android.lib.utils.FileUtils;
 -import com.owncloud.android.lib.utils.OwnCloudVersion;
 -import com.owncloud.android.lib.network.OnDatatransferProgressListener;
 -import com.owncloud.android.lib.accounts.OwnCloudAccount;
 -import com.owncloud.android.lib.network.OwnCloudClientFactory;
 -import com.owncloud.android.lib.network.OwnCloudClient;
 +import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
 +import com.owncloud.android.lib.resources.files.ExistenceCheckRemoteOperation;
 +import com.owncloud.android.lib.resources.files.ReadRemoteFileOperation;
 +import com.owncloud.android.lib.resources.files.FileUtils;
 +import com.owncloud.android.lib.resources.status.OwnCloudVersion;
 +import com.owncloud.android.lib.common.accounts.AccountUtils.Constants;
 +import com.owncloud.android.lib.common.network.OnDatatransferProgressListener;
 +import com.owncloud.android.lib.common.OwnCloudClientFactory;
 +import com.owncloud.android.lib.common.OwnCloudClient;
  import com.owncloud.android.ui.activity.FailedUploadActivity;
  import com.owncloud.android.ui.activity.FileActivity;
  import com.owncloud.android.ui.activity.FileDisplayActivity;
@@@ -253,7 -253,10 +253,11 @@@ public class FileUploader extends Servi
              }
          }
  
-         OwnCloudVersion ocv = new OwnCloudVersion(AccountManager.get(this).getUserData(account, Constants.KEY_OC_VERSION));
+         AccountManager aMgr = AccountManager.get(this);
 -        String version = aMgr.getUserData(account, OwnCloudAccount.Constants.KEY_OC_VERSION);
 -        String versionString = aMgr.getUserData(account, OwnCloudAccount.Constants.KEY_OC_VERSION_STRING);
++        String version = aMgr.getUserData(account, Constants.KEY_OC_VERSION);
++        String versionString = aMgr.getUserData(account, Constants.KEY_OC_VERSION_STRING);
+         OwnCloudVersion ocv = new OwnCloudVersion(version, versionString);
++        
          boolean chunked = FileUploader.chunkedUploadIsSupported(ocv);
          AbstractList<String> requestedUploads = new Vector<String>();
          String uploadKey = null;
@@@ -37,15 -37,16 +37,18 @@@ import android.content.Intent
  
  import com.owncloud.android.datamodel.FileDataStorageManager;
  import com.owncloud.android.datamodel.OCFile;
 -import com.owncloud.android.lib.network.OwnCloudClient;
 -import com.owncloud.android.lib.operations.common.OCShare;
 -import com.owncloud.android.lib.operations.common.RemoteOperation;
 -import com.owncloud.android.lib.operations.common.RemoteOperationResult;
 -import com.owncloud.android.lib.operations.common.RemoteOperationResult.ResultCode;
 -import com.owncloud.android.lib.operations.remote.GetSharesForFileRemoteOperation;
 -import com.owncloud.android.lib.operations.remote.ReadRemoteFileOperation;
 -import com.owncloud.android.lib.operations.remote.ReadRemoteFolderOperation;
 -import com.owncloud.android.lib.operations.common.RemoteFile;
 -import com.owncloud.android.lib.utils.FileUtils;
++
 +import com.owncloud.android.lib.common.OwnCloudClient;
 +import com.owncloud.android.lib.resources.shares.OCShare;
 +import com.owncloud.android.lib.common.operations.RemoteOperation;
 +import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 +import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
 +import com.owncloud.android.lib.resources.shares.GetRemoteSharesForFileOperation;
++import com.owncloud.android.lib.resources.files.FileUtils;
 +import com.owncloud.android.lib.resources.files.ReadRemoteFileOperation;
 +import com.owncloud.android.lib.resources.files.ReadRemoteFolderOperation;
 +import com.owncloud.android.lib.resources.files.RemoteFile;
++
  import com.owncloud.android.syncadapter.FileSyncAdapter;
  import com.owncloud.android.utils.FileStorageUtils;
  import com.owncloud.android.utils.Log_OC;
@@@ -101,7 -102,7 +104,7 @@@ public class SynchronizeFolderOperatio
      private boolean mSyncFullAccount;
  
      /** 'True' means that Share resources bound to the files into the folder should be refreshed also */
-     private boolean mRefreshShares;
+     private boolean mIsShareSupported;
      
      /** 'True' means that the remote folder changed from last synchronization and should be fetched */
      private boolean mRemoteFolderChanged;
      public SynchronizeFolderOperation(  OCFile folder, 
                                          long currentSyncTime, 
                                          boolean syncFullAccount,
-                                         boolean refreshShares,
+                                         boolean isShareSupported,
                                          FileDataStorageManager dataStorageManager, 
                                          Account account, 
                                          Context context ) {
          mLocalFolder = folder;
          mCurrentSyncTime = currentSyncTime;
          mSyncFullAccount = syncFullAccount;
-         mRefreshShares = refreshShares;
+         mIsShareSupported = isShareSupported;
          mStorageManager = dataStorageManager;
          mAccount = account;
          mContext = context;
          mConflictsFound = 0;
          mForgottenLocalFiles.clear();
          
+         if (FileUtils.PATH_SEPARATOR.equals(mLocalFolder.getRemotePath()) && !mSyncFullAccount) {
+             updateOCVersion(client);
+         }
+         
          result = checkForChanges(client);
          
          if (result.isSuccess()) {
              sendLocalBroadcast(EVENT_SINGLE_FOLDER_CONTENTS_SYNCED, mLocalFolder.getRemotePath(), result);
          }
          
-         if (result.isSuccess() && mRefreshShares) {
+         if (result.isSuccess() && mIsShareSupported) {
              RemoteOperationResult shareResult = refreshSharesForFolder(client);
              if (shareResult.getCode() != ResultCode.FILE_NOT_FOUND) {
                  result = shareResult;
          
      }
  
+     private void updateOCVersion(OwnCloudClient client) {
+         UpdateOCVersionOperation update = new UpdateOCVersionOperation(mAccount, mContext);
+         RemoteOperationResult result = update.execute(client);
+         if (result.isSuccess()) {
+             mIsShareSupported = update.getOCVersion().isSharedSupported();
+         }
+     }
+     
      private RemoteOperationResult checkForChanges(OwnCloudClient client) {
          mRemoteFolderChanged = false;
          RemoteOperationResult result = null;
          RemoteOperationResult result = null;
          
          // remote request 
 -        GetSharesForFileRemoteOperation operation = new GetSharesForFileRemoteOperation(mLocalFolder.getRemotePath(), false, true);
 +        GetRemoteSharesForFileOperation operation = new GetRemoteSharesForFileOperation(mLocalFolder.getRemotePath(), false, true);
          result = operation.execute(client);
          
          if (result.isSuccess()) {
@@@ -20,12 -20,13 +20,15 @@@ package com.owncloud.android.operations
  import android.content.Context;
  
  import com.owncloud.android.datamodel.OCFile;
 -import com.owncloud.android.lib.network.OwnCloudClient;
 -import com.owncloud.android.lib.operations.common.OCShare;
 -import com.owncloud.android.lib.operations.common.RemoteOperationResult;
 -import com.owncloud.android.lib.operations.common.ShareType;
 -import com.owncloud.android.lib.operations.common.RemoteOperationResult.ResultCode;
 -import com.owncloud.android.lib.operations.remote.ExistenceCheckRemoteOperation;
 -import com.owncloud.android.lib.operations.remote.RemoveRemoteShareOperation;
++
 +import com.owncloud.android.lib.common.OwnCloudClient;
 +import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 +import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
 +import com.owncloud.android.lib.resources.files.ExistenceCheckRemoteOperation;
 +import com.owncloud.android.lib.resources.shares.OCShare;
 +import com.owncloud.android.lib.resources.shares.RemoveRemoteShareOperation;
++import com.owncloud.android.lib.resources.shares.ShareType;
++
  import com.owncloud.android.operations.common.SyncOperation;
  import com.owncloud.android.utils.Log_OC;
  
@@@ -53,7 -54,7 +56,7 @@@ public class UnshareLinkOperation exten
          RemoteOperationResult result  = null;
          
          // Get Share for a file
-         OCShare share = getStorageManager().getShareByPath(mRemotePath);
+         OCShare share = getStorageManager().getFirstShareByPathAndType(mRemotePath, ShareType.PUBLIC_LINK);
          
          if (share != null) {
              RemoveRemoteShareOperation operation = new RemoveRemoteShareOperation((int) share.getIdRemoteShared());
@@@ -23,12 -23,12 +23,12 @@@ import org.json.JSONException
  import org.json.JSONObject;
  
  import com.owncloud.android.authentication.AccountUtils;
 -import com.owncloud.android.lib.accounts.OwnCloudAccount;
 -import com.owncloud.android.lib.network.OwnCloudClient;
 -import com.owncloud.android.lib.operations.common.RemoteOperation;
 -import com.owncloud.android.lib.operations.common.RemoteOperationResult;
 -import com.owncloud.android.lib.operations.common.RemoteOperationResult.ResultCode;
 -import com.owncloud.android.lib.utils.OwnCloudVersion;
 +import com.owncloud.android.lib.common.OwnCloudClient;
 +import com.owncloud.android.lib.common.accounts.AccountUtils.Constants;
 +import com.owncloud.android.lib.common.operations.RemoteOperation;
 +import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 +import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
 +import com.owncloud.android.lib.resources.status.OwnCloudVersion;
  import com.owncloud.android.utils.Log_OC;
  
  import android.accounts.Account;
@@@ -47,18 -47,20 +47,20 @@@ public class UpdateOCVersionOperation e
  
      private Account mAccount;
      private Context mContext;
+     private OwnCloudVersion mOwnCloudVersion;
      
      
      public UpdateOCVersionOperation(Account account, Context context) {
          mAccount = account;
          mContext = context;
+         mOwnCloudVersion = null;
      }
      
      
      @Override
      protected RemoteOperationResult run(OwnCloudClient client) {
          AccountManager accountMngr = AccountManager.get(mContext); 
 -        String statUrl = accountMngr.getUserData(mAccount, OwnCloudAccount.Constants.KEY_OC_BASE_URL);
 +        String statUrl = accountMngr.getUserData(mAccount, Constants.KEY_OC_BASE_URL);
          statUrl += AccountUtils.STATUS_PATH;
          RemoteOperationResult result = null;
          GetMethod get = null;
                  if (response != null) {
                      JSONObject json = new JSONObject(response);
                      if (json != null && json.getString("version") != null) {
-                         OwnCloudVersion ocver = new OwnCloudVersion(json.getString("version"));
-                         if (ocver.isVersionValid()) {
-                             accountMngr.setUserData(mAccount, Constants.KEY_OC_VERSION, ocver.toString());
-                             Log_OC.d(TAG, "Got new OC version " + ocver.toString());
++
+                         String version = json.getString("version");
+                         String versionstring = json.getString("versionstring");
+                         mOwnCloudVersion = new OwnCloudVersion(version, versionstring);
+                         if (mOwnCloudVersion.isVersionValid()) {
 -                            accountMngr.setUserData(mAccount, OwnCloudAccount.Constants.KEY_OC_VERSION, mOwnCloudVersion.getVersion());
 -                            accountMngr.setUserData(mAccount, OwnCloudAccount.Constants.KEY_OC_VERSION_STRING, mOwnCloudVersion.getVersionString());
++                            accountMngr.setUserData(mAccount, Constants.KEY_OC_VERSION, mOwnCloudVersion.getVersion());
++                            accountMngr.setUserData(mAccount, Constants.KEY_OC_VERSION_STRING, mOwnCloudVersion.getVersionString());
+                             Log_OC.d(TAG, "Got new OC version " + mOwnCloudVersion.toString());
++
                              result = new RemoteOperationResult(ResultCode.OK);
                              
                          } else {
          return result;
      }
  
+     public OwnCloudVersion getOCVersion() {
+         return mOwnCloudVersion;
+     }
  }
@@@ -30,11 -30,11 +30,11 @@@ import com.owncloud.android.R
  import com.owncloud.android.authentication.AuthenticatorActivity;
  import com.owncloud.android.datamodel.FileDataStorageManager;
  import com.owncloud.android.datamodel.OCFile;
 -import com.owncloud.android.lib.accounts.OwnCloudAccount;
 -import com.owncloud.android.lib.operations.common.RemoteOperationResult;
 +import com.owncloud.android.lib.common.accounts.AccountUtils.Constants;
 +import com.owncloud.android.lib.common.operations.RemoteOperationResult;
  import com.owncloud.android.operations.SynchronizeFolderOperation;
  import com.owncloud.android.operations.UpdateOCVersionOperation;
 -import com.owncloud.android.lib.operations.common.RemoteOperationResult.ResultCode;
 +import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
  import com.owncloud.android.ui.activity.ErrorsWhileCopyingHandlerActivity;
  import com.owncloud.android.utils.DisplayUtils;
  import com.owncloud.android.utils.Log_OC;
@@@ -110,7 -110,7 +110,7 @@@ public class FileSyncAdapter extends Ab
      private SyncResult mSyncResult;
  
      /** 'True' means that the server supports the share API */
-     private boolean mIsSharedSupported;
+     private boolean mIsShareSupported;
      
      
      /**
          this.setContentProviderClient(providerClient);
          this.setStorageManager(new FileDataStorageManager(account, providerClient));
          
-         AccountManager accountManager = getAccountManager();
-         mIsSharedSupported = Boolean.parseBoolean(accountManager.getUserData(account, Constants.KEY_SUPPORTS_SHARE_API));
          try {
              this.initClientForCurrentAccount();
          } catch (IOException e) {
          RemoteOperationResult result = update.execute(getClient());
          if (!result.isSuccess()) {
              mLastFailedResult = result; 
+         } else {
+             mIsShareSupported = update.getOCVersion().isSharedSupported();
          }
      }
      
          SynchronizeFolderOperation synchFolderOp = new SynchronizeFolderOperation(  folder, 
                                                                                      mCurrentSyncTime, 
                                                                                      true,
-                                                                                     mIsSharedSupported,
+                                                                                     mIsShareSupported,
                                                                                      getStorageManager(), 
                                                                                      getAccount(), 
                                                                                      getContext()