From 3d42e7331a23bf3bbc576c6c58a9779dd35cb564 Mon Sep 17 00:00:00 2001 From: Josh Date: Sun, 8 Feb 2026 11:54:19 -0500 Subject: [PATCH 1/7] refactor: use the type-safer readSerializable/readParcelable in Server Signed-off-by: Josh --- app/src/main/java/com/nextcloud/client/account/Server.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/account/Server.kt b/app/src/main/java/com/nextcloud/client/account/Server.kt index 63f4dfb86187..7e0f061bac94 100644 --- a/app/src/main/java/com/nextcloud/client/account/Server.kt +++ b/app/src/main/java/com/nextcloud/client/account/Server.kt @@ -19,8 +19,8 @@ import java.net.URI data class Server(val uri: URI, val version: OwnCloudVersion) : Parcelable { constructor(source: Parcel) : this( - source.readSerializable() as URI, - source.readParcelable(OwnCloudVersion::class.java.classLoader) as OwnCloudVersion + source.readSerializable(URI::class.java.classLoader, java.io.Serializable::class.java) as URI, + source.readParcelable(OwnCloudVersion::class.java.classLoader, OwnCloudVersion::class.java) as OwnCloudVersion ) override fun describeContents() = 0 From 2db59f6364396859ec1f3d029b1379f8ab962e1f Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 9 Feb 2026 08:17:51 -0500 Subject: [PATCH 2/7] feat(parcel): add readSerializableCompat extension function Add readSerializableCompat to ParcableExtensions.kt for type-safe Serializable deserialization using AndroidX ParcelCompat, maintaining consistency with existing readParcelableCompat function. Signed-off-by: Josh --- .../com/nextcloud/utils/extensions/ParcableExtensions.kt | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/app/src/main/java/com/nextcloud/utils/extensions/ParcableExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/ParcableExtensions.kt index 86e1a26b0ad2..72ddb5cd07fd 100644 --- a/app/src/main/java/com/nextcloud/utils/extensions/ParcableExtensions.kt +++ b/app/src/main/java/com/nextcloud/utils/extensions/ParcableExtensions.kt @@ -10,6 +10,7 @@ package com.nextcloud.utils.extensions import android.os.Parcel import android.os.Parcelable import androidx.core.os.ParcelCompat +import java.io.Serializable inline fun Parcel?.readParcelableCompat(classLoader: ClassLoader?): T? { if (this == null) { @@ -18,3 +19,11 @@ inline fun Parcel?.readParcelableCompat(classLoader: Cl return ParcelCompat.readParcelable(this, classLoader, T::class.java) } + +inline fun Parcel?.readSerializableCompat(classLoader: ClassLoader?): T? { + if (this == null) { + return null + } + + return ParcelCompat.readSerializable(this, classLoader, T::class.java) as T? +} From 794e96d436fa5d4ec434780e8458c41372a457b8 Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 9 Feb 2026 08:23:13 -0500 Subject: [PATCH 3/7] chore(client): use ParcableExtensions in Server Signed-off-by: Josh --- app/src/main/java/com/nextcloud/client/account/Server.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/account/Server.kt b/app/src/main/java/com/nextcloud/client/account/Server.kt index 7e0f061bac94..132496a29277 100644 --- a/app/src/main/java/com/nextcloud/client/account/Server.kt +++ b/app/src/main/java/com/nextcloud/client/account/Server.kt @@ -9,6 +9,8 @@ package com.nextcloud.client.account import android.os.Parcel import android.os.Parcelable +import com.nextcloud.utils.extensions.readParcelableCompat +import com.nextcloud.utils.extensions.readSerializableCompat import com.owncloud.android.lib.resources.status.OwnCloudVersion import java.net.URI @@ -19,8 +21,8 @@ import java.net.URI data class Server(val uri: URI, val version: OwnCloudVersion) : Parcelable { constructor(source: Parcel) : this( - source.readSerializable(URI::class.java.classLoader, java.io.Serializable::class.java) as URI, - source.readParcelable(OwnCloudVersion::class.java.classLoader, OwnCloudVersion::class.java) as OwnCloudVersion + source.readSerializableCompat(URI::class.java.classLoader) as URI, + source.readParcelableCompat(OwnCloudVersion::class.java.classLoader) as OwnCloudVersion ) override fun describeContents() = 0 From a1d3fd908cf1c437614b1d6417e7b2b883cd8658 Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 9 Feb 2026 08:27:25 -0500 Subject: [PATCH 4/7] chore(client): use ParcelableExtensions in Request Signed-off-by: Josh --- .../com/nextcloud/client/files/Request.kt | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/files/Request.kt b/app/src/main/java/com/nextcloud/client/files/Request.kt index cc72bcecaf4a..ecd663944910 100644 --- a/app/src/main/java/com/nextcloud/client/files/Request.kt +++ b/app/src/main/java/com/nextcloud/client/files/Request.kt @@ -12,6 +12,8 @@ import android.os.Parcelable import com.nextcloud.client.account.User import com.nextcloud.client.jobs.upload.PostUploadAction import com.nextcloud.client.jobs.upload.UploadTrigger +import com.nextcloud.utils.extensions.readParcelableCompat +import com.nextcloud.utils.extensions.readSerializableCompat import com.owncloud.android.datamodel.OCFile import com.owncloud.android.datamodel.UploadsStorageManager import com.owncloud.android.db.OCUpload @@ -54,10 +56,10 @@ class DownloadRequest internal constructor( ) : this(user, file, UUID.randomUUID(), Direction.DOWNLOAD, test) constructor(parcel: Parcel) : this( - user = parcel.readParcelable(User::class.java.classLoader) as User, - file = parcel.readParcelable(OCFile::class.java.classLoader) as OCFile, - uuid = parcel.readSerializable() as UUID, - type = parcel.readSerializable() as Direction, + user = parcel.readParcelableCompat(User::class.java.classLoader) as User, + file = parcel.readParcelableCompat(OCFile::class.java.classLoader) as OCFile, + uuid = parcel.readSerializableCompat(UUID::class.java.classLoader) as UUID, + type = parcel.readSerializableCompat(Direction::class.java.classLoader) as Direction, test = parcel.readInt() != 0 ) @@ -110,11 +112,11 @@ class UploadRequest internal constructor( ) : this(user, upload, false) constructor(parcel: Parcel) : this( - user = parcel.readParcelable(User::class.java.classLoader) as User, - file = parcel.readParcelable(OCFile::class.java.classLoader) as OCFile, - upload = parcel.readParcelable(OCUpload::class.java.classLoader) as OCUpload, - uuid = parcel.readSerializable() as UUID, - type = parcel.readSerializable() as Direction, + user = parcel.readParcelableCompat(User::class.java.classLoader) as User, + file = parcel.readParcelableCompat(OCFile::class.java.classLoader) as OCFile, + upload = parcel.readParcelableCompat(OCUpload::class.java.classLoader) as OCUpload, + uuid = parcel.readSerializableCompat(UUID::class.java.classLoader) as UUID, + type = parcel.readSerializableCompat(Direction::class.java.classLoader) as Direction, test = parcel.readInt() != 0 ) From 6d5e7c56e085235c688016bc007d28eeba7a9401 Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 9 Feb 2026 08:30:43 -0500 Subject: [PATCH 5/7] chore(client): use ParcelableExtensions in RegisteredUser Signed-off-by: Josh --- .../java/com/nextcloud/client/account/RegisteredUser.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/nextcloud/client/account/RegisteredUser.kt b/app/src/main/java/com/nextcloud/client/account/RegisteredUser.kt index d73a99a747fb..34264d0d34ab 100644 --- a/app/src/main/java/com/nextcloud/client/account/RegisteredUser.kt +++ b/app/src/main/java/com/nextcloud/client/account/RegisteredUser.kt @@ -11,6 +11,7 @@ import android.accounts.Account import android.os.Parcel import android.os.Parcelable import com.owncloud.android.lib.common.OwnCloudAccount +import com.nextcloud.utils.extensions.readParcelableCompat /** * This class represents normal user logged into the Nextcloud server. @@ -30,9 +31,9 @@ internal data class RegisteredUser( } private constructor(source: Parcel) : this( - source.readParcelable(Account::class.java.classLoader) as Account, - source.readParcelable(OwnCloudAccount::class.java.classLoader) as OwnCloudAccount, - source.readParcelable(Server::class.java.classLoader) as Server + source.readParcelableCompat(Account::class.java.classLoader) as Account, + source.readParcelableCompat(OwnCloudAccount::class.java.classLoader) as OwnCloudAccount, + source.readParcelableCompat(Server::class.java.classLoader) as Server ) override val isAnonymous = false From ab4e499ee4ac697fd449ec9ec2c29f374bf526d3 Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 9 Feb 2026 08:33:55 -0500 Subject: [PATCH 6/7] chore: use ParcelCompat in OCFile Signed-off-by: Josh --- .../main/java/com/owncloud/android/datamodel/OCFile.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/owncloud/android/datamodel/OCFile.java b/app/src/main/java/com/owncloud/android/datamodel/OCFile.java index 03d85e22a902..8e0d4e4024f6 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/OCFile.java +++ b/app/src/main/java/com/owncloud/android/datamodel/OCFile.java @@ -41,6 +41,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.FileProvider; +import androidx.core.os.ParcelCompat; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import third_parties.daveKoeller.AlphanumComparator; @@ -199,7 +200,11 @@ private OCFile(Parcel source) { encrypted = source.readInt() == 1; ownerId = source.readString(); ownerDisplayName = source.readString(); - mountType = (WebdavEntry.MountType) source.readSerializable(); + mountType = (WebdavEntry.MountType) ParcelCompat.readSerializable( + source, + WebdavEntry.MountType.class.getClassLoader(), + java.io.Serializable.class + ); richWorkspace = source.readString(); previewAvailable = source.readInt() == 1; firstShareTimestamp = source.readLong(); From 855b057286e587a9500b0524d33e06ace2670307 Mon Sep 17 00:00:00 2001 From: Josh Date: Mon, 9 Feb 2026 08:37:45 -0500 Subject: [PATCH 7/7] chore: use readParcelableCompat consistently in ConflictDialogData Signed-off-by: Josh --- .../owncloud/android/ui/dialog/parcel/ConflictDialogData.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/owncloud/android/ui/dialog/parcel/ConflictDialogData.kt b/app/src/main/java/com/owncloud/android/ui/dialog/parcel/ConflictDialogData.kt index cca5ae12ec55..2997a2bf392a 100644 --- a/app/src/main/java/com/owncloud/android/ui/dialog/parcel/ConflictDialogData.kt +++ b/app/src/main/java/com/owncloud/android/ui/dialog/parcel/ConflictDialogData.kt @@ -22,8 +22,8 @@ data class ConflictDialogData( parcel.readString() ?: "", parcel.readString() ?: "", checkboxData = Pair( - parcel.readParcelableCompat(ConflictFileData::class.java.classLoader) ?: ConflictFileData("", "", ""), - parcel.readParcelableCompat(ConflictFileData::class.java.classLoader) ?: ConflictFileData("", "", "") + parcel.readParcelableCompat(ConflictFileData::class.java.classLoader) ?: ConflictFileData("", "", ""), + parcel.readParcelableCompat(ConflictFileData::class.java.classLoader) ?: ConflictFileData("", "", "") ) )