diff --git a/src/com/owncloud/android/lib/common/OwnCloudAccount.java b/src/com/owncloud/android/lib/common/OwnCloudAccount.java
new file mode 100644
index 00000000..ff0cf3dd
--- /dev/null
+++ b/src/com/owncloud/android/lib/common/OwnCloudAccount.java
@@ -0,0 +1,95 @@
+/* ownCloud Android client application
+ * Copyright (C) 2014 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 .
+ *
+ */
+
+package com.owncloud.android.lib.common;
+
+
+import java.io.IOException;
+
+import com.owncloud.android.lib.common.accounts.AccountUtils;
+import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException;
+
+import android.accounts.Account;
+import android.accounts.AuthenticatorException;
+import android.accounts.OperationCanceledException;
+import android.content.Context;
+import android.net.Uri;
+
+/**
+ * OwnCloud Account
+ *
+ * @author David A. Velasco
+ */
+public class OwnCloudAccount {
+
+ private Uri mBaseUri;
+
+ private OwnCloudCredentials mCredentials;
+
+ private String mSavedAccountName;
+
+
+ public OwnCloudAccount(Account savedAccount, Context context)
+ throws AccountNotFoundException, AuthenticatorException,
+ IOException, OperationCanceledException {
+
+ if (savedAccount == null) {
+ throw new IllegalArgumentException("Parameter 'savedAccount' cannot be null");
+ }
+ if (context == null) {
+ throw new IllegalArgumentException("Parameter 'context' cannot be null");
+ }
+
+ mSavedAccountName = savedAccount.name;
+ mBaseUri = Uri.parse(AccountUtils.getBaseUrlForAccount(context, savedAccount));
+ mCredentials = AccountUtils.getCredentialsForAccount(context, savedAccount);
+ }
+
+
+ public OwnCloudAccount(Uri baseUri, OwnCloudCredentials credentials) {
+ if (baseUri == null) {
+ throw new IllegalArgumentException("Parameter 'baseUri' cannot be null");
+ }
+ mSavedAccountName = null;
+ mBaseUri = baseUri;
+ mCredentials = credentials != null ?
+ credentials : OwnCloudCredentialsFactory.getAnonymousCredentials();
+ String username = credentials.getUsername();
+ if (username != null) {
+ mSavedAccountName = AccountUtils.buildAccountName(mBaseUri, username);
+ }
+ }
+
+
+ public boolean isAnonymous() {
+ return (mCredentials == null);
+ }
+
+ public Uri getBaseUri() {
+ return mBaseUri;
+ }
+
+ public OwnCloudCredentials getCredentials() {
+ return mCredentials;
+ }
+
+ public String getName() {
+ return mSavedAccountName;
+ }
+
+
+}
\ No newline at end of file
diff --git a/src/com/owncloud/android/lib/common/OwnCloudBasicCredentials.java b/src/com/owncloud/android/lib/common/OwnCloudBasicCredentials.java
index cb30f093..6855cfc4 100644
--- a/src/com/owncloud/android/lib/common/OwnCloudBasicCredentials.java
+++ b/src/com/owncloud/android/lib/common/OwnCloudBasicCredentials.java
@@ -30,6 +30,11 @@ public class OwnCloudBasicCredentials implements OwnCloudCredentials {
);
}
+ @Override
+ public String getUsername() {
+ return mUsername;
+ }
+
@Override
public String getAuthToken() {
return mPassword;
diff --git a/src/com/owncloud/android/lib/common/OwnCloudBearerCredentials.java b/src/com/owncloud/android/lib/common/OwnCloudBearerCredentials.java
index 2a9f4515..fb6f2018 100644
--- a/src/com/owncloud/android/lib/common/OwnCloudBearerCredentials.java
+++ b/src/com/owncloud/android/lib/common/OwnCloudBearerCredentials.java
@@ -32,6 +32,12 @@ public class OwnCloudBearerCredentials implements OwnCloudCredentials {
);
}
+ @Override
+ public String getUsername() {
+ // its unknown
+ return null;
+ }
+
@Override
public String getAuthToken() {
return mAccessToken;
@@ -41,5 +47,5 @@ public class OwnCloudBearerCredentials implements OwnCloudCredentials {
public boolean authTokenExpires() {
return true;
}
-
+
}
diff --git a/src/com/owncloud/android/lib/common/OwnCloudClientManager.java b/src/com/owncloud/android/lib/common/OwnCloudClientManager.java
index 5372a272..7e8a9024 100644
--- a/src/com/owncloud/android/lib/common/OwnCloudClientManager.java
+++ b/src/com/owncloud/android/lib/common/OwnCloudClientManager.java
@@ -62,5 +62,7 @@ public interface OwnCloudClientManager {
public OwnCloudClient removeClientFor(Account account, Context context)
throws AccountNotFoundException, AuthenticatorException,
IOException, OperationCanceledException;
+
+ public OwnCloudClient getClientFor(OwnCloudAccount account, Context context);
}
diff --git a/src/com/owncloud/android/lib/common/OwnCloudCredentials.java b/src/com/owncloud/android/lib/common/OwnCloudCredentials.java
index deba8177..a3fff2eb 100644
--- a/src/com/owncloud/android/lib/common/OwnCloudCredentials.java
+++ b/src/com/owncloud/android/lib/common/OwnCloudCredentials.java
@@ -21,6 +21,8 @@ public interface OwnCloudCredentials {
public void applyTo(OwnCloudClient ownCloudClient);
+ public String getUsername();
+
public String getAuthToken();
public boolean authTokenExpires();
diff --git a/src/com/owncloud/android/lib/common/OwnCloudCredentialsFactory.java b/src/com/owncloud/android/lib/common/OwnCloudCredentialsFactory.java
index 45ee53de..951b4ae3 100644
--- a/src/com/owncloud/android/lib/common/OwnCloudCredentialsFactory.java
+++ b/src/com/owncloud/android/lib/common/OwnCloudCredentialsFactory.java
@@ -42,6 +42,12 @@ public class OwnCloudCredentialsFactory {
public boolean authTokenExpires() {
return false;
}
+
+ @Override
+ public String getUsername() {
+ // no user name
+ return null;
+ }
}
}
diff --git a/src/com/owncloud/android/lib/common/OwnCloudSamlSsoCredentials.java b/src/com/owncloud/android/lib/common/OwnCloudSamlSsoCredentials.java
index a50d3177..78c96bfa 100644
--- a/src/com/owncloud/android/lib/common/OwnCloudSamlSsoCredentials.java
+++ b/src/com/owncloud/android/lib/common/OwnCloudSamlSsoCredentials.java
@@ -39,6 +39,12 @@ public class OwnCloudSamlSsoCredentials implements OwnCloudCredentials {
}
}
+ @Override
+ public String getUsername() {
+ // its unknown
+ return null;
+ }
+
@Override
public String getAuthToken() {
return mSessionCookie;
diff --git a/src/com/owncloud/android/lib/common/SimpleFactoryManager.java b/src/com/owncloud/android/lib/common/SimpleFactoryManager.java
index fb7a0849..03839539 100644
--- a/src/com/owncloud/android/lib/common/SimpleFactoryManager.java
+++ b/src/com/owncloud/android/lib/common/SimpleFactoryManager.java
@@ -13,6 +13,18 @@ import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundExce
public class SimpleFactoryManager implements OwnCloudClientManager {
+ @Override
+ public OwnCloudClient getClientFor(OwnCloudAccount account, Context context) {
+ OwnCloudClient client = OwnCloudClientFactory.createOwnCloudClient(
+ account.getBaseUri(),
+ context.getApplicationContext(),
+ true);
+
+ client.setCredentials(account.getCredentials());
+ return client;
+ }
+
+
@Override
public OwnCloudClient getClientFor(Account savedAccount, Context context)
throws OperationCanceledException, AuthenticatorException, AccountNotFoundException,
diff --git a/src/com/owncloud/android/lib/common/SingleSessionManager.java b/src/com/owncloud/android/lib/common/SingleSessionManager.java
index 4c636513..17226e5c 100644
--- a/src/com/owncloud/android/lib/common/SingleSessionManager.java
+++ b/src/com/owncloud/android/lib/common/SingleSessionManager.java
@@ -64,14 +64,64 @@ public class SingleSessionManager implements OwnCloudClientManager {
private Map> mClientsPerServer =
new HashMap>();
+ private Map mClientsWithKnownUsername =
+ new HashMap();
+
+ private Map mClientsWithUnknownUsername =
+ new HashMap();
+
public static OwnCloudClientManager getInstance() {
if (mInstance == null) {
mInstance = new SingleSessionManager();
}
- return mInstance ;
+ return mInstance;
}
+
+ @Override
+ public synchronized OwnCloudClient getClientFor(OwnCloudAccount account, Context context) {
+ if (account == null) {
+ throw new IllegalArgumentException("Cannot get an OwnCloudClient for a null account");
+ }
+
+ OwnCloudClient client = null;
+ String accountName = account.getName();
+ String sessionName = AccountUtils.buildAccountName(
+ account.getBaseUri(),
+ account.getCredentials().getAuthToken());
+
+ if (accountName != null) {
+ client = mClientsWithKnownUsername.get(account.getName());
+ }
+ if (client == null) {
+ if (accountName != null) {
+ client = mClientsWithUnknownUsername.remove(sessionName);
+ if (client != null) {
+ mClientsWithKnownUsername.put(accountName, client);
+ }
+ } else {
+ client = mClientsWithUnknownUsername.get(sessionName);
+ }
+ }
+
+ if (client == null) {
+ // no client to reuse - create a new one
+ client = OwnCloudClientFactory.createOwnCloudClient(
+ account.getBaseUri(),
+ context.getApplicationContext(),
+ true);
+ client.setCredentials(account.getCredentials());
+ if (accountName != null) {
+ mClientsWithKnownUsername.put(accountName, client);
+ } else {
+ mClientsWithUnknownUsername.put(sessionName, client);
+ }
+ }
+
+ return client;
+ }
+
@Override
public synchronized OwnCloudClient getClientFor(Account savedAccount, Context context)
diff --git a/src/com/owncloud/android/lib/common/accounts/AccountUtils.java b/src/com/owncloud/android/lib/common/accounts/AccountUtils.java
index 8fddc4e6..60ee1e1e 100644
--- a/src/com/owncloud/android/lib/common/accounts/AccountUtils.java
+++ b/src/com/owncloud/android/lib/common/accounts/AccountUtils.java
@@ -37,6 +37,7 @@ import android.accounts.AccountsException;
import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException;
import android.content.Context;
+import android.net.Uri;
public class AccountUtils {
public static final String WEBDAV_PATH_1_2 = "/webdav/owncloud.php";
@@ -185,6 +186,15 @@ public class AccountUtils {
return credentials;
}
+
+
+ public static String buildAccountName(Uri serverBaseUrl, String username) {
+ String accountName = username + "@" + serverBaseUrl.getHost();
+ if (serverBaseUrl.getPort() >= 0) {
+ accountName += ":" + serverBaseUrl.getPort();
+ }
+ return accountName;
+ }
public static class AccountNotFoundException extends AccountsException {