@@ -11,6 +11,8 @@ import android.widget.Toast
1111import androidx.activity.addCallback
1212import androidx.appcompat.app.AppCompatActivity
1313import androidx.appcompat.widget.Toolbar
14+ import androidx.core.view.ViewCompat
15+ import androidx.core.view.WindowInsetsCompat
1416import androidx.lifecycle.lifecycleScope
1517import com.omarea.common.shared.FileWrite
1618import com.omarea.common.shell.KeepShellPublic
@@ -82,6 +84,7 @@ class TextEditorActivity : AppCompatActivity() {
8284 ThemeModeState .switchTheme(this )
8385 binding = ActivityTextEditorBinding .inflate(layoutInflater)
8486 setContentView(binding.root)
87+ setupKeyboardInsets()
8588
8689 val toolbar = findViewById<View >(R .id.toolbar) as Toolbar
8790 setSupportActionBar(toolbar)
@@ -111,6 +114,30 @@ class TextEditorActivity : AppCompatActivity() {
111114 loadFileContent()
112115 }
113116
117+ /* *
118+ * App đang dùng chế độ edge-to-edge (decorFitsSystemWindows = false) nên hệ thống sẽ
119+ * không tự đẩy layout lên khi hiện bàn phím dù có khai báo windowSoftInputMode="adjustResize"
120+ * trong manifest — phải tự lắng nghe inset của bàn phím (IME) rồi đệm (padding) đáy vùng
121+ * nội dung lên tương ứng, đồng thời ẩn FAB đi để không bị bàn phím che mất/đè lên.
122+ */
123+ private fun setupKeyboardInsets () {
124+ val scrollContainer = binding.mainList
125+ ViewCompat .setOnApplyWindowInsetsListener(scrollContainer) { view, insets ->
126+ val imeInset = insets.getInsets(WindowInsetsCompat .Type .ime()).bottom
127+ val systemBarsInset = insets.getInsets(WindowInsetsCompat .Type .systemBars()).bottom
128+ val keyboardVisible = imeInset > systemBarsInset
129+
130+ view.setPadding(view.paddingLeft, view.paddingTop, view.paddingRight, maxOf(imeInset, systemBarsInset))
131+ binding.editorFabRun.visibility = if (keyboardVisible) View .GONE else View .VISIBLE
132+
133+ if (keyboardVisible) {
134+ view.post { scrollContainer.fullScroll(View .FOCUS_DOWN ) }
135+ }
136+
137+ insets
138+ }
139+ }
140+
114141 private fun resolveAbsolutePath (dir : String , file : String ): String {
115142 if (file.startsWith(" /" )) return file
116143 val base = dir.ifEmpty { FileWrite .getPrivateFileDir(applicationContext) }
0 commit comments