1
0
mirror of https://github.com/owncloud/android-library.git synced 2025-06-07 16:06:08 +00:00

apply codestyle everywhere

This commit is contained in:
Hannes Achleitner 2018-12-18 08:27:26 +01:00
parent 6d05856fb7
commit 40690df5fa
102 changed files with 2415 additions and 2472 deletions

View File

@ -23,8 +23,8 @@
--> -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest package="com.owncloud.android.lib"
package="com.owncloud.android.lib" xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1" android:versionCode="1"
android:versionName="1.0"> android:versionName="1.0">

View File

@ -11,7 +11,7 @@ import java.io.IOException;
/** /**
* Dynamic implementation of {@link OwnCloudClientManager}. * Dynamic implementation of {@link OwnCloudClientManager}.
* * <p>
* Wraps instances of {@link SingleSessionManager} and {@link SimpleFactoryManager} and delegates on one * Wraps instances of {@link SingleSessionManager} and {@link SimpleFactoryManager} and delegates on one
* or the other depending on the known version of the server corresponding to the {@link OwnCloudAccount} * or the other depending on the known version of the server corresponding to the {@link OwnCloudAccount}
* *

View File

@ -24,14 +24,6 @@
package com.owncloud.android.lib.common; 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 com.owncloud.android.lib.common.authentication.OwnCloudCredentials;
import com.owncloud.android.lib.common.authentication.OwnCloudCredentialsFactory;
import android.accounts.Account; import android.accounts.Account;
import android.accounts.AccountManager; import android.accounts.AccountManager;
import android.accounts.AuthenticatorException; import android.accounts.AuthenticatorException;
@ -39,6 +31,13 @@ import android.accounts.OperationCanceledException;
import android.content.Context; import android.content.Context;
import android.net.Uri; import android.net.Uri;
import com.owncloud.android.lib.common.accounts.AccountUtils;
import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException;
import com.owncloud.android.lib.common.authentication.OwnCloudCredentials;
import com.owncloud.android.lib.common.authentication.OwnCloudCredentialsFactory;
import java.io.IOException;
/** /**
* OwnCloud Account * OwnCloud Account
* *
@ -56,10 +55,9 @@ public class OwnCloudAccount {
private Account mSavedAccount; private Account mSavedAccount;
/** /**
* Constructor for already saved OC accounts. * Constructor for already saved OC accounts.
* * <p>
* Do not use for anonymous credentials. * Do not use for anonymous credentials.
*/ */
public OwnCloudAccount(Account savedAccount, Context context) throws AccountNotFoundException { public OwnCloudAccount(Account savedAccount, Context context) throws AccountNotFoundException {
@ -84,7 +82,6 @@ public class OwnCloudAccount {
mDisplayName = ama.getUserData(mSavedAccount, AccountUtils.Constants.KEY_DISPLAY_NAME); mDisplayName = ama.getUserData(mSavedAccount, AccountUtils.Constants.KEY_DISPLAY_NAME);
} }
/** /**
* Constructor for non yet saved OC accounts. * Constructor for non yet saved OC accounts.
* *
@ -106,7 +103,6 @@ public class OwnCloudAccount {
} }
} }
/** /**
* Method for deferred load of account attributes from AccountManager * Method for deferred load of account attributes from AccountManager
* *

View File

@ -29,6 +29,7 @@ import android.accounts.AccountManager;
import android.accounts.AccountsException; import android.accounts.AccountsException;
import android.net.Uri; import android.net.Uri;
import at.bitfire.dav4android.exception.HttpException;
import com.owncloud.android.lib.common.accounts.AccountUtils; import com.owncloud.android.lib.common.accounts.AccountUtils;
import com.owncloud.android.lib.common.authentication.OwnCloudCredentials; import com.owncloud.android.lib.common.authentication.OwnCloudCredentials;
import com.owncloud.android.lib.common.authentication.OwnCloudCredentialsFactory; import com.owncloud.android.lib.common.authentication.OwnCloudCredentialsFactory;
@ -40,16 +41,14 @@ import com.owncloud.android.lib.common.network.RedirectionPath;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.common.utils.RandomUtils; import com.owncloud.android.lib.common.utils.RandomUtils;
import com.owncloud.android.lib.resources.status.OwnCloudVersion; import com.owncloud.android.lib.resources.status.OwnCloudVersion;
import okhttp3.Cookie;
import okhttp3.Headers;
import okhttp3.HttpUrl;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.List; import java.util.List;
import at.bitfire.dav4android.exception.HttpException;
import okhttp3.Cookie;
import okhttp3.Headers;
import okhttp3.HttpUrl;
import static com.owncloud.android.lib.common.http.HttpConstants.OC_X_REQUEST_ID; import static com.owncloud.android.lib.common.http.HttpConstants.OC_X_REQUEST_ID;
public class OwnCloudClient extends HttpClient { public class OwnCloudClient extends HttpClient {
@ -94,15 +93,6 @@ public class OwnCloudClient extends HttpClient {
clearCookies(); clearCookies();
} }
public void setCredentials(OwnCloudCredentials credentials) {
if (credentials != null) {
mCredentials = credentials;
mCredentials.applyTo(this);
} else {
clearCredentials();
}
}
public void clearCredentials() { public void clearCredentials() {
if (!(mCredentials instanceof OwnCloudAnonymousCredentials)) { if (!(mCredentials instanceof OwnCloudAnonymousCredentials)) {
mCredentials = OwnCloudCredentialsFactory.getAnonymousCredentials(); mCredentials = OwnCloudCredentialsFactory.getAnonymousCredentials();
@ -242,7 +232,9 @@ public class OwnCloudClient extends HttpClient {
public void exhaustResponse(InputStream responseBodyAsStream) { public void exhaustResponse(InputStream responseBodyAsStream) {
if (responseBodyAsStream != null) { if (responseBodyAsStream != null) {
try { try {
while (responseBodyAsStream.read(sExhaustBuffer) >= 0) ; while (responseBodyAsStream.read(sExhaustBuffer) >= 0) {
;
}
responseBodyAsStream.close(); responseBodyAsStream.close();
} catch (IOException io) { } catch (IOException io) {
@ -274,9 +266,13 @@ public class OwnCloudClient extends HttpClient {
); );
} }
public Uri getBaseUri() {
return mBaseUri;
}
/** /**
* Sets the root URI to the ownCloud server. * Sets the root URI to the ownCloud server.
* * <p>
* Use with care. * Use with care.
* *
* @param uri * @param uri
@ -288,14 +284,19 @@ public class OwnCloudClient extends HttpClient {
mBaseUri = uri; mBaseUri = uri;
} }
public Uri getBaseUri() {
return mBaseUri;
}
public final OwnCloudCredentials getCredentials() { public final OwnCloudCredentials getCredentials() {
return mCredentials; return mCredentials;
} }
public void setCredentials(OwnCloudCredentials credentials) {
if (credentials != null) {
mCredentials = credentials;
mCredentials.applyTo(this);
} else {
clearCredentials();
}
}
private void logCookie(Cookie cookie) { private void logCookie(Cookie cookie) {
Log_OC.d(TAG, "Cookie name: " + cookie.name()); Log_OC.d(TAG, "Cookie name: " + cookie.name());
Log_OC.d(TAG, " value: " + cookie.value()); Log_OC.d(TAG, " value: " + cookie.value());
@ -348,27 +349,27 @@ public class OwnCloudClient extends HttpClient {
); );
} }
public void setOwnCloudVersion(OwnCloudVersion version) {
mVersion = version;
}
public OwnCloudVersion getOwnCloudVersion() { public OwnCloudVersion getOwnCloudVersion() {
return mVersion; return mVersion;
} }
public void setAccount(OwnCloudAccount account) { public void setOwnCloudVersion(OwnCloudVersion version) {
this.mAccount = account; mVersion = version;
} }
public OwnCloudAccount getAccount() { public OwnCloudAccount getAccount() {
return mAccount; return mAccount;
} }
public void setAccount(OwnCloudAccount account) {
this.mAccount = account;
}
/** /**
* Checks the status code of an execution and decides if should be repeated with fresh credentials. * Checks the status code of an execution and decides if should be repeated with fresh credentials.
* * <p>
* Invalidates current credentials if the request failed as anauthorized. * Invalidates current credentials if the request failed as anauthorized.
* * <p>
* Refresh current credentials if possible, and marks a retry. * Refresh current credentials if possible, and marks a retry.
* *
* @param status * @param status
@ -417,7 +418,6 @@ public class OwnCloudClient extends HttpClient {
* of a network request just performed. * of a network request just performed.
* *
* @param httpStatusCode Result of the last request ran with the 'credentials' belows. * @param httpStatusCode Result of the last request ran with the 'credentials' belows.
* @return 'True' if credentials should and might be invalidated, 'false' if shouldn't or * @return 'True' if credentials should and might be invalidated, 'false' if shouldn't or
* cannot be invalidated with the given arguments. * cannot be invalidated with the given arguments.
*/ */
@ -437,7 +437,7 @@ public class OwnCloudClient extends HttpClient {
/** /**
* Invalidates credentials stored for the given account in the system {@link AccountManager} and in * Invalidates credentials stored for the given account in the system {@link AccountManager} and in
* current {@link OwnCloudClientManagerFactory#getDefaultSingleton()} instance. * current {@link OwnCloudClientManagerFactory#getDefaultSingleton()} instance.
* * <p>
* {@link #shouldInvalidateAccountCredentials(int)} should be called first. * {@link #shouldInvalidateAccountCredentials(int)} should be called first.
* *
* @return 'True' if invalidation was successful, 'false' otherwise. * @return 'True' if invalidation was successful, 'false' otherwise.
@ -462,6 +462,7 @@ public class OwnCloudClient extends HttpClient {
/** /**
* Check if the redirection is to an identity provider such as SAML or wayf * Check if the redirection is to an identity provider such as SAML or wayf
*
* @return true if the redirection location includes SAML or wayf, false otherwise * @return true if the redirection location includes SAML or wayf, false otherwise
*/ */
private boolean isIdPRedirection() { private boolean isIdPRedirection() {

View File

@ -48,7 +48,7 @@ public class OwnCloudClientFactory {
/** /**
* Creates a OwnCloudClient setup for an ownCloud account * Creates a OwnCloudClient setup for an ownCloud account
* * <p>
* Do not call this method from the main thread. * Do not call this method from the main thread.
* *
* @param account The ownCloud account * @param account The ownCloud account
@ -62,7 +62,6 @@ public class OwnCloudClientFactory {
* @throws IOException If there was some I/O error while getting the * @throws IOException If there was some I/O error while getting the
* authorization token for the account. * authorization token for the account.
* @throws AccountNotFoundException If 'account' is unknown for the AccountManager * @throws AccountNotFoundException If 'account' is unknown for the AccountManager
*
*/ */
public static OwnCloudClient createOwnCloudClient(Account account, Context appContext, public static OwnCloudClient createOwnCloudClient(Account account, Context appContext,
Activity currentActivity) Activity currentActivity)
@ -89,7 +88,9 @@ public class OwnCloudClientFactory {
Bundle result = future.getResult(); Bundle result = future.getResult();
String accessToken = result.getString(AccountManager.KEY_AUTHTOKEN); String accessToken = result.getString(AccountManager.KEY_AUTHTOKEN);
if (accessToken == null) throw new AuthenticatorException("WTF!"); if (accessToken == null) {
throw new AuthenticatorException("WTF!");
}
client.setCredentials( client.setCredentials(
OwnCloudCredentialsFactory.newBearerCredentials(username, accessToken) OwnCloudCredentialsFactory.newBearerCredentials(username, accessToken)
); );
@ -105,12 +106,13 @@ public class OwnCloudClientFactory {
Bundle result = future.getResult(); Bundle result = future.getResult();
String accessToken = result.getString(AccountManager.KEY_AUTHTOKEN); String accessToken = result.getString(AccountManager.KEY_AUTHTOKEN);
if (accessToken == null) throw new AuthenticatorException("WTF!"); if (accessToken == null) {
throw new AuthenticatorException("WTF!");
}
client.setCredentials( client.setCredentials(
OwnCloudCredentialsFactory.newSamlSsoCredentials(username, accessToken) OwnCloudCredentialsFactory.newSamlSsoCredentials(username, accessToken)
); );
} else { } else {
AccountManagerFuture<Bundle> future = am.getAuthToken( AccountManagerFuture<Bundle> future = am.getAuthToken(
account, account,

View File

@ -24,14 +24,14 @@
package com.owncloud.android.lib.common; package com.owncloud.android.lib.common;
import java.io.IOException;
import android.accounts.AuthenticatorException; import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException; import android.accounts.OperationCanceledException;
import android.content.Context; import android.content.Context;
import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException; import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundException;
import java.io.IOException;
/** /**
* Manager to create and reuse OwnCloudClient instances to access remote OC servers. * Manager to create and reuse OwnCloudClient instances to access remote OC servers.
* *

View File

@ -25,16 +25,8 @@ package com.owncloud.android.lib.common;
public class OwnCloudClientManagerFactory { public class OwnCloudClientManagerFactory {
public static enum Policy {
ALWAYS_NEW_CLIENT,
SINGLE_SESSION_PER_ACCOUNT,
SINGLE_SESSION_PER_ACCOUNT_IF_SERVER_SUPPORTS_SERVER_MONITORING
}
private static Policy sDefaultPolicy = Policy.ALWAYS_NEW_CLIENT; private static Policy sDefaultPolicy = Policy.ALWAYS_NEW_CLIENT;
private static OwnCloudClientManager sDefaultSingleton; private static OwnCloudClientManager sDefaultSingleton;
private static String sUserAgent; private static String sUserAgent;
public static OwnCloudClientManager newDefaultOwnCloudClientManager() { public static OwnCloudClientManager newDefaultOwnCloudClientManager() {
@ -78,14 +70,14 @@ public class OwnCloudClientManagerFactory {
sDefaultPolicy = policy; sDefaultPolicy = policy;
} }
public static void setUserAgent(String userAgent) {
sUserAgent = userAgent;
}
public static String getUserAgent() { public static String getUserAgent() {
return sUserAgent; return sUserAgent;
} }
public static void setUserAgent(String userAgent) {
sUserAgent = userAgent;
}
private static boolean defaultSingletonMustBeUpdated(Policy policy) { private static boolean defaultSingletonMustBeUpdated(Policy policy) {
if (sDefaultSingleton == null) { if (sDefaultSingleton == null) {
return false; return false;
@ -100,4 +92,10 @@ public class OwnCloudClientManagerFactory {
} }
return false; return false;
} }
public static enum Policy {
ALWAYS_NEW_CLIENT,
SINGLE_SESSION_PER_ACCOUNT,
SINGLE_SESSION_PER_ACCOUNT_IF_SERVER_SUPPORTS_SERVER_MONITORING
}
} }

View File

@ -24,13 +24,11 @@
package com.owncloud.android.lib.common; package com.owncloud.android.lib.common;
import android.accounts.AuthenticatorException; import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException; import android.accounts.OperationCanceledException;
import android.content.Context; import android.content.Context;
import com.owncloud.android.lib.common.accounts.AccountUtils; 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 com.owncloud.android.lib.common.utils.Log_OC;
import java.io.IOException; import java.io.IOException;

View File

@ -43,7 +43,7 @@ import java.util.concurrent.ConcurrentMap;
/** /**
* Implementation of {@link OwnCloudClientManager} * Implementation of {@link OwnCloudClientManager}
* * <p>
* TODO check multithreading safety * TODO check multithreading safety
* *
* @author David A. Velasco * @author David A. Velasco
@ -62,7 +62,6 @@ public class SingleSessionManager implements OwnCloudClientManager {
private ConcurrentMap<String, OwnCloudClient> mClientsWithUnknownUsername = private ConcurrentMap<String, OwnCloudClient> mClientsWithUnknownUsername =
new ConcurrentHashMap<>(); new ConcurrentHashMap<>();
@Override @Override
public OwnCloudClient getClientFor(OwnCloudAccount account, Context context) throws OperationCanceledException, public OwnCloudClient getClientFor(OwnCloudAccount account, Context context) throws OperationCanceledException,
AuthenticatorException, IOException { AuthenticatorException, IOException {
@ -152,7 +151,6 @@ public class SingleSessionManager implements OwnCloudClientManager {
return client; return client;
} }
@Override @Override
public OwnCloudClient removeClientFor(OwnCloudAccount account) { public OwnCloudClient removeClientFor(OwnCloudAccount account) {
if (Log.isLoggable(TAG, Log.DEBUG)) { if (Log.isLoggable(TAG, Log.DEBUG)) {
@ -187,7 +185,6 @@ public class SingleSessionManager implements OwnCloudClientManager {
return null; return null;
} }
@Override @Override
public void saveAllClients(Context context, String accountType) { public void saveAllClients(Context context, String accountType) {

View File

@ -39,13 +39,12 @@ import com.owncloud.android.lib.common.authentication.OwnCloudCredentialsFactory
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.resources.files.FileUtils; import com.owncloud.android.lib.resources.files.FileUtils;
import com.owncloud.android.lib.resources.status.OwnCloudVersion; import com.owncloud.android.lib.resources.status.OwnCloudVersion;
import okhttp3.Cookie;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import okhttp3.Cookie;
public class AccountUtils { public class AccountUtils {
private static final String TAG = AccountUtils.class.getSimpleName(); private static final String TAG = AccountUtils.class.getSimpleName();
@ -91,8 +90,9 @@ public class AccountUtils {
AccountManager ama = AccountManager.get(context.getApplicationContext()); AccountManager ama = AccountManager.get(context.getApplicationContext());
String baseurl = ama.getUserData(account, Constants.KEY_OC_BASE_URL); String baseurl = ama.getUserData(account, Constants.KEY_OC_BASE_URL);
if (baseurl == null) if (baseurl == null) {
throw new AccountNotFoundException(account, "Account not found", null); throw new AccountNotFoundException(account, "Account not found", null);
}
return baseurl; return baseurl;
} }
@ -190,6 +190,7 @@ public class AccountUtils {
/** /**
* Get the user id corresponding to an OC account. * Get the user id corresponding to an OC account.
*
* @param account ownCloud account * @param account ownCloud account
* @return user id * @return user id
*/ */
@ -263,7 +264,9 @@ public class AccountUtils {
for (String rawCookie : rawCookies) { for (String rawCookie : rawCookies) {
rawCookie = rawCookie.replace(" ", ""); rawCookie = rawCookie.replace(" ", "");
final int equalPos = rawCookie.indexOf('='); final int equalPos = rawCookie.indexOf('=');
if (equalPos == -1) continue; if (equalPos == -1) {
continue;
}
cookieList.add(new Cookie.Builder() cookieList.add(new Cookie.Builder()
.name(rawCookie.substring(0, equalPos)) .name(rawCookie.substring(0, equalPos))
.value(rawCookie.substring(equalPos + 1)) .value(rawCookie.substring(equalPos + 1))

View File

@ -26,7 +26,6 @@ package com.owncloud.android.lib.common.authentication;
import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.http.HttpClient; import com.owncloud.android.lib.common.http.HttpClient;
import com.owncloud.android.lib.common.http.HttpConstants; import com.owncloud.android.lib.common.http.HttpConstants;
import okhttp3.Credentials; import okhttp3.Credentials;
public class OwnCloudBasicCredentials implements OwnCloudCredentials { public class OwnCloudBasicCredentials implements OwnCloudCredentials {

View File

@ -35,7 +35,6 @@ public class BearerCredentials {
private String mAccessToken; private String mAccessToken;
/** /**
* The constructor with the bearer token * The constructor with the bearer token
* *
@ -48,7 +47,6 @@ public class BearerCredentials {
mAccessToken = (token == null) ? "" : token; mAccessToken = (token == null) ? "" : token;
} }
/** /**
* Returns the access token * Returns the access token
* *
@ -58,7 +56,6 @@ public class BearerCredentials {
return mAccessToken; return mAccessToken;
} }
/** /**
* Get this object string. * Get this object string.
* *
@ -81,12 +78,15 @@ public class BearerCredentials {
* These credentials are assumed equal if accessToken is the same. * These credentials are assumed equal if accessToken is the same.
* *
* @param o The other object to compare with. * @param o The other object to compare with.
*
* @return 'True' if the object is equivalent. * @return 'True' if the object is equivalent.
*/ */
public boolean equals(Object o) { public boolean equals(Object o) {
if (o == null) return false; if (o == null) {
if (this == o) return true; return false;
}
if (this == o) {
return true;
}
if (this.getClass().equals(o.getClass())) { if (this.getClass().equals(o.getClass())) {
BearerCredentials that = (BearerCredentials) o; BearerCredentials that = (BearerCredentials) o;
if (mAccessToken.equals(that.mAccessToken)) { if (mAccessToken.equals(that.mAccessToken)) {

View File

@ -28,7 +28,7 @@ package com.owncloud.android.lib.common.authentication.oauth;
/** /**
* Constant values for OAuth 2 protocol. * Constant values for OAuth 2 protocol.
* * <p>
* Includes required and optional parameter NAMES used in the 'authorization code' grant type. * Includes required and optional parameter NAMES used in the 'authorization code' grant type.
*/ */

View File

@ -29,34 +29,29 @@ package com.owncloud.android.lib.common.authentication.oauth;
import android.net.Uri; import android.net.Uri;
import com.owncloud.android.lib.common.authentication.OwnCloudBasicCredentials;
import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.authentication.OwnCloudBasicCredentials;
import com.owncloud.android.lib.common.authentication.OwnCloudCredentials; import com.owncloud.android.lib.common.authentication.OwnCloudCredentials;
import com.owncloud.android.lib.common.http.methods.nonwebdav.PostMethod; import com.owncloud.android.lib.common.http.methods.nonwebdav.PostMethod;
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import org.json.JSONObject; import org.json.JSONObject;
import java.net.URL; import java.net.URL;
import java.util.Map; import java.util.Map;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
public class OAuth2GetAccessTokenOperation extends RemoteOperation<Map<String, String>> { public class OAuth2GetAccessTokenOperation extends RemoteOperation<Map<String, String>> {
private final String mAccessTokenEndpointPath;
private final OAuth2ResponseParser mResponseParser;
private String mGrantType; private String mGrantType;
private String mCode; private String mCode;
private String mClientId; private String mClientId;
private String mClientSecret; private String mClientSecret;
private String mRedirectUri; private String mRedirectUri;
private final String mAccessTokenEndpointPath;
private final OAuth2ResponseParser mResponseParser;
public OAuth2GetAccessTokenOperation( public OAuth2GetAccessTokenOperation(
String grantType, String grantType,

View File

@ -35,26 +35,18 @@ public interface OAuth2Provider {
*/ */
OAuth2RequestBuilder getOperationBuilder(); OAuth2RequestBuilder getOperationBuilder();
/**
* Set configuration of the client that will use this {@link OAuth2Provider}
* @param oAuth2ClientConfiguration Configuration of the client that will use this {@link OAuth2Provider}
*/
void setClientConfiguration(OAuth2ClientConfiguration oAuth2ClientConfiguration);
/** /**
* Configuration of the client that is using this {@link OAuth2Provider} * Configuration of the client that is using this {@link OAuth2Provider}
* return Configuration of the client that is usinng this {@link OAuth2Provider} * return Configuration of the client that is usinng this {@link OAuth2Provider}
*/ */
OAuth2ClientConfiguration getClientConfiguration(); OAuth2ClientConfiguration getClientConfiguration();
/** /**
* Set base URI to authorization server. * Set configuration of the client that will use this {@link OAuth2Provider}
* *
* @param authorizationServerUri Set base URL to authorization server. * @param oAuth2ClientConfiguration Configuration of the client that will use this {@link OAuth2Provider}
*/ */
void setAuthorizationServerUri(String authorizationServerUri); void setClientConfiguration(OAuth2ClientConfiguration oAuth2ClientConfiguration);
/** /**
* base URI to authorization server. * base URI to authorization server.
@ -63,4 +55,11 @@ public interface OAuth2Provider {
*/ */
String getAuthorizationServerUri(); String getAuthorizationServerUri();
/**
* Set base URI to authorization server.
*
* @param authorizationServerUri Set base URL to authorization server.
*/
void setAuthorizationServerUri(String authorizationServerUri);
} }

View File

@ -26,7 +26,6 @@
package com.owncloud.android.lib.common.authentication.oauth; package com.owncloud.android.lib.common.authentication.oauth;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -39,13 +38,6 @@ public class OAuth2ProvidersRegistry {
private OAuth2ProvidersRegistry() { private OAuth2ProvidersRegistry() {
} }
/**
* See https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom
*/
private static class LazyHolder {
private static final OAuth2ProvidersRegistry INSTANCE = new OAuth2ProvidersRegistry();
}
/** /**
* Singleton accesor. * Singleton accesor.
* *
@ -119,4 +111,11 @@ public class OAuth2ProvidersRegistry {
return toDefault; return toDefault;
} }
/**
* See https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom
*/
private static class LazyHolder {
private static final OAuth2ProvidersRegistry INSTANCE = new OAuth2ProvidersRegistry();
}
} }

View File

@ -31,7 +31,6 @@ import com.owncloud.android.lib.common.utils.Log_OC;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
public class OAuth2QueryParser { public class OAuth2QueryParser {
private static final String TAG = OAuth2QueryParser.class.getName(); private static final String TAG = OAuth2QueryParser.class.getName();

View File

@ -3,57 +3,50 @@
* *
* @author David González Verdugo * @author David González Verdugo
* @author Christian Schabesberger * @author Christian Schabesberger
* * <p>
* Copyright (C) 2018 ownCloud GmbH. * Copyright (C) 2018 ownCloud GmbH.
* * <p>
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2, * it under the terms of the GNU General Public License version 2,
* as published by the Free Software Foundation. * as published by the Free Software Foundation.
* * <p>
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* * <p>
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/ */
package com.owncloud.android.lib.common.authentication.oauth; package com.owncloud.android.lib.common.authentication.oauth;
import android.net.Uri; import android.net.Uri;
import com.owncloud.android.lib.common.authentication.OwnCloudBasicCredentials;
import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.authentication.OwnCloudBasicCredentials;
import com.owncloud.android.lib.common.authentication.OwnCloudCredentials; import com.owncloud.android.lib.common.authentication.OwnCloudCredentials;
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; import com.owncloud.android.lib.common.http.methods.nonwebdav.PostMethod;
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import org.json.JSONObject; import org.json.JSONObject;
import java.net.URL; import java.net.URL;
import java.util.Map; import java.util.Map;
import com.owncloud.android.lib.common.http.methods.nonwebdav.PostMethod;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
public class OAuth2RefreshAccessTokenOperation extends RemoteOperation<Map<String, String>> { public class OAuth2RefreshAccessTokenOperation extends RemoteOperation<Map<String, String>> {
private static final String TAG = OAuth2RefreshAccessTokenOperation.class.getSimpleName(); private static final String TAG = OAuth2RefreshAccessTokenOperation.class.getSimpleName();
private final String mAccessTokenEndpointPath;
private final OAuth2ResponseParser mResponseParser;
private String mClientId; private String mClientId;
private String mClientSecret; private String mClientSecret;
private String mRefreshToken; private String mRefreshToken;
private final String mAccessTokenEndpointPath;
private final OAuth2ResponseParser mResponseParser;
public OAuth2RefreshAccessTokenOperation( public OAuth2RefreshAccessTokenOperation(
String clientId, String clientId,
String secretId, String secretId,

View File

@ -30,10 +30,6 @@ import com.owncloud.android.lib.common.operations.RemoteOperation;
public interface OAuth2RequestBuilder { public interface OAuth2RequestBuilder {
enum OAuthRequest {
GET_AUTHORIZATION_CODE, CREATE_ACCESS_TOKEN, REFRESH_ACCESS_TOKEN
}
void setRequest(OAuthRequest operation); void setRequest(OAuthRequest operation);
void setGrantType(OAuth2GrantType grantType); void setGrantType(OAuth2GrantType grantType);
@ -45,4 +41,8 @@ public interface OAuth2RequestBuilder {
RemoteOperation buildOperation(); RemoteOperation buildOperation();
String buildUri(); String buildUri();
enum OAuthRequest {
GET_AUTHORIZATION_CODE, CREATE_ACCESS_TOKEN, REFRESH_ACCESS_TOKEN
}
} }

View File

@ -2,26 +2,24 @@
* ownCloud Android client application * ownCloud Android client application
* *
* @author David A. Velasco * @author David A. Velasco
* * <p>
* Copyright (C) 2017 ownCloud GmbH. * Copyright (C) 2017 ownCloud GmbH.
* * <p>
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2, * it under the terms of the GNU General Public License version 2,
* as published by the Free Software Foundation. * as published by the Free Software Foundation.
* * <p>
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* * <p>
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/ */
package com.owncloud.android.lib.common.authentication.oauth; package com.owncloud.android.lib.common.authentication.oauth;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;

View File

@ -46,19 +46,14 @@ public class OwnCloudOAuth2Provider implements OAuth2Provider {
return new OwnCloudOAuth2RequestBuilder(this); return new OwnCloudOAuth2RequestBuilder(this);
} }
@Override
public void setClientConfiguration(OAuth2ClientConfiguration oAuth2ClientConfiguration) {
mClientConfiguration = oAuth2ClientConfiguration;
}
@Override @Override
public OAuth2ClientConfiguration getClientConfiguration() { public OAuth2ClientConfiguration getClientConfiguration() {
return mClientConfiguration; return mClientConfiguration;
} }
@Override @Override
public void setAuthorizationServerUri(String authorizationServerUri) { public void setClientConfiguration(OAuth2ClientConfiguration oAuth2ClientConfiguration) {
mAuthorizationServerUrl = authorizationServerUri; mClientConfiguration = oAuth2ClientConfiguration;
} }
@Override @Override
@ -66,6 +61,11 @@ public class OwnCloudOAuth2Provider implements OAuth2Provider {
return mAuthorizationServerUrl; return mAuthorizationServerUrl;
} }
@Override
public void setAuthorizationServerUri(String authorizationServerUri) {
mAuthorizationServerUrl = authorizationServerUri;
}
public String getAccessTokenEndpointPath() { public String getAccessTokenEndpointPath() {
return mAccessTokenEndpointPath; return mAccessTokenEndpointPath;
} }

View File

@ -32,7 +32,15 @@ import com.owncloud.android.lib.common.http.interceptors.RequestHeaderIntercepto
import com.owncloud.android.lib.common.network.AdvancedX509TrustManager; import com.owncloud.android.lib.common.network.AdvancedX509TrustManager;
import com.owncloud.android.lib.common.network.NetworkUtils; import com.owncloud.android.lib.common.network.NetworkUtils;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Protocol;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
@ -41,18 +49,9 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import okhttp3.Cookie;
import okhttp3.CookieJar;
import okhttp3.HttpUrl;
import okhttp3.OkHttpClient;
import okhttp3.Protocol;
/** /**
* Client used to perform network operations * Client used to perform network operations
*
* @author David González Verdugo * @author David González Verdugo
*/ */
public class HttpClient { public class HttpClient {
@ -63,14 +62,6 @@ public class HttpClient {
private static Context sContext; private static Context sContext;
private static HashMap<String, List<Cookie>> sCookieStore = new HashMap<>(); private static HashMap<String, List<Cookie>> sCookieStore = new HashMap<>();
public static void setContext(Context context) {
sContext = context;
}
public Context getContext() {
return sContext;
}
public static OkHttpClient getOkHttpClient() { public static OkHttpClient getOkHttpClient() {
if (sOkHttpClient == null) { if (sOkHttpClient == null) {
try { try {
@ -130,6 +121,31 @@ public class HttpClient {
return sOkHttpInterceptor; return sOkHttpInterceptor;
} }
/**
* Add header that will be included for all the requests from now on
*
* @param headerName
* @param headerValue
*/
public static void addHeaderForAllRequests(String headerName, String headerValue) {
getOkHttpInterceptor()
.addRequestInterceptor(
new RequestHeaderInterceptor(headerName, headerValue)
);
}
public static void deleteHeaderForAllRequests(String headerName) {
getOkHttpInterceptor().deleteRequestHeaderInterceptor(headerName);
}
public Context getContext() {
return sContext;
}
public static void setContext(Context context) {
sContext = context;
}
public void disableAutomaticCookiesHandling() { public void disableAutomaticCookiesHandling() {
OkHttpClient.Builder clientBuilder = getOkHttpClient().newBuilder(); OkHttpClient.Builder clientBuilder = getOkHttpClient().newBuilder();
clientBuilder.cookieJar(new CookieJar() { clientBuilder.cookieJar(new CookieJar() {
@ -146,22 +162,6 @@ public class HttpClient {
sOkHttpClient = clientBuilder.build(); sOkHttpClient = clientBuilder.build();
} }
/**
* Add header that will be included for all the requests from now on
* @param headerName
* @param headerValue
*/
public static void addHeaderForAllRequests(String headerName, String headerValue) {
getOkHttpInterceptor()
.addRequestInterceptor(
new RequestHeaderInterceptor(headerName, headerValue)
);
}
public static void deleteHeaderForAllRequests(String headerName) {
getOkHttpInterceptor().deleteRequestHeaderInterceptor(headerName);
}
public List<Cookie> getCookiesFromUrl(HttpUrl httpUrl) { public List<Cookie> getCookiesFromUrl(HttpUrl httpUrl) {
return sCookieStore.get(httpUrl.host()); return sCookieStore.get(httpUrl.host());
} }

View File

@ -181,9 +181,13 @@ public class HttpConstants {
*************************************************** TIMEOUTS ********************************************** *************************************************** TIMEOUTS **********************************************
***********************************************************************************************************/ ***********************************************************************************************************/
/** Default timeout for waiting data from the server */ /**
* Default timeout for waiting data from the server
*/
public static final int DEFAULT_DATA_TIMEOUT = 60000; public static final int DEFAULT_DATA_TIMEOUT = 60000;
/** Default timeout for establishing a connection */ /**
* Default timeout for establishing a connection
*/
public static final int DEFAULT_CONNECTION_TIMEOUT = 60000; public static final int DEFAULT_CONNECTION_TIMEOUT = 60000;
} }

View File

@ -24,16 +24,17 @@
package com.owncloud.android.lib.common.http.interceptors; package com.owncloud.android.lib.common.http.interceptors;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import okhttp3.Interceptor; import okhttp3.Interceptor;
import okhttp3.Request; import okhttp3.Request;
import okhttp3.Response; import okhttp3.Response;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
/** /**
* Http interceptor to use multiple interceptors in the same {@link okhttp3.OkHttpClient} instance * Http interceptor to use multiple interceptors in the same {@link okhttp3.OkHttpClient} instance
*
* @author David González Verdugo * @author David González Verdugo
*/ */
public class HttpInterceptor implements Interceptor { public class HttpInterceptor implements Interceptor {
@ -58,14 +59,6 @@ public class HttpInterceptor implements Interceptor {
return response; return response;
} }
public interface RequestInterceptor {
Request intercept(Request request) throws IOException;
}
public interface ResponseInterceptor {
Response intercept(Response response) throws IOException;
}
public HttpInterceptor addRequestInterceptor(RequestInterceptor requestInterceptor) { public HttpInterceptor addRequestInterceptor(RequestInterceptor requestInterceptor) {
mRequestInterceptors.add(requestInterceptor); mRequestInterceptors.add(requestInterceptor);
return this; return this;
@ -106,4 +99,12 @@ public class HttpInterceptor implements Interceptor {
public ArrayList<ResponseInterceptor> getResponseInterceptors() { public ArrayList<ResponseInterceptor> getResponseInterceptors() {
return mResponseInterceptors; return mResponseInterceptors;
} }
public interface RequestInterceptor {
Request intercept(Request request) throws IOException;
}
public interface ResponseInterceptor {
Response intercept(Response response) throws IOException;
}
} }

View File

@ -25,12 +25,6 @@
package com.owncloud.android.lib.common.http.methods; package com.owncloud.android.lib.common.http.methods;
import com.owncloud.android.lib.common.http.HttpClient; import com.owncloud.android.lib.common.http.HttpClient;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import okhttp3.Call; import okhttp3.Call;
import okhttp3.Headers; import okhttp3.Headers;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
@ -39,6 +33,11 @@ import okhttp3.Request;
import okhttp3.RequestBody; import okhttp3.RequestBody;
import okhttp3.Response; import okhttp3.Response;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.concurrent.TimeUnit;
/** /**
* Wrapper to perform http calls transparently by using: * Wrapper to perform http calls transparently by using:
* - OkHttp for non webdav methods * - OkHttp for non webdav methods
@ -136,6 +135,12 @@ public abstract class HttpBaseMethod {
// Connection parameters // Connection parameters
public void setRetryOnConnectionFailure(boolean retryOnConnectionFailure) {
mOkHttpClient = mOkHttpClient.newBuilder()
.retryOnConnectionFailure(retryOnConnectionFailure)
.build();
}
public void setReadTimeout(long readTimeout, TimeUnit timeUnit) { public void setReadTimeout(long readTimeout, TimeUnit timeUnit) {
mOkHttpClient = mOkHttpClient.newBuilder() mOkHttpClient = mOkHttpClient.newBuilder()
.readTimeout(readTimeout, timeUnit) .readTimeout(readTimeout, timeUnit)
@ -154,12 +159,6 @@ public abstract class HttpBaseMethod {
.build(); .build();
} }
public void setRetryOnConnectionFailure(boolean retryOnConnectionFailure) {
mOkHttpClient = mOkHttpClient.newBuilder()
.retryOnConnectionFailure(retryOnConnectionFailure)
.build();
}
// Request // Request
public void addRequestHeader(String name, String value) { public void addRequestHeader(String name, String value) {

View File

@ -27,10 +27,9 @@ package com.owncloud.android.lib.common.http.methods.nonwebdav;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import okhttp3.HttpUrl;
/** /**
* OkHttp delete calls wrapper * OkHttp delete calls wrapper
*
* @author David González Verdugo * @author David González Verdugo
*/ */
public class DeleteMethod extends HttpMethod { public class DeleteMethod extends HttpMethod {

View File

@ -27,10 +27,9 @@ package com.owncloud.android.lib.common.http.methods.nonwebdav;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import okhttp3.HttpUrl;
/** /**
* OkHttp get calls wrapper * OkHttp get calls wrapper
*
* @author David González Verdugo * @author David González Verdugo
*/ */
public class GetMethod extends HttpMethod { public class GetMethod extends HttpMethod {

View File

@ -29,9 +29,6 @@ import com.owncloud.android.lib.common.http.methods.HttpBaseMethod;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import okhttp3.Call;
import okhttp3.HttpUrl;
/** /**
* Wrapper to perform OkHttp calls * Wrapper to perform OkHttp calls
* *

View File

@ -27,10 +27,9 @@ package com.owncloud.android.lib.common.http.methods.nonwebdav;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import okhttp3.HttpUrl;
/** /**
* OkHttp post calls wrapper * OkHttp post calls wrapper
*
* @author David González Verdugo * @author David González Verdugo
*/ */
public class PostMethod extends HttpMethod { public class PostMethod extends HttpMethod {

View File

@ -27,8 +27,6 @@ package com.owncloud.android.lib.common.http.methods.nonwebdav;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import okhttp3.HttpUrl;
public class PutMethod extends HttpMethod { public class PutMethod extends HttpMethod {
public PutMethod(URL url) { public PutMethod(URL url) {

View File

@ -24,12 +24,13 @@
package com.owncloud.android.lib.common.http.methods.webdav; package com.owncloud.android.lib.common.http.methods.webdav;
import java.net.URL;
import kotlin.Unit; import kotlin.Unit;
import java.net.URL;
/** /**
* Copy calls wrapper * Copy calls wrapper
*
* @author Christian Schabesberger * @author Christian Schabesberger
* @author David González Verdugo * @author David González Verdugo
*/ */

View File

@ -24,23 +24,23 @@
package com.owncloud.android.lib.common.http.methods.webdav; package com.owncloud.android.lib.common.http.methods.webdav;
import com.owncloud.android.lib.common.http.HttpConstants;
import com.owncloud.android.lib.common.http.methods.HttpBaseMethod;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import at.bitfire.dav4android.Constants; import at.bitfire.dav4android.Constants;
import at.bitfire.dav4android.DavOCResource; import at.bitfire.dav4android.DavOCResource;
import at.bitfire.dav4android.exception.HttpException; import at.bitfire.dav4android.exception.HttpException;
import at.bitfire.dav4android.exception.RedirectException; import at.bitfire.dav4android.exception.RedirectException;
import com.owncloud.android.lib.common.http.HttpConstants;
import com.owncloud.android.lib.common.http.methods.HttpBaseMethod;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
import okhttp3.Protocol; import okhttp3.Protocol;
import okhttp3.Response; import okhttp3.Response;
import okhttp3.ResponseBody; import okhttp3.ResponseBody;
import java.net.URL;
import java.util.concurrent.TimeUnit;
/** /**
* Wrapper to perform WebDAV (dav4android) calls * Wrapper to perform WebDAV (dav4android) calls
*
* @author David González Verdugo * @author David González Verdugo
*/ */
public abstract class DavMethod extends HttpBaseMethod { public abstract class DavMethod extends HttpBaseMethod {
@ -124,6 +124,24 @@ public abstract class DavMethod extends HttpBaseMethod {
Constants.INSTANCE.getLog()); Constants.INSTANCE.getLog());
} }
@Override
public void setUrl(HttpUrl url) {
super.setUrl(url);
mDavResource = new DavOCResource(
mOkHttpClient,
HttpUrl.parse(mRequest.url().toString()),
Constants.INSTANCE.getLog());
}
@Override
public boolean getRetryOnConnectionFailure() {
return false; //TODO: implement me
}
//////////////////////////////
// Getter
//////////////////////////////
@Override @Override
public void setRetryOnConnectionFailure(boolean retryOnConnectionFailure) { public void setRetryOnConnectionFailure(boolean retryOnConnectionFailure) {
super.setRetryOnConnectionFailure(retryOnConnectionFailure); super.setRetryOnConnectionFailure(retryOnConnectionFailure);
@ -133,24 +151,6 @@ public abstract class DavMethod extends HttpBaseMethod {
Constants.INSTANCE.getLog()); Constants.INSTANCE.getLog());
} }
@Override
public void setUrl(HttpUrl url){
super.setUrl(url);
mDavResource = new DavOCResource(
mOkHttpClient,
HttpUrl.parse(mRequest.url().toString()),
Constants.INSTANCE.getLog());
}
//////////////////////////////
// Getter
//////////////////////////////
@Override
public boolean getRetryOnConnectionFailure() {
return false; //TODO: implement me
}
@Override @Override
public boolean isAborted() { public boolean isAborted() {
return mDavResource.isCallAborted(); return mDavResource.isCallAborted();

View File

@ -24,12 +24,13 @@
package com.owncloud.android.lib.common.http.methods.webdav; package com.owncloud.android.lib.common.http.methods.webdav;
import java.net.URL;
import kotlin.Unit; import kotlin.Unit;
import java.net.URL;
/** /**
* MkCol calls wrapper * MkCol calls wrapper
*
* @author Christian Schabesberger * @author Christian Schabesberger
* @author David González Verdugo * @author David González Verdugo
*/ */

View File

@ -25,13 +25,13 @@
package com.owncloud.android.lib.common.http.methods.webdav; package com.owncloud.android.lib.common.http.methods.webdav;
import com.owncloud.android.lib.common.http.HttpConstants; import com.owncloud.android.lib.common.http.HttpConstants;
import kotlin.Unit;
import java.net.URL; import java.net.URL;
import kotlin.Unit;
/** /**
* Move calls wrapper * Move calls wrapper
*
* @author Christian Schabesberger * @author Christian Schabesberger
* @author David González Verdugo * @author David González Verdugo
*/ */

View File

@ -24,18 +24,19 @@
package com.owncloud.android.lib.common.http.methods.webdav; package com.owncloud.android.lib.common.http.methods.webdav;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import at.bitfire.dav4android.Property; import at.bitfire.dav4android.Property;
import at.bitfire.dav4android.Response; import at.bitfire.dav4android.Response;
import at.bitfire.dav4android.exception.DavException; import at.bitfire.dav4android.exception.DavException;
import kotlin.Unit; import kotlin.Unit;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
/** /**
* Propfind calls wrapper * Propfind calls wrapper
*
* @author David González Verdugo * @author David González Verdugo
*/ */
public class PropfindMethod extends DavMethod { public class PropfindMethod extends DavMethod {

View File

@ -24,23 +24,25 @@
package com.owncloud.android.lib.common.http.methods.webdav; package com.owncloud.android.lib.common.http.methods.webdav;
import at.bitfire.dav4android.exception.HttpException;
import com.owncloud.android.lib.common.http.HttpConstants; import com.owncloud.android.lib.common.http.HttpConstants;
import kotlin.Unit;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import at.bitfire.dav4android.exception.HttpException;
import kotlin.Unit;
/** /**
* Put calls wrapper * Put calls wrapper
*
* @author David González Verdugo * @author David González Verdugo
*/ */
public class PutMethod extends DavMethod { public class PutMethod extends DavMethod {
public PutMethod(URL url) { public PutMethod(URL url) {
super(url); super(url);
}; }
;
@Override @Override
public int onExecute() throws IOException, HttpException { public int onExecute() throws IOException, HttpException {

View File

@ -24,6 +24,11 @@
package com.owncloud.android.lib.common.network; package com.owncloud.android.lib.common.network;
import com.owncloud.android.lib.common.utils.Log_OC;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import java.security.KeyStore; import java.security.KeyStore;
import java.security.KeyStoreException; import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
@ -34,14 +39,6 @@ import java.security.cert.CertificateExpiredException;
import java.security.cert.CertificateNotYetValidException; import java.security.cert.CertificateNotYetValidException;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import com.owncloud.android.lib.common.utils.Log_OC;
/** /**
* @author David A. Velasco * @author David A. Velasco
*/ */
@ -69,9 +66,9 @@ public class AdvancedX509TrustManager implements X509TrustManager {
mKnownServersKeyStore = knownServersKeyStore; mKnownServersKeyStore = knownServersKeyStore;
} }
/** /**
* Locates the first X509TrustManager provided by a given TrustManagerFactory * Locates the first X509TrustManager provided by a given TrustManagerFactory
*
* @param factory TrustManagerFactory to inspect in the search for a X509TrustManager * @param factory TrustManagerFactory to inspect in the search for a X509TrustManager
* @return The first X509TrustManager found in factory. * @return The first X509TrustManager found in factory.
* @throws CertStoreException When no X509TrustManager instance was found in factory * @throws CertStoreException When no X509TrustManager instance was found in factory
@ -86,7 +83,6 @@ public class AdvancedX509TrustManager implements X509TrustManager {
return null; return null;
} }
/** /**
* @see javax.net.ssl.X509TrustManager#checkClientTrusted(X509Certificate[], * @see javax.net.ssl.X509TrustManager#checkClientTrusted(X509Certificate[],
* String authType) * String authType)
@ -95,7 +91,6 @@ public class AdvancedX509TrustManager implements X509TrustManager {
mStandardTrustManager.checkClientTrusted(certificates, authType); mStandardTrustManager.checkClientTrusted(certificates, authType);
} }
/** /**
* @see javax.net.ssl.X509TrustManager#checkServerTrusted(X509Certificate[], * @see javax.net.ssl.X509TrustManager#checkServerTrusted(X509Certificate[],
* String authType) * String authType)
@ -128,13 +123,13 @@ public class AdvancedX509TrustManager implements X509TrustManager {
} }
} }
if (result.isException()) if (result.isException()) {
throw result; throw result;
}
} }
} }
/** /**
* @see javax.net.ssl.X509TrustManager#getAcceptedIssuers() * @see javax.net.ssl.X509TrustManager#getAcceptedIssuers()
*/ */
@ -142,7 +137,6 @@ public class AdvancedX509TrustManager implements X509TrustManager {
return mStandardTrustManager.getAcceptedIssuers(); return mStandardTrustManager.getAcceptedIssuers();
} }
public boolean isKnownServer(X509Certificate cert) { public boolean isKnownServer(X509Certificate cert) {
try { try {
return (mKnownServersKeyStore.getCertificateAlias(cert) != null); return (mKnownServersKeyStore.getCertificateAlias(cert) != null);

View File

@ -24,26 +24,25 @@
package com.owncloud.android.lib.common.network; package com.owncloud.android.lib.common.network;
import javax.net.ssl.SSLPeerUnverifiedException;
import java.security.cert.CertPathValidatorException; import java.security.cert.CertPathValidatorException;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
import java.security.cert.CertificateExpiredException; import java.security.cert.CertificateExpiredException;
import java.security.cert.CertificateNotYetValidException; import java.security.cert.CertificateNotYetValidException;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import javax.net.ssl.SSLPeerUnverifiedException;
/** /**
* Exception joining all the problems that {@link AdvancedX509TrustManager} can find in * Exception joining all the problems that {@link AdvancedX509TrustManager} can find in
* a certificate chain for a server. * a certificate chain for a server.
* * <p>
* This was initially created as an extension of CertificateException, but some * This was initially created as an extension of CertificateException, but some
* implementations of the SSL socket layer in existing devices are REPLACING the CertificateException * implementations of the SSL socket layer in existing devices are REPLACING the CertificateException
* instances thrown by {@link javax.net.ssl.X509TrustManager#checkServerTrusted(X509Certificate[], String)} * instances thrown by {@link javax.net.ssl.X509TrustManager#checkServerTrusted(X509Certificate[], String)}
* with SSLPeerUnverifiedException FORGETTING THE CAUSING EXCEPTION instead of wrapping it. * with SSLPeerUnverifiedException FORGETTING THE CAUSING EXCEPTION instead of wrapping it.
* * <p>
* Due to this, extending RuntimeException is necessary to get that the CertificateCombinedException * Due to this, extending RuntimeException is necessary to get that the CertificateCombinedException
* instance reaches {@link AdvancedSslSocketFactory#verifyPeerIdentity}. * instance reaches {@link AdvancedSslSocketFactory#verifyPeerIdentity}.
* * <p>
* BE CAREFUL. As a RuntimeException extensions, Java compilers do not require to handle it * BE CAREFUL. As a RuntimeException extensions, Java compilers do not require to handle it
* in client methods. Be sure to use it only when you know exactly where it will go. * in client methods. Be sure to use it only when you know exactly where it will go.
* *
@ -51,7 +50,9 @@ import javax.net.ssl.SSLPeerUnverifiedException;
*/ */
public class CertificateCombinedException extends RuntimeException { public class CertificateCombinedException extends RuntimeException {
/** Generated - to refresh every time the class changes */ /**
* Generated - to refresh every time the class changes
*/
private static final long serialVersionUID = -8875782030758554999L; private static final long serialVersionUID = -8875782030758554999L;
private X509Certificate mServerCert = null; private X509Certificate mServerCert = null;

View File

@ -27,6 +27,8 @@ package com.owncloud.android.lib.common.network;
import android.util.Log; import android.util.Log;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import okhttp3.MediaType;
import okio.BufferedSink;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
@ -34,9 +36,6 @@ import java.nio.ByteBuffer;
import java.nio.channels.FileChannel; import java.nio.channels.FileChannel;
import java.util.Iterator; import java.util.Iterator;
import okhttp3.MediaType;
import okio.BufferedSink;
/** /**
* A Request body that represents a file chunk and include information about the progress when uploading it * A Request body that represents a file chunk and include information about the progress when uploading it
* *
@ -84,11 +83,12 @@ public class ChunkFromFileRequestBody extends FileRequestBody {
try { try {
mChannel.position(mOffset); mChannel.position(mOffset);
long size = mFile.length(); long size = mFile.length();
if (size == 0) size = -1; if (size == 0) {
size = -1;
}
long maxCount = Math.min(mOffset + mChunkSize, mChannel.size()); long maxCount = Math.min(mOffset + mChunkSize, mChannel.size());
while (mChannel.position() < maxCount) { while (mChannel.position() < maxCount) {
Log_OC.d(TAG, "Sink buffer size: " + sink.buffer().size()); Log_OC.d(TAG, "Sink buffer size: " + sink.buffer().size());
readCount = mChannel.read(mBuffer); readCount = mChannel.read(mBuffer);

View File

@ -26,7 +26,11 @@ package com.owncloud.android.lib.common.network;
import android.util.Log; import android.util.Log;
import com.owncloud.android.lib.common.utils.Log_OC; import okhttp3.MediaType;
import okhttp3.RequestBody;
import okio.BufferedSink;
import okio.Okio;
import okio.Source;
import java.io.File; import java.io.File;
import java.util.Collection; import java.util.Collection;
@ -34,12 +38,6 @@ import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.Set; import java.util.Set;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import okio.BufferedSink;
import okio.Okio;
import okio.Source;
/** /**
* A Request body that represents a file and include information about the progress when uploading it * A Request body that represents a file and include information about the progress when uploading it
* *

View File

@ -24,6 +24,11 @@
package com.owncloud.android.lib.common.network; package com.owncloud.android.lib.common.network;
import android.content.Context;
import com.owncloud.android.lib.common.utils.Log_OC;
import org.apache.http.conn.ssl.X509HostnameVerifier;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@ -35,29 +40,25 @@ import java.security.NoSuchAlgorithmException;
import java.security.cert.Certificate; import java.security.cert.Certificate;
import java.security.cert.CertificateException; import java.security.cert.CertificateException;
import org.apache.http.conn.ssl.X509HostnameVerifier;
import android.content.Context;
import com.owncloud.android.lib.common.utils.Log_OC;
public class NetworkUtils { public class NetworkUtils {
final private static String TAG = NetworkUtils.class.getSimpleName(); /**
* Default timeout for waiting data from the server
/** Default timeout for waiting data from the server */ */
public static final int DEFAULT_DATA_TIMEOUT = 60000; public static final int DEFAULT_DATA_TIMEOUT = 60000;
/**
/** Default timeout for establishing a connection */ * Default timeout for establishing a connection
*/
public static final int DEFAULT_CONNECTION_TIMEOUT = 60000; public static final int DEFAULT_CONNECTION_TIMEOUT = 60000;
/**
/** Standard name for protocol TLS version 1.2 in Java Secure Socket Extension (JSSE) API */ * Standard name for protocol TLS version 1.2 in Java Secure Socket Extension (JSSE) API
*/
public static final String PROTOCOL_TLSv1_2 = "TLSv1.2"; public static final String PROTOCOL_TLSv1_2 = "TLSv1.2";
/**
/** Standard name for protocol TLS version 1.0 in JSSE API */ * Standard name for protocol TLS version 1.0 in JSSE API
*/
public static final String PROTOCOL_TLSv1_0 = "TLSv1"; public static final String PROTOCOL_TLSv1_0 = "TLSv1";
final private static String TAG = NetworkUtils.class.getSimpleName();
private static X509HostnameVerifier mHostnameVerifier = null; private static X509HostnameVerifier mHostnameVerifier = null;
private static String LOCAL_TRUSTSTORE_FILENAME = "knownServers.bks"; private static String LOCAL_TRUSTSTORE_FILENAME = "knownServers.bks";
@ -68,9 +69,9 @@ public class NetworkUtils {
/** /**
* Returns the local store of reliable server certificates, explicitly accepted by the user. * Returns the local store of reliable server certificates, explicitly accepted by the user.
* * <p>
* Returns a KeyStore instance with empty content if the local store was never created. * Returns a KeyStore instance with empty content if the local store was never created.
* * <p>
* Loads the store from the storage environment if needed. * Loads the store from the storage environment if needed.
* *
* @param context Android context where the operation is being performed. * @param context Android context where the operation is being performed.
@ -103,7 +104,6 @@ public class NetworkUtils {
return mKnownServersStore; return mKnownServersStore;
} }
public static void addCertToKnownServersStore(Certificate cert, Context context) public static void addCertToKnownServersStore(Certificate cert, Context context)
throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException { throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException {

View File

@ -26,7 +26,6 @@ package com.owncloud.android.lib.common.network;
import java.util.Collection; import java.util.Collection;
public interface ProgressiveDataTransferer { public interface ProgressiveDataTransferer {
public void addDatatransferProgressListener(OnDatatransferProgressListener listener); public void addDatatransferProgressListener(OnDatatransferProgressListener listener);

View File

@ -27,22 +27,19 @@
package com.owncloud.android.lib.common.network; package com.owncloud.android.lib.common.network;
import com.owncloud.android.lib.common.http.HttpConstants; import com.owncloud.android.lib.common.http.HttpConstants;
import java.util.Arrays; import java.util.Arrays;
/** /**
* Aggregate saving the list of URLs followed in a sequence of redirections during the exceution of a * Aggregate saving the list of URLs followed in a sequence of redirections during the exceution of a
* {@link RemoteOperation}, and the status codes corresponding to all * {@link RemoteOperation}, and the status codes corresponding to all
* of them. * of them.
* * <p>
* The last status code saved corresponds to the first response not being a redirection, unless the sequence exceeds * The last status code saved corresponds to the first response not being a redirection, unless the sequence exceeds
* the maximum length of redirections allowed by the {@link com.owncloud.android.lib.common.OwnCloudClient} instance * the maximum length of redirections allowed by the {@link com.owncloud.android.lib.common.OwnCloudClient} instance
* that ran the operation. * that ran the operation.
* * <p>
* If no redirection was followed, the last (and first) status code contained corresponds to the original URL in the * If no redirection was followed, the last (and first) status code contained corresponds to the original URL in the
* request. * request.
*/ */
@ -86,7 +83,6 @@ public class RedirectionPath {
} }
} }
/** /**
* Adds a new status code to the list of status corresponding to followed redirections. * Adds a new status code to the list of status corresponding to followed redirections.
* *
@ -124,5 +120,4 @@ public class RedirectionPath {
return mLastLocation + 1; return mLastLocation + 1;
} }
} }

View File

@ -24,20 +24,18 @@
package com.owncloud.android.lib.common.network; package com.owncloud.android.lib.common.network;
import com.owncloud.android.lib.common.utils.Log_OC;
import javax.net.ssl.SSLSocket;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import javax.net.ssl.SSLSocket;
import com.owncloud.android.lib.common.utils.Log_OC;
/** /**
* Enables the support of Server Name Indication if existing * Enables the support of Server Name Indication if existing
* in the underlying network implementation. * in the underlying network implementation.
* * <p>
* Build as a singleton. * Build as a singleton.
* *
* @author David A. Velasco * @author David A. Velasco
@ -53,7 +51,6 @@ public class ServerNameIndicator {
private final WeakReference<Class<?>> mSSLSocketClassRef; private final WeakReference<Class<?>> mSSLSocketClassRef;
private final WeakReference<Method> mSetHostnameMethodRef; private final WeakReference<Method> mSetHostnameMethodRef;
/** /**
* Private constructor, class is a singleton. * Private constructor, class is a singleton.
* *
@ -65,11 +62,10 @@ public class ServerNameIndicator {
mSetHostnameMethodRef = (setHostnameMethod == null) ? null : new WeakReference<Method>(setHostnameMethod); mSetHostnameMethodRef = (setHostnameMethod == null) ? null : new WeakReference<Method>(setHostnameMethod);
} }
/** /**
* Calls the {@code #setHostname(String)} method of the underlying implementation * Calls the {@code #setHostname(String)} method of the underlying implementation
* of {@link SSLSocket} if exists. * of {@link SSLSocket} if exists.
* * <p>
* Creates and initializes the single instance of the class when needed * Creates and initializes the single instance of the class when needed
* *
* @param hostname The name of the server host of interest. * @param hostname The name of the server host of interest.
@ -96,7 +92,6 @@ public class ServerNameIndicator {
} }
} }
/** /**
* Gets the method to invoke trying to minimize the effective * Gets the method to invoke trying to minimize the effective
* application of reflection. * application of reflection.
@ -124,10 +119,9 @@ public class ServerNameIndicator {
} }
} }
/** /**
* Singleton initializer. * Singleton initializer.
* * <p>
* Uses reflection to extract and 'cache' the method to invoke to indicate the desited host name to the server side. * Uses reflection to extract and 'cache' the method to invoke to indicate the desited host name to the server side.
* *
* @param sslSocketClass Underlying class providing the implementation of {@link SSLSocket}. * @param sslSocketClass Underlying class providing the implementation of {@link SSLSocket}.

View File

@ -25,15 +25,15 @@
package com.owncloud.android.lib.common.network; package com.owncloud.android.lib.common.network;
import android.net.Uri;
import com.owncloud.android.lib.common.http.methods.HttpBaseMethod;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
import java.util.Locale; import java.util.Locale;
import android.net.Uri;
import com.owncloud.android.lib.common.http.methods.HttpBaseMethod;
public class WebdavUtils { public class WebdavUtils {
public static final SimpleDateFormat DISPLAY_DATE_FORMAT = new SimpleDateFormat( public static final SimpleDateFormat DISPLAY_DATE_FORMAT = new SimpleDateFormat(
"dd.MM.yyyy hh:mm"); "dd.MM.yyyy hh:mm");
@ -68,7 +68,7 @@ public class WebdavUtils {
/** /**
* Encodes a path according to URI RFC 2396. * Encodes a path according to URI RFC 2396.
* * <p>
* If the received path doesn't start with "/", the method adds it. * If the received path doesn't start with "/", the method adds it.
* *
* @param remoteFilePath Path * @param remoteFilePath Path
@ -76,13 +76,13 @@ public class WebdavUtils {
*/ */
public static String encodePath(String remoteFilePath) { public static String encodePath(String remoteFilePath) {
String encodedPath = Uri.encode(remoteFilePath, "/"); String encodedPath = Uri.encode(remoteFilePath, "/");
if (!encodedPath.startsWith("/")) if (!encodedPath.startsWith("/")) {
encodedPath = "/" + encodedPath; encodedPath = "/" + encodedPath;
}
return encodedPath; return encodedPath;
} }
/** /**
*
* @param rawEtag * @param rawEtag
* @return * @return
*/ */
@ -100,7 +100,6 @@ public class WebdavUtils {
} }
/** /**
*
* @param httpBaseMethod from which to get the etag * @param httpBaseMethod from which to get the etag
* @return etag from response * @return etag from response
*/ */

View File

@ -32,18 +32,17 @@ import java.lang.reflect.Method;
import java.net.Socket; import java.net.Socket;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
/** /**
* Enforces, if possible, a write timeout for a socket. * Enforces, if possible, a write timeout for a socket.
* * <p>
* Built as a singleton. * Built as a singleton.
* * <p>
* Tries to hit something like this: * Tries to hit something like this:
* https://android.googlesource.com/platform/external/conscrypt/+/lollipop-release/src/main/java/org/conscrypt/OpenSSLSocketImpl.java#1005 * https://android.googlesource.com/platform/external/conscrypt/+/lollipop-release/src/main/java/org/conscrypt/OpenSSLSocketImpl.java#1005
* * <p>
* Minimizes the chances of getting stalled in PUT/POST request if the network interface is lost while * Minimizes the chances of getting stalled in PUT/POST request if the network interface is lost while
* writing the entity into the outwards sockect. * writing the entity into the outwards sockect.
* * <p>
* It happens. See https://github.com/owncloud/android/issues/1684#issuecomment-295306015 * It happens. See https://github.com/owncloud/android/issues/1684#issuecomment-295306015
* *
* @author David A. Velasco * @author David A. Velasco
@ -56,11 +55,9 @@ public class WriteTimeoutEnforcer {
private static final String METHOD_NAME = "setSoWriteTimeout"; private static final String METHOD_NAME = "setSoWriteTimeout";
private final WeakReference<Class<?>> mSocketClassRef; private final WeakReference<Class<?>> mSocketClassRef;
private final WeakReference<Method> mSetSoWriteTimeoutMethodRef; private final WeakReference<Method> mSetSoWriteTimeoutMethodRef;
/** /**
* Private constructor, class is a singleton. * Private constructor, class is a singleton.
* *
@ -77,11 +74,10 @@ public class WriteTimeoutEnforcer {
; ;
} }
/** /**
* Calls the {@code #setSoWrite(int)} method of the underlying implementation * Calls the {@code #setSoWrite(int)} method of the underlying implementation
* of {@link Socket} if exists. * of {@link Socket} if exists.
* <p>
* Creates and initializes the single instance of the class when needed * Creates and initializes the single instance of the class when needed
* *
* @param writeTimeoutMilliseconds Write timeout to set, in milliseconds. * @param writeTimeoutMilliseconds Write timeout to set, in milliseconds.
@ -112,7 +108,6 @@ public class WriteTimeoutEnforcer {
} }
} }
/** /**
* Gets the method to invoke trying to minimize the cost of reflection reusing objects cached * Gets the method to invoke trying to minimize the cost of reflection reusing objects cached
* in static members. * in static members.
@ -143,10 +138,9 @@ public class WriteTimeoutEnforcer {
} }
} }
/** /**
* Singleton initializer. * Singleton initializer.
* * <p>
* Uses reflection to extract and 'cache' the method to invoke to set a write timouet in a socket. * Uses reflection to extract and 'cache' the method to invoke to set a write timouet in a socket.
* *
* @param socketClass Underlying class providing the implementation of {@link Socket}. * @param socketClass Underlying class providing the implementation of {@link Socket}.

View File

@ -34,6 +34,7 @@ import java.io.InputStream;
/** /**
* Parser for server exceptions * Parser for server exceptions
*
* @author davidgonzalez * @author davidgonzalez
*/ */
public class ErrorMessageParser { public class ErrorMessageParser {
@ -46,6 +47,7 @@ public class ErrorMessageParser {
/** /**
* Parse exception response * Parse exception response
*
* @param is * @param is
* @return errorMessage for an exception * @return errorMessage for an exception
* @throws XmlPullParserException * @throws XmlPullParserException
@ -74,6 +76,7 @@ public class ErrorMessageParser {
/** /**
* Parse OCS node * Parse OCS node
*
* @param parser * @param parser
* @return reason for exception * @return reason for exception
* @throws XmlPullParserException * @throws XmlPullParserException
@ -99,6 +102,7 @@ public class ErrorMessageParser {
/** /**
* Skip tags in parser procedure * Skip tags in parser procedure
*
* @param parser * @param parser
* @throws XmlPullParserException * @throws XmlPullParserException
* @throws IOException * @throws IOException
@ -122,6 +126,7 @@ public class ErrorMessageParser {
/** /**
* Read the text from a node * Read the text from a node
*
* @param parser * @param parser
* @return Text of the node * @return Text of the node
* @throws IOException * @throws IOException

View File

@ -35,6 +35,7 @@ import java.io.InputStream;
/** /**
* Parser for Invalid Character server exception * Parser for Invalid Character server exception
*
* @author masensio * @author masensio
*/ */
public class InvalidCharacterExceptionParser { public class InvalidCharacterExceptionParser {
@ -48,8 +49,10 @@ public class InvalidCharacterExceptionParser {
// Nodes for XML Parser // Nodes for XML Parser
private static final String NODE_ERROR = "d:error"; private static final String NODE_ERROR = "d:error";
private static final String NODE_EXCEPTION = "s:exception"; private static final String NODE_EXCEPTION = "s:exception";
/** /**
* Parse is as an Invalid Path Exception * Parse is as an Invalid Path Exception
*
* @param is * @param is
* @return if The exception is an Invalid Char Exception * @return if The exception is an Invalid Char Exception
* @throws XmlPullParserException * @throws XmlPullParserException
@ -78,6 +81,7 @@ public class InvalidCharacterExceptionParser {
/** /**
* Parse OCS node * Parse OCS node
*
* @param parser * @param parser
* @return List of ShareRemoteFiles * @return List of ShareRemoteFiles
* @throws XmlPullParserException * @throws XmlPullParserException
@ -105,6 +109,7 @@ public class InvalidCharacterExceptionParser {
/** /**
* Skip tags in parser procedure * Skip tags in parser procedure
*
* @param parser * @param parser
* @throws XmlPullParserException * @throws XmlPullParserException
* @throws IOException * @throws IOException
@ -128,6 +133,7 @@ public class InvalidCharacterExceptionParser {
/** /**
* Read the text from a node * Read the text from a node
*
* @param parser * @param parser
* @return Text of the node * @return Text of the node
* @throws IOException * @throws IOException

View File

@ -24,7 +24,6 @@
package com.owncloud.android.lib.common.operations; package com.owncloud.android.lib.common.operations;
public interface OnRemoteOperationListener { public interface OnRemoteOperationListener {
void onRemoteOperationFinish(RemoteOperation caller, RemoteOperationResult result); void onRemoteOperationFinish(RemoteOperation caller, RemoteOperationResult result);

View File

@ -12,25 +12,21 @@ import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; import com.owncloud.android.lib.common.OwnCloudClientManagerFactory;
import com.owncloud.android.lib.common.accounts.AccountUtils; import com.owncloud.android.lib.common.accounts.AccountUtils;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import okhttp3.OkHttpClient;
import java.io.IOException; import java.io.IOException;
import okhttp3.OkHttpClient;
public abstract class RemoteOperation<T extends Object> implements Runnable { public abstract class RemoteOperation<T extends Object> implements Runnable {
private static final String TAG = RemoteOperation.class.getSimpleName();
/** /**
* OCS API header name * OCS API header name
*/ */
public static final String OCS_API_HEADER = "OCS-APIREQUEST"; public static final String OCS_API_HEADER = "OCS-APIREQUEST";
/** /**
* OCS API header value * OCS API header value
*/ */
public static final String OCS_API_HEADER_VALUE = "true"; public static final String OCS_API_HEADER_VALUE = "true";
private static final String TAG = RemoteOperation.class.getSimpleName();
/** /**
* ownCloud account in the remote ownCloud server to operate * ownCloud account in the remote ownCloud server to operate
*/ */
@ -61,10 +57,9 @@ public abstract class RemoteOperation<T extends Object> implements Runnable {
*/ */
protected Handler mListenerHandler = null; protected Handler mListenerHandler = null;
/** /**
* Asynchronously executes the remote operation * Asynchronously executes the remote operation
* * <p>
* This method should be used whenever an ownCloud account is available, * This method should be used whenever an ownCloud account is available,
* instead of {@link #execute(OwnCloudClient, OnRemoteOperationListener, Handler))}. * instead of {@link #execute(OwnCloudClient, OnRemoteOperationListener, Handler))}.
* *
@ -79,12 +74,14 @@ public abstract class RemoteOperation<T extends Object> implements Runnable {
public Thread execute(Account account, Context context, public Thread execute(Account account, Context context,
OnRemoteOperationListener listener, Handler listenerHandler) { OnRemoteOperationListener listener, Handler listenerHandler) {
if (account == null) if (account == null) {
throw new IllegalArgumentException throw new IllegalArgumentException
("Trying to execute a remote operation with a NULL Account"); ("Trying to execute a remote operation with a NULL Account");
if (context == null) }
if (context == null) {
throw new IllegalArgumentException throw new IllegalArgumentException
("Trying to execute a remote operation with a NULL Context"); ("Trying to execute a remote operation with a NULL Context");
}
// mAccount and mContext in the runnerThread to create below // mAccount and mContext in the runnerThread to create below
mAccount = account; mAccount = account;
mContext = context.getApplicationContext(); mContext = context.getApplicationContext();
@ -99,7 +96,6 @@ public abstract class RemoteOperation<T extends Object> implements Runnable {
return runnerThread; return runnerThread;
} }
/** /**
* Asynchronously executes the remote operation * Asynchronously executes the remote operation
* *
@ -168,9 +164,9 @@ public abstract class RemoteOperation<T extends Object> implements Runnable {
/** /**
* Synchronously executes the remote operation on the received ownCloud account. * Synchronously executes the remote operation on the received ownCloud account.
* * <p>
* Do not call this method from the main thread. * Do not call this method from the main thread.
* * <p>
* This method should be used whenever an ownCloud account is available, instead of * This method should be used whenever an ownCloud account is available, instead of
* {@link #execute(OwnCloudClient)}. * {@link #execute(OwnCloudClient)}.
* *
@ -180,22 +176,23 @@ public abstract class RemoteOperation<T extends Object> implements Runnable {
* @return Result of the operation. * @return Result of the operation.
*/ */
public RemoteOperationResult<T> execute(Account account, Context context) { public RemoteOperationResult<T> execute(Account account, Context context) {
if (account == null) if (account == null) {
throw new IllegalArgumentException("Trying to execute a remote operation with a NULL " + throw new IllegalArgumentException("Trying to execute a remote operation with a NULL " +
"Account"); "Account");
if (context == null) }
if (context == null) {
throw new IllegalArgumentException("Trying to execute a remote operation with a NULL " + throw new IllegalArgumentException("Trying to execute a remote operation with a NULL " +
"Context"); "Context");
}
mAccount = account; mAccount = account;
mContext = context.getApplicationContext(); mContext = context.getApplicationContext();
return runOperation(); return runOperation();
} }
/** /**
* Synchronously executes the remote operation * Synchronously executes the remote operation
* * <p>
* Do not call this method from the main thread. * Do not call this method from the main thread.
* *
* @param client Client object to reach an ownCloud server during the execution of * @param client Client object to reach an ownCloud server during the execution of
@ -203,9 +200,10 @@ public abstract class RemoteOperation<T extends Object> implements Runnable {
* @return Result of the operation. * @return Result of the operation.
*/ */
public RemoteOperationResult<T> execute(OwnCloudClient client) { public RemoteOperationResult<T> execute(OwnCloudClient client) {
if (client == null) if (client == null) {
throw new IllegalArgumentException("Trying to execute a remote operation with a NULL " + throw new IllegalArgumentException("Trying to execute a remote operation with a NULL " +
"OwnCloudClient"); "OwnCloudClient");
}
mClient = client; mClient = client;
if (client.getAccount() != null) { if (client.getAccount() != null) {
mAccount = client.getAccount().getSavedAccount(); mAccount = client.getAccount().getSavedAccount();
@ -217,7 +215,7 @@ public abstract class RemoteOperation<T extends Object> implements Runnable {
/** /**
* Synchronously executes the remote operation * Synchronously executes the remote operation
* * <p>
* Do not call this method from the main thread. * Do not call this method from the main thread.
* *
* @param client Client object to reach an ownCloud server during the execution of * @param client Client object to reach an ownCloud server during the execution of
@ -225,9 +223,10 @@ public abstract class RemoteOperation<T extends Object> implements Runnable {
* @return Result of the operation. * @return Result of the operation.
*/ */
public RemoteOperationResult<T> execute(OkHttpClient client, Context context) { public RemoteOperationResult<T> execute(OkHttpClient client, Context context) {
if (client == null) if (client == null) {
throw new IllegalArgumentException("Trying to execute a remote operation with a NULL " + throw new IllegalArgumentException("Trying to execute a remote operation with a NULL " +
"OwnCloudClient"); "OwnCloudClient");
}
mHttpClient = client; mHttpClient = client;
mContext = context; mContext = context;
@ -236,7 +235,7 @@ public abstract class RemoteOperation<T extends Object> implements Runnable {
/** /**
* Run operation for asynchronous or synchronous 'onExecute' method. * Run operation for asynchronous or synchronous 'onExecute' method.
* * <p>
* Considers and performs silent refresh of account credentials if possible, and if * Considers and performs silent refresh of account credentials if possible, and if
* {@link RemoteOperation#setSilentRefreshOfAccountCredentials(boolean)} was called with * {@link RemoteOperation#setSilentRefreshOfAccountCredentials(boolean)} was called with
* parameter 'true' before the execution. * parameter 'true' before the execution.

View File

@ -27,14 +27,18 @@ package com.owncloud.android.lib.common.operations;
import android.accounts.Account; import android.accounts.Account;
import android.accounts.AccountsException; import android.accounts.AccountsException;
import at.bitfire.dav4android.exception.DavException;
import at.bitfire.dav4android.exception.HttpException;
import com.owncloud.android.lib.common.accounts.AccountUtils; import com.owncloud.android.lib.common.accounts.AccountUtils;
import com.owncloud.android.lib.common.http.HttpConstants; import com.owncloud.android.lib.common.http.HttpConstants;
import com.owncloud.android.lib.common.http.methods.HttpBaseMethod; import com.owncloud.android.lib.common.http.methods.HttpBaseMethod;
import com.owncloud.android.lib.common.network.CertificateCombinedException; import com.owncloud.android.lib.common.network.CertificateCombinedException;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import okhttp3.Headers;
import org.json.JSONException; import org.json.JSONException;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLPeerUnverifiedException;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
@ -48,13 +52,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLPeerUnverifiedException;
import at.bitfire.dav4android.exception.DavException;
import at.bitfire.dav4android.exception.HttpException;
import okhttp3.Headers;
public class RemoteOperationResult<T extends Object> public class RemoteOperationResult<T extends Object>
implements Serializable { implements Serializable {
@ -64,61 +61,6 @@ public class RemoteOperationResult<T extends Object>
private static final long serialVersionUID = 4968939884332372230L; private static final long serialVersionUID = 4968939884332372230L;
private static final String TAG = RemoteOperationResult.class.getSimpleName(); private static final String TAG = RemoteOperationResult.class.getSimpleName();
public enum ResultCode {
OK,
OK_SSL,
OK_NO_SSL,
UNHANDLED_HTTP_CODE,
UNAUTHORIZED,
FILE_NOT_FOUND,
INSTANCE_NOT_CONFIGURED,
UNKNOWN_ERROR,
WRONG_CONNECTION,
TIMEOUT,
INCORRECT_ADDRESS,
HOST_NOT_AVAILABLE,
NO_NETWORK_CONNECTION,
SSL_ERROR,
SSL_RECOVERABLE_PEER_UNVERIFIED,
BAD_OC_VERSION,
CANCELLED,
INVALID_LOCAL_FILE_NAME,
INVALID_OVERWRITE,
CONFLICT,
OAUTH2_ERROR,
SYNC_CONFLICT,
LOCAL_STORAGE_FULL,
LOCAL_STORAGE_NOT_MOVED,
LOCAL_STORAGE_NOT_COPIED,
OAUTH2_ERROR_ACCESS_DENIED,
QUOTA_EXCEEDED,
ACCOUNT_NOT_FOUND,
ACCOUNT_EXCEPTION,
ACCOUNT_NOT_NEW,
ACCOUNT_NOT_THE_SAME,
INVALID_CHARACTER_IN_NAME,
SHARE_NOT_FOUND,
LOCAL_STORAGE_NOT_REMOVED,
FORBIDDEN,
SHARE_FORBIDDEN,
SPECIFIC_FORBIDDEN,
OK_REDIRECT_TO_NON_SECURE_CONNECTION,
INVALID_MOVE_INTO_DESCENDANT,
INVALID_COPY_INTO_DESCENDANT,
PARTIAL_MOVE_DONE,
PARTIAL_COPY_DONE,
SHARE_WRONG_PARAMETER,
WRONG_SERVER_RESPONSE,
INVALID_CHARACTER_DETECT_IN_SERVER,
DELAYED_FOR_WIFI,
LOCAL_FILE_NOT_FOUND,
SERVICE_UNAVAILABLE,
SPECIFIC_SERVICE_UNAVAILABLE,
SPECIFIC_UNSUPPORTED_MEDIA_TYPE,
SPECIFIC_METHOD_NOT_ALLOWED
}
private boolean mSuccess = false; private boolean mSuccess = false;
private int mHttpCode = -1; private int mHttpCode = -1;
private String mHttpPhrase = null; private String mHttpPhrase = null;
@ -128,10 +70,9 @@ public class RemoteOperationResult<T extends Object>
private ArrayList<String> mAuthenticate = new ArrayList<>(); private ArrayList<String> mAuthenticate = new ArrayList<>();
private String mLastPermanentLocation = null; private String mLastPermanentLocation = null;
private T mData = null; private T mData = null;
/** /**
* Public constructor from result code. * Public constructor from result code.
* * <p>
* To be used when the caller takes the responsibility of interpreting the result of a {@link RemoteOperation} * To be used when the caller takes the responsibility of interpreting the result of a {@link RemoteOperation}
* *
* @param code {@link ResultCode} decided by the caller. * @param code {@link ResultCode} decided by the caller.
@ -146,6 +87,7 @@ public class RemoteOperationResult<T extends Object>
/** /**
* Create a new RemoteOperationResult based on the result given by a previous one. * Create a new RemoteOperationResult based on the result given by a previous one.
* It does not copy the data. * It does not copy the data.
*
* @param prevRemoteOperation * @param prevRemoteOperation
*/ */
public RemoteOperationResult(RemoteOperationResult prevRemoteOperation) { public RemoteOperationResult(RemoteOperationResult prevRemoteOperation) {
@ -161,9 +103,9 @@ public class RemoteOperationResult<T extends Object>
/** /**
* Public constructor from exception. * Public constructor from exception.
* * <p>
* To be used when an exception prevented the end of the {@link RemoteOperation}. * To be used when an exception prevented the end of the {@link RemoteOperation}.
* * <p>
* Determines a {@link ResultCode} depending on the type of the exception. * Determines a {@link ResultCode} depending on the type of the exception.
* *
* @param e Exception that interrupted the {@link RemoteOperation} * @param e Exception that interrupted the {@link RemoteOperation}
@ -220,9 +162,9 @@ public class RemoteOperationResult<T extends Object>
/** /**
* Public constructor from separate elements of an HTTP or DAV response. * Public constructor from separate elements of an HTTP or DAV response.
* * <p>
* To be used when the result needs to be interpreted from the response of an HTTP/DAV method. * To be used when the result needs to be interpreted from the response of an HTTP/DAV method.
* * <p>
* Determines a {@link ResultCode} from the already executed method received as a parameter. Generally, * Determines a {@link ResultCode} from the already executed method received as a parameter. Generally,
* will depend on the HTTP code and HTTP response headers received. In some cases will inspect also the * will depend on the HTTP code and HTTP response headers received. In some cases will inspect also the
* response body * response body
@ -285,39 +227,13 @@ public class RemoteOperationResult<T extends Object>
} }
} }
/**
* Parse the error message included in the body response, if any, and set the specific result
* code
*
* @param bodyResponse okHttp response body
* @param resultCode our own custom result code
* @throws IOException
*/
private void parseErrorMessageAndSetCode(String bodyResponse, ResultCode resultCode) {
if (bodyResponse != null && bodyResponse.length() > 0) {
InputStream is = new ByteArrayInputStream(bodyResponse.getBytes());
ErrorMessageParser xmlParser = new ErrorMessageParser();
try {
String errorMessage = xmlParser.parseXMLResponse(is);
if (errorMessage != "" && errorMessage != null) {
mCode = resultCode;
mHttpPhrase = errorMessage;
}
} catch (Exception e) {
Log_OC.w(TAG, "Error reading exception from server: " + e.getMessage());
// mCode stays as set in this(success, httpCode, headers)
}
}
}
/** /**
* Public constructor from separate elements of an HTTP or DAV response. * Public constructor from separate elements of an HTTP or DAV response.
* * <p>
* To be used when the result needs to be interpreted from HTTP response elements that could come from * To be used when the result needs to be interpreted from HTTP response elements that could come from
* different requests (WARNING: black magic, try to avoid). * different requests (WARNING: black magic, try to avoid).
* * <p>
* * <p>
* Determines a {@link ResultCode} depending on the HTTP code and HTTP response headers received. * Determines a {@link ResultCode} depending on the HTTP code and HTTP response headers received.
* *
* @param httpCode HTTP status code returned by an HTTP/DAV method. * @param httpCode HTTP status code returned by an HTTP/DAV method.
@ -345,7 +261,7 @@ public class RemoteOperationResult<T extends Object>
/** /**
* Private constructor for results built interpreting a HTTP or DAV response. * Private constructor for results built interpreting a HTTP or DAV response.
* * <p>
* Determines a {@link ResultCode} depending of the type of the exception. * Determines a {@link ResultCode} depending of the type of the exception.
* *
* @param httpCode HTTP status code returned by the HTTP/DAV method. * @param httpCode HTTP status code returned by the HTTP/DAV method.
@ -389,11 +305,40 @@ public class RemoteOperationResult<T extends Object>
} }
} }
/**
* Parse the error message included in the body response, if any, and set the specific result
* code
*
* @param bodyResponse okHttp response body
* @param resultCode our own custom result code
* @throws IOException
*/
private void parseErrorMessageAndSetCode(String bodyResponse, ResultCode resultCode) {
if (bodyResponse != null && bodyResponse.length() > 0) {
InputStream is = new ByteArrayInputStream(bodyResponse.getBytes());
ErrorMessageParser xmlParser = new ErrorMessageParser();
try {
String errorMessage = xmlParser.parseXMLResponse(is);
if (errorMessage != "" && errorMessage != null) {
mCode = resultCode;
mHttpPhrase = errorMessage;
}
} catch (Exception e) {
Log_OC.w(TAG, "Error reading exception from server: " + e.getMessage());
// mCode stays as set in this(success, httpCode, headers)
}
}
}
public boolean isSuccess() { public boolean isSuccess() {
return mSuccess; return mSuccess;
} }
public void setSuccess(boolean success) {
this.mSuccess = success;
}
public boolean isCancelled() { public boolean isCancelled() {
return mCode == ResultCode.CANCELLED; return mCode == ResultCode.CANCELLED;
} }
@ -459,10 +404,11 @@ public class RemoteOperationResult<T extends Object>
return "Unknown host exception"; return "Unknown host exception";
} else if (mException instanceof CertificateCombinedException) { } else if (mException instanceof CertificateCombinedException) {
if (((CertificateCombinedException) mException).isRecoverable()) if (((CertificateCombinedException) mException).isRecoverable()) {
return "SSL recoverable exception"; return "SSL recoverable exception";
else } else {
return "SSL exception"; return "SSL exception";
}
} else if (mException instanceof SSLException) { } else if (mException instanceof SSLException) {
return "SSL exception"; return "SSL exception";
@ -572,15 +518,65 @@ public class RemoteOperationResult<T extends Object>
mLastPermanentLocation = lastPermanentLocation; mLastPermanentLocation = lastPermanentLocation;
} }
public void setSuccess(boolean success) { public T getData() {
this.mSuccess = success; return mData;
} }
public void setData(T data) { public void setData(T data) {
mData = data; mData = data;
} }
public T getData() { public enum ResultCode {
return mData; OK,
OK_SSL,
OK_NO_SSL,
UNHANDLED_HTTP_CODE,
UNAUTHORIZED,
FILE_NOT_FOUND,
INSTANCE_NOT_CONFIGURED,
UNKNOWN_ERROR,
WRONG_CONNECTION,
TIMEOUT,
INCORRECT_ADDRESS,
HOST_NOT_AVAILABLE,
NO_NETWORK_CONNECTION,
SSL_ERROR,
SSL_RECOVERABLE_PEER_UNVERIFIED,
BAD_OC_VERSION,
CANCELLED,
INVALID_LOCAL_FILE_NAME,
INVALID_OVERWRITE,
CONFLICT,
OAUTH2_ERROR,
SYNC_CONFLICT,
LOCAL_STORAGE_FULL,
LOCAL_STORAGE_NOT_MOVED,
LOCAL_STORAGE_NOT_COPIED,
OAUTH2_ERROR_ACCESS_DENIED,
QUOTA_EXCEEDED,
ACCOUNT_NOT_FOUND,
ACCOUNT_EXCEPTION,
ACCOUNT_NOT_NEW,
ACCOUNT_NOT_THE_SAME,
INVALID_CHARACTER_IN_NAME,
SHARE_NOT_FOUND,
LOCAL_STORAGE_NOT_REMOVED,
FORBIDDEN,
SHARE_FORBIDDEN,
SPECIFIC_FORBIDDEN,
OK_REDIRECT_TO_NON_SECURE_CONNECTION,
INVALID_MOVE_INTO_DESCENDANT,
INVALID_COPY_INTO_DESCENDANT,
PARTIAL_MOVE_DONE,
PARTIAL_COPY_DONE,
SHARE_WRONG_PARAMETER,
WRONG_SERVER_RESPONSE,
INVALID_CHARACTER_DETECT_IN_SERVER,
DELAYED_FOR_WIFI,
LOCAL_FILE_NOT_FOUND,
SERVICE_UNAVAILABLE,
SPECIFIC_SERVICE_UNAVAILABLE,
SPECIFIC_UNSUPPORTED_MEDIA_TYPE,
SPECIFIC_METHOD_NOT_ALLOWED
} }
} }

View File

@ -39,7 +39,6 @@ public class RandomUtils {
/** /**
* @param length the number of random chars to be generated * @param length the number of random chars to be generated
*
* @return String containing random chars * @return String containing random chars
*/ */
public static String generateRandomString(int length) { public static String generateRandomString(int length) {

View File

@ -30,9 +30,9 @@ import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.http.HttpConstants; import com.owncloud.android.lib.common.http.HttpConstants;
import com.owncloud.android.lib.common.http.methods.webdav.CopyMethod; import com.owncloud.android.lib.common.http.methods.webdav.CopyMethod;
import com.owncloud.android.lib.common.network.WebdavUtils; import com.owncloud.android.lib.common.network.WebdavUtils;
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.lib.resources.status.OwnCloudVersion; import com.owncloud.android.lib.resources.status.OwnCloudVersion;
import java.net.URL; import java.net.URL;
@ -41,7 +41,7 @@ import java.util.concurrent.TimeUnit;
/** /**
* Remote operation moving a remote file or folder in the ownCloud server to a different folder * Remote operation moving a remote file or folder in the ownCloud server to a different folder
* in the same account. * in the same account.
* * <p>
* Allows renaming the moving file/folder at the same time. * Allows renaming the moving file/folder at the same time.
* *
* @author David A. Velasco * @author David A. Velasco
@ -119,7 +119,6 @@ public class CopyRemoteFileOperation extends RemoteOperation {
result = new RemoteOperationResult<>(ResultCode.INVALID_OVERWRITE); result = new RemoteOperationResult<>(ResultCode.INVALID_OVERWRITE);
client.exhaustResponse(copyMethod.getResponseBodyAsStream()); client.exhaustResponse(copyMethod.getResponseBodyAsStream());
/// for other errors that could be explicitly handled, check first: /// for other errors that could be explicitly handled, check first:
/// http://www.webdav.org/specs/rfc4918.html#rfc.section.9.9.4 /// http://www.webdav.org/specs/rfc4918.html#rfc.section.9.9.4

View File

@ -24,23 +24,21 @@
package com.owncloud.android.lib.resources.files; package com.owncloud.android.lib.resources.files;
import android.net.Uri; import android.net.Uri;
import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.http.HttpConstants; import com.owncloud.android.lib.common.http.HttpConstants;
import com.owncloud.android.lib.common.http.methods.webdav.MkColMethod; import com.owncloud.android.lib.common.http.methods.webdav.MkColMethod;
import com.owncloud.android.lib.common.network.WebdavUtils; import com.owncloud.android.lib.common.network.WebdavUtils;
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.resources.status.OwnCloudVersion; import com.owncloud.android.lib.resources.status.OwnCloudVersion;
import java.net.URL; import java.net.URL;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
* Remote operation performing the creation of a new folder in the ownCloud server. * Remote operation performing the creation of a new folder in the ownCloud server.
* *
@ -60,6 +58,7 @@ public class CreateRemoteFolderOperation extends RemoteOperation {
/** /**
* Constructor * Constructor
*
* @param remotePath Full path to the new directory to create in the remote server. * @param remotePath Full path to the new directory to create in the remote server.
* @param createFullPath 'True' means that all the ancestor folders should be created. * @param createFullPath 'True' means that all the ancestor folders should be created.
*/ */

View File

@ -56,9 +56,8 @@ public class DownloadRemoteFileOperation extends RemoteOperation {
private static final String TAG = DownloadRemoteFileOperation.class.getSimpleName(); private static final String TAG = DownloadRemoteFileOperation.class.getSimpleName();
private static final int FORBIDDEN_ERROR = 403; private static final int FORBIDDEN_ERROR = 403;
private static final int SERVICE_UNAVAILABLE_ERROR = 503; private static final int SERVICE_UNAVAILABLE_ERROR = 503;
private Set<OnDatatransferProgressListener> mDataTransferListeners = new HashSet<>();
private final AtomicBoolean mCancellationRequested = new AtomicBoolean(false); private final AtomicBoolean mCancellationRequested = new AtomicBoolean(false);
private Set<OnDatatransferProgressListener> mDataTransferListeners = new HashSet<>();
private long mModificationTimestamp = 0; private long mModificationTimestamp = 0;
private String mEtag = ""; private String mEtag = "";
private GetMethod mGet; private GetMethod mGet;
@ -94,7 +93,6 @@ public class DownloadRemoteFileOperation extends RemoteOperation {
return result; return result;
} }
private RemoteOperationResult downloadFile(OwnCloudClient client, File targetFile) throws private RemoteOperationResult downloadFile(OwnCloudClient client, File targetFile) throws
Exception { Exception {
@ -177,8 +175,12 @@ public class DownloadRemoteFileOperation extends RemoteOperation {
? new RemoteOperationResult<>(RemoteOperationResult.ResultCode.OK) ? new RemoteOperationResult<>(RemoteOperationResult.ResultCode.OK)
: new RemoteOperationResult<>(mGet); : new RemoteOperationResult<>(mGet);
} finally { } finally {
if (fos != null) fos.close(); if (fos != null) {
if (bis != null) bis.close(); fos.close();
}
if (bis != null) {
bis.close();
}
if (!savedFile && targetFile.exists()) { if (!savedFile && targetFile.exists()) {
targetFile.delete(); targetFile.delete();
} }

View File

@ -30,10 +30,9 @@ import java.io.File;
public class FileUtils { public class FileUtils {
private static final String TAG = FileUtils.class.getSimpleName();
public static final String PATH_SEPARATOR = "/"; public static final String PATH_SEPARATOR = "/";
public static final String FINAL_CHUNKS_FILE = ".file"; public static final String FINAL_CHUNKS_FILE = ".file";
private static final String TAG = FileUtils.class.getSimpleName();
public static String getParentPath(String remotePath) { public static String getParentPath(String remotePath) {
String parentPath = new File(remotePath).getParent(); String parentPath = new File(remotePath).getParent();
@ -44,6 +43,7 @@ public class FileUtils {
/** /**
* Validate the fileName to detect if contains any forbidden character: / , \ , < , > , * Validate the fileName to detect if contains any forbidden character: / , \ , < , > ,
* : , " , | , ? , * * : , " , | , ? , *
*
* @param fileName * @param fileName
* @param versionSupportsForbiddenChars * @param versionSupportsForbiddenChars
* @return * @return
@ -66,6 +66,7 @@ public class FileUtils {
/** /**
* Validate the path to detect if contains any forbidden character: \ , < , > , : , " , | , * Validate the path to detect if contains any forbidden character: \ , < , > , : , " , | ,
* ? , * * ? , *
*
* @param path * @param path
* @return * @return
*/ */

View File

@ -31,9 +31,9 @@ import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.http.HttpConstants; import com.owncloud.android.lib.common.http.HttpConstants;
import com.owncloud.android.lib.common.http.methods.webdav.MoveMethod; import com.owncloud.android.lib.common.http.methods.webdav.MoveMethod;
import com.owncloud.android.lib.common.network.WebdavUtils; import com.owncloud.android.lib.common.network.WebdavUtils;
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.lib.resources.status.OwnCloudVersion; import com.owncloud.android.lib.resources.status.OwnCloudVersion;
import java.net.URL; import java.net.URL;
@ -42,7 +42,7 @@ import java.util.concurrent.TimeUnit;
/** /**
* Remote operation moving a remote file or folder in the ownCloud server to a different folder * Remote operation moving a remote file or folder in the ownCloud server to a different folder
* in the same account. * in the same account.
* * <p>
* Allows renaming the moving file/folder at the same time. * Allows renaming the moving file/folder at the same time.
* *
* @author David A. Velasco * @author David A. Velasco
@ -65,7 +65,7 @@ public class MoveRemoteFileOperation extends RemoteOperation {
/** /**
* Constructor. * Constructor.
* * <p>
* TODO Paths should finish in "/" in the case of folders. ? * TODO Paths should finish in "/" in the case of folders. ?
* *
* @param srcRemotePath Remote path of the file/folder to move. * @param srcRemotePath Remote path of the file/folder to move.

View File

@ -24,6 +24,7 @@
package com.owncloud.android.lib.resources.files; package com.owncloud.android.lib.resources.files;
import at.bitfire.dav4android.Response;
import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.accounts.AccountUtils; import com.owncloud.android.lib.common.accounts.AccountUtils;
import com.owncloud.android.lib.common.http.HttpConstants; import com.owncloud.android.lib.common.http.HttpConstants;
@ -38,8 +39,6 @@ import com.owncloud.android.lib.common.utils.Log_OC;
import java.net.URL; import java.net.URL;
import java.util.ArrayList; import java.util.ArrayList;
import at.bitfire.dav4android.Response;
import static com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK; import static com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK;
/** /**

View File

@ -28,10 +28,6 @@ import android.net.Uri;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import at.bitfire.dav4android.Property; import at.bitfire.dav4android.Property;
import at.bitfire.dav4android.Response; import at.bitfire.dav4android.Response;
import at.bitfire.dav4android.property.CreationDate; import at.bitfire.dav4android.property.CreationDate;
@ -47,6 +43,10 @@ import at.bitfire.dav4android.property.owncloud.OCPrivatelink;
import at.bitfire.dav4android.property.owncloud.OCSize; import at.bitfire.dav4android.property.owncloud.OCSize;
import okhttp3.HttpUrl; import okhttp3.HttpUrl;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import static com.owncloud.android.lib.common.OwnCloudClient.WEBDAV_FILES_PATH_4_0; import static com.owncloud.android.lib.common.OwnCloudClient.WEBDAV_FILES_PATH_4_0;
/** /**
@ -58,11 +58,24 @@ import static com.owncloud.android.lib.common.OwnCloudClient.WEBDAV_FILES_PATH_4
public class RemoteFile implements Parcelable, Serializable { public class RemoteFile implements Parcelable, Serializable {
/**
* Parcelable Methods
*/
public static final Parcelable.Creator<RemoteFile> CREATOR = new Parcelable.Creator<RemoteFile>() {
@Override
public RemoteFile createFromParcel(Parcel source) {
return new RemoteFile(source);
}
@Override
public RemoteFile[] newArray(int size) {
return new RemoteFile[size];
}
};
/** /**
* Generated - should be refreshed every time the class changes!! * Generated - should be refreshed every time the class changes!!
*/ */
private static final long serialVersionUID = -8965995357413958539L; private static final long serialVersionUID = -8965995357413958539L;
private String mRemotePath; private String mRemotePath;
private String mMimeType; private String mMimeType;
private long mLength; private long mLength;
@ -76,6 +89,100 @@ public class RemoteFile implements Parcelable, Serializable {
private BigDecimal mQuotaAvailableBytes; private BigDecimal mQuotaAvailableBytes;
private String mPrivateLink; private String mPrivateLink;
public RemoteFile() {
resetData();
}
/**
* Create new {@link RemoteFile} with given path.
* <p>
* The path received must be URL-decoded. Path separator must be OCFile.PATH_SEPARATOR, and it must be the first character in 'path'.
*
* @param path The remote path of the file.
*/
public RemoteFile(String path) {
resetData();
if (path == null || path.length() <= 0 || !path.startsWith(FileUtils.PATH_SEPARATOR)) {
throw new IllegalArgumentException("Trying to create a OCFile with a non valid remote path: " + path);
}
mRemotePath = path;
mCreationTimestamp = 0;
mLength = 0;
mMimeType = "DIR";
mQuotaUsedBytes = BigDecimal.ZERO;
mQuotaAvailableBytes = BigDecimal.ZERO;
mPrivateLink = null;
}
public RemoteFile(final Response davResource, String userId) {
this(getRemotePathFromUrl(davResource.getHref(), userId));
final List<Property> properties = davResource.getProperties();
for (Property property : properties) {
if (property instanceof CreationDate) {
this.setCreationTimestamp(
Long.parseLong(((CreationDate) property).getCreationDate()));
}
if (property instanceof GetContentLength) {
this.setLength(((GetContentLength) property).getContentLength());
}
if (property instanceof GetContentType) {
this.setMimeType(((GetContentType) property).getType());
}
if (property instanceof GetLastModified) {
this.setModifiedTimestamp(((GetLastModified) property).getLastModified());
}
if (property instanceof GetETag) {
this.setEtag(((GetETag) property).getETag());
}
if (property instanceof OCPermissions) {
this.setPermissions(((OCPermissions) property).getPermission());
}
if (property instanceof OCId) {
this.setRemoteId(((OCId) property).getId());
}
if (property instanceof OCSize) {
this.setSize(((OCSize) property).getSize());
}
if (property instanceof QuotaUsedBytes) {
this.setQuotaUsedBytes(
BigDecimal.valueOf(((QuotaUsedBytes) property).getQuotaUsedBytes()));
}
if (property instanceof QuotaAvailableBytes) {
this.setQuotaAvailableBytes(
BigDecimal.valueOf(((QuotaAvailableBytes) property).getQuotaAvailableBytes()));
}
if (property instanceof OCPrivatelink) {
this.setPrivateLink(((OCPrivatelink) property).getLink());
}
}
}
/**
* Reconstruct from parcel
*
* @param source The source parcel
*/
protected RemoteFile(Parcel source) {
readFromParcel(source);
}
/**
* Retrieves a relative path from a remote file url
* <p>
* Example: url:port/remote.php/dav/files/username/Documents/text.txt => /Documents/text.txt
*
* @param url remote file url
* @param userId file owner
* @return remote relative path of the file
*/
private static String getRemotePathFromUrl(HttpUrl url, String userId) {
final String davFilesPath = WEBDAV_FILES_PATH_4_0 + userId;
final String absoluteDavPath = Uri.decode(url.encodedPath());
final String pathToOc = absoluteDavPath.split(davFilesPath)[0];
return absoluteDavPath.replace(pathToOc + davFilesPath, "");
}
/** /**
* Getters and Setters * Getters and Setters
*/ */
@ -168,80 +275,6 @@ public class RemoteFile implements Parcelable, Serializable {
mPrivateLink = privateLink; mPrivateLink = privateLink;
} }
public RemoteFile() {
resetData();
}
/**
* Create new {@link RemoteFile} with given path.
*
* The path received must be URL-decoded. Path separator must be OCFile.PATH_SEPARATOR, and it must be the first character in 'path'.
*
* @param path The remote path of the file.
*/
public RemoteFile(String path) {
resetData();
if (path == null || path.length() <= 0 || !path.startsWith(FileUtils.PATH_SEPARATOR)) {
throw new IllegalArgumentException("Trying to create a OCFile with a non valid remote path: " + path);
}
mRemotePath = path;
mCreationTimestamp = 0;
mLength = 0;
mMimeType = "DIR";
mQuotaUsedBytes = BigDecimal.ZERO;
mQuotaAvailableBytes = BigDecimal.ZERO;
mPrivateLink = null;
}
public RemoteFile(final Response davResource, String userId) {
this(getRemotePathFromUrl(davResource.getHref(), userId));
final List<Property> properties = davResource.getProperties();
for(Property property : properties) {
if(property instanceof CreationDate)
this.setCreationTimestamp(
Long.parseLong(((CreationDate) property).getCreationDate()));
if(property instanceof GetContentLength)
this.setLength(((GetContentLength) property).getContentLength());
if(property instanceof GetContentType)
this.setMimeType(((GetContentType) property).getType());
if(property instanceof GetLastModified)
this.setModifiedTimestamp(((GetLastModified) property).getLastModified());
if(property instanceof GetETag)
this.setEtag(((GetETag) property).getETag());
if(property instanceof OCPermissions)
this.setPermissions(((OCPermissions) property).getPermission());
if(property instanceof OCId)
this.setRemoteId(((OCId) property).getId());
if(property instanceof OCSize)
this.setSize(((OCSize) property).getSize());
if(property instanceof QuotaUsedBytes)
this.setQuotaUsedBytes(
BigDecimal.valueOf(((QuotaUsedBytes) property).getQuotaUsedBytes()));
if(property instanceof QuotaAvailableBytes)
this.setQuotaAvailableBytes(
BigDecimal.valueOf(((QuotaAvailableBytes) property).getQuotaAvailableBytes()));
if(property instanceof OCPrivatelink)
this.setPrivateLink(((OCPrivatelink) property).getLink());
}
}
/**
* Retrieves a relative path from a remote file url
*
* Example: url:port/remote.php/dav/files/username/Documents/text.txt => /Documents/text.txt
*
* @param url remote file url
* @param userId file owner
* @return remote relative path of the file
*/
private static String getRemotePathFromUrl(HttpUrl url, String userId) {
final String davFilesPath = WEBDAV_FILES_PATH_4_0 + userId;
final String absoluteDavPath = Uri.decode(url.encodedPath());
final String pathToOc = absoluteDavPath.split(davFilesPath)[0];
return absoluteDavPath.replace(pathToOc + davFilesPath, "");
}
/** /**
* Used internally. Reset all file properties * Used internally. Reset all file properties
*/ */
@ -260,31 +293,6 @@ public class RemoteFile implements Parcelable, Serializable {
mPrivateLink = null; mPrivateLink = null;
} }
/**
* Parcelable Methods
*/
public static final Parcelable.Creator<RemoteFile> CREATOR = new Parcelable.Creator<RemoteFile>() {
@Override
public RemoteFile createFromParcel(Parcel source) {
return new RemoteFile(source);
}
@Override
public RemoteFile[] newArray(int size) {
return new RemoteFile[size];
}
};
/**
* Reconstruct from parcel
*
* @param source The source parcel
*/
protected RemoteFile(Parcel source) {
readFromParcel(source);
}
public void readFromParcel(Parcel source) { public void readFromParcel(Parcel source) {
mRemotePath = source.readString(); mRemotePath = source.readString();
mMimeType = source.readString(); mMimeType = source.readString();

View File

@ -24,20 +24,19 @@
package com.owncloud.android.lib.resources.files; package com.owncloud.android.lib.resources.files;
import java.io.File;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.http.HttpConstants; import com.owncloud.android.lib.common.http.HttpConstants;
import com.owncloud.android.lib.common.http.methods.webdav.MoveMethod; import com.owncloud.android.lib.common.http.methods.webdav.MoveMethod;
import com.owncloud.android.lib.common.network.WebdavUtils; import com.owncloud.android.lib.common.network.WebdavUtils;
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.resources.status.OwnCloudVersion; import com.owncloud.android.lib.resources.status.OwnCloudVersion;
import java.io.File;
import java.net.URL;
import java.util.concurrent.TimeUnit;
/** /**
* Remote operation performing the rename of a remote file or folder in the ownCloud server. * Remote operation performing the rename of a remote file or folder in the ownCloud server.
@ -92,8 +91,9 @@ public class RenameRemoteFileOperation extends RemoteOperation {
final boolean versionWithForbiddenChars = final boolean versionWithForbiddenChars =
(version != null && version.isVersionWithForbiddenCharacters()); (version != null && version.isVersionWithForbiddenCharacters());
if(!FileUtils.isValidPath(mNewRemotePath, versionWithForbiddenChars)) if (!FileUtils.isValidPath(mNewRemotePath, versionWithForbiddenChars)) {
return new RemoteOperationResult<>(ResultCode.INVALID_CHARACTER_IN_NAME); return new RemoteOperationResult<>(ResultCode.INVALID_CHARACTER_IN_NAME);
}
try { try {
if (mNewName.equals(mOldName)) { if (mNewName.equals(mOldName)) {

View File

@ -34,6 +34,7 @@ import com.owncloud.android.lib.common.operations.OperationCancelledException;
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import okhttp3.MediaType;
import java.io.File; import java.io.File;
import java.net.URL; import java.net.URL;
@ -41,8 +42,6 @@ import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import okhttp3.MediaType;
import static com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK; import static com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK;
/** /**
@ -56,15 +55,13 @@ import static com.owncloud.android.lib.common.operations.RemoteOperationResult.R
public class UploadRemoteFileOperation extends RemoteOperation { public class UploadRemoteFileOperation extends RemoteOperation {
private static final String TAG = UploadRemoteFileOperation.class.getSimpleName(); private static final String TAG = UploadRemoteFileOperation.class.getSimpleName();
protected final AtomicBoolean mCancellationRequested = new AtomicBoolean(false);
protected String mLocalPath; protected String mLocalPath;
protected String mRemotePath; protected String mRemotePath;
protected String mMimeType; protected String mMimeType;
protected String mFileLastModifTimestamp; protected String mFileLastModifTimestamp;
protected PutMethod mPutMethod = null; protected PutMethod mPutMethod = null;
protected String mRequiredEtag = null; protected String mRequiredEtag = null;
protected final AtomicBoolean mCancellationRequested = new AtomicBoolean(false);
protected Set<OnDatatransferProgressListener> mDataTransferListeners = new HashSet<OnDatatransferProgressListener>(); protected Set<OnDatatransferProgressListener> mDataTransferListeners = new HashSet<OnDatatransferProgressListener>();
protected FileRequestBody mFileRequestBody = null; protected FileRequestBody mFileRequestBody = null;
@ -175,10 +172,11 @@ public class UploadRemoteFileOperation extends RemoteOperation {
public void cancel() { public void cancel() {
synchronized (mCancellationRequested) { synchronized (mCancellationRequested) {
mCancellationRequested.set(true); mCancellationRequested.set(true);
if (mPutMethod != null) if (mPutMethod != null) {
mPutMethod.abort(); mPutMethod.abort();
} }
} }
}
public boolean isSuccess(int status) { public boolean isSuccess(int status) {
return ((status == HttpConstants.HTTP_OK || status == HttpConstants.HTTP_CREATED || return ((status == HttpConstants.HTTP_OK || status == HttpConstants.HTTP_CREATED ||

View File

@ -32,6 +32,7 @@ import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.resources.files.FileUtils; import com.owncloud.android.lib.resources.files.FileUtils;
import com.owncloud.android.lib.resources.files.UploadRemoteFileOperation; import com.owncloud.android.lib.resources.files.UploadRemoteFileOperation;
import okhttp3.MediaType;
import java.io.File; import java.io.File;
import java.io.RandomAccessFile; import java.io.RandomAccessFile;
@ -39,8 +40,6 @@ import java.net.URL;
import java.nio.channels.FileChannel; import java.nio.channels.FileChannel;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import okhttp3.MediaType;
import static com.owncloud.android.lib.common.http.HttpConstants.IF_MATCH_HEADER; import static com.owncloud.android.lib.common.http.HttpConstants.IF_MATCH_HEADER;
import static com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK; import static com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK;
@ -52,8 +51,8 @@ import static com.owncloud.android.lib.common.operations.RemoteOperationResult.R
*/ */
public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation { public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation {
private static final int LAST_CHUNK_TIMEOUT = 900000; //15 mins.
public static final long CHUNK_SIZE = 1024000; public static final long CHUNK_SIZE = 1024000;
private static final int LAST_CHUNK_TIMEOUT = 900000; //15 mins.
private static final String TAG = ChunkedUploadRemoteFileOperation.class.getSimpleName(); private static final String TAG = ChunkedUploadRemoteFileOperation.class.getSimpleName();
private String mTransferId; private String mTransferId;
@ -127,11 +126,13 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation
} }
} }
if (channel != null) if (channel != null) {
channel.close(); channel.close();
}
if (raf != null) if (raf != null) {
raf.close(); raf.close();
}
return result; return result;
} }

View File

@ -35,6 +35,7 @@ import com.owncloud.android.lib.common.http.methods.nonwebdav.PostMethod;
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import okhttp3.FormBody;
import java.net.URL; import java.net.URL;
import java.text.DateFormat; import java.text.DateFormat;
@ -42,8 +43,6 @@ import java.text.SimpleDateFormat;
import java.util.Calendar; import java.util.Calendar;
import java.util.Locale; import java.util.Locale;
import okhttp3.FormBody;
/** /**
* Creates a new share. This allows sharing with a user or group or as a link. * Creates a new share. This allows sharing with a user or group or as a link.
* *
@ -133,7 +132,6 @@ public class CreateRemoteShareOperation extends RemoteOperation {
mGetShareDetails = false; // defaults to false for backwards compatibility mGetShareDetails = false; // defaults to false for backwards compatibility
} }
/** /**
* Set name to create in Share resource. Ignored by servers previous to version 10.0.0 * Set name to create in Share resource. Ignored by servers previous to version 10.0.0
* *
@ -154,7 +152,6 @@ public class CreateRemoteShareOperation extends RemoteOperation {
mPassword = password; mPassword = password;
} }
/** /**
* Set expiration date to create in Share resource. * Set expiration date to create in Share resource.
* *
@ -165,7 +162,6 @@ public class CreateRemoteShareOperation extends RemoteOperation {
mExpirationDateInMillis = expirationDateInMillis; mExpirationDateInMillis = expirationDateInMillis;
} }
/** /**
* Set permissions to create in Share resource. * Set permissions to create in Share resource.
* *

View File

@ -50,7 +50,6 @@ public class GetRemoteShareOperation extends RemoteOperation<ShareParserResult>
private long mRemoteId; private long mRemoteId;
public GetRemoteShareOperation(long remoteId) { public GetRemoteShareOperation(long remoteId) {
mRemoteId = remoteId; mRemoteId = remoteId;
} }

View File

@ -36,7 +36,6 @@ import com.owncloud.android.lib.common.http.methods.nonwebdav.GetMethod;
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONObject; import org.json.JSONObject;
@ -47,13 +46,13 @@ import static com.owncloud.android.lib.common.operations.RemoteOperationResult.R
/** /**
* Created by masensio on 08/10/2015. * Created by masensio on 08/10/2015.
* * <p>
* Retrieves a list of sharees (possible targets of a share) from the ownCloud server. * Retrieves a list of sharees (possible targets of a share) from the ownCloud server.
* * <p>
* Currently only handles users and groups. Users in other OC servers (federation) should be added later. * Currently only handles users and groups. Users in other OC servers (federation) should be added later.
* * <p>
* Depends on SHAREE API. {@See https://github.com/owncloud/documentation/issues/1626} * Depends on SHAREE API. {@See https://github.com/owncloud/documentation/issues/1626}
* * <p>
* Syntax: * Syntax:
* Entry point: ocs/v2.php/apps/files_sharing/api/v1/sharees * Entry point: ocs/v2.php/apps/files_sharing/api/v1/sharees
* HTTP method: GET * HTTP method: GET
@ -62,7 +61,7 @@ import static com.owncloud.android.lib.common.operations.RemoteOperationResult.R
* url argument: search - string, optional * url argument: search - string, optional
* url arguments: perPage - int, optional * url arguments: perPage - int, optional
* url arguments: page - int, optional * url arguments: page - int, optional
* * <p>
* Status codes: * Status codes:
* 100 - successful * 100 - successful
* *
@ -72,22 +71,22 @@ import static com.owncloud.android.lib.common.operations.RemoteOperationResult.R
*/ */
public class GetRemoteShareesOperation extends RemoteOperation<ArrayList<JSONObject>> { public class GetRemoteShareesOperation extends RemoteOperation<ArrayList<JSONObject>> {
public static final String NODE_VALUE = "value";
public static final String PROPERTY_LABEL = "label";
public static final String PROPERTY_SHARE_TYPE = "shareType";
public static final String PROPERTY_SHARE_WITH = "shareWith";
private static final String TAG = GetRemoteShareesOperation.class.getSimpleName(); private static final String TAG = GetRemoteShareesOperation.class.getSimpleName();
// OCS Routes // OCS Routes
private static final String OCS_ROUTE = "ocs/v2.php/apps/files_sharing/api/v1/sharees"; // from OC 8.2 private static final String OCS_ROUTE = "ocs/v2.php/apps/files_sharing/api/v1/sharees"; // from OC 8.2
// Arguments - names // Arguments - names
private static final String PARAM_FORMAT = "format"; private static final String PARAM_FORMAT = "format";
private static final String PARAM_ITEM_TYPE = "itemType"; private static final String PARAM_ITEM_TYPE = "itemType";
private static final String PARAM_SEARCH = "search"; private static final String PARAM_SEARCH = "search";
private static final String PARAM_PAGE = "page"; // default = 1 private static final String PARAM_PAGE = "page"; // default = 1
private static final String PARAM_PER_PAGE = "perPage"; // default = 200 private static final String PARAM_PER_PAGE = "perPage"; // default = 200
// Arguments - constant values // Arguments - constant values
private static final String VALUE_FORMAT = "json"; private static final String VALUE_FORMAT = "json";
private static final String VALUE_ITEM_TYPE = "file"; // to get the server search for users / groups private static final String VALUE_ITEM_TYPE = "file"; // to get the server search for users / groups
// JSON Node names // JSON Node names
private static final String NODE_OCS = "ocs"; private static final String NODE_OCS = "ocs";
private static final String NODE_DATA = "data"; private static final String NODE_DATA = "data";
@ -95,11 +94,6 @@ public class GetRemoteShareesOperation extends RemoteOperation<ArrayList<JSONObj
private static final String NODE_USERS = "users"; private static final String NODE_USERS = "users";
private static final String NODE_GROUPS = "groups"; private static final String NODE_GROUPS = "groups";
private static final String NODE_REMOTES = "remotes"; private static final String NODE_REMOTES = "remotes";
public static final String NODE_VALUE = "value";
public static final String PROPERTY_LABEL = "label";
public static final String PROPERTY_SHARE_TYPE = "shareType";
public static final String PROPERTY_SHARE_WITH = "shareWith";
private String mSearchString; private String mSearchString;
private int mPage; private int mPage;
private int mPerPage; private int mPerPage;

View File

@ -24,15 +24,13 @@
package com.owncloud.android.lib.resources.shares; package com.owncloud.android.lib.resources.shares;
import java.io.File;
import java.io.Serializable;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.resources.files.FileUtils; import com.owncloud.android.lib.resources.files.FileUtils;
import java.io.Serializable;
/** /**
* Contains the data of a Share from the Share API * Contains the data of a Share from the Share API
@ -42,13 +40,6 @@ import com.owncloud.android.lib.resources.files.FileUtils;
*/ */
public class OCShare implements Parcelable, Serializable { public class OCShare implements Parcelable, Serializable {
/**
* Generated - should be refreshed every time the class changes!!
*/
private static final long serialVersionUID = 4124975224281327921L;
private static final String TAG = OCShare.class.getSimpleName();
public static final int DEFAULT_PERMISSION = -1; public static final int DEFAULT_PERMISSION = -1;
public static final int READ_PERMISSION_FLAG = 1; public static final int READ_PERMISSION_FLAG = 1;
public static final int UPDATE_PERMISSION_FLAG = 2; public static final int UPDATE_PERMISSION_FLAG = 2;
@ -78,7 +69,25 @@ public class OCShare implements Parcelable, Serializable {
public static final int FEDERATED_PERMISSIONS_FOR_FOLDER_AFTER_OC9 = public static final int FEDERATED_PERMISSIONS_FOR_FOLDER_AFTER_OC9 =
FEDERATED_PERMISSIONS_FOR_FOLDER_UP_TO_OC9 + FEDERATED_PERMISSIONS_FOR_FOLDER_UP_TO_OC9 +
SHARE_PERMISSION_FLAG; SHARE_PERMISSION_FLAG;
/**
* Parcelable Methods
*/
public static final Parcelable.Creator<OCShare> CREATOR = new Parcelable.Creator<OCShare>() {
@Override
public OCShare createFromParcel(Parcel source) {
return new OCShare(source);
}
@Override
public OCShare[] newArray(int size) {
return new OCShare[size];
}
};
/**
* Generated - should be refreshed every time the class changes!!
*/
private static final long serialVersionUID = 4124975224281327921L;
private static final String TAG = OCShare.class.getSimpleName();
private long mId; private long mId;
private long mFileSource; private long mFileSource;
private long mItemSource; private long mItemSource;
@ -110,6 +119,17 @@ public class OCShare implements Parcelable, Serializable {
mPath = path; mPath = path;
} }
/// Getters and Setters
/**
* Reconstruct from parcel
*
* @param source The source parcel
*/
protected OCShare(Parcel source) {
readFromParcel(source);
}
/** /**
* Used internally. Reset all file properties * Used internally. Reset all file properties
*/ */
@ -132,8 +152,6 @@ public class OCShare implements Parcelable, Serializable {
mName = ""; mName = "";
} }
/// Getters and Setters
public long getId() { public long getId() {
return mId; return mId;
} }
@ -266,30 +284,6 @@ public class OCShare implements Parcelable, Serializable {
return ShareType.PUBLIC_LINK.equals(mShareType) && mShareWith.length() > 0; return ShareType.PUBLIC_LINK.equals(mShareType) && mShareWith.length() > 0;
} }
/**
* Parcelable Methods
*/
public static final Parcelable.Creator<OCShare> CREATOR = new Parcelable.Creator<OCShare>() {
@Override
public OCShare createFromParcel(Parcel source) {
return new OCShare(source);
}
@Override
public OCShare[] newArray(int size) {
return new OCShare[size];
}
};
/**
* Reconstruct from parcel
*
* @param source The source parcel
*/
protected OCShare(Parcel source) {
readFromParcel(source);
}
public void readFromParcel(Parcel source) { public void readFromParcel(Parcel source) {
mId = source.readLong(); mId = source.readLong();
@ -314,13 +308,11 @@ public class OCShare implements Parcelable, Serializable {
mName = source.readString(); mName = source.readString();
} }
@Override @Override
public int describeContents() { public int describeContents() {
return this.hashCode(); return this.hashCode();
} }
@Override @Override
public void writeToParcel(Parcel dest, int flags) { public void writeToParcel(Parcel dest, int flags) {
dest.writeLong(mId); dest.writeLong(mId);

View File

@ -25,14 +25,15 @@
package com.owncloud.android.lib.resources.shares; package com.owncloud.android.lib.resources.shares;
/** /**
* Provides method to define a set of share permissions and calculate the appropiate * Provides method to define a set of share permissions and calculate the appropiate
* int value representing it. * int value representing it.
*/ */
public class SharePermissionsBuilder { public class SharePermissionsBuilder {
/** Set of permissions */ /**
* Set of permissions
*/
private int mPermissions = OCShare.READ_PERMISSION_FLAG; // READ is minimum permission private int mPermissions = OCShare.READ_PERMISSION_FLAG; // READ is minimum permission
/** /**

View File

@ -32,7 +32,6 @@ import android.net.Uri;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.resources.status.OwnCloudVersion; import com.owncloud.android.lib.resources.status.OwnCloudVersion;
import org.xmlpull.v1.XmlPullParserException; import org.xmlpull.v1.XmlPullParserException;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
@ -50,7 +49,6 @@ public class ShareToRemoteOperationResultParser {
private OwnCloudVersion mOwnCloudVersion = null; private OwnCloudVersion mOwnCloudVersion = null;
private Uri mServerBaseUri = null; private Uri mServerBaseUri = null;
public ShareToRemoteOperationResultParser(ShareXMLParser shareXmlParser) { public ShareToRemoteOperationResultParser(ShareXMLParser shareXmlParser) {
mShareXmlParser = shareXmlParser; mShareXmlParser = shareXmlParser;
} }

View File

@ -34,7 +34,6 @@ package com.owncloud.android.lib.resources.shares;
* 5 - Shared by contact * 5 - Shared by contact
* *
* @author masensio * @author masensio
*
*/ */
public enum ShareType { public enum ShareType {
@ -48,19 +47,12 @@ public enum ShareType {
private int value; private int value;
private ShareType(int value) private ShareType(int value) {
{
this.value = value; this.value = value;
} }
public int getValue() { public static ShareType fromValue(int value) {
return value; switch (value) {
}
public static ShareType fromValue(int value)
{
switch (value)
{
case -1: case -1:
return NO_SHARED; return NO_SHARED;
case 0: case 0:
@ -78,4 +70,8 @@ public enum ShareType {
} }
return null; return null;
} }
public int getValue() {
return value;
}
}; };

View File

@ -31,7 +31,6 @@ import com.owncloud.android.lib.resources.status.OwnCloudVersion;
* *
* @author masensio * @author masensio
* @author David González Verdugo * @author David González Verdugo
*
*/ */
public class ShareUtils { public class ShareUtils {

View File

@ -24,22 +24,23 @@
package com.owncloud.android.lib.resources.shares; package com.owncloud.android.lib.resources.shares;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
//import android.util.Log;
import android.util.Xml; import android.util.Xml;
import com.owncloud.android.lib.common.network.WebdavUtils; import com.owncloud.android.lib.common.network.WebdavUtils;
import com.owncloud.android.lib.resources.files.FileUtils; import com.owncloud.android.lib.resources.files.FileUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
//import android.util.Log;
/** /**
* Parser for Share API Response * Parser for Share API Response
*
* @author masensio * @author masensio
* @author David González Verdugo * @author David González Verdugo
*/ */
@ -91,6 +92,11 @@ public class ShareXMLParser {
private int mStatusCode; private int mStatusCode;
private String mMessage; private String mMessage;
// Constructor
public ShareXMLParser() {
mStatusCode = -1;
}
// Getters and Setters // Getters and Setters
public String getStatus() { public String getStatus() {
return mStatus; return mStatus;
@ -116,11 +122,6 @@ public class ShareXMLParser {
this.mMessage = message; this.mMessage = message;
} }
// Constructor
public ShareXMLParser() {
mStatusCode = -1;
}
public boolean isSuccess() { public boolean isSuccess() {
return mStatusCode == SUCCESS; return mStatusCode == SUCCESS;
} }
@ -139,6 +140,7 @@ public class ShareXMLParser {
/** /**
* Parse is as response of Share API * Parse is as response of Share API
*
* @param is * @param is
* @return List of ShareRemoteFiles * @return List of ShareRemoteFiles
* @throws XmlPullParserException * @throws XmlPullParserException
@ -165,6 +167,7 @@ public class ShareXMLParser {
/** /**
* Parse OCS node * Parse OCS node
*
* @param parser * @param parser
* @return List of ShareRemoteFiles * @return List of ShareRemoteFiles
* @throws XmlPullParserException * @throws XmlPullParserException
@ -194,6 +197,7 @@ public class ShareXMLParser {
/** /**
* Parse Meta node * Parse Meta node
*
* @param parser * @param parser
* @throws XmlPullParserException * @throws XmlPullParserException
* @throws IOException * @throws IOException
@ -225,6 +229,7 @@ public class ShareXMLParser {
/** /**
* Parse Data node * Parse Data node
*
* @param parser * @param parser
* @return * @return
* @throws XmlPullParserException * @throws XmlPullParserException
@ -276,9 +281,9 @@ public class ShareXMLParser {
} }
/** /**
* Parse Element node * Parse Element node
*
* @param parser * @param parser
* @return * @return
* @throws XmlPullParserException * @throws XmlPullParserException
@ -384,6 +389,7 @@ public class ShareXMLParser {
/** /**
* Parse a node, to obtain its text. Needs readText method * Parse a node, to obtain its text. Needs readText method
*
* @param parser * @param parser
* @param node * @param node
* @return Text of the node * @return Text of the node
@ -401,6 +407,7 @@ public class ShareXMLParser {
/** /**
* Read the text from a node * Read the text from a node
*
* @param parser * @param parser
* @return Text of the node * @return Text of the node
* @throws IOException * @throws IOException
@ -417,6 +424,7 @@ public class ShareXMLParser {
/** /**
* Skip tags in parser procedure * Skip tags in parser procedure
*
* @param parser * @param parser
* @throws XmlPullParserException * @throws XmlPullParserException
* @throws IOException * @throws IOException

View File

@ -33,6 +33,7 @@ import com.owncloud.android.lib.common.http.methods.nonwebdav.PutMethod;
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import okhttp3.FormBody;
import java.net.URL; import java.net.URL;
import java.text.DateFormat; import java.text.DateFormat;
@ -40,11 +41,9 @@ import java.text.SimpleDateFormat;
import java.util.Calendar; import java.util.Calendar;
import java.util.Locale; import java.util.Locale;
import okhttp3.FormBody;
/** /**
* Updates parameters of an existing Share resource, known its remote ID. * Updates parameters of an existing Share resource, known its remote ID.
* * <p>
* Allow updating several parameters, triggering a request to the server per parameter. * Allow updating several parameters, triggering a request to the server per parameter.
* *
* @author David A. Velasco * @author David A. Velasco
@ -64,7 +63,6 @@ public class UpdateRemoteShareOperation extends RemoteOperation<ShareParserResul
private static final String ENTITY_CONTENT_TYPE = "application/x-www-form-urlencoded"; private static final String ENTITY_CONTENT_TYPE = "application/x-www-form-urlencoded";
private static final String ENTITY_CHARSET = "UTF-8"; private static final String ENTITY_CHARSET = "UTF-8";
/** /**
* Identifier of the share to update * Identifier of the share to update
*/ */
@ -91,7 +89,6 @@ public class UpdateRemoteShareOperation extends RemoteOperation<ShareParserResul
private Boolean mPublicUpload; private Boolean mPublicUpload;
private String mName; private String mName;
/** /**
* Constructor. No update is initialized by default, need to be applied with setters below. * Constructor. No update is initialized by default, need to be applied with setters below.
* *
@ -105,7 +102,6 @@ public class UpdateRemoteShareOperation extends RemoteOperation<ShareParserResul
mPermissions = OCShare.DEFAULT_PERMISSION; mPermissions = OCShare.DEFAULT_PERMISSION;
} }
/** /**
* Set name to update in Share resource. Ignored by servers previous to version 10.0.0 * Set name to update in Share resource. Ignored by servers previous to version 10.0.0
* *
@ -128,7 +124,6 @@ public class UpdateRemoteShareOperation extends RemoteOperation<ShareParserResul
mPassword = password; mPassword = password;
} }
/** /**
* Set expiration date to update in Share resource. * Set expiration date to update in Share resource.
* *
@ -141,7 +136,6 @@ public class UpdateRemoteShareOperation extends RemoteOperation<ShareParserResul
mExpirationDateInMillis = expirationDateInMillis; mExpirationDateInMillis = expirationDateInMillis;
} }
/** /**
* Set permissions to update in Share resource. * Set permissions to update in Share resource.
* *

View File

@ -37,19 +37,12 @@ public enum CapabilityBooleanType {
private int value; private int value;
CapabilityBooleanType(int value) CapabilityBooleanType(int value) {
{
this.value = value; this.value = value;
} }
public int getValue() { public static CapabilityBooleanType fromValue(int value) {
return value; switch (value) {
}
public static CapabilityBooleanType fromValue(int value)
{
switch (value)
{
case -1: case -1:
return UNKNOWN; return UNKNOWN;
case 0: case 0:
@ -68,6 +61,10 @@ public enum CapabilityBooleanType {
} }
} }
public int getValue() {
return value;
}
public boolean isUnknown() { public boolean isUnknown() {
return getValue() == -1; return getValue() == -1;
} }

View File

@ -24,7 +24,6 @@
* *
*/ */
package com.owncloud.android.lib.resources.status; package com.owncloud.android.lib.resources.status;
import android.net.Uri; import android.net.Uri;
@ -35,7 +34,6 @@ import com.owncloud.android.lib.common.http.methods.nonwebdav.GetMethod;
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import org.json.JSONObject; import org.json.JSONObject;
import java.net.URL; import java.net.URL;
@ -109,10 +107,8 @@ public class GetRemoteCapabilitiesOperation extends RemoteOperation<OCCapability
private static final String PROPERTY_UNDELETE = "undelete"; private static final String PROPERTY_UNDELETE = "undelete";
private static final String PROPERTY_VERSIONING = "versioning"; private static final String PROPERTY_VERSIONING = "versioning";
/** /**
* Constructor * Constructor
*
*/ */
public GetRemoteCapabilitiesOperation() { public GetRemoteCapabilitiesOperation() {
@ -237,7 +233,6 @@ public class GetRemoteCapabilitiesOperation extends RemoteOperation<OCCapability
Log_OC.d(TAG, "*** Added " + NODE_FILES_SHARING); Log_OC.d(TAG, "*** Added " + NODE_FILES_SHARING);
} }
if (respCapabilities.has(NODE_FILES)) { if (respCapabilities.has(NODE_FILES)) {
JSONObject respFiles = respCapabilities.getJSONObject(NODE_FILES); JSONObject respFiles = respCapabilities.getJSONObject(NODE_FILES);
// Add files // Add files

View File

@ -34,13 +34,12 @@ import com.owncloud.android.lib.common.http.methods.nonwebdav.GetMethod;
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import javax.net.ssl.SSLException;
import java.net.URL; import java.net.URL;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.net.ssl.SSLException;
import static com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK; import static com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK;

View File

@ -101,7 +101,6 @@ public class OCCapability {
mFilesVersioning = CapabilityBooleanType.UNKNOWN; mFilesVersioning = CapabilityBooleanType.UNKNOWN;
} }
// Getters and Setters // Getters and Setters
public String getAccountName() { public String getAccountName() {
return mAccountName; return mAccountName;
@ -159,7 +158,6 @@ public class OCCapability {
this.mVersionEdition = versionEdition; this.mVersionEdition = versionEdition;
} }
public int getCorePollinterval() { public int getCorePollinterval() {
return mCorePollinterval; return mCorePollinterval;
} }
@ -216,7 +214,6 @@ public class OCCapability {
this.mFilesSharingPublicExpireDateEnforced = filesSharingPublicExpireDateEnforced; this.mFilesSharingPublicExpireDateEnforced = filesSharingPublicExpireDateEnforced;
} }
public CapabilityBooleanType getFilesSharingPublicSendMail() { public CapabilityBooleanType getFilesSharingPublicSendMail() {
return mFilesSharingPublicSendMail; return mFilesSharingPublicSendMail;
} }

View File

@ -139,7 +139,6 @@ public class OwnCloudVersion implements Comparable<OwnCloudVersion> {
return versionValue; return versionValue;
} }
public boolean isChunkedUploadSupported() { public boolean isChunkedUploadSupported() {
return (mVersion >= MINIMUN_VERSION_FOR_CHUNKED_UPLOADS); return (mVersion >= MINIMUN_VERSION_FOR_CHUNKED_UPLOADS);
} }

View File

@ -43,6 +43,7 @@ import static com.owncloud.android.lib.common.operations.RemoteOperationResult.R
/** /**
* Gets avatar about the user logged in, if available * Gets avatar about the user logged in, if available
*
* @author David A. Velasco * @author David A. Velasco
* @author David González Verdugo * @author David González Verdugo
*/ */
@ -52,7 +53,9 @@ public class GetRemoteUserAvatarOperation extends RemoteOperation<GetRemoteUserA
private static final String NON_OFFICIAL_AVATAR_PATH = "/index.php/avatar/"; private static final String NON_OFFICIAL_AVATAR_PATH = "/index.php/avatar/";
/** Desired size in pixels of the squared image */ /**
* Desired size in pixels of the squared image
*/
private int mDimension; private int mDimension;
/** /**

View File

@ -30,7 +30,6 @@ import com.owncloud.android.lib.common.http.methods.nonwebdav.GetMethod;
import com.owncloud.android.lib.common.operations.RemoteOperation; import com.owncloud.android.lib.common.operations.RemoteOperation;
import com.owncloud.android.lib.common.operations.RemoteOperationResult; import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.common.utils.Log_OC;
import org.json.JSONObject; import org.json.JSONObject;
import java.net.URL; import java.net.URL;

View File

@ -27,6 +27,9 @@
package com.owncloud.android.lib.resources.users; package com.owncloud.android.lib.resources.users;
import at.bitfire.dav4android.Property;
import at.bitfire.dav4android.property.QuotaAvailableBytes;
import at.bitfire.dav4android.property.QuotaUsedBytes;
import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.OwnCloudClient;
import com.owncloud.android.lib.common.http.HttpConstants; import com.owncloud.android.lib.common.http.HttpConstants;
import com.owncloud.android.lib.common.http.methods.webdav.DavUtils; import com.owncloud.android.lib.common.http.methods.webdav.DavUtils;
@ -39,10 +42,6 @@ import com.owncloud.android.lib.common.utils.Log_OC;
import java.net.URL; import java.net.URL;
import java.util.List; import java.util.List;
import at.bitfire.dav4android.Property;
import at.bitfire.dav4android.property.QuotaAvailableBytes;
import at.bitfire.dav4android.property.QuotaUsedBytes;
import static com.owncloud.android.lib.common.http.methods.webdav.DavConstants.DEPTH_0; import static com.owncloud.android.lib.common.http.methods.webdav.DavConstants.DEPTH_0;
import static com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK; import static com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK;
@ -52,26 +51,7 @@ import static com.owncloud.android.lib.common.operations.RemoteOperationResult.R
*/ */
public class GetRemoteUserQuotaOperation extends RemoteOperation<GetRemoteUserQuotaOperation.RemoteQuota> { public class GetRemoteUserQuotaOperation extends RemoteOperation<GetRemoteUserQuotaOperation.RemoteQuota> {
static public class RemoteQuota {
long mFree, mUsed, mTotal;
double mRelative;
public RemoteQuota(long free, long used, long total, double relative) {
mFree = free;
mUsed = used;
mTotal = total;
mRelative = relative;
}
public long getFree() { return mFree; }
public long getUsed() { return mUsed; }
public long getTotal() { return mTotal; }
public double getRelative() { return mRelative; }
}
private static final String TAG = GetRemoteUserQuotaOperation.class.getSimpleName(); private static final String TAG = GetRemoteUserQuotaOperation.class.getSimpleName();
private String mRemotePath; private String mRemotePath;
/** /**
@ -112,7 +92,6 @@ public class GetRemoteUserQuotaOperation extends RemoteOperation<GetRemoteUserQu
} catch (Exception e) { } catch (Exception e) {
result = new RemoteOperationResult<>(e); result = new RemoteOperationResult<>(e);
} finally { } finally {
if (result.isSuccess()) { if (result.isSuccess()) {
Log_OC.i(TAG, "Get quota from " + mRemotePath + ": " + result.getLogMessage()); Log_OC.i(TAG, "Get quota from " + mRemotePath + ": " + result.getLogMessage());
@ -144,11 +123,13 @@ public class GetRemoteUserQuotaOperation extends RemoteOperation<GetRemoteUserQu
long quotaUsed = 0; long quotaUsed = 0;
for (Property property : properties) { for (Property property : properties) {
if(property instanceof QuotaAvailableBytes) if (property instanceof QuotaAvailableBytes) {
quotaAvailable = ((QuotaAvailableBytes) property).getQuotaAvailableBytes(); quotaAvailable = ((QuotaAvailableBytes) property).getQuotaAvailableBytes();
if(property instanceof QuotaUsedBytes) }
if (property instanceof QuotaUsedBytes) {
quotaUsed = ((QuotaUsedBytes) property).getQuotaUsedBytes(); quotaUsed = ((QuotaUsedBytes) property).getQuotaUsedBytes();
} }
}
// If there's a special case, quota available will contain a negative code // If there's a special case, quota available will contain a negative code
// -1, PENDING: Not computed yet, e.g. external storage mounted but folder sizes need scanning // -1, PENDING: Not computed yet, e.g. external storage mounted but folder sizes need scanning
@ -174,4 +155,33 @@ public class GetRemoteUserQuotaOperation extends RemoteOperation<GetRemoteUserQu
); );
} }
} }
static public class RemoteQuota {
long mFree, mUsed, mTotal;
double mRelative;
public RemoteQuota(long free, long used, long total, double relative) {
mFree = free;
mUsed = used;
mTotal = total;
mRelative = relative;
}
public long getFree() {
return mFree;
}
public long getUsed() {
return mUsed;
}
public long getTotal() {
return mTotal;
}
public double getRelative() {
return mRelative;
}
}
} }

View File

@ -23,8 +23,8 @@
--> -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest package="com.owncloud.android.lib.sampleclient"
package="com.owncloud.android.lib.sampleclient" xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1" android:versionCode="1"
android:versionName="1.0"> android:versionName="1.0">

View File

@ -74,7 +74,9 @@ public class MainActivity extends Activity implements OnRemoteOperationListener,
private FilesArrayAdapter mFilesAdapter; private FilesArrayAdapter mFilesAdapter;
private View mFrame; private View mFrame;
/** Called when the activity is first created. */ /**
* Called when the activity is first created.
*/
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -121,7 +123,6 @@ public class MainActivity extends Activity implements OnRemoteOperationListener,
mFrame = findViewById(R.id.frame); mFrame = findViewById(R.id.frame);
} }
@Override @Override
public void onDestroy() { public void onDestroy() {
File upFolder = new File(getCacheDir(), getString(R.string.upload_folder_path)); File upFolder = new File(getCacheDir(), getString(R.string.upload_folder_path));
@ -131,7 +132,6 @@ public class MainActivity extends Activity implements OnRemoteOperationListener,
super.onDestroy(); super.onDestroy();
} }
public void onClickHandler(View button) { public void onClickHandler(View button) {
switch (button.getId()) { switch (button.getId()) {
case R.id.button_refresh: case R.id.button_refresh:

View File

@ -33,58 +33,58 @@
style="@style/ButtonStyle" style="@style/ButtonStyle"
android:layout_alignParentLeft="true" android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:text="@string/refresh"
android:onClick="onClickHandler" android:onClick="onClickHandler"
android:text="@string/refresh"
/> />
<ListView <ListView
android:id="@+id/list_view" android:id="@+id/list_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_below="@+id/button_refresh"
android:layout_above="@+id/button_upload" android:layout_above="@+id/button_upload"
android:layout_alignParentLeft="true" android:layout_alignParentLeft="true"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:layout_below="@+id/button_refresh"
> >
</ListView> </ListView>
<Button <Button
android:id="@+id/button_upload" android:id="@+id/button_upload"
style="@style/ButtonStyle" style="@style/ButtonStyle"
android:layout_alignParentLeft="true"
android:layout_above="@+id/frame" android:layout_above="@+id/frame"
android:text="@string/upload" android:layout_alignParentLeft="true"
android:onClick="onClickHandler" android:onClick="onClickHandler"
android:text="@string/upload"
/> />
<TextView <TextView
android:id="@+id/upload_progress" android:id="@+id/upload_progress"
style="@style/ProgressStyle" style="@style/ProgressStyle"
android:layout_below="@id/list_view"
android:layout_above="@id/frame" android:layout_above="@id/frame"
android:layout_toRightOf="@id/button_upload" android:layout_below="@id/list_view"
android:layout_toLeftOf="@+id/button_delete_remote" android:layout_toLeftOf="@+id/button_delete_remote"
android:layout_toRightOf="@id/button_upload"
android:gravity="center" android:gravity="center"
android:textSize="14sp"
android:text="0%" android:text="0%"
android:textSize="14sp"
/> />
<Button <Button
android:id="@id/button_delete_remote" android:id="@id/button_delete_remote"
style="@style/ButtonStyle" style="@style/ButtonStyle"
android:layout_alignParentRight="true"
android:layout_above="@id/frame" android:layout_above="@id/frame"
android:text="@string/delete_remote_file" android:layout_alignParentRight="true"
android:onClick="onClickHandler" android:onClick="onClickHandler"
android:text="@string/delete_remote_file"
/> />
<FrameLayout <FrameLayout
android:id="@id/frame" android:id="@id/frame"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="@dimen/frame_height" android:layout_height="@dimen/frame_height"
android:layout_above="@+id/button_download"
android:layout_alignParentLeft="true" android:layout_alignParentLeft="true"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:layout_above="@+id/button_download"
> >
</FrameLayout> </FrameLayout>
@ -93,20 +93,20 @@
style="@style/ButtonStyle" style="@style/ButtonStyle"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true" android:layout_alignParentLeft="true"
android:text="@string/download"
android:onClick="onClickHandler" android:onClick="onClickHandler"
android:text="@string/download"
/> />
<TextView <TextView
android:id="@+id/download_progress" android:id="@+id/download_progress"
style="@style/ProgressStyle" style="@style/ProgressStyle"
android:layout_below="@id/frame"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:layout_toRightOf="@id/button_download" android:layout_below="@id/frame"
android:layout_toLeftOf="@+id/button_delete_local" android:layout_toLeftOf="@+id/button_delete_local"
android:layout_toRightOf="@id/button_download"
android:gravity="center" android:gravity="center"
android:textSize="14sp"
android:text="0%" android:text="0%"
android:textSize="14sp"
/> />
<Button <Button
@ -114,8 +114,8 @@
style="@style/ButtonStyle" style="@style/ButtonStyle"
android:layout_alignParentBottom="true" android:layout_alignParentBottom="true"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:text="@string/delete_local_file"
android:onClick="onClickHandler" android:onClick="onClickHandler"
android:text="@string/delete_local_file"
/> />
</RelativeLayout> </RelativeLayout>

View File

@ -24,11 +24,13 @@
--> -->
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="ButtonStyle" parent="@android:style/Widget.Holo.Button"> <style name="ButtonStyle" parent="@android:style/Widget.Holo.Button">
<item name="android:layout_width">120dp</item> <item name="android:layout_width">120dp</item>
<item name="android:layout_height">wrap_content</item> <item name="android:layout_height">wrap_content</item>
<item name="android:textSize">12sp</item> <item name="android:textSize">12sp</item>
</style> </style>
<style name="ProgressStyle" parent="@android:style/Widget.Holo.TextView"> <style name="ProgressStyle" parent="@android:style/Widget.Holo.TextView">
<item name="android:layout_width">wrap_content</item> <item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item> <item name="android:layout_height">wrap_content</item>

View File

@ -24,11 +24,13 @@
--> -->
<resources xmlns:android="http://schemas.android.com/apk/res/android"> <resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="ButtonStyle" parent="@android:style/Widget.Button"> <style name="ButtonStyle" parent="@android:style/Widget.Button">
<item name="android:layout_width">120dp</item> <item name="android:layout_width">120dp</item>
<item name="android:layout_height">wrap_content</item> <item name="android:layout_height">wrap_content</item>
<item name="android:textSize">12sp</item> <item name="android:textSize">12sp</item>
</style> </style>
<style name="ProgressStyle" parent="@android:style/Widget.TextView"> <style name="ProgressStyle" parent="@android:style/Widget.TextView">
<item name="android:layout_width">wrap_content</item> <item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item> <item name="android:layout_height">wrap_content</item>