diff --git a/app/src/main/java/com/itsaky/androidide/activities/editor/EditorHandlerActivity.kt b/app/src/main/java/com/itsaky/androidide/activities/editor/EditorHandlerActivity.kt index 67415ac7c4..3b91d1e280 100644 --- a/app/src/main/java/com/itsaky/androidide/activities/editor/EditorHandlerActivity.kt +++ b/app/src/main/java/com/itsaky/androidide/activities/editor/EditorHandlerActivity.kt @@ -175,7 +175,11 @@ open class EditorHandlerActivity : return@observeFiles } getOpenedFiles().also { - val cache = OpenedFilesCache(currentFile, it) + val cache = OpenedFilesCache( + projectPath = ProjectManagerImpl.getInstance().projectDirPath, + selectedFile = currentFile, + allFiles = it, + ) editorViewModel.writeOpenedFiles(cache) editorViewModel.openedFilesCache = cache } @@ -285,7 +289,11 @@ open class EditorHandlerActivity : } val cache = - OpenedFilesCache(selectedFile = selectedFile.absolutePath, allFiles = openedFiles) + OpenedFilesCache( + projectPath = ProjectManagerImpl.getInstance().projectDirPath, + selectedFile = selectedFile.absolutePath, + allFiles = openedFiles, + ) val jsonCache = Gson().toJson(cache) prefs.putString(PREF_KEY_OPEN_FILES_CACHE, jsonCache) @@ -342,6 +350,12 @@ open class EditorHandlerActivity : private fun onReadOpenedFilesCache(cache: OpenedFilesCache?) { cache ?: return + val currentProjectPath = ProjectManagerImpl.getInstance().projectDirPath + if (cache.projectPath.isNotEmpty() && cache.projectPath != currentProjectPath) { + log.debug("[onStart] Discarding stale tab cache from project: {}", cache.projectPath) + return + } + lifecycleScope.launch(Dispatchers.IO) { val existingFiles = cache.allFiles.filter { File(it.filePath).exists() } val selectedFileExists = File(cache.selectedFile).exists() diff --git a/app/src/main/java/com/itsaky/androidide/models/OpenedFilesCache.kt b/app/src/main/java/com/itsaky/androidide/models/OpenedFilesCache.kt index 829b031bba..859db88a1b 100644 --- a/app/src/main/java/com/itsaky/androidide/models/OpenedFilesCache.kt +++ b/app/src/main/java/com/itsaky/androidide/models/OpenedFilesCache.kt @@ -27,11 +27,15 @@ import java.io.Reader /** * @author Akash Yadav */ -data class OpenedFilesCache(@SerializedName(KEY_SELECTED_FILE) val selectedFile: String, - @SerializedName(KEY_ALL_FILES) val allFiles: List) { +data class OpenedFilesCache( + @SerializedName(KEY_PROJECT_PATH) val projectPath: String = "", + @SerializedName(KEY_SELECTED_FILE) val selectedFile: String, + @SerializedName(KEY_ALL_FILES) val allFiles: List, +) { companion object { + private const val KEY_PROJECT_PATH = "projectPath" private const val KEY_SELECTED_FILE = "selectedFile" private const val KEY_ALL_FILES = "allFiles" private val log = LoggerFactory.getLogger(OpenedFilesCache::class.java) @@ -45,20 +49,20 @@ data class OpenedFilesCache(@SerializedName(KEY_SELECTED_FILE) val selectedFile: } reader.beginObject() + var projectPath = "" var selectedFile = "" var allFiles = emptyList() while (reader.hasNext()) { - val name = reader.nextName() - - if (name == KEY_SELECTED_FILE) { - selectedFile = reader.nextString() - } else if (name == KEY_ALL_FILES) { - allFiles = Gson().fromJson(reader, object : TypeToken>() {}) + when (reader.nextName()) { + KEY_PROJECT_PATH -> projectPath = reader.nextString() + KEY_SELECTED_FILE -> selectedFile = reader.nextString() + KEY_ALL_FILES -> allFiles = Gson().fromJson(reader, object : TypeToken>() {}) + else -> reader.skipValue() } } reader.endObject() - return@use OpenedFilesCache(selectedFile, allFiles) + return@use OpenedFilesCache(projectPath, selectedFile, allFiles) } } catch (err: Exception) { log.error("Failed to parse opened files cache", err)