Avoid failing when the user chooses a filename that already exists in Downloads
This commit is contained in:
30
app/src/main/java/org/mydomain/myscan/FileUtils.kt
Normal file
30
app/src/main/java/org/mydomain/myscan/FileUtils.kt
Normal file
@@ -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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
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
|
||||||
|
}
|
||||||
@@ -126,8 +126,8 @@ class MainActivity : ComponentActivity() {
|
|||||||
downloadsDir.mkdirs()
|
downloadsDir.mkdirs()
|
||||||
}
|
}
|
||||||
val generatedFile = generatedPdf.uri.toFile()
|
val generatedFile = generatedPdf.uri.toFile()
|
||||||
val targetFile = File(downloadsDir, generatedFile.name)
|
val desiredFile = File(downloadsDir, generatedFile.name)
|
||||||
// TODO Handle case where the target file already exists (choose a unique name)
|
val targetFile = getAvailableFilename(desiredFile)
|
||||||
generatedFile.copyTo(targetFile)
|
generatedFile.copyTo(targetFile)
|
||||||
viewModel.markFileSaved(targetFile.toUri())
|
viewModel.markFileSaved(targetFile.toUri())
|
||||||
|
|
||||||
|
|||||||
44
app/src/test/java/org/mydomain/myscan/FileUtilsTest.kt
Normal file
44
app/src/test/java/org/mydomain/myscan/FileUtilsTest.kt
Normal file
@@ -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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user