From 27d4da0c0aa78422909470bd617fbaa4f5dd74cc Mon Sep 17 00:00:00 2001 From: Carl Schwan Date: Fri, 2 Oct 2026 16:25:03 +0200 Subject: [PATCH] fix(activity): Use long as id for activity This is already incorrect when there is more than 4.000.000 activity entries in an instance and get even more incorrect once activity are ported to snowflake ids. Assisted-by: ClaudeCode:claude-sonnet-5-5 Signed-off-by: Carl Schwan --- .../activities/GetActivitiesRemoteOperation.java | 5 +++++ .../lib/resources/activities/model/Activity.kt | 3 ++- .../GetActivitiesRemoteOperationTest.java | 16 ++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/library/src/main/java/com/owncloud/android/lib/resources/activities/GetActivitiesRemoteOperation.java b/library/src/main/java/com/owncloud/android/lib/resources/activities/GetActivitiesRemoteOperation.java index bbc81109a2..bd5622d16b 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/activities/GetActivitiesRemoteOperation.java +++ b/library/src/main/java/com/owncloud/android/lib/resources/activities/GetActivitiesRemoteOperation.java @@ -70,6 +70,11 @@ public GetActivitiesRemoteOperation(long fileId, long lastGiven) { this.lastGiven = lastGiven; } + /** + * @deprecated an int cannot hold all activity IDs, use {@link #GetActivitiesRemoteOperation(long, long)} + * with a fileId of -1 instead + */ + @Deprecated public GetActivitiesRemoteOperation(int lastGiven) { this.lastGiven = lastGiven; } diff --git a/library/src/main/java/com/owncloud/android/lib/resources/activities/model/Activity.kt b/library/src/main/java/com/owncloud/android/lib/resources/activities/model/Activity.kt index 4e1399590f..3db5262395 100644 --- a/library/src/main/java/com/owncloud/android/lib/resources/activities/model/Activity.kt +++ b/library/src/main/java/com/owncloud/android/lib/resources/activities/model/Activity.kt @@ -16,8 +16,9 @@ import java.util.Date * Activity Data Model */ data class Activity( + // Accepts both a JSON number and a numeric string; Snowflake IDs need more than 32 bits @SerializedName("activity_id") - val activityId: Int, + val activityId: Long, val datetime: Date, // legacy purposes val date: Date, diff --git a/library/src/test/java/com/owncloud/android/lib/resources/activities/GetActivitiesRemoteOperationTest.java b/library/src/test/java/com/owncloud/android/lib/resources/activities/GetActivitiesRemoteOperationTest.java index d2ca51a63e..ccfea49514 100644 --- a/library/src/test/java/com/owncloud/android/lib/resources/activities/GetActivitiesRemoteOperationTest.java +++ b/library/src/test/java/com/owncloud/android/lib/resources/activities/GetActivitiesRemoteOperationTest.java @@ -43,6 +43,22 @@ public void testParseActivities() { assertEquals("0", firstItem.getObjectId()); } + @Test + public void testParseActivityIdsBeyondInt() { + String activities = "{\"ocs\":{\"meta\":{\"status\":\"ok\",\"statuscode\":200,\"message\":\"OK\"}," + + "\"data\":[{\"activity_id\":130000000000000123,\"user\":\"test\"}," + + "{\"activity_id\":\"130000000000000124\",\"user\":\"test\"}," + + "{\"activity_id\":\"42\",\"user\":\"test\"}]}}"; + + GetActivitiesRemoteOperation sut = new GetActivitiesRemoteOperation(); + ArrayList activityList = sut.parseResult(activities); + + assertEquals(3, activityList.size()); + assertEquals(130000000000000123L, activityList.get(0).getActivityId()); + assertEquals(130000000000000124L, activityList.get(1).getActivityId()); + assertEquals(42L, activityList.get(2).getActivityId()); + } + @Test public void testEmptyString() { String activities = "";