mirror of
https://github.com/owncloud/android-library.git
synced 2025-06-06 23:46:30 +00:00
Merge pull request #580 from owncloud/release/4.1
[RELEASE] 4.1 library
This commit is contained in:
commit
7eac3ea6b4
@ -49,6 +49,6 @@ ownCloud Android Library uses OkHttp version 4.6.0, licensed under Apache Licens
|
||||
|
||||
### Compatibility
|
||||
|
||||
ownCloud Android Library is valid for Android systems from version Android 5 (android:minSdkVersion="21" android:targetSdkVersion="29").
|
||||
ownCloud Android Library is valid for Android systems from version Android 6 (android:minSdkVersion="23" android:targetSdkVersion="33").
|
||||
|
||||
ownCloud Android library supports ownCloud server from version 4.5.
|
||||
|
@ -25,7 +25,7 @@ android {
|
||||
compileSdkVersion 33
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 21
|
||||
minSdkVersion 23
|
||||
targetSdkVersion 33
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- ownCloud Android Library is available under MIT license
|
||||
Copyright (C) 2016 ownCloud GmbH.
|
||||
Copyright (C) 2023 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,6 @@
|
||||
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
|
||||
<!-- USE_CREDENTIALS, MANAGE_ACCOUNTS and AUTHENTICATE_ACCOUNTS are needed for API < 23.
|
||||
In API >= 23 the do not exist anymore -->
|
||||
<uses-permission
|
||||
android:name="android.permission.MANAGE_ACCOUNTS"
|
||||
android:maxSdkVersion="22" />
|
||||
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
|
||||
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
|
||||
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
||||
|
||||
</manifest>
|
||||
|
@ -36,7 +36,7 @@ import java.net.URL
|
||||
class CopyMethod(
|
||||
val url: URL,
|
||||
private val destinationUrl: String,
|
||||
private val forceOverride: Boolean = false
|
||||
val forceOverride: Boolean = false
|
||||
) : DavMethod(url) {
|
||||
@Throws(Exception::class)
|
||||
public override fun onDavExecute(davResource: DavOCResource): Int {
|
||||
|
@ -36,7 +36,7 @@ import java.net.URL
|
||||
class MoveMethod(
|
||||
url: URL,
|
||||
private val destinationUrl: String,
|
||||
private val forceOverride: Boolean = false
|
||||
val forceOverride: Boolean = false
|
||||
) : DavMethod(url) {
|
||||
@Throws(Exception::class)
|
||||
override fun onDavExecute(davResource: DavOCResource): Int {
|
||||
|
@ -37,14 +37,14 @@ import com.squareup.moshi.Moshi
|
||||
import timber.log.Timber
|
||||
import java.net.URL
|
||||
|
||||
class GetRemoteAppRegistryOperation : RemoteOperation<AppRegistryResponse>() {
|
||||
class GetRemoteAppRegistryOperation(private val appUrl: String?) : RemoteOperation<AppRegistryResponse>() {
|
||||
|
||||
override fun run(client: OwnCloudClient): RemoteOperationResult<AppRegistryResponse> {
|
||||
var result: RemoteOperationResult<AppRegistryResponse>
|
||||
|
||||
try {
|
||||
val uriBuilder = client.baseUri.buildUpon().apply {
|
||||
appendEncodedPath(APP_REGISTRY_ENDPOINT)
|
||||
appendEncodedPath(appUrl)
|
||||
}
|
||||
val getMethod = GetMethod(URL(uriBuilder.build().toString()))
|
||||
val status = client.executeHttpMethod(getMethod)
|
||||
@ -75,8 +75,4 @@ class GetRemoteAppRegistryOperation : RemoteOperation<AppRegistryResponse>() {
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val APP_REGISTRY_ENDPOINT = "app/list"
|
||||
}
|
||||
}
|
||||
|
@ -28,7 +28,7 @@ import com.owncloud.android.lib.resources.Service
|
||||
import com.owncloud.android.lib.resources.appregistry.responses.AppRegistryResponse
|
||||
|
||||
interface AppRegistryService : Service {
|
||||
fun getAppRegistry(): RemoteOperationResult<AppRegistryResponse>
|
||||
fun getAppRegistry(appUrl: String?): RemoteOperationResult<AppRegistryResponse>
|
||||
|
||||
fun getUrlToOpenInWeb(
|
||||
openWebEndpoint: String,
|
||||
|
@ -31,8 +31,8 @@ import com.owncloud.android.lib.resources.appregistry.GetUrlToOpenInWebRemoteOpe
|
||||
import com.owncloud.android.lib.resources.appregistry.responses.AppRegistryResponse
|
||||
|
||||
class OCAppRegistryService(override val client: OwnCloudClient) : AppRegistryService {
|
||||
override fun getAppRegistry(): RemoteOperationResult<AppRegistryResponse> =
|
||||
GetRemoteAppRegistryOperation().execute(client)
|
||||
override fun getAppRegistry(appUrl: String?): RemoteOperationResult<AppRegistryResponse> =
|
||||
GetRemoteAppRegistryOperation(appUrl).execute(client)
|
||||
|
||||
override fun getUrlToOpenInWeb(openWebEndpoint: String, fileId: String, appName: String): RemoteOperationResult<String> =
|
||||
GetUrlToOpenInWebRemoteOperation(
|
||||
|
@ -54,9 +54,8 @@ class CheckPathExistenceRemoteOperation(
|
||||
) : RemoteOperation<Boolean>() {
|
||||
|
||||
override fun run(client: OwnCloudClient): RemoteOperationResult<Boolean> {
|
||||
val baseStringUrl = spaceWebDavUrl ?: if (isUserLoggedIn) client.baseFilesWebDavUri.toString()
|
||||
else client.userFilesWebDavUri.toString()
|
||||
val stringUrl = baseStringUrl + WebdavUtils.encodePath(remotePath)
|
||||
val baseStringUrl = spaceWebDavUrl ?: if (isUserLoggedIn) client.userFilesWebDavUri.toString() else client.baseFilesWebDavUri.toString()
|
||||
val stringUrl = if (isUserLoggedIn) baseStringUrl + WebdavUtils.encodePath(remotePath) else baseStringUrl
|
||||
|
||||
return try {
|
||||
val propFindMethod = PropfindMethod(URL(stringUrl), 0, allPropSet).apply {
|
||||
@ -81,6 +80,7 @@ class CheckPathExistenceRemoteOperation(
|
||||
e,
|
||||
"Existence check for $stringUrl : ${result.logMessage}"
|
||||
)
|
||||
result.data = false
|
||||
result
|
||||
}
|
||||
}
|
||||
|
@ -45,6 +45,7 @@ import java.util.concurrent.TimeUnit
|
||||
* @author Christian Schabesberger
|
||||
* @author David González V.
|
||||
* @author Juan Carlos Garrote Gascón
|
||||
* @author Manuel Plazas Palacio
|
||||
*
|
||||
* @param sourceRemotePath Remote path of the file/folder to copy.
|
||||
* @param targetRemotePath Remote path desired for the file/folder to copy it.
|
||||
@ -54,6 +55,7 @@ class CopyRemoteFileOperation(
|
||||
private val targetRemotePath: String,
|
||||
private val sourceSpaceWebDavUrl: String? = null,
|
||||
private val targetSpaceWebDavUrl: String? = null,
|
||||
private val forceOverride: Boolean = false,
|
||||
) : RemoteOperation<String>() {
|
||||
|
||||
/**
|
||||
@ -74,9 +76,11 @@ class CopyRemoteFileOperation(
|
||||
var result: RemoteOperationResult<String>
|
||||
try {
|
||||
val copyMethod = CopyMethod(
|
||||
URL((sourceSpaceWebDavUrl ?: client.userFilesWebDavUri.toString()) + WebdavUtils.encodePath(sourceRemotePath)),
|
||||
(targetSpaceWebDavUrl ?: client.userFilesWebDavUri.toString()) + WebdavUtils.encodePath(targetRemotePath),
|
||||
url = URL((sourceSpaceWebDavUrl ?: client.userFilesWebDavUri.toString()) + WebdavUtils.encodePath(sourceRemotePath)),
|
||||
destinationUrl = (targetSpaceWebDavUrl ?: client.userFilesWebDavUri.toString()) + WebdavUtils.encodePath(targetRemotePath),
|
||||
forceOverride = forceOverride,
|
||||
).apply {
|
||||
addRequestHeaders(this)
|
||||
setReadTimeout(COPY_READ_TIMEOUT, TimeUnit.SECONDS)
|
||||
setConnectionTimeout(COPY_CONNECTION_TIMEOUT, TimeUnit.SECONDS)
|
||||
}
|
||||
@ -87,6 +91,7 @@ class CopyRemoteFileOperation(
|
||||
result = RemoteOperationResult(ResultCode.OK)
|
||||
result.setData(fileRemoteId)
|
||||
}
|
||||
|
||||
isPreconditionFailed(status) -> {
|
||||
result = RemoteOperationResult(ResultCode.INVALID_OVERWRITE)
|
||||
client.exhaustResponse(copyMethod.getResponseBodyAsStream())
|
||||
@ -94,6 +99,7 @@ class CopyRemoteFileOperation(
|
||||
/// for other errors that could be explicitly handled, check first:
|
||||
/// http://www.webdav.org/specs/rfc4918.html#rfc.section.9.9.4
|
||||
}
|
||||
|
||||
else -> {
|
||||
result = RemoteOperationResult(copyMethod)
|
||||
client.exhaustResponse(copyMethod.getResponseBodyAsStream())
|
||||
@ -107,6 +113,13 @@ class CopyRemoteFileOperation(
|
||||
return result
|
||||
}
|
||||
|
||||
private fun addRequestHeaders(copyMethod: CopyMethod) {
|
||||
//Adding this because the library has an error with override
|
||||
if (copyMethod.forceOverride) {
|
||||
copyMethod.setRequestHeader(OVERWRITE, TRUE)
|
||||
}
|
||||
}
|
||||
|
||||
private fun isSuccess(status: Int) = status.isOneOf(HttpConstants.HTTP_CREATED, HttpConstants.HTTP_NO_CONTENT)
|
||||
|
||||
private fun isPreconditionFailed(status: Int) = status == HttpConstants.HTTP_PRECONDITION_FAILED
|
||||
@ -114,5 +127,7 @@ class CopyRemoteFileOperation(
|
||||
companion object {
|
||||
private const val COPY_READ_TIMEOUT = 10L
|
||||
private const val COPY_CONNECTION_TIMEOUT = 6L
|
||||
private const val OVERWRITE = "overwrite"
|
||||
private const val TRUE = "T"
|
||||
}
|
||||
}
|
||||
|
@ -46,6 +46,7 @@ import java.util.concurrent.TimeUnit
|
||||
* @author David González Verdugo
|
||||
* @author Abel García de Prada
|
||||
* @author Juan Carlos Garrote Gascón
|
||||
* @author Manuel Plazas Palacio
|
||||
*
|
||||
* @param sourceRemotePath Remote path of the file/folder to copy.
|
||||
* @param targetRemotePath Remote path desired for the file/folder to copy it.
|
||||
@ -54,6 +55,7 @@ open class MoveRemoteFileOperation(
|
||||
private val sourceRemotePath: String,
|
||||
private val targetRemotePath: String,
|
||||
private val spaceWebDavUrl: String? = null,
|
||||
private val forceOverride: Boolean = false,
|
||||
) : RemoteOperation<Unit>() {
|
||||
|
||||
/**
|
||||
@ -80,6 +82,7 @@ open class MoveRemoteFileOperation(
|
||||
val moveMethod = MoveMethod(
|
||||
url = URL((spaceWebDavUrl ?: srcWebDavUri.toString()) + WebdavUtils.encodePath(sourceRemotePath)),
|
||||
destinationUrl = (spaceWebDavUrl ?: client.userFilesWebDavUri.toString()) + WebdavUtils.encodePath(targetRemotePath),
|
||||
forceOverride = forceOverride,
|
||||
).apply {
|
||||
addRequestHeaders(this)
|
||||
setReadTimeout(MOVE_READ_TIMEOUT, TimeUnit.SECONDS)
|
||||
@ -92,6 +95,7 @@ open class MoveRemoteFileOperation(
|
||||
isSuccess(status) -> {
|
||||
result = RemoteOperationResult<Unit>(ResultCode.OK)
|
||||
}
|
||||
|
||||
isPreconditionFailed(status) -> {
|
||||
result = RemoteOperationResult<Unit>(ResultCode.INVALID_OVERWRITE)
|
||||
client.exhaustResponse(moveMethod.getResponseBodyAsStream())
|
||||
@ -99,6 +103,7 @@ open class MoveRemoteFileOperation(
|
||||
/// for other errors that could be explicitly handled, check first:
|
||||
/// http://www.webdav.org/specs/rfc4918.html#rfc.section.9.9.4
|
||||
}
|
||||
|
||||
else -> {
|
||||
result = RemoteOperationResult<Unit>(moveMethod)
|
||||
client.exhaustResponse(moveMethod.getResponseBodyAsStream())
|
||||
@ -125,6 +130,10 @@ open class MoveRemoteFileOperation(
|
||||
* In case new headers are needed, override this method
|
||||
*/
|
||||
open fun addRequestHeaders(moveMethod: MoveMethod) {
|
||||
//Adding this because the library has an error with override
|
||||
if (moveMethod.forceOverride) {
|
||||
moveMethod.setRequestHeader(OVERWRITE, TRUE)
|
||||
}
|
||||
}
|
||||
|
||||
private fun isSuccess(status: Int) = status.isOneOf(HttpConstants.HTTP_CREATED, HttpConstants.HTTP_NO_CONTENT)
|
||||
@ -134,5 +143,7 @@ open class MoveRemoteFileOperation(
|
||||
companion object {
|
||||
private const val MOVE_READ_TIMEOUT = 10L
|
||||
private const val MOVE_CONNECTION_TIMEOUT = 6L
|
||||
private const val OVERWRITE = "overwrite"
|
||||
private const val TRUE = "T"
|
||||
}
|
||||
}
|
||||
|
@ -106,7 +106,7 @@ class RenameRemoteFileOperation(
|
||||
* @return 'True' if the target path is already used by an existing file.
|
||||
*/
|
||||
private fun targetPathIsUsed(client: OwnCloudClient): Boolean {
|
||||
val checkPathExistenceRemoteOperation = CheckPathExistenceRemoteOperation(newRemotePath, false)
|
||||
val checkPathExistenceRemoteOperation = CheckPathExistenceRemoteOperation(newRemotePath, true)
|
||||
val exists = checkPathExistenceRemoteOperation.execute(client)
|
||||
return exists.isSuccess
|
||||
}
|
||||
|
@ -39,7 +39,8 @@ interface FileService : Service {
|
||||
targetRemotePath: String,
|
||||
sourceSpaceWebDavUrl: String?,
|
||||
targetSpaceWebDavUrl: String?,
|
||||
): RemoteOperationResult<String>
|
||||
replace: Boolean,
|
||||
): RemoteOperationResult<String?>
|
||||
|
||||
fun createFolder(
|
||||
remotePath: String,
|
||||
@ -57,6 +58,7 @@ interface FileService : Service {
|
||||
sourceRemotePath: String,
|
||||
targetRemotePath: String,
|
||||
spaceWebDavUrl: String?,
|
||||
replace: Boolean,
|
||||
): RemoteOperationResult<Unit>
|
||||
|
||||
fun readFile(
|
||||
|
@ -54,12 +54,14 @@ class OCFileService(override val client: OwnCloudClient) : FileService {
|
||||
targetRemotePath: String,
|
||||
sourceSpaceWebDavUrl: String?,
|
||||
targetSpaceWebDavUrl: String?,
|
||||
): RemoteOperationResult<String> =
|
||||
replace: Boolean,
|
||||
): RemoteOperationResult<String?> =
|
||||
CopyRemoteFileOperation(
|
||||
sourceRemotePath = sourceRemotePath,
|
||||
targetRemotePath = targetRemotePath,
|
||||
sourceSpaceWebDavUrl = sourceSpaceWebDavUrl,
|
||||
targetSpaceWebDavUrl = targetSpaceWebDavUrl,
|
||||
forceOverride = replace,
|
||||
).execute(client)
|
||||
|
||||
override fun createFolder(
|
||||
@ -88,11 +90,13 @@ class OCFileService(override val client: OwnCloudClient) : FileService {
|
||||
sourceRemotePath: String,
|
||||
targetRemotePath: String,
|
||||
spaceWebDavUrl: String?,
|
||||
replace: Boolean,
|
||||
): RemoteOperationResult<Unit> =
|
||||
MoveRemoteFileOperation(
|
||||
sourceRemotePath = sourceRemotePath,
|
||||
targetRemotePath = targetRemotePath,
|
||||
spaceWebDavUrl = spaceWebDavUrl,
|
||||
forceOverride = replace,
|
||||
).execute(client)
|
||||
|
||||
override fun readFile(
|
||||
|
@ -40,7 +40,7 @@ class OCServerInfoService : ServerInfoService {
|
||||
): RemoteOperationResult<Boolean> =
|
||||
CheckPathExistenceRemoteOperation(
|
||||
remotePath = path,
|
||||
isUserLoggedIn = true,
|
||||
isUserLoggedIn = isUserLoggedIn,
|
||||
).execute(client)
|
||||
|
||||
override fun getRemoteStatus(
|
||||
|
Loading…
x
Reference in New Issue
Block a user