diff --git a/.gitignore b/.gitignore index dd7c979e..491cdfc4 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,9 @@ *.apk *.ap_ +.idea/* +!.idea/codeStyles/ + # files for the dex VM *.dex @@ -9,25 +12,18 @@ *.class # generated files -bin/ build/ gen/ -target/ *.iml # Local configuration files (sdk path, etc) -.idea/ .gradle/ local.properties sample_client/local.properties -tests/local.properties -tests/test_cases/local.properties # Mac .DS_Store files .DS_Store # Proguard README proguard-project.txt -sample_client/proguard-project.txt -tests/proguard-project.txt -tests/test_cases/proguard-project.txt \ No newline at end of file +sample_client/proguard-project.txt \ No newline at end of file diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 00000000..6d603841 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,412 @@ + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 00000000..79ee123c --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.project b/.project deleted file mode 100644 index 4b5c2951..00000000 --- a/.project +++ /dev/null @@ -1,33 +0,0 @@ - - - ownCloud Android Library - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index b080d2dd..00000000 --- a/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/.travis.yml b/.travis.yml index d0bca7a2..6a8a27d3 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ branches: - master install: # Let's use the new command 'sdkmanager' to install Android SDK components -- yes | sdkmanager --verbose "build-tools;26.0.2" +- yes | sdkmanager --verbose "build-tools;26.0.3" - yes | sdkmanager --verbose "platform-tools" - yes | sdkmanager --verbose "tools" - yes | sdkmanager --verbose "platforms;android-26" diff --git a/LICENSE.md b/LICENSE.md index 79dcde20..dd4c419d 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -2,7 +2,7 @@ ownCloud Android Library is available under MIT license -Copyright (C) 2018 ownCloud GmbH. +Copyright (C) 2019 ownCloud GmbH. Copyright (C) 2012 Bartek Przybylski Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/ant.properties b/ant.properties deleted file mode 100644 index 0901c3b2..00000000 --- a/ant.properties +++ /dev/null @@ -1,8 +0,0 @@ -# This file contains custom properties used by the Ant build system. -# -# This file must be checked in Version Control Systems. -# - -# Java version options -java.source=1.7 -java.target=1.7 diff --git a/build.gradle b/build.gradle index c2176420..da14d602 100644 --- a/build.gradle +++ b/build.gradle @@ -4,12 +4,10 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.2' + classpath 'com.android.tools.build:gradle:3.3.1' } } -apply plugin: 'com.android.library' - allprojects { repositories { google() @@ -17,45 +15,3 @@ allprojects { maven { url 'https://jitpack.io' } } } - -dependencies { - api 'com.squareup.okhttp3:okhttp:3.10.0' - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.51" - implementation 'com.gitlab.ownclouders:dav4android:oc_support' -} - -android { - compileSdkVersion 26 - - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = ['src'] - resources.srcDirs = ['src'] - aidl.srcDirs = ['src'] - renderscript.srcDirs = ['src'] - res.srcDirs = ['res'] - assets.srcDirs = ['assets'] - } - - // Move the tests to tests/java, tests/res, etc... - androidTest.setRoot('tests') - - // Move the build types to build-types/ - // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ... - // This moves them out of them default location under src//... which would - // conflict with src/ being used by the main source set. - // Adding new build types or product flavors should be accompanied - // by a similar customization. - debug.setRoot('build-types/debug') - release.setRoot('build-types/release') - } - - lintOptions { - abortOnError false - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 - } -} diff --git a/build.xml b/build.xml deleted file mode 100644 index a87e590d..00000000 --- a/build.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/custom_rules.xml b/custom_rules.xml deleted file mode 100644 index 64ac6702..00000000 --- a/custom_rules.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - Copying jar file for binary distribution - - - \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 267dfc1e..53f7eaf3 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip \ No newline at end of file +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip \ No newline at end of file diff --git a/libs/commons-httpclient-3.1.jar b/libs/commons-httpclient-3.1.jar deleted file mode 100644 index 7c59774a..00000000 Binary files a/libs/commons-httpclient-3.1.jar and /dev/null differ diff --git a/libs/jackrabbit-webdav-2.12.4.jar b/libs/jackrabbit-webdav-2.12.4.jar deleted file mode 100644 index 95a44533..00000000 Binary files a/libs/jackrabbit-webdav-2.12.4.jar and /dev/null differ diff --git a/libs/slf4j-api-1.7.5.jar b/libs/slf4j-api-1.7.5.jar deleted file mode 100644 index 8f004d39..00000000 Binary files a/libs/slf4j-api-1.7.5.jar and /dev/null differ diff --git a/owncloudComLibrary/build.gradle b/owncloudComLibrary/build.gradle new file mode 100644 index 00000000..146f276f --- /dev/null +++ b/owncloudComLibrary/build.gradle @@ -0,0 +1,26 @@ +apply plugin: 'com.android.library' + +dependencies { + api 'com.squareup.okhttp3:okhttp:3.12.0' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.11" + implementation 'com.gitlab.ownclouders:dav4android:oc_support' +} + +android { + compileSdkVersion 28 + + defaultConfig { + minSdkVersion 19 + targetSdkVersion 28 + } + + lintOptions { + abortOnError false + ignoreWarnings true + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } +} diff --git a/AndroidManifest.xml b/owncloudComLibrary/src/main/AndroidManifest.xml similarity index 82% rename from AndroidManifest.xml rename to owncloudComLibrary/src/main/AndroidManifest.xml index 81b9494e..fce28b17 100644 --- a/AndroidManifest.xml +++ b/owncloudComLibrary/src/main/AndroidManifest.xml @@ -22,20 +22,20 @@ THE SOFTWARE. --> - - + android:versionName="1.0"> + - - + diff --git a/src/com/owncloud/android/lib/common/DynamicSessionManager.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/DynamicSessionManager.java similarity index 88% rename from src/com/owncloud/android/lib/common/DynamicSessionManager.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/DynamicSessionManager.java index 46b477c3..04b1f69a 100644 --- a/src/com/owncloud/android/lib/common/DynamicSessionManager.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/DynamicSessionManager.java @@ -11,7 +11,7 @@ import java.io.IOException; /** * Dynamic implementation of {@link OwnCloudClientManager}. - * + *

* 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} * @@ -26,17 +26,17 @@ public class DynamicSessionManager implements OwnCloudClientManager { @Override public OwnCloudClient getClientFor(OwnCloudAccount account, Context context) - throws AccountUtils.AccountNotFoundException, - OperationCanceledException, AuthenticatorException, IOException { + throws AccountUtils.AccountNotFoundException, + OperationCanceledException, AuthenticatorException, IOException { OwnCloudVersion ownCloudVersion = null; if (account.getSavedAccount() != null) { ownCloudVersion = AccountUtils.getServerVersionForAccount( - account.getSavedAccount(), context + account.getSavedAccount(), context ); } - if (ownCloudVersion != null && ownCloudVersion.isSessionMonitoringSupported()) { + if (ownCloudVersion != null && ownCloudVersion.isSessionMonitoringSupported()) { return mSingleSessionManager.getClientFor(account, context); } else { return mSimpleFactoryManager.getClientFor(account, context); diff --git a/src/com/owncloud/android/lib/common/OwnCloudAccount.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudAccount.java similarity index 92% rename from src/com/owncloud/android/lib/common/OwnCloudAccount.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudAccount.java index b3ebcd59..87e1e150 100644 --- a/src/com/owncloud/android/lib/common/OwnCloudAccount.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudAccount.java @@ -24,14 +24,6 @@ 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.AccountManager; import android.accounts.AuthenticatorException; @@ -39,27 +31,33 @@ import android.accounts.OperationCanceledException; import android.content.Context; 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 - * + * * @author David A. Velasco */ public class OwnCloudAccount { - private Uri mBaseUri; - + private Uri mBaseUri; + private OwnCloudCredentials mCredentials; private String mDisplayName; - + private String mSavedAccountName; private Account mSavedAccount; - /** * Constructor for already saved OC accounts. - * + *

* Do not use for anonymous credentials. */ public OwnCloudAccount(Account savedAccount, Context context) throws AccountNotFoundException { @@ -77,19 +75,18 @@ public class OwnCloudAccount { AccountManager ama = AccountManager.get(context.getApplicationContext()); String baseUrl = ama.getUserData(mSavedAccount, AccountUtils.Constants.KEY_OC_BASE_URL); - if (baseUrl == null ) { + if (baseUrl == null) { throw new AccountNotFoundException(mSavedAccount, "Account not found", null); } mBaseUri = Uri.parse(AccountUtils.getBaseUrlForAccount(context, mSavedAccount)); mDisplayName = ama.getUserData(mSavedAccount, AccountUtils.Constants.KEY_DISPLAY_NAME); } - /** * Constructor for non yet saved OC accounts. * - * @param baseUri URI to the OC server to get access to. - * @param credentials Credentials to authenticate in the server. NULL is valid for anonymous credentials. + * @param baseUri URI to the OC server to get access to. + * @param credentials Credentials to authenticate in the server. NULL is valid for anonymous credentials. */ public OwnCloudAccount(Uri baseUri, OwnCloudCredentials credentials) { if (baseUri == null) { @@ -99,14 +96,13 @@ public class OwnCloudAccount { mSavedAccountName = null; mBaseUri = baseUri; mCredentials = credentials != null ? - credentials : OwnCloudCredentialsFactory.getAnonymousCredentials(); + credentials : OwnCloudCredentialsFactory.getAnonymousCredentials(); String username = mCredentials.getUsername(); if (username != null) { mSavedAccountName = AccountUtils.buildAccountName(mBaseUri, username); } } - /** * Method for deferred load of account attributes from AccountManager * @@ -131,13 +127,13 @@ public class OwnCloudAccount { public Uri getBaseUri() { return mBaseUri; } - + public OwnCloudCredentials getCredentials() { return mCredentials; } - + public String getName() { - return mSavedAccountName; + return mSavedAccountName; } public Account getSavedAccount() { diff --git a/src/com/owncloud/android/lib/common/OwnCloudClient.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudClient.java similarity index 93% rename from src/com/owncloud/android/lib/common/OwnCloudClient.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudClient.java index 6dd69f0e..e0a48f19 100644 --- a/src/com/owncloud/android/lib/common/OwnCloudClient.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudClient.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * Copyright (C) 2012 Bartek Przybylski * * Permission is hereby granted, free of charge, to any person obtaining a copy @@ -29,6 +29,7 @@ import android.accounts.AccountManager; import android.accounts.AccountsException; import android.net.Uri; +import at.bitfire.dav4android.exception.HttpException; import com.owncloud.android.lib.common.accounts.AccountUtils; import com.owncloud.android.lib.common.authentication.OwnCloudCredentials; 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.RandomUtils; import com.owncloud.android.lib.resources.status.OwnCloudVersion; +import okhttp3.Cookie; +import okhttp3.Headers; +import okhttp3.HttpUrl; import java.io.IOException; import java.io.InputStream; 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; public class OwnCloudClient extends HttpClient { @@ -62,12 +61,11 @@ public class OwnCloudClient extends HttpClient { private static final String TAG = OwnCloudClient.class.getSimpleName(); private static final int MAX_REDIRECTIONS_COUNT = 3; private static final int MAX_REPEAT_COUNT_WITH_FRESH_CREDENTIALS = 1; - private static final String PARAM_PROTOCOL_VERSION = "http.protocol.version"; private static byte[] sExhaustBuffer = new byte[1024]; private static int sIntanceCounter = 0; private OwnCloudCredentials mCredentials = null; - private int mInstanceNumber = 0; + private int mInstanceNumber; private Uri mBaseUri; private OwnCloudVersion mVersion = null; private OwnCloudAccount mAccount; @@ -94,15 +92,6 @@ public class OwnCloudClient extends HttpClient { clearCookies(); } - public void setCredentials(OwnCloudCredentials credentials) { - if (credentials != null) { - mCredentials = credentials; - mCredentials.applyTo(this); - } else { - clearCredentials(); - } - } - public void clearCredentials() { if (!(mCredentials instanceof OwnCloudAnonymousCredentials)) { mCredentials = OwnCloudCredentialsFactory.getAnonymousCredentials(); @@ -114,7 +103,7 @@ public class OwnCloudClient extends HttpClient { mCredentials.applyTo(this); } - public int executeHttpMethod (HttpBaseMethod method) throws Exception { + public int executeHttpMethod(HttpBaseMethod method) throws Exception { boolean repeatWithFreshCredentials; int repeatCounter = 0; int status; @@ -125,7 +114,7 @@ public class OwnCloudClient extends HttpClient { status = method.execute(); checkFirstRedirection(method); - if(mFollowRedirects && !isIdPRedirection()) { + if (mFollowRedirects && !isIdPRedirection()) { status = followRedirection(method).getLastStatus(); } @@ -140,12 +129,12 @@ public class OwnCloudClient extends HttpClient { private void checkFirstRedirection(HttpBaseMethod method) { final String location = method.getResponseHeader(HttpConstants.LOCATION_HEADER_LOWER); - if(location != null && !location.isEmpty()) { + if (location != null && !location.isEmpty()) { mRedirectedLocation = location; } } - private int executeRedirectedHttpMethod (HttpBaseMethod method) throws Exception { + private int executeRedirectedHttpMethod(HttpBaseMethod method) throws Exception { boolean repeatWithFreshCredentials; int repeatCounter = 0; int status; @@ -217,9 +206,9 @@ public class OwnCloudClient extends HttpClient { try { status = executeRedirectedHttpMethod(method); } catch (HttpException e) { - if(e.getMessage().contains(Integer.toString(HttpConstants.HTTP_MOVED_TEMPORARILY))) { + if (e.getMessage().contains(Integer.toString(HttpConstants.HTTP_MOVED_TEMPORARILY))) { status = HttpConstants.HTTP_MOVED_TEMPORARILY; - } else { + } else { throw e; } } @@ -242,7 +231,9 @@ public class OwnCloudClient extends HttpClient { public void exhaustResponse(InputStream responseBodyAsStream) { if (responseBodyAsStream != null) { try { - while (responseBodyAsStream.read(sExhaustBuffer) >= 0) ; + while (responseBodyAsStream.read(sExhaustBuffer) >= 0) { + ; + } responseBodyAsStream.close(); } catch (IOException io) { @@ -252,7 +243,7 @@ public class OwnCloudClient extends HttpClient { } } - public Uri getBaseFilesWebDavUri(){ + public Uri getBaseFilesWebDavUri() { return Uri.parse(mBaseUri + WEBDAV_FILES_PATH_4_0); } @@ -260,7 +251,7 @@ public class OwnCloudClient extends HttpClient { return mCredentials instanceof OwnCloudAnonymousCredentials ? Uri.parse(mBaseUri + WEBDAV_FILES_PATH_4_0) : Uri.parse(mBaseUri + WEBDAV_FILES_PATH_4_0 + AccountUtils.getUserId( - mAccount.getSavedAccount(), getContext() + mAccount.getSavedAccount(), getContext() ) ); } @@ -269,14 +260,18 @@ public class OwnCloudClient extends HttpClient { return mCredentials instanceof OwnCloudAnonymousCredentials ? Uri.parse(mBaseUri + WEBDAV_UPLOADS_PATH_4_0) : Uri.parse(mBaseUri + WEBDAV_UPLOADS_PATH_4_0 + AccountUtils.getUserId( - mAccount.getSavedAccount(), getContext() + mAccount.getSavedAccount(), getContext() ) ); } + public Uri getBaseUri() { + return mBaseUri; + } + /** * Sets the root URI to the ownCloud server. - * + *

* Use with care. * * @param uri @@ -288,14 +283,19 @@ public class OwnCloudClient extends HttpClient { mBaseUri = uri; } - public Uri getBaseUri() { - return mBaseUri; - } - public final OwnCloudCredentials getCredentials() { return mCredentials; } + public void setCredentials(OwnCloudCredentials credentials) { + if (credentials != null) { + mCredentials = credentials; + mCredentials.applyTo(this); + } else { + clearCredentials(); + } + } + private void logCookie(Cookie cookie) { Log_OC.d(TAG, "Cookie name: " + cookie.name()); Log_OC.d(TAG, " value: " + cookie.value()); @@ -329,16 +329,16 @@ public class OwnCloudClient extends HttpClient { } public String getCookiesString() { - String cookiesString = ""; + StringBuilder cookiesString = new StringBuilder(); List cookieList = getCookiesFromUrl(HttpUrl.parse(mBaseUri.toString())); if (cookieList != null) { for (Cookie cookie : cookieList) { - cookiesString += cookie.toString() + ";"; + cookiesString.append(cookie.toString()).append(";"); } } - return cookiesString; + return cookiesString.toString(); } public void setCookiesForCurrentAccount(List cookies) { @@ -348,27 +348,27 @@ public class OwnCloudClient extends HttpClient { ); } - public void setOwnCloudVersion(OwnCloudVersion version) { - mVersion = version; - } - public OwnCloudVersion getOwnCloudVersion() { return mVersion; } - public void setAccount(OwnCloudAccount account) { - this.mAccount = account; + public void setOwnCloudVersion(OwnCloudVersion version) { + mVersion = version; } public OwnCloudAccount getAccount() { 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. - * + *

* Invalidates current credentials if the request failed as anauthorized. - * + *

* Refresh current credentials if possible, and marks a retry. * * @param status @@ -416,10 +416,9 @@ public class OwnCloudClient extends HttpClient { * Determines if credentials should be invalidated according the to the HTTPS status * of a network request just performed. * - * @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 - * cannot be invalidated with the given arguments. + * @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 + * cannot be invalidated with the given arguments. */ private boolean shouldInvalidateAccountCredentials(int httpStatusCode) { @@ -437,10 +436,10 @@ public class OwnCloudClient extends HttpClient { /** * Invalidates credentials stored for the given account in the system {@link AccountManager} and in * current {@link OwnCloudClientManagerFactory#getDefaultSingleton()} instance. - * + *

* {@link #shouldInvalidateAccountCredentials(int)} should be called first. * - * @return 'True' if invalidation was successful, 'false' otherwise. + * @return 'True' if invalidation was successful, 'false' otherwise. */ private boolean invalidateAccountCredentials() { AccountManager am = AccountManager.get(getContext()); @@ -462,6 +461,7 @@ public class OwnCloudClient extends HttpClient { /** * 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 */ private boolean isIdPRedirection() { diff --git a/src/com/owncloud/android/lib/common/OwnCloudClientFactory.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudClientFactory.java similarity index 59% rename from src/com/owncloud/android/lib/common/OwnCloudClientFactory.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudClientFactory.java index 7fd4a799..041f72fa 100644 --- a/src/com/owncloud/android/lib/common/OwnCloudClientFactory.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudClientFactory.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. - * + * Copyright (C) 2019 ownCloud GmbH. + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -43,29 +43,28 @@ import com.owncloud.android.lib.resources.status.OwnCloudVersion; import java.io.IOException; public class OwnCloudClientFactory { - + final private static String TAG = OwnCloudClientFactory.class.getSimpleName(); /** * Creates a OwnCloudClient setup for an ownCloud account - * + *

* Do not call this method from the main thread. * - * @param account The ownCloud account - * @param appContext Android application context - * @param currentActivity Caller {@link Activity} - * @return A OwnCloudClient object ready to be used - * @throws AuthenticatorException If the authenticator failed to get the authorization - * token for the account. - * @throws OperationCanceledException If the authenticator operation was cancelled while - * getting the authorization token for the account. - * @throws IOException If there was some I/O error while getting the - * authorization token for the account. - * @throws AccountNotFoundException If 'account' is unknown for the AccountManager - * + * @param account The ownCloud account + * @param appContext Android application context + * @param currentActivity Caller {@link Activity} + * @return A OwnCloudClient object ready to be used + * @throws AuthenticatorException If the authenticator failed to get the authorization + * token for the account. + * @throws OperationCanceledException If the authenticator operation was cancelled while + * getting the authorization token for the account. + * @throws IOException If there was some I/O error while getting the + * authorization token for the account. + * @throws AccountNotFoundException If 'account' is unknown for the AccountManager */ - public static OwnCloudClient createOwnCloudClient (Account account, Context appContext, - Activity currentActivity) + public static OwnCloudClient createOwnCloudClient(Account account, Context appContext, + Activity currentActivity) throws OperationCanceledException, AuthenticatorException, IOException, AccountNotFoundException { Uri baseUri = Uri.parse(AccountUtils.getBaseUrlForAccount(appContext, account)); @@ -79,57 +78,60 @@ public class OwnCloudClientFactory { String username = AccountUtils.getUsernameForAccount(account); if (isOauth2) { // TODO avoid a call to getUserData here - AccountManagerFuture future = am.getAuthToken( - account, - AccountTypeUtils.getAuthTokenTypeAccessToken(account.type), - null, - currentActivity, - null, - null); + AccountManagerFuture future = am.getAuthToken( + account, + AccountTypeUtils.getAuthTokenTypeAccessToken(account.type), + null, + currentActivity, + null, + null); Bundle result = future.getResult(); String accessToken = result.getString(AccountManager.KEY_AUTHTOKEN); - if (accessToken == null) throw new AuthenticatorException("WTF!"); + if (accessToken == null) { + throw new AuthenticatorException("WTF!"); + } client.setCredentials( - OwnCloudCredentialsFactory.newBearerCredentials(username, accessToken) + OwnCloudCredentialsFactory.newBearerCredentials(username, accessToken) ); } else if (isSamlSso) { // TODO avoid a call to getUserData here - AccountManagerFuture future = am.getAuthToken( - account, - AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(account.type), - null, - currentActivity, - null, - null); + AccountManagerFuture future = am.getAuthToken( + account, + AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(account.type), + null, + currentActivity, + null, + null); Bundle result = future.getResult(); String accessToken = result.getString(AccountManager.KEY_AUTHTOKEN); - if (accessToken == null) throw new AuthenticatorException("WTF!"); + if (accessToken == null) { + throw new AuthenticatorException("WTF!"); + } client.setCredentials( - OwnCloudCredentialsFactory.newSamlSsoCredentials(username, accessToken) + OwnCloudCredentialsFactory.newSamlSsoCredentials(username, accessToken) ); - } else { - AccountManagerFuture future = am.getAuthToken( - account, - AccountTypeUtils.getAuthTokenTypePass(account.type), - null, - currentActivity, - null, - null + AccountManagerFuture future = am.getAuthToken( + account, + AccountTypeUtils.getAuthTokenTypePass(account.type), + null, + currentActivity, + null, + null ); Bundle result = future.getResult(); String password = result.getString(AccountManager.KEY_AUTHTOKEN); OwnCloudVersion version = AccountUtils.getServerVersionForAccount(account, appContext); client.setCredentials( - OwnCloudCredentialsFactory.newBasicCredentials( - username, - password, - (version != null && version.isPreemptiveAuthenticationPreferred()) - ) + OwnCloudCredentialsFactory.newBasicCredentials( + username, + password, + (version != null && version.isPreemptiveAuthenticationPreferred()) + ) ); } @@ -142,10 +144,10 @@ public class OwnCloudClientFactory { /** * Creates a OwnCloudClient to access a URL and sets the desired parameters for ownCloud * client connections. - * - * @param uri URL to the ownCloud server; BASE ENTRY POINT, not WebDavPATH - * @param context Android context where the OwnCloudClient is being created. - * @return A OwnCloudClient object ready to be used + * + * @param uri URL to the ownCloud server; BASE ENTRY POINT, not WebDavPATH + * @param context Android context where the OwnCloudClient is being created. + * @return A OwnCloudClient object ready to be used */ public static OwnCloudClient createOwnCloudClient(Uri uri, Context context, boolean followRedirects) { @@ -154,7 +156,7 @@ public class OwnCloudClientFactory { client.setFollowRedirects(followRedirects); client.setContext(context); - + return client; } } \ No newline at end of file diff --git a/src/com/owncloud/android/lib/common/OwnCloudClientManager.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudClientManager.java similarity index 79% rename from src/com/owncloud/android/lib/common/OwnCloudClientManager.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudClientManager.java index fbaebc06..c2d7e6b3 100644 --- a/src/com/owncloud/android/lib/common/OwnCloudClientManager.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudClientManager.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. - * + * Copyright (C) 2019 ownCloud GmbH. + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -24,17 +24,17 @@ package com.owncloud.android.lib.common; -import java.io.IOException; - import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; import android.content.Context; 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. + * * @author David A. Velasco * @author masensio * @author Christian Schabesberger @@ -42,13 +42,13 @@ import com.owncloud.android.lib.common.accounts.AccountUtils.AccountNotFoundExce public interface OwnCloudClientManager { - OwnCloudClient getClientFor(OwnCloudAccount account, Context context) throws AccountNotFoundException, - OperationCanceledException, AuthenticatorException, + OwnCloudClient getClientFor(OwnCloudAccount account, Context context) throws AccountNotFoundException, + OperationCanceledException, AuthenticatorException, IOException; - + OwnCloudClient removeClientFor(OwnCloudAccount account); void saveAllClients(Context context, String accountType) - throws AccountNotFoundException, AuthenticatorException, - IOException, OperationCanceledException; + throws AccountNotFoundException, AuthenticatorException, + IOException, OperationCanceledException; } \ No newline at end of file diff --git a/src/com/owncloud/android/lib/common/OwnCloudClientManagerFactory.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudClientManagerFactory.java similarity index 96% rename from src/com/owncloud/android/lib/common/OwnCloudClientManagerFactory.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudClientManagerFactory.java index 4fc6ea65..7b1b0b5b 100644 --- a/src/com/owncloud/android/lib/common/OwnCloudClientManagerFactory.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/OwnCloudClientManagerFactory.java @@ -25,16 +25,8 @@ package com.owncloud.android.lib.common; 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 OwnCloudClientManager sDefaultSingleton; - private static String sUserAgent; public static OwnCloudClientManager newDefaultOwnCloudClientManager() { @@ -78,26 +70,32 @@ public class OwnCloudClientManagerFactory { sDefaultPolicy = policy; } - public static void setUserAgent(String userAgent) { - sUserAgent = userAgent; - } - public static String getUserAgent() { return sUserAgent; } + public static void setUserAgent(String userAgent) { + sUserAgent = userAgent; + } + private static boolean defaultSingletonMustBeUpdated(Policy policy) { if (sDefaultSingleton == null) { return false; } if (policy == Policy.ALWAYS_NEW_CLIENT && - !(sDefaultSingleton instanceof SimpleFactoryManager)) { + !(sDefaultSingleton instanceof SimpleFactoryManager)) { return true; } if (policy == Policy.SINGLE_SESSION_PER_ACCOUNT && - !(sDefaultSingleton instanceof SingleSessionManager)) { + !(sDefaultSingleton instanceof SingleSessionManager)) { return true; } return false; } + + public static enum Policy { + ALWAYS_NEW_CLIENT, + SINGLE_SESSION_PER_ACCOUNT, + SINGLE_SESSION_PER_ACCOUNT_IF_SERVER_SUPPORTS_SERVER_MONITORING + } } \ No newline at end of file diff --git a/src/com/owncloud/android/lib/common/SimpleFactoryManager.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/SimpleFactoryManager.java similarity index 84% rename from src/com/owncloud/android/lib/common/SimpleFactoryManager.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/SimpleFactoryManager.java index f7d9e983..46f722e9 100644 --- a/src/com/owncloud/android/lib/common/SimpleFactoryManager.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/SimpleFactoryManager.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license * Copyright (C) 2016 ownCloud GmbH. - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -24,13 +24,11 @@ package com.owncloud.android.lib.common; - import android.accounts.AuthenticatorException; import android.accounts.OperationCanceledException; import android.content.Context; 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 java.io.IOException; @@ -46,16 +44,16 @@ public class SimpleFactoryManager implements OwnCloudClientManager { Log_OC.d(TAG, "getClientFor(OwnCloudAccount ... : "); OwnCloudClient client = OwnCloudClientFactory.createOwnCloudClient( - account.getBaseUri(), - context.getApplicationContext(), - true); + account.getBaseUri(), + context.getApplicationContext(), + true); Log_OC.v(TAG, " new client {" + - (account.getName() != null ? - account.getName() : - AccountUtils.buildAccountName(account.getBaseUri(), "") + (account.getName() != null ? + account.getName() : + AccountUtils.buildAccountName(account.getBaseUri(), "") - ) + ", " + client.hashCode() + "}"); + ) + ", " + client.hashCode() + "}"); if (account.getCredentials() == null) { account.loadCredentials(context); diff --git a/src/com/owncloud/android/lib/common/SingleSessionManager.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/SingleSessionManager.java similarity index 92% rename from src/com/owncloud/android/lib/common/SingleSessionManager.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/SingleSessionManager.java index 99642813..128207a8 100644 --- a/src/com/owncloud/android/lib/common/SingleSessionManager.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/SingleSessionManager.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. - * + * Copyright (C) 2019 ownCloud GmbH. + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -43,7 +43,7 @@ import java.util.concurrent.ConcurrentMap; /** * Implementation of {@link OwnCloudClientManager} - * + *

* TODO check multithreading safety * * @author David A. Velasco @@ -57,11 +57,10 @@ public class SingleSessionManager implements OwnCloudClientManager { private static final String TAG = SingleSessionManager.class.getSimpleName(); private ConcurrentMap mClientsWithKnownUsername = - new ConcurrentHashMap<>(); + new ConcurrentHashMap<>(); private ConcurrentMap mClientsWithUnknownUsername = - new ConcurrentHashMap<>(); - + new ConcurrentHashMap<>(); @Override public OwnCloudClient getClientFor(OwnCloudAccount account, Context context) throws OperationCanceledException, @@ -77,9 +76,9 @@ public class SingleSessionManager implements OwnCloudClientManager { OwnCloudClient client = null; String accountName = account.getName(); String sessionName = account.getCredentials() == null ? "" : - AccountUtils.buildAccountName( - account.getBaseUri(), - account.getCredentials().getAuthToken()); + AccountUtils.buildAccountName( + account.getBaseUri(), + account.getCredentials().getAuthToken()); if (accountName != null) { client = mClientsWithKnownUsername.get(accountName); @@ -110,9 +109,9 @@ public class SingleSessionManager implements OwnCloudClientManager { if (client == null) { // no client to reuse - create a new one client = OwnCloudClientFactory.createOwnCloudClient( - account.getBaseUri(), - context.getApplicationContext(), - true); // TODO remove dependency on OwnCloudClientFactory + account.getBaseUri(), + context.getApplicationContext(), + true); // TODO remove dependency on OwnCloudClientFactory client.setAccount(account); client.setContext(context); client.setOwnCloudClientManager(this); @@ -152,7 +151,6 @@ public class SingleSessionManager implements OwnCloudClientManager { return client; } - @Override public OwnCloudClient removeClientFor(OwnCloudAccount account) { if (Log.isLoggable(TAG, Log.DEBUG)) { @@ -187,7 +185,6 @@ public class SingleSessionManager implements OwnCloudClientManager { return null; } - @Override public void saveAllClients(Context context, String accountType) { @@ -202,9 +199,9 @@ public class SingleSessionManager implements OwnCloudClientManager { accountName = accountNames.next(); account = new Account(accountName, accountType); AccountUtils.saveClient( - mClientsWithKnownUsername.get(accountName), - account, - context); + mClientsWithKnownUsername.get(accountName), + account, + context); } if (Log.isLoggable(TAG, Log.DEBUG)) { diff --git a/src/com/owncloud/android/lib/common/accounts/AccountTypeUtils.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/accounts/AccountTypeUtils.java similarity index 84% rename from src/com/owncloud/android/lib/common/accounts/AccountTypeUtils.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/accounts/AccountTypeUtils.java index 43dc79a1..b5e67c82 100644 --- a/src/com/owncloud/android/lib/common/accounts/AccountTypeUtils.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/accounts/AccountTypeUtils.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license * Copyright (C) 2016 ownCloud GmbH. - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -33,17 +33,17 @@ public class AccountTypeUtils { public static String getAuthTokenTypePass(String accountType) { return accountType + ".password"; } - + public static String getAuthTokenTypeAccessToken(String accountType) { - return accountType + ".oauth2.access_token"; + return accountType + ".oauth2.access_token"; } - + public static String getAuthTokenTypeRefreshToken(String accountType) { - return accountType + ".oauth2.refresh_token"; + return accountType + ".oauth2.refresh_token"; } - + public static String getAuthTokenTypeSamlSessionCookie(String accountType) { - return accountType + ".saml.web_sso.session_cookie"; + return accountType + ".saml.web_sso.session_cookie"; } - + } diff --git a/src/com/owncloud/android/lib/common/accounts/AccountUtils.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/accounts/AccountUtils.java similarity index 85% rename from src/com/owncloud/android/lib/common/accounts/AccountUtils.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/accounts/AccountUtils.java index 72126285..4478330f 100644 --- a/src/com/owncloud/android/lib/common/accounts/AccountUtils.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/accounts/AccountUtils.java @@ -1,23 +1,23 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * Copyright (C) 2012 Bartek Przybylski - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -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.resources.files.FileUtils; import com.owncloud.android.lib.resources.status.OwnCloudVersion; +import okhttp3.Cookie; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import okhttp3.Cookie; - public class AccountUtils { private static final String TAG = AccountUtils.class.getSimpleName(); @@ -53,13 +52,13 @@ public class AccountUtils { /** * Constructs full url to host and webdav resource basing on host version * - * @param context Valid Android {@link Context}, needed to access the {@link AccountManager} - * @param account A stored ownCloud {@link Account} - * @return Full URL to WebDAV endpoint in the server corresponding to 'account'. + * @param context Valid Android {@link Context}, needed to access the {@link AccountManager} + * @param account A stored ownCloud {@link Account} + * @return Full URL to WebDAV endpoint in the server corresponding to 'account'. * @throws AccountNotFoundException When 'account' is unknown for the AccountManager */ public static String getWebDavUrlForAccount(Context context, Account account) - throws AccountNotFoundException { + throws AccountNotFoundException { String webDavUrlForAccount = ""; try { @@ -80,19 +79,20 @@ public class AccountUtils { /** * Extracts url server from the account * - * @param context Valid Android {@link Context}, needed to access the {@link AccountManager} - * @param account A stored ownCloud {@link Account} - * @return Full URL to the server corresponding to 'account', ending in the base path - * common to all API endpoints. + * @param context Valid Android {@link Context}, needed to access the {@link AccountManager} + * @param account A stored ownCloud {@link Account} + * @return Full URL to the server corresponding to 'account', ending in the base path + * common to all API endpoints. * @throws AccountNotFoundException When 'account' is unknown for the AccountManager */ public static String getBaseUrlForAccount(Context context, Account account) - throws AccountNotFoundException { + throws AccountNotFoundException { AccountManager ama = AccountManager.get(context.getApplicationContext()); String baseurl = ama.getUserData(account, Constants.KEY_OC_BASE_URL); - if (baseurl == null) + if (baseurl == null) { throw new AccountNotFoundException(account, "Account not found", null); + } return baseurl; } @@ -116,8 +116,8 @@ public class AccountUtils { /** * Get the stored server version corresponding to an OC account. * - * @param account An OC account - * @param context Application context + * @param account An OC account + * @param context Application context * @return Version of the OC server, according to last check */ public static OwnCloudVersion getServerVersionForAccount(Account account, Context context) { @@ -140,7 +140,7 @@ public class AccountUtils { * @throws OperationCanceledException */ public static OwnCloudCredentials getCredentialsForAccount(Context context, Account account) - throws OperationCanceledException, AuthenticatorException, IOException { + throws OperationCanceledException, AuthenticatorException, IOException { OwnCloudCredentials credentials; AccountManager am = AccountManager.get(context); @@ -158,30 +158,30 @@ public class AccountUtils { if (isOauth2) { String accessToken = am.blockingGetAuthToken( - account, - AccountTypeUtils.getAuthTokenTypeAccessToken(account.type), - false); + account, + AccountTypeUtils.getAuthTokenTypeAccessToken(account.type), + false); credentials = OwnCloudCredentialsFactory.newBearerCredentials(username, accessToken); } else if (isSamlSso) { String accessToken = am.blockingGetAuthToken( - account, - AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(account.type), - false); + account, + AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(account.type), + false); credentials = OwnCloudCredentialsFactory.newSamlSsoCredentials(username, accessToken); } else { String password = am.blockingGetAuthToken( - account, - AccountTypeUtils.getAuthTokenTypePass(account.type), - false); + account, + AccountTypeUtils.getAuthTokenTypePass(account.type), + false); credentials = OwnCloudCredentialsFactory.newBasicCredentials( - username, - password, - version.isPreemptiveAuthenticationPreferred() + username, + password, + version.isPreemptiveAuthenticationPreferred() ); } @@ -190,8 +190,9 @@ public class AccountUtils { /** * Get the user id corresponding to an OC account. + * * @param account ownCloud account - * @return user id + * @return user id */ public static String getUserId(Account account, Context context) { AccountManager accountMgr = AccountManager.get(context); @@ -232,7 +233,7 @@ public class AccountUtils { String cookiesString = client.getCookiesString(); if (!"".equals(cookiesString)) { ac.setUserData(savedAccount, Constants.KEY_COOKIES, cookiesString); - Log_OC.d(TAG, "Saving Cookies: "+ cookiesString ); + Log_OC.d(TAG, "Saving Cookies: " + cookiesString); } } } @@ -240,9 +241,9 @@ public class AccountUtils { /** * Restore the client cookies persisted in an account stored in the system AccountManager. * - * @param account Stored account. - * @param client Client to restore cookies in. - * @param context Android context used to access the system AccountManager. + * @param account Stored account. + * @param client Client to restore cookies in. + * @param context Android context used to access the system AccountManager. */ public static void restoreCookies(Account account, OwnCloudClient client, Context context) { if (account == null) { @@ -260,10 +261,12 @@ public class AccountUtils { if (cookiesString != null) { String[] rawCookies = cookiesString.split(";"); List cookieList = new ArrayList<>(rawCookies.length); - for(String rawCookie : rawCookies) { + for (String rawCookie : rawCookies) { rawCookie = rawCookie.replace(" ", ""); final int equalPos = rawCookie.indexOf('='); - if (equalPos == -1) continue; + if (equalPos == -1) { + continue; + } cookieList.add(new Cookie.Builder() .name(rawCookie.substring(0, equalPos)) .value(rawCookie.substring(equalPos + 1)) @@ -302,7 +305,7 @@ public class AccountUtils { public static class Constants { /** * Version should be 3 numbers separated by dot so it can be parsed by - * {@link com.owncloud.android.lib.resources.status.OwnCloudVersion} + * {@link OwnCloudVersion} */ public static final String KEY_OC_VERSION = "oc_version"; /** diff --git a/src/com/owncloud/android/lib/common/authentication/OwnCloudBasicCredentials.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/OwnCloudBasicCredentials.java similarity index 98% rename from src/com/owncloud/android/lib/common/authentication/OwnCloudBasicCredentials.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/OwnCloudBasicCredentials.java index ecd2a0c4..5a83cf63 100644 --- a/src/com/owncloud/android/lib/common/authentication/OwnCloudBasicCredentials.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/OwnCloudBasicCredentials.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -26,7 +26,6 @@ package com.owncloud.android.lib.common.authentication; import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.http.HttpClient; import com.owncloud.android.lib.common.http.HttpConstants; - import okhttp3.Credentials; public class OwnCloudBasicCredentials implements OwnCloudCredentials { diff --git a/src/com/owncloud/android/lib/common/authentication/OwnCloudBearerCredentials.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/OwnCloudBearerCredentials.java similarity index 98% rename from src/com/owncloud/android/lib/common/authentication/OwnCloudBearerCredentials.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/OwnCloudBearerCredentials.java index a53712d6..573307a0 100644 --- a/src/com/owncloud/android/lib/common/authentication/OwnCloudBearerCredentials.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/OwnCloudBearerCredentials.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/com/owncloud/android/lib/common/authentication/OwnCloudCredentials.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/OwnCloudCredentials.java similarity index 100% rename from src/com/owncloud/android/lib/common/authentication/OwnCloudCredentials.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/OwnCloudCredentials.java diff --git a/src/com/owncloud/android/lib/common/authentication/OwnCloudCredentialsFactory.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/OwnCloudCredentialsFactory.java similarity index 96% rename from src/com/owncloud/android/lib/common/authentication/OwnCloudCredentialsFactory.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/OwnCloudCredentialsFactory.java index a7f2ff80..5ac44517 100644 --- a/src/com/owncloud/android/lib/common/authentication/OwnCloudCredentialsFactory.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/OwnCloudCredentialsFactory.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -39,7 +39,7 @@ public class OwnCloudCredentialsFactory { } public static OwnCloudCredentials newBasicCredentials( - String username, String password, boolean preemptiveMode + String username, String password, boolean preemptiveMode ) { return new OwnCloudBasicCredentials(username, password, preemptiveMode); } diff --git a/src/com/owncloud/android/lib/common/authentication/OwnCloudSamlSsoCredentials.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/OwnCloudSamlSsoCredentials.java similarity index 98% rename from src/com/owncloud/android/lib/common/authentication/OwnCloudSamlSsoCredentials.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/OwnCloudSamlSsoCredentials.java index a01e05da..40f77bb3 100644 --- a/src/com/owncloud/android/lib/common/authentication/OwnCloudSamlSsoCredentials.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/OwnCloudSamlSsoCredentials.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/com/owncloud/android/lib/common/authentication/oauth/BearerCredentials.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/BearerCredentials.java similarity index 82% rename from src/com/owncloud/android/lib/common/authentication/oauth/BearerCredentials.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/BearerCredentials.java index 6d82bdb3..ffed3a03 100644 --- a/src/com/owncloud/android/lib/common/authentication/oauth/BearerCredentials.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/BearerCredentials.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. - * + * Copyright (C) 2019 ownCloud GmbH. + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -32,14 +32,13 @@ public class BearerCredentials { public static final int HASH_SEED = 17; public static final int HASH_OFFSET = 37; - + private String mAccessToken; - - + /** * The constructor with the bearer token * - * @param token The bearer token + * @param token The bearer token */ public BearerCredentials(String token) { /*if (token == null) { @@ -48,21 +47,19 @@ public class BearerCredentials { mAccessToken = (token == null) ? "" : token; } - /** * Returns the access token * - * @return The access token + * @return The access token */ public String getAccessToken() { return mAccessToken; } - /** * Get this object string. * - * @return The access token + * @return The access token */ public String toString() { return mAccessToken; @@ -74,19 +71,22 @@ public class BearerCredentials { * @return The hash code of the access token */ public int hashCode() { - return HASH_SEED * HASH_OFFSET + mAccessToken.hashCode(); + return HASH_SEED * HASH_OFFSET + mAccessToken.hashCode(); } /** * These credentials are assumed equal if accessToken is the same. * - * @param o The other object to compare with. - * - * @return 'True' if the object is equivalent. + * @param o The other object to compare with. + * @return 'True' if the object is equivalent. */ public boolean equals(Object o) { - if (o == null) return false; - if (this == o) return true; + if (o == null) { + return false; + } + if (this == o) { + return true; + } if (this.getClass().equals(o.getClass())) { BearerCredentials that = (BearerCredentials) o; if (mAccessToken.equals(that.mAccessToken)) { diff --git a/src/com/owncloud/android/lib/common/authentication/oauth/OAuth2ClientConfiguration.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2ClientConfiguration.java similarity index 100% rename from src/com/owncloud/android/lib/common/authentication/oauth/OAuth2ClientConfiguration.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2ClientConfiguration.java diff --git a/src/com/owncloud/android/lib/common/authentication/oauth/OAuth2Constants.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2Constants.java similarity index 97% rename from src/com/owncloud/android/lib/common/authentication/oauth/OAuth2Constants.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2Constants.java index ad48e5b1..97dbfc41 100644 --- a/src/com/owncloud/android/lib/common/authentication/oauth/OAuth2Constants.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2Constants.java @@ -26,34 +26,34 @@ package com.owncloud.android.lib.common.authentication.oauth; -/** +/** * Constant values for OAuth 2 protocol. - * + *

* Includes required and optional parameter NAMES used in the 'authorization code' grant type. */ public class OAuth2Constants { - + /// Parameters to send to the Authorization Endpoint public static final String KEY_RESPONSE_TYPE = "response_type"; public static final String KEY_REDIRECT_URI = "redirect_uri"; public static final String KEY_CLIENT_ID = "client_id"; public static final String KEY_SCOPE = "scope"; - public static final String KEY_STATE = "state"; - + public static final String KEY_STATE = "state"; + /// Additional parameters to send to the Token Endpoint public static final String KEY_GRANT_TYPE = "grant_type"; public static final String KEY_CODE = "code"; // Used to get the Access Token using Refresh Token public static final String OAUTH2_REFRESH_TOKEN_GRANT_TYPE = "refresh_token"; - + /// Parameters received in an OK response from the Token Endpoint public static final String KEY_ACCESS_TOKEN = "access_token"; public static final String KEY_TOKEN_TYPE = "token_type"; public static final String KEY_EXPIRES_IN = "expires_in"; public static final String KEY_REFRESH_TOKEN = "refresh_token"; - + /// Parameters in an ERROR response public static final String KEY_ERROR = "error"; public static final String KEY_ERROR_DESCRIPTION = "error_description"; diff --git a/src/com/owncloud/android/lib/common/authentication/oauth/OAuth2GetAccessTokenOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2GetAccessTokenOperation.java similarity index 91% rename from src/com/owncloud/android/lib/common/authentication/oauth/OAuth2GetAccessTokenOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2GetAccessTokenOperation.java index a3e5666f..c5273215 100644 --- a/src/com/owncloud/android/lib/common/authentication/oauth/OAuth2GetAccessTokenOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2GetAccessTokenOperation.java @@ -2,7 +2,7 @@ * * @author David A. Velasco * @author Christian Schabesberger - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,42 +29,37 @@ package com.owncloud.android.lib.common.authentication.oauth; 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.authentication.OwnCloudBasicCredentials; import com.owncloud.android.lib.common.authentication.OwnCloudCredentials; 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.RemoteOperationResult; - +import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; import org.json.JSONObject; import java.net.URL; import java.util.Map; -import okhttp3.MultipartBody; -import okhttp3.RequestBody; - - public class OAuth2GetAccessTokenOperation extends RemoteOperation> { - + + private final String mAccessTokenEndpointPath; + private final OAuth2ResponseParser mResponseParser; private String mGrantType; private String mCode; private String mClientId; private String mClientSecret; private String mRedirectUri; - private final String mAccessTokenEndpointPath; - - private final OAuth2ResponseParser mResponseParser; - public OAuth2GetAccessTokenOperation( - String grantType, - String code, - String clientId, - String secretId, - String redirectUri, - String accessTokenEndpointPath + String grantType, + String code, + String clientId, + String secretId, + String redirectUri, + String accessTokenEndpointPath ) { mClientId = clientId; mClientSecret = secretId; @@ -73,9 +68,9 @@ public class OAuth2GetAccessTokenOperation extends RemoteOperation> result = null; - + try { final RequestBody requestBody = new MultipartBody.Builder() @@ -116,7 +111,7 @@ public class OAuth2GetAccessTokenOperation extends RemoteOperation 0) { JSONObject tokenJson = new JSONObject(response); Map accessTokenResult = - mResponseParser.parseAccessTokenResult(tokenJson); + mResponseParser.parseAccessTokenResult(tokenJson); if (accessTokenResult.get(OAuth2Constants.KEY_ERROR) != null || accessTokenResult.get(OAuth2Constants.KEY_ACCESS_TOKEN) == null) { result = new RemoteOperationResult<>(ResultCode.OAUTH2_ERROR); @@ -133,7 +128,7 @@ public class OAuth2GetAccessTokenOperation extends RemoteOperation(e); - + } return result; } diff --git a/src/com/owncloud/android/lib/common/authentication/oauth/OAuth2GrantType.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2GrantType.java similarity index 100% rename from src/com/owncloud/android/lib/common/authentication/oauth/OAuth2GrantType.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2GrantType.java diff --git a/src/com/owncloud/android/lib/common/authentication/oauth/OAuth2Provider.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2Provider.java similarity index 87% rename from src/com/owncloud/android/lib/common/authentication/oauth/OAuth2Provider.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2Provider.java index d259d80e..e8f598cd 100644 --- a/src/com/owncloud/android/lib/common/authentication/oauth/OAuth2Provider.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2Provider.java @@ -31,36 +31,35 @@ public interface OAuth2Provider { /** * {@link OAuth2RequestBuilder} implementation for this provider. * - * @return {@link OAuth2RequestBuilder} implementation. + * @return {@link OAuth2RequestBuilder} implementation. */ 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} * return Configuration of the client that is usinng this {@link OAuth2Provider} */ 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. * - * @return Base URL to authorization server. + * @return Base URL to authorization server. */ String getAuthorizationServerUri(); + /** + * Set base URI to authorization server. + * + * @param authorizationServerUri Set base URL to authorization server. + */ + void setAuthorizationServerUri(String authorizationServerUri); + } diff --git a/src/com/owncloud/android/lib/common/authentication/oauth/OAuth2ProvidersRegistry.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2ProvidersRegistry.java similarity index 84% rename from src/com/owncloud/android/lib/common/authentication/oauth/OAuth2ProvidersRegistry.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2ProvidersRegistry.java index 32aac0ad..16e3b9ac 100644 --- a/src/com/owncloud/android/lib/common/authentication/oauth/OAuth2ProvidersRegistry.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2ProvidersRegistry.java @@ -26,7 +26,6 @@ package com.owncloud.android.lib.common.authentication.oauth; - import java.util.HashMap; import java.util.Map; @@ -36,20 +35,13 @@ public class OAuth2ProvidersRegistry { private OAuth2Provider mDefaultProvider = null; - private OAuth2ProvidersRegistry () { - } - - /** - * See https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom - */ - private static class LazyHolder { - private static final OAuth2ProvidersRegistry INSTANCE = new OAuth2ProvidersRegistry(); + private OAuth2ProvidersRegistry() { } /** * Singleton accesor. * - * @return Singleton isntance of {@link OAuth2ProvidersRegistry} + * @return Singleton isntance of {@link OAuth2ProvidersRegistry} */ public static OAuth2ProvidersRegistry getInstance() { return LazyHolder.INSTANCE; @@ -58,8 +50,8 @@ public class OAuth2ProvidersRegistry { /** * Register an {@link OAuth2Provider} with the name passed as parameter. * - * @param name Name to bind 'oAuthProvider' in the registry. - * @param oAuth2Provider An {@link OAuth2Provider} instance to keep in the registry. + * @param name Name to bind 'oAuthProvider' in the registry. + * @param oAuth2Provider An {@link OAuth2Provider} instance to keep in the registry. * @throws IllegalArgumentException if 'name' or 'oAuthProvider' are null. */ public void registerProvider(String name, OAuth2Provider oAuth2Provider) { @@ -89,7 +81,7 @@ public class OAuth2ProvidersRegistry { /** * Get default {@link OAuth2Provider}. * - * @return Default provider, or NULL if there is no provider. + * @return Default provider, or NULL if there is no provider. */ public OAuth2Provider getProvider() { return mDefaultProvider; @@ -98,8 +90,8 @@ public class OAuth2ProvidersRegistry { /** * Get {@link OAuth2Provider} registered with the name passed as parameter. * - * @param name Name used to register the desired {@link OAuth2Provider} - * @return {@link OAuth2Provider} registered with the name 'name' + * @param name Name used to register the desired {@link OAuth2Provider} + * @return {@link OAuth2Provider} registered with the name 'name' */ public OAuth2Provider getProvider(String name) { return mProviders.get(name); @@ -108,8 +100,8 @@ public class OAuth2ProvidersRegistry { /** * Sets the {@link OAuth2Provider} registered with the name passed as parameter as the default provider * - * @param name Name used to register the {@link OAuth2Provider} to set as default. - * @return {@link OAuth2Provider} set as default, or NULL if no provider was registered with 'name'. + * @param name Name used to register the {@link OAuth2Provider} to set as default. + * @return {@link OAuth2Provider} set as default, or NULL if no provider was registered with 'name'. */ public OAuth2Provider setDefaultProvider(String name) { OAuth2Provider toDefault = mProviders.get(name); @@ -119,4 +111,11 @@ public class OAuth2ProvidersRegistry { return toDefault; } + /** + * See https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom + */ + private static class LazyHolder { + private static final OAuth2ProvidersRegistry INSTANCE = new OAuth2ProvidersRegistry(); + } + } diff --git a/src/com/owncloud/android/lib/common/authentication/oauth/OAuth2QueryParser.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2QueryParser.java similarity index 99% rename from src/com/owncloud/android/lib/common/authentication/oauth/OAuth2QueryParser.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2QueryParser.java index 353cb7b5..aacd8bab 100644 --- a/src/com/owncloud/android/lib/common/authentication/oauth/OAuth2QueryParser.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2QueryParser.java @@ -31,7 +31,6 @@ import com.owncloud.android.lib.common.utils.Log_OC; import java.util.HashMap; import java.util.Map; - public class OAuth2QueryParser { private static final String TAG = OAuth2QueryParser.class.getName(); diff --git a/src/com/owncloud/android/lib/common/authentication/oauth/OAuth2RefreshAccessTokenOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2RefreshAccessTokenOperation.java similarity index 85% rename from src/com/owncloud/android/lib/common/authentication/oauth/OAuth2RefreshAccessTokenOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2RefreshAccessTokenOperation.java index eba3dbeb..5f788831 100644 --- a/src/com/owncloud/android/lib/common/authentication/oauth/OAuth2RefreshAccessTokenOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2RefreshAccessTokenOperation.java @@ -1,59 +1,52 @@ /** - * ownCloud Android client application - * - * @author David González Verdugo - * @author Christian Schabesberger - * - * Copyright (C) 2018 ownCloud GmbH. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * ownCloud Android client application * + * @author David González Verdugo + * @author Christian Schabesberger + *

+ * Copyright (C) 2019 ownCloud GmbH. + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + *

+ * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + *

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ package com.owncloud.android.lib.common.authentication.oauth; 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.authentication.OwnCloudBasicCredentials; 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.RemoteOperationResult; +import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; import com.owncloud.android.lib.common.utils.Log_OC; - +import okhttp3.MultipartBody; +import okhttp3.RequestBody; import org.json.JSONObject; import java.net.URL; 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> { private static final String TAG = OAuth2RefreshAccessTokenOperation.class.getSimpleName(); - + private final String mAccessTokenEndpointPath; + private final OAuth2ResponseParser mResponseParser; private String mClientId; private String mClientSecret; private String mRefreshToken; - private final String mAccessTokenEndpointPath; - - private final OAuth2ResponseParser mResponseParser; - public OAuth2RefreshAccessTokenOperation( String clientId, String secretId, diff --git a/src/com/owncloud/android/lib/common/authentication/oauth/OAuth2RequestBuilder.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2RequestBuilder.java similarity index 100% rename from src/com/owncloud/android/lib/common/authentication/oauth/OAuth2RequestBuilder.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2RequestBuilder.java index 23b3cdb9..edda5d6b 100644 --- a/src/com/owncloud/android/lib/common/authentication/oauth/OAuth2RequestBuilder.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2RequestBuilder.java @@ -30,10 +30,6 @@ import com.owncloud.android.lib.common.operations.RemoteOperation; public interface OAuth2RequestBuilder { - enum OAuthRequest { - GET_AUTHORIZATION_CODE, CREATE_ACCESS_TOKEN, REFRESH_ACCESS_TOKEN - } - void setRequest(OAuthRequest operation); void setGrantType(OAuth2GrantType grantType); @@ -45,4 +41,8 @@ public interface OAuth2RequestBuilder { RemoteOperation buildOperation(); String buildUri(); + + enum OAuthRequest { + GET_AUTHORIZATION_CODE, CREATE_ACCESS_TOKEN, REFRESH_ACCESS_TOKEN + } } \ No newline at end of file diff --git a/src/com/owncloud/android/lib/common/authentication/oauth/OAuth2ResponseParser.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2ResponseParser.java similarity index 57% rename from src/com/owncloud/android/lib/common/authentication/oauth/OAuth2ResponseParser.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2ResponseParser.java index 068165f2..0d377c9e 100644 --- a/src/com/owncloud/android/lib/common/authentication/oauth/OAuth2ResponseParser.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OAuth2ResponseParser.java @@ -1,27 +1,25 @@ /** - * ownCloud Android client application - * - * @author David A. Velasco - * - * Copyright (C) 2017 ownCloud GmbH. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * ownCloud Android client application * + * @author David A. Velasco + *

+ * Copyright (C) 2017 ownCloud GmbH. + *

+ * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2, + * as published by the Free Software Foundation. + *

+ * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + *

+ * You should have received a copy of the GNU General Public License + * along with this program. If not, see . */ package com.owncloud.android.lib.common.authentication.oauth; - import org.json.JSONException; import org.json.JSONObject; @@ -35,40 +33,40 @@ class OAuth2ResponseParser { if (tokenJson.has(OAuth2Constants.KEY_ACCESS_TOKEN)) { resultTokenMap.put(OAuth2Constants.KEY_ACCESS_TOKEN, tokenJson. - getString(OAuth2Constants.KEY_ACCESS_TOKEN)); + getString(OAuth2Constants.KEY_ACCESS_TOKEN)); } if (tokenJson.has(OAuth2Constants.KEY_TOKEN_TYPE)) { resultTokenMap.put(OAuth2Constants.KEY_TOKEN_TYPE, tokenJson. - getString(OAuth2Constants.KEY_TOKEN_TYPE)); + getString(OAuth2Constants.KEY_TOKEN_TYPE)); } if (tokenJson.has(OAuth2Constants.KEY_EXPIRES_IN)) { resultTokenMap.put(OAuth2Constants.KEY_EXPIRES_IN, tokenJson. - getString(OAuth2Constants.KEY_EXPIRES_IN)); + getString(OAuth2Constants.KEY_EXPIRES_IN)); } if (tokenJson.has(OAuth2Constants.KEY_REFRESH_TOKEN)) { resultTokenMap.put(OAuth2Constants.KEY_REFRESH_TOKEN, tokenJson. - getString(OAuth2Constants.KEY_REFRESH_TOKEN)); + getString(OAuth2Constants.KEY_REFRESH_TOKEN)); } if (tokenJson.has(OAuth2Constants.KEY_SCOPE)) { resultTokenMap.put(OAuth2Constants.KEY_SCOPE, tokenJson. - getString(OAuth2Constants.KEY_SCOPE)); + getString(OAuth2Constants.KEY_SCOPE)); } if (tokenJson.has(OAuth2Constants.KEY_ERROR)) { resultTokenMap.put(OAuth2Constants.KEY_ERROR, tokenJson. - getString(OAuth2Constants.KEY_ERROR)); + getString(OAuth2Constants.KEY_ERROR)); } if (tokenJson.has(OAuth2Constants.KEY_ERROR_DESCRIPTION)) { resultTokenMap.put(OAuth2Constants.KEY_ERROR_DESCRIPTION, tokenJson. - getString(OAuth2Constants.KEY_ERROR_DESCRIPTION)); + getString(OAuth2Constants.KEY_ERROR_DESCRIPTION)); } if (tokenJson.has(OAuth2Constants.KEY_ERROR_URI)) { resultTokenMap.put(OAuth2Constants.KEY_ERROR_URI, tokenJson. - getString(OAuth2Constants.KEY_ERROR_URI)); + getString(OAuth2Constants.KEY_ERROR_URI)); } if (tokenJson.has(OAuth2Constants.KEY_USER_ID)) { // not standard resultTokenMap.put(OAuth2Constants.KEY_USER_ID, tokenJson. - getString(OAuth2Constants.KEY_USER_ID)); + getString(OAuth2Constants.KEY_USER_ID)); } return resultTokenMap; diff --git a/src/com/owncloud/android/lib/common/authentication/oauth/OwnCloudOAuth2Provider.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OwnCloudOAuth2Provider.java similarity index 100% rename from src/com/owncloud/android/lib/common/authentication/oauth/OwnCloudOAuth2Provider.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OwnCloudOAuth2Provider.java index 63b43b3e..58f149c7 100644 --- a/src/com/owncloud/android/lib/common/authentication/oauth/OwnCloudOAuth2Provider.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OwnCloudOAuth2Provider.java @@ -46,19 +46,14 @@ public class OwnCloudOAuth2Provider implements OAuth2Provider { return new OwnCloudOAuth2RequestBuilder(this); } - @Override - public void setClientConfiguration(OAuth2ClientConfiguration oAuth2ClientConfiguration) { - mClientConfiguration = oAuth2ClientConfiguration; - } - @Override public OAuth2ClientConfiguration getClientConfiguration() { return mClientConfiguration; } @Override - public void setAuthorizationServerUri(String authorizationServerUri) { - mAuthorizationServerUrl = authorizationServerUri; + public void setClientConfiguration(OAuth2ClientConfiguration oAuth2ClientConfiguration) { + mClientConfiguration = oAuth2ClientConfiguration; } @Override @@ -66,6 +61,11 @@ public class OwnCloudOAuth2Provider implements OAuth2Provider { return mAuthorizationServerUrl; } + @Override + public void setAuthorizationServerUri(String authorizationServerUri) { + mAuthorizationServerUrl = authorizationServerUri; + } + public String getAccessTokenEndpointPath() { return mAccessTokenEndpointPath; } diff --git a/src/com/owncloud/android/lib/common/authentication/oauth/OwnCloudOAuth2RequestBuilder.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OwnCloudOAuth2RequestBuilder.java similarity index 76% rename from src/com/owncloud/android/lib/common/authentication/oauth/OwnCloudOAuth2RequestBuilder.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OwnCloudOAuth2RequestBuilder.java index 18933824..83d1625c 100644 --- a/src/com/owncloud/android/lib/common/authentication/oauth/OwnCloudOAuth2RequestBuilder.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/authentication/oauth/OwnCloudOAuth2RequestBuilder.java @@ -68,22 +68,22 @@ public class OwnCloudOAuth2RequestBuilder implements OAuth2RequestBuilder { if (mGrantType != OAuth2GrantType.AUTHORIZATION_CODE && mGrantType != OAuth2GrantType.REFRESH_TOKEN) { throw new UnsupportedOperationException( - "Unsupported grant type. Only " + - OAuth2GrantType.AUTHORIZATION_CODE.getValue() + " and " + - OAuth2GrantType.REFRESH_TOKEN + " are supported" + "Unsupported grant type. Only " + + OAuth2GrantType.AUTHORIZATION_CODE.getValue() + " and " + + OAuth2GrantType.REFRESH_TOKEN + " are supported" ); } OAuth2ClientConfiguration clientConfiguration = mOAuth2Provider.getClientConfiguration(); - switch(mRequest) { + switch (mRequest) { case CREATE_ACCESS_TOKEN: return new OAuth2GetAccessTokenOperation( - mGrantType.getValue(), - mCode, - clientConfiguration.getClientId(), - clientConfiguration.getClientSecret(), - clientConfiguration.getRedirectUri(), - mOAuth2Provider.getAccessTokenEndpointPath() + mGrantType.getValue(), + mCode, + clientConfiguration.getClientId(), + clientConfiguration.getClientSecret(), + clientConfiguration.getRedirectUri(), + mOAuth2Provider.getAccessTokenEndpointPath() ); case REFRESH_ACCESS_TOKEN: @@ -95,7 +95,7 @@ public class OwnCloudOAuth2RequestBuilder implements OAuth2RequestBuilder { ); default: throw new UnsupportedOperationException( - "Unsupported request" + "Unsupported request" ); } } @@ -104,26 +104,26 @@ public class OwnCloudOAuth2RequestBuilder implements OAuth2RequestBuilder { public String buildUri() { if (OAuth2GrantType.AUTHORIZATION_CODE != mGrantType) { throw new UnsupportedOperationException( - "Unsupported grant type. Only " + - OAuth2GrantType.AUTHORIZATION_CODE.getValue() + " is supported by this provider" + "Unsupported grant type. Only " + + OAuth2GrantType.AUTHORIZATION_CODE.getValue() + " is supported by this provider" ); } OAuth2ClientConfiguration clientConfiguration = mOAuth2Provider.getClientConfiguration(); Uri uri; Uri.Builder uriBuilder; - switch(mRequest) { + switch (mRequest) { case GET_AUTHORIZATION_CODE: uri = Uri.parse(mOAuth2Provider.getAuthorizationServerUri()); uriBuilder = uri.buildUpon(); uriBuilder.appendEncodedPath(mOAuth2Provider.getAuthorizationCodeEndpointPath()); uriBuilder.appendQueryParameter( - OAuth2Constants.KEY_RESPONSE_TYPE, OAuth2Constants.OAUTH2_RESPONSE_TYPE_CODE + OAuth2Constants.KEY_RESPONSE_TYPE, OAuth2Constants.OAUTH2_RESPONSE_TYPE_CODE ); uriBuilder.appendQueryParameter( - OAuth2Constants.KEY_REDIRECT_URI, clientConfiguration.getRedirectUri() + OAuth2Constants.KEY_REDIRECT_URI, clientConfiguration.getRedirectUri() ); uriBuilder.appendQueryParameter( - OAuth2Constants.KEY_CLIENT_ID, clientConfiguration.getClientId() + OAuth2Constants.KEY_CLIENT_ID, clientConfiguration.getClientId() ); uri = uriBuilder.build(); @@ -134,13 +134,13 @@ public class OwnCloudOAuth2RequestBuilder implements OAuth2RequestBuilder { uriBuilder = uri.buildUpon(); uriBuilder.appendEncodedPath(mOAuth2Provider.getAccessTokenEndpointPath()); uriBuilder.appendQueryParameter( - OAuth2Constants.KEY_RESPONSE_TYPE, OAuth2Constants.OAUTH2_RESPONSE_TYPE_CODE + OAuth2Constants.KEY_RESPONSE_TYPE, OAuth2Constants.OAUTH2_RESPONSE_TYPE_CODE ); uriBuilder.appendQueryParameter( - OAuth2Constants.KEY_REDIRECT_URI, clientConfiguration.getRedirectUri() + OAuth2Constants.KEY_REDIRECT_URI, clientConfiguration.getRedirectUri() ); uriBuilder.appendQueryParameter( - OAuth2Constants.KEY_CLIENT_ID, clientConfiguration.getClientId() + OAuth2Constants.KEY_CLIENT_ID, clientConfiguration.getClientId() ); uri = uriBuilder.build(); @@ -148,7 +148,7 @@ public class OwnCloudOAuth2RequestBuilder implements OAuth2RequestBuilder { default: throw new UnsupportedOperationException( - "Unsupported request" + "Unsupported request" ); } } diff --git a/src/com/owncloud/android/lib/common/http/HttpClient.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/HttpClient.java similarity index 95% rename from src/com/owncloud/android/lib/common/http/HttpClient.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/HttpClient.java index a363b931..566d98e9 100644 --- a/src/com/owncloud/android/lib/common/http/HttpClient.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/HttpClient.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -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.NetworkUtils; 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.Arrays; import java.util.HashMap; @@ -41,18 +49,9 @@ import java.util.List; import java.util.Set; 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 + * * @author David González Verdugo */ public class HttpClient { @@ -63,21 +62,13 @@ public class HttpClient { private static Context sContext; private static HashMap> sCookieStore = new HashMap<>(); - public static void setContext(Context context) { - sContext = context; - } - - public Context getContext() { - return sContext; - } - public static OkHttpClient getOkHttpClient() { if (sOkHttpClient == null) { try { final X509TrustManager trustManager = new AdvancedX509TrustManager( NetworkUtils.getKnownServersStore(sContext)); final SSLContext sslContext = SSLContext.getInstance("TLS"); - sslContext.init(null, new TrustManager[] {trustManager}, null); + sslContext.init(null, new TrustManager[]{trustManager}, null); // Automatic cookie handling, NOT PERSISTENT CookieJar cookieJar = new CookieJar() { @@ -109,8 +100,8 @@ public class HttpClient { .sslSocketFactory(sslContext.getSocketFactory(), trustManager) .hostnameVerifier((asdf, usdf) -> true) .cookieJar(cookieJar); - // TODO: Not verifying the hostname against certificate. ask owncloud security human if this is ok. - //.hostnameVerifier(new BrowserCompatHostnameVerifier()); + // TODO: Not verifying the hostname against certificate. ask owncloud security human if this is ok. + //.hostnameVerifier(new BrowserCompatHostnameVerifier()); sOkHttpClient = clientBuilder.build(); } catch (Exception e) { @@ -130,6 +121,31 @@ public class HttpClient { 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() { OkHttpClient.Builder clientBuilder = getOkHttpClient().newBuilder(); clientBuilder.cookieJar(new CookieJar() { @@ -146,22 +162,6 @@ public class HttpClient { 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 getCookiesFromUrl(HttpUrl httpUrl) { return sCookieStore.get(httpUrl.host()); } diff --git a/src/com/owncloud/android/lib/common/http/HttpConstants.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/HttpConstants.java similarity index 98% rename from src/com/owncloud/android/lib/common/http/HttpConstants.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/HttpConstants.java index cef4e75d..201d3b3a 100644 --- a/src/com/owncloud/android/lib/common/http/HttpConstants.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/HttpConstants.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -181,9 +181,13 @@ public class HttpConstants { *************************************************** 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; - /** Default timeout for establishing a connection */ + /** + * Default timeout for establishing a connection + */ public static final int DEFAULT_CONNECTION_TIMEOUT = 60000; } \ No newline at end of file diff --git a/src/com/owncloud/android/lib/common/http/interceptors/HttpInterceptor.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/interceptors/HttpInterceptor.java similarity index 96% rename from src/com/owncloud/android/lib/common/http/interceptors/HttpInterceptor.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/interceptors/HttpInterceptor.java index f49b2686..3c9b61e7 100644 --- a/src/com/owncloud/android/lib/common/http/interceptors/HttpInterceptor.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/interceptors/HttpInterceptor.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,16 +24,17 @@ 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.Request; 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 + * * @author David González Verdugo */ public class HttpInterceptor implements Interceptor { @@ -58,20 +59,12 @@ public class HttpInterceptor implements Interceptor { 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) { mRequestInterceptors.add(requestInterceptor); return this; } - public HttpInterceptor addResponseInterceptor (ResponseInterceptor responseInterceptor) { + public HttpInterceptor addResponseInterceptor(ResponseInterceptor responseInterceptor) { mResponseInterceptors.add(responseInterceptor); return this; } @@ -106,4 +99,12 @@ public class HttpInterceptor implements Interceptor { public ArrayList getResponseInterceptors() { return mResponseInterceptors; } + + public interface RequestInterceptor { + Request intercept(Request request) throws IOException; + } + + public interface ResponseInterceptor { + Response intercept(Response response) throws IOException; + } } \ No newline at end of file diff --git a/src/com/owncloud/android/lib/common/http/interceptors/RequestHeaderInterceptor.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/interceptors/RequestHeaderInterceptor.java similarity index 98% rename from src/com/owncloud/android/lib/common/http/interceptors/RequestHeaderInterceptor.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/interceptors/RequestHeaderInterceptor.java index a998e49b..5066d607 100644 --- a/src/com/owncloud/android/lib/common/http/interceptors/RequestHeaderInterceptor.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/interceptors/RequestHeaderInterceptor.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/com/owncloud/android/lib/common/http/methods/HttpBaseMethod.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/HttpBaseMethod.java similarity index 99% rename from src/com/owncloud/android/lib/common/http/methods/HttpBaseMethod.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/HttpBaseMethod.java index 4444b964..1d12c6e1 100644 --- a/src/com/owncloud/android/lib/common/http/methods/HttpBaseMethod.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/HttpBaseMethod.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -25,12 +25,6 @@ package com.owncloud.android.lib.common.http.methods; 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.Headers; import okhttp3.HttpUrl; @@ -39,6 +33,11 @@ import okhttp3.Request; import okhttp3.RequestBody; 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: * - OkHttp for non webdav methods @@ -136,6 +135,12 @@ public abstract class HttpBaseMethod { // Connection parameters + public void setRetryOnConnectionFailure(boolean retryOnConnectionFailure) { + mOkHttpClient = mOkHttpClient.newBuilder() + .retryOnConnectionFailure(retryOnConnectionFailure) + .build(); + } + public void setReadTimeout(long readTimeout, TimeUnit timeUnit) { mOkHttpClient = mOkHttpClient.newBuilder() .readTimeout(readTimeout, timeUnit) @@ -154,12 +159,6 @@ public abstract class HttpBaseMethod { .build(); } - public void setRetryOnConnectionFailure(boolean retryOnConnectionFailure) { - mOkHttpClient = mOkHttpClient.newBuilder() - .retryOnConnectionFailure(retryOnConnectionFailure) - .build(); - } - // Request public void addRequestHeader(String name, String value) { diff --git a/src/com/owncloud/android/lib/common/http/methods/nonwebdav/DeleteMethod.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/nonwebdav/DeleteMethod.java similarity index 93% rename from src/com/owncloud/android/lib/common/http/methods/nonwebdav/DeleteMethod.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/nonwebdav/DeleteMethod.java index 5b9c6d1b..2d7153f9 100644 --- a/src/com/owncloud/android/lib/common/http/methods/nonwebdav/DeleteMethod.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/nonwebdav/DeleteMethod.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -27,13 +27,12 @@ package com.owncloud.android.lib.common.http.methods.nonwebdav; import java.io.IOException; import java.net.URL; -import okhttp3.HttpUrl; - /** * OkHttp delete calls wrapper + * * @author David González Verdugo */ -public class DeleteMethod extends HttpMethod{ +public class DeleteMethod extends HttpMethod { public DeleteMethod(URL url) { super(url); diff --git a/src/com/owncloud/android/lib/common/http/methods/nonwebdav/GetMethod.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/nonwebdav/GetMethod.java similarity index 96% rename from src/com/owncloud/android/lib/common/http/methods/nonwebdav/GetMethod.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/nonwebdav/GetMethod.java index 183a7299..afcf45e5 100644 --- a/src/com/owncloud/android/lib/common/http/methods/nonwebdav/GetMethod.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/nonwebdav/GetMethod.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -27,10 +27,9 @@ package com.owncloud.android.lib.common.http.methods.nonwebdav; import java.io.IOException; import java.net.URL; -import okhttp3.HttpUrl; - /** * OkHttp get calls wrapper + * * @author David González Verdugo */ public class GetMethod extends HttpMethod { diff --git a/src/com/owncloud/android/lib/common/http/methods/nonwebdav/HttpMethod.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/nonwebdav/HttpMethod.java similarity index 95% rename from src/com/owncloud/android/lib/common/http/methods/nonwebdav/HttpMethod.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/nonwebdav/HttpMethod.java index 3c73bf3f..30e8c52c 100644 --- a/src/com/owncloud/android/lib/common/http/methods/nonwebdav/HttpMethod.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/nonwebdav/HttpMethod.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -29,9 +29,6 @@ import com.owncloud.android.lib.common.http.methods.HttpBaseMethod; import java.io.IOException; import java.net.URL; -import okhttp3.Call; -import okhttp3.HttpUrl; - /** * Wrapper to perform OkHttp calls * diff --git a/src/com/owncloud/android/lib/common/http/methods/nonwebdav/PostMethod.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/nonwebdav/PostMethod.java similarity index 94% rename from src/com/owncloud/android/lib/common/http/methods/nonwebdav/PostMethod.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/nonwebdav/PostMethod.java index 970252e1..a6cc7fc9 100644 --- a/src/com/owncloud/android/lib/common/http/methods/nonwebdav/PostMethod.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/nonwebdav/PostMethod.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -27,15 +27,14 @@ package com.owncloud.android.lib.common.http.methods.nonwebdav; import java.io.IOException; import java.net.URL; -import okhttp3.HttpUrl; - /** * OkHttp post calls wrapper + * * @author David González Verdugo */ public class PostMethod extends HttpMethod { - public PostMethod(URL url){ + public PostMethod(URL url) { super(url); } diff --git a/src/com/owncloud/android/lib/common/http/methods/nonwebdav/PutMethod.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/nonwebdav/PutMethod.java similarity index 91% rename from src/com/owncloud/android/lib/common/http/methods/nonwebdav/PutMethod.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/nonwebdav/PutMethod.java index 6497b002..67eb4f00 100644 --- a/src/com/owncloud/android/lib/common/http/methods/nonwebdav/PutMethod.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/nonwebdav/PutMethod.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -27,11 +27,9 @@ package com.owncloud.android.lib.common.http.methods.nonwebdav; import java.io.IOException; 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) { super(url); } diff --git a/src/com/owncloud/android/lib/common/http/methods/webdav/CopyMethod.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/CopyMethod.java similarity index 97% rename from src/com/owncloud/android/lib/common/http/methods/webdav/CopyMethod.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/CopyMethod.java index 6350ff82..a3daeba3 100644 --- a/src/com/owncloud/android/lib/common/http/methods/webdav/CopyMethod.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/CopyMethod.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,12 +24,13 @@ package com.owncloud.android.lib.common.http.methods.webdav; -import java.net.URL; - import kotlin.Unit; +import java.net.URL; + /** * Copy calls wrapper + * * @author Christian Schabesberger * @author David González Verdugo */ diff --git a/src/com/owncloud/android/lib/common/http/methods/webdav/DavConstants.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/DavConstants.java similarity index 97% rename from src/com/owncloud/android/lib/common/http/methods/webdav/DavConstants.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/DavConstants.java index 7017e4fa..c1ceacd9 100644 --- a/src/com/owncloud/android/lib/common/http/methods/webdav/DavConstants.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/DavConstants.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/com/owncloud/android/lib/common/http/methods/webdav/DavMethod.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/DavMethod.java similarity index 98% rename from src/com/owncloud/android/lib/common/http/methods/webdav/DavMethod.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/DavMethod.java index d37c2337..a132f528 100644 --- a/src/com/owncloud/android/lib/common/http/methods/webdav/DavMethod.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/DavMethod.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,23 +24,23 @@ 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.DavOCResource; import at.bitfire.dav4android.exception.HttpException; 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.Protocol; import okhttp3.Response; import okhttp3.ResponseBody; +import java.net.URL; +import java.util.concurrent.TimeUnit; + /** * Wrapper to perform WebDAV (dav4android) calls + * * @author David González Verdugo */ public abstract class DavMethod extends HttpBaseMethod { @@ -124,6 +124,24 @@ public abstract class DavMethod extends HttpBaseMethod { 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 public void setRetryOnConnectionFailure(boolean retryOnConnectionFailure) { super.setRetryOnConnectionFailure(retryOnConnectionFailure); @@ -133,24 +151,6 @@ public abstract class DavMethod extends HttpBaseMethod { 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 public boolean isAborted() { return mDavResource.isCallAborted(); diff --git a/src/com/owncloud/android/lib/common/http/methods/webdav/DavUtils.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/DavUtils.java similarity index 100% rename from src/com/owncloud/android/lib/common/http/methods/webdav/DavUtils.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/DavUtils.java diff --git a/src/com/owncloud/android/lib/common/http/methods/webdav/MkColMethod.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/MkColMethod.java similarity index 97% rename from src/com/owncloud/android/lib/common/http/methods/webdav/MkColMethod.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/MkColMethod.java index 4bafc0aa..07b6fbfb 100644 --- a/src/com/owncloud/android/lib/common/http/methods/webdav/MkColMethod.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/MkColMethod.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,12 +24,13 @@ package com.owncloud.android.lib.common.http.methods.webdav; -import java.net.URL; - import kotlin.Unit; +import java.net.URL; + /** * MkCol calls wrapper + * * @author Christian Schabesberger * @author David González Verdugo */ diff --git a/src/com/owncloud/android/lib/common/http/methods/webdav/MoveMethod.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/MoveMethod.java similarity index 98% rename from src/com/owncloud/android/lib/common/http/methods/webdav/MoveMethod.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/MoveMethod.java index 27a2c918..c6e281c1 100644 --- a/src/com/owncloud/android/lib/common/http/methods/webdav/MoveMethod.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/MoveMethod.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -25,13 +25,13 @@ package com.owncloud.android.lib.common.http.methods.webdav; import com.owncloud.android.lib.common.http.HttpConstants; +import kotlin.Unit; import java.net.URL; -import kotlin.Unit; - /** * Move calls wrapper + * * @author Christian Schabesberger * @author David González Verdugo */ diff --git a/src/com/owncloud/android/lib/common/http/methods/webdav/PropfindMethod.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/PropfindMethod.java similarity index 96% rename from src/com/owncloud/android/lib/common/http/methods/webdav/PropfindMethod.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/PropfindMethod.java index 31ce12c4..3e5bb087 100644 --- a/src/com/owncloud/android/lib/common/http/methods/webdav/PropfindMethod.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/PropfindMethod.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,18 +24,19 @@ 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.Response; import at.bitfire.dav4android.exception.DavException; import kotlin.Unit; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + /** * Propfind calls wrapper + * * @author David González Verdugo */ public class PropfindMethod extends DavMethod { @@ -57,7 +58,7 @@ public class PropfindMethod extends DavMethod { } @Override - public int onExecute() throws IOException, DavException{ + public int onExecute() throws IOException, DavException { mDavResource.propfind(mDepth, mPropertiesToRequest, (Response response, Response.HrefRelation hrefRelation) -> { switch (hrefRelation) { diff --git a/src/com/owncloud/android/lib/common/http/methods/webdav/PutMethod.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/PutMethod.java similarity index 97% rename from src/com/owncloud/android/lib/common/http/methods/webdav/PutMethod.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/PutMethod.java index f5b889df..52e33c75 100644 --- a/src/com/owncloud/android/lib/common/http/methods/webdav/PutMethod.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/http/methods/webdav/PutMethod.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,23 +24,25 @@ package com.owncloud.android.lib.common.http.methods.webdav; +import at.bitfire.dav4android.exception.HttpException; import com.owncloud.android.lib.common.http.HttpConstants; +import kotlin.Unit; import java.io.IOException; import java.net.URL; -import at.bitfire.dav4android.exception.HttpException; -import kotlin.Unit; - /** * Put calls wrapper + * * @author David González Verdugo */ public class PutMethod extends DavMethod { public PutMethod(URL url) { super(url); - }; + } + + ; @Override public int onExecute() throws IOException, HttpException { diff --git a/src/com/owncloud/android/lib/common/network/AdvancedX509TrustManager.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/AdvancedX509TrustManager.java similarity index 75% rename from src/com/owncloud/android/lib/common/network/AdvancedX509TrustManager.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/AdvancedX509TrustManager.java index 53d60475..a1fbf59d 100644 --- a/src/com/owncloud/android/lib/common/network/AdvancedX509TrustManager.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/AdvancedX509TrustManager.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license * Copyright (C) 2016 ownCloud GmbH. - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -24,6 +24,11 @@ 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.KeyStoreException; import java.security.NoSuchAlgorithmException; @@ -34,19 +39,11 @@ import java.security.cert.CertificateExpiredException; import java.security.cert.CertificateNotYetValidException; 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 */ public class AdvancedX509TrustManager implements X509TrustManager { - + private static final String TAG = AdvancedX509TrustManager.class.getSimpleName(); private X509TrustManager mStandardTrustManager = null; @@ -54,27 +51,27 @@ public class AdvancedX509TrustManager implements X509TrustManager { /** * Constructor for AdvancedX509TrustManager - * - * @param knownServersKeyStore Local certificates store with server certificates explicitly trusted by the user. - * @throws CertStoreException When no default X509TrustManager instance was found in the system. + * + * @param knownServersKeyStore Local certificates store with server certificates explicitly trusted by the user. + * @throws CertStoreException When no default X509TrustManager instance was found in the system. */ public AdvancedX509TrustManager(KeyStore knownServersKeyStore) throws NoSuchAlgorithmException, KeyStoreException, CertStoreException { super(); TrustManagerFactory factory = TrustManagerFactory .getInstance(TrustManagerFactory.getDefaultAlgorithm()); - factory.init((KeyStore)null); + factory.init((KeyStore) null); mStandardTrustManager = findX509TrustManager(factory); mKnownServersKeyStore = knownServersKeyStore; } - - + /** * Locates the first X509TrustManager provided by a given TrustManagerFactory - * @param factory TrustManagerFactory to inspect in the search for a X509TrustManager - * @return The first X509TrustManager found in factory. - * @throws CertStoreException When no X509TrustManager instance was found in factory + * + * @param factory TrustManagerFactory to inspect in the search for a X509TrustManager + * @return The first X509TrustManager found in factory. + * @throws CertStoreException When no X509TrustManager instance was found in factory */ private X509TrustManager findX509TrustManager(TrustManagerFactory factory) throws CertStoreException { TrustManager tms[] = factory.getTrustManagers(); @@ -85,36 +82,34 @@ public class AdvancedX509TrustManager implements X509TrustManager { } return null; } - /** * @see javax.net.ssl.X509TrustManager#checkClientTrusted(X509Certificate[], - * String authType) + * String authType) */ public void checkClientTrusted(X509Certificate[] certificates, String authType) throws CertificateException { mStandardTrustManager.checkClientTrusted(certificates, authType); } - /** * @see javax.net.ssl.X509TrustManager#checkServerTrusted(X509Certificate[], - * String authType) + * String authType) */ public void checkServerTrusted(X509Certificate[] certificates, String authType) { if (!isKnownServer(certificates[0])) { - CertificateCombinedException result = new CertificateCombinedException(certificates[0]); - try { - certificates[0].checkValidity(); - } catch (CertificateExpiredException c) { - result.setCertificateExpiredException(c); - - } catch (CertificateNotYetValidException c) { + CertificateCombinedException result = new CertificateCombinedException(certificates[0]); + try { + certificates[0].checkValidity(); + } catch (CertificateExpiredException c) { + result.setCertificateExpiredException(c); + + } catch (CertificateNotYetValidException c) { result.setCertificateNotYetException(c); - } - - try { - mStandardTrustManager.checkServerTrusted(certificates, authType); - } catch (CertificateException c) { + } + + try { + mStandardTrustManager.checkServerTrusted(certificates, authType); + } catch (CertificateException c) { Throwable cause = c.getCause(); Throwable previousCause = null; while (cause != null && cause != previousCause && !(cause instanceof CertPathValidatorException)) { // getCause() is not funny @@ -122,19 +117,19 @@ public class AdvancedX509TrustManager implements X509TrustManager { cause = cause.getCause(); } if (cause != null && cause instanceof CertPathValidatorException) { - result.setCertPathValidatorException((CertPathValidatorException)cause); + result.setCertPathValidatorException((CertPathValidatorException) cause); } else { - result.setOtherCertificateException(c); + result.setOtherCertificateException(c); } - } - - if (result.isException()) - throw result; + } + + if (result.isException()) { + throw result; + } } } - - + /** * @see javax.net.ssl.X509TrustManager#getAcceptedIssuers() */ @@ -142,7 +137,6 @@ public class AdvancedX509TrustManager implements X509TrustManager { return mStandardTrustManager.getAcceptedIssuers(); } - public boolean isKnownServer(X509Certificate cert) { try { return (mKnownServersKeyStore.getCertificateAlias(cert) != null); @@ -151,5 +145,5 @@ public class AdvancedX509TrustManager implements X509TrustManager { return false; } } - + } \ No newline at end of file diff --git a/src/com/owncloud/android/lib/common/network/CertificateCombinedException.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/CertificateCombinedException.java similarity index 93% rename from src/com/owncloud/android/lib/common/network/CertificateCombinedException.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/CertificateCombinedException.java index 6c50855c..97d40b6e 100644 --- a/src/com/owncloud/android/lib/common/network/CertificateCombinedException.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/CertificateCombinedException.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license * Copyright (C) 2016 ownCloud GmbH. - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -24,36 +24,37 @@ package com.owncloud.android.lib.common.network; +import javax.net.ssl.SSLPeerUnverifiedException; import java.security.cert.CertPathValidatorException; import java.security.cert.CertificateException; import java.security.cert.CertificateExpiredException; import java.security.cert.CertificateNotYetValidException; import java.security.cert.X509Certificate; -import javax.net.ssl.SSLPeerUnverifiedException; - /** * Exception joining all the problems that {@link AdvancedX509TrustManager} can find in * a certificate chain for a server. - * + *

* This was initially created as an extension of CertificateException, but some * implementations of the SSL socket layer in existing devices are REPLACING the CertificateException * instances thrown by {@link javax.net.ssl.X509TrustManager#checkServerTrusted(X509Certificate[], String)} - * with SSLPeerUnverifiedException FORGETTING THE CAUSING EXCEPTION instead of wrapping it. - * - * Due to this, extending RuntimeException is necessary to get that the CertificateCombinedException + * with SSLPeerUnverifiedException FORGETTING THE CAUSING EXCEPTION instead of wrapping it. + *

+ * Due to this, extending RuntimeException is necessary to get that the CertificateCombinedException * instance reaches {@link AdvancedSslSocketFactory#verifyPeerIdentity}. - * + *

* 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. - * + * * @author David A. Velasco */ 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 X509Certificate mServerCert = null; private String mHostInUrl; @@ -62,7 +63,7 @@ public class CertificateCombinedException extends RuntimeException { private CertPathValidatorException mCertPathValidatorException = null; private CertificateException mOtherCertificateException = null; private SSLPeerUnverifiedException mSslPeerUnverifiedException = null; - + public CertificateCombinedException(X509Certificate x509Certificate) { mServerCert = x509Certificate; } @@ -84,7 +85,7 @@ public class CertificateCombinedException extends RuntimeException { } public void setCertificateExpiredException(CertificateExpiredException c) { - mCertificateExpiredException = c; + mCertificateExpiredException = c; } public CertificateNotYetValidException getCertificateNotYetValidException() { @@ -112,7 +113,7 @@ public class CertificateCombinedException extends RuntimeException { } public SSLPeerUnverifiedException getSslPeerUnverifiedException() { - return mSslPeerUnverifiedException ; + return mSslPeerUnverifiedException; } public void setSslPeerUnverifiedException(SSLPeerUnverifiedException s) { diff --git a/src/com/owncloud/android/lib/common/network/ChunkFromFileRequestBody.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/ChunkFromFileRequestBody.java similarity index 87% rename from src/com/owncloud/android/lib/common/network/ChunkFromFileRequestBody.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/ChunkFromFileRequestBody.java index 63ee682f..776bce2a 100644 --- a/src/com/owncloud/android/lib/common/network/ChunkFromFileRequestBody.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/ChunkFromFileRequestBody.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -27,6 +27,8 @@ package com.owncloud.android.lib.common.network; import android.util.Log; import com.owncloud.android.lib.common.utils.Log_OC; +import okhttp3.MediaType; +import okio.BufferedSink; import java.io.File; import java.io.IOException; @@ -34,9 +36,6 @@ import java.nio.ByteBuffer; import java.nio.channels.FileChannel; 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 * @@ -84,18 +83,19 @@ public class ChunkFromFileRequestBody extends FileRequestBody { try { mChannel.position(mOffset); long size = mFile.length(); - if (size == 0) size = -1; + if (size == 0) { + size = -1; + } long maxCount = Math.min(mOffset + mChunkSize, mChannel.size()); while (mChannel.position() < maxCount) { - Log_OC.d(TAG, "Sink buffer size: " + sink.buffer().size()); readCount = mChannel.read(mBuffer); Log_OC.d(TAG, "Read " + readCount + " bytes from file channel to " + mBuffer.toString()); - sink.buffer().write(mBuffer.array(), 0 ,readCount); + sink.buffer().write(mBuffer.array(), 0, readCount); sink.flush(); @@ -118,14 +118,14 @@ public class ChunkFromFileRequestBody extends FileRequestBody { } catch (Exception exception) { Log.e(TAG, exception.toString()); -// // any read problem will be handled as if the file is not there -// if (io instanceof FileNotFoundException) { -// throw io; -// } else { -// FileNotFoundException fnf = new FileNotFoundException("Exception reading source file"); -// fnf.initCause(io); -// throw fnf; -// } + // // any read problem will be handled as if the file is not there + // if (io instanceof FileNotFoundException) { + // throw io; + // } else { + // FileNotFoundException fnf = new FileNotFoundException("Exception reading source file"); + // fnf.initCause(io); + // throw fnf; + // } } } diff --git a/src/com/owncloud/android/lib/common/network/FileRequestBody.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/FileRequestBody.java similarity index 97% rename from src/com/owncloud/android/lib/common/network/FileRequestBody.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/FileRequestBody.java index 56575827..21934a2b 100644 --- a/src/com/owncloud/android/lib/common/network/FileRequestBody.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/FileRequestBody.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -26,7 +26,11 @@ package com.owncloud.android.lib.common.network; 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.util.Collection; @@ -34,12 +38,6 @@ import java.util.HashSet; import java.util.Iterator; 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 * diff --git a/src/com/owncloud/android/lib/common/network/NetworkUtils.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/NetworkUtils.java similarity index 67% rename from src/com/owncloud/android/lib/common/network/NetworkUtils.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/NetworkUtils.java index d9e79706..e4461341 100644 --- a/src/com/owncloud/android/lib/common/network/NetworkUtils.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/NetworkUtils.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license * Copyright (C) 2016 ownCloud GmbH. - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -24,6 +24,11 @@ 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.FileInputStream; import java.io.FileOutputStream; @@ -35,54 +40,50 @@ import java.security.NoSuchAlgorithmException; import java.security.cert.Certificate; 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 { - - final private static String TAG = NetworkUtils.class.getSimpleName(); - - /** Default timeout for waiting data from the server */ - public static final int DEFAULT_DATA_TIMEOUT = 60000; - - /** Default timeout for establishing a connection */ - public static final int DEFAULT_CONNECTION_TIMEOUT = 60000; - - /** Standard name for protocol TLS version 1.2 in Java Secure Socket Extension (JSSE) API */ - public static final String PROTOCOL_TLSv1_2 = "TLSv1.2"; - - /** Standard name for protocol TLS version 1.0 in JSSE API */ - public static final String PROTOCOL_TLSv1_0 = "TLSv1"; + /** + * Default timeout for waiting data from the server + */ + public static final int DEFAULT_DATA_TIMEOUT = 60000; + /** + * Default timeout for establishing a connection + */ + public static final int DEFAULT_CONNECTION_TIMEOUT = 60000; + /** + * Standard name for protocol TLS version 1.2 in Java Secure Socket Extension (JSSE) API + */ + public static final String PROTOCOL_TLSv1_2 = "TLSv1.2"; + /** + * Standard name for protocol TLS version 1.0 in JSSE API + */ + public static final String PROTOCOL_TLSv1_0 = "TLSv1"; + final private static String TAG = NetworkUtils.class.getSimpleName(); private static X509HostnameVerifier mHostnameVerifier = null; private static String LOCAL_TRUSTSTORE_FILENAME = "knownServers.bks"; - + private static String LOCAL_TRUSTSTORE_PASSWORD = "password"; private static KeyStore mKnownServersStore = null; - + /** * Returns the local store of reliable server certificates, explicitly accepted by the user. - * + *

* Returns a KeyStore instance with empty content if the local store was never created. - * + *

* Loads the store from the storage environment if needed. - * - * @param context Android context where the operation is being performed. - * @return KeyStore instance with explicitly-accepted server certificates. - * @throws KeyStoreException When the KeyStore instance could not be created. - * @throws IOException When an existing local trust store could not be loaded. - * @throws NoSuchAlgorithmException When the existing local trust store was saved with an unsupported algorithm. - * @throws CertificateException When an exception occurred while loading the certificates from the local - * trust store. + * + * @param context Android context where the operation is being performed. + * @return KeyStore instance with explicitly-accepted server certificates. + * @throws KeyStoreException When the KeyStore instance could not be created. + * @throws IOException When an existing local trust store could not be loaded. + * @throws NoSuchAlgorithmException When the existing local trust store was saved with an unsupported algorithm. + * @throws CertificateException When an exception occurred while loading the certificates from the local + * trust store. */ public static KeyStore getKnownServersStore(Context context) - throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException { + throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException { if (mKnownServersStore == null) { //mKnownServersStore = KeyStore.getInstance("BKS"); mKnownServersStore = KeyStore.getInstance(KeyStore.getDefaultType()); @@ -96,17 +97,16 @@ public class NetworkUtils { in.close(); } } else { - // next is necessary to initialize an empty KeyStore instance - mKnownServersStore.load(null, LOCAL_TRUSTSTORE_PASSWORD.toCharArray()); + // next is necessary to initialize an empty KeyStore instance + mKnownServersStore.load(null, LOCAL_TRUSTSTORE_PASSWORD.toCharArray()); } } return mKnownServersStore; } - - - public static void addCertToKnownServersStore(Certificate cert, Context context) - throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException { - + + public static void addCertToKnownServersStore(Certificate cert, Context context) + throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException { + KeyStore knownServers = getKnownServersStore(context); knownServers.setCertificateEntry(Integer.toString(cert.hashCode()), cert); FileOutputStream fos = null; @@ -118,13 +118,13 @@ public class NetworkUtils { } } - public static boolean isCertInKnownServersStore(Certificate cert, Context context) - throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException { - - KeyStore knownServers = getKnownServersStore(context); - Log_OC.d(TAG, "Certificate - HashCode: " + cert.hashCode() + " " - + Boolean.toString(knownServers.isCertificateEntry(Integer.toString(cert.hashCode())))); - return knownServers.isCertificateEntry(Integer.toString(cert.hashCode())); + public static boolean isCertInKnownServersStore(Certificate cert, Context context) + throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException { + + KeyStore knownServers = getKnownServersStore(context); + Log_OC.d(TAG, "Certificate - HashCode: " + cert.hashCode() + " " + + Boolean.toString(knownServers.isCertificateEntry(Integer.toString(cert.hashCode())))); + return knownServers.isCertificateEntry(Integer.toString(cert.hashCode())); } } diff --git a/src/com/owncloud/android/lib/common/network/OnDatatransferProgressListener.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/OnDatatransferProgressListener.java similarity index 92% rename from src/com/owncloud/android/lib/common/network/OnDatatransferProgressListener.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/OnDatatransferProgressListener.java index e78320cd..807884fd 100644 --- a/src/com/owncloud/android/lib/common/network/OnDatatransferProgressListener.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/OnDatatransferProgressListener.java @@ -1,23 +1,23 @@ /* ownCloud Android Library is available under MIT license * Copyright (C) 2016 ownCloud GmbH. * Copyright (C) 2012 Bartek Przybylski - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * diff --git a/src/com/owncloud/android/lib/common/network/ProgressiveDataTransferer.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/ProgressiveDataTransferer.java similarity index 87% rename from src/com/owncloud/android/lib/common/network/ProgressiveDataTransferer.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/ProgressiveDataTransferer.java index 979e8082..9c89e542 100644 --- a/src/com/owncloud/android/lib/common/network/ProgressiveDataTransferer.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/ProgressiveDataTransferer.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license * Copyright (C) 2016 ownCloud GmbH. - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -26,11 +26,10 @@ package com.owncloud.android.lib.common.network; import java.util.Collection; - public interface ProgressiveDataTransferer { - public void addDatatransferProgressListener (OnDatatransferProgressListener listener); - + public void addDatatransferProgressListener(OnDatatransferProgressListener listener); + public void addDatatransferProgressListeners(Collection listeners); public void removeDatatransferProgressListener(OnDatatransferProgressListener listener); diff --git a/src/com/owncloud/android/lib/common/network/RedirectionPath.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/RedirectionPath.java similarity index 85% rename from src/com/owncloud/android/lib/common/network/RedirectionPath.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/RedirectionPath.java index 3df629ac..3247b1ee 100644 --- a/src/com/owncloud/android/lib/common/network/RedirectionPath.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/RedirectionPath.java @@ -27,22 +27,19 @@ package com.owncloud.android.lib.common.network; - - import com.owncloud.android.lib.common.http.HttpConstants; import java.util.Arrays; - /** * 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 * of them. - * + *

* 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 * that ran the operation. - * + *

* If no redirection was followed, the last (and first) status code contained corresponds to the original URL in the * request. */ @@ -59,9 +56,9 @@ public class RedirectionPath { /** * Public constructor. * - * @param status Status code resulting of executing a request on the original URL. - * @param maxRedirections Maximum number of redirections that will be contained. - * @throws IllegalArgumentException If 'maxRedirections' is < 0 + * @param status Status code resulting of executing a request on the original URL. + * @param maxRedirections Maximum number of redirections that will be contained. + * @throws IllegalArgumentException If 'maxRedirections' is < 0 */ public RedirectionPath(int status, int maxRedirections) { if (maxRedirections < 0) { @@ -75,7 +72,7 @@ public class RedirectionPath { /** * Adds a new location URL to the list of followed redirections. * - * @param location URL extracted from a 'Location' header in a redirection. + * @param location URL extracted from a 'Location' header in a redirection. */ public void addLocation(String location) { if (mLocations == null) { @@ -86,11 +83,10 @@ public class RedirectionPath { } } - /** * Adds a new status code to the list of status corresponding to followed redirections. * - * @param status Status code from the response of another followed redirection. + * @param status Status code from the response of another followed redirection. */ public void addStatus(int status) { if (mLastStatus < mStatuses.length - 1) { @@ -99,14 +95,14 @@ public class RedirectionPath { } /** - * @return Last status code saved. + * @return Last status code saved. */ public int getLastStatus() { return mStatuses[mLastStatus]; } /** - * @return Last location followed corresponding to a permanent redirection (status code 301). + * @return Last location followed corresponding to a permanent redirection (status code 301). */ public String getLastPermanentLocation() { for (int i = mLastStatus; i >= 0; i--) { @@ -118,11 +114,10 @@ public class RedirectionPath { } /** - * @return Count of locations. + * @return Count of locations. */ public int getRedirectionsCount() { return mLastLocation + 1; } - } diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/ServerNameIndicator.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/ServerNameIndicator.java new file mode 100644 index 00000000..e0dabae9 --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/ServerNameIndicator.java @@ -0,0 +1,145 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2016 ownCloud GmbH. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +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.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.concurrent.atomic.AtomicReference; + +/** + * Enables the support of Server Name Indication if existing + * in the underlying network implementation. + *

+ * Build as a singleton. + * + * @author David A. Velasco + */ +public class ServerNameIndicator { + + private static final String TAG = ServerNameIndicator.class.getSimpleName(); + + private static final AtomicReference mSingleInstance = new AtomicReference(); + + private static final String METHOD_NAME = "setHostname"; + + private final WeakReference> mSSLSocketClassRef; + private final WeakReference mSetHostnameMethodRef; + + /** + * Private constructor, class is a singleton. + * + * @param sslSocketClass Underlying implementation class of {@link SSLSocket} used to connect with the server. + * @param setHostnameMethod Name of the method to call to enable the SNI support. + */ + private ServerNameIndicator(Class sslSocketClass, Method setHostnameMethod) { + mSSLSocketClassRef = new WeakReference>(sslSocketClass); + mSetHostnameMethodRef = (setHostnameMethod == null) ? null : new WeakReference(setHostnameMethod); + } + + /** + * Calls the {@code #setHostname(String)} method of the underlying implementation + * of {@link SSLSocket} if exists. + *

+ * Creates and initializes the single instance of the class when needed + * + * @param hostname The name of the server host of interest. + * @param sslSocket Client socket to connect with the server. + */ + public static void setServerNameIndication(String hostname, SSLSocket sslSocket) { + final Method setHostnameMethod = getMethod(sslSocket); + if (setHostnameMethod != null) { + try { + setHostnameMethod.invoke(sslSocket, hostname); + Log_OC.i(TAG, "SNI done, hostname: " + hostname); + + } catch (IllegalArgumentException e) { + Log_OC.e(TAG, "Call to SSLSocket#setHost(String) failed ", e); + + } catch (IllegalAccessException e) { + Log_OC.e(TAG, "Call to SSLSocket#setHost(String) failed ", e); + + } catch (InvocationTargetException e) { + Log_OC.e(TAG, "Call to SSLSocket#setHost(String) failed ", e); + } + } else { + Log_OC.i(TAG, "SNI not supported"); + } + } + + /** + * Gets the method to invoke trying to minimize the effective + * application of reflection. + * + * @param sslSocket Instance of the SSL socket to use in connection with server. + * @return Method to call to indicate the server name of interest to the server. + */ + private static Method getMethod(SSLSocket sslSocket) { + final Class sslSocketClass = sslSocket.getClass(); + final ServerNameIndicator instance = mSingleInstance.get(); + if (instance == null) { + return initFrom(sslSocketClass); + + } else if (instance.mSSLSocketClassRef.get() != sslSocketClass) { + // the underlying class changed + return initFrom(sslSocketClass); + + } else if (instance.mSetHostnameMethodRef == null) { + // SNI not supported + return null; + + } else { + final Method cachedSetHostnameMethod = instance.mSetHostnameMethodRef.get(); + return (cachedSetHostnameMethod == null) ? initFrom(sslSocketClass) : cachedSetHostnameMethod; + } + } + + /** + * Singleton initializer. + *

+ * 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}. + * @return Method to call to indicate the server name of interest to the server. + */ + private static Method initFrom(Class sslSocketClass) { + Log_OC.i(TAG, "SSLSocket implementation: " + sslSocketClass.getCanonicalName()); + Method setHostnameMethod = null; + try { + setHostnameMethod = sslSocketClass.getMethod(METHOD_NAME, String.class); + } catch (SecurityException e) { + Log_OC.e(TAG, "Could not access to SSLSocket#setHostname(String) method ", e); + + } catch (NoSuchMethodException e) { + Log_OC.i(TAG, "Could not find SSLSocket#setHostname(String) method - SNI not supported"); + } + mSingleInstance.set(new ServerNameIndicator(sslSocketClass, setHostnameMethod)); + return setHostnameMethod; + } + +} diff --git a/src/com/owncloud/android/lib/common/network/WebdavUtils.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/WebdavUtils.java similarity index 75% rename from src/com/owncloud/android/lib/common/network/WebdavUtils.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/WebdavUtils.java index 25f002dc..45b7f35f 100644 --- a/src/com/owncloud/android/lib/common/network/WebdavUtils.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/WebdavUtils.java @@ -1,23 +1,23 @@ /* ownCloud Android Library is available under MIT license * Copyright (C) 2016 ownCloud GmbH. * Copyright (C) 2012 Bartek Przybylski - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -25,64 +25,64 @@ 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.SimpleDateFormat; import java.util.Date; import java.util.Locale; -import android.net.Uri; - -import com.owncloud.android.lib.common.http.methods.HttpBaseMethod; - public class WebdavUtils { public static final SimpleDateFormat DISPLAY_DATE_FORMAT = new SimpleDateFormat( "dd.MM.yyyy hh:mm"); - + private static final SimpleDateFormat DATETIME_FORMATS[] = { - new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US), - new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US), - new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.sss'Z'", Locale.US), - new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US), - new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US), - new SimpleDateFormat("EEEEEE, dd-MMM-yy HH:mm:ss zzz", Locale.US), - new SimpleDateFormat("EEE MMMM d HH:mm:ss yyyy", Locale.US), - new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.US) - }; + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US), + new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz", Locale.US), + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.sss'Z'", Locale.US), + new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.US), + new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US), + new SimpleDateFormat("EEEEEE, dd-MMM-yy HH:mm:ss zzz", Locale.US), + new SimpleDateFormat("EEE MMMM d HH:mm:ss yyyy", Locale.US), + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss", Locale.US) + }; public static Date parseResponseDate(String date) { Date returnDate = null; SimpleDateFormat format = null; for (int i = 0; i < DATETIME_FORMATS.length; ++i) { try { - format = DATETIME_FORMATS[i]; - synchronized(format) { - returnDate = format.parse(date); - } + format = DATETIME_FORMATS[i]; + synchronized (format) { + returnDate = format.parse(date); + } return returnDate; } catch (ParseException e) { - // this is not the format + // this is not the format } } return null; } /** - * Encodes a path according to URI RFC 2396. - * + * Encodes a path according to URI RFC 2396. + *

* If the received path doesn't start with "/", the method adds it. - * - * @param remoteFilePath Path - * @return Encoded path according to RFC 2396, always starting with "/" + * + * @param remoteFilePath Path + * @return Encoded path according to RFC 2396, always starting with "/" */ public static String encodePath(String remoteFilePath) { String encodedPath = Uri.encode(remoteFilePath, "/"); - if (!encodedPath.startsWith("/")) + if (!encodedPath.startsWith("/")) { encodedPath = "/" + encodedPath; + } return encodedPath; } /** - * * @param rawEtag * @return */ @@ -100,7 +100,6 @@ public class WebdavUtils { } /** - * * @param httpBaseMethod from which to get the etag * @return etag from response */ diff --git a/src/com/owncloud/android/lib/common/network/WriteTimeoutEnforcer.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/WriteTimeoutEnforcer.java similarity index 79% rename from src/com/owncloud/android/lib/common/network/WriteTimeoutEnforcer.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/WriteTimeoutEnforcer.java index 665a07e3..19b4a797 100644 --- a/src/com/owncloud/android/lib/common/network/WriteTimeoutEnforcer.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/network/WriteTimeoutEnforcer.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license * Copyright (C) 2017 ownCloud GmbH. - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -32,18 +32,17 @@ import java.lang.reflect.Method; import java.net.Socket; import java.util.concurrent.atomic.AtomicReference; - /** * Enforces, if possible, a write timeout for a socket. - * + *

* Built as a singleton. - * + *

* Tries to hit something like this: * https://android.googlesource.com/platform/external/conscrypt/+/lollipop-release/src/main/java/org/conscrypt/OpenSSLSocketImpl.java#1005 - * + *

* Minimizes the chances of getting stalled in PUT/POST request if the network interface is lost while * writing the entity into the outwards sockect. - * + *

* It happens. See https://github.com/owncloud/android/issues/1684#issuecomment-295306015 * * @author David A. Velasco @@ -56,36 +55,33 @@ public class WriteTimeoutEnforcer { private static final String METHOD_NAME = "setSoWriteTimeout"; - private final WeakReference> mSocketClassRef; private final WeakReference mSetSoWriteTimeoutMethodRef; - /** * Private constructor, class is a singleton. * - * @param socketClass Underlying implementation class of {@link Socket} used to connect - * with the server. - * @param setSoWriteTimeoutMethod Name of the method to call to set a write timeout in the socket. + * @param socketClass Underlying implementation class of {@link Socket} used to connect + * with the server. + * @param setSoWriteTimeoutMethod Name of the method to call to set a write timeout in the socket. */ private WriteTimeoutEnforcer(Class socketClass, Method setSoWriteTimeoutMethod) { mSocketClassRef = new WeakReference>(socketClass); mSetSoWriteTimeoutMethodRef = - (setSoWriteTimeoutMethod == null) ? - null : - new WeakReference<>(setSoWriteTimeoutMethod) + (setSoWriteTimeoutMethod == null) ? + null : + new WeakReference<>(setSoWriteTimeoutMethod) ; } - /** * Calls the {@code #setSoWrite(int)} method of the underlying implementation * of {@link Socket} if exists. - + *

* Creates and initializes the single instance of the class when needed * - * @param writeTimeoutMilliseconds Write timeout to set, in milliseconds. - * @param socket Client socket to connect with the server. + * @param writeTimeoutMilliseconds Write timeout to set, in milliseconds. + * @param socket Client socket to connect with the server. */ public static void setSoWriteTimeout(int writeTimeoutMilliseconds, Socket socket) { final Method setSoWriteTimeoutMethod = getMethod(socket); @@ -93,9 +89,9 @@ public class WriteTimeoutEnforcer { try { setSoWriteTimeoutMethod.invoke(socket, writeTimeoutMilliseconds); Log_OC.i( - TAG, - "Write timeout set in socket, writeTimeoutMilliseconds: " - + writeTimeoutMilliseconds + TAG, + "Write timeout set in socket, writeTimeoutMilliseconds: " + + writeTimeoutMilliseconds ); } catch (IllegalArgumentException e) { @@ -112,13 +108,12 @@ public class WriteTimeoutEnforcer { } } - /** * Gets the method to invoke trying to minimize the cost of reflection reusing objects cached * in static members. * - * @param socket Instance of the socket to use in connection with server. - * @return Method to call to set a write timeout in the socket. + * @param socket Instance of the socket to use in connection with server. + * @return Method to call to set a write timeout in the socket. */ private static Method getMethod(Socket socket) { final Class socketClass = socket.getClass(); @@ -137,20 +132,19 @@ public class WriteTimeoutEnforcer { } else { final Method cachedSetSoWriteTimeoutMethod = instance.mSetSoWriteTimeoutMethodRef.get(); return (cachedSetSoWriteTimeoutMethod == null) ? - initFrom(socketClass) : - cachedSetSoWriteTimeoutMethod - ; + initFrom(socketClass) : + cachedSetSoWriteTimeoutMethod + ; } } - /** * Singleton initializer. - * + *

* 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}. - * @return Method to call to set a write timeout in the socket. + * @param socketClass Underlying class providing the implementation of {@link Socket}. + * @return Method to call to set a write timeout in the socket. */ private static Method initFrom(Class socketClass) { Log_OC.i(TAG, "Socket implementation: " + socketClass.getCanonicalName()); @@ -162,8 +156,8 @@ public class WriteTimeoutEnforcer { } catch (NoSuchMethodException e) { Log_OC.i( - TAG, - "Could not find (SocketImpl)#setSoWriteTimeout(int) method - write timeout not supported" + TAG, + "Could not find (SocketImpl)#setSoWriteTimeout(int) method - write timeout not supported" ); } mSingleInstance.set(new WriteTimeoutEnforcer(socketClass, setSoWriteTimeoutMethod)); diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/ErrorMessageParser.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/ErrorMessageParser.java new file mode 100644 index 00000000..87c4ddc8 --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/ErrorMessageParser.java @@ -0,0 +1,143 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2017 ownCloud GmbH. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ +package com.owncloud.android.lib.common.operations; + +import android.util.Xml; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlPullParserFactory; + +import java.io.IOException; +import java.io.InputStream; + +/** + * Parser for server exceptions + * + * @author davidgonzalez + */ +public class ErrorMessageParser { + // No namespaces + private static final String ns = null; + + // Nodes for XML Parser + private static final String NODE_ERROR = "d:error"; + private static final String NODE_MESSAGE = "s:message"; + + /** + * Parse exception response + * + * @param is + * @return errorMessage for an exception + * @throws XmlPullParserException + * @throws IOException + */ + public String parseXMLResponse(InputStream is) throws XmlPullParserException, + IOException { + String errorMessage = ""; + + try { + // XMLPullParser + XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); + factory.setNamespaceAware(true); + + XmlPullParser parser = Xml.newPullParser(); + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); + parser.setInput(is, null); + parser.nextTag(); + errorMessage = readError(parser); + + } finally { + is.close(); + } + return errorMessage; + } + + /** + * Parse OCS node + * + * @param parser + * @return reason for exception + * @throws XmlPullParserException + * @throws IOException + */ + private String readError(XmlPullParser parser) throws XmlPullParserException, IOException { + String errorMessage = ""; + parser.require(XmlPullParser.START_TAG, ns, NODE_ERROR); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String name = parser.getName(); + // read NODE_MESSAGE + if (name.equalsIgnoreCase(NODE_MESSAGE)) { + errorMessage = readText(parser); + } else { + skip(parser); + } + } + return errorMessage; + } + + /** + * Skip tags in parser procedure + * + * @param parser + * @throws XmlPullParserException + * @throws IOException + */ + private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { + if (parser.getEventType() != XmlPullParser.START_TAG) { + throw new IllegalStateException(); + } + int depth = 1; + while (depth != 0) { + switch (parser.next()) { + case XmlPullParser.END_TAG: + depth--; + break; + case XmlPullParser.START_TAG: + depth++; + break; + } + } + } + + /** + * Read the text from a node + * + * @param parser + * @return Text of the node + * @throws IOException + * @throws XmlPullParserException + */ + private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { + String result = ""; + if (parser.next() == XmlPullParser.TEXT) { + result = parser.getText(); + parser.nextTag(); + } + return result; + } +} \ No newline at end of file diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/InvalidCharacterExceptionParser.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/InvalidCharacterExceptionParser.java new file mode 100644 index 00000000..08586922 --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/InvalidCharacterExceptionParser.java @@ -0,0 +1,150 @@ + +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2016 ownCloud GmbH. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ +package com.owncloud.android.lib.common.operations; + +import android.util.Xml; + +import org.xmlpull.v1.XmlPullParser; +import org.xmlpull.v1.XmlPullParserException; +import org.xmlpull.v1.XmlPullParserFactory; + +import java.io.IOException; +import java.io.InputStream; + +/** + * Parser for Invalid Character server exception + * + * @author masensio + */ +public class InvalidCharacterExceptionParser { + + private static final String EXCEPTION_STRING = "OC\\Connector\\Sabre\\Exception\\InvalidPath"; + private static final String EXCEPTION_UPLOAD_STRING = "OCP\\Files\\InvalidPathException"; + + // No namespaces + private static final String ns = null; + + // Nodes for XML Parser + private static final String NODE_ERROR = "d:error"; + private static final String NODE_EXCEPTION = "s:exception"; + + /** + * Parse is as an Invalid Path Exception + * + * @param is + * @return if The exception is an Invalid Char Exception + * @throws XmlPullParserException + * @throws IOException + */ + public boolean parseXMLResponse(InputStream is) throws XmlPullParserException, + IOException { + boolean result = false; + + try { + // XMLPullParser + XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); + factory.setNamespaceAware(true); + + XmlPullParser parser = Xml.newPullParser(); + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); + parser.setInput(is, null); + parser.nextTag(); + result = readError(parser); + + } finally { + is.close(); + } + return result; + } + + /** + * Parse OCS node + * + * @param parser + * @return List of ShareRemoteFiles + * @throws XmlPullParserException + * @throws IOException + */ + private boolean readError(XmlPullParser parser) throws XmlPullParserException, IOException { + String exception = ""; + parser.require(XmlPullParser.START_TAG, ns, NODE_ERROR); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String name = parser.getName(); + // read NODE_EXCEPTION + if (name.equalsIgnoreCase(NODE_EXCEPTION)) { + exception = readText(parser); + } else { + skip(parser); + } + + } + return exception.equalsIgnoreCase(EXCEPTION_STRING) || + exception.equalsIgnoreCase(EXCEPTION_UPLOAD_STRING); + } + + /** + * Skip tags in parser procedure + * + * @param parser + * @throws XmlPullParserException + * @throws IOException + */ + private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { + if (parser.getEventType() != XmlPullParser.START_TAG) { + throw new IllegalStateException(); + } + int depth = 1; + while (depth != 0) { + switch (parser.next()) { + case XmlPullParser.END_TAG: + depth--; + break; + case XmlPullParser.START_TAG: + depth++; + break; + } + } + } + + /** + * Read the text from a node + * + * @param parser + * @return Text of the node + * @throws IOException + * @throws XmlPullParserException + */ + private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { + String result = ""; + if (parser.next() == XmlPullParser.TEXT) { + result = parser.getText(); + parser.nextTag(); + } + return result; + } +} diff --git a/src/com/owncloud/android/lib/common/operations/OnRemoteOperationListener.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/OnRemoteOperationListener.java similarity index 86% rename from src/com/owncloud/android/lib/common/operations/OnRemoteOperationListener.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/OnRemoteOperationListener.java index 495b8749..065b2df8 100644 --- a/src/com/owncloud/android/lib/common/operations/OnRemoteOperationListener.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/OnRemoteOperationListener.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license * Copyright (C) 2016 ownCloud GmbH. - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -24,9 +24,8 @@ package com.owncloud.android.lib.common.operations; - public interface OnRemoteOperationListener { - void onRemoteOperationFinish(RemoteOperation caller, RemoteOperationResult result); - + void onRemoteOperationFinish(RemoteOperation caller, RemoteOperationResult result); + } diff --git a/src/com/owncloud/android/lib/common/operations/OperationCancelledException.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/OperationCancelledException.java similarity index 92% rename from src/com/owncloud/android/lib/common/operations/OperationCancelledException.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/OperationCancelledException.java index c637618b..5ee915eb 100644 --- a/src/com/owncloud/android/lib/common/operations/OperationCancelledException.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/OperationCancelledException.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license * Copyright (C) 2016 ownCloud GmbH. - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * diff --git a/src/com/owncloud/android/lib/common/operations/RemoteOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/RemoteOperation.java similarity index 96% rename from src/com/owncloud/android/lib/common/operations/RemoteOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/RemoteOperation.java index 9c769aee..fc8fd3d4 100644 --- a/src/com/owncloud/android/lib/common/operations/RemoteOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/RemoteOperation.java @@ -12,25 +12,21 @@ import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; import com.owncloud.android.lib.common.accounts.AccountUtils; import com.owncloud.android.lib.common.utils.Log_OC; +import okhttp3.OkHttpClient; import java.io.IOException; -import okhttp3.OkHttpClient; - public abstract class RemoteOperation implements Runnable { - private static final String TAG = RemoteOperation.class.getSimpleName(); - /** * OCS API header name */ public static final String OCS_API_HEADER = "OCS-APIREQUEST"; - /** * OCS API header value */ 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 */ @@ -61,10 +57,9 @@ public abstract class RemoteOperation implements Runnable { */ protected Handler mListenerHandler = null; - /** * Asynchronously executes the remote operation - * + *

* This method should be used whenever an ownCloud account is available, * instead of {@link #execute(OwnCloudClient, OnRemoteOperationListener, Handler))}. * @@ -79,12 +74,14 @@ public abstract class RemoteOperation implements Runnable { public Thread execute(Account account, Context context, OnRemoteOperationListener listener, Handler listenerHandler) { - if (account == null) + if (account == null) { throw new IllegalArgumentException ("Trying to execute a remote operation with a NULL Account"); - if (context == null) + } + if (context == null) { throw new IllegalArgumentException ("Trying to execute a remote operation with a NULL Context"); + } // mAccount and mContext in the runnerThread to create below mAccount = account; mContext = context.getApplicationContext(); @@ -99,7 +96,6 @@ public abstract class RemoteOperation implements Runnable { return runnerThread; } - /** * Asynchronously executes the remote operation * @@ -168,9 +164,9 @@ public abstract class RemoteOperation implements Runnable { /** * Synchronously executes the remote operation on the received ownCloud account. - * + *

* Do not call this method from the main thread. - * + *

* This method should be used whenever an ownCloud account is available, instead of * {@link #execute(OwnCloudClient)}. * @@ -180,22 +176,23 @@ public abstract class RemoteOperation implements Runnable { * @return Result of the operation. */ public RemoteOperationResult execute(Account account, Context context) { - if (account == null) + if (account == null) { throw new IllegalArgumentException("Trying to execute a remote operation with a NULL " + "Account"); - if (context == null) + } + if (context == null) { throw new IllegalArgumentException("Trying to execute a remote operation with a NULL " + "Context"); + } mAccount = account; mContext = context.getApplicationContext(); return runOperation(); } - /** * Synchronously executes the remote operation - * + *

* Do not call this method from the main thread. * * @param client Client object to reach an ownCloud server during the execution of @@ -203,9 +200,10 @@ public abstract class RemoteOperation implements Runnable { * @return Result of the operation. */ public RemoteOperationResult execute(OwnCloudClient client) { - if (client == null) + if (client == null) { throw new IllegalArgumentException("Trying to execute a remote operation with a NULL " + "OwnCloudClient"); + } mClient = client; if (client.getAccount() != null) { mAccount = client.getAccount().getSavedAccount(); @@ -217,7 +215,7 @@ public abstract class RemoteOperation implements Runnable { /** * Synchronously executes the remote operation - * + *

* Do not call this method from the main thread. * * @param client Client object to reach an ownCloud server during the execution of @@ -225,9 +223,10 @@ public abstract class RemoteOperation implements Runnable { * @return Result of the operation. */ public RemoteOperationResult execute(OkHttpClient client, Context context) { - if (client == null) + if (client == null) { throw new IllegalArgumentException("Trying to execute a remote operation with a NULL " + "OwnCloudClient"); + } mHttpClient = client; mContext = context; @@ -236,12 +235,12 @@ public abstract class RemoteOperation implements Runnable { /** * Run operation for asynchronous or synchronous 'onExecute' method. - * + *

* Considers and performs silent refresh of account credentials if possible, and if * {@link RemoteOperation#setSilentRefreshOfAccountCredentials(boolean)} was called with * parameter 'true' before the execution. * - * @return Remote operation result + * @return Remote operation result */ private RemoteOperationResult runOperation() { diff --git a/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/RemoteOperationResult.java similarity index 97% rename from src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/RemoteOperationResult.java index 5d73f181..18d417fc 100644 --- a/src/com/owncloud/android/lib/common/operations/RemoteOperationResult.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/operations/RemoteOperationResult.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -27,14 +27,18 @@ package com.owncloud.android.lib.common.operations; import android.accounts.Account; 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.http.HttpConstants; import com.owncloud.android.lib.common.http.methods.HttpBaseMethod; import com.owncloud.android.lib.common.network.CertificateCombinedException; import com.owncloud.android.lib.common.utils.Log_OC; - +import okhttp3.Headers; import org.json.JSONException; +import javax.net.ssl.SSLException; +import javax.net.ssl.SSLPeerUnverifiedException; import java.io.ByteArrayInputStream; import java.io.FileNotFoundException; import java.io.IOException; @@ -48,13 +52,6 @@ import java.util.ArrayList; import java.util.List; 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 implements Serializable { @@ -64,61 +61,6 @@ public class RemoteOperationResult private static final long serialVersionUID = 4968939884332372230L; 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 int mHttpCode = -1; private String mHttpPhrase = null; @@ -128,10 +70,9 @@ public class RemoteOperationResult private ArrayList mAuthenticate = new ArrayList<>(); private String mLastPermanentLocation = null; private T mData = null; - /** * Public constructor from result code. - * + *

* 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. @@ -146,6 +87,7 @@ public class RemoteOperationResult /** * Create a new RemoteOperationResult based on the result given by a previous one. * It does not copy the data. + * * @param prevRemoteOperation */ public RemoteOperationResult(RemoteOperationResult prevRemoteOperation) { @@ -161,9 +103,9 @@ public class RemoteOperationResult /** * Public constructor from exception. - * + *

* To be used when an exception prevented the end of the {@link RemoteOperation}. - * + *

* Determines a {@link ResultCode} depending on the type of the exception. * * @param e Exception that interrupted the {@link RemoteOperation} @@ -193,7 +135,7 @@ public class RemoteOperationResult mCode = ResultCode.ACCOUNT_EXCEPTION; } else if (e instanceof SSLException || e instanceof RuntimeException) { - if(e instanceof SSLPeerUnverifiedException) { + if (e instanceof SSLPeerUnverifiedException) { mCode = ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED; } else { CertificateCombinedException se = getCertificateCombinedException(e); @@ -220,9 +162,9 @@ public class RemoteOperationResult /** * Public constructor from separate elements of an HTTP or DAV response. - * + *

* To be used when the result needs to be interpreted from the response of an HTTP/DAV method. - * + *

* 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 * response body @@ -285,44 +227,18 @@ public class RemoteOperationResult } } - /** - * 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. - * + *

* 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). - * - * + *

+ *

* 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 httpPhrase HTTP status line phrase returned by an HTTP/DAV method - * @param headers HTTP response header returned by an HTTP/DAV method + * @param httpCode HTTP status code returned by an HTTP/DAV method. + * @param httpPhrase HTTP status line phrase returned by an HTTP/DAV method + * @param headers HTTP response header returned by an HTTP/DAV method */ public RemoteOperationResult(int httpCode, String httpPhrase, Headers headers) { this(httpCode, httpPhrase); @@ -345,7 +261,7 @@ public class RemoteOperationResult /** * Private constructor for results built interpreting a HTTP or DAV response. - * + *

* Determines a {@link ResultCode} depending of the type of the exception. * * @param httpCode HTTP status code returned by the HTTP/DAV method. @@ -389,11 +305,40 @@ public class RemoteOperationResult } } + /** + * 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() { return mSuccess; } + public void setSuccess(boolean success) { + this.mSuccess = success; + } + public boolean isCancelled() { return mCode == ResultCode.CANCELLED; } @@ -459,10 +404,11 @@ public class RemoteOperationResult return "Unknown host exception"; } else if (mException instanceof CertificateCombinedException) { - if (((CertificateCombinedException) mException).isRecoverable()) + if (((CertificateCombinedException) mException).isRecoverable()) { return "SSL recoverable exception"; - else + } else { return "SSL exception"; + } } else if (mException instanceof SSLException) { return "SSL exception"; @@ -572,15 +518,65 @@ public class RemoteOperationResult mLastPermanentLocation = lastPermanentLocation; } - public void setSuccess(boolean success) { - this.mSuccess = success; + public T getData() { + return mData; } public void setData(T data) { mData = data; } - public T getData() { - return mData; + 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 } } \ No newline at end of file diff --git a/src/com/owncloud/android/lib/common/utils/Log_OC.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/utils/Log_OC.java similarity index 76% rename from src/com/owncloud/android/lib/common/utils/Log_OC.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/utils/Log_OC.java index ca30f1d8..bdfc2645 100644 --- a/src/com/owncloud/android/lib/common/utils/Log_OC.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/common/utils/Log_OC.java @@ -8,6 +8,7 @@ import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; +import java.util.Locale; public class Log_OC { private static final String SIMPLE_DATE_FORMAT = "yyyy/MM/dd HH:mm:ss"; @@ -25,50 +26,53 @@ public class Log_OC { private static boolean isMaxFileSizeReached = false; private static boolean isEnabled = false; - public static void setLogDataFolder(String logFolder){ - mOwncloudDataFolderLog = logFolder; + public static void setLogDataFolder(String logFolder) { + mOwncloudDataFolderLog = logFolder; } - public static void i(String TAG, String message){ + public static void i(String TAG, String message) { Log.i(TAG, message); - appendLog(TAG+" : "+ message); + appendLog(TAG + " : " + message); } - public static void d(String TAG, String message){ + public static void d(String TAG, String message) { Log.d(TAG, message); appendLog(TAG + " : " + message); } + public static void d(String TAG, String message, Exception e) { Log.d(TAG, message, e); - appendLog(TAG + " : " + message + " Exception : "+ e.getStackTrace()); + appendLog(TAG + " : " + message + " Exception : " + e.getStackTrace()); } - public static void e(String TAG, String message){ + + public static void e(String TAG, String message) { Log.e(TAG, message); appendLog(TAG + " : " + message); } - + public static void e(String TAG, String message, Throwable e) { Log.e(TAG, message, e); - appendLog(TAG+" : " + message +" Exception : " + e.getStackTrace()); + appendLog(TAG + " : " + message + " Exception : " + e.getStackTrace()); } - - public static void v(String TAG, String message){ + + public static void v(String TAG, String message) { Log.v(TAG, message); - appendLog(TAG+" : "+ message); + appendLog(TAG + " : " + message); } - + public static void w(String TAG, String message) { Log.w(TAG, message); - appendLog(TAG+" : "+ message); + appendLog(TAG + " : " + message); } /** * Start doing logging + * * @param storagePath : directory for keeping logs */ synchronized public static void startLogging(String storagePath) { - String logPath = storagePath + File.separator + - mOwncloudDataFolderLog + File.separator + LOG_FOLDER_NAME; + String logPath = storagePath + File.separator + + mOwncloudDataFolderLog + File.separator + LOG_FOLDER_NAME; mFolder = new File(logPath); mLogFile = new File(mFolder + File.separator + mLogFileNames[0]); @@ -80,7 +84,7 @@ public class Log_OC { Log.d("LOG_OC", "Log file created"); } - try { + try { // Create the current log file if does not exist mLogFile.createNewFile(); @@ -94,10 +98,10 @@ public class Log_OC { } catch (IOException e) { e.printStackTrace(); } finally { - if(mBuf != null) { + if (mBuf != null) { try { mBuf.close(); - } catch(IOException e) { + } catch (IOException e) { e.printStackTrace(); } } @@ -106,15 +110,15 @@ public class Log_OC { synchronized public static void stopLogging() { try { - if (mBuf != null) + if (mBuf != null) { mBuf.close(); + } isEnabled = false; mLogFile = null; mFolder = null; mBuf = null; isMaxFileSizeReached = false; - isEnabled = false; } catch (IOException e) { // Because we are stopping logging, we only log to Android console. @@ -132,15 +136,15 @@ public class Log_OC { */ public static void deleteHistoryLogging() { File folderLogs = new File(mFolder + File.separator); - if(folderLogs.isDirectory()){ + if (folderLogs.isDirectory()) { String[] myFiles = folderLogs.list(); - for (int i=0; i * Allows renaming the moving file/folder at the same time. * * @author David A. Velasco @@ -112,14 +112,13 @@ public class CopyRemoteFileOperation extends RemoteOperation { final int status = client.executeHttpMethod(copyMethod); - if(status == HttpConstants.HTTP_CREATED || status == HttpConstants.HTTP_NO_CONTENT) { + if (status == HttpConstants.HTTP_CREATED || status == HttpConstants.HTTP_NO_CONTENT) { result = new RemoteOperationResult<>(ResultCode.OK); } else if (status == HttpConstants.HTTP_PRECONDITION_FAILED && !mOverwrite) { result = new RemoteOperationResult<>(ResultCode.INVALID_OVERWRITE); client.exhaustResponse(copyMethod.getResponseBodyAsStream()); - /// for other errors that could be explicitly handled, check first: /// http://www.webdav.org/specs/rfc4918.html#rfc.section.9.9.4 diff --git a/src/com/owncloud/android/lib/resources/files/CreateRemoteFolderOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CreateRemoteFolderOperation.java similarity index 94% rename from src/com/owncloud/android/lib/resources/files/CreateRemoteFolderOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CreateRemoteFolderOperation.java index 6eb7947d..04a1c4bb 100644 --- a/src/com/owncloud/android/lib/resources/files/CreateRemoteFolderOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/CreateRemoteFolderOperation.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license * Copyright (C) 2016 ownCloud GmbH. - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -24,23 +24,21 @@ package com.owncloud.android.lib.resources.files; - import android.net.Uri; import com.owncloud.android.lib.common.OwnCloudClient; import com.owncloud.android.lib.common.http.HttpConstants; import com.owncloud.android.lib.common.http.methods.webdav.MkColMethod; 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.RemoteOperationResult; +import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; import com.owncloud.android.lib.common.utils.Log_OC; import com.owncloud.android.lib.resources.status.OwnCloudVersion; import java.net.URL; import java.util.concurrent.TimeUnit; - /** * Remote operation performing the creation of a new folder in the ownCloud server. * @@ -60,6 +58,7 @@ public class CreateRemoteFolderOperation extends RemoteOperation { /** * Constructor + * * @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. */ @@ -79,12 +78,12 @@ public class CreateRemoteFolderOperation extends RemoteOperation { RemoteOperationResult result; OwnCloudVersion version = client.getOwnCloudVersion(); boolean versionWithForbiddenChars = - (version != null && version.isVersionWithForbiddenCharacters()); + (version != null && version.isVersionWithForbiddenCharacters()); boolean noInvalidChars = FileUtils.isValidPath(mRemotePath, versionWithForbiddenChars); if (noInvalidChars) { result = createFolder(client); if (!result.isSuccess() && mCreateFullPath && - RemoteOperationResult.ResultCode.CONFLICT == result.getCode()) { + RemoteOperationResult.ResultCode.CONFLICT == result.getCode()) { result = createParentFolder(FileUtils.getParentPath(mRemotePath), client); if (result.isSuccess()) { result = createFolder(client); // second (and last) try diff --git a/src/com/owncloud/android/lib/resources/files/DownloadRemoteFileOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/DownloadRemoteFileOperation.java similarity index 92% rename from src/com/owncloud/android/lib/resources/files/DownloadRemoteFileOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/DownloadRemoteFileOperation.java index b9f35633..16699e3b 100644 --- a/src/com/owncloud/android/lib/resources/files/DownloadRemoteFileOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/DownloadRemoteFileOperation.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license * Copyright (C) 2016 ownCloud GmbH. - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -56,9 +56,8 @@ public class DownloadRemoteFileOperation extends RemoteOperation { private static final String TAG = DownloadRemoteFileOperation.class.getSimpleName(); private static final int FORBIDDEN_ERROR = 403; private static final int SERVICE_UNAVAILABLE_ERROR = 503; - - private Set mDataTransferListeners = new HashSet<>(); private final AtomicBoolean mCancellationRequested = new AtomicBoolean(false); + private Set mDataTransferListeners = new HashSet<>(); private long mModificationTimestamp = 0; private String mEtag = ""; private GetMethod mGet; @@ -83,18 +82,17 @@ public class DownloadRemoteFileOperation extends RemoteOperation { tmpFile.getParentFile().mkdirs(); result = downloadFile(client, tmpFile); Log_OC.i(TAG, "Download of " + mRemotePath + " to " + getTmpPath() + ": " + - result.getLogMessage()); + result.getLogMessage()); } catch (Exception e) { result = new RemoteOperationResult<>(e); Log_OC.e(TAG, "Download of " + mRemotePath + " to " + getTmpPath() + ": " + - result.getLogMessage(), e); + result.getLogMessage(), e); } return result; } - private RemoteOperationResult downloadFile(OwnCloudClient client, File targetFile) throws Exception { @@ -118,8 +116,8 @@ public class DownloadRemoteFileOperation extends RemoteOperation { long totalToTransfer = (contentLength != null && contentLength.length() > 0) - ? Long.parseLong(contentLength) - : 0; + ? Long.parseLong(contentLength) + : 0; byte[] bytes = new byte[4096]; int readResult; @@ -136,7 +134,7 @@ public class DownloadRemoteFileOperation extends RemoteOperation { it = mDataTransferListeners.iterator(); while (it.hasNext()) { it.next().onTransferProgress(readResult, transferred, totalToTransfer, - targetFile.getName()); + targetFile.getName()); } } } @@ -144,8 +142,8 @@ public class DownloadRemoteFileOperation extends RemoteOperation { savedFile = true; final String modificationTime = mGet.getResponseHeaders().get("Last-Modified") != null - ? mGet.getResponseHeaders().get("Last-Modified") - : mGet.getResponseHeader("last-modified"); + ? mGet.getResponseHeaders().get("Last-Modified") + : mGet.getResponseHeader("last-modified"); if (modificationTime != null) { final Date d = WebdavUtils.parseResponseDate(modificationTime); @@ -177,8 +175,12 @@ public class DownloadRemoteFileOperation extends RemoteOperation { ? new RemoteOperationResult<>(RemoteOperationResult.ResultCode.OK) : new RemoteOperationResult<>(mGet); } finally { - if (fos != null) fos.close(); - if (bis != null) bis.close(); + if (fos != null) { + fos.close(); + } + if (bis != null) { + bis.close(); + } if (!savedFile && targetFile.exists()) { targetFile.delete(); } diff --git a/src/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java similarity index 99% rename from src/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java index 71d8060b..4bb2e760 100644 --- a/src/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ExistenceCheckRemoteOperation.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/FileUtils.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/FileUtils.java new file mode 100644 index 00000000..f0165505 --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/FileUtils.java @@ -0,0 +1,85 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2019 ownCloud GmbH. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package com.owncloud.android.lib.resources.files; + +import com.owncloud.android.lib.common.utils.Log_OC; + +import java.io.File; + +public class FileUtils { + + public static final String PATH_SEPARATOR = "/"; + public static final String FINAL_CHUNKS_FILE = ".file"; + private static final String TAG = FileUtils.class.getSimpleName(); + + public static String getParentPath(String remotePath) { + String parentPath = new File(remotePath).getParent(); + parentPath = parentPath.endsWith(PATH_SEPARATOR) ? parentPath : parentPath + PATH_SEPARATOR; + return parentPath; + } + + /** + * Validate the fileName to detect if contains any forbidden character: / , \ , < , > , + * : , " , | , ? , * + * + * @param fileName + * @param versionSupportsForbiddenChars + * @return + */ + public static boolean isValidName(String fileName, boolean versionSupportsForbiddenChars) { + boolean result = true; + + Log_OC.d(TAG, "fileName =======" + fileName); + if ((versionSupportsForbiddenChars && fileName.contains(PATH_SEPARATOR)) || + (!versionSupportsForbiddenChars && (fileName.contains(PATH_SEPARATOR) || + fileName.contains("\\") || fileName.contains("<") || fileName.contains(">") || + fileName.contains(":") || fileName.contains("\"") || fileName.contains("|") || + fileName.contains("?") || fileName.contains("*")))) { + + result = false; + } + return result; + } + + /** + * Validate the path to detect if contains any forbidden character: \ , < , > , : , " , | , + * ? , * + * + * @param path + * @return + */ + public static boolean isValidPath(String path, boolean versionSupportsForbidenChars) { + boolean result = true; + + Log_OC.d(TAG, "path ....... " + path); + if (!versionSupportsForbidenChars && + (path.contains("\\") || path.contains("<") || path.contains(">") || + path.contains(":") || path.contains("\"") || path.contains("|") || + path.contains("?") || path.contains("*"))) { + result = false; + } + return result; + } +} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/resources/files/MoveRemoteFileOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/MoveRemoteFileOperation.java similarity index 93% rename from src/com/owncloud/android/lib/resources/files/MoveRemoteFileOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/MoveRemoteFileOperation.java index f2cda2fa..2bebe540 100644 --- a/src/com/owncloud/android/lib/resources/files/MoveRemoteFileOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/MoveRemoteFileOperation.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. - * + * Copyright (C) 2019 ownCloud GmbH. + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -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.methods.webdav.MoveMethod; 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.RemoteOperationResult; +import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; import com.owncloud.android.lib.resources.status.OwnCloudVersion; 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 * in the same account. - * + *

* Allows renaming the moving file/folder at the same time. * * @author David A. Velasco @@ -65,7 +65,7 @@ public class MoveRemoteFileOperation extends RemoteOperation { /** * Constructor. - * + *

* TODO Paths should finish in "/" in the case of folders. ? * * @param srcRemotePath Remote path of the file/folder to move. @@ -90,7 +90,7 @@ public class MoveRemoteFileOperation extends RemoteOperation { OwnCloudVersion version = client.getOwnCloudVersion(); boolean versionWithForbiddenChars = - (version != null && version.isVersionWithForbiddenCharacters()); + (version != null && version.isVersionWithForbiddenCharacters()); /// check parameters if (!FileUtils.isValidPath(mTargetRemotePath, versionWithForbiddenChars)) { @@ -115,7 +115,7 @@ public class MoveRemoteFileOperation extends RemoteOperation { final MoveMethod move = new MoveMethod( new URL(srcWebDavUri + WebdavUtils.encodePath(mSrcRemotePath)), - client.getUserFilesWebDavUri() + WebdavUtils.encodePath(mTargetRemotePath), + client.getUserFilesWebDavUri() + WebdavUtils.encodePath(mTargetRemotePath), mOverwrite); if (moveChunkedFile) { @@ -128,7 +128,7 @@ public class MoveRemoteFileOperation extends RemoteOperation { final int status = client.executeHttpMethod(move); /// process response - if(isSuccess(status)) { + if (isSuccess(status)) { result = new RemoteOperationResult<>(ResultCode.OK); } else if (status == HttpConstants.HTTP_PRECONDITION_FAILED && !mOverwrite) { @@ -144,12 +144,12 @@ public class MoveRemoteFileOperation extends RemoteOperation { } Log.i(TAG, "Move " + mSrcRemotePath + " to " + mTargetRemotePath + ": " + - result.getLogMessage()); + result.getLogMessage()); } catch (Exception e) { result = new RemoteOperationResult<>(e); Log.e(TAG, "Move " + mSrcRemotePath + " to " + mTargetRemotePath + ": " + - result.getLogMessage(), e); + result.getLogMessage(), e); } return result; diff --git a/src/com/owncloud/android/lib/resources/files/ReadRemoteFileOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFileOperation.java similarity index 96% rename from src/com/owncloud/android/lib/resources/files/ReadRemoteFileOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFileOperation.java index f8476def..d3dfcb83 100644 --- a/src/com/owncloud/android/lib/resources/files/ReadRemoteFileOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFileOperation.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license * Copyright (C) 2016 ownCloud GmbH. - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -102,7 +102,7 @@ public class ReadRemoteFileOperation extends RemoteOperation { result = new RemoteOperationResult<>(e); e.printStackTrace(); Log_OC.e(TAG, "Synchronizing file " + mRemotePath + ": " + result.getLogMessage(), - result.getException()); + result.getException()); } return result; diff --git a/src/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.java similarity index 97% rename from src/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.java index 8136a7a3..3aee5d40 100644 --- a/src/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/ReadRemoteFolderOperation.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,6 +24,7 @@ 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.accounts.AccountUtils; 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.util.ArrayList; -import at.bitfire.dav4android.Response; - import static com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK; /** @@ -103,7 +102,7 @@ public class ReadRemoteFolderOperation extends RemoteOperation (propfindMethod); + result = new RemoteOperationResult<>(propfindMethod); } } catch (Exception e) { diff --git a/src/com/owncloud/android/lib/resources/files/RemoteFile.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RemoteFile.java similarity index 90% rename from src/com/owncloud/android/lib/resources/files/RemoteFile.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RemoteFile.java index 4be62b80..e8892e6e 100644 --- a/src/com/owncloud/android/lib/resources/files/RemoteFile.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RemoteFile.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. - * + * Copyright (C) 2019 ownCloud GmbH. + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -28,10 +28,6 @@ import android.net.Uri; import android.os.Parcel; 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.Response; 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 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; /** @@ -58,11 +58,24 @@ import static com.owncloud.android.lib.common.OwnCloudClient.WEBDAV_FILES_PATH_4 public class RemoteFile implements Parcelable, Serializable { + /** + * Parcelable Methods + */ + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + @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!! */ private static final long serialVersionUID = -8965995357413958539L; - private String mRemotePath; private String mMimeType; private long mLength; @@ -76,6 +89,100 @@ public class RemoteFile implements Parcelable, Serializable { private BigDecimal mQuotaAvailableBytes; private String mPrivateLink; + 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 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 + *

+ * 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 */ @@ -168,80 +275,6 @@ public class RemoteFile implements Parcelable, Serializable { 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 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 */ @@ -260,31 +293,6 @@ public class RemoteFile implements Parcelable, Serializable { mPrivateLink = null; } - /** - * Parcelable Methods - */ - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - @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) { mRemotePath = source.readString(); mMimeType = source.readString(); diff --git a/src/com/owncloud/android/lib/resources/files/RemoveRemoteFileOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RemoveRemoteFileOperation.java similarity index 95% rename from src/com/owncloud/android/lib/resources/files/RemoveRemoteFileOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RemoveRemoteFileOperation.java index 9ccfa778..20ba44ca 100644 --- a/src/com/owncloud/android/lib/resources/files/RemoveRemoteFileOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RemoveRemoteFileOperation.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. - * + * Copyright (C) 2019 ownCloud GmbH. + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * diff --git a/src/com/owncloud/android/lib/resources/files/RenameRemoteFileOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RenameRemoteFileOperation.java similarity index 92% rename from src/com/owncloud/android/lib/resources/files/RenameRemoteFileOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RenameRemoteFileOperation.java index d5d7c13a..56f137ff 100644 --- a/src/com/owncloud/android/lib/resources/files/RenameRemoteFileOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/RenameRemoteFileOperation.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license * Copyright (C) 2016 ownCloud GmbH. - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -24,20 +24,19 @@ 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.http.HttpConstants; import com.owncloud.android.lib.common.http.methods.webdav.MoveMethod; 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.RemoteOperationResult; +import com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode; import com.owncloud.android.lib.common.utils.Log_OC; 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. @@ -73,7 +72,7 @@ public class RenameRemoteFileOperation extends RemoteOperation { String parent = (new File(mOldRemotePath)).getParent(); parent = (parent.endsWith(FileUtils.PATH_SEPARATOR)) ? parent : parent + - FileUtils.PATH_SEPARATOR; + FileUtils.PATH_SEPARATOR; mNewRemotePath = parent + mNewName; if (isFolder) { mNewRemotePath += FileUtils.PATH_SEPARATOR; @@ -90,10 +89,11 @@ public class RenameRemoteFileOperation extends RemoteOperation { final OwnCloudVersion version = client.getOwnCloudVersion(); 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); + } try { if (mNewName.equals(mOldName)) { @@ -134,11 +134,11 @@ public class RenameRemoteFileOperation extends RemoteOperation { /** * Checks if a file with the new name already exists. * - * @return 'True' if the target path is already used by an existing file. + * @return 'True' if the target path is already used by an existing file. */ private boolean targetPathIsUsed(OwnCloudClient client) { ExistenceCheckRemoteOperation existenceCheckRemoteOperation = - new ExistenceCheckRemoteOperation(mNewRemotePath, false, false); + new ExistenceCheckRemoteOperation(mNewRemotePath, false, false); RemoteOperationResult exists = existenceCheckRemoteOperation.run(client); return exists.isSuccess(); } diff --git a/src/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java similarity index 96% rename from src/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java index 4f6bae81..46738f8b 100644 --- a/src/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/UploadRemoteFileOperation.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. - * + * Copyright (C) 2019 ownCloud GmbH. + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -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.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; +import okhttp3.MediaType; import java.io.File; import java.net.URL; @@ -41,13 +42,11 @@ import java.util.HashSet; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; -import okhttp3.MediaType; - import static com.owncloud.android.lib.common.operations.RemoteOperationResult.ResultCode.OK; /** * Remote operation performing the upload of a remote file to the ownCloud server. - * + * * @author David A. Velasco * @author masensio * @author David González Verdugo @@ -56,15 +55,13 @@ import static com.owncloud.android.lib.common.operations.RemoteOperationResult.R public class UploadRemoteFileOperation extends RemoteOperation { private static final String TAG = UploadRemoteFileOperation.class.getSimpleName(); - + protected final AtomicBoolean mCancellationRequested = new AtomicBoolean(false); protected String mLocalPath; protected String mRemotePath; protected String mMimeType; protected String mFileLastModifTimestamp; protected PutMethod mPutMethod = null; protected String mRequiredEtag = null; - - protected final AtomicBoolean mCancellationRequested = new AtomicBoolean(false); protected Set mDataTransferListeners = new HashSet(); protected FileRequestBody mFileRequestBody = null; @@ -153,8 +150,8 @@ public class UploadRemoteFileOperation extends RemoteOperation { public Set getDataTransferListeners() { return mDataTransferListeners; } - - public void addDatatransferProgressListener (OnDatatransferProgressListener listener) { + + public void addDatatransferProgressListener(OnDatatransferProgressListener listener) { synchronized (mDataTransferListeners) { mDataTransferListeners.add(listener); } @@ -162,7 +159,7 @@ public class UploadRemoteFileOperation extends RemoteOperation { mFileRequestBody.addDatatransferProgressListener(listener); } } - + public void removeDatatransferProgressListener(OnDatatransferProgressListener listener) { synchronized (mDataTransferListeners) { mDataTransferListeners.remove(listener); @@ -171,12 +168,13 @@ public class UploadRemoteFileOperation extends RemoteOperation { mFileRequestBody.removeDatatransferProgressListener(listener); } } - + public void cancel() { synchronized (mCancellationRequested) { mCancellationRequested.set(true); - if (mPutMethod != null) + if (mPutMethod != null) { mPutMethod.abort(); + } } } diff --git a/src/com/owncloud/android/lib/resources/files/chunks/ChunkedUploadRemoteFileOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/chunks/ChunkedUploadRemoteFileOperation.java similarity index 96% rename from src/com/owncloud/android/lib/resources/files/chunks/ChunkedUploadRemoteFileOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/chunks/ChunkedUploadRemoteFileOperation.java index 0b6239c9..2282767c 100644 --- a/src/com/owncloud/android/lib/resources/files/chunks/ChunkedUploadRemoteFileOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/chunks/ChunkedUploadRemoteFileOperation.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. - * + * Copyright (C) 2019 ownCloud GmbH. + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -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.resources.files.FileUtils; import com.owncloud.android.lib.resources.files.UploadRemoteFileOperation; +import okhttp3.MediaType; import java.io.File; import java.io.RandomAccessFile; @@ -39,8 +40,6 @@ import java.net.URL; import java.nio.channels.FileChannel; 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.operations.RemoteOperationResult.ResultCode.OK; @@ -52,8 +51,8 @@ import static com.owncloud.android.lib.common.operations.RemoteOperationResult.R */ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation { - private static final int LAST_CHUNK_TIMEOUT = 900000; //15 mins. 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 String mTransferId; @@ -127,11 +126,13 @@ public class ChunkedUploadRemoteFileOperation extends UploadRemoteFileOperation } } - if (channel != null) + if (channel != null) { channel.close(); + } - if (raf != null) + if (raf != null) { raf.close(); + } return result; } diff --git a/src/com/owncloud/android/lib/resources/files/chunks/CreateRemoteChunkFolderOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/chunks/CreateRemoteChunkFolderOperation.java similarity index 88% rename from src/com/owncloud/android/lib/resources/files/chunks/CreateRemoteChunkFolderOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/chunks/CreateRemoteChunkFolderOperation.java index 2fc9d4bf..2c9557e1 100644 --- a/src/com/owncloud/android/lib/resources/files/chunks/CreateRemoteChunkFolderOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/chunks/CreateRemoteChunkFolderOperation.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -35,8 +35,8 @@ public class CreateRemoteChunkFolderOperation extends CreateRemoteFolderOperatio /** * Constructor * - * @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 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. */ public CreateRemoteChunkFolderOperation(String remotePath, boolean createFullPath) { super(remotePath, createFullPath); diff --git a/src/com/owncloud/android/lib/resources/files/chunks/MoveRemoteChunksFileOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/chunks/MoveRemoteChunksFileOperation.java similarity index 98% rename from src/com/owncloud/android/lib/resources/files/chunks/MoveRemoteChunksFileOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/chunks/MoveRemoteChunksFileOperation.java index 5c84609a..c60ec12f 100644 --- a/src/com/owncloud/android/lib/resources/files/chunks/MoveRemoteChunksFileOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/chunks/MoveRemoteChunksFileOperation.java @@ -1,5 +1,5 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/com/owncloud/android/lib/resources/files/chunks/RemoveRemoteChunksFolderOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/chunks/RemoveRemoteChunksFolderOperation.java similarity index 97% rename from src/com/owncloud/android/lib/resources/files/chunks/RemoveRemoteChunksFolderOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/chunks/RemoveRemoteChunksFolderOperation.java index 48602313..e515cd04 100644 --- a/src/com/owncloud/android/lib/resources/files/chunks/RemoveRemoteChunksFolderOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/files/chunks/RemoveRemoteChunksFolderOperation.java @@ -1,6 +1,6 @@ /* ownCloud Android Library is available under MIT license * @author David González Verdugo - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal diff --git a/src/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java similarity index 98% rename from src/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java index 9b40b4e2..631af0ee 100644 --- a/src/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/CreateRemoteShareOperation.java @@ -2,7 +2,7 @@ * @author masensio * @author David A. Velasco * @author David González Verdugo - * Copyright (C) 2018 ownCloud GmbH + * Copyright (C) 2019 ownCloud GmbH * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -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.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; +import okhttp3.FormBody; import java.net.URL; import java.text.DateFormat; @@ -42,8 +43,6 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; -import okhttp3.FormBody; - /** * Creates a new share. This allows sharing with a user or group or as a link. * @@ -133,12 +132,11 @@ public class CreateRemoteShareOperation extends RemoteOperation { mGetShareDetails = false; // defaults to false for backwards compatibility } - /** * Set name to create in Share resource. Ignored by servers previous to version 10.0.0 * - * @param name Name to set to the target share. - * Null or empty string result in no value set for the name. + * @param name Name to set to the target share. + * Null or empty string result in no value set for the name. */ public void setName(String name) { this.mName = (name == null) ? "" : name; @@ -154,7 +152,6 @@ public class CreateRemoteShareOperation extends RemoteOperation { mPassword = password; } - /** * Set expiration date to create in Share resource. * @@ -165,7 +162,6 @@ public class CreateRemoteShareOperation extends RemoteOperation { mExpirationDateInMillis = expirationDateInMillis; } - /** * Set permissions to create in Share resource. * diff --git a/src/com/owncloud/android/lib/resources/shares/GetRemoteShareOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteShareOperation.java similarity index 98% rename from src/com/owncloud/android/lib/resources/shares/GetRemoteShareOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteShareOperation.java index e475864f..e4d4972e 100644 --- a/src/com/owncloud/android/lib/resources/shares/GetRemoteShareOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteShareOperation.java @@ -1,7 +1,7 @@ /* ownCloud Android Library is available under MIT license * @author David A. Velasco * @author David González Verdugo - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -50,7 +50,6 @@ public class GetRemoteShareOperation extends RemoteOperation private long mRemoteId; - public GetRemoteShareOperation(long remoteId) { mRemoteId = remoteId; } diff --git a/src/com/owncloud/android/lib/resources/shares/GetRemoteShareesOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteShareesOperation.java similarity index 89% rename from src/com/owncloud/android/lib/resources/shares/GetRemoteShareesOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteShareesOperation.java index 006ac719..2a90128e 100644 --- a/src/com/owncloud/android/lib/resources/shares/GetRemoteShareesOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteShareesOperation.java @@ -3,7 +3,7 @@ * @author masensio * @author David A. Velasco * @author David González Verdugo - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -47,24 +47,24 @@ import static com.owncloud.android.lib.common.operations.RemoteOperationResult.R /** * Created by masensio on 08/10/2015. - * + *

* Retrieves a list of sharees (possible targets of a share) from the ownCloud server. - * + *

* Currently only handles users and groups. Users in other OC servers (federation) should be added later. - * + *

* Depends on SHAREE API. {@See https://github.com/owncloud/documentation/issues/1626} - * + *

* Syntax: - * Entry point: ocs/v2.php/apps/files_sharing/api/v1/sharees - * HTTP method: GET - * url argument: itemType - string, required - * url argument: format - string, optional - * url argument: search - string, optional - * url arguments: perPage - int, optional - * url arguments: page - int, optional - * + * Entry point: ocs/v2.php/apps/files_sharing/api/v1/sharees + * HTTP method: GET + * url argument: itemType - string, required + * url argument: format - string, optional + * url argument: search - string, optional + * url arguments: perPage - int, optional + * url arguments: page - int, optional + *

* Status codes: - * 100 - successful + * 100 - successful * * @author masensio * @author David A. Velasco @@ -99,6 +99,7 @@ public class GetRemoteShareesOperation extends RemoteOperation> run(OwnCloudClient client) { RemoteOperationResult> result; - try{ + try { Uri requestUri = client.getBaseUri(); Uri.Builder uriBuilder = requestUri.buildUpon() .appendEncodedPath(OCS_ROUTE) @@ -138,7 +139,7 @@ public class GetRemoteShareesOperation extends RemoteOperation data = new ArrayList<>(); // For result data - for (int i=0; i<6; i++) { - for(int j=0; j< jsonResults[i].length(); j++){ + for (int i = 0; i < 6; i++) { + for (int j = 0; j < jsonResults[i].length(); j++) { JSONObject jsonResult = jsonResults[i].getJSONObject(j); data.add(jsonResult); Log_OC.d(TAG, "*** Added item: " + jsonResult.getString(PROPERTY_LABEL)); @@ -173,7 +174,7 @@ public class GetRemoteShareesOperation extends RemoteOperation(OK); result.setData(data); - Log_OC.d(TAG, "*** Get Users or groups completed " ); + Log_OC.d(TAG, "*** Get Users or groups completed "); } else { result = new RemoteOperationResult<>(getMethod); diff --git a/src/com/owncloud/android/lib/resources/shares/GetRemoteSharesForFileOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteSharesForFileOperation.java similarity index 98% rename from src/com/owncloud/android/lib/resources/shares/GetRemoteSharesForFileOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteSharesForFileOperation.java index aadbad3e..e788cb25 100644 --- a/src/com/owncloud/android/lib/resources/shares/GetRemoteSharesForFileOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/GetRemoteSharesForFileOperation.java @@ -2,7 +2,7 @@ * @author masensio * @author David A. Velasco * @author David González Verdugo - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -98,7 +98,7 @@ public class GetRemoteSharesForFileOperation extends RemoteOperation 0) { if (mServerBaseUri != null) { String sharingLinkPath = ShareUtils.getSharingLinkPath(mOwnCloudVersion); @@ -112,11 +110,11 @@ public class ShareToRemoteOperationResultParser { Log_OC.e(TAG, "Successful status with no share in the response"); } - } else if (mShareXmlParser.isWrongParameter()){ + } else if (mShareXmlParser.isWrongParameter()) { result = new RemoteOperationResult<>(RemoteOperationResult.ResultCode.SHARE_WRONG_PARAMETER); result.setData(new ShareParserResult(null, mShareXmlParser.getMessage())); - } else if (mShareXmlParser.isNotFound()){ + } else if (mShareXmlParser.isNotFound()) { result = new RemoteOperationResult<>(RemoteOperationResult.ResultCode.SHARE_NOT_FOUND); result.setData(new ShareParserResult(null, mShareXmlParser.getMessage())); diff --git a/src/com/owncloud/android/lib/resources/shares/ShareType.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareType.java similarity index 63% rename from src/com/owncloud/android/lib/resources/shares/ShareType.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareType.java index a2d3c101..e272abbd 100644 --- a/src/com/owncloud/android/lib/resources/shares/ShareType.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareType.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license * Copyright (C) 2016 ownCloud GmbH. - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -27,55 +27,51 @@ package com.owncloud.android.lib.resources.shares; /** * Enum for Share Type, with values: * -1 - No shared - * 0 - Shared by user - * 1 - Shared by group - * 3 - Shared by public link - * 4 - Shared by e-mail - * 5 - Shared by contact - * - * @author masensio + * 0 - Shared by user + * 1 - Shared by group + * 3 - Shared by public link + * 4 - Shared by e-mail + * 5 - Shared by contact * + * @author masensio */ public enum ShareType { - NO_SHARED (-1), - USER (0), - GROUP (1), - PUBLIC_LINK (3), - EMAIL (4), - CONTACT (5), - FEDERATED (6); - + NO_SHARED(-1), + USER(0), + GROUP(1), + PUBLIC_LINK(3), + EMAIL(4), + CONTACT(5), + FEDERATED(6); + private int value; - - private ShareType(int value) - { + + private ShareType(int value) { this.value = value; } - - public int getValue() { - return value; - } - - public static ShareType fromValue(int value) - { - switch (value) - { - case -1: - return NO_SHARED; - case 0: - return USER; - case 1: - return GROUP; - case 3: - return PUBLIC_LINK; - case 4: - return EMAIL; - case 5: - return CONTACT; - case 6: - return FEDERATED; + + public static ShareType fromValue(int value) { + switch (value) { + case -1: + return NO_SHARED; + case 0: + return USER; + case 1: + return GROUP; + case 3: + return PUBLIC_LINK; + case 4: + return EMAIL; + case 5: + return CONTACT; + case 6: + return FEDERATED; } return null; } + + public int getValue() { + return value; + } }; \ No newline at end of file diff --git a/src/com/owncloud/android/lib/resources/shares/ShareUtils.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareUtils.java similarity index 84% rename from src/com/owncloud/android/lib/resources/shares/ShareUtils.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareUtils.java index cb355855..4d4b80ae 100644 --- a/src/com/owncloud/android/lib/resources/shares/ShareUtils.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareUtils.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. - * + * Copyright (C) 2019 ownCloud GmbH. + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -28,23 +28,22 @@ import com.owncloud.android.lib.resources.status.OwnCloudVersion; /** * Contains Constants for Share Operation - * + * * @author masensio * @author David González Verdugo - * */ public class ShareUtils { - // OCS Route - public static final String SHARING_API_PATH ="ocs/v2.php/apps/files_sharing/api/v1/shares"; + // OCS Route + public static final String SHARING_API_PATH = "ocs/v2.php/apps/files_sharing/api/v1/shares"; // String to build the link with the token of a share: public static final String SHARING_LINK_PATH_BEFORE_VERSION_8 = "/public.php?service=files&t="; public static final String SHARING_LINK_PATH_AFTER_VERSION_8 = "/index.php/s/"; - public static String getSharingLinkPath(OwnCloudVersion version){ - if (version!= null && version.isAfter8Version()){ + public static String getSharingLinkPath(OwnCloudVersion version) { + if (version != null && version.isAfter8Version()) { return SHARING_LINK_PATH_AFTER_VERSION_8; } else { return SHARING_LINK_PATH_BEFORE_VERSION_8; diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.java new file mode 100644 index 00000000..a6265e1a --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/ShareXMLParser.java @@ -0,0 +1,452 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2019 ownCloud GmbH. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package com.owncloud.android.lib.resources.shares; + +import android.util.Xml; + +import com.owncloud.android.lib.common.network.WebdavUtils; +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; + +/** + * Parser for Share API Response + * + * @author masensio + * @author David González Verdugo + */ + +public class ShareXMLParser { + + //private static final String TAG = ShareXMLParser.class.getSimpleName(); + + // No namespaces + private static final String ns = null; + + // NODES for XML Parser + private static final String NODE_OCS = "ocs"; + + private static final String NODE_META = "meta"; + private static final String NODE_STATUS = "status"; + private static final String NODE_STATUS_CODE = "statuscode"; + private static final String NODE_MESSAGE = "message"; + + private static final String NODE_DATA = "data"; + private static final String NODE_ELEMENT = "element"; + private static final String NODE_ID = "id"; + private static final String NODE_ITEM_TYPE = "item_type"; + private static final String NODE_ITEM_SOURCE = "item_source"; + private static final String NODE_PARENT = "parent"; + private static final String NODE_SHARE_TYPE = "share_type"; + private static final String NODE_SHARE_WITH = "share_with"; + private static final String NODE_FILE_SOURCE = "file_source"; + private static final String NODE_PATH = "path"; + private static final String NODE_PERMISSIONS = "permissions"; + private static final String NODE_STIME = "stime"; + private static final String NODE_EXPIRATION = "expiration"; + private static final String NODE_TOKEN = "token"; + private static final String NODE_STORAGE = "storage"; + private static final String NODE_MAIL_SEND = "mail_send"; + private static final String NODE_SHARE_WITH_DISPLAY_NAME = "share_with_displayname"; + private static final String NODE_SHARE_WITH_ADDITIONAL_INFO = "share_with_additional_info"; + private static final String NODE_NAME = "name"; + + private static final String NODE_URL = "url"; + + private static final String TYPE_FOLDER = "folder"; + + private static final int SUCCESS = 200; + private static final int ERROR_WRONG_PARAMETER = 400; + private static final int ERROR_FORBIDDEN = 403; + private static final int ERROR_NOT_FOUND = 404; + + private String mStatus; + private int mStatusCode; + private String mMessage; + + // Getters and Setters + public String getStatus() { + return mStatus; + } + + public void setStatus(String status) { + this.mStatus = status; + } + + public int getStatusCode() { + return mStatusCode; + } + + public void setStatusCode(int statusCode) { + this.mStatusCode = statusCode; + } + + public String getMessage() { + return mMessage; + } + + public void setMessage(String message) { + this.mMessage = message; + } + + // Constructor + public ShareXMLParser() { + mStatusCode = -1; + } + + public boolean isSuccess() { + return mStatusCode == SUCCESS; + } + + public boolean isForbidden() { + return mStatusCode == ERROR_FORBIDDEN; + } + + public boolean isNotFound() { + return mStatusCode == ERROR_NOT_FOUND; + } + + public boolean isWrongParameter() { + return mStatusCode == ERROR_WRONG_PARAMETER; + } + + /** + * Parse is as response of Share API + * + * @param is + * @return List of ShareRemoteFiles + * @throws XmlPullParserException + * @throws IOException + */ + public ArrayList parseXMLResponse(InputStream is) throws XmlPullParserException, + IOException { + + try { + // XMLPullParser + XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); + factory.setNamespaceAware(true); + + XmlPullParser parser = Xml.newPullParser(); + parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); + parser.setInput(is, null); + parser.nextTag(); + return readOCS(parser); + + } finally { + is.close(); + } + } + + /** + * Parse OCS node + * + * @param parser + * @return List of ShareRemoteFiles + * @throws XmlPullParserException + * @throws IOException + */ + private ArrayList readOCS(XmlPullParser parser) throws XmlPullParserException, + IOException { + ArrayList shares = new ArrayList<>(); + parser.require(XmlPullParser.START_TAG, ns, NODE_OCS); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String name = parser.getName(); + // read NODE_META and NODE_DATA + if (name.equalsIgnoreCase(NODE_META)) { + readMeta(parser); + } else if (name.equalsIgnoreCase(NODE_DATA)) { + shares = readData(parser); + } else { + skip(parser); + } + + } + return shares; + } + + /** + * Parse Meta node + * + * @param parser + * @throws XmlPullParserException + * @throws IOException + */ + private void readMeta(XmlPullParser parser) throws XmlPullParserException, IOException { + parser.require(XmlPullParser.START_TAG, ns, NODE_META); + //Log_OC.d(TAG, "---- NODE META ---"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String name = parser.getName(); + + if (name.equalsIgnoreCase(NODE_STATUS)) { + setStatus(readNode(parser, NODE_STATUS)); + + } else if (name.equalsIgnoreCase(NODE_STATUS_CODE)) { + setStatusCode(Integer.parseInt(readNode(parser, NODE_STATUS_CODE))); + + } else if (name.equalsIgnoreCase(NODE_MESSAGE)) { + setMessage(readNode(parser, NODE_MESSAGE)); + + } else { + skip(parser); + } + + } + } + + /** + * Parse Data node + * + * @param parser + * @return + * @throws XmlPullParserException + * @throws IOException + */ + private ArrayList readData(XmlPullParser parser) throws XmlPullParserException, + IOException { + ArrayList shares = new ArrayList(); + OCShare share = null; + + parser.require(XmlPullParser.START_TAG, ns, NODE_DATA); + //Log_OC.d(TAG, "---- NODE DATA ---"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + String name = parser.getName(); + if (name.equalsIgnoreCase(NODE_ELEMENT)) { + readElement(parser, shares); + + } else if (name.equalsIgnoreCase(NODE_ID)) {// Parse Create XML Response + share = new OCShare(); + String value = readNode(parser, NODE_ID); + share.setIdRemoteShared(Integer.parseInt(value)); + + } else if (name.equalsIgnoreCase(NODE_URL)) { + // NOTE: this field is received in all the public shares from OC 9.0.0 + // in previous versions, it's received in the result of POST requests, but not + // in GET requests + share.setShareType(ShareType.PUBLIC_LINK); + String value = readNode(parser, NODE_URL); + share.setShareLink(value); + + } else if (name.equalsIgnoreCase(NODE_TOKEN)) { + share.setToken(readNode(parser, NODE_TOKEN)); + + } else { + skip(parser); + + } + } + + if (share != null) { + // this is the response of a request for creation; don't pass to isValidShare() + shares.add(share); + } + + return shares; + + } + + + /** + * Parse Element node + * + * @param parser + * @return + * @throws XmlPullParserException + * @throws IOException + */ + private void readElement(XmlPullParser parser, ArrayList shares) + throws XmlPullParserException, IOException { + parser.require(XmlPullParser.START_TAG, ns, NODE_ELEMENT); + + OCShare share = new OCShare(); + + //Log_OC.d(TAG, "---- NODE ELEMENT ---"); + while (parser.next() != XmlPullParser.END_TAG) { + if (parser.getEventType() != XmlPullParser.START_TAG) { + continue; + } + + String name = parser.getName(); + + if (name.equalsIgnoreCase(NODE_ELEMENT)) { + // patch to work around servers responding with extra surrounding all + // the shares on the same file before + // https://github.com/owncloud/core/issues/6992 was fixed + readElement(parser, shares); + + } else if (name.equalsIgnoreCase(NODE_ID)) { + share.setIdRemoteShared(Integer.parseInt(readNode(parser, NODE_ID))); + + } else if (name.equalsIgnoreCase(NODE_ITEM_TYPE)) { + share.setIsFolder(readNode(parser, NODE_ITEM_TYPE).equalsIgnoreCase(TYPE_FOLDER)); + fixPathForFolder(share); + + } else if (name.equalsIgnoreCase(NODE_ITEM_SOURCE)) { + share.setItemSource(Long.parseLong(readNode(parser, NODE_ITEM_SOURCE))); + + } else if (name.equalsIgnoreCase(NODE_PARENT)) { + readNode(parser, NODE_PARENT); + + } else if (name.equalsIgnoreCase(NODE_SHARE_TYPE)) { + int value = Integer.parseInt(readNode(parser, NODE_SHARE_TYPE)); + share.setShareType(ShareType.fromValue(value)); + + } else if (name.equalsIgnoreCase(NODE_SHARE_WITH)) { + share.setShareWith(readNode(parser, NODE_SHARE_WITH)); + + } else if (name.equalsIgnoreCase(NODE_FILE_SOURCE)) { + share.setFileSource(Long.parseLong(readNode(parser, NODE_FILE_SOURCE))); + + } else if (name.equalsIgnoreCase(NODE_PATH)) { + share.setPath(readNode(parser, NODE_PATH)); + fixPathForFolder(share); + + } else if (name.equalsIgnoreCase(NODE_PERMISSIONS)) { + share.setPermissions(Integer.parseInt(readNode(parser, NODE_PERMISSIONS))); + + } else if (name.equalsIgnoreCase(NODE_STIME)) { + share.setSharedDate(Long.parseLong(readNode(parser, NODE_STIME))); + + } else if (name.equalsIgnoreCase(NODE_EXPIRATION)) { + String value = readNode(parser, NODE_EXPIRATION); + if (!(value.length() == 0)) { + share.setExpirationDate(WebdavUtils.parseResponseDate(value).getTime()); + } + + } else if (name.equalsIgnoreCase(NODE_TOKEN)) { + share.setToken(readNode(parser, NODE_TOKEN)); + + } else if (name.equalsIgnoreCase(NODE_STORAGE)) { + readNode(parser, NODE_STORAGE); + } else if (name.equalsIgnoreCase(NODE_MAIL_SEND)) { + readNode(parser, NODE_MAIL_SEND); + + } else if (name.equalsIgnoreCase(NODE_SHARE_WITH_DISPLAY_NAME)) { + share.setSharedWithDisplayName(readNode(parser, NODE_SHARE_WITH_DISPLAY_NAME)); + + } else if (name.equalsIgnoreCase(NODE_SHARE_WITH_ADDITIONAL_INFO)) { + share.setSharedWithAdditionalInfo(readNode(parser, NODE_SHARE_WITH_ADDITIONAL_INFO)); + + } else if (name.equalsIgnoreCase(NODE_URL)) { + String value = readNode(parser, NODE_URL); + share.setShareLink(value); + + } else if (name.equalsIgnoreCase(NODE_NAME)) { + share.setName(readNode(parser, NODE_NAME)); + + } else { + skip(parser); + } + } + + if (isValidShare(share)) { + shares.add(share); + } + } + + private boolean isValidShare(OCShare share) { + return (share.getRemoteId() > -1); + } + + private void fixPathForFolder(OCShare share) { + if (share.isFolder() && share.getPath() != null && share.getPath().length() > 0 && + !share.getPath().endsWith(FileUtils.PATH_SEPARATOR)) { + share.setPath(share.getPath() + FileUtils.PATH_SEPARATOR); + } + } + + /** + * Parse a node, to obtain its text. Needs readText method + * + * @param parser + * @param node + * @return Text of the node + * @throws XmlPullParserException + * @throws IOException + */ + private String readNode(XmlPullParser parser, String node) throws XmlPullParserException, + IOException { + parser.require(XmlPullParser.START_TAG, ns, node); + String value = readText(parser); + //Log_OC.d(TAG, "node= " + node + ", value= " + value); + parser.require(XmlPullParser.END_TAG, ns, node); + return value; + } + + /** + * Read the text from a node + * + * @param parser + * @return Text of the node + * @throws IOException + * @throws XmlPullParserException + */ + private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { + String result = ""; + if (parser.next() == XmlPullParser.TEXT) { + result = parser.getText(); + parser.nextTag(); + } + return result; + } + + /** + * Skip tags in parser procedure + * + * @param parser + * @throws XmlPullParserException + * @throws IOException + */ + private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { + if (parser.getEventType() != XmlPullParser.START_TAG) { + throw new IllegalStateException(); + } + int depth = 1; + while (depth != 0) { + switch (parser.next()) { + case XmlPullParser.END_TAG: + depth--; + break; + case XmlPullParser.START_TAG: + depth++; + break; + } + } + } +} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java similarity index 95% rename from src/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java index 2ec8c3ed..0122d86e 100644 --- a/src/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/shares/UpdateRemoteShareOperation.java @@ -1,6 +1,6 @@ /* ownCloud Android Library is available under MIT license * - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -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.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; +import okhttp3.FormBody; import java.net.URL; import java.text.DateFormat; @@ -40,11 +41,9 @@ import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Locale; -import okhttp3.FormBody; - /** * Updates parameters of an existing Share resource, known its remote ID. - * + *

* Allow updating several parameters, triggering a request to the server per parameter. * * @author David A. Velasco @@ -64,7 +63,6 @@ public class UpdateRemoteShareOperation extends RemoteOperation - * Copyright (C) 2018 ownCloud GmbH. + * @author David González Verdugo + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -24,7 +25,6 @@ * */ - package com.owncloud.android.lib.resources.status; import android.net.Uri; @@ -35,7 +35,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.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; - import org.json.JSONObject; import java.net.URL; @@ -76,6 +75,7 @@ public class GetRemoteCapabilitiesOperation extends RemoteOperation { String redirectedLocation = mLatestResult.getRedirectedLocation(); while (redirectedLocation != null && redirectedLocation.length() > 0 - && !mLatestResult.isSuccess()) { + && !mLatestResult.isSuccess()) { isRedirectToNonSecureConnection |= ( - baseUrlSt.startsWith(HTTPS_PREFIX) && - redirectedLocation.startsWith(HTTP_PREFIX) + baseUrlSt.startsWith(HTTPS_PREFIX) && + redirectedLocation.startsWith(HTTP_PREFIX) ); getMethod = new GetMethod(new URL(redirectedLocation)); @@ -128,13 +127,13 @@ public class GetRemoteStatusOperation extends RemoteOperation { if (isRedirectToNonSecureConnection) { mLatestResult = new RemoteOperationResult<>( - RemoteOperationResult.ResultCode. - OK_REDIRECT_TO_NON_SECURE_CONNECTION); + RemoteOperationResult.ResultCode. + OK_REDIRECT_TO_NON_SECURE_CONNECTION); } else { mLatestResult = new RemoteOperationResult<>( - baseUrlSt.startsWith(HTTPS_PREFIX) ? - RemoteOperationResult.ResultCode.OK_SSL : - RemoteOperationResult.ResultCode.OK_NO_SSL); + baseUrlSt.startsWith(HTTPS_PREFIX) ? + RemoteOperationResult.ResultCode.OK_SSL : + RemoteOperationResult.ResultCode.OK_NO_SSL); } mLatestResult.setData(ocVersion); @@ -147,7 +146,7 @@ public class GetRemoteStatusOperation extends RemoteOperation { } catch (JSONException e) { mLatestResult = new RemoteOperationResult<>( - RemoteOperationResult.ResultCode.INSTANCE_NOT_CONFIGURED); + RemoteOperationResult.ResultCode.INSTANCE_NOT_CONFIGURED); } catch (Exception e) { mLatestResult = new RemoteOperationResult<>(e); @@ -158,7 +157,7 @@ public class GetRemoteStatusOperation extends RemoteOperation { } else if (mLatestResult.getException() != null) { Log_OC.e(TAG, "Connection check at " + baseUrlSt + ": " + mLatestResult.getLogMessage(), - mLatestResult.getException()); + mLatestResult.getException()); } else { Log_OC.e(TAG, "Connection check at " + baseUrlSt + ": " + mLatestResult.getLogMessage()); @@ -169,9 +168,9 @@ public class GetRemoteStatusOperation extends RemoteOperation { private boolean isOnline() { ConnectivityManager cm = (ConnectivityManager) mContext - .getSystemService(Context.CONNECTIVITY_SERVICE); + .getSystemService(Context.CONNECTIVITY_SERVICE); return cm != null && cm.getActiveNetworkInfo() != null - && cm.getActiveNetworkInfo().isConnectedOrConnecting(); + && cm.getActiveNetworkInfo().isConnectedOrConnecting(); } @Override diff --git a/src/com/owncloud/android/lib/resources/status/OCCapability.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.java similarity index 85% rename from src/com/owncloud/android/lib/resources/status/OCCapability.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.java index f866e4c9..99479b54 100644 --- a/src/com/owncloud/android/lib/resources/status/OCCapability.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OCCapability.java @@ -1,6 +1,7 @@ /* ownCloud Android Library is available under MIT license * @author masensio - * Copyright (C) 2016 ownCloud GmbH. + * @author David González Verdugo + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -49,6 +50,9 @@ public class OCCapability { private CapabilityBooleanType mFilesSharingPublicEnabled; private CapabilityBooleanType mFilesSharingPublicPasswordEnforced; + private CapabilityBooleanType mFilesSharingPublicPasswordEnforcedReadOnly; + private CapabilityBooleanType mFilesSharingPublicPasswordEnforcedReadWrite; + private CapabilityBooleanType mFilesSharingPublicPasswordEnforcedUploadOnly; private CapabilityBooleanType mFilesSharingPublicExpireDateEnabled; private int mFilesSharingPublicExpireDateDays; private CapabilityBooleanType mFilesSharingPublicExpireDateEnforced; @@ -84,6 +88,9 @@ public class OCCapability { mFilesSharingApiEnabled = CapabilityBooleanType.UNKNOWN; mFilesSharingPublicEnabled = CapabilityBooleanType.UNKNOWN; mFilesSharingPublicPasswordEnforced = CapabilityBooleanType.UNKNOWN; + mFilesSharingPublicPasswordEnforcedReadOnly = CapabilityBooleanType.UNKNOWN; + mFilesSharingPublicPasswordEnforcedReadWrite = CapabilityBooleanType.UNKNOWN; + mFilesSharingPublicPasswordEnforcedUploadOnly = CapabilityBooleanType.UNKNOWN; mFilesSharingPublicExpireDateEnabled = CapabilityBooleanType.UNKNOWN; mFilesSharingPublicExpireDateDays = 0; mFilesSharingPublicExpireDateEnforced = CapabilityBooleanType.UNKNOWN; @@ -101,7 +108,6 @@ public class OCCapability { mFilesVersioning = CapabilityBooleanType.UNKNOWN; } - // Getters and Setters public String getAccountName() { return mAccountName; @@ -159,7 +165,6 @@ public class OCCapability { this.mVersionEdition = versionEdition; } - public int getCorePollinterval() { return mCorePollinterval; } @@ -192,6 +197,33 @@ public class OCCapability { this.mFilesSharingPublicPasswordEnforced = filesSharingPublicPasswordEnforced; } + public CapabilityBooleanType getFilesSharingPublicPasswordEnforcedReadOnly() { + return mFilesSharingPublicPasswordEnforcedReadOnly; + } + + public void setFilesSharingPublicPasswordEnforcedReadOnly( + CapabilityBooleanType filesSharingPublicPasswordEnforcedReadOnly) { + this.mFilesSharingPublicPasswordEnforcedReadOnly = filesSharingPublicPasswordEnforcedReadOnly; + } + + public CapabilityBooleanType getFilesSharingPublicPasswordEnforcedReadWrite() { + return mFilesSharingPublicPasswordEnforcedReadWrite; + } + + public void setFilesSharingPublicPasswordEnforcedReadWrite( + CapabilityBooleanType filesSharingPublicPasswordEnforcedReadWrite) { + this.mFilesSharingPublicPasswordEnforcedReadWrite = filesSharingPublicPasswordEnforcedReadWrite; + } + + public CapabilityBooleanType getFilesSharingPublicPasswordEnforcedUploadOnly() { + return mFilesSharingPublicPasswordEnforcedUploadOnly; + } + + public void setFilesSharingPublicPasswordEnforcedUploadOnly( + CapabilityBooleanType filesSharingPublicPasswordEnforcedUploadOnly) { + this.mFilesSharingPublicPasswordEnforcedUploadOnly = filesSharingPublicPasswordEnforcedUploadOnly; + } + public CapabilityBooleanType getFilesSharingPublicExpireDateEnabled() { return mFilesSharingPublicExpireDateEnabled; } @@ -216,7 +248,6 @@ public class OCCapability { this.mFilesSharingPublicExpireDateEnforced = filesSharingPublicExpireDateEnforced; } - public CapabilityBooleanType getFilesSharingPublicSendMail() { return mFilesSharingPublicSendMail; } diff --git a/src/com/owncloud/android/lib/resources/status/OwnCloudVersion.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java similarity index 95% rename from src/com/owncloud/android/lib/resources/status/OwnCloudVersion.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java index 0bd66036..04b8800c 100644 --- a/src/com/owncloud/android/lib/resources/status/OwnCloudVersion.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/status/OwnCloudVersion.java @@ -1,23 +1,23 @@ /* ownCloud Android Library is available under MIT license * Copyright (C) 2016 ownCloud GmbH. * Copyright (C) 2012 Bartek Przybylski - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -106,7 +106,7 @@ public class OwnCloudVersion implements Comparable { @Override public int compareTo(OwnCloudVersion another) { return another.mVersion == mVersion ? 0 - : another.mVersion < mVersion ? 1 : -1; + : another.mVersion < mVersion ? 1 : -1; } private void parseVersion(String version) { @@ -139,7 +139,6 @@ public class OwnCloudVersion implements Comparable { return versionValue; } - public boolean isChunkedUploadSupported() { return (mVersion >= MINIMUN_VERSION_FOR_CHUNKED_UPLOADS); } @@ -185,8 +184,8 @@ public class OwnCloudVersion implements Comparable { */ public boolean isPreemptiveAuthenticationPreferred() { return ( - (mVersion < MINIMUM_VERSION_WITH_SESSION_MONITORING) || - (mVersion >= MINIMUM_VERSION_WITH_SESSION_MONITORING_WORKING_IN_PREEMPTIVE_MODE) + (mVersion < MINIMUM_VERSION_WITH_SESSION_MONITORING) || + (mVersion >= MINIMUM_VERSION_WITH_SESSION_MONITORING_WORKING_IN_PREEMPTIVE_MODE) ); } diff --git a/src/com/owncloud/android/lib/resources/users/GetRemoteUserAvatarOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/users/GetRemoteUserAvatarOperation.java similarity index 96% rename from src/com/owncloud/android/lib/resources/users/GetRemoteUserAvatarOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/users/GetRemoteUserAvatarOperation.java index eb88d11f..40d19465 100644 --- a/src/com/owncloud/android/lib/resources/users/GetRemoteUserAvatarOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/users/GetRemoteUserAvatarOperation.java @@ -1,6 +1,6 @@ /* ownCloud Android Library is available under MIT license * - * Copyright (C) 2018 ownCloud GmbH. + * Copyright (C) 2019 ownCloud GmbH. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -43,6 +43,7 @@ import static com.owncloud.android.lib.common.operations.RemoteOperationResult.R /** * Gets avatar about the user logged in, if available + * * @author David A. Velasco * @author David González Verdugo */ @@ -52,7 +53,9 @@ public class GetRemoteUserAvatarOperation extends RemoteOperation(RemoteOperationResult.ResultCode.FILE_NOT_FOUND); return result; diff --git a/src/com/owncloud/android/lib/resources/users/GetRemoteUserInfoOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/users/GetRemoteUserInfoOperation.java similarity index 96% rename from src/com/owncloud/android/lib/resources/users/GetRemoteUserInfoOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/users/GetRemoteUserInfoOperation.java index 7e3c61f2..7b94eec1 100644 --- a/src/com/owncloud/android/lib/resources/users/GetRemoteUserInfoOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/users/GetRemoteUserInfoOperation.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. - * + * Copyright (C) 2019 ownCloud GmbH. + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -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.RemoteOperationResult; import com.owncloud.android.lib.common.utils.Log_OC; - import org.json.JSONObject; import java.net.URL; diff --git a/src/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java similarity index 91% rename from src/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java rename to owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java index d856be15..49c313be 100644 --- a/src/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/users/GetRemoteUserQuotaOperation.java @@ -1,6 +1,6 @@ /* ownCloud Android Library is available under MIT license * - * Copyright (C) 2018 ownCloud Inc. + * Copyright (C) 2019 ownCloud Inc. * Copyright (C) 2015 Bartosz Przybylski * Copyright (C) 2014 Marcello Steiner * @@ -27,6 +27,9 @@ 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.http.HttpConstants; 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.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.operations.RemoteOperationResult.ResultCode.OK; @@ -52,26 +51,7 @@ import static com.owncloud.android.lib.common.operations.RemoteOperationResult.R */ public class GetRemoteUserQuotaOperation extends RemoteOperation { - 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 String mRemotePath; /** @@ -112,7 +92,6 @@ public class GetRemoteUserQuotaOperation extends RemoteOperation(e); - } finally { if (result.isSuccess()) { Log_OC.i(TAG, "Get quota from " + mRemotePath + ": " + result.getLogMessage()); @@ -143,11 +122,13 @@ public class GetRemoteUserQuotaOperation extends RemoteOperation + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 com.owncloud.android @@ -19,7 +19,7 @@ owncloud-android-library for Owncloud for Android - + diff --git a/project.properties b/project.properties deleted file mode 100644 index 34c8d58b..00000000 --- a/project.properties +++ /dev/null @@ -1,15 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system edit -# "ant.properties", and override values to adapt the script to your -# project structure. -# -# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt - -# Project target. -target=android-24 -android.library=true diff --git a/sample_client/.classpath b/sample_client/.classpath deleted file mode 100644 index 51769745..00000000 --- a/sample_client/.classpath +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/sample_client/.project b/sample_client/.project deleted file mode 100644 index d1b87431..00000000 --- a/sample_client/.project +++ /dev/null @@ -1,33 +0,0 @@ - - - ownCloud Sample Client - - - - - - com.android.ide.eclipse.adt.ResourceManagerBuilder - - - - - com.android.ide.eclipse.adt.PreCompilerBuilder - - - - - org.eclipse.jdt.core.javabuilder - - - - - com.android.ide.eclipse.adt.ApkBuilder - - - - - - com.android.ide.eclipse.adt.AndroidNature - org.eclipse.jdt.core.javanature - - diff --git a/sample_client/.settings/org.eclipse.jdt.core.prefs b/sample_client/.settings/org.eclipse.jdt.core.prefs deleted file mode 100644 index b080d2dd..00000000 --- a/sample_client/.settings/org.eclipse.jdt.core.prefs +++ /dev/null @@ -1,4 +0,0 @@ -eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 -org.eclipse.jdt.core.compiler.compliance=1.6 -org.eclipse.jdt.core.compiler.source=1.6 diff --git a/sample_client/ant.properties b/sample_client/ant.properties deleted file mode 100644 index b0971e89..00000000 --- a/sample_client/ant.properties +++ /dev/null @@ -1,17 +0,0 @@ -# This file is used to override default values used by the Ant build system. -# -# This file must be checked into Version Control Systems, as it is -# integral to the build system of your project. - -# This file is only used by the Ant script. - -# You can use this to override default values such as -# 'source.dir' for the location of your java source folder and -# 'out.dir' for the location of your output folder. - -# You can also use it define how the release builds are signed by declaring -# the following properties: -# 'key.store' for the location of your keystore and -# 'key.alias' for the name of the key to use. -# The password will be asked during the build when you use the 'release' target. - diff --git a/sample_client/build.gradle b/sample_client/build.gradle index e61a1458..7f865ceb 100644 --- a/sample_client/build.gradle +++ b/sample_client/build.gradle @@ -1,38 +1,15 @@ apply plugin: 'com.android.application' -repositories { - jcenter() -} - dependencies { - implementation project(':') + implementation project(':owncloudComLibrary') } android { - compileSdkVersion 26 + compileSdkVersion 28 - sourceSets { - main { - manifest.srcFile 'AndroidManifest.xml' - java.srcDirs = ['src'] - resources.srcDirs = ['src'] - aidl.srcDirs = ['src'] - renderscript.srcDirs = ['src'] - res.srcDirs = ['res'] - assets.srcDirs = ['assets'] - } - - // Move the tests to tests/java, tests/res, etc... - androidTest.setRoot('tests') - - // Move the build types to build-types/ - // For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ... - // This moves them out of them default location under src//... which would - // conflict with src/ being used by the main source set. - // Adding new build types or product flavors should be accompanied - // by a similar customization. - debug.setRoot('build-types/debug') - release.setRoot('build-types/release') + defaultConfig { + minSdkVersion 19 + targetSdkVersion 28 } lintOptions { @@ -42,6 +19,7 @@ android { packagingOptions { exclude 'META-INF/LICENSE.txt' } + compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 diff --git a/sample_client/build.xml b/sample_client/build.xml deleted file mode 100644 index 751356dd..00000000 --- a/sample_client/build.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sample_client/gradle/wrapper/gradle-wrapper.jar b/sample_client/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 13372aef..00000000 Binary files a/sample_client/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/sample_client/gradle/wrapper/gradle-wrapper.properties b/sample_client/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index fc5d4423..00000000 --- a/sample_client/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Mon Dec 28 10:00:20 PST 2015 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.4-all.zip \ No newline at end of file diff --git a/sample_client/gradlew b/sample_client/gradlew deleted file mode 100755 index 91a7e269..00000000 --- a/sample_client/gradlew +++ /dev/null @@ -1,164 +0,0 @@ -#!/usr/bin/env bash - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn ( ) { - echo "$*" -} - -die ( ) { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; -esac - -# For Cygwin, ensure paths are in UNIX format before anything is touched. -if $cygwin ; then - [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` -fi - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >&- -APP_HOME="`pwd -P`" -cd "$SAVED" >&- - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" - -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/sample_client/gradlew.bat b/sample_client/gradlew.bat deleted file mode 100644 index aec99730..00000000 --- a/sample_client/gradlew.bat +++ /dev/null @@ -1,90 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windowz variants - -if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/sample_client/project.properties b/sample_client/project.properties deleted file mode 100644 index 07afc2f8..00000000 --- a/sample_client/project.properties +++ /dev/null @@ -1,15 +0,0 @@ -# This file is automatically generated by Android Tools. -# Do not modify this file -- YOUR CHANGES WILL BE ERASED! -# -# This file must be checked in Version Control Systems. -# -# To customize properties used by the Ant build system edit -# "ant.properties", and override values to adapt the script to your -# project structure. -# -# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): -#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt - -# Project target. -target=android-24 -android.library.reference.1=.. diff --git a/sample_client/assets/oc_sample.png b/sample_client/src/assets/oc_sample.png similarity index 100% rename from sample_client/assets/oc_sample.png rename to sample_client/src/assets/oc_sample.png diff --git a/sample_client/assets/oc_sample.txt b/sample_client/src/assets/oc_sample.txt similarity index 100% rename from sample_client/assets/oc_sample.txt rename to sample_client/src/assets/oc_sample.txt diff --git a/sample_client/src/com/owncloud/android/lib/sampleclient/MainActivity.java b/sample_client/src/com/owncloud/android/lib/sampleclient/MainActivity.java deleted file mode 100644 index 7f105d2c..00000000 --- a/sample_client/src/com/owncloud/android/lib/sampleclient/MainActivity.java +++ /dev/null @@ -1,310 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.sampleclient; - -import android.annotation.SuppressLint; -import android.app.Activity; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.content.res.AssetManager; -import android.graphics.drawable.BitmapDrawable; -import android.net.Uri; -import android.os.Bundle; -import android.os.Handler; -import android.util.Log; -import android.view.View; -import android.widget.ListView; -import android.widget.TextView; -import android.widget.Toast; - -import com.owncloud.android.lib.common.OwnCloudClient; -import com.owncloud.android.lib.common.OwnCloudClientFactory; -import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; -import com.owncloud.android.lib.common.authentication.OwnCloudCredentialsFactory; -import com.owncloud.android.lib.common.network.OnDatatransferProgressListener; -import com.owncloud.android.lib.common.operations.OnRemoteOperationListener; -import com.owncloud.android.lib.common.operations.RemoteOperation; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.lib.common.utils.Log_OC; -import com.owncloud.android.lib.resources.files.DownloadRemoteFileOperation; -import com.owncloud.android.lib.resources.files.FileUtils; -import com.owncloud.android.lib.resources.files.ReadRemoteFolderOperation; -import com.owncloud.android.lib.resources.files.RemoteFile; -import com.owncloud.android.lib.resources.files.RemoveRemoteFileOperation; -import com.owncloud.android.lib.resources.files.UploadRemoteFileOperation; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import static android.content.ContentValues.TAG; - -public class MainActivity extends Activity implements OnRemoteOperationListener, OnDatatransferProgressListener { - - private static String LOG_TAG = MainActivity.class.getCanonicalName(); - - private Handler mHandler; - private OwnCloudClient mClient; - private FilesArrayAdapter mFilesAdapter; - private View mFrame; - - /** Called when the activity is first created. */ - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.main); - - mHandler = new Handler(); - - final Uri serverUri = Uri.parse(getString(R.string.server_base_url)); - - OwnCloudClientManagerFactory.setUserAgent(getUserAgent()); - mClient = OwnCloudClientFactory.createOwnCloudClient(serverUri, this, true); - - mClient.setCredentials( - OwnCloudCredentialsFactory.newBasicCredentials( - getString(R.string.username), - getString(R.string.password) - ) - ); - - mFilesAdapter = new FilesArrayAdapter(this, R.layout.file_in_list); - ((ListView)findViewById(R.id.list_view)).setAdapter(mFilesAdapter); - - // TODO move to background thread or task - AssetManager assets = getAssets(); - try { - String sampleFileName = getString(R.string.sample_file_name); - File upFolder = new File(getCacheDir(), getString(R.string.upload_folder_path)); - upFolder.mkdir(); - File upFile = new File(upFolder, sampleFileName); - FileOutputStream fos = new FileOutputStream(upFile); - InputStream is = assets.open(sampleFileName); - int count = 0; - byte[] buffer = new byte[1024]; - while ((count = is.read(buffer, 0, buffer.length)) >= 0) { - fos.write(buffer, 0, count); - } - is.close(); - fos.close(); - } catch (IOException e) { - Toast.makeText(this, R.string.error_copying_sample_file, Toast.LENGTH_SHORT).show(); - Log.e(LOG_TAG, getString(R.string.error_copying_sample_file), e); - } - - mFrame = findViewById(R.id.frame); - } - - - @Override - public void onDestroy() { - File upFolder = new File(getCacheDir(), getString(R.string.upload_folder_path)); - File upFile = upFolder.listFiles()[0]; - upFile.delete(); - upFolder.delete(); - super.onDestroy(); - } - - - public void onClickHandler(View button) { - switch (button.getId()) { - case R.id.button_refresh: - startRefresh(); - break; - case R.id.button_upload: - startUpload(); - break; - case R.id.button_delete_remote: - startRemoteDeletion(); - break; - case R.id.button_download: - startDownload(); - break; - case R.id.button_delete_local: - startLocalDeletion(); - break; - default: - Toast.makeText(this, R.string.youre_doing_it_wrong, Toast.LENGTH_SHORT).show(); - } - } - - private void startRefresh() { - ReadRemoteFolderOperation refreshOperation = new ReadRemoteFolderOperation(FileUtils.PATH_SEPARATOR); - refreshOperation.execute(mClient, this, mHandler); - } - - private void startUpload() { - File upFolder = new File(getCacheDir(), getString(R.string.upload_folder_path)); - File fileToUpload = upFolder.listFiles()[0]; - String remotePath = FileUtils.PATH_SEPARATOR + fileToUpload.getName(); - String mimeType = getString(R.string.sample_file_mimetype); - - // Get the last modification date of the file from the file system - Long timeStampLong = fileToUpload.lastModified()/1000; - String timeStamp = timeStampLong.toString(); - - UploadRemoteFileOperation uploadOperation = new UploadRemoteFileOperation(fileToUpload.getAbsolutePath(), - remotePath, mimeType, timeStamp); - uploadOperation.addDatatransferProgressListener(this); - uploadOperation.execute(mClient, this, mHandler); - } - - private void startRemoteDeletion() { - File upFolder = new File(getCacheDir(), getString(R.string.upload_folder_path)); - File fileToUpload = upFolder.listFiles()[0]; - String remotePath = FileUtils.PATH_SEPARATOR + fileToUpload.getName(); - - RemoveRemoteFileOperation removeOperation = new RemoveRemoteFileOperation(remotePath); - removeOperation.execute(mClient, this, mHandler); - } - - private void startDownload() { - File downFolder = new File(getCacheDir(), getString(R.string.download_folder_path)); - downFolder.mkdir(); - File upFolder = new File(getCacheDir(), getString(R.string.upload_folder_path)); - File fileToUpload = upFolder.listFiles()[0]; - String remotePath = FileUtils.PATH_SEPARATOR + fileToUpload.getName(); - - DownloadRemoteFileOperation downloadOperation = new DownloadRemoteFileOperation(remotePath, - downFolder.getAbsolutePath()); - downloadOperation.addDatatransferProgressListener(this); - downloadOperation.execute(mClient, this, mHandler); - } - - private void startLocalDeletion() { - File downFolder = new File(getCacheDir(), getString(R.string.download_folder_path)); - File downloadedFile = downFolder.listFiles()[0]; - if (!downloadedFile.delete() && downloadedFile.exists()) { - Toast.makeText(this, R.string.error_deleting_local_file, Toast.LENGTH_SHORT).show(); - } else { - ((TextView) findViewById(R.id.download_progress)).setText("0%"); - findViewById(R.id.frame).setBackgroundDrawable(null); - } - } - - @Override - public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) { - if (!result.isSuccess()) { - Toast.makeText(this, R.string.todo_operation_finished_in_fail, Toast.LENGTH_SHORT).show(); - Log.e(LOG_TAG, result.getLogMessage(), result.getException()); - - } else if (operation instanceof ReadRemoteFolderOperation) { - onSuccessfulRefresh((ReadRemoteFolderOperation)operation, result); - - } else if (operation instanceof com.owncloud.android.lib.resources.files.UploadRemoteFileOperation) { - onSuccessfulUpload((com.owncloud.android.lib.resources.files.UploadRemoteFileOperation)operation, result); - - } else if (operation instanceof RemoveRemoteFileOperation ) { - onSuccessfulRemoteDeletion((RemoveRemoteFileOperation)operation, result); - - } else if (operation instanceof DownloadRemoteFileOperation ) { - onSuccessfulDownload(); - - } else { - Toast.makeText(this, R.string.todo_operation_finished_in_success, Toast.LENGTH_SHORT).show(); - } - } - - private void onSuccessfulRefresh(ReadRemoteFolderOperation operation, RemoteOperationResult result) { - mFilesAdapter.clear(); - List files = new ArrayList<>(); - for(RemoteFile remoteFile: (List) result.getData()) { - files.add(remoteFile); - } - if (files != null) { - Iterator it = files.iterator(); - while (it.hasNext()) { - mFilesAdapter.add(it.next()); - } - mFilesAdapter.remove(mFilesAdapter.getItem(0)); - } - mFilesAdapter.notifyDataSetChanged(); - } - - private void onSuccessfulUpload(com.owncloud.android.lib.resources.files.UploadRemoteFileOperation operation, RemoteOperationResult result) { - startRefresh(); - } - - private void onSuccessfulRemoteDeletion(RemoveRemoteFileOperation operation, RemoteOperationResult result) { - startRefresh(); - TextView progressView = (TextView) findViewById(R.id.upload_progress); - if (progressView != null) { - progressView.setText("0%"); - } - } - - private void onSuccessfulDownload() { - File downFolder = new File(getCacheDir(), getString(R.string.download_folder_path)); - File downloadedFile = downFolder.listFiles()[0]; - BitmapDrawable bDraw = new BitmapDrawable(getResources(), downloadedFile.getAbsolutePath()); - mFrame.setBackgroundDrawable(bDraw); - } - - @Override - public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, String fileName) { - final long percentage = (totalToTransfer > 0 ? totalTransferredSoFar * 100 / totalToTransfer : 0); - final boolean upload = fileName.contains(getString(R.string.upload_folder_path)); - Log.d(LOG_TAG, "progressRate " + percentage); - mHandler.post(new Runnable() { - @Override - public void run() { - TextView progressView = null; - if (upload) { - progressView = findViewById(R.id.upload_progress); - } else { - progressView = findViewById(R.id.download_progress); - } - if (progressView != null) { - progressView.setText(Long.toString(percentage) + "%"); - } - } - }); - } - - // user agent - @SuppressLint("StringFormatInvalid") - private String getUserAgent() { - String appString = getResources().getString(R.string.user_agent); - String packageName = getPackageName(); - String version = ""; - - PackageInfo pInfo; - try { - pInfo = getPackageManager().getPackageInfo(packageName, 0); - if (pInfo != null) { - version = pInfo.versionName; - } - } catch (PackageManager.NameNotFoundException e) { - Log_OC.e(TAG, "Trying to get packageName", e.getCause()); - } - - // Mozilla/5.0 (Android) ownCloud-android/1.7.0 - return String.format(appString, version); - } -} \ No newline at end of file diff --git a/sample_client/AndroidManifest.xml b/sample_client/src/main/AndroidManifest.xml similarity index 82% rename from sample_client/AndroidManifest.xml rename to sample_client/src/main/AndroidManifest.xml index 58d5d6c1..ba0c8247 100644 --- a/sample_client/AndroidManifest.xml +++ b/sample_client/src/main/AndroidManifest.xml @@ -23,15 +23,12 @@ --> - + - - + @@ -42,8 +39,8 @@ android:screenOrientation="portrait" > - - + + diff --git a/sample_client/src/com/owncloud/android/lib/sampleclient/FilesArrayAdapter.java b/sample_client/src/main/java/com/owncloud/android/lib/sampleclient/FilesArrayAdapter.java similarity index 76% rename from sample_client/src/com/owncloud/android/lib/sampleclient/FilesArrayAdapter.java rename to sample_client/src/main/java/com/owncloud/android/lib/sampleclient/FilesArrayAdapter.java index 23806628..4e942719 100644 --- a/sample_client/src/com/owncloud/android/lib/sampleclient/FilesArrayAdapter.java +++ b/sample_client/src/main/java/com/owncloud/android/lib/sampleclient/FilesArrayAdapter.java @@ -1,22 +1,22 @@ /* ownCloud Android Library is available under MIT license * Copyright (C) 2016 ownCloud GmbH. - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: - * + * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. * @@ -32,15 +32,15 @@ import android.widget.TextView; import com.owncloud.android.lib.resources.files.RemoteFile; public class FilesArrayAdapter extends ArrayAdapter { - - public FilesArrayAdapter(Context context, int resource) { - super(context, resource); - } - - public View getView(int position, View convertView, ViewGroup parent) { - TextView textView = (TextView)super.getView(position, convertView, parent); - textView.setText(getItem(position).getRemotePath()); - return textView; - } + + public FilesArrayAdapter(Context context, int resource) { + super(context, resource); + } + + public View getView(int position, View convertView, ViewGroup parent) { + TextView textView = (TextView) super.getView(position, convertView, parent); + textView.setText(getItem(position).getRemotePath()); + return textView; + } } diff --git a/sample_client/src/main/java/com/owncloud/android/lib/sampleclient/MainActivity.java b/sample_client/src/main/java/com/owncloud/android/lib/sampleclient/MainActivity.java new file mode 100644 index 00000000..953699ab --- /dev/null +++ b/sample_client/src/main/java/com/owncloud/android/lib/sampleclient/MainActivity.java @@ -0,0 +1,310 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2019 ownCloud GmbH. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + */ + +package com.owncloud.android.lib.sampleclient; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.pm.PackageInfo; +import android.content.pm.PackageManager; +import android.content.res.AssetManager; +import android.graphics.drawable.BitmapDrawable; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.util.Log; +import android.view.View; +import android.widget.ListView; +import android.widget.TextView; +import android.widget.Toast; + +import com.owncloud.android.lib.common.OwnCloudClient; +import com.owncloud.android.lib.common.OwnCloudClientFactory; +import com.owncloud.android.lib.common.OwnCloudClientManagerFactory; +import com.owncloud.android.lib.common.authentication.OwnCloudCredentialsFactory; +import com.owncloud.android.lib.common.network.OnDatatransferProgressListener; +import com.owncloud.android.lib.common.operations.OnRemoteOperationListener; +import com.owncloud.android.lib.common.operations.RemoteOperation; +import com.owncloud.android.lib.common.operations.RemoteOperationResult; +import com.owncloud.android.lib.common.utils.Log_OC; +import com.owncloud.android.lib.resources.files.DownloadRemoteFileOperation; +import com.owncloud.android.lib.resources.files.FileUtils; +import com.owncloud.android.lib.resources.files.ReadRemoteFolderOperation; +import com.owncloud.android.lib.resources.files.RemoteFile; +import com.owncloud.android.lib.resources.files.RemoveRemoteFileOperation; +import com.owncloud.android.lib.resources.files.UploadRemoteFileOperation; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import static android.content.ContentValues.TAG; + +public class MainActivity extends Activity implements OnRemoteOperationListener, OnDatatransferProgressListener { + + private static String LOG_TAG = MainActivity.class.getCanonicalName(); + + private Handler mHandler; + private OwnCloudClient mClient; + private FilesArrayAdapter mFilesAdapter; + private View mFrame; + + /** + * Called when the activity is first created. + */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.main); + + mHandler = new Handler(); + + final Uri serverUri = Uri.parse(getString(R.string.server_base_url)); + + OwnCloudClientManagerFactory.setUserAgent(getUserAgent()); + mClient = OwnCloudClientFactory.createOwnCloudClient(serverUri, this, true); + + mClient.setCredentials( + OwnCloudCredentialsFactory.newBasicCredentials( + getString(R.string.username), + getString(R.string.password) + ) + ); + + mFilesAdapter = new FilesArrayAdapter(this, R.layout.file_in_list); + ((ListView) findViewById(R.id.list_view)).setAdapter(mFilesAdapter); + + // TODO move to background thread or task + AssetManager assets = getAssets(); + try { + String sampleFileName = getString(R.string.sample_file_name); + File upFolder = new File(getCacheDir(), getString(R.string.upload_folder_path)); + upFolder.mkdir(); + File upFile = new File(upFolder, sampleFileName); + FileOutputStream fos = new FileOutputStream(upFile); + InputStream is = assets.open(sampleFileName); + int count = 0; + byte[] buffer = new byte[1024]; + while ((count = is.read(buffer, 0, buffer.length)) >= 0) { + fos.write(buffer, 0, count); + } + is.close(); + fos.close(); + } catch (IOException e) { + Toast.makeText(this, R.string.error_copying_sample_file, Toast.LENGTH_SHORT).show(); + Log.e(LOG_TAG, getString(R.string.error_copying_sample_file), e); + } + + mFrame = findViewById(R.id.frame); + } + + @Override + public void onDestroy() { + File upFolder = new File(getCacheDir(), getString(R.string.upload_folder_path)); + File upFile = upFolder.listFiles()[0]; + upFile.delete(); + upFolder.delete(); + super.onDestroy(); + } + + public void onClickHandler(View button) { + switch (button.getId()) { + case R.id.button_refresh: + startRefresh(); + break; + case R.id.button_upload: + startUpload(); + break; + case R.id.button_delete_remote: + startRemoteDeletion(); + break; + case R.id.button_download: + startDownload(); + break; + case R.id.button_delete_local: + startLocalDeletion(); + break; + default: + Toast.makeText(this, R.string.youre_doing_it_wrong, Toast.LENGTH_SHORT).show(); + } + } + + private void startRefresh() { + ReadRemoteFolderOperation refreshOperation = new ReadRemoteFolderOperation(FileUtils.PATH_SEPARATOR); + refreshOperation.execute(mClient, this, mHandler); + } + + private void startUpload() { + File upFolder = new File(getCacheDir(), getString(R.string.upload_folder_path)); + File fileToUpload = upFolder.listFiles()[0]; + String remotePath = FileUtils.PATH_SEPARATOR + fileToUpload.getName(); + String mimeType = getString(R.string.sample_file_mimetype); + + // Get the last modification date of the file from the file system + Long timeStampLong = fileToUpload.lastModified() / 1000; + String timeStamp = timeStampLong.toString(); + + UploadRemoteFileOperation uploadOperation = new UploadRemoteFileOperation(fileToUpload.getAbsolutePath(), + remotePath, mimeType, timeStamp); + uploadOperation.addDatatransferProgressListener(this); + uploadOperation.execute(mClient, this, mHandler); + } + + private void startRemoteDeletion() { + File upFolder = new File(getCacheDir(), getString(R.string.upload_folder_path)); + File fileToUpload = upFolder.listFiles()[0]; + String remotePath = FileUtils.PATH_SEPARATOR + fileToUpload.getName(); + + RemoveRemoteFileOperation removeOperation = new RemoveRemoteFileOperation(remotePath); + removeOperation.execute(mClient, this, mHandler); + } + + private void startDownload() { + File downFolder = new File(getCacheDir(), getString(R.string.download_folder_path)); + downFolder.mkdir(); + File upFolder = new File(getCacheDir(), getString(R.string.upload_folder_path)); + File fileToUpload = upFolder.listFiles()[0]; + String remotePath = FileUtils.PATH_SEPARATOR + fileToUpload.getName(); + + DownloadRemoteFileOperation downloadOperation = new DownloadRemoteFileOperation(remotePath, + downFolder.getAbsolutePath()); + downloadOperation.addDatatransferProgressListener(this); + downloadOperation.execute(mClient, this, mHandler); + } + + private void startLocalDeletion() { + File downFolder = new File(getCacheDir(), getString(R.string.download_folder_path)); + File downloadedFile = downFolder.listFiles()[0]; + if (!downloadedFile.delete() && downloadedFile.exists()) { + Toast.makeText(this, R.string.error_deleting_local_file, Toast.LENGTH_SHORT).show(); + } else { + ((TextView) findViewById(R.id.download_progress)).setText("0%"); + findViewById(R.id.frame).setBackgroundDrawable(null); + } + } + + @Override + public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) { + if (!result.isSuccess()) { + Toast.makeText(this, R.string.todo_operation_finished_in_fail, Toast.LENGTH_SHORT).show(); + Log.e(LOG_TAG, result.getLogMessage(), result.getException()); + + } else if (operation instanceof ReadRemoteFolderOperation) { + onSuccessfulRefresh((ReadRemoteFolderOperation) operation, result); + + } else if (operation instanceof com.owncloud.android.lib.resources.files.UploadRemoteFileOperation) { + onSuccessfulUpload((com.owncloud.android.lib.resources.files.UploadRemoteFileOperation) operation, result); + + } else if (operation instanceof RemoveRemoteFileOperation) { + onSuccessfulRemoteDeletion((RemoveRemoteFileOperation) operation, result); + + } else if (operation instanceof DownloadRemoteFileOperation) { + onSuccessfulDownload(); + + } else { + Toast.makeText(this, R.string.todo_operation_finished_in_success, Toast.LENGTH_SHORT).show(); + } + } + + private void onSuccessfulRefresh(ReadRemoteFolderOperation operation, RemoteOperationResult result) { + mFilesAdapter.clear(); + List files = new ArrayList<>(); + for (RemoteFile remoteFile : (List) result.getData()) { + files.add(remoteFile); + } + if (files != null) { + Iterator it = files.iterator(); + while (it.hasNext()) { + mFilesAdapter.add(it.next()); + } + mFilesAdapter.remove(mFilesAdapter.getItem(0)); + } + mFilesAdapter.notifyDataSetChanged(); + } + + private void onSuccessfulUpload(com.owncloud.android.lib.resources.files.UploadRemoteFileOperation operation, RemoteOperationResult result) { + startRefresh(); + } + + private void onSuccessfulRemoteDeletion(RemoveRemoteFileOperation operation, RemoteOperationResult result) { + startRefresh(); + TextView progressView = (TextView) findViewById(R.id.upload_progress); + if (progressView != null) { + progressView.setText("0%"); + } + } + + private void onSuccessfulDownload() { + File downFolder = new File(getCacheDir(), getString(R.string.download_folder_path)); + File downloadedFile = downFolder.listFiles()[0]; + BitmapDrawable bDraw = new BitmapDrawable(getResources(), downloadedFile.getAbsolutePath()); + mFrame.setBackgroundDrawable(bDraw); + } + + @Override + public void onTransferProgress(long progressRate, long totalTransferredSoFar, long totalToTransfer, String fileName) { + final long percentage = (totalToTransfer > 0 ? totalTransferredSoFar * 100 / totalToTransfer : 0); + final boolean upload = fileName.contains(getString(R.string.upload_folder_path)); + Log.d(LOG_TAG, "progressRate " + percentage); + mHandler.post(new Runnable() { + @Override + public void run() { + TextView progressView = null; + if (upload) { + progressView = findViewById(R.id.upload_progress); + } else { + progressView = findViewById(R.id.download_progress); + } + if (progressView != null) { + progressView.setText(Long.toString(percentage) + "%"); + } + } + }); + } + + // user agent + @SuppressLint("StringFormatInvalid") + private String getUserAgent() { + String appString = getResources().getString(R.string.user_agent); + String packageName = getPackageName(); + String version = ""; + + PackageInfo pInfo; + try { + pInfo = getPackageManager().getPackageInfo(packageName, 0); + if (pInfo != null) { + version = pInfo.versionName; + } + } catch (PackageManager.NameNotFoundException e) { + Log_OC.e(TAG, "Trying to get packageName", e.getCause()); + } + + // Mozilla/5.0 (Android) ownCloud-android/1.7.0 + return String.format(appString, version); + } +} \ No newline at end of file diff --git a/sample_client/res/drawable-hdpi/ic_launcher.png b/sample_client/src/main/res/drawable-hdpi/ic_launcher.png similarity index 100% rename from sample_client/res/drawable-hdpi/ic_launcher.png rename to sample_client/src/main/res/drawable-hdpi/ic_launcher.png diff --git a/sample_client/res/drawable-ldpi/ic_launcher.png b/sample_client/src/main/res/drawable-ldpi/ic_launcher.png similarity index 100% rename from sample_client/res/drawable-ldpi/ic_launcher.png rename to sample_client/src/main/res/drawable-ldpi/ic_launcher.png diff --git a/sample_client/res/drawable-mdpi/ic_launcher.png b/sample_client/src/main/res/drawable-mdpi/ic_launcher.png similarity index 100% rename from sample_client/res/drawable-mdpi/ic_launcher.png rename to sample_client/src/main/res/drawable-mdpi/ic_launcher.png diff --git a/sample_client/res/layout/file_in_list.xml b/sample_client/src/main/res/layout/file_in_list.xml similarity index 96% rename from sample_client/res/layout/file_in_list.xml rename to sample_client/src/main/res/layout/file_in_list.xml index 2f988433..4c0703a9 100644 --- a/sample_client/res/layout/file_in_list.xml +++ b/sample_client/src/main/res/layout/file_in_list.xml @@ -22,8 +22,8 @@ THE SOFTWARE. --> - + + android:layout_height="wrap_content" + /> diff --git a/sample_client/res/layout/main.xml b/sample_client/src/main/res/layout/main.xml similarity index 98% rename from sample_client/res/layout/main.xml rename to sample_client/src/main/res/layout/main.xml index e743396b..ed7e2e42 100644 --- a/sample_client/res/layout/main.xml +++ b/sample_client/src/main/res/layout/main.xml @@ -33,58 +33,58 @@ style="@style/ButtonStyle" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" - android:text="@string/refresh" android:onClick="onClickHandler" + android:text="@string/refresh" />