From 8169861cae4d7805abfb64423bcc2fa0210d2d34 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 7 May 2026 10:34:55 +0200 Subject: [PATCH 01/12] wip Signed-off-by: alperozturk96 --- .../com/nextcloud/test/FileDeletionTests.kt | 49 ++++++++++--------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt b/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt index a24c592a12d4..4bc946fb1a9c 100644 --- a/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt +++ b/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt @@ -25,19 +25,17 @@ import kotlin.random.Random @Suppress("TooManyFunctions", "MagicNumber") class FileDeletionTests : AbstractIT() { - private lateinit var tempDir: File + private val createdFilePaths = mutableListOf() @Before fun setup() { - val parent = System.getProperty("java.io.tmpdir") - val childPath = "file_deletion_test_${System.currentTimeMillis()}" - tempDir = File(parent, childPath) - tempDir.mkdirs() + createdFilePaths.clear() } @After fun cleanup() { - tempDir.deleteRecursively() + createdFilePaths.forEach { File(it).delete() } + createdFilePaths.clear() } private fun getRandomRemoteId(): String = Random @@ -45,6 +43,17 @@ class FileDeletionTests : AbstractIT() { .toString() .padEnd(32, '0') + private fun createFileAtExpectedPath(ocFile: OCFile, content: String = "Temporary test content"): File { + val expectedPath = FileStorageUtils.getDefaultSavePathFor(user.accountName, ocFile) + val localFile = File(expectedPath).apply { + parentFile?.mkdirs() + createNewFile() + writeText(content) + } + createdFilePaths.add(localFile.absolutePath) + return localFile + } + private fun createAndSaveSingleFileWithLocalCopy(): OCFile { val now = System.currentTimeMillis() @@ -59,11 +68,7 @@ class FileDeletionTests : AbstractIT() { permissions = "RWDNV" } - val localFile = File(tempDir, "TestFile_${file.fileId}.txt").apply { - parentFile?.mkdirs() - createNewFile() - writeText("Temporary test content") - } + val localFile = createFileAtExpectedPath(file) file.storagePath = localFile.absolutePath storageManager.saveFile(file) @@ -117,11 +122,11 @@ class FileDeletionTests : AbstractIT() { listOf(rootFolder, subFolder, file1, file2).forEach { storageManager.saveFile(it) } - val file1Path = File(tempDir, "file1_${file1.fileId}.txt").apply { createNewFile() } - val file2Path = File(tempDir, "file2_${file2.fileId}.txt").apply { createNewFile() } + val localFile1 = createFileAtExpectedPath(file1) + val localFile2 = createFileAtExpectedPath(file2) - file1.storagePath = file1Path.absolutePath - file2.storagePath = file2Path.absolutePath + file1.storagePath = localFile1.absolutePath + file2.storagePath = localFile2.absolutePath storageManager.saveFile(file1) storageManager.saveFile(file2) @@ -179,22 +184,18 @@ class FileDeletionTests : AbstractIT() { list.forEach { ocFile -> if (!ocFile.isFolder) { - val localFile = File(tempDir, ocFile.remoteId).apply { - parentFile?.mkdirs() - createNewFile() - writeText("test content") - } + val localFile = createFileAtExpectedPath(ocFile, "test content") ocFile.storagePath = localFile.absolutePath storageManager.saveFile(ocFile) } else { - // For folders, create the folder in tempDir - val localFolder = File(tempDir, ocFile.remoteId).apply { mkdirs() } - ocFile.storagePath = localFolder.absolutePath storageManager.saveFile(ocFile) } } - return list + return list.sortedWith( + compareBy { it.isFolder } + .thenByDescending { it.remotePath.count { c -> c == '/' } } + ) } @Test From 4f85ff3cec4f0e920cabcc5018727771695be64e Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 7 May 2026 13:15:37 +0200 Subject: [PATCH 02/12] wip Signed-off-by: alperozturk96 --- .../java/com/nextcloud/test/FileDeletionTests.kt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt b/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt index 4bc946fb1a9c..51f0e39245b3 100644 --- a/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt +++ b/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt @@ -156,6 +156,7 @@ class FileDeletionTests : AbstractIT() { mimeType = mime modificationTimestamp = now permissions = "RWDNV" + storagePath = FileStorageUtils.getDefaultSavePathFor(user.accountName, this) } val list = mutableListOf() @@ -184,8 +185,12 @@ class FileDeletionTests : AbstractIT() { list.forEach { ocFile -> if (!ocFile.isFolder) { - val localFile = createFileAtExpectedPath(ocFile, "test content") - ocFile.storagePath = localFile.absolutePath + val localFile = File(ocFile.storagePath).apply { + parentFile?.mkdirs() + createNewFile() + writeText("test content") + } + createdFilePaths.add(localFile.absolutePath) storageManager.saveFile(ocFile) } else { storageManager.saveFile(ocFile) From cbd3a409fd70fc1309ac722e861042edb64d39eb Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 7 May 2026 15:50:53 +0200 Subject: [PATCH 03/12] wip Signed-off-by: alperozturk96 --- .../com/nextcloud/test/FileDeletionTests.kt | 101 +++++++++--------- 1 file changed, 49 insertions(+), 52 deletions(-) diff --git a/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt b/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt index 51f0e39245b3..a8fa2be402a4 100644 --- a/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt +++ b/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt @@ -137,67 +137,64 @@ class FileDeletionTests : AbstractIT() { private fun getMixedOcFiles(): List { val now = System.currentTimeMillis() - fun createFolder(id: Long, parentId: Long, path: String): OCFile = OCFile(path).apply { - fileId = id + fun saveFolder(parentId: Long, path: String): OCFile = OCFile(path).apply { this.parentId = parentId remoteId = getRandomRemoteId() mimeType = MimeType.DIRECTORY creationTimestamp = now modificationTimestamp = now permissions = "RWDNVCK" - } - - fun createFile(id: Long, parentId: Long, path: String, size: Long, mime: String): OCFile = OCFile(path).apply { - fileId = id - this.parentId = parentId - remoteId = getRandomRemoteId() - fileLength = size - creationTimestamp = now - mimeType = mime - modificationTimestamp = now - permissions = "RWDNV" - storagePath = FileStorageUtils.getDefaultSavePathFor(user.accountName, this) - } - - val list = mutableListOf() - - list.add(createFolder(1, 0, "/")) - - list.add(createFolder(5, 2, "/Documents/Projects")) - list.add(createFile(9, 5, "/Documents/Projects/spec.txt", 12000, MimeType.TEXT_PLAIN)) - list.add(createFolder(2, 1, "/Documents")) - list.add(createFile(11, 7, "/Photos/Vacation/img2.jpg", 300000, MimeType.JPEG)) - list.add(createFolder(7, 3, "/Photos/Vacation")) - list.add(createFile(4, 2, "/Documents/example.pdf", 150000, MimeType.PDF)) - list.add(createFolder(3, 1, "/Photos")) - list.add(createFile(12, 3, "/Photos/cover.png", 80000, MimeType.PNG)) - list.add(createFile(6, 5, "/Documents/Projects/readme.txt", 2000, MimeType.TEXT_PLAIN)) - list.add(createFolder(8, 5, "/Documents/Projects/Archive")) - list.add(createFile(13, 8, "/Documents/Projects/Archive/old.bmp", 900000, MimeType.BMP)) - list.add(createFile(10, 7, "/Photos/Vacation/img1.jpg", 250000, MimeType.JPEG)) - list.add(createFolder(14, 1, "/Temp")) - list.add(createFile(15, 14, "/Temp/tmp_file_1.txt", 400, MimeType.TEXT_PLAIN)) - list.add(createFile(16, 14, "/Temp/tmp_file_2.txt", 800, MimeType.TEXT_PLAIN)) - list.add(createFolder(17, 14, "/Temp/Nested")) - list.add(createFile(18, 17, "/Temp/Nested/deep.txt", 100, MimeType.TEXT_PLAIN)) - list.add(createFile(19, 2, "/Documents/notes.txt", 1500, MimeType.TEXT_PLAIN)) - list.add(createFolder(20, 3, "/Photos/EmptyFolder")) - - list.forEach { ocFile -> - if (!ocFile.isFolder) { - val localFile = File(ocFile.storagePath).apply { - parentFile?.mkdirs() - createNewFile() - writeText("test content") - } - createdFilePaths.add(localFile.absolutePath) - storageManager.saveFile(ocFile) - } else { - storageManager.saveFile(ocFile) + }.also { storageManager.saveFile(it) } + + fun saveFileWithLocalCopy(parentId: Long, path: String, size: Long, mime: String): OCFile { + val ocFile = OCFile(path).apply { + this.parentId = parentId + remoteId = getRandomRemoteId() + fileLength = size + creationTimestamp = now + mimeType = mime + modificationTimestamp = now + permissions = "RWDNV" + storagePath = FileStorageUtils.getDefaultSavePathFor(user.accountName, this) + } + val localFile = File(ocFile.storagePath).apply { + parentFile?.mkdirs() + createNewFile() + writeText("test content") } + createdFilePaths.add(localFile.absolutePath) + storageManager.saveFile(ocFile) + return ocFile } - return list.sortedWith( + val root = saveFolder(0, "/") + val documents = saveFolder(root.fileId, "/Documents") + val photos = saveFolder(root.fileId, "/Photos") + val temp = saveFolder(root.fileId, "/Temp") + val projects = saveFolder(documents.fileId, "/Documents/Projects") + val vacation = saveFolder(photos.fileId, "/Photos/Vacation") + val archive = saveFolder(projects.fileId, "/Documents/Projects/Archive") + val nested = saveFolder(temp.fileId, "/Temp/Nested") + val emptyFolder = saveFolder(photos.fileId, "/Photos/EmptyFolder") + + val allEntries = mutableListOf(root, documents, photos, temp, projects, vacation, archive, nested, emptyFolder) + + allEntries.add(saveFileWithLocalCopy(projects.fileId, "/Documents/Projects/spec.txt", 12000, + MimeType.TEXT_PLAIN)) + allEntries.add(saveFileWithLocalCopy(vacation.fileId, "/Photos/Vacation/img2.jpg", 300000, MimeType.JPEG)) + allEntries.add(saveFileWithLocalCopy(documents.fileId, "/Documents/example.pdf", 150000, MimeType.PDF)) + allEntries.add(saveFileWithLocalCopy(photos.fileId, "/Photos/cover.png", 80000, MimeType.PNG)) + allEntries.add(saveFileWithLocalCopy(projects.fileId, "/Documents/Projects/readme.txt", 2000, + MimeType.TEXT_PLAIN)) + allEntries.add(saveFileWithLocalCopy(archive.fileId, "/Documents/Projects/Archive/old.bmp", 900000, + MimeType.BMP)) + allEntries.add(saveFileWithLocalCopy(vacation.fileId, "/Photos/Vacation/img1.jpg", 250000, MimeType.JPEG)) + allEntries.add(saveFileWithLocalCopy(temp.fileId, "/Temp/tmp_file_1.txt", 400, MimeType.TEXT_PLAIN)) + allEntries.add(saveFileWithLocalCopy(temp.fileId, "/Temp/tmp_file_2.txt", 800, MimeType.TEXT_PLAIN)) + allEntries.add(saveFileWithLocalCopy(nested.fileId, "/Temp/Nested/deep.txt", 100, MimeType.TEXT_PLAIN)) + allEntries.add(saveFileWithLocalCopy(documents.fileId, "/Documents/notes.txt", 1500, MimeType.TEXT_PLAIN)) + + return allEntries.sortedWith( compareBy { it.isFolder } .thenByDescending { it.remotePath.count { c -> c == '/' } } ) From e0ab114a785b92782cfe6142e806dcda4d4436e9 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 7 May 2026 16:08:38 +0200 Subject: [PATCH 04/12] Rename .java to .kt Signed-off-by: alperozturk96 --- .../java/com/owncloud/android/{DownloadIT.java => DownloadIT.kt} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename app/src/androidTest/java/com/owncloud/android/{DownloadIT.java => DownloadIT.kt} (100%) diff --git a/app/src/androidTest/java/com/owncloud/android/DownloadIT.java b/app/src/androidTest/java/com/owncloud/android/DownloadIT.kt similarity index 100% rename from app/src/androidTest/java/com/owncloud/android/DownloadIT.java rename to app/src/androidTest/java/com/owncloud/android/DownloadIT.kt From b1d0c2becd98ffc17e3cc28e136b65f3af7b579b Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 7 May 2026 16:08:38 +0200 Subject: [PATCH 05/12] wip Signed-off-by: alperozturk96 --- .../com/nextcloud/test/FileDeletionTests.kt | 30 +++- .../java/com/owncloud/android/DownloadIT.kt | 159 +++++++++--------- 2 files changed, 106 insertions(+), 83 deletions(-) diff --git a/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt b/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt index a8fa2be402a4..9ade2d21c80e 100644 --- a/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt +++ b/app/src/androidTest/java/com/nextcloud/test/FileDeletionTests.kt @@ -179,15 +179,33 @@ class FileDeletionTests : AbstractIT() { val allEntries = mutableListOf(root, documents, photos, temp, projects, vacation, archive, nested, emptyFolder) - allEntries.add(saveFileWithLocalCopy(projects.fileId, "/Documents/Projects/spec.txt", 12000, - MimeType.TEXT_PLAIN)) + allEntries.add( + saveFileWithLocalCopy( + projects.fileId, + "/Documents/Projects/spec.txt", + 12000, + MimeType.TEXT_PLAIN + ) + ) allEntries.add(saveFileWithLocalCopy(vacation.fileId, "/Photos/Vacation/img2.jpg", 300000, MimeType.JPEG)) allEntries.add(saveFileWithLocalCopy(documents.fileId, "/Documents/example.pdf", 150000, MimeType.PDF)) allEntries.add(saveFileWithLocalCopy(photos.fileId, "/Photos/cover.png", 80000, MimeType.PNG)) - allEntries.add(saveFileWithLocalCopy(projects.fileId, "/Documents/Projects/readme.txt", 2000, - MimeType.TEXT_PLAIN)) - allEntries.add(saveFileWithLocalCopy(archive.fileId, "/Documents/Projects/Archive/old.bmp", 900000, - MimeType.BMP)) + allEntries.add( + saveFileWithLocalCopy( + projects.fileId, + "/Documents/Projects/readme.txt", + 2000, + MimeType.TEXT_PLAIN + ) + ) + allEntries.add( + saveFileWithLocalCopy( + archive.fileId, + "/Documents/Projects/Archive/old.bmp", + 900000, + MimeType.BMP + ) + ) allEntries.add(saveFileWithLocalCopy(vacation.fileId, "/Photos/Vacation/img1.jpg", 250000, MimeType.JPEG)) allEntries.add(saveFileWithLocalCopy(temp.fileId, "/Temp/tmp_file_1.txt", 400, MimeType.TEXT_PLAIN)) allEntries.add(saveFileWithLocalCopy(temp.fileId, "/Temp/tmp_file_2.txt", 800, MimeType.TEXT_PLAIN)) diff --git a/app/src/androidTest/java/com/owncloud/android/DownloadIT.kt b/app/src/androidTest/java/com/owncloud/android/DownloadIT.kt index f8fd99517f1c..21c26a726f0b 100644 --- a/app/src/androidTest/java/com/owncloud/android/DownloadIT.kt +++ b/app/src/androidTest/java/com/owncloud/android/DownloadIT.kt @@ -6,103 +6,108 @@ * SPDX-FileCopyrightText: 2020 Nextcloud GmbH * SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only */ -package com.owncloud.android; - -import android.net.Uri; - -import com.owncloud.android.datamodel.OCFile; -import com.owncloud.android.db.OCUpload; -import com.owncloud.android.lib.common.operations.RemoteOperationResult; -import com.owncloud.android.operations.DownloadFileOperation; -import com.owncloud.android.operations.RefreshFolderOperation; -import com.owncloud.android.operations.RemoveFileOperation; -import com.owncloud.android.utils.FileStorageUtils; - -import org.junit.After; -import org.junit.Test; - -import java.io.File; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNotSame; -import static org.junit.Assert.assertTrue; - -/** - * Tests related to file downloads. - */ -public class DownloadIT extends AbstractOnServerIT { - private static final String FOLDER = "/testUpload/"; - +package com.owncloud.android + +import android.net.Uri +import com.owncloud.android.datamodel.OCFile +import com.owncloud.android.db.OCUpload +import com.owncloud.android.operations.DownloadFileOperation +import com.owncloud.android.operations.RefreshFolderOperation +import com.owncloud.android.operations.RemoveFileOperation +import com.owncloud.android.utils.FileStorageUtils +import org.junit.After +import org.junit.Assert +import org.junit.Test +import java.io.File + +class DownloadIT : AbstractOnServerIT() { @After - public void after() { - RemoteOperationResult result = new RefreshFolderOperation(getStorageManager().getFileByPath("/"), - System.currentTimeMillis() / 1000L, - false, - true, - getStorageManager(), - user, - targetContext) - .execute(client); + override fun after() { + val result = RefreshFolderOperation( + storageManager.getFileByPath("/"), + System.currentTimeMillis() / 1000L, + false, + true, + storageManager, + user, + targetContext + ) + .execute(client) // cleanup only if folder exists - if (result.isSuccess() && getStorageManager().getFileByDecryptedRemotePath(FOLDER) != null) { - new RemoveFileOperation(getStorageManager().getFileByDecryptedRemotePath(FOLDER), - false, - user, - false, - targetContext, - getStorageManager()) - .execute(client); + if (result.isSuccess && storageManager.getFileByDecryptedRemotePath(FOLDER) != null) { + RemoveFileOperation( + storageManager.getFileByDecryptedRemotePath(FOLDER)!!, + false, + user, + false, + targetContext, + storageManager + ) + .execute(client) } } @Test - public void verifyDownload() { - OCUpload ocUpload = new OCUpload(FileStorageUtils.getTemporalPath(account.name) + "/nonEmpty.txt", - FOLDER + "nonEmpty.txt", - account.name); + fun verifyDownload() { + val ocUpload = OCUpload( + FileStorageUtils.getTemporalPath(account.name) + "/nonEmpty.txt", + FOLDER + "nonEmpty.txt", + account.name + ) - uploadOCUpload(ocUpload); + uploadOCUpload(ocUpload) - OCUpload ocUpload2 = new OCUpload(FileStorageUtils.getTemporalPath(account.name) + "/nonEmpty.txt", - FOLDER + "nonEmpty2.txt", - account.name); + val ocUpload2 = OCUpload( + FileStorageUtils.getTemporalPath(account.name) + "/nonEmpty.txt", + FOLDER + "nonEmpty2.txt", + account.name + ) - uploadOCUpload(ocUpload2); + uploadOCUpload(ocUpload2) - refreshFolder("/"); - refreshFolder(FOLDER); + refreshFolder(FOLDER) - OCFile file1 = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty.txt"); - OCFile file2 = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty2.txt"); - verifyDownload(file1, file2); + var file1 = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty.txt") + var file2 = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty2.txt") - assertTrue(new DownloadFileOperation(user, file1, targetContext).execute(client).isSuccess()); - assertTrue(new DownloadFileOperation(user, file2, targetContext).execute(client).isSuccess()); + val operation1 = DownloadFileOperation(user, file1, targetContext) + val operation1Result = operation1.execute(client) + Assert.assertTrue(operation1Result.isSuccess) - refreshFolder(FOLDER); + val operation2 = DownloadFileOperation(user, file2, targetContext) + val operation2Result = operation2.execute(client) + Assert.assertTrue(operation2Result.isSuccess) - file1 = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty.txt"); - file2 = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty2.txt"); + refreshFolder(FOLDER) + file1 = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty.txt") + file2 = fileDataStorageManager.getFileByDecryptedRemotePath(FOLDER + "nonEmpty2.txt") - verifyDownload(file1, file2); + verifyDownload(file1, file2) } - private void verifyDownload(OCFile file1, OCFile file2) { - assertNotNull(file1); - assertNotNull(file2); - assertNotSame(file1.getStoragePath(), file2.getStoragePath()); + private fun verifyDownload(file1: OCFile?, file2: OCFile?) { + Assert.assertNotNull(file1) + Assert.assertNotNull(file2) + Assert.assertNotSame(file1!!.storagePath, file2!!.storagePath) - assertTrue(new File(file1.getStoragePath()).exists()); - assertTrue(new File(file2.getStoragePath()).exists()); + Assert.assertTrue(File(file1.storagePath).exists()) + Assert.assertTrue(File(file2.storagePath).exists()) // test against hardcoded path to make sure that it is correct - assertEquals("/storage/emulated/0/Android/media/"+targetContext.getPackageName()+"/nextcloud/" + - Uri.encode(account.name, "@") + "/testUpload/nonEmpty.txt", - file1.getStoragePath()); - assertEquals("/storage/emulated/0/Android/media/"+targetContext.getPackageName()+"/nextcloud/" + - Uri.encode(account.name, "@") + "/testUpload/nonEmpty2.txt", - file2.getStoragePath()); + Assert.assertEquals( + "/storage/emulated/0/Android/media/" + targetContext.packageName + "/nextcloud/" + + Uri.encode(account.name, "@") + "/testUpload/nonEmpty.txt", + file1.storagePath + ) + Assert.assertEquals( + "/storage/emulated/0/Android/media/" + targetContext.packageName + "/nextcloud/" + + Uri.encode(account.name, "@") + "/testUpload/nonEmpty2.txt", + file2.storagePath + ) + } + + companion object { + private const val FOLDER = "/testUpload/" } } From 984416cc44807d79437002f9f16aa186dfa95a08 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Thu, 7 May 2026 16:17:07 +0200 Subject: [PATCH 06/12] wip Signed-off-by: alperozturk96 --- .../datamodel/UploadStorageManagerTest.kt | 20 +++---------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt b/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt index dd1b256c86d6..956008004988 100644 --- a/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt +++ b/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt @@ -12,10 +12,6 @@ package com.owncloud.android.datamodel import android.accounts.Account import android.accounts.AccountManager import android.content.ActivityNotFoundException -import android.content.Context -import androidx.test.core.app.ApplicationProvider -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.filters.SmallTest import com.nextcloud.client.account.CurrentAccountProvider import com.nextcloud.client.account.User import com.nextcloud.client.account.UserAccountManager @@ -33,25 +29,16 @@ import org.junit.After import org.junit.Assert import org.junit.Before import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.Mock +import org.mockito.Mockito.mock import org.mockito.MockitoAnnotations import java.io.File import java.util.Random import java.util.UUID import java.util.function.Supplier -/** - * Created by JARP on 6/7/17. - */ -@RunWith(AndroidJUnit4::class) -@SmallTest class UploadStorageManagerTest : AbstractIT() { private lateinit var uploadsStorageManager: UploadsStorageManager - @Mock - private lateinit var currentAccountProvider: CurrentAccountProvider - private lateinit var userAccountManager: UserAccountManager private lateinit var user2: User @@ -60,9 +47,8 @@ class UploadStorageManagerTest : AbstractIT() { fun setUp() { MockitoAnnotations.openMocks(this) - val instrumentationCtx = ApplicationProvider.getApplicationContext() - val contentResolver = instrumentationCtx.contentResolver - uploadsStorageManager = UploadsStorageManager(currentAccountProvider, contentResolver) + val currentAccountProvider = mock(CurrentAccountProvider::class.java) + uploadsStorageManager = UploadsStorageManager(currentAccountProvider, targetContext.contentResolver) userAccountManager = UserAccountManagerImpl.fromContext(targetContext) val temp = Account("test2@test.com", MainApp.getAccountType(targetContext)) From 6259d473eaed5ad4cbea1df8607b2611c0524845 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 8 May 2026 08:20:06 +0200 Subject: [PATCH 07/12] wip Signed-off-by: alperozturk96 --- .../datamodel/UploadStorageManagerTest.kt | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt b/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt index 956008004988..d177c6be9b30 100644 --- a/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt +++ b/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt @@ -37,9 +37,13 @@ import java.util.UUID import java.util.function.Supplier class UploadStorageManagerTest : AbstractIT() { - private lateinit var uploadsStorageManager: UploadsStorageManager + private val uploadsStorageManager: UploadsStorageManager by lazy { + UploadsStorageManager(mock(CurrentAccountProvider::class.java), targetContext.contentResolver) + } - private lateinit var userAccountManager: UserAccountManager + private val userAccountManager: UserAccountManager by lazy { + UserAccountManagerImpl.fromContext(targetContext) + } private lateinit var user2: User @@ -47,10 +51,6 @@ class UploadStorageManagerTest : AbstractIT() { fun setUp() { MockitoAnnotations.openMocks(this) - val currentAccountProvider = mock(CurrentAccountProvider::class.java) - uploadsStorageManager = UploadsStorageManager(currentAccountProvider, targetContext.contentResolver) - userAccountManager = UserAccountManagerImpl.fromContext(targetContext) - val temp = Account("test2@test.com", MainApp.getAccountType(targetContext)) if (!userAccountManager.exists(temp)) { val platformAccountManager = AccountManager.get(targetContext) @@ -65,7 +65,6 @@ class UploadStorageManagerTest : AbstractIT() { platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_USER_ID, "test") // same as userId } - val userAccountManager: UserAccountManager = UserAccountManagerImpl.fromContext(targetContext) user2 = userAccountManager.getUser("test2@test.com") .orElseThrow(Supplier { ActivityNotFoundException() }) } @@ -220,6 +219,8 @@ class UploadStorageManagerTest : AbstractIT() { @After fun tearDown() { deleteAllUploads() - userAccountManager.removeUser(user2) + if (::user2.isInitialized) { + userAccountManager.removeUser(user2) + } } } From 9d6aff9a6da1c1cf2f7f6f4d4af1c2e6f5fa2d18 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 8 May 2026 10:17:49 +0200 Subject: [PATCH 08/12] wip Signed-off-by: alperozturk96 --- .../java/com/owncloud/android/AbstractOnServerIT.java | 6 +++--- .../androidTest/java/com/owncloud/android/DownloadIT.kt | 7 ++++--- .../owncloud/android/operations/UploadFileOperation.java | 2 ++ 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java b/app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java index 1b0e1b8d3c17..09fafceb8c13 100644 --- a/app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java +++ b/app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java @@ -205,12 +205,12 @@ public void uploadOCUpload(OCUpload ocUpload, int localBehaviour) { ConnectivityService connectivityServiceMock = new ConnectivityService() { @Override public void isNetworkAndServerAvailable(@NonNull GenericCallback callback) { - + callback.onComplete(true); } @Override public boolean isConnected() { - return false; + return true; } @Override @@ -248,7 +248,7 @@ public boolean isPowerSavingEnabled() { user, null, ocUpload, - NameCollisionPolicy.DEFAULT, + NameCollisionPolicy.OVERWRITE, localBehaviour, targetContext, false, diff --git a/app/src/androidTest/java/com/owncloud/android/DownloadIT.kt b/app/src/androidTest/java/com/owncloud/android/DownloadIT.kt index 21c26a726f0b..e5c3591597c4 100644 --- a/app/src/androidTest/java/com/owncloud/android/DownloadIT.kt +++ b/app/src/androidTest/java/com/owncloud/android/DownloadIT.kt @@ -18,7 +18,8 @@ import com.owncloud.android.utils.FileStorageUtils import org.junit.After import org.junit.Assert import org.junit.Test -import java.io.File +import kotlin.io.path.Path +import kotlin.io.path.exists class DownloadIT : AbstractOnServerIT() { @After @@ -91,8 +92,8 @@ class DownloadIT : AbstractOnServerIT() { Assert.assertNotNull(file2) Assert.assertNotSame(file1!!.storagePath, file2!!.storagePath) - Assert.assertTrue(File(file1.storagePath).exists()) - Assert.assertTrue(File(file2.storagePath).exists()) + Assert.assertTrue(Path(file1.storagePath).exists()) + Assert.assertTrue(Path(file2.storagePath).exists()) // test against hardcoded path to make sure that it is correct Assert.assertEquals( diff --git a/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java b/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java index 3e5cfcfa101d..3a9d0bc0a766 100644 --- a/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java +++ b/app/src/main/java/com/owncloud/android/operations/UploadFileOperation.java @@ -1510,6 +1510,8 @@ public static String getNewAvailableRemotePath(OwnCloudClient client, int count = 2; boolean exists; String newPath; + + // FIXME: Causing infinite loop during tests due to ExistenceCheckRemoteOperation result do { suffix = " (" + count + ")"; newPath = extPos >= 0 ? remotePathWithoutExtension + suffix + "." + extension : remotePath + suffix; From 0ddffbbea9cd9cf95d427f1ed3f7ed37977ffc4a Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 8 May 2026 10:26:00 +0200 Subject: [PATCH 09/12] wip Signed-off-by: alperozturk96 --- .../java/com/owncloud/android/AbstractIT.java | 2 +- .../owncloud/android/AbstractOnServerIT.java | 2 +- .../java/com/owncloud/android/UploadIT.java | 2 +- .../datamodel/UploadStorageManagerTest.kt | 19 +++++-------------- .../android/files/services/FileUploaderIT.kt | 2 +- .../com/nextcloud/client/di/AppModule.java | 2 +- .../nextcloud/client/jobs/HealthStatusWork.kt | 2 +- .../datamodel/UploadsStorageManager.kt | 7 +------ gradle.properties | 6 +++--- 9 files changed, 15 insertions(+), 29 deletions(-) diff --git a/app/src/androidTest/java/com/owncloud/android/AbstractIT.java b/app/src/androidTest/java/com/owncloud/android/AbstractIT.java index ac58ccc05fc9..ac3034ba7466 100644 --- a/app/src/androidTest/java/com/owncloud/android/AbstractIT.java +++ b/app/src/androidTest/java/com/owncloud/android/AbstractIT.java @@ -406,7 +406,7 @@ public boolean isPowerSavingEnabled() { }; UserAccountManager accountManager = UserAccountManagerImpl.fromContext(targetContext); - UploadsStorageManager uploadsStorageManager = new UploadsStorageManager(accountManager, + UploadsStorageManager uploadsStorageManager = new UploadsStorageManager(accountManager.getUser(), targetContext.getContentResolver()); UploadFileOperation newUpload = new UploadFileOperation( diff --git a/app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java b/app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java index 09fafceb8c13..a0fec015f04e 100644 --- a/app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java +++ b/app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java @@ -238,7 +238,7 @@ public boolean isPowerSavingEnabled() { }; UserAccountManager accountManager = UserAccountManagerImpl.fromContext(targetContext); - UploadsStorageManager uploadsStorageManager = new UploadsStorageManager(accountManager, + UploadsStorageManager uploadsStorageManager = new UploadsStorageManager(accountManager.getUser(), targetContext.getContentResolver()); UploadFileOperation newUpload = new UploadFileOperation( diff --git a/app/src/androidTest/java/com/owncloud/android/UploadIT.java b/app/src/androidTest/java/com/owncloud/android/UploadIT.java index 8072bb5c1805..c6253d7fbd25 100644 --- a/app/src/androidTest/java/com/owncloud/android/UploadIT.java +++ b/app/src/androidTest/java/com/owncloud/android/UploadIT.java @@ -52,7 +52,7 @@ public class UploadIT extends AbstractOnServerIT { private static final String FOLDER = "/testUpload/"; private UploadsStorageManager uploadsStorageManager = - new UploadsStorageManager(UserAccountManagerImpl.fromContext(targetContext), + new UploadsStorageManager(UserAccountManagerImpl.fromContext(targetContext).getUser(), targetContext.getContentResolver()); private ConnectivityService connectivityServiceMock = new ConnectivityService() { diff --git a/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt b/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt index d177c6be9b30..9996a66e7f5a 100644 --- a/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt +++ b/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt @@ -12,7 +12,6 @@ package com.owncloud.android.datamodel import android.accounts.Account import android.accounts.AccountManager import android.content.ActivityNotFoundException -import com.nextcloud.client.account.CurrentAccountProvider import com.nextcloud.client.account.User import com.nextcloud.client.account.UserAccountManager import com.nextcloud.client.account.UserAccountManagerImpl @@ -29,7 +28,6 @@ import org.junit.After import org.junit.Assert import org.junit.Before import org.junit.Test -import org.mockito.Mockito.mock import org.mockito.MockitoAnnotations import java.io.File import java.util.Random @@ -37,20 +35,14 @@ import java.util.UUID import java.util.function.Supplier class UploadStorageManagerTest : AbstractIT() { - private val uploadsStorageManager: UploadsStorageManager by lazy { - UploadsStorageManager(mock(CurrentAccountProvider::class.java), targetContext.contentResolver) - } - - private val userAccountManager: UserAccountManager by lazy { - UserAccountManagerImpl.fromContext(targetContext) - } - + private lateinit var uploadsStorageManager: UploadsStorageManager + private lateinit var userAccountManager: UserAccountManager private lateinit var user2: User @Before fun setUp() { MockitoAnnotations.openMocks(this) - + userAccountManager = UserAccountManagerImpl.fromContext(targetContext) val temp = Account("test2@test.com", MainApp.getAccountType(targetContext)) if (!userAccountManager.exists(temp)) { val platformAccountManager = AccountManager.get(targetContext) @@ -64,9 +56,9 @@ class UploadStorageManagerTest : AbstractIT() { platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_OC_BASE_URL, "test.com") platformAccountManager.setUserData(temp, AccountUtils.Constants.KEY_USER_ID, "test") // same as userId } - user2 = userAccountManager.getUser("test2@test.com") .orElseThrow(Supplier { ActivityNotFoundException() }) + uploadsStorageManager = UploadsStorageManager(user2, targetContext.contentResolver) } @Test @@ -212,14 +204,13 @@ class UploadStorageManagerTest : AbstractIT() { private fun deleteAllUploads() { uploadsStorageManager.removeAllUploads() - Assert.assertEquals(0, uploadsStorageManager.getAllStoredUploads().size.toLong()) } @After fun tearDown() { - deleteAllUploads() if (::user2.isInitialized) { + deleteAllUploads() userAccountManager.removeUser(user2) } } diff --git a/app/src/androidTest/java/com/owncloud/android/files/services/FileUploaderIT.kt b/app/src/androidTest/java/com/owncloud/android/files/services/FileUploaderIT.kt index 00c568d506ad..ce5097c0ee44 100644 --- a/app/src/androidTest/java/com/owncloud/android/files/services/FileUploaderIT.kt +++ b/app/src/androidTest/java/com/owncloud/android/files/services/FileUploaderIT.kt @@ -54,7 +54,7 @@ abstract class FileUploaderIT : AbstractOnServerIT() { fun setUp() { val contentResolver = targetContext.contentResolver val accountManager: UserAccountManager = UserAccountManagerImpl.fromContext(targetContext) - uploadsStorageManager = UploadsStorageManager(accountManager, contentResolver) + uploadsStorageManager = UploadsStorageManager(accountManager.user, contentResolver) } // /** diff --git a/app/src/main/java/com/nextcloud/client/di/AppModule.java b/app/src/main/java/com/nextcloud/client/di/AppModule.java index 58dee51ee036..04751e996454 100644 --- a/app/src/main/java/com/nextcloud/client/di/AppModule.java +++ b/app/src/main/java/com/nextcloud/client/di/AppModule.java @@ -137,7 +137,7 @@ FilesRepository filesRepository(UserAccountManager accountManager, ClientFactory @Provides UploadsStorageManager uploadsStorageManager(CurrentAccountProvider currentAccountProvider, Context context) { - return new UploadsStorageManager(currentAccountProvider, context.getContentResolver()); + return new UploadsStorageManager(currentAccountProvider.getUser(), context.getContentResolver()); } @Provides diff --git a/app/src/main/java/com/nextcloud/client/jobs/HealthStatusWork.kt b/app/src/main/java/com/nextcloud/client/jobs/HealthStatusWork.kt index 2e0fadbf73d3..a18fd7b8a547 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/HealthStatusWork.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/HealthStatusWork.kt @@ -98,7 +98,7 @@ class HealthStatusWork( } private fun collectUploadProblems(user: User, errorCodes: List): List { - val uploadsStorageManager = UploadsStorageManager(userAccountManager, context.contentResolver) + val uploadsStorageManager = UploadsStorageManager(userAccountManager.user, context.contentResolver) val problems = uploadsStorageManager .getUploadsForAccount(user.accountName) diff --git a/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.kt b/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.kt index e294114fb003..137312d40dbc 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.kt +++ b/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.kt @@ -21,7 +21,6 @@ import android.database.Cursor import android.os.Handler import android.os.Looper import androidx.annotation.VisibleForTesting -import com.nextcloud.client.account.CurrentAccountProvider import com.nextcloud.client.account.User import com.nextcloud.client.database.NextcloudDatabase import com.nextcloud.client.database.dao.UploadDao @@ -47,7 +46,7 @@ import java.util.Observable @Suppress("TooManyFunctions", "TooGenericExceptionCaught", "MagicNumber", "ReturnCount") class UploadsStorageManager( - private val currentAccountProvider: CurrentAccountProvider, + private val user: User, private val contentResolver: ContentResolver ) : Observable() { @@ -417,7 +416,6 @@ class UploadsStorageManager( getUploads(ProviderTableMeta.UPLOADS_ACCOUNT_NAME + IS_EQUAL, accountName) fun clearFailedButNotDelayedUploads() { - val user = currentAccountProvider.user val deleted = contentResolver.delete( ProviderTableMeta.CONTENT_URI_UPLOADS, ProviderTableMeta.UPLOADS_STATUS + EQUAL + UploadStatus.UPLOAD_FAILED.value + @@ -436,7 +434,6 @@ class UploadsStorageManager( } fun clearCancelledUploadsForCurrentAccount() { - val user = currentAccountProvider.user val deleted = contentResolver.delete( ProviderTableMeta.CONTENT_URI_UPLOADS, ProviderTableMeta.UPLOADS_STATUS + EQUAL + UploadStatus.UPLOAD_CANCELLED.value + @@ -448,7 +445,6 @@ class UploadsStorageManager( } fun clearSuccessfulUploads() { - val user = currentAccountProvider.user val deleted = contentResolver.delete( ProviderTableMeta.CONTENT_URI_UPLOADS, ProviderTableMeta.UPLOADS_STATUS + EQUAL + UploadStatus.UPLOAD_SUCCEEDED.value + @@ -460,7 +456,6 @@ class UploadsStorageManager( } fun clearSkippedUploads() { - val user = currentAccountProvider.user val deleted = contentResolver.delete( ProviderTableMeta.CONTENT_URI_UPLOADS, ProviderTableMeta.UPLOADS_STATUS + EQUAL + UploadStatus.UPLOAD_SUCCEEDED.value + diff --git a/gradle.properties b/gradle.properties index dd9ffff87b42..1f80d7b14987 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,9 +2,9 @@ # SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only # can be overriden by ~/.gradle/gradle.properties -NC_TEST_SERVER_BASEURL=http://server -NC_TEST_SERVER_USERNAME=test -NC_TEST_SERVER_PASSWORD=test +NC_TEST_SERVER_BASEURL=http://10.0.2.2:55000 +NC_TEST_SERVER_USERNAME=admin +NC_TEST_SERVER_PASSWORD=password android.useAndroidX=true android.nonTransitiveRClass=true #android.debug.obsoleteApi=true From 33870377ae4768bdeb78eed9f3d0524cb49f12a4 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 8 May 2026 11:09:28 +0200 Subject: [PATCH 10/12] wip Signed-off-by: alperozturk96 --- gradle.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle.properties b/gradle.properties index 1f80d7b14987..dd9ffff87b42 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,9 +2,9 @@ # SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only # can be overriden by ~/.gradle/gradle.properties -NC_TEST_SERVER_BASEURL=http://10.0.2.2:55000 -NC_TEST_SERVER_USERNAME=admin -NC_TEST_SERVER_PASSWORD=password +NC_TEST_SERVER_BASEURL=http://server +NC_TEST_SERVER_USERNAME=test +NC_TEST_SERVER_PASSWORD=test android.useAndroidX=true android.nonTransitiveRClass=true #android.debug.obsoleteApi=true From 84bcbd4cc9822abbf2421cde643224a59c080977 Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 8 May 2026 13:08:11 +0200 Subject: [PATCH 11/12] wip Signed-off-by: alperozturk96 --- .../com/nextcloud/utils/UploadDateTests.kt | 68 +++++++++++++++---- .../datamodel/UploadsStorageManager.kt | 5 +- 2 files changed, 56 insertions(+), 17 deletions(-) diff --git a/app/src/androidTest/java/com/nextcloud/utils/UploadDateTests.kt b/app/src/androidTest/java/com/nextcloud/utils/UploadDateTests.kt index be7cf735a580..795148f2b3e5 100644 --- a/app/src/androidTest/java/com/nextcloud/utils/UploadDateTests.kt +++ b/app/src/androidTest/java/com/nextcloud/utils/UploadDateTests.kt @@ -14,16 +14,13 @@ import androidx.test.platform.app.InstrumentationRegistry import com.nextcloud.client.database.entity.UploadEntity import com.nextcloud.client.database.entity.toOCUpload import com.nextcloud.client.database.entity.toUploadEntity -import com.nextcloud.utils.date.DateFormatPattern import com.owncloud.android.R import com.owncloud.android.utils.DisplayUtils import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull import org.junit.Before import org.junit.Test -import java.text.SimpleDateFormat import java.util.Date -import java.util.Locale class UploadDateTests { @@ -97,12 +94,12 @@ class UploadDateTests { @Test fun getRelativeDateTimeStringReturnsFutureAsAbsoluteWhenShowFutureIsFalse() { - val formatter = SimpleDateFormat("MMM d, yyyy h:mm:ss a", Locale.US) - val expected = formatter.format(Date(System.currentTimeMillis() + ONE_MINUTE)) + val time = System.currentTimeMillis() + ONE_MINUTE + val expected = java.text.DateFormat.getDateTimeInstance().format(Date(time)) val result = DisplayUtils.getRelativeDateTimeString( context, - System.currentTimeMillis() + ONE_MINUTE, + time, DateUtils.SECOND_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, 0, @@ -130,8 +127,19 @@ class UploadDateTests { @Test fun getRelativeDateTimeStringReturnsAbbreviatedStringForOneWeekAgo() { val time = System.currentTimeMillis() - ONE_WEEK - val formatter = SimpleDateFormat(DateFormatPattern.MonthWithDate.pattern, Locale.US) - val expected = formatter.format(Date(time)) + val expectedString = DateUtils.getRelativeDateTimeString( + context, + time, + DateUtils.MINUTE_IN_MILLIS, + DateUtils.WEEK_IN_MILLIS, + 0 + ).toString() + val parts = expectedString.split(",") + val expected = if (parts.size == 2) { + if (parts[1].contains(":") && !parts[0].contains(":")) parts[0].trim() else parts[1].trim() + } else { + expectedString + } assertRelativeDateTimeString(time, expected) } @@ -139,8 +147,19 @@ class UploadDateTests { @Test fun getRelativeDateTimeStringReturnsAbbreviatedStringForOneMonthAgo() { val time = System.currentTimeMillis() - ONE_MONTH - val formatter = SimpleDateFormat(DateFormatPattern.MonthWithDate.pattern, Locale.US) - val expected = formatter.format(Date(time)) + val expectedString = DateUtils.getRelativeDateTimeString( + context, + time, + DateUtils.SECOND_IN_MILLIS, + DateUtils.WEEK_IN_MILLIS, + 0 + ).toString() + val parts = expectedString.split(",") + val expected = if (parts.size == 2) { + if (parts[1].contains(":") && !parts[0].contains(":")) parts[0].trim() else parts[1].trim() + } else { + expectedString + } assertRelativeDateTimeString(time, expected, DateUtils.SECOND_IN_MILLIS) } @@ -148,8 +167,19 @@ class UploadDateTests { @Test fun getRelativeDateTimeStringReturnsAbsoluteStringForOneYearAgo() { val time = System.currentTimeMillis() - ONE_YEAR - val formatter = SimpleDateFormat("M/d/YYYY", Locale.US) - val expected = formatter.format(Date(time)) + val expectedString = DateUtils.getRelativeDateTimeString( + context, + time, + DateUtils.SECOND_IN_MILLIS, + DateUtils.WEEK_IN_MILLIS, + 0 + ).toString() + val parts = expectedString.split(",") + val expected = if (parts.size == 2) { + if (parts[1].contains(":") && !parts[0].contains(":")) parts[0].trim() else parts[1].trim() + } else { + expectedString + } assertRelativeDateTimeString(time, expected, DateUtils.SECOND_IN_MILLIS) } @@ -194,7 +224,19 @@ class UploadDateTests { assertEquals(expected, result) testTimestamp = System.currentTimeMillis() - 7 * DateUtils.DAY_IN_MILLIS - expected = SimpleDateFormat(DateFormatPattern.MonthWithDate.pattern, Locale.US).format(testTimestamp) + val expectedString = DateUtils.getRelativeDateTimeString( + context, + testTimestamp, + DateUtils.DAY_IN_MILLIS, + DateUtils.WEEK_IN_MILLIS, + 0 + ).toString() + val parts = expectedString.split(",") + expected = if (parts.size == 2) { + if (parts[1].contains(":") && !parts[0].contains(":")) parts[0].trim() else parts[1].trim() + } else { + expectedString + } result = DisplayUtils.getRelativeDateTimeString( context, testTimestamp, diff --git a/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.kt b/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.kt index 137312d40dbc..744e95fa73f7 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.kt +++ b/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.kt @@ -45,10 +45,7 @@ import java.util.Locale import java.util.Observable @Suppress("TooManyFunctions", "TooGenericExceptionCaught", "MagicNumber", "ReturnCount") -class UploadsStorageManager( - private val user: User, - private val contentResolver: ContentResolver -) : Observable() { +class UploadsStorageManager(private val user: User, private val contentResolver: ContentResolver) : Observable() { private var capability: OCCapability? = null From 715971581d26c7537c2d678cb10759abd1dba06f Mon Sep 17 00:00:00 2001 From: alperozturk96 Date: Fri, 8 May 2026 13:29:02 +0200 Subject: [PATCH 12/12] wip Signed-off-by: alperozturk96 --- .../java/com/owncloud/android/AbstractIT.java | 2 +- .../java/com/owncloud/android/AbstractOnServerIT.java | 2 +- .../java/com/owncloud/android/UploadIT.java | 2 +- .../android/datamodel/UploadStorageManagerTest.kt | 6 +++++- .../owncloud/android/files/services/FileUploaderIT.kt | 2 +- .../main/java/com/nextcloud/client/di/AppModule.java | 2 +- .../java/com/nextcloud/client/jobs/HealthStatusWork.kt | 2 +- .../android/datamodel/UploadsStorageManager.kt | 10 +++++++++- 8 files changed, 20 insertions(+), 8 deletions(-) diff --git a/app/src/androidTest/java/com/owncloud/android/AbstractIT.java b/app/src/androidTest/java/com/owncloud/android/AbstractIT.java index ac3034ba7466..ac58ccc05fc9 100644 --- a/app/src/androidTest/java/com/owncloud/android/AbstractIT.java +++ b/app/src/androidTest/java/com/owncloud/android/AbstractIT.java @@ -406,7 +406,7 @@ public boolean isPowerSavingEnabled() { }; UserAccountManager accountManager = UserAccountManagerImpl.fromContext(targetContext); - UploadsStorageManager uploadsStorageManager = new UploadsStorageManager(accountManager.getUser(), + UploadsStorageManager uploadsStorageManager = new UploadsStorageManager(accountManager, targetContext.getContentResolver()); UploadFileOperation newUpload = new UploadFileOperation( diff --git a/app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java b/app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java index a0fec015f04e..09fafceb8c13 100644 --- a/app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java +++ b/app/src/androidTest/java/com/owncloud/android/AbstractOnServerIT.java @@ -238,7 +238,7 @@ public boolean isPowerSavingEnabled() { }; UserAccountManager accountManager = UserAccountManagerImpl.fromContext(targetContext); - UploadsStorageManager uploadsStorageManager = new UploadsStorageManager(accountManager.getUser(), + UploadsStorageManager uploadsStorageManager = new UploadsStorageManager(accountManager, targetContext.getContentResolver()); UploadFileOperation newUpload = new UploadFileOperation( diff --git a/app/src/androidTest/java/com/owncloud/android/UploadIT.java b/app/src/androidTest/java/com/owncloud/android/UploadIT.java index c6253d7fbd25..8072bb5c1805 100644 --- a/app/src/androidTest/java/com/owncloud/android/UploadIT.java +++ b/app/src/androidTest/java/com/owncloud/android/UploadIT.java @@ -52,7 +52,7 @@ public class UploadIT extends AbstractOnServerIT { private static final String FOLDER = "/testUpload/"; private UploadsStorageManager uploadsStorageManager = - new UploadsStorageManager(UserAccountManagerImpl.fromContext(targetContext).getUser(), + new UploadsStorageManager(UserAccountManagerImpl.fromContext(targetContext), targetContext.getContentResolver()); private ConnectivityService connectivityServiceMock = new ConnectivityService() { diff --git a/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt b/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt index 9996a66e7f5a..04ffe036c818 100644 --- a/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt +++ b/app/src/androidTest/java/com/owncloud/android/datamodel/UploadStorageManagerTest.kt @@ -58,7 +58,11 @@ class UploadStorageManagerTest : AbstractIT() { } user2 = userAccountManager.getUser("test2@test.com") .orElseThrow(Supplier { ActivityNotFoundException() }) - uploadsStorageManager = UploadsStorageManager(user2, targetContext.contentResolver) + uploadsStorageManager = + UploadsStorageManager( + UserAccountManagerImpl.fromContext(targetContext), + targetContext.contentResolver + ) } @Test diff --git a/app/src/androidTest/java/com/owncloud/android/files/services/FileUploaderIT.kt b/app/src/androidTest/java/com/owncloud/android/files/services/FileUploaderIT.kt index ce5097c0ee44..00c568d506ad 100644 --- a/app/src/androidTest/java/com/owncloud/android/files/services/FileUploaderIT.kt +++ b/app/src/androidTest/java/com/owncloud/android/files/services/FileUploaderIT.kt @@ -54,7 +54,7 @@ abstract class FileUploaderIT : AbstractOnServerIT() { fun setUp() { val contentResolver = targetContext.contentResolver val accountManager: UserAccountManager = UserAccountManagerImpl.fromContext(targetContext) - uploadsStorageManager = UploadsStorageManager(accountManager.user, contentResolver) + uploadsStorageManager = UploadsStorageManager(accountManager, contentResolver) } // /** diff --git a/app/src/main/java/com/nextcloud/client/di/AppModule.java b/app/src/main/java/com/nextcloud/client/di/AppModule.java index 04751e996454..58dee51ee036 100644 --- a/app/src/main/java/com/nextcloud/client/di/AppModule.java +++ b/app/src/main/java/com/nextcloud/client/di/AppModule.java @@ -137,7 +137,7 @@ FilesRepository filesRepository(UserAccountManager accountManager, ClientFactory @Provides UploadsStorageManager uploadsStorageManager(CurrentAccountProvider currentAccountProvider, Context context) { - return new UploadsStorageManager(currentAccountProvider.getUser(), context.getContentResolver()); + return new UploadsStorageManager(currentAccountProvider, context.getContentResolver()); } @Provides diff --git a/app/src/main/java/com/nextcloud/client/jobs/HealthStatusWork.kt b/app/src/main/java/com/nextcloud/client/jobs/HealthStatusWork.kt index a18fd7b8a547..2e0fadbf73d3 100644 --- a/app/src/main/java/com/nextcloud/client/jobs/HealthStatusWork.kt +++ b/app/src/main/java/com/nextcloud/client/jobs/HealthStatusWork.kt @@ -98,7 +98,7 @@ class HealthStatusWork( } private fun collectUploadProblems(user: User, errorCodes: List): List { - val uploadsStorageManager = UploadsStorageManager(userAccountManager.user, context.contentResolver) + val uploadsStorageManager = UploadsStorageManager(userAccountManager, context.contentResolver) val problems = uploadsStorageManager .getUploadsForAccount(user.accountName) diff --git a/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.kt b/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.kt index 744e95fa73f7..e294114fb003 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.kt +++ b/app/src/main/java/com/owncloud/android/datamodel/UploadsStorageManager.kt @@ -21,6 +21,7 @@ import android.database.Cursor import android.os.Handler import android.os.Looper import androidx.annotation.VisibleForTesting +import com.nextcloud.client.account.CurrentAccountProvider import com.nextcloud.client.account.User import com.nextcloud.client.database.NextcloudDatabase import com.nextcloud.client.database.dao.UploadDao @@ -45,7 +46,10 @@ import java.util.Locale import java.util.Observable @Suppress("TooManyFunctions", "TooGenericExceptionCaught", "MagicNumber", "ReturnCount") -class UploadsStorageManager(private val user: User, private val contentResolver: ContentResolver) : Observable() { +class UploadsStorageManager( + private val currentAccountProvider: CurrentAccountProvider, + private val contentResolver: ContentResolver +) : Observable() { private var capability: OCCapability? = null @@ -413,6 +417,7 @@ class UploadsStorageManager(private val user: User, private val contentResolver: getUploads(ProviderTableMeta.UPLOADS_ACCOUNT_NAME + IS_EQUAL, accountName) fun clearFailedButNotDelayedUploads() { + val user = currentAccountProvider.user val deleted = contentResolver.delete( ProviderTableMeta.CONTENT_URI_UPLOADS, ProviderTableMeta.UPLOADS_STATUS + EQUAL + UploadStatus.UPLOAD_FAILED.value + @@ -431,6 +436,7 @@ class UploadsStorageManager(private val user: User, private val contentResolver: } fun clearCancelledUploadsForCurrentAccount() { + val user = currentAccountProvider.user val deleted = contentResolver.delete( ProviderTableMeta.CONTENT_URI_UPLOADS, ProviderTableMeta.UPLOADS_STATUS + EQUAL + UploadStatus.UPLOAD_CANCELLED.value + @@ -442,6 +448,7 @@ class UploadsStorageManager(private val user: User, private val contentResolver: } fun clearSuccessfulUploads() { + val user = currentAccountProvider.user val deleted = contentResolver.delete( ProviderTableMeta.CONTENT_URI_UPLOADS, ProviderTableMeta.UPLOADS_STATUS + EQUAL + UploadStatus.UPLOAD_SUCCEEDED.value + @@ -453,6 +460,7 @@ class UploadsStorageManager(private val user: User, private val contentResolver: } fun clearSkippedUploads() { + val user = currentAccountProvider.user val deleted = contentResolver.delete( ProviderTableMeta.CONTENT_URI_UPLOADS, ProviderTableMeta.UPLOADS_STATUS + EQUAL + UploadStatus.UPLOAD_SUCCEEDED.value +