diff --git a/src/com/owncloud/android/lib/common/OwnCloudAccount.java b/src/com/owncloud/android/lib/common/OwnCloudAccount.java index 339eb128..1b339af8 100644 --- a/src/com/owncloud/android/lib/common/OwnCloudAccount.java +++ b/src/com/owncloud/android/lib/common/OwnCloudAccount.java @@ -41,9 +41,43 @@ public class OwnCloudAccount { private OwnCloudCredentials mCredentials; private String mSavedAccountName; - - - public OwnCloudAccount(Account savedAccount, Context context) + + private Account mSavedAccount; + + + /** + * Constructor for already saved OC accounts. + * + * Do not use for anonymous credentials. + */ + public OwnCloudAccount(Account savedAccount, Context context) throws AccountNotFoundException { + if (savedAccount == null) { + throw new IllegalArgumentException("Parameter 'savedAccount' cannot be null"); + } + mSavedAccount = savedAccount; + mSavedAccountName = savedAccount.name; + mBaseUri = Uri.parse(AccountUtils.getBaseUrlForAccount(context, mSavedAccount)); + mCredentials = null; + } + + /** + * Method for deferred load of account attributes from AccountManager + * + * @param context + * @throws AccountNotFoundException + * @throws AuthenticatorException + * @throws IOException + * @throws OperationCanceledException + */ + public void loadCredentials(Context context) + throws AccountNotFoundException, AuthenticatorException, + IOException, OperationCanceledException { + + mCredentials = AccountUtils.getCredentialsForAccount(context, mSavedAccount); + } + + /* + public OwnCloudAccount(Account savedAccount, Context context) throws AccountNotFoundException, AuthenticatorException, IOException, OperationCanceledException { @@ -61,12 +95,19 @@ public class OwnCloudAccount { mCredentials = OwnCloudCredentialsFactory.getAnonymousCredentials(); } } - - + */ + + /** + * Constructor for non yet saved OC accounts. + * + * @param baseUri URI to the OC server to get access to. + * @param credentials Credentials to authenticate in the server. NULL is valid for anonymous credentials. + */ public OwnCloudAccount(Uri baseUri, OwnCloudCredentials credentials) { if (baseUri == null) { throw new IllegalArgumentException("Parameter 'baseUri' cannot be null"); } + mSavedAccount = null; mSavedAccountName = null; mBaseUri = baseUri; mCredentials = credentials != null ? @@ -80,7 +121,7 @@ public class OwnCloudAccount { public boolean isAnonymous() { return (mCredentials == null); - } + } // TODO no more public Uri getBaseUri() { return mBaseUri; diff --git a/src/com/owncloud/android/lib/common/OwnCloudClientManager.java b/src/com/owncloud/android/lib/common/OwnCloudClientManager.java index e54ae191..b5df543f 100644 --- a/src/com/owncloud/android/lib/common/OwnCloudClientManager.java +++ b/src/com/owncloud/android/lib/common/OwnCloudClientManager.java @@ -42,7 +42,8 @@ import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundExce public interface OwnCloudClientManager { - public OwnCloudClient getClientFor(OwnCloudAccount account, Context context); + public OwnCloudClient getClientFor(OwnCloudAccount account, Context context) + throws AccountNotFoundException, OperationCanceledException, AuthenticatorException, IOException; public OwnCloudClient removeClientFor(OwnCloudAccount account); diff --git a/src/com/owncloud/android/lib/common/SimpleFactoryManager.java b/src/com/owncloud/android/lib/common/SimpleFactoryManager.java index 1cd89f8a..88e27feb 100644 --- a/src/com/owncloud/android/lib/common/SimpleFactoryManager.java +++ b/src/com/owncloud/android/lib/common/SimpleFactoryManager.java @@ -25,32 +25,42 @@ package com.owncloud.android.lib.common; +import android.accounts.AuthenticatorException; +import android.accounts.OperationCanceledException; import android.content.Context; import com.owncloud.android.lib.common.accounts.AccountUtils; +import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException; import com.owncloud.android.lib.common.utils.Log_OC; +import java.io.IOException; + public class SimpleFactoryManager implements OwnCloudClientManager { private static final String TAG = SimpleFactoryManager.class.getSimpleName(); @Override - public OwnCloudClient getClientFor(OwnCloudAccount account, Context context) { + public OwnCloudClient getClientFor(OwnCloudAccount account, Context context) + throws AccountNotFoundException, OperationCanceledException, AuthenticatorException, IOException { + Log_OC.d(TAG, "getClientFor(OwnCloudAccount ... : "); + OwnCloudClient client = OwnCloudClientFactory.createOwnCloudClient( account.getBaseUri(), context.getApplicationContext(), true); - Log_OC.d(TAG, " new client {" + - (account.getName() != null ? + Log_OC.v(TAG, " new client {" + + (account.getName() != null ? account.getName() : - AccountUtils.buildAccountName( - account.getBaseUri(), - account.getCredentials().getAuthToken())) + - ", " + client.hashCode() + "}"); - - client.setCredentials(account.getCredentials()); + AccountUtils.buildAccountName(account.getBaseUri(), "") + + ) + ", " + client.hashCode() + "}"); + + if (account.getCredentials() == null) { + account.loadCredentials(context); + } + client.setCredentials(account.getCredentials()); return client; } diff --git a/src/com/owncloud/android/lib/common/SingleSessionManager.java b/src/com/owncloud/android/lib/common/SingleSessionManager.java index 46e20dfb..dd94db03 100644 --- a/src/com/owncloud/android/lib/common/SingleSessionManager.java +++ b/src/com/owncloud/android/lib/common/SingleSessionManager.java @@ -62,7 +62,9 @@ public class SingleSessionManager implements OwnCloudClientManager { @Override - public synchronized OwnCloudClient getClientFor(OwnCloudAccount account, Context context) { + public synchronized OwnCloudClient getClientFor(OwnCloudAccount account, Context context) + throws AccountNotFoundException, OperationCanceledException, AuthenticatorException, IOException { + Log_OC.d(TAG, "getClientFor(OwnCloudAccount ... : "); if (account == null) { throw new IllegalArgumentException("Cannot get an OwnCloudClient for a null account"); @@ -70,10 +72,13 @@ public class SingleSessionManager implements OwnCloudClientManager { OwnCloudClient client = null; String accountName = account.getName(); - String sessionName = AccountUtils.buildAccountName( - account.getBaseUri(), - account.getCredentials().getAuthToken()); - + String sessionName = account.getCredentials() == null ? "" : + AccountUtils.buildAccountName ( + account.getBaseUri(), + account.getCredentials().getAuthToken() + ) + ; + if (accountName != null) { client = mClientsWithKnownUsername.get(accountName); } @@ -82,10 +87,11 @@ public class SingleSessionManager implements OwnCloudClientManager { if (accountName != null) { client = mClientsWithUnknownUsername.remove(sessionName); if (client != null) { + // TODO REMOVE THIS LOG Log_OC.d(TAG, " reusing client {" + sessionName + ", " + client.hashCode() + "}"); mClientsWithKnownUsername.put(accountName, client); - Log_OC.d(TAG, " moved client to {" + accountName + ", " + + Log_OC.d(TAG, " moved client to {" + accountName + ", " + client.hashCode() + "}"); } } else { @@ -105,10 +111,9 @@ public class SingleSessionManager implements OwnCloudClientManager { client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY); // enable cookie tracking - - // Restore Cookies ?? - AccountUtils.restoreCookies(accountName, client, context); - + AccountUtils.restoreCookies(accountName, client, context); + + account.loadCredentials(context); client.setCredentials(account.getCredentials()); if (accountName != null) { mClientsWithKnownUsername.put(accountName, client); @@ -116,10 +121,12 @@ public class SingleSessionManager implements OwnCloudClientManager { } else { mClientsWithUnknownUsername.put(sessionName, client); + // TODO REMOVE THIS LOG Log_OC.d(TAG, " new client {" + sessionName + ", " + client.hashCode() + "}"); } } else { if (!reusingKnown) { + // TODO REMOVE THIS LOG Log_OC.d(TAG, " reusing client {" + sessionName + ", " + client.hashCode() + "}"); } keepCredentialsUpdated(account, client); @@ -148,18 +155,9 @@ public class SingleSessionManager implements OwnCloudClientManager { Log_OC.d(TAG, "No client tracked for {" + accountName + "}"); } } - - String sessionName = AccountUtils.buildAccountName( - account.getBaseUri(), - account.getCredentials().getAuthToken()); - client = mClientsWithUnknownUsername.remove(sessionName); - if (client != null) { - Log_OC.d(TAG, "Removed client {" + sessionName + ", " + client.hashCode() + "}"); - return client; - } - Log_OC.d(TAG, "No client tracked for {" + sessionName + "}"); - - Log_OC.d(TAG, "No client removed"); + + mClientsWithUnknownUsername.clear(); + return null; }