From 7aa4a8f16d5373d104336272b4cdf5bb8f67930e Mon Sep 17 00:00:00 2001 From: Akash Yadav Date: Sat, 16 Dec 2023 16:23:11 +0530 Subject: [PATCH] fix: broken 'Close all files' behavior (fixes #1549) --- .../activities/editor/BaseEditorActivity.kt | 2 +- .../androidide/viewmodel/EditorViewModel.kt | 27 +++++++++---------- .../itsaky/androidide/editor/ui/IDEEditor.kt | 5 ++-- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt b/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt index acd6cd011..961dfafd8 100644 --- a/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt +++ b/app/src/main/java/com/itsaky/androidide/activities/editor/BaseEditorActivity.kt @@ -69,8 +69,8 @@ import com.itsaky.androidide.preferences.internal.launchAppAfterInstall import com.itsaky.androidide.projects.IProjectManager import com.itsaky.androidide.projects.ProjectManagerImpl import com.itsaky.androidide.tasks.cancelIfActive -import com.itsaky.androidide.ui.ContentTranslatingDrawerLayout import com.itsaky.androidide.ui.CodeEditorView +import com.itsaky.androidide.ui.ContentTranslatingDrawerLayout import com.itsaky.androidide.uidesigner.UIDesignerActivity import com.itsaky.androidide.utils.ActionMenuUtils.createMenu import com.itsaky.androidide.utils.ApkInstallationSessionCallback diff --git a/app/src/main/java/com/itsaky/androidide/viewmodel/EditorViewModel.kt b/app/src/main/java/com/itsaky/androidide/viewmodel/EditorViewModel.kt index 858bdd6ae..99c0aa1ee 100644 --- a/app/src/main/java/com/itsaky/androidide/viewmodel/EditorViewModel.kt +++ b/app/src/main/java/com/itsaky/androidide/viewmodel/EditorViewModel.kt @@ -34,6 +34,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.File +import java.util.Collections /** ViewModel for data used in [com.itsaky.androidide.activities.editor.EditorActivityKt] */ @Suppress("PropertyName") @@ -126,14 +127,15 @@ class EditorViewModel : ViewModel() { } internal var files: MutableList - get() = this._files.value ?: EMPTY_FILES + get() = this._files.value ?: Collections.emptyList() set(value) { this._files.value = value } - companion object { - - private val EMPTY_FILES = mutableListOf() + private inline fun updateFiles(crossinline action: (files: MutableList) -> Unit) { + val files = this.files + action(files) + this.files = files } /** @@ -141,9 +143,8 @@ class EditorViewModel : ViewModel() { * * @param file The file that has been opened. */ - fun addFile(file: File) { + fun addFile(file: File) = updateFiles { files -> files.add(file) - this.files = files } /** @@ -151,17 +152,16 @@ class EditorViewModel : ViewModel() { * * @param index The index of the closed file. */ - fun removeFile(index: Int) { + fun removeFile(index: Int) = updateFiles { files -> files.removeAt(index) - this.files = files - if (this.files.isEmpty()) { + if (files.isEmpty()) { mCurrentFile.value = null } } - fun removeAllFiles() { - this.files = EMPTY_FILES + fun removeAllFiles() = updateFiles { files -> + files.clear() setCurrentFile(-1, null) } @@ -170,9 +170,8 @@ class EditorViewModel : ViewModel() { mCurrentFile.value = index to file } - fun updateFile(index: Int, newFile: File) { + fun updateFile(index: Int, newFile: File) = updateFiles { files -> files[index] = newFile - this.files = files } /** @@ -200,7 +199,7 @@ class EditorViewModel : ViewModel() { * @return The list of opened files. */ fun getOpenedFiles(): List { - return files + return Collections.unmodifiableList(files) } /** diff --git a/editor/src/main/java/com/itsaky/androidide/editor/ui/IDEEditor.kt b/editor/src/main/java/com/itsaky/androidide/editor/ui/IDEEditor.kt index 350e97b36..41f6b44f7 100644 --- a/editor/src/main/java/com/itsaky/androidide/editor/ui/IDEEditor.kt +++ b/editor/src/main/java/com/itsaky/androidide/editor/ui/IDEEditor.kt @@ -84,6 +84,7 @@ import io.github.rosemoe.sora.widget.IDEEditorSearcher import io.github.rosemoe.sora.widget.component.EditorAutoCompletion import io.github.rosemoe.sora.widget.component.EditorBuiltinComponent import io.github.rosemoe.sora.widget.component.EditorTextActionWindow +import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -133,7 +134,7 @@ open class IDEEditor @JvmOverloads constructor(context: Context, attrs: Attribut * * All the jobs in this scope are cancelled when the editor is released. */ - val editorScope = CoroutineScope(Dispatchers.Default) + val editorScope = CoroutineScope(Dispatchers.Default + CoroutineName("IDEEditor")) protected val eventDispatcher = EditorEventDispatcher() @@ -270,7 +271,7 @@ open class IDEEditor @JvmOverloads constructor(context: Context, attrs: Attribut this.sigHelpCancelChecker = it } - editorScope.launch { + editorScope.launch(Dispatchers.Default) { cancelChecker.job = coroutineContext[Job] val params = SignatureHelpParams(file.toPath(), cursorLSPPosition, cancelChecker) val help = languageServer.signatureHelp(params)