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 {