DroidFS/app/src/main/java/sushi/hardcore/droidfs/file_viewers/TextEditor.kt

131 lines
4.4 KiB
Kotlin
Raw Normal View History

2020-07-17 16:35:39 +02:00
package sushi.hardcore.droidfs.file_viewers
2021-03-17 21:11:14 +01:00
import android.annotation.SuppressLint
2020-07-17 16:35:39 +02:00
import android.text.Editable
import android.text.TextWatcher
import android.view.Menu
import android.view.MenuItem
import android.widget.EditText
import android.widget.Toast
2023-03-07 23:25:17 +01:00
import androidx.activity.addCallback
2022-03-05 12:51:02 +01:00
import sushi.hardcore.droidfs.R
2021-11-09 11:12:09 +01:00
import sushi.hardcore.droidfs.widgets.CustomAlertDialogBuilder
2020-07-17 16:35:39 +02:00
import java.io.File
class TextEditor: FileViewerActivity() {
private lateinit var fileName: String
private lateinit var editor: EditText
private var changedSinceLastSave = false
private var wordWrap = true
2021-03-17 21:11:14 +01:00
override fun getFileType(): String {
return "text"
}
2020-07-17 16:35:39 +02:00
override fun viewFile() {
2022-10-04 13:30:51 +02:00
fileName = File(filePath).name
title = fileName
supportActionBar?.setDisplayHomeAsUpEnabled(true)
loadWholeFile(filePath) {
2020-07-17 16:35:39 +02:00
try {
loadLayout(String(it))
2023-03-07 23:25:17 +01:00
onBackPressedDispatcher.addCallback(this) {
checkSaveAndExit()
}
2020-07-17 16:35:39 +02:00
} catch (e: OutOfMemoryError){
2023-02-28 22:50:59 +01:00
CustomAlertDialogBuilder(this, theme)
2020-07-17 16:35:39 +02:00
.setTitle(R.string.error)
.setMessage(R.string.outofmemoryerror_msg)
2020-07-17 16:35:39 +02:00
.setCancelable(false)
2020-08-12 15:14:38 +02:00
.setPositiveButton(R.string.ok) { _, _ -> goBackToExplorer()}
2020-07-17 16:35:39 +02:00
.show()
}
}
}
private fun loadLayout(fileContent: String){
if (wordWrap){
setContentView(R.layout.activity_text_editor_wrap)
} else {
setContentView(R.layout.activity_text_editor)
}
editor = findViewById(R.id.text_editor)
editor.setText(fileContent)
editor.addTextChangedListener(object: TextWatcher {
override fun afterTextChanged(s: Editable?) {
}
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
if (!changedSinceLastSave){
changedSinceLastSave = true
2021-03-17 21:11:14 +01:00
@SuppressLint("SetTextI18n")
2022-03-05 12:51:02 +01:00
title = "*$fileName"
2020-07-17 16:35:39 +02:00
}
}
})
}
private fun save(): Boolean{
var success = false
val content = editor.text.toString().toByteArray()
2022-06-18 21:13:16 +02:00
val fileHandle = encryptedVolume.openFile(filePath)
if (fileHandle != -1L) {
2020-07-17 16:35:39 +02:00
var offset: Long = 0
while (offset < content.size && encryptedVolume.write(fileHandle, offset, content, offset, content.size.toLong()).also { offset += it } > 0) {}
2020-07-17 16:35:39 +02:00
if (offset == content.size.toLong()){
2022-06-18 21:13:16 +02:00
success = encryptedVolume.truncate(filePath, offset)
2020-07-17 16:35:39 +02:00
}
2022-06-18 21:13:16 +02:00
encryptedVolume.closeFile(fileHandle)
2020-07-17 16:35:39 +02:00
}
if (success){
Toast.makeText(this, getString(R.string.file_saved), Toast.LENGTH_SHORT).show()
} else {
Toast.makeText(this, getString(R.string.save_failed), Toast.LENGTH_SHORT).show()
}
return success
}
private fun checkSaveAndExit(){
if (changedSinceLastSave){
2023-02-28 22:50:59 +01:00
CustomAlertDialogBuilder(this, theme)
2020-07-17 16:35:39 +02:00
.setTitle(R.string.warning)
.setMessage(R.string.ask_save)
2020-08-12 15:14:38 +02:00
.setPositiveButton(R.string.save) { _, _ ->
2020-07-17 16:35:39 +02:00
if (save()){
goBackToExplorer()
2020-07-17 16:35:39 +02:00
}
}
2020-08-12 15:14:38 +02:00
.setNegativeButton(R.string.discard){ _, _ -> goBackToExplorer()}
2020-07-17 16:35:39 +02:00
.show()
} else {
goBackToExplorer()
2020-07-17 16:35:39 +02:00
}
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.text_editor, menu)
menu.findItem(R.id.word_wrap).isChecked = wordWrap
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId){
android.R.id.home -> {
checkSaveAndExit()
}
R.id.menu_save -> {
if (save()){
changedSinceLastSave = false
2022-03-05 12:51:02 +01:00
title = fileName
2020-07-17 16:35:39 +02:00
}
}
R.id.word_wrap -> {
wordWrap = !item.isChecked
loadLayout(editor.text.toString())
invalidateOptionsMenu()
}
else -> super.onOptionsItemSelected(item)
}
return true
}
2020-08-12 15:14:38 +02:00
}