From 3b9472f04086110b845cb18beba54f1cede24ff3 Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Fri, 13 Mar 2026 10:48:59 +0100 Subject: [PATCH 1/2] Delete Tags Signed-off-by: tobiasKaminsky --- .../tags/DeleteTagRemoteOperation.kt | 38 +++++++++++++++++++ .../android/lib/resources/tags/Tag.kt | 6 ++- 2 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 library/src/main/java/com/owncloud/android/lib/resources/tags/DeleteTagRemoteOperation.kt diff --git a/library/src/main/java/com/owncloud/android/lib/resources/tags/DeleteTagRemoteOperation.kt b/library/src/main/java/com/owncloud/android/lib/resources/tags/DeleteTagRemoteOperation.kt new file mode 100644 index 0000000000..eceb3c7e77 --- /dev/null +++ b/library/src/main/java/com/owncloud/android/lib/resources/tags/DeleteTagRemoteOperation.kt @@ -0,0 +1,38 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: MIT + */ +package com.owncloud.android.lib.resources.tags + +import com.nextcloud.common.NextcloudClient +import com.nextcloud.operations.DeleteMethod +import com.owncloud.android.lib.common.operations.RemoteOperation +import com.owncloud.android.lib.common.operations.RemoteOperationResult +import org.apache.commons.httpclient.HttpStatus + +class DeleteTagRemoteOperation( + val id: String, + val fileId: Long +) : RemoteOperation() { + override fun run(client: NextcloudClient): RemoteOperationResult { + val deleteMethod = + DeleteMethod( + client.baseUri.toString() + TAG_URL + fileId + "/" + id, + true + ) + + val status = deleteMethod.execute(client) + + return if (status == HttpStatus.SC_NO_CONTENT) { + RemoteOperationResult(true, deleteMethod) + } else { + RemoteOperationResult(false, deleteMethod) + } + } + + companion object { + const val TAG_URL = "/remote.php/dav/systemtags-relations/files/" + } +} diff --git a/library/src/main/java/com/owncloud/android/lib/resources/tags/Tag.kt b/library/src/main/java/com/owncloud/android/lib/resources/tags/Tag.kt index 4c5b80dbde..4e17d1dabf 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/tags/Tag.kt +++ b/library/src/main/java/com/owncloud/android/lib/resources/tags/Tag.kt @@ -7,8 +7,12 @@ */ package com.owncloud.android.lib.resources.tags +import android.os.Parcelable +import kotlinx.parcelize.Parcelize + +@Parcelize data class Tag( val id: String, val name: String, val color: String? -) +) : Parcelable From 0e8aab9b3f56426fd5e4ffc88242b1dcf44ac0db Mon Sep 17 00:00:00 2001 From: tobiasKaminsky Date: Fri, 13 Mar 2026 12:04:25 +0100 Subject: [PATCH 2/2] test for delete tags Signed-off-by: tobiasKaminsky --- .../tags/DeleteTagRemoteOperationIT.kt | 80 +++++++++++++++++++ .../tags/DeleteTagRemoteOperation.kt | 2 +- 2 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 library/src/androidTest/java/com/owncloud/android/lib/resources/tags/DeleteTagRemoteOperationIT.kt diff --git a/library/src/androidTest/java/com/owncloud/android/lib/resources/tags/DeleteTagRemoteOperationIT.kt b/library/src/androidTest/java/com/owncloud/android/lib/resources/tags/DeleteTagRemoteOperationIT.kt new file mode 100644 index 0000000000..673a1b6651 --- /dev/null +++ b/library/src/androidTest/java/com/owncloud/android/lib/resources/tags/DeleteTagRemoteOperationIT.kt @@ -0,0 +1,80 @@ +/* + * Nextcloud Android Library + * + * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: MIT + */ +package com.owncloud.android.lib.resources.tags + +import com.nextcloud.test.RandomStringGenerator +import com.owncloud.android.AbstractIT +import com.owncloud.android.lib.resources.files.CreateFolderRemoteOperation +import com.owncloud.android.lib.resources.files.ReadFileRemoteOperation +import com.owncloud.android.lib.resources.files.ReadFolderRemoteOperation +import com.owncloud.android.lib.resources.files.model.RemoteFile +import com.owncloud.android.lib.resources.status.NextcloudVersion +import junit.framework.TestCase.assertEquals +import junit.framework.TestCase.assertTrue +import org.junit.Test + +class DeleteTagRemoteOperationIT : AbstractIT() { + companion object { + const val TAG_LENGTH = 10 + } + + @Test + fun deleteTag() { + testOnlyOnServer(NextcloudVersion.nextcloud_31) + + // create a folder + val folder = "/deleteTagFolder/" + assertTrue(CreateFolderRemoteOperation(folder, true).execute(client).isSuccess) + val folderMetadata = ReadFileRemoteOperation(folder).execute(client) + val fileId = (folderMetadata.data[0] as RemoteFile).localId + + // create a tag + val tagName = RandomStringGenerator.make(TAG_LENGTH) + assertTrue( + CreateTagRemoteOperation(tagName) + .execute(nextcloudClient) + .isSuccess + ) + + // find the created tag + val tagsResult = GetTagsRemoteOperation().execute(client) + assertTrue(tagsResult.isSuccess) + val tag = tagsResult.resultData.find { it.name == tagName } + assertTrue(tag != null) + + // assign the tag to the folder + assertTrue( + PutTagRemoteOperation(tag!!.id, fileId) + .execute(nextcloudClient) + .isSuccess + ) + + // verify the tag is on the folder + var rootMetadata = ReadFolderRemoteOperation("/").execute(client) + var folderTags = + (rootMetadata.data as ArrayList) + .find { it.remotePath == folder } + ?.tags + assertEquals(1, folderTags?.size) + assertEquals(tagName, folderTags?.first()?.name) + + // delete the tag from the folder + assertTrue( + DeleteTagRemoteOperation(tag.id, fileId) + .execute(nextcloudClient) + .isSuccess + ) + + // verify the tag is no longer on the folder + rootMetadata = ReadFolderRemoteOperation("/").execute(client) + folderTags = + (rootMetadata.data as ArrayList) + .find { it.remotePath == folder } + ?.tags + assertTrue(folderTags.isNullOrEmpty()) + } +} diff --git a/library/src/main/java/com/owncloud/android/lib/resources/tags/DeleteTagRemoteOperation.kt b/library/src/main/java/com/owncloud/android/lib/resources/tags/DeleteTagRemoteOperation.kt index eceb3c7e77..d627c1a0c4 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/tags/DeleteTagRemoteOperation.kt +++ b/library/src/main/java/com/owncloud/android/lib/resources/tags/DeleteTagRemoteOperation.kt @@ -1,7 +1,7 @@ /* * Nextcloud Android Library * - * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors + * SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors * SPDX-License-Identifier: MIT */ package com.owncloud.android.lib.resources.tags