From 77a8b03ca8f98b24502400478ff408806a5d87bd Mon Sep 17 00:00:00 2001 From: Oluwadara Abijo Date: Tue, 2 Jun 2026 17:51:50 +0100 Subject: [PATCH 1/3] fix(ADFA-2584): Allow file rename for case-only changes --- .../androidide/viewmodel/FileManagerViewModel.kt | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/itsaky/androidide/viewmodel/FileManagerViewModel.kt b/app/src/main/java/com/itsaky/androidide/viewmodel/FileManagerViewModel.kt index 7da79ca8cd..500a3d993c 100644 --- a/app/src/main/java/com/itsaky/androidide/viewmodel/FileManagerViewModel.kt +++ b/app/src/main/java/com/itsaky/androidide/viewmodel/FileManagerViewModel.kt @@ -28,11 +28,17 @@ class FileManagerViewModel : ViewModel() { fun renameFile(file: File, newName: String, context: Context? = null, onResult: ((Boolean) -> Unit)? = null) { viewModelScope.launch { + val destFile = File(file.parentFile, newName) val renamed = withContext(Dispatchers.IO) { - newName.length in 1..40 && FileUtils.rename(file, newName) + if (file.name.equals(newName, ignoreCase = true)) { + val tempFile = File(file.parentFile, "$newName.tmp") + file.renameTo(tempFile) && tempFile.renameTo(destFile) + } else { + FileUtils.rename(file, newName) + } } - if (renamed) { + if (newName.length in 1..40 && renamed) { // Notify system of the rename val renameEvent = FileRenameEvent(file, File(file.parent, newName)) if (context != null) { From 9caf8d53da00f860019aaa88eae27530f11d5c3b Mon Sep 17 00:00:00 2001 From: Oluwadara Abijo Date: Wed, 3 Jun 2026 11:39:44 +0100 Subject: [PATCH 2/3] fix(ADFA-2584): Avoid temporary file collision before renaming --- .../com/itsaky/androidide/viewmodel/FileManagerViewModel.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/itsaky/androidide/viewmodel/FileManagerViewModel.kt b/app/src/main/java/com/itsaky/androidide/viewmodel/FileManagerViewModel.kt index 500a3d993c..fd42daefc2 100644 --- a/app/src/main/java/com/itsaky/androidide/viewmodel/FileManagerViewModel.kt +++ b/app/src/main/java/com/itsaky/androidide/viewmodel/FileManagerViewModel.kt @@ -31,7 +31,8 @@ class FileManagerViewModel : ViewModel() { val destFile = File(file.parentFile, newName) val renamed = withContext(Dispatchers.IO) { if (file.name.equals(newName, ignoreCase = true)) { - val tempFile = File(file.parentFile, "$newName.tmp") + val uniqueSuffix = System.currentTimeMillis() + val tempFile = File(file.parentFile, "$newName-$uniqueSuffix.cotg") file.renameTo(tempFile) && tempFile.renameTo(destFile) } else { FileUtils.rename(file, newName) From 03987d12bbb80b5deee3ae4668c774c90664cf68 Mon Sep 17 00:00:00 2001 From: Oluwadara Abijo Date: Wed, 3 Jun 2026 11:47:28 +0100 Subject: [PATCH 3/3] fix(ADDA-2584): Validate new file name before renaming --- .../androidide/actions/filetree/RenameAction.kt | 13 ++++++++++--- .../androidide/viewmodel/FileManagerViewModel.kt | 3 ++- resources/src/main/res/values/strings.xml | 1 + 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/itsaky/androidide/actions/filetree/RenameAction.kt b/app/src/main/java/com/itsaky/androidide/actions/filetree/RenameAction.kt index 99598925c4..bf765963e0 100644 --- a/app/src/main/java/com/itsaky/androidide/actions/filetree/RenameAction.kt +++ b/app/src/main/java/com/itsaky/androidide/actions/filetree/RenameAction.kt @@ -61,10 +61,17 @@ class RenameAction( builder.setPositiveButton(R.string.rename_file) { dialogInterface, _ -> val fileManagerViewModel: FileManagerViewModel by context.viewModels() val name: String = binding.name.editText?.text.toString().trim() - if (name.length !in 1..40) { - flashError(R.string.msg_invalid_name) - return@setPositiveButton + when { + name.isEmpty() -> { + flashError(R.string.msg_invalid_name) + return@setPositiveButton + } + name.length > 40 -> { + flashError(R.string.file_name_too_long) + return@setPositiveButton + } } + dialogInterface.dismiss() fileManagerViewModel.renameFile(file, name, context) { renamed -> if (!renamed) return@renameFile diff --git a/app/src/main/java/com/itsaky/androidide/viewmodel/FileManagerViewModel.kt b/app/src/main/java/com/itsaky/androidide/viewmodel/FileManagerViewModel.kt index fd42daefc2..7041f446bc 100644 --- a/app/src/main/java/com/itsaky/androidide/viewmodel/FileManagerViewModel.kt +++ b/app/src/main/java/com/itsaky/androidide/viewmodel/FileManagerViewModel.kt @@ -1,6 +1,7 @@ package com.itsaky.androidide.viewmodel import android.content.Context +import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.blankj.utilcode.util.FileUtils @@ -39,7 +40,7 @@ class FileManagerViewModel : ViewModel() { } } - if (newName.length in 1..40 && renamed) { + if (renamed) { // Notify system of the rename val renameEvent = FileRenameEvent(file, File(file.parent, newName)) if (context != null) { diff --git a/resources/src/main/res/values/strings.xml b/resources/src/main/res/values/strings.xml index 6290f7415b..20673fc8f0 100644 --- a/resources/src/main/res/values/strings.xml +++ b/resources/src/main/res/values/strings.xml @@ -255,6 +255,7 @@ Enter a new name for the file/folder. Renamed successfully Unable to rename file + File name cannot exceed 40 characters Deleted successfully Unable to delete file Copy path