From 2fabe8c5897f417bcff07b690797bff0bc420a79 Mon Sep 17 00:00:00 2001 From: zerox80 Date: Tue, 19 May 2026 21:32:58 +0200 Subject: [PATCH 1/2] fix: send share expiration date in ISO-8601 UTC format to match backend --- .../lib/resources/shares/CreateRemoteShareOperation.kt | 6 ++++-- .../lib/resources/shares/UpdateRemoteShareOperation.kt | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/opencloudComLibrary/src/main/java/eu/opencloud/android/lib/resources/shares/CreateRemoteShareOperation.kt b/opencloudComLibrary/src/main/java/eu/opencloud/android/lib/resources/shares/CreateRemoteShareOperation.kt index 5dcb5d59f8..5448532c2b 100644 --- a/opencloudComLibrary/src/main/java/eu/opencloud/android/lib/resources/shares/CreateRemoteShareOperation.kt +++ b/opencloudComLibrary/src/main/java/eu/opencloud/android/lib/resources/shares/CreateRemoteShareOperation.kt @@ -137,7 +137,9 @@ class CreateRemoteShareOperation( } if (expirationDateInMillis > INIT_EXPIRATION_DATE_IN_MILLIS) { - val dateFormat = SimpleDateFormat(FORMAT_EXPIRATION_DATE, Locale.getDefault()) + val dateFormat = SimpleDateFormat(FORMAT_EXPIRATION_DATE, Locale.getDefault()).apply { + timeZone = java.util.TimeZone.getTimeZone("UTC") + } val expirationDate = Calendar.getInstance() expirationDate.timeInMillis = expirationDateInMillis val formattedExpirationDate = dateFormat.format(expirationDate.time) @@ -197,6 +199,6 @@ class CreateRemoteShareOperation( private const val PARAM_PERMISSIONS = "permissions" //Arguments - constant values - private const val FORMAT_EXPIRATION_DATE = "yyyy-MM-dd" + private const val FORMAT_EXPIRATION_DATE = "yyyy-MM-dd'T'HH:mm:ss'Z'" } } diff --git a/opencloudComLibrary/src/main/java/eu/opencloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt b/opencloudComLibrary/src/main/java/eu/opencloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt index 3834d93530..3fa76d288c 100644 --- a/opencloudComLibrary/src/main/java/eu/opencloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt +++ b/opencloudComLibrary/src/main/java/eu/opencloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt @@ -159,7 +159,9 @@ class UpdateRemoteShareOperation } else if (expirationDateInMillis > INITIAL_EXPIRATION_DATE_IN_MILLIS) { // set expiration date - val dateFormat = SimpleDateFormat(FORMAT_EXPIRATION_DATE, Locale.getDefault()) + val dateFormat = SimpleDateFormat(FORMAT_EXPIRATION_DATE, Locale.getDefault()).apply { + timeZone = java.util.TimeZone.getTimeZone("UTC") + } val expirationDate = Calendar.getInstance() expirationDate.timeInMillis = expirationDateInMillis val formattedExpirationDate = dateFormat.format(expirationDate.time) @@ -216,7 +218,7 @@ class UpdateRemoteShareOperation private const val PARAM_PERMISSIONS = "permissions" //Arguments - constant values - private const val FORMAT_EXPIRATION_DATE = "yyyy-MM-dd" + private const val FORMAT_EXPIRATION_DATE = "yyyy-MM-dd'T'HH:mm:ss'Z'" private const val INITIAL_EXPIRATION_DATE_IN_MILLIS: Long = 0 } } From 929d7ce1ff3fe1b14b1fcda1873e1f6c2ff5b1d0 Mon Sep 17 00:00:00 2001 From: zerox80 Date: Tue, 19 May 2026 21:43:11 +0200 Subject: [PATCH 2/2] docs: add comments explaining necessity of ISO-8601 UTC format for backend compatibility --- .../android/lib/resources/shares/CreateRemoteShareOperation.kt | 3 +++ .../android/lib/resources/shares/UpdateRemoteShareOperation.kt | 3 +++ 2 files changed, 6 insertions(+) diff --git a/opencloudComLibrary/src/main/java/eu/opencloud/android/lib/resources/shares/CreateRemoteShareOperation.kt b/opencloudComLibrary/src/main/java/eu/opencloud/android/lib/resources/shares/CreateRemoteShareOperation.kt index 5448532c2b..75a63bc497 100644 --- a/opencloudComLibrary/src/main/java/eu/opencloud/android/lib/resources/shares/CreateRemoteShareOperation.kt +++ b/opencloudComLibrary/src/main/java/eu/opencloud/android/lib/resources/shares/CreateRemoteShareOperation.kt @@ -199,6 +199,9 @@ class CreateRemoteShareOperation( private const val PARAM_PERMISSIONS = "permissions" //Arguments - constant values + // ISO-8601 UTC format is required by the backend to correctly parse expiration dates, + // especially for private user/group share creations and updates, ensuring compatibility + // when these features are eventually exposed in the mobile UI. private const val FORMAT_EXPIRATION_DATE = "yyyy-MM-dd'T'HH:mm:ss'Z'" } } diff --git a/opencloudComLibrary/src/main/java/eu/opencloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt b/opencloudComLibrary/src/main/java/eu/opencloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt index 3fa76d288c..62e5a2bf51 100644 --- a/opencloudComLibrary/src/main/java/eu/opencloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt +++ b/opencloudComLibrary/src/main/java/eu/opencloud/android/lib/resources/shares/UpdateRemoteShareOperation.kt @@ -218,6 +218,9 @@ class UpdateRemoteShareOperation private const val PARAM_PERMISSIONS = "permissions" //Arguments - constant values + // ISO-8601 UTC format is required by the backend to correctly parse expiration dates, + // especially for private user/group share creations and updates, ensuring compatibility + // when these features are eventually exposed in the mobile UI. private const val FORMAT_EXPIRATION_DATE = "yyyy-MM-dd'T'HH:mm:ss'Z'" private const val INITIAL_EXPIRATION_DATE_IN_MILLIS: Long = 0 }