Skip to content

Commit

Permalink
Merge pull request #4195 from kiwix/Fixes#4194
Browse files Browse the repository at this point in the history
Fixed: When a note is deleted, the corresponding file remained in storage.
  • Loading branch information
kelson42 authored Jan 31, 2025
2 parents 3da8c40 + 561af8f commit e61e3e8
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -129,17 +129,7 @@ class NoteFragmentTest : BaseActivityTest() {

@Test
fun testUserCanSeeNotesForDeletedFiles() {
// delete the notes if any saved to properly run the test scenario
note {
openNoteFragment()
assertToolbarExist()
assertNoteRecyclerViewExist()
clickOnTrashIcon()
assertDeleteNoteDialogDisplayed()
clickOnDeleteButton()
assertNoNotesTextDisplayed()
pressBack()
}
deletePreviouslySavedNotes()
loadZimFileInReader("testzim.zim")
StandardActions.closeDrawer() // close the drawer if open before running the test cases.
note {
Expand Down Expand Up @@ -188,20 +178,33 @@ class NoteFragmentTest : BaseActivityTest() {

@Test
fun testZimFileOpenedAfterOpeningNoteOnNotesScreen() {
// delete the notes if any saved to properly run the test scenario
deletePreviouslySavedNotes()
loadZimFileInReader("testzim.zim")
note {
assertHomePageIsLoadedOfTestZimFile()
clickOnNoteMenuItem(context)
assertNoteDialogDisplayed()
writeDemoNote()
saveNote()
pressBack()
openNoteFragment()
assertToolbarExist()
assertNoteRecyclerViewExist()
clickOnTrashIcon()
assertDeleteNoteDialogDisplayed()
clickOnDeleteButton()
assertNoNotesTextDisplayed()
clickOnSavedNote()
clickOnOpenNote()
assertNoteSaved()
// to close the note dialog.
pressBack()
// to close the notes fragment.
pressBack()
}
}

@Test
fun testNoteEntryIsRemovedFromDatabaseWhenDeletedInAddNoteDialog() {
deletePreviouslySavedNotes()
loadZimFileInReader("testzim.zim")
note {
assertHomePageIsLoadedOfTestZimFile()
clickOnNoteMenuItem(context)
assertNoteDialogDisplayed()
writeDemoNote()
Expand All @@ -213,9 +216,45 @@ class NoteFragmentTest : BaseActivityTest() {
clickOnSavedNote()
clickOnOpenNote()
assertNoteSaved()
// to close the note dialog.
clickOnDeleteIcon()
pressBack()
// to close the notes fragment.
assertNoNotesTextDisplayed()
}
}

@Test
fun testNoteFileIsDeletedWhenNoteIsRemovedFromNotesScreen() {
deletePreviouslySavedNotes()
loadZimFileInReader("testzim.zim")
// Save a note.
note {
clickOnNoteMenuItem(context)
assertNoteDialogDisplayed()
writeDemoNote()
saveNote()
pressBack()
}
// Delete that note from "Note" screen.
deletePreviouslySavedNotes()
// Test the note file is deleted or not.
note {
clickOnNoteMenuItem(context)
assertNoteDialogDisplayed()
assertNotDoesNotExist()
pressBack()
}
}

private fun deletePreviouslySavedNotes() {
// delete the notes if any saved to properly run the test scenario
note {
openNoteFragment()
assertToolbarExist()
assertNoteRecyclerViewExist()
clickOnTrashIcon()
assertDeleteNoteDialogDisplayed()
clickOnDeleteButton()
assertNoNotesTextDisplayed()
pressBack()
}
}
Expand Down
10 changes: 10 additions & 0 deletions app/src/androidTest/java/org/kiwix/kiwixmobile/note/NoteRobot.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import androidx.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu
import androidx.test.espresso.action.ViewActions.clearText
import androidx.test.espresso.action.ViewActions.click
import androidx.test.espresso.action.ViewActions.typeText
import androidx.test.espresso.assertion.ViewAssertions.doesNotExist
import androidx.test.espresso.contrib.RecyclerViewActions.actionOnItemAtPosition
import androidx.test.espresso.matcher.ViewMatchers
import androidx.test.espresso.matcher.ViewMatchers.withContentDescription
Expand Down Expand Up @@ -111,6 +112,15 @@ class NoteRobot : BaseRobot() {
testFlakyView({ isVisible(Text(noteText)) })
}

fun assertNotDoesNotExist() {
testFlakyView({ onView(withText(noteText)).check(doesNotExist()) })
}

fun clickOnDeleteIcon() {
pauseForBetterTestPerformance()
testFlakyView({ clickOn(ViewId(R.id.delete_note)) })
}

fun clickOnTrashIcon() {
testFlakyView({ onView(withContentDescription(R.string.pref_clear_notes)).perform(click()) })
}
Expand Down
22 changes: 22 additions & 0 deletions core/src/main/java/org/kiwix/kiwixmobile/core/dao/NotesRoomDao.kt
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,16 @@ import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import io.reactivex.Flowable
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.kiwix.kiwixmobile.core.dao.entities.NotesRoomEntity
import org.kiwix.kiwixmobile.core.extensions.deleteFile
import org.kiwix.kiwixmobile.core.extensions.isFileExist
import org.kiwix.kiwixmobile.core.page.adapter.Page
import org.kiwix.kiwixmobile.core.page.notes.adapter.NoteListItem
import org.kiwix.kiwixmobile.core.reader.ZimReaderSource.Companion.fromDatabaseValue
import java.io.File

@Dao
abstract class NotesRoomDao : PageDao {
Expand Down Expand Up @@ -71,6 +77,22 @@ abstract class NotesRoomDao : PageDao {
notesList.forEachIndexed { _, note ->
val notesRoomEntity = NotesRoomEntity(note)
deleteNote(noteTitle = notesRoomEntity.noteTitle)
removeNoteFileFromStorage(notesRoomEntity.noteFilePath)
}
}

/**
* Deletes the saved file from storage.
* When the user deletes a note from the "Notes" screen,
* the associated file should also be removed from storage,
* as it is no longer needed.
*/
private fun removeNoteFileFromStorage(noteFilePath: String) {
CoroutineScope(Dispatchers.IO).launch {
val noteFile = File(noteFilePath)
if (noteFile.isFileExist()) {
noteFile.deleteFile()
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -436,7 +436,7 @@ class AddNoteDialog : DialogFragment() {
val noteText = dialogNoteAddNoteBinding?.addNoteEditText?.text.toString()
if (noteDeleted) {
dialogNoteAddNoteBinding?.addNoteEditText?.text?.clear()
mainRepositoryActions.deleteNote(articleNoteFileName)
mainRepositoryActions.deleteNote(getNoteTitle())
disableMenuItems()
view?.snack(
stringId = R.string.note_delete_successful,
Expand Down

0 comments on commit e61e3e8

Please sign in to comment.