Skip to content

Commit 22de660

Browse files
Delete Thread in Realm if it's empty and we're trying to display it in ThreadsList
1 parent 16cd037 commit 22de660

File tree

6 files changed

+23
-0
lines changed

6 files changed

+23
-0
lines changed

app/src/main/java/com/infomaniak/mail/data/cache/mailboxContent/ThreadController.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,12 @@ class ThreadController @Inject constructor(
159159
}
160160
}
161161
}
162+
163+
fun deleteThread(threadUid: String) {
164+
mailboxContentRealm().writeBlocking {
165+
delete(getThreadQuery(threadUid, realm = this))
166+
}
167+
}
162168
//endregion
163169

164170
companion object {

app/src/main/java/com/infomaniak/mail/ui/MainViewModel.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,6 +1047,10 @@ class MainViewModel @Inject constructor(
10471047
snackbarManager.postValue(appContext.getString(snackbarTitleRes))
10481048
}
10491049

1050+
fun deleteThreadInRealm(threadUid: String) = viewModelScope.launch(ioCoroutineContext) {
1051+
threadController.deleteThread(threadUid)
1052+
}
1053+
10501054
private fun shouldAutoAdvance(message: Message?, threadsUids: List<String>): Boolean {
10511055
val isWorkingWithThread = message == null
10521056
return isWorkingWithThread || threadHasOnlyOneMessageLeftInCurrentFolder(threadsUids.first())

app/src/main/java/com/infomaniak/mail/ui/main/folder/ThreadListAdapter.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,14 @@ class ThreadListAdapter @Inject constructor(
191191

192192
private fun CardviewThreadItemBinding.displayThread(thread: Thread, position: Int) {
193193

194+
// If we are trying to display an empty Thread, don't. Just delete it.
195+
if (thread.messages.isEmpty()) {
196+
// TODO: Find why we are sometimes displaying empty Threads, and fix it instead of just deleting them.
197+
// It's possibly because we are out of sync, and the situation will resolve itself shortly? ¯\_(ツ)_/¯
198+
threadListAdapterCallback?.deleteThreadInRealm?.invoke(thread.uid)
199+
return
200+
}
201+
194202
refreshCachedSelectedPosition(thread.uid, position) // If item changed position, update cached position.
195203
setupThreadDensityDependentUi()
196204
displayAvatar(thread)

app/src/main/java/com/infomaniak/mail/ui/main/folder/ThreadListAdapterCallback.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,5 @@ interface ThreadListAdapterCallback {
2525
var onFlushClicked: ((dialogTitle: String) -> Unit)?
2626
var onLoadMoreClicked: () -> Unit
2727
var onPositionClickedChanged: (position: Int, previousPosition: Int) -> Unit
28+
var deleteThreadInRealm: (threadUid: String) -> Unit
2829
}

app/src/main/java/com/infomaniak/mail/ui/main/folder/ThreadListFragment.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,8 @@ class ThreadListFragment : TwoPaneFragment(), SwipeRefreshLayout.OnRefreshListen
322322
}
323323

324324
override var onPositionClickedChanged: (Int, Int) -> Unit = ::updateAutoAdvanceNaturalThread
325+
326+
override var deleteThreadInRealm: (String) -> Unit = { threadUid -> mainViewModel.deleteThreadInRealm(threadUid) }
325327
},
326328
multiSelection = object : MultiSelectionListener<Thread> {
327329
override var isEnabled by mainViewModel::isMultiSelectOn

app/src/main/java/com/infomaniak/mail/ui/main/search/SearchFragment.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,8 @@ class SearchFragment : TwoPaneFragment() {
172172
}
173173

174174
override var onPositionClickedChanged: (Int, Int) -> Unit = ::updateAutoAdvanceNaturalThread
175+
176+
override var deleteThreadInRealm: (String) -> Unit = { threadUid -> mainViewModel.deleteThreadInRealm(threadUid) }
175177
},
176178
)
177179

0 commit comments

Comments
 (0)