Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2f52fd5f authored by cketti's avatar cketti
Browse files

Rewrite ChooseFolderViewModel to use Flow

parent ddda3f88
Loading
Loading
Loading
Loading
+7 −15
Original line number Diff line number Diff line
@@ -7,7 +7,6 @@ import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import androidx.appcompat.widget.SearchView
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.RecyclerView
import com.fsck.k9.Account
import com.fsck.k9.Account.FolderMode
@@ -20,7 +19,6 @@ import com.fsck.k9.ui.R
import com.fsck.k9.ui.base.K9Activity
import com.fsck.k9.ui.folders.FolderIconProvider
import com.fsck.k9.ui.folders.FolderNameFormatter
import com.fsck.k9.ui.folders.FoldersLiveData
import com.mikepenz.fastadapter.FastAdapter
import com.mikepenz.fastadapter.adapters.ItemAdapter
import java.util.Locale
@@ -42,11 +40,6 @@ class ChooseFolderActivity : K9Activity() {
    private var scrollToFolderId: Long? = null
    private var messageReference: String? = null
    private var showDisplayableOnly = false
    private var foldersLiveData: FoldersLiveData? = null

    private val folderListObserver = Observer<List<DisplayFolder>> { folders ->
        updateFolderList(folders)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
@@ -60,12 +53,14 @@ class ChooseFolderActivity : K9Activity() {

        initializeFolderList()

        viewModel.getFolders().observe(this) { folders ->
            updateFolderList(folders)
        }

        val savedDisplayMode = savedInstanceState?.getString(STATE_DISPLAY_MODE)?.let { FolderMode.valueOf(it) }
        val displayMode = savedDisplayMode ?: getInitialDisplayMode()

        foldersLiveData = viewModel.getFolders(account, displayMode).apply {
            observe(this@ChooseFolderActivity, folderListObserver)
        }
        viewModel.setDisplayMode(account, displayMode)
    }

    private fun decodeArguments(savedInstanceState: Bundle?): Boolean {
@@ -137,7 +132,7 @@ class ChooseFolderActivity : K9Activity() {
    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        scrollToFolderId?.let { folderId -> outState.putLong(STATE_SCROLL_TO_FOLDER_ID, folderId) }
        outState.putString(STATE_DISPLAY_MODE, foldersLiveData?.displayMode?.name)
        outState.putString(STATE_DISPLAY_MODE, viewModel.currentDisplayMode?.name)
    }

    override fun onCreateOptionsMenu(menu: Menu): Boolean {
@@ -181,10 +176,7 @@ class ChooseFolderActivity : K9Activity() {
    }

    private fun setDisplayMode(displayMode: FolderMode) {
        foldersLiveData?.removeObserver(folderListObserver)
        foldersLiveData = viewModel.getFolders(account, displayMode).apply {
            observe(this@ChooseFolderActivity, folderListObserver)
        }
        viewModel.setDisplayMode(account, displayMode)
    }

    private fun returnResult(folderId: Long, displayName: String) {
+28 −11
Original line number Diff line number Diff line
package com.fsck.k9.ui.choosefolder

import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import com.fsck.k9.Account
import com.fsck.k9.Account.FolderMode
import com.fsck.k9.ui.folders.FoldersLiveData
import com.fsck.k9.ui.folders.FoldersLiveDataFactory
import com.fsck.k9.mailstore.DisplayFolder
import com.fsck.k9.mailstore.FolderRepository
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.launch

class ChooseFolderViewModel(private val foldersLiveDataFactory: FoldersLiveDataFactory) : ViewModel() {
    private var foldersLiveData: FoldersLiveData? = null
@OptIn(ExperimentalCoroutinesApi::class)
class ChooseFolderViewModel(private val folderRepository: FolderRepository) : ViewModel() {
    private val inputFlow = MutableSharedFlow<DisplayMode>(replay = 1)
    private val foldersFlow = inputFlow
        .flatMapLatest { (account, displayMode) ->
            folderRepository.getDisplayFoldersFlow(account, displayMode)
        }

    var currentDisplayMode: FolderMode? = null
        private set

    fun getFolders(account: Account, displayMode: FolderMode): FoldersLiveData {
        val liveData = foldersLiveData
        if (liveData != null && liveData.account.uuid == account.uuid && liveData.displayMode == displayMode) {
            return liveData
    fun getFolders(): LiveData<List<DisplayFolder>> {
        return foldersFlow.asLiveData()
    }

        return foldersLiveDataFactory.create(account, displayMode).also {
            foldersLiveData = it
    fun setDisplayMode(account: Account, displayMode: FolderMode) {
        currentDisplayMode = displayMode
        viewModelScope.launch {
            inputFlow.emit(DisplayMode(account, displayMode))
        }
    }
}

private data class DisplayMode(val account: Account, val displayMode: FolderMode)