From 0565f3b95d1d2848db2099168a46552ef3358743 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20Garc=C3=ADa=20de=20Prada?= Date: Wed, 21 Dec 2022 19:13:31 +0100 Subject: [PATCH 1/4] Create spaces fetch operation and spaces service --- .../spaces/GetRemoteSpacesOperation.kt | 103 +++++++++++++++++ .../spaces/responses/SpacesResponse.kt | 104 ++++++++++++++++++ .../spaces/services/OCSpacesService.kt | 34 ++++++ .../spaces/services/SpacesService.kt | 31 ++++++ 4 files changed, 272 insertions(+) create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/GetRemoteSpacesOperation.kt create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/services/OCSpacesService.kt create mode 100644 owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/services/SpacesService.kt diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/GetRemoteSpacesOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/GetRemoteSpacesOperation.kt new file mode 100644 index 00000000..46e36a10 --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/GetRemoteSpacesOperation.kt @@ -0,0 +1,103 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2022 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.spaces + +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.nonwebdav.GetMethod +import com.owncloud.android.lib.common.operations.RemoteOperation +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.resources.CommonOcsResponse +import com.owncloud.android.lib.resources.shares.responses.ShareeOcsResponse +import com.owncloud.android.lib.resources.spaces.responses.SpaceResponse +import com.owncloud.android.lib.resources.spaces.responses.SpacesResponseWrapper +import com.squareup.moshi.JsonAdapter +import com.squareup.moshi.Moshi +import com.squareup.moshi.Types +import timber.log.Timber +import java.lang.reflect.Type +import java.net.URL + +class GetRemoteSpacesOperation : RemoteOperation>() { + override fun run(client: OwnCloudClient): RemoteOperationResult> { + val requestUri = buildRequestUri(client.baseUri) + + val getMethod = GetMethod(URL(requestUri.toString())) + + return try { + val status = client.executeHttpMethod(getMethod) + val response = getMethod.getResponseBodyAsString() + + if (isSuccess(status)) { + onRequestSuccessful(response) + } else { + onResultUnsuccessful(getMethod, response, status) + } + } catch (e: Exception) { + Timber.e(e, "Exception while getting remote shares") + RemoteOperationResult(e) + } + } + + private fun buildRequestUri(baseUri: Uri) = + baseUri.buildUpon() + .appendEncodedPath(GRAPH_API_PATH) + .appendEncodedPath(ENDPOINT_SPACES_LIST) + .build() + + private fun parseResponse(response: String): List { + val moshi = Moshi.Builder().build() + val adapter: JsonAdapter = moshi.adapter(SpacesResponseWrapper::class.java) + return adapter.fromJson(response)?.value ?: listOf() + } + + private fun onResultUnsuccessful( + method: GetMethod, + response: String?, + status: Int + ): RemoteOperationResult> { + Timber.e("Failed response while getting spaces for user") + if (response != null) { + Timber.e("*** status code: $status; response message: $response") + } else { + Timber.e("*** status code: $status") + } + return RemoteOperationResult(method) + } + + private fun onRequestSuccessful(response: String?): RemoteOperationResult> { + val result = RemoteOperationResult>(RemoteOperationResult.ResultCode.OK) + Timber.d("Successful response: $response") + result.data = response?.let { parseResponse(it) } ?: listOf() + Timber.d("*** Fetch of spaces completed and parsed to ${result.data}") + return result + } + + private fun isSuccess(status: Int) = status == HttpConstants.HTTP_OK + + companion object { + private const val GRAPH_API_PATH = "graph/v1.0" + private const val ENDPOINT_SPACES_LIST = "me/drives" + } +} diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt new file mode 100644 index 00000000..8ccca7cc --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt @@ -0,0 +1,104 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2022 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.spaces.responses + +import com.squareup.moshi.JsonClass + +@JsonClass(generateAdapter = true) +data class SpacesResponseWrapper( + val value: List +) + +@JsonClass(generateAdapter = true) +data class SpaceResponse( + val description: String?, + val driveAlias: String, + val driveType: String, + val id: String, + val lastModifiedDateTime: String, + val name: String, + val owner: OwnerResponse, + val quota: QuotaResponse, + val root: RootResponse, + val special: List?, + val webUrl: String +) + +@JsonClass(generateAdapter = true) +data class OwnerResponse( + val user: UserResponse +) + +@JsonClass(generateAdapter = true) +data class QuotaResponse( + val remaining: Long, + val state: String, + val total: Int, + val used: Int +) + +@JsonClass(generateAdapter = true) +data class RootResponse( + val eTag: String, + val id: String, + val permissions: List?, + val webDavUrl: String +) + +@JsonClass(generateAdapter = true) +data class SpecialResponse( + val eTag: String, + val file: FileResponse, + val id: String, + val lastModifiedDateTime: String, + val name: String, + val size: Int, + val specialFolder: SpecialFolderResponse, + val webDavUrl: String +) + +@JsonClass(generateAdapter = true) +data class UserResponse( + val id: String +) + +@JsonClass(generateAdapter = true) +data class FileResponse( + val mimeType: String +) + +@JsonClass(generateAdapter = true) +data class GrantedToResponse( + val user: UserResponse +) + +@JsonClass(generateAdapter = true) +data class PermissionResponse( + val grantedTo: List, + val roles: List +) + +@JsonClass(generateAdapter = true) +data class SpecialFolderResponse( + val name: String +) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/services/OCSpacesService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/services/OCSpacesService.kt new file mode 100644 index 00000000..2f29601d --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/services/OCSpacesService.kt @@ -0,0 +1,34 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2022 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.spaces.services + +import com.owncloud.android.lib.common.OwnCloudClient +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.resources.spaces.GetRemoteSpacesOperation +import com.owncloud.android.lib.resources.spaces.responses.SpaceResponse + +class OCSpacesService(override val client: OwnCloudClient) : SpacesService { + override fun getSpaces(): RemoteOperationResult> { + return GetRemoteSpacesOperation().execute(client) + } +} diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/services/SpacesService.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/services/SpacesService.kt new file mode 100644 index 00000000..2384769c --- /dev/null +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/services/SpacesService.kt @@ -0,0 +1,31 @@ +/* ownCloud Android Library is available under MIT license + * Copyright (C) 2022 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.spaces.services + +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import com.owncloud.android.lib.resources.Service +import com.owncloud.android.lib.resources.spaces.responses.SpaceResponse + +interface SpacesService : Service { + fun getSpaces(): RemoteOperationResult> +} From 9e999c19ab807d93d678d9e0460f82971a81fe9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20Garc=C3=ADa=20de=20Prada?= Date: Fri, 23 Dec 2022 11:49:54 +0100 Subject: [PATCH 2/4] Make quota attribute nullable. Its not mandatory --- .../android/lib/resources/spaces/GetRemoteSpacesOperation.kt | 4 ---- .../android/lib/resources/spaces/responses/SpacesResponse.kt | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/GetRemoteSpacesOperation.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/GetRemoteSpacesOperation.kt index 46e36a10..35a6727b 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/GetRemoteSpacesOperation.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/GetRemoteSpacesOperation.kt @@ -28,15 +28,11 @@ import com.owncloud.android.lib.common.http.HttpConstants 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.resources.CommonOcsResponse -import com.owncloud.android.lib.resources.shares.responses.ShareeOcsResponse import com.owncloud.android.lib.resources.spaces.responses.SpaceResponse import com.owncloud.android.lib.resources.spaces.responses.SpacesResponseWrapper import com.squareup.moshi.JsonAdapter import com.squareup.moshi.Moshi -import com.squareup.moshi.Types import timber.log.Timber -import java.lang.reflect.Type import java.net.URL class GetRemoteSpacesOperation : RemoteOperation>() { diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt index 8ccca7cc..7100b552 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt @@ -38,7 +38,7 @@ data class SpaceResponse( val lastModifiedDateTime: String, val name: String, val owner: OwnerResponse, - val quota: QuotaResponse, + val quota: QuotaResponse?, val root: RootResponse, val special: List?, val webUrl: String From f06c0308130ff2ec78a2ed9d1cbaca258cacee0a Mon Sep 17 00:00:00 2001 From: Juan Carlos Garrote Date: Tue, 27 Dec 2022 15:17:44 +0100 Subject: [PATCH 3/4] Some type changes and renamings --- .../android/lib/resources/spaces/responses/SpacesResponse.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt index 7100b552..81bdaa21 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt @@ -53,8 +53,8 @@ data class OwnerResponse( data class QuotaResponse( val remaining: Long, val state: String, - val total: Int, - val used: Int + val total: Long, + val used: Long ) @JsonClass(generateAdapter = true) From 21969fa98c72b1f9fa3336ffa2231aa018ba4961 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abel=20Garc=C3=ADa=20de=20Prada?= Date: Tue, 10 Jan 2023 14:37:48 +0100 Subject: [PATCH 4/4] Fix parsing when space is disabled --- .../resources/spaces/responses/SpacesResponse.kt | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt index 81bdaa21..09235d6e 100644 --- a/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt +++ b/owncloudComLibrary/src/main/java/com/owncloud/android/lib/resources/spaces/responses/SpacesResponse.kt @@ -51,10 +51,10 @@ data class OwnerResponse( @JsonClass(generateAdapter = true) data class QuotaResponse( - val remaining: Long, - val state: String, + val remaining: Long?, + val state: String?, val total: Long, - val used: Long + val used: Long?, ) @JsonClass(generateAdapter = true) @@ -62,7 +62,8 @@ data class RootResponse( val eTag: String, val id: String, val permissions: List?, - val webDavUrl: String + val webDavUrl: String, + val deleted: DeleteResponse?, ) @JsonClass(generateAdapter = true) @@ -92,6 +93,11 @@ data class GrantedToResponse( val user: UserResponse ) +@JsonClass(generateAdapter = true) +data class DeleteResponse( + val state: String, +) + @JsonClass(generateAdapter = true) data class PermissionResponse( val grantedTo: List,