Эх сурвалжийг харах

Merge pull request #6762 from nextcloud/enoughSpaceComputation

compute space: take downloaded folder into account
Tobias Kaminsky 4 жил өмнө
parent
commit
90a7e00c62

+ 99 - 0
src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentIT.kt

@@ -37,6 +37,7 @@ import com.nextcloud.client.preferences.AppPreferencesImpl
 import com.nextcloud.client.preferences.DarkMode
 import com.owncloud.android.AbstractOnServerIT
 import com.owncloud.android.MainApp
+import com.owncloud.android.datamodel.OCFile
 import com.owncloud.android.datamodel.UploadsStorageManager
 import com.owncloud.android.db.OCUpload
 import com.owncloud.android.files.services.FileUploader
@@ -48,9 +49,11 @@ import com.owncloud.android.operations.RefreshFolderOperation
 import com.owncloud.android.operations.UploadFileOperation
 import com.owncloud.android.ui.activity.FileDisplayActivity
 import junit.framework.TestCase
+import org.junit.Assert.assertFalse
 import org.junit.Assert.assertTrue
 import org.junit.Rule
 import org.junit.Test
+import java.io.File
 
 class OCFileListFragmentIT : AbstractOnServerIT() {
     companion object {
@@ -298,4 +301,100 @@ class OCFileListFragmentIT : AbstractOnServerIT() {
         InstrumentationRegistry.getInstrumentation().waitForIdleSync()
 //        Screenshot.snapActivity(sut).record()
     }
+
+    @Test
+    @SuppressWarnings("MagicNumber")
+    fun testEnoughSpaceWithoutLocalFile() {
+        val sut = OCFileListFragment()
+        val ocFile = OCFile("/test.txt")
+        val file = File("/sdcard/test.txt")
+        file.createNewFile()
+
+        ocFile.storagePath = file.absolutePath
+
+        ocFile.fileLength = 100
+        assertTrue(sut.checkIfEnoughSpace(200L, ocFile))
+
+        ocFile.fileLength = 0
+        assertTrue(sut.checkIfEnoughSpace(200L, ocFile))
+
+        ocFile.fileLength = 100
+        assertFalse(sut.checkIfEnoughSpace(50L, ocFile))
+
+        ocFile.fileLength = 100
+        assertFalse(sut.checkIfEnoughSpace(100L, ocFile))
+    }
+
+    @Test
+    @SuppressWarnings("MagicNumber")
+    fun testEnoughSpaceWithLocalFile() {
+        val sut = OCFileListFragment()
+        val ocFile = OCFile("/test.txt")
+        val file = File("/sdcard/test.txt")
+        file.writeText("123123")
+
+        ocFile.storagePath = file.absolutePath
+
+        ocFile.fileLength = 100
+        assertTrue(sut.checkIfEnoughSpace(200L, ocFile))
+
+        ocFile.fileLength = 0
+        assertTrue(sut.checkIfEnoughSpace(200L, ocFile))
+
+        ocFile.fileLength = 100
+        assertFalse(sut.checkIfEnoughSpace(50L, ocFile))
+
+        ocFile.fileLength = 100
+        assertFalse(sut.checkIfEnoughSpace(100L, ocFile))
+    }
+
+    @Test
+    @SuppressWarnings("MagicNumber")
+    fun testEnoughSpaceWithoutLocalFolder() {
+        val sut = OCFileListFragment()
+        val ocFile = OCFile("/test/")
+        val file = File("/sdcard/test/")
+        File("/sdcard/test/1.txt").writeText("123123")
+
+        ocFile.storagePath = file.absolutePath
+
+        ocFile.fileLength = 100
+        assertTrue(sut.checkIfEnoughSpace(200L, ocFile))
+
+        ocFile.fileLength = 0
+        assertTrue(sut.checkIfEnoughSpace(200L, ocFile))
+
+        ocFile.fileLength = 100
+        assertFalse(sut.checkIfEnoughSpace(50L, ocFile))
+
+        ocFile.fileLength = 100
+        assertFalse(sut.checkIfEnoughSpace(100L, ocFile))
+    }
+
+    @Test
+    @SuppressWarnings("MagicNumber")
+    fun testEnoughSpaceWithLocalFolder() {
+        val sut = OCFileListFragment()
+        val ocFile = OCFile("/test/")
+        val folder = File("/sdcard/test/")
+        folder.mkdirs()
+        val file = File("/sdcard/test/1.txt")
+        file.createNewFile()
+        file.writeText("123123")
+
+        ocFile.storagePath = folder.absolutePath
+        ocFile.mimeType = "DIR"
+
+        ocFile.fileLength = 100
+        assertTrue(sut.checkIfEnoughSpace(200L, ocFile))
+
+        ocFile.fileLength = 0
+        assertTrue(sut.checkIfEnoughSpace(200L, ocFile))
+
+        ocFile.fileLength = 100
+        assertTrue(sut.checkIfEnoughSpace(50L, ocFile))
+
+        ocFile.fileLength = 100
+        assertTrue(sut.checkIfEnoughSpace(100L, ocFile))
+    }
 }

+ 13 - 1
src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.java

@@ -122,6 +122,7 @@ import javax.inject.Inject;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
+import androidx.annotation.VisibleForTesting;
 import androidx.appcompat.app.ActionBar;
 import androidx.coordinatorlayout.widget.CoordinatorLayout;
 import androidx.drawerlayout.widget.DrawerLayout;
@@ -1759,7 +1760,7 @@ public class OCFileListFragment extends ExtendedListFragment implements
             // Determine if space is enough to download the file, -1 available space if there in error while computing
             boolean isSpaceEnough = true;
             if (availableSpaceOnDevice >= 0) {
-                isSpaceEnough = availableSpaceOnDevice > file.getFileLength();
+                isSpaceEnough = checkIfEnoughSpace(availableSpaceOnDevice, file);
             }
 
             if (isSpaceEnough) {
@@ -1770,6 +1771,17 @@ public class OCFileListFragment extends ExtendedListFragment implements
         }
     }
 
+    @VisibleForTesting
+    public boolean checkIfEnoughSpace(long availableSpaceOnDevice, OCFile file) {
+        if (file.isFolder()) {
+            // on folders we assume that we only need difference
+            return availableSpaceOnDevice > (file.getFileLength() - new File(file.getStoragePath()).length());
+        } else {
+            // on files complete file must first be stored, then target gets overwritten
+            return availableSpaceOnDevice > file.getFileLength();
+        }
+    }
+
     private void showSpaceErrorDialog(OCFile file, long availableSpaceOnDevice) {
         SyncFileNotEnoughSpaceDialogFragment dialog =
             SyncFileNotEnoughSpaceDialogFragment.newInstance(file, availableSpaceOnDevice);