From 43f613a4bc614d79dc48ec1ce6451f497337a9f2 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Mon, 30 Jun 2025 10:29:59 +0200 Subject: [PATCH 1/5] use json array object Signed-off-by: alperozturk --- .../utils/SharePermissionManagerTest.kt | 16 ++--- .../FileDetailsSharingProcessFragment.kt | 12 +++- .../fragment/util/SharePermissionManager.kt | 69 +++++++++++++++---- gradle/verification-metadata.xml | 16 +++++ 4 files changed, 87 insertions(+), 26 deletions(-) diff --git a/app/src/androidTest/java/com/nextcloud/utils/SharePermissionManagerTest.kt b/app/src/androidTest/java/com/nextcloud/utils/SharePermissionManagerTest.kt index 071adc9915c3..510d443641c9 100644 --- a/app/src/androidTest/java/com/nextcloud/utils/SharePermissionManagerTest.kt +++ b/app/src/androidTest/java/com/nextcloud/utils/SharePermissionManagerTest.kt @@ -7,15 +7,12 @@ package com.nextcloud.utils -import com.google.gson.Gson import com.owncloud.android.datamodel.quickPermission.QuickPermissionType import com.owncloud.android.lib.resources.shares.OCShare import com.owncloud.android.lib.resources.shares.ShareType -import com.owncloud.android.lib.resources.shares.attributes.ShareAttributes import com.owncloud.android.ui.fragment.util.SharePermissionManager import junit.framework.TestCase.assertEquals import junit.framework.TestCase.assertFalse -import junit.framework.TestCase.assertNotNull import junit.framework.TestCase.assertTrue import org.junit.Test @@ -252,17 +249,18 @@ class SharePermissionManagerTest { // region Attributes Tests @Test fun testToggleAllowDownloadAndSyncShouldCreateAttributeJsonIfNoneExists() { - val json = SharePermissionManager.toggleAllowDownloadAndSync(true, null) - assertNotNull(json) - val downloadAttribute = ShareAttributes.createDownloadAttributes(true) - val expectedJson = Gson().toJson(listOf(downloadAttribute)) - assertEquals(json, expectedJson) + val attributes = SharePermissionManager.toggleAllowDownloadAndSync( + isChecked = true, + useV2DownloadAttributes = false, + share = null + ) + assertTrue(SharePermissionManager.isAllowDownloadAndSyncEnabled(attributes, false)) } @Test fun testIsAllowDownloadAndSyncEnabledShouldReturnFalseIfAttributeIsMissing() { val share = createShare(OCShare.READ_PERMISSION_FLAG, attributesJson = null) - assertFalse(SharePermissionManager.isAllowDownloadAndSyncEnabled(share)) + assertFalse(SharePermissionManager.isAllowDownloadAndSyncEnabled(share.attributes, false)) } // endregion } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt index f63e1c6f93b9..00e57d7d43f2 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt @@ -28,6 +28,7 @@ import com.owncloud.android.datamodel.quickPermission.QuickPermissionType import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.lib.resources.shares.OCShare import com.owncloud.android.lib.resources.shares.ShareType +import com.owncloud.android.lib.resources.status.NextcloudVersion import com.owncloud.android.lib.resources.status.OCCapability import com.owncloud.android.ui.activity.FileActivity import com.owncloud.android.ui.dialog.ExpirationDatePickerDialogFragment @@ -629,7 +630,8 @@ class FileDetailsSharingProcessFragment : } if (!isPublicShare()) { - shareAllowDownloadAndSyncCheckbox.isChecked = isAllowDownloadAndSyncEnabled(share) + shareAllowDownloadAndSyncCheckbox.isChecked = + isAllowDownloadAndSyncEnabled(share?.attributes, useV2DownloadAttributes()) } } } @@ -652,7 +654,9 @@ class FileDetailsSharingProcessFragment : if (!isPublicShare()) { binding.shareAllowDownloadAndSyncCheckbox.setOnCheckedChangeListener { _, isChecked -> - val result = SharePermissionManager.toggleAllowDownloadAndSync(isChecked, share) + val result = + SharePermissionManager + .toggleAllowDownloadAndSync(isChecked, useV2DownloadAttributes(), share) share?.attributes = result downloadAttribute = result } @@ -899,5 +903,9 @@ class FileDetailsSharingProcessFragment : (isPublicShare() && capabilities.filesDownloadLimit.isTrue && share?.isFolder == false) private fun isPublicShare(): Boolean = (shareType == ShareType.PUBLIC_LINK) + + private fun useV2DownloadAttributes(): Boolean = capabilities.version + .isNewerOrEqual(NextcloudVersion.nextcloud_30) + // endregion } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/util/SharePermissionManager.kt b/app/src/main/java/com/owncloud/android/ui/fragment/util/SharePermissionManager.kt index 14e8a7dbddc0..2d1c06738ca0 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/util/SharePermissionManager.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/util/SharePermissionManager.kt @@ -12,8 +12,9 @@ import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.lib.resources.shares.OCShare import com.owncloud.android.lib.resources.shares.attributes.ShareAttributes import com.owncloud.android.lib.resources.shares.attributes.ShareAttributesJsonHandler -import com.owncloud.android.lib.resources.shares.attributes.getDownloadAttribute import com.owncloud.android.ui.fragment.FileDetailsSharingProcessFragment.Companion.TAG +import org.json.JSONArray +import org.json.JSONObject object SharePermissionManager { @@ -67,28 +68,66 @@ object SharePermissionManager { // endregion // region DownloadAttribute - fun toggleAllowDownloadAndSync(isChecked: Boolean, share: OCShare?): String? { - val shareAttributes = getShareAttributes(share)?.toMutableList() - if (shareAttributes == null) { - val downloadAttribute = ShareAttributes.createDownloadAttributes(isChecked) - val updatedShareAttributes = listOf(downloadAttribute) - return ShareAttributesJsonHandler.toJson(updatedShareAttributes) + fun toggleAllowDownloadAndSync( + isChecked: Boolean, + useV2DownloadAttributes: Boolean, + share: OCShare? + ): String? { + val jsonArray = if (share?.attributes.isNullOrEmpty()) { + JSONArray() + } else { + JSONArray(share.attributes) } - val downloadAttributeIndex = shareAttributes.indexOf(shareAttributes.getDownloadAttribute()) - if (downloadAttributeIndex >= 0) { - val updatedAttribute = shareAttributes[downloadAttributeIndex].copy(value = isChecked) - shareAttributes[downloadAttributeIndex] = updatedAttribute + val downloadAttr = getDownloadPermissionAttribute(jsonArray) + + if (downloadAttr != null) { + if (useV2DownloadAttributes) { + downloadAttr.put("value", isChecked) + } else { + downloadAttr.put("enabled", isChecked) + } + } else { + val newAttr = JSONObject().apply { + put("key", "download") + put("scope", "permissions") + if (useV2DownloadAttributes) { + put("value", isChecked) + } else { + put("enabled", isChecked) + } + } + jsonArray.put(newAttr) } - return ShareAttributesJsonHandler.toJson(shareAttributes) + return jsonArray.toString() } - fun isAllowDownloadAndSyncEnabled(share: OCShare?): Boolean { - return getShareAttributes(share).getDownloadAttribute()?.value == true + + private fun getDownloadPermissionAttribute(jsonArray: JSONArray): JSONObject? { + for (i in 0 until jsonArray.length()) { + val obj = jsonArray.getJSONObject(i) + if (obj.optString("key") == "download" && obj.optString("scope") == "permissions") { + return obj + } + } + return null + } + + fun isAllowDownloadAndSyncEnabled(attributes: String?, useV2DownloadAttributes: Boolean): Boolean { + if (attributes.isNullOrEmpty()) return false + + val jsonArray = JSONArray(attributes) + val downloadAttr = getDownloadPermissionAttribute(jsonArray) + + return if (useV2DownloadAttributes) { + downloadAttr?.optBoolean("value", false) ?: false + } else { + downloadAttr?.optBoolean("enabled", false) ?: false + } } - private fun getShareAttributes(share: OCShare?): List? { + private fun getShareDownloadAttributes(share: OCShare?): List? { return share?.attributes?.let { ShareAttributesJsonHandler.toList(it) } } // endregion diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 2633a332f18d..ba6f64b567c4 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -13108,6 +13108,14 @@ + + + + + + + + @@ -13484,6 +13492,14 @@ + + + + + + + + From 1182a1e127fa09375ef60b97786c0d5e2c80e6a8 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 1 Jul 2025 09:35:57 +0200 Subject: [PATCH 2/5] use lib extensions Signed-off-by: alperozturk --- .../utils/SharePermissionManagerTest.kt | 16 +++-- .../FileDetailsSharingProcessFragment.kt | 8 +-- .../fragment/util/SharePermissionManager.kt | 69 ------------------- 3 files changed, 15 insertions(+), 78 deletions(-) diff --git a/app/src/androidTest/java/com/nextcloud/utils/SharePermissionManagerTest.kt b/app/src/androidTest/java/com/nextcloud/utils/SharePermissionManagerTest.kt index 510d443641c9..26e7e7d987ab 100644 --- a/app/src/androidTest/java/com/nextcloud/utils/SharePermissionManagerTest.kt +++ b/app/src/androidTest/java/com/nextcloud/utils/SharePermissionManagerTest.kt @@ -10,6 +10,8 @@ package com.nextcloud.utils import com.owncloud.android.datamodel.quickPermission.QuickPermissionType import com.owncloud.android.lib.resources.shares.OCShare import com.owncloud.android.lib.resources.shares.ShareType +import com.owncloud.android.lib.resources.shares.extensions.isAllowDownloadAndSyncEnabled +import com.owncloud.android.lib.resources.shares.extensions.toggleAllowDownloadAndSync import com.owncloud.android.ui.fragment.util.SharePermissionManager import junit.framework.TestCase.assertEquals import junit.framework.TestCase.assertFalse @@ -249,18 +251,22 @@ class SharePermissionManagerTest { // region Attributes Tests @Test fun testToggleAllowDownloadAndSyncShouldCreateAttributeJsonIfNoneExists() { - val attributes = SharePermissionManager.toggleAllowDownloadAndSync( + val ocShare = OCShare().apply { + isFolder = true + shareType = ShareType.USER + permissions = 17 + } + ocShare.attributes = ocShare.toggleAllowDownloadAndSync( isChecked = true, - useV2DownloadAttributes = false, - share = null + useV2DownloadAttributes = false ) - assertTrue(SharePermissionManager.isAllowDownloadAndSyncEnabled(attributes, false)) + assertTrue(ocShare.isAllowDownloadAndSyncEnabled(false)) } @Test fun testIsAllowDownloadAndSyncEnabledShouldReturnFalseIfAttributeIsMissing() { val share = createShare(OCShare.READ_PERMISSION_FLAG, attributesJson = null) - assertFalse(SharePermissionManager.isAllowDownloadAndSyncEnabled(share.attributes, false)) + assertFalse(share.isAllowDownloadAndSyncEnabled(false)) } // endregion } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt index 00e57d7d43f2..954be4dc0436 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt @@ -28,6 +28,8 @@ import com.owncloud.android.datamodel.quickPermission.QuickPermissionType import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.lib.resources.shares.OCShare import com.owncloud.android.lib.resources.shares.ShareType +import com.owncloud.android.lib.resources.shares.extensions.isAllowDownloadAndSyncEnabled +import com.owncloud.android.lib.resources.shares.extensions.toggleAllowDownloadAndSync import com.owncloud.android.lib.resources.status.NextcloudVersion import com.owncloud.android.lib.resources.status.OCCapability import com.owncloud.android.ui.activity.FileActivity @@ -631,7 +633,7 @@ class FileDetailsSharingProcessFragment : if (!isPublicShare()) { shareAllowDownloadAndSyncCheckbox.isChecked = - isAllowDownloadAndSyncEnabled(share?.attributes, useV2DownloadAttributes()) + share?.isAllowDownloadAndSyncEnabled(useV2DownloadAttributes()) == true } } } @@ -654,9 +656,7 @@ class FileDetailsSharingProcessFragment : if (!isPublicShare()) { binding.shareAllowDownloadAndSyncCheckbox.setOnCheckedChangeListener { _, isChecked -> - val result = - SharePermissionManager - .toggleAllowDownloadAndSync(isChecked, useV2DownloadAttributes(), share) + val result = share.toggleAllowDownloadAndSync(isChecked, useV2DownloadAttributes()) share?.attributes = result downloadAttribute = result } diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/util/SharePermissionManager.kt b/app/src/main/java/com/owncloud/android/ui/fragment/util/SharePermissionManager.kt index 2d1c06738ca0..e391341f3bbd 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/util/SharePermissionManager.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/util/SharePermissionManager.kt @@ -10,11 +10,7 @@ package com.owncloud.android.ui.fragment.util import com.owncloud.android.datamodel.quickPermission.QuickPermissionType import com.owncloud.android.lib.common.utils.Log_OC import com.owncloud.android.lib.resources.shares.OCShare -import com.owncloud.android.lib.resources.shares.attributes.ShareAttributes -import com.owncloud.android.lib.resources.shares.attributes.ShareAttributesJsonHandler import com.owncloud.android.ui.fragment.FileDetailsSharingProcessFragment.Companion.TAG -import org.json.JSONArray -import org.json.JSONObject object SharePermissionManager { @@ -67,71 +63,6 @@ object SharePermissionManager { } // endregion - // region DownloadAttribute - fun toggleAllowDownloadAndSync( - isChecked: Boolean, - useV2DownloadAttributes: Boolean, - share: OCShare? - ): String? { - val jsonArray = if (share?.attributes.isNullOrEmpty()) { - JSONArray() - } else { - JSONArray(share.attributes) - } - - val downloadAttr = getDownloadPermissionAttribute(jsonArray) - - if (downloadAttr != null) { - if (useV2DownloadAttributes) { - downloadAttr.put("value", isChecked) - } else { - downloadAttr.put("enabled", isChecked) - } - } else { - val newAttr = JSONObject().apply { - put("key", "download") - put("scope", "permissions") - if (useV2DownloadAttributes) { - put("value", isChecked) - } else { - put("enabled", isChecked) - } - } - jsonArray.put(newAttr) - } - - return jsonArray.toString() - } - - - private fun getDownloadPermissionAttribute(jsonArray: JSONArray): JSONObject? { - for (i in 0 until jsonArray.length()) { - val obj = jsonArray.getJSONObject(i) - if (obj.optString("key") == "download" && obj.optString("scope") == "permissions") { - return obj - } - } - return null - } - - fun isAllowDownloadAndSyncEnabled(attributes: String?, useV2DownloadAttributes: Boolean): Boolean { - if (attributes.isNullOrEmpty()) return false - - val jsonArray = JSONArray(attributes) - val downloadAttr = getDownloadPermissionAttribute(jsonArray) - - return if (useV2DownloadAttributes) { - downloadAttr?.optBoolean("value", false) ?: false - } else { - downloadAttr?.optBoolean("enabled", false) ?: false - } - } - - private fun getShareDownloadAttributes(share: OCShare?): List? { - return share?.attributes?.let { ShareAttributesJsonHandler.toList(it) } - } - // endregion - // region Helper Methods fun canEdit(share: OCShare?): Boolean { if (share == null) { From f1be51bca8df7072996de53c8be5c63665921e1c Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 1 Jul 2025 10:00:02 +0200 Subject: [PATCH 3/5] fix share creation via allow download and sync option Signed-off-by: alperozturk --- .../com/nextcloud/utils/SharePermissionManagerTest.kt | 3 ++- .../ui/fragment/FileDetailsSharingProcessFragment.kt | 2 +- gradle/verification-metadata.xml | 8 ++++++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/src/androidTest/java/com/nextcloud/utils/SharePermissionManagerTest.kt b/app/src/androidTest/java/com/nextcloud/utils/SharePermissionManagerTest.kt index 26e7e7d987ab..2a5abf048e39 100644 --- a/app/src/androidTest/java/com/nextcloud/utils/SharePermissionManagerTest.kt +++ b/app/src/androidTest/java/com/nextcloud/utils/SharePermissionManagerTest.kt @@ -256,7 +256,8 @@ class SharePermissionManagerTest { shareType = ShareType.USER permissions = 17 } - ocShare.attributes = ocShare.toggleAllowDownloadAndSync( + ocShare.attributes = toggleAllowDownloadAndSync( + ocShare.attributes, isChecked = true, useV2DownloadAttributes = false ) diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt index 954be4dc0436..058c37dce067 100644 --- a/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt +++ b/app/src/main/java/com/owncloud/android/ui/fragment/FileDetailsSharingProcessFragment.kt @@ -656,7 +656,7 @@ class FileDetailsSharingProcessFragment : if (!isPublicShare()) { binding.shareAllowDownloadAndSyncCheckbox.setOnCheckedChangeListener { _, isChecked -> - val result = share.toggleAllowDownloadAndSync(isChecked, useV2DownloadAttributes()) + val result = toggleAllowDownloadAndSync(share?.attributes, isChecked, useV2DownloadAttributes()) share?.attributes = result downloadAttribute = result } diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index ba6f64b567c4..23da05560642 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -13276,6 +13276,14 @@ + + + + + + + + From 6b8939b889374a9c4ee99ba449ceabef338da5a2 Mon Sep 17 00:00:00 2001 From: alperozturk Date: Tue, 1 Jul 2025 10:13:20 +0200 Subject: [PATCH 4/5] fix share creation via allow download and sync option Signed-off-by: alperozturk --- gradle/verification-metadata.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 23da05560642..2ba792e9878d 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -13396,6 +13396,14 @@ + + + + + + + + From cdc7cd1bc8d9eeb54a368f4280c4b3950685164c Mon Sep 17 00:00:00 2001 From: alperozturk Date: Fri, 4 Jul 2025 11:58:32 +0200 Subject: [PATCH 5/5] fix verification-metadata.xml Signed-off-by: alperozturk --- build.gradle | 2 +- gradle/verification-metadata.xml | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f2ced65db0aa..e05df1f47c21 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ */ buildscript { ext { - androidLibraryVersion ="0edf15760b8a086ab9969e103c7229dad973efbd" + androidLibraryVersion ="3dbcf59067" androidCommonLibraryVersion = "0.26.0" androidPluginVersion = "8.11.0" androidxMediaVersion = "1.5.1" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 2ba792e9878d..8cc2f75e17f5 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -13092,6 +13092,14 @@ + + + + + + + +