Browse Source

App adapted to replacement of OwnCloudClientMap for interface OwnCloudClientManager in ownCloud library

David A. Velasco 10 năm trước cách đây
mục cha
commit
d95d2ac856

+ 1 - 1
owncloud-android-library

@@ -1 +1 @@
-Subproject commit becf4f3c13f6ec5aee9e2c4ee435ceca4cca11d3
+Subproject commit a42f6b5d6d7ffab813330870979e4a118ff9b1ad

+ 28 - 0
src/com/owncloud/android/MainApp.java

@@ -16,6 +16,10 @@
  */
 package com.owncloud.android;
 
+import com.owncloud.android.lib.common.OwnCloudClientManager;
+import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
+import com.owncloud.android.lib.common.OwnCloudClientManagerFactory.Policy;
+
 import android.app.Application;
 import android.content.Context;
 /**
@@ -24,14 +28,34 @@ import android.content.Context;
  * Contains methods to build the "static" strings. These strings were before constants in different classes
  * 
  * @author masensio
+ * @author David A. Velasco
  */
 public class MainApp extends Application {
 
+    private static final String POLICY_SINGLE_SESSION_PER_ACCOUNT = "single session per account";
+    @SuppressWarnings("unused")
+    private static final String POLICY_ALWAYS_NEW_CLIENT = "always new client";
+
     private static Context mContext;
+    
+    private OwnCloudClientManager mOwnCloudClientManager;
 
     public void onCreate(){
         super.onCreate();
         MainApp.mContext = getApplicationContext();
+        
+        String clientPolicy = getString(R.string.client_creation_policy);
+        if (clientPolicy != null &&
+                POLICY_SINGLE_SESSION_PER_ACCOUNT.equals(clientPolicy.toLowerCase())) {
+            
+            mOwnCloudClientManager = OwnCloudClientManagerFactory.newOwnCloudClientManager(
+                    Policy.SINGLE_SESSION_PER_ACCOUNT);
+            
+        } else {
+            mOwnCloudClientManager = OwnCloudClientManagerFactory.newOwnCloudClientManager(
+                    Policy.ALWAYS_NEW_CLIENT);
+        }
+        
     }
 
     public static Context getAppContext() {
@@ -78,4 +102,8 @@ public class MainApp extends Application {
     public static String getLogName() {
         return getAppContext().getResources().getString(R.string.log_name);
     }
+
+    public OwnCloudClientManager getOwnCloudClientManager() {
+        return mOwnCloudClientManager;
+    }
 }

+ 31 - 45
src/com/owncloud/android/authentication/OwnCloudAccount.java

@@ -17,59 +17,45 @@
 
 package com.owncloud.android.authentication;
 
+import com.owncloud.android.lib.common.OwnCloudCredentials;
+
 import android.accounts.Account;
-import android.os.Parcel;
-import android.os.Parcelable;
+import android.content.Context;
+import android.net.Uri;
 
 /**
- * Account with extra information specific for ownCloud accounts.
- * 
- * TODO integrate in the main app
+ * OwnCloud Account
  * 
  * @author David A. Velasco
  */
-public class OwnCloudAccount extends Account {
-
-	private String mAuthTokenType;
+public class OwnCloudAccount {
 
-	public OwnCloudAccount(String name, String type, String authTokenType) {
-		super(name, type);
-		// TODO validate authTokentype as supported
-		mAuthTokenType = authTokenType;
-	}
-	
-    /**
-     * Reconstruct from parcel
-     * 
-     * @param source The source parcel
-     */
-	public OwnCloudAccount(Parcel source) {
-		super(source);
-        mAuthTokenType = source.readString();
-	}
-	
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-    	super.writeToParcel(dest, flags);
-        dest.writeString(mAuthTokenType);
+    private Uri mBaseUri; 
+    
+    private OwnCloudCredentials mCredentials;
+    
+    public OwnCloudAccount(Account savedAccount, Context context) {
+        
     }
-	
-	
-	public String getAuthTokenType() {
-		return mAuthTokenType;
-	}
-
-	
-    public static final Parcelable.Creator<OwnCloudAccount> CREATOR = new Parcelable.Creator<OwnCloudAccount>() {
-        @Override
-        public OwnCloudAccount createFromParcel(Parcel source) {
-            return new OwnCloudAccount(source);
+    
+    public OwnCloudAccount(Uri baseUri, OwnCloudCredentials credentials) {
+        if (baseUri == null) {
+            throw new IllegalArgumentException("Parameter 'baseUri' cannot be null");
         }
+        mBaseUri = baseUri;
+        mCredentials = credentials;
+    }
+    
+    public boolean isAnonymous() {
+        return (mCredentials == null);
+    }
+    
+    public Uri getBaseUri() {
+        return mBaseUri;
+    }
+            
+    public OwnCloudCredentials getCredentials() {
+        return mCredentials;
+    }
 
-        @Override
-        public OwnCloudAccount [] newArray(int size) {
-            return new OwnCloudAccount[size];
-        }
-    };
-	
 }

+ 3 - 2
src/com/owncloud/android/files/services/FileDownloader.java

@@ -28,6 +28,7 @@ import java.util.Vector;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
+import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.AuthenticatorActivity;
 import com.owncloud.android.datamodel.FileDataStorageManager;
@@ -37,7 +38,6 @@ import com.owncloud.android.lib.common.network.OnDatatransferProgressListener;
 import com.owncloud.android.lib.common.OwnCloudClient;
 import com.owncloud.android.notifications.NotificationBuilderWithProgressBar;
 import com.owncloud.android.notifications.NotificationDelayer;
-import com.owncloud.android.lib.common.OwnCloudClientMap;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
 import com.owncloud.android.lib.resources.files.FileUtils;
@@ -349,7 +349,8 @@ public class FileDownloader extends Service implements OnDatatransferProgressLis
                     mLastAccount = mCurrentDownload.getAccount();
                     mStorageManager = 
                             new FileDataStorageManager(mLastAccount, getContentResolver());
-                    mDownloadClient = OwnCloudClientMap.getClientFor(mLastAccount, this);
+                    mDownloadClient = ((MainApp)getApplicationContext()).getOwnCloudClientManager().
+                            getClientFor(mLastAccount, this);
                 }
 
                 /// perform the download

+ 3 - 2
src/com/owncloud/android/files/services/FileUploader.java

@@ -28,6 +28,7 @@ import java.util.Vector;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
+import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.authentication.AuthenticatorActivity;
 import com.owncloud.android.datamodel.FileDataStorageManager;
@@ -49,7 +50,6 @@ 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.OwnCloudClient;
-import com.owncloud.android.lib.common.OwnCloudClientMap;
 import com.owncloud.android.ui.activity.FailedUploadActivity;
 import com.owncloud.android.ui.activity.FileActivity;
 import com.owncloud.android.ui.activity.FileDisplayActivity;
@@ -488,7 +488,8 @@ public class FileUploader extends Service implements OnDatatransferProgressListe
                     mLastAccount = mCurrentUpload.getAccount();
                     mStorageManager = 
                             new FileDataStorageManager(mLastAccount, getContentResolver());
-                    mUploadClient = OwnCloudClientMap.getClientFor(mLastAccount, this);
+                    mUploadClient = ((MainApp)getApplicationContext()).getOwnCloudClientManager().
+                            getClientFor(mLastAccount, this);
                 }
                 
                 /// check the existence of the parent folder for the file to upload

+ 44 - 15
src/com/owncloud/android/services/OperationsService.java

@@ -27,7 +27,9 @@ import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.lib.common.OwnCloudClient;
-import com.owncloud.android.lib.common.OwnCloudClientMap;
+import com.owncloud.android.lib.common.OwnCloudCredentials;
+import com.owncloud.android.lib.common.OwnCloudCredentialsFactory;
+import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException;
 import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
 import com.owncloud.android.lib.common.operations.RemoteOperation;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
@@ -47,6 +49,8 @@ import com.owncloud.android.utils.Log_OC;
 
 import android.accounts.Account;
 import android.accounts.AccountsException;
+import android.accounts.AuthenticatorException;
+import android.accounts.OperationCanceledException;
 import android.app.Service;
 import android.content.Intent;
 import android.net.Uri;
@@ -174,7 +178,20 @@ public class OperationsService extends Service {
     public void onDestroy() {
         //Log_OC.wtf(TAG, "onDestroy init" );
         // Saving cookies
-        OwnCloudClientMap.saveAllClients(this, MainApp.getAccountType());
+        try {
+            ((MainApp)getApplicationContext()).getOwnCloudClientManager().
+                saveAllClients(this, MainApp.getAccountType());
+            
+            // TODO - get rid of these exceptions
+        } catch (AccountNotFoundException e) {
+            e.printStackTrace();
+        } catch (AuthenticatorException e) {
+            e.printStackTrace();
+        } catch (OperationCanceledException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
         
         //Log_OC.wtf(TAG, "Clear mUndispatchedFinisiedOperations" );
         mUndispatchedFinishedOperations.clear();
@@ -458,28 +475,40 @@ public class OperationsService extends Service {
                 if (mLastTarget == null || !mLastTarget.equals(next.first)) {
                     mLastTarget = next.first;
                     if (mLastTarget.mAccount != null) {
-                        mOwnCloudClient = 
-                                OwnCloudClientMap.getClientFor(mLastTarget.mAccount, this);
+                        mOwnCloudClient = ((MainApp)getApplicationContext()).
+                                getOwnCloudClientManager().getClientFor(
+                                        mLastTarget.mAccount, 
+                                        this);
                         mStorageManager = 
                                 new FileDataStorageManager(
                                         mLastTarget.mAccount, 
                                         getContentResolver());
                     } else {
-                        mOwnCloudClient = OwnCloudClientMap.getAnonymousClientFor(
-                                mLastTarget.mServerUrl, 
-                                this,
-                                mLastTarget.mFollowRedirects);
+                        OwnCloudCredentials credentials = null;
+                        if (mLastTarget.mUsername != null) {
+                            credentials = OwnCloudCredentialsFactory.newBasicCredentials(
+                                    mLastTarget.mUsername, 
+                                    mLastTarget.mPassword);  // basic
+                            
+                        } else if (mLastTarget.mAuthToken != null) {
+                            credentials = OwnCloudCredentialsFactory.newBearerCredentials(
+                                    mLastTarget.mAuthToken);  // bearer token
+                            
+                        } else if (mLastTarget.mCookie != null) {
+                            credentials = OwnCloudCredentialsFactory.newSamlSsoCredentials(
+                                    mLastTarget.mCookie); // SAML SSO
+                        }
+                        
+                        mOwnCloudClient = ((MainApp)getApplicationContext()).
+                                getOwnCloudClientManager().getClientFor(
+                                        mLastTarget.mServerUrl,
+                                        credentials,    // still can be null, and that is right
+                                        this);
                         
                         if (mLastTarget.mWebDavUrl != null) {
                             mOwnCloudClient.setWebdavUri(Uri.parse(mLastTarget.mWebDavUrl));
                         }
-                        if (mLastTarget.mUsername != null && mLastTarget.mPassword != null) {
-                            mOwnCloudClient.setBasicCredentials(mLastTarget.mUsername, mLastTarget.mPassword);
-                        } else if (mLastTarget.mAuthToken != null) {
-                            mOwnCloudClient.setBearerCredentials(mLastTarget.mAuthToken);
-                        } else if (mLastTarget.mCookie != null) {
-                            mOwnCloudClient.setSsoSessionCookie(mLastTarget.mCookie);
-                        }
+                        mOwnCloudClient.setFollowRedirects(mLastTarget.mFollowRedirects);
                         mStorageManager = null;
                     }
                 }

+ 3 - 3
src/com/owncloud/android/syncadapter/AbstractOwnCloudSyncAdapter.java

@@ -24,12 +24,11 @@ import org.apache.http.HttpRequest;
 import org.apache.http.HttpResponse;
 import org.apache.http.client.ClientProtocolException;
 
+import com.owncloud.android.MainApp;
 import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.lib.common.accounts.AccountUtils;
 import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException;
 import com.owncloud.android.lib.common.OwnCloudClient;
-import com.owncloud.android.lib.common.OwnCloudClientMap;
-
 
 import android.accounts.Account;
 import android.accounts.AccountManager;
@@ -102,7 +101,8 @@ public abstract class AbstractOwnCloudSyncAdapter extends
 
     protected void initClientForCurrentAccount() throws OperationCanceledException, AuthenticatorException, IOException, AccountNotFoundException {
         AccountUtils.constructFullURLForAccount(getContext(), account);
-        mClient = OwnCloudClientMap.getClientFor(account, getContext());
+        mClient = ((MainApp)(getContext().getApplicationContext())).getOwnCloudClientManager().
+                getClientFor(account, getContext());
     }
     
     protected OwnCloudClient getClient() {

+ 9 - 11
src/com/owncloud/android/syncadapter/FileSyncAdapter.java

@@ -292,10 +292,9 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
             
         } else {
             // in failures, the statistics for the global result are updated
-            if (result.getCode() == RemoteOperationResult.ResultCode.UNAUTHORIZED ||
-                    ( result.isIdPRedirection() &&
-                            getClient().getCredentials() == null      )) {
-                            //MainApp.getAuthTokenTypeSamlSessionCookie().equals(getClient().getAuthTokenType()))) {
+            if (    result.getCode() == RemoteOperationResult.ResultCode.UNAUTHORIZED ||
+                    result.isIdPRedirection()
+                ) {
                 mSyncResult.stats.numAuthExceptions++;
                 
             } else if (result.getException() instanceof DavException) {
@@ -384,13 +383,12 @@ public class FileSyncAdapter extends AbstractOwnCloudSyncAdapter {
     private void notifyFailedSynchronization() {
         NotificationCompat.Builder notificationBuilder = createNotificationBuilder();
         notificationBuilder.setTicker(i18n(R.string.sync_fail_ticker));
-        boolean needsToUpdateCredentials = (mLastFailedResult != null && 
-                                             (  mLastFailedResult.getCode() == ResultCode.UNAUTHORIZED ||
-                                                ( mLastFailedResult.isIdPRedirection() && 
-                                                  getClient().getCredentials() == null      )
-                                                 //MainApp.getAuthTokenTypeSamlSessionCookie().equals(getClient().getAuthTokenType()))
-                                             )
-                                           );
+        boolean needsToUpdateCredentials = (
+                mLastFailedResult != null && (  
+                        mLastFailedResult.getCode() == ResultCode.UNAUTHORIZED ||
+                        mLastFailedResult.isIdPRedirection()
+                )
+        );
         // TODO put something smart in the contentIntent below for all the possible errors
         notificationBuilder.setContentTitle(i18n(R.string.sync_fail_ticker));
         if (needsToUpdateCredentials) {

+ 17 - 2
src/com/owncloud/android/ui/activity/FileActivity.java

@@ -18,6 +18,8 @@
 
 package com.owncloud.android.ui.activity;
 
+import java.io.IOException;
+
 import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.accounts.AccountManagerCallback;
@@ -48,7 +50,7 @@ import com.owncloud.android.files.services.FileDownloader;
 import com.owncloud.android.files.services.FileUploader;
 import com.owncloud.android.files.services.FileDownloader.FileDownloaderBinder;
 import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
-import com.owncloud.android.lib.common.OwnCloudClientMap;
+import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException;
 import com.owncloud.android.lib.common.operations.OnRemoteOperationListener;
 import com.owncloud.android.lib.common.operations.RemoteOperation;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
@@ -199,7 +201,20 @@ implements OnRemoteOperationListener, ComponentsGetter {
         // Save cookies here
         Log_OC.wtf(TAG, "Saving Cookies" );
         if (mAccount != null) {
-            OwnCloudClientMap.saveClient(mAccount, this);
+            try {
+                ((MainApp)getApplicationContext()).getOwnCloudClientManager().
+                    saveClient(mAccount, this);
+                
+                // TODO get rid of the exceptions
+            } catch (AccountNotFoundException e) {
+                e.printStackTrace();
+            } catch (AuthenticatorException e) {
+                e.printStackTrace();
+            } catch (OperationCanceledException e) {
+                e.printStackTrace();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
         }
         
         if (mOperationsServiceBinder != null) {

+ 28 - 18
src/com/owncloud/android/ui/activity/FileDisplayActivity.java

@@ -19,11 +19,12 @@
 package com.owncloud.android.ui.activity;
 
 import java.io.File;
-import org.apache.commons.httpclient.Credentials;
+import java.io.IOException;
 
 import android.accounts.Account;
 import android.accounts.AccountManager;
 import android.accounts.AuthenticatorException;
+import android.accounts.OperationCanceledException;
 import android.app.AlertDialog;
 import android.app.Dialog;
 import android.app.ProgressDialog;
@@ -72,8 +73,8 @@ import com.owncloud.android.files.services.FileUploader.FileUploaderBinder;
 import com.owncloud.android.operations.CreateFolderOperation;
 
 import com.owncloud.android.lib.common.OwnCloudClient;
-import com.owncloud.android.lib.common.OwnCloudClientMap;
-import com.owncloud.android.lib.common.network.BearerCredentials;
+import com.owncloud.android.lib.common.OwnCloudCredentials;
+import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException;
 import com.owncloud.android.lib.common.network.CertificateCombinedException;
 import com.owncloud.android.lib.common.operations.RemoteOperation;
 import com.owncloud.android.lib.common.operations.RemoteOperationResult;
@@ -932,24 +933,33 @@ FileFragment.ContainerActivity, OnNavigationListener, OnSslUntrustedCertListener
                                     synchResult.isIdPRedirection()                  ||
                                     (synchResult.isException() && synchResult.getException() 
                                             instanceof AuthenticatorException))) {
-                            
 
-                            OwnCloudClient client = OwnCloudClientMap.removeClientFor(getAccount());
+                            OwnCloudClient client = null;
+                            try {
+                                client = ((MainApp)getApplicationContext()).
+                                        getOwnCloudClientManager().removeClientFor(
+                                                getAccount(), 
+                                                context);
+                                // TODO get rid of these exceptions
+                            } catch (AccountNotFoundException e) {
+                                e.printStackTrace();
+                            } catch (AuthenticatorException e) {
+                                e.printStackTrace();
+                            } catch (OperationCanceledException e) {
+                                e.printStackTrace();
+                            } catch (IOException e) {
+                                e.printStackTrace();
+                            }
+                            
                             if (client != null) {
-                                Credentials cred = client.getCredentials();
-                                String ssoSessionCookie = client.getSsoSessionCookie();
-                                if (cred != null || ssoSessionCookie != null) {
-                                    boolean bearerAuthorization = (cred != null && cred instanceof BearerCredentials);
-                                    boolean samlBasedSsoAuthorization = (cred == null && ssoSessionCookie != null);
+                                OwnCloudCredentials cred = client.getCredentials();
+                                if (cred != null) {
                                     AccountManager am = AccountManager.get(context);
-                                
-                                    if (bearerAuthorization) {
-                                        am.invalidateAuthToken(getAccount().type, 
-                                                ((BearerCredentials)cred).getAccessToken());
-                                        
-                                    } else if (samlBasedSsoAuthorization ) {
-                                        am.invalidateAuthToken(getAccount().type, ssoSessionCookie);
-        
+                                    if (cred.authTokenExpires()) {
+                                        am.invalidateAuthToken(
+                                                getAccount().type, 
+                                                cred.getAuthToken()
+                                        );
                                     } else {
                                         am.clearPassword(getAccount());
                                     }