Skip to content

Commit

Permalink
[bug] Check for note existence before saving to avoid crash: #26
Browse files Browse the repository at this point in the history
  • Loading branch information
tuancoltech committed Nov 22, 2023
1 parent 10dcbaf commit 1721912
Show file tree
Hide file tree
Showing 6 changed files with 60 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import java.nio.file.Path

interface TextNotesRepo {
suspend fun init(root: Path, scope: CoroutineScope)
suspend fun save(note: TextNote)
suspend fun save(note: TextNote, callback: SaveNoteCallback)
suspend fun delete(note: TextNote): Int
suspend fun read(): List<TextNote>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,13 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import dev.arkbuilders.arkmemo.data.ResourceMeta
import dev.arkbuilders.arkmemo.models.SaveNoteResult
import dev.arkbuilders.arkmemo.models.TextNote
import java.nio.file.Files
import java.nio.file.Path
import javax.inject.Inject
import kotlin.io.path.deleteIfExists
import kotlin.io.path.exists
import kotlin.io.path.extension
import kotlin.io.path.fileSize
import kotlin.io.path.forEachLine
Expand All @@ -39,8 +41,8 @@ class TextNotesRepoImpl @Inject constructor(): TextNotesRepo {
propertiesStorage = propertiesStorageRepo.provide(RootIndex.provide(root))
}

override suspend fun save(note: TextNote) {
write(note)
override suspend fun save(note: TextNote, callback: SaveNoteCallback) {
write(note, callback)
}

override suspend fun delete(note: TextNote) = withContext(iODispatcher) {
Expand Down Expand Up @@ -78,7 +80,8 @@ class TextNotesRepoImpl @Inject constructor(): TextNotesRepo {
notes
}

private suspend fun write(note: TextNote) = withContext(Dispatchers.IO) {
private suspend fun write(note: TextNote,
saveNoteCallback: SaveNoteCallback) = withContext(Dispatchers.IO) {
val tempPath = kotlin.io.path.createTempFile()
val lines = note.content.data.split('\n')
tempPath.writeLines(lines)
Expand All @@ -88,13 +91,18 @@ class TextNotesRepoImpl @Inject constructor(): TextNotesRepo {
persistNoteProperties(resourceId = id, noteTitle = note.content.title)

val resourcePath = root.resolve("$id.$NOTE_EXT")
if (resourcePath.exists()) {
saveNoteCallback.onSaveNote(SaveNoteResult.ERROR_EXISTING)
return@withContext
}
renameResourceWithNewResourceMeta(
note = note,
tempPath = tempPath,
resourcePath = resourcePath,
resourceId = id,
size = size
)
saveNoteCallback.onSaveNote(SaveNoteResult.SUCCESS)
}

private suspend fun persistNoteProperties(resourceId: ResourceId, noteTitle: String) {
Expand Down Expand Up @@ -128,5 +136,9 @@ class TextNotesRepoImpl @Inject constructor(): TextNotesRepo {
}
}

interface SaveNoteCallback {
fun onSaveNote(result: SaveNoteResult)
}

private const val NOTE_EXT = "note"

Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package dev.arkbuilders.arkmemo.models

enum class SaveNoteResult {
SUCCESS,
ERROR_EXISTING
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import dagger.hilt.android.AndroidEntryPoint
import dev.arkbuilders.arkmemo.R
import dev.arkbuilders.arkmemo.ui.viewmodels.NotesViewModel
import dev.arkbuilders.arkmemo.databinding.FragmentEditTextNotesBinding
import dev.arkbuilders.arkmemo.models.SaveNoteResult
import dev.arkbuilders.arkmemo.models.TextNote
import dev.arkbuilders.arkmemo.ui.activities.MainActivity

Expand All @@ -32,6 +33,7 @@ class EditTextNotesFragment: Fragment(R.layout.fragment_edit_text_notes) {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
notesViewModel.init()
subscribeLiveData()
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
Expand Down Expand Up @@ -86,16 +88,26 @@ class EditTextNotesFragment: Fragment(R.layout.fragment_edit_text_notes) {
saveNoteButton.setOnClickListener {
notesViewModel.onSaveClick(note) { show ->
activity.showProgressBar(show)
if (!show) {
Toast.makeText(requireContext(), getString(R.string.ark_memo_note_saved),
Toast.LENGTH_SHORT)
.show()
activity.onBackPressedDispatcher.onBackPressed()
}
}
}
}

private fun subscribeLiveData() {
notesViewModel.getSaveNoteResultLiveData().observe(this) {
if (!isResumed) return@observe

if (it == SaveNoteResult.SUCCESS) {
Toast.makeText(requireContext(), getString(R.string.ark_memo_note_saved),
Toast.LENGTH_SHORT)
.show()
activity.onBackPressedDispatcher.onBackPressed()
} else {
Toast.makeText(requireContext(), getString(R.string.ark_memo_note_existing),
Toast.LENGTH_SHORT)
.show()
}
}
}

companion object{
const val TAG = "Edit Text Notes"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package dev.arkbuilders.arkmemo.ui.viewmodels

import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import dev.arkbuilders.arkmemo.data.repositories.SaveNoteCallback
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import dev.arkbuilders.arkmemo.data.repositories.TextNotesRepo
import dev.arkbuilders.arkmemo.models.SaveNoteResult
import dev.arkbuilders.arkmemo.models.TextNote
import dev.arkbuilders.arkmemo.preferences.MemoPreferences
import javax.inject.Inject
Expand All @@ -22,6 +26,7 @@ class NotesViewModel @Inject constructor(
private val iODispatcher = Dispatchers.IO

private val notes = MutableStateFlow(listOf<TextNote>())
private val mSaveNoteResultLiveData = MutableLiveData<SaveNoteResult>()

fun init() {
viewModelScope.launch(iODispatcher) {
Expand All @@ -39,8 +44,16 @@ class NotesViewModel @Inject constructor(
showProgress(true)

}
textNotesRepo.save(note)
add(note)
textNotesRepo.save(note, object : SaveNoteCallback {
override fun onSaveNote(result: SaveNoteResult) {
if (result == SaveNoteResult.SUCCESS) {
add(note)
}
mSaveNoteResultLiveData.postValue(result)
}

})

withContext(Dispatchers.Main) {
showProgress(false)
}
Expand Down Expand Up @@ -75,4 +88,8 @@ class NotesViewModel @Inject constructor(
notes.remove(note)
this.notes.value = notes
}

fun getSaveNoteResultLiveData(): LiveData<SaveNoteResult> {
return mSaveNoteResultLiveData
}
}
1 change: 1 addition & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,6 @@
<string name="ark_memo_cancel">Cancel</string>
<string name="ark_memo_delete_warn">Are you sure to delete note?</string>
<string name="ark_memo_note_saved">Note saved successfully.</string>
<string name="ark_memo_note_existing">Note existing!</string>

</resources>

0 comments on commit 1721912

Please sign in to comment.