Pārlūkot izejas kodu

OC-2584: Detect if the server supports the Share API. This Check is in OwnCloudServerCheckOperation

masensio 11 gadi atpakaļ
vecāks
revīzija
0723ae4b09

+ 52 - 23
src/com/owncloud/android/operations/OwnCloudServerCheckOperation.java → oc_framework/src/com/owncloud/android/oc_framework/operations/remote/OwnCloudServerCheckOperation.java

@@ -1,37 +1,52 @@
-/* ownCloud Android client application
- *   Copyright (C) 2012-2013 ownCloud Inc.
- *
- *   This program is free software: you can redistribute it and/or modify
- *   it under the terms of the GNU General Public License version 2,
- *   as published by the Free Software Foundation.
- *
- *   This program is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU General Public License for more details.
- *
- *   You should have received a copy of the GNU General Public License
- *   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+/* ownCloud Android Library is available under MIT license
+ *   Copyright (C) 2014 ownCloud (http://www.owncloud.org/)
+ *   
+ *   Permission is hereby granted, free of charge, to any person obtaining a copy
+ *   of this software and associated documentation files (the "Software"), to deal
+ *   in the Software without restriction, including without limitation the rights
+ *   to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ *   copies of the Software, and to permit persons to whom the Software is
+ *   furnished to do so, subject to the following conditions:
+ *   
+ *   The above copyright notice and this permission notice shall be included in
+ *   all copies or substantial portions of the Software.
+ *   
+ *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
+ *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ *   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
+ *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 
+ *   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 
+ *   ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 
+ *   CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ *   THE SOFTWARE.
  *
  */
 
-package com.owncloud.android.operations;
+package com.owncloud.android.oc_framework.operations.remote;
 
 import org.apache.commons.httpclient.HttpStatus;
 import org.apache.commons.httpclient.methods.GetMethod;
 import org.json.JSONException;
 import org.json.JSONObject;
 
-import com.owncloud.android.authentication.AccountUtils;
+import com.owncloud.android.oc_framework.accounts.AccountUtils;
 import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
 import com.owncloud.android.oc_framework.operations.RemoteOperation;
 import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
 import com.owncloud.android.oc_framework.utils.OwnCloudVersion;
-import com.owncloud.android.utils.Log_OC;
 
 import android.content.Context;
 import android.net.ConnectivityManager;
 import android.net.Uri;
+import android.util.Log;
+
+/**
+ * Checks if the server is valid and if the server supports the Share API
+ * 
+ * @author David A. Velasco
+ * @author masensio
+ *
+ */
 
 public class OwnCloudServerCheckOperation extends RemoteOperation {
     
@@ -40,20 +55,33 @@ public class OwnCloudServerCheckOperation extends RemoteOperation {
     
     private static final String TAG = OwnCloudServerCheckOperation.class.getSimpleName();
     
+    private static final String OCVERSION_SHARED_SUPPORTED = "5.0.13";
+    
+    private static final String NODE_INSTALLED = "installed";
+    private static final String NODE_VERSION = "version";
+    private static final String NODE_VERSIONSTRING = "versionstring";
+    
     private String mUrl;
     private RemoteOperationResult mLatestResult;
     private Context mContext;
     private OwnCloudVersion mOCVersion;
+    private OwnCloudVersion mOCVersionString;
 
     public OwnCloudServerCheckOperation(String url, Context context) {
         mUrl = url;
         mContext = context;
         mOCVersion = null;
+        mOCVersionString = null;
     }
     
     public OwnCloudVersion getDiscoveredVersion() {
         return mOCVersion;
     }
+    public boolean isSharedSupported() {
+        OwnCloudVersion shareServer = new OwnCloudVersion(OCVERSION_SHARED_SUPPORTED);
+        
+        return mOCVersionString.compareTo(shareServer) >= 0; 
+    }
 
     private boolean tryConnection(WebdavClient wc, String urlSt) {
         boolean retval = false;
@@ -64,10 +92,11 @@ public class OwnCloudServerCheckOperation extends RemoteOperation {
             String response = get.getResponseBodyAsString();
             if (status == HttpStatus.SC_OK) {
                 JSONObject json = new JSONObject(response);
-                if (!json.getBoolean("installed")) {
+                if (!json.getBoolean(NODE_INSTALLED)) {
                     mLatestResult = new RemoteOperationResult(RemoteOperationResult.ResultCode.INSTANCE_NOT_CONFIGURED);
                 } else {
-                    mOCVersion = new OwnCloudVersion(json.getString("version"));
+                    mOCVersion = new OwnCloudVersion(json.getString(NODE_VERSION));
+                    mOCVersionString = new OwnCloudVersion(json.getString(NODE_VERSIONSTRING), true);
                     if (!mOCVersion.isVersionValid()) {
                         mLatestResult = new RemoteOperationResult(RemoteOperationResult.ResultCode.BAD_OC_VERSION);
                         
@@ -97,13 +126,13 @@ public class OwnCloudServerCheckOperation extends RemoteOperation {
         }
         
         if (mLatestResult.isSuccess()) {
-            Log_OC.i(TAG, "Connection check at " + urlSt + ": " + mLatestResult.getLogMessage());
+            Log.i(TAG, "Connection check at " + urlSt + ": " + mLatestResult.getLogMessage());
             
         } else if (mLatestResult.getException() != null) {
-            Log_OC.e(TAG, "Connection check at " + urlSt + ": " + mLatestResult.getLogMessage(), mLatestResult.getException());
+            Log.e(TAG, "Connection check at " + urlSt + ": " + mLatestResult.getLogMessage(), mLatestResult.getException());
             
         } else {
-            Log_OC.e(TAG, "Connection check at " + urlSt + ": " + mLatestResult.getLogMessage());
+            Log.e(TAG, "Connection check at " + urlSt + ": " + mLatestResult.getLogMessage());
         }
 
         return retval;
@@ -128,7 +157,7 @@ public class OwnCloudServerCheckOperation extends RemoteOperation {
             client.setBaseUri(Uri.parse("https://" + mUrl + AccountUtils.STATUS_PATH));
             boolean httpsSuccess = tryConnection(client, "https://" + mUrl + AccountUtils.STATUS_PATH); 
             if (!httpsSuccess && !mLatestResult.isSslRecoverableException()) {
-                Log_OC.d(TAG, "establishing secure connection failed, trying non secure connection");
+                Log.d(TAG, "establishing secure connection failed, trying non secure connection");
                 client.setBaseUri(Uri.parse("http://" + mUrl + AccountUtils.STATUS_PATH));
                 tryConnection(client, "http://" + mUrl + AccountUtils.STATUS_PATH);
             }

+ 35 - 2
oc_framework/src/com/owncloud/android/oc_framework/utils/OwnCloudVersion.java

@@ -47,6 +47,17 @@ public class OwnCloudVersion implements Comparable<OwnCloudVersion> {
         mIsValid = false;
         parseVersionString(version);
     }
+    
+    public OwnCloudVersion(String versionstring, boolean isVersionString) {
+    	mVersion = 0;
+    	mIsValid = false;
+    	if (isVersionString) {
+    		parseVersionString(versionstring);
+    	} else {
+            parseVersion(versionstring);
+    	}
+    		
+    }
 
     public String toString() {
         return ((mVersion >> 16) % 256) + "." + ((mVersion >> 8) % 256) + "."
@@ -56,14 +67,14 @@ public class OwnCloudVersion implements Comparable<OwnCloudVersion> {
     public boolean isVersionValid() {
         return mIsValid;
     }
-
+    
     @Override
     public int compareTo(OwnCloudVersion another) {
         return another.mVersion == mVersion ? 0
                 : another.mVersion < mVersion ? 1 : -1;
     }
 
-    private void parseVersionString(String version) {
+    private void parseVersion(String version) {
         try {
             String[] nums = version.split("\\.");
             if (nums.length > 0) {
@@ -82,4 +93,26 @@ public class OwnCloudVersion implements Comparable<OwnCloudVersion> {
             mIsValid = false;
         }
     }
+    
+    private void parseVersionString(String versionstring) {
+    	try {
+    		versionstring = versionstring.replaceAll("[^\\d.]", "");
+    		
+    		String[] nums = versionstring.split("\\.");
+    		if (nums.length > 0) {
+    			mVersion += Integer.parseInt(nums[0]);
+    		}
+    		mVersion = mVersion << 8;
+    		if (nums.length > 1) {
+    			mVersion += Integer.parseInt(nums[1]);
+    		}
+    		mVersion = mVersion << 8;
+    		if (nums.length > 2) {
+    			mVersion += Integer.parseInt(nums[2]);
+    		}
+    		mIsValid = true;
+    	} catch (Exception e) {
+    		mIsValid = false;
+        }
+    }
 }

+ 10 - 1
src/com/owncloud/android/authentication/AuthenticatorActivity.java

@@ -59,12 +59,12 @@ import com.owncloud.android.oc_framework.network.webdav.OwnCloudClientFactory;
 import com.owncloud.android.oc_framework.network.webdav.WebdavClient;
 import com.owncloud.android.operations.OAuth2GetAccessToken;
 import com.owncloud.android.oc_framework.operations.OnRemoteOperationListener;
-import com.owncloud.android.operations.OwnCloudServerCheckOperation;
 import com.owncloud.android.oc_framework.operations.RemoteOperation;
 import com.owncloud.android.oc_framework.operations.RemoteOperationResult;
 import com.owncloud.android.oc_framework.operations.RemoteOperationResult.ResultCode;
 import com.owncloud.android.oc_framework.operations.remote.ExistenceCheckRemoteOperation;
 import com.owncloud.android.oc_framework.operations.remote.GetUserNameRemoteOperation;
+import com.owncloud.android.oc_framework.operations.remote.OwnCloudServerCheckOperation;
 import com.owncloud.android.ui.dialog.SamlWebViewDialog;
 import com.owncloud.android.ui.dialog.SslValidatorDialog;
 import com.owncloud.android.ui.dialog.SslValidatorDialog.OnSslValidatorListener;
@@ -103,6 +103,7 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
     private static final String KEY_AUTH_STATUS_TEXT = "AUTH_STATUS_TEXT";
     private static final String KEY_AUTH_STATUS_ICON = "AUTH_STATUS_ICON";
     private static final String KEY_REFRESH_BUTTON_ENABLED = "KEY_REFRESH_BUTTON_ENABLED";
+    private static final String KEY_IS_SHARED_SUPPORTED = "KEY_IS_SHARE_SUPPORTED";
 
     private static final String AUTH_ON = "on";
     private static final String AUTH_OFF = "off";
@@ -120,6 +121,7 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
     
     private String mHostBaseUrl;
     private OwnCloudVersion mDiscoveredVersion;
+    private boolean mIsSharedSupported;
 
     private String mAuthMessageText;
     private int mAuthMessageVisibility, mServerStatusText, mServerStatusIcon;
@@ -230,6 +232,7 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
             mServerIsChecked = false;
             mIsSslConn = false;
             mAuthStatusText = mAuthStatusIcon = 0;
+            mIsSharedSupported = false;
 
             /// retrieve extras from intent
             mAccount = getIntent().getExtras().getParcelable(EXTRA_ACCOUNT);
@@ -268,6 +271,7 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
             
             /// server data
             String ocVersion = savedInstanceState.getString(KEY_OC_VERSION);
+            mIsSharedSupported = savedInstanceState.getBoolean(KEY_IS_SHARED_SUPPORTED, false);
             if (ocVersion != null) {
                 mDiscoveredVersion = new OwnCloudVersion(ocVersion);
             }
@@ -447,6 +451,7 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
             outState.putString(KEY_OC_VERSION, mDiscoveredVersion.toString());
         }
         outState.putString(KEY_HOST_URL_TEXT, mHostBaseUrl);
+        outState.putBoolean(KEY_IS_SHARED_SUPPORTED, mIsSharedSupported);
 
         /// account data, if updating
         if (mAccount != null) {
@@ -581,6 +586,7 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
         
         mServerIsValid = false;
         mServerIsChecked = false;
+        mIsSharedSupported = false;
         mOkButton.setEnabled(false);
         mDiscoveredVersion = null;
         hideRefreshButton();
@@ -890,6 +896,9 @@ implements  OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
 
             /// allow or not the user try to access the server
             mOkButton.setEnabled(mServerIsValid);
+            
+            /// retrieve if is supported the Share API
+            mIsSharedSupported = operation.isSharedSupported();
 
         }   // else nothing ; only the last check operation is considered; 
         // multiple can be triggered if the user amends a URL before a previous check can be triggered