From: David A. Velasco Date: Thu, 12 Jun 2014 07:00:08 +0000 (+0200) Subject: App adapted to replacement of OwnCloudClientMap for interface OwnCloudClientManager... X-Git-Tag: oc-android-1.7.0_signed~264^2~22 X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/commitdiff_plain/d95d2ac85680c0dcb8a2d863d809c40b64a5808d?ds=sidebyside App adapted to replacement of OwnCloudClientMap for interface OwnCloudClientManager in ownCloud library --- diff --git a/owncloud-android-library b/owncloud-android-library index becf4f3c..a42f6b5d 160000 --- a/owncloud-android-library +++ b/owncloud-android-library @@ -1 +1 @@ -Subproject commit becf4f3c13f6ec5aee9e2c4ee435ceca4cca11d3 +Subproject commit a42f6b5d6d7ffab813330870979e4a118ff9b1ad diff --git a/src/com/owncloud/android/MainApp.java b/src/com/owncloud/android/MainApp.java index 85718ff6..0858a66b 100644 --- a/src/com/owncloud/android/MainApp.java +++ b/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; + } } diff --git a/src/com/owncloud/android/authentication/OwnCloudAccount.java b/src/com/owncloud/android/authentication/OwnCloudAccount.java index 51a9900b..4e819b90 100644 --- a/src/com/owncloud/android/authentication/OwnCloudAccount.java +++ b/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 CREATOR = new Parcelable.Creator() { - @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]; - } - }; - } diff --git a/src/com/owncloud/android/files/services/FileDownloader.java b/src/com/owncloud/android/files/services/FileDownloader.java index 34686915..f8f99406 100644 --- a/src/com/owncloud/android/files/services/FileDownloader.java +++ b/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 diff --git a/src/com/owncloud/android/files/services/FileUploader.java b/src/com/owncloud/android/files/services/FileUploader.java index 6bc9dc05..8400e9e5 100644 --- a/src/com/owncloud/android/files/services/FileUploader.java +++ b/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 diff --git a/src/com/owncloud/android/services/OperationsService.java b/src/com/owncloud/android/services/OperationsService.java index a4f9d70e..36708818 100644 --- a/src/com/owncloud/android/services/OperationsService.java +++ b/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; } } diff --git a/src/com/owncloud/android/syncadapter/AbstractOwnCloudSyncAdapter.java b/src/com/owncloud/android/syncadapter/AbstractOwnCloudSyncAdapter.java index 20a94cd8..a08a4bd4 100644 --- a/src/com/owncloud/android/syncadapter/AbstractOwnCloudSyncAdapter.java +++ b/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() { diff --git a/src/com/owncloud/android/syncadapter/FileSyncAdapter.java b/src/com/owncloud/android/syncadapter/FileSyncAdapter.java index 407ce1a2..df5c4b77 100644 --- a/src/com/owncloud/android/syncadapter/FileSyncAdapter.java +++ b/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) { diff --git a/src/com/owncloud/android/ui/activity/FileActivity.java b/src/com/owncloud/android/ui/activity/FileActivity.java index e68dadc6..1b42ff06 100644 --- a/src/com/owncloud/android/ui/activity/FileActivity.java +++ b/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) { diff --git a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java b/src/com/owncloud/android/ui/activity/FileDisplayActivity.java index f09555fd..dba6e81d 100644 --- a/src/com/owncloud/android/ui/activity/FileDisplayActivity.java +++ b/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()); }