-Subproject commit becf4f3c13f6ec5aee9e2c4ee435ceca4cca11d3
+Subproject commit a42f6b5d6d7ffab813330870979e4a118ff9b1ad
*/
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;
/**
* 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() {
public static String getLogName() {
return getAppContext().getResources().getString(R.string.log_name);
}
+
+ public OwnCloudClientManager getOwnCloudClientManager() {
+ return mOwnCloudClientManager;
+ }
}
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];
- }
- };
-
}
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;
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;
mLastAccount = mCurrentDownload.getAccount();
mStorageManager =
new FileDataStorageManager(mLastAccount, getContentResolver());
- mDownloadClient = OwnCloudClientMap.getClientFor(mLastAccount, this);
+ mDownloadClient = ((MainApp)getApplicationContext()).getOwnCloudClientManager().
+ getClientFor(mLastAccount, this);
}
/// perform the download
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;
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;
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
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;
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;
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();
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;
}
}
import org.apache.http.HttpResponse;\r
import org.apache.http.client.ClientProtocolException;\r
\r
+import com.owncloud.android.MainApp;\r
import com.owncloud.android.datamodel.FileDataStorageManager;\r
import com.owncloud.android.lib.common.accounts.AccountUtils;\r
import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException;\r
import com.owncloud.android.lib.common.OwnCloudClient;\r
-import com.owncloud.android.lib.common.OwnCloudClientMap;\r
-\r
\r
import android.accounts.Account;\r
import android.accounts.AccountManager;\r
\r
protected void initClientForCurrentAccount() throws OperationCanceledException, AuthenticatorException, IOException, AccountNotFoundException {\r
AccountUtils.constructFullURLForAccount(getContext(), account);\r
- mClient = OwnCloudClientMap.getClientFor(account, getContext());\r
+ mClient = ((MainApp)(getContext().getApplicationContext())).getOwnCloudClientManager().\r
+ getClientFor(account, getContext());\r
}\r
\r
protected OwnCloudClient getClient() {\r
} 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) {
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) {
package com.owncloud.android.ui.activity;
+import java.io.IOException;
+
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
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;
// 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) {
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;
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;
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());
}