From 8bdc46ea092c5d5dd58fae0fdf0618777283c90b Mon Sep 17 00:00:00 2001 From: John Trujillo Date: Wed, 11 Mar 2026 16:38:30 -0500 Subject: [PATCH 1/2] fix(editor): preserve scroll position and file timestamps on configuration change Ensure cursor visibility after layout changes and update file timestamps after saving. --- .../activities/editor/EditorHandlerActivity.kt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) 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 3b91d1e280..a5f1ae387d 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 @@ -18,6 +18,7 @@ package com.itsaky.androidide.activities.editor import android.content.Intent +import android.content.res.Configuration import android.os.Bundle import android.text.TextUtils import android.util.Log @@ -26,6 +27,7 @@ import android.view.ViewGroup.LayoutParams import androidx.collection.MutableIntObjectMap import androidx.core.content.res.ResourcesCompat import androidx.core.view.GravityCompat +import androidx.core.view.doOnNextLayout import androidx.lifecycle.lifecycleScope import com.blankj.utilcode.util.ImageUtils import com.google.android.material.tabs.TabLayout @@ -697,6 +699,16 @@ open class EditorHandlerActivity : } } + override fun onConfigurationChanged(newConfig: Configuration) { + super.onConfigurationChanged(newConfig) + + getCurrentEditor()?.editor?.apply { + doOnNextLayout { + cursor?.let { c -> ensurePositionVisible(c.leftLine, c.leftColumn, true) } + } + } + } + private suspend fun saveResultInternal( index: Int, result: SaveResult, @@ -716,6 +728,10 @@ open class EditorHandlerActivity : return false } + frag.file?.let { savedFile -> + fileTimestamps[savedFile.absolutePath] = savedFile.lastModified() + } + val isGradle = fileName.endsWith(".gradle") || fileName.endsWith(".gradle.kts") val isXml: Boolean = fileName.endsWith(".xml") if (!result.gradleSaved) { From ac0e79b441a6568f136188443183f85da8f837c5 Mon Sep 17 00:00:00 2001 From: John Trujillo Date: Thu, 12 Mar 2026 09:30:29 -0500 Subject: [PATCH 2/2] fix: Make fileTimestamps thread-safe --- .../androidide/activities/editor/EditorHandlerActivity.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 a5f1ae387d..dcfa7d3901 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 @@ -81,6 +81,7 @@ import org.adfa.constants.CONTENT_KEY import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode import java.io.File +import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.CopyOnWriteArrayList import java.util.concurrent.atomic.AtomicBoolean import java.util.function.Consumer @@ -102,7 +103,7 @@ open class EditorHandlerActivity : protected val isOpenedFilesSaved = AtomicBoolean(false) - private val fileTimestamps = mutableMapOf() + private val fileTimestamps = ConcurrentHashMap() private val pluginTabIndices = mutableMapOf() private val tabIndexToPluginId = mutableMapOf()