Skip to content

Commit

Permalink
Move Folder cloning to a coroutine in the VM
Browse files Browse the repository at this point in the history
  • Loading branch information
KevinBoulongne committed Jun 13, 2024
1 parent 4cf8a20 commit f8502be
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 24 deletions.
3 changes: 3 additions & 0 deletions app/src/main/java/com/infomaniak/mail/data/models/Folder.kt
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,9 @@ class Folder : RealmObject, Cloneable {
val isRoot: Boolean
inline get() = !path.contains(separator)

val isRootAndCustom: Boolean
inline get() = role == null && isRoot

fun initLocalValues(
lastUpdatedAt: RealmInstant?,
cursor: String?,
Expand Down
20 changes: 2 additions & 18 deletions app/src/main/java/com/infomaniak/mail/ui/main/move/MoveAdapter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -97,25 +97,9 @@ class MoveAdapter @Inject constructor() : ListAdapter<Folder, FolderViewHolder>(
setOnClickListener { onFolderClicked.invoke(folder.id) }
}

fun setFolders(newFolders: List<Folder>, newCurrentFolderId: String? = null, isSearching: Boolean) = runCatchingRealm {

fun foldersWithDividersAndIndents(): List<Folder> {
var isFirstCustomFolder = true
return newFolders.map { folder ->
folder.clone().apply {
shouldDisplayDivider = if (folder.role == null && folder.isRoot && isFirstCustomFolder) {
isFirstCustomFolder = false
true
} else {
false
}
shouldDisplayIndent = folder.isRoot || !isSearching
}
}
}

fun setFolders(newFolders: List<Folder>, newCurrentFolderId: String? = null) = runCatchingRealm {
newCurrentFolderId?.let { currentFolderId = it }
submitList(foldersWithDividersAndIndents())
submitList(newFolders)
}

companion object {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,14 +121,14 @@ class MoveFragment : Fragment() {

private fun observeFolders() {
moveViewModel.getCurrentFolderAndAllFolders().observe(viewLifecycleOwner) { (allFolders, currentFolderId) ->
moveAdapter.setFolders(allFolders, currentFolderId, isSearching = false)
moveAdapter.setFolders(allFolders, currentFolderId)
setupSearchBar(allFolders, currentFolderId)
}
}

private fun observeSearchResults() {
moveViewModel.filterResults.observe(viewLifecycleOwner) { (filteredFolders, currentFolderId) ->
moveAdapter.setFolders(filteredFolders, currentFolderId, isSearching = true)
moveAdapter.setFolders(filteredFolders, currentFolderId)
}
}

Expand Down Expand Up @@ -159,7 +159,7 @@ class MoveFragment : Fragment() {
if (newQuery?.isNotBlank() == true) {
moveViewModel.filterFolders(newQuery.toString(), allFolders, currentFolderId, shouldDebounce = true)
} else {
moveAdapter.setFolders(allFolders, currentFolderId, isSearching = false)
moveAdapter.setFolders(allFolders, currentFolderId)
}

if (!hasAlreadyTrackedSearch) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,15 @@ class MoveViewModel @Inject constructor(
val currentFolderId = messageUid?.let(messageController::getMessage)?.folderId
?: threadController.getThread(threadsUids.first())!!.folderId

val folders = folderController.getMoveFolders().flattenFolderChildren()
var isFirstRootAndCustom = true
val folders = folderController.getMoveFolders().flattenFolderChildren().map { folder ->
folder.apply {
if (isRootAndCustom && isFirstRootAndCustom) {
isFirstRootAndCustom = false
shouldDisplayDivider = true
}
}
}

emit(folders to currentFolderId)
}
Expand All @@ -73,9 +81,24 @@ class MoveViewModel @Inject constructor(
delay(FILTER_DEBOUNCE_DURATION)
ensureActive()
}
val filteredFolders = folders.filter { folder ->

var isFirstRootAndCustom = true
val filteredFolders = folders.mapNotNull { folder ->
val folderName = folder.role?.folderNameRes?.let(appContext::getString) ?: folder.name
folderName.standardize().contains(query.standardize())
val isFound = folderName.standardize().contains(query.standardize())
if (isFound) {
folder.clone().apply {
shouldDisplayDivider = if (isRootAndCustom && isFirstRootAndCustom) {
isFirstRootAndCustom = false
true
} else {
false
}
shouldDisplayIndent = false
}
} else {
null
}
}

filterResults.postValue(filteredFolders to currentFolderId)
Expand Down

0 comments on commit f8502be

Please sign in to comment.