diff --git a/app/src/main/java/org/mydomain/myscan/FileUtils.kt b/app/src/main/java/org/mydomain/myscan/FileUtils.kt new file mode 100644 index 0000000..7ba76ae --- /dev/null +++ b/app/src/main/java/org/mydomain/myscan/FileUtils.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2025 Pierre-Yves Nicolas + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) + * any later version. + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +package org.mydomain.myscan + +import java.io.File + +fun getAvailableFilename(desiredFile: File): File { + var file = desiredFile + val dir = desiredFile.parentFile + val desiredName = desiredFile.name + val nameWithoutExtension = desiredName.removeSuffix(".pdf") + var counter = 1 + while (file.exists()) { + file = File(dir, "${nameWithoutExtension}_$counter.pdf") + counter++ + } + return file +} diff --git a/app/src/main/java/org/mydomain/myscan/MainActivity.kt b/app/src/main/java/org/mydomain/myscan/MainActivity.kt index c3acca3..9a8d468 100644 --- a/app/src/main/java/org/mydomain/myscan/MainActivity.kt +++ b/app/src/main/java/org/mydomain/myscan/MainActivity.kt @@ -126,8 +126,8 @@ class MainActivity : ComponentActivity() { downloadsDir.mkdirs() } val generatedFile = generatedPdf.uri.toFile() - val targetFile = File(downloadsDir, generatedFile.name) - // TODO Handle case where the target file already exists (choose a unique name) + val desiredFile = File(downloadsDir, generatedFile.name) + val targetFile = getAvailableFilename(desiredFile) generatedFile.copyTo(targetFile) viewModel.markFileSaved(targetFile.toUri()) diff --git a/app/src/test/java/org/mydomain/myscan/FileUtilsTest.kt b/app/src/test/java/org/mydomain/myscan/FileUtilsTest.kt new file mode 100644 index 0000000..8e092cf --- /dev/null +++ b/app/src/test/java/org/mydomain/myscan/FileUtilsTest.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2025 Pierre-Yves Nicolas + * + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation, either version 3 of the License, or (at your option) + * any later version. + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +package org.mydomain.myscan + +import org.assertj.core.api.Assertions.assertThat +import org.junit.Test +import java.io.File +import kotlin.io.path.createTempDirectory + +class FileUtilsTest { + + @Test + fun getAvailableName() { + val dir = createTempDirectory().toFile() + val f = File(dir, "f.pdf") + val f1 = File(dir, "f_1.pdf") + val f2 = File(dir, "f_2.pdf") + + assertThat(f.exists()).isFalse + assertThat(f1.exists()).isFalse + assertThat(getAvailableFilename(f)).isEqualTo(f) + + f.apply { writeText("dummy") } + assertThat(f.exists()).isTrue + assertThat(getAvailableFilename(f)).isEqualTo(f1) + + f1.apply { writeText("dummy") } + assertThat(f1.exists()).isTrue + assertThat(getAvailableFilename(f)).isEqualTo(f2) + } + +}