Skip to content

Commit

Permalink
Merge pull request thunderbird#8131 from wmontwe/add-drawer-folder-li…
Browse files Browse the repository at this point in the history
…st-part2

Add drawer folder list - Part 2
  • Loading branch information
wmontwe authored Sep 11, 2024
2 parents ac9c51c + c05c588 commit e06f57f
Show file tree
Hide file tree
Showing 50 changed files with 330 additions and 200 deletions.
10 changes: 10 additions & 0 deletions core/mail/folder/api/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
plugins {
id(ThunderbirdPlugins.Library.jvm)
alias(libs.plugins.android.lint)
}

dependencies {
implementation(projects.mail.common)

testImplementation(projects.core.testing)
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package app.k9mail.legacy.folder
package app.k9mail.core.mail.folder.api

data class Folder(
val id: Long,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package app.k9mail.legacy.folder
package app.k9mail.core.mail.folder.api

import com.fsck.k9.mail.FolderClass

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package app.k9mail.legacy.folder
package app.k9mail.core.mail.folder.api

enum class FolderType {
REGULAR,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,21 +13,21 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.GravityCompat
import androidx.drawerlayout.widget.DrawerLayout
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout
import app.k9mail.core.mail.folder.api.Folder
import app.k9mail.core.ui.legacy.designsystem.atom.icon.Icons
import app.k9mail.core.ui.theme.api.Theme
import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccount
import app.k9mail.feature.navigation.drawer.legacy.AccountsViewModel
import app.k9mail.feature.navigation.drawer.legacy.DisplayUnifiedInbox
import app.k9mail.feature.navigation.drawer.legacy.FolderList
import app.k9mail.feature.navigation.drawer.legacy.FoldersViewModel
import app.k9mail.legacy.account.Account
import app.k9mail.legacy.folder.DisplayFolder
import app.k9mail.legacy.folder.Folder
import app.k9mail.legacy.message.controller.MessagingControllerMailChecker
import app.k9mail.legacy.message.controller.SimpleMessagingListener
import app.k9mail.legacy.ui.account.AccountImageLoader
import app.k9mail.legacy.ui.account.AccountsViewModel
import app.k9mail.legacy.ui.account.DisplayAccount
import app.k9mail.legacy.ui.folder.DisplayUnifiedInbox
import app.k9mail.legacy.ui.folder.DisplayFolder
import app.k9mail.legacy.ui.folder.FolderIconProvider
import app.k9mail.legacy.ui.folder.FolderList
import app.k9mail.legacy.ui.folder.FolderNameFormatter
import app.k9mail.legacy.ui.folder.FoldersViewModel
import app.k9mail.legacy.ui.theme.ThemeManager
import com.fsck.k9.K9
import com.fsck.k9.ui.base.livedata.observeNotNull
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,43 @@
package app.k9mail.feature.navigation.drawer

import app.k9mail.feature.navigation.drawer.domain.DomainContract.UseCase
import app.k9mail.feature.navigation.drawer.domain.usecase.GetDisplayAccounts
import app.k9mail.feature.navigation.drawer.legacy.AccountsViewModel
import app.k9mail.feature.navigation.drawer.legacy.FoldersViewModel
import app.k9mail.feature.navigation.drawer.ui.DrawerViewModel
import com.fsck.k9.CoreResourceProvider
import com.fsck.k9.K9
import org.koin.androidx.viewmodel.dsl.viewModel
import org.koin.core.module.Module
import org.koin.dsl.module

val navigationDrawerModule: Module = module {

single<UseCase.GetDisplayAccounts> {
GetDisplayAccounts(
accountManager = get(),
messageCountsProvider = get(),
messageListRepository = get(),
)
}

viewModel {
AccountsViewModel(
getDisplayAccounts = get(),
)
}

viewModel {
val coreResourceProvider = get<CoreResourceProvider>()

FoldersViewModel(
folderRepository = get(),
messageCountsProvider = get(),
isShowUnifiedInbox = { K9.isShowUnifiedInbox },
getUnifiedInboxTitle = { coreResourceProvider.searchUnifiedInboxTitle() },
getUnifiedInboxDetail = { coreResourceProvider.searchUnifiedInboxDetail() },
)
}

viewModel { DrawerViewModel() }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package app.k9mail.feature.navigation.drawer.domain

import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccount
import kotlinx.coroutines.flow.Flow

interface DomainContract {

interface UseCase {
fun interface GetDisplayAccounts {
fun execute(): Flow<List<DisplayAccount>>
}
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package app.k9mail.legacy.ui.account
package app.k9mail.feature.navigation.drawer.domain.entity

import app.k9mail.legacy.account.Account

Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package app.k9mail.legacy.ui.account
package app.k9mail.feature.navigation.drawer.domain.usecase

import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import app.k9mail.feature.navigation.drawer.domain.DomainContract.UseCase
import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccount
import app.k9mail.legacy.account.Account
import app.k9mail.legacy.account.AccountManager
import app.k9mail.legacy.mailstore.MessageListChangedListener
import app.k9mail.legacy.mailstore.MessageListRepository
import app.k9mail.legacy.message.controller.MessageCounts
import app.k9mail.legacy.message.controller.MessageCountsProvider
import kotlin.coroutines.CoroutineContext
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.channels.awaitClose
Expand All @@ -19,28 +19,32 @@ import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.launch

@OptIn(ExperimentalCoroutinesApi::class)
class AccountsViewModel(
accountManager: AccountManager,
class GetDisplayAccounts(
private val accountManager: AccountManager,
private val messageCountsProvider: MessageCountsProvider,
private val messageListRepository: MessageListRepository,
) : ViewModel() {
private val displayAccountFlow: Flow<List<DisplayAccount>> = accountManager.getAccountsFlow()
.flatMapLatest { accounts ->
val messageCountsFlows: List<Flow<MessageCounts>> = accounts.map { account ->
getMessageCountsFlow(account)
}
private val coroutineContext: CoroutineContext = Dispatchers.IO,
) : UseCase.GetDisplayAccounts {

@OptIn(ExperimentalCoroutinesApi::class)
override fun execute(): Flow<List<DisplayAccount>> {
return accountManager.getAccountsFlow()
.flatMapLatest { accounts ->
val messageCountsFlows: List<Flow<MessageCounts>> = accounts.map { account ->
getMessageCountsFlow(account)
}

combine(messageCountsFlows) { messageCountsList ->
messageCountsList.mapIndexed { index, messageCounts ->
DisplayAccount(
account = accounts[index],
unreadMessageCount = messageCounts.unread,
starredMessageCount = messageCounts.starred,
)
combine(messageCountsFlows) { messageCountsList ->
messageCountsList.mapIndexed { index, messageCounts ->
DisplayAccount(
account = accounts[index],
unreadMessageCount = messageCounts.unread,
starredMessageCount = messageCounts.starred,
)
}
}
}
}
}

private fun getMessageCountsFlow(account: Account): Flow<MessageCounts> {
return callbackFlow {
Expand All @@ -56,8 +60,6 @@ class AccountsViewModel(
awaitClose {
messageListRepository.removeListener(listener)
}
}.flowOn(Dispatchers.IO)
}.flowOn(coroutineContext)
}

val displayAccountsLiveData: LiveData<List<DisplayAccount>> = displayAccountFlow.asLiveData()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package app.k9mail.feature.navigation.drawer.legacy

import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import app.k9mail.feature.navigation.drawer.domain.DomainContract.UseCase
import app.k9mail.feature.navigation.drawer.domain.entity.DisplayAccount

class AccountsViewModel(
getDisplayAccounts: UseCase.GetDisplayAccounts,
) : ViewModel() {
val displayAccountsLiveData: LiveData<List<DisplayAccount>> = getDisplayAccounts.execute().asLiveData()
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package app.k9mail.legacy.ui.folder
package app.k9mail.feature.navigation.drawer.legacy

data class DisplayUnifiedInbox(
val unreadMessageCount: Int,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package app.k9mail.legacy.ui.folder
package app.k9mail.feature.navigation.drawer.legacy

import app.k9mail.legacy.folder.DisplayFolder
import app.k9mail.legacy.ui.folder.DisplayFolder

data class FolderList(
val unifiedInbox: DisplayUnifiedInbox?,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package app.k9mail.legacy.ui.folder
package app.k9mail.feature.navigation.drawer.legacy

import androidx.lifecycle.LiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.asLiveData
import androidx.lifecycle.viewModelScope
import app.k9mail.legacy.account.Account
import app.k9mail.legacy.mailstore.FolderRepository
import app.k9mail.legacy.message.controller.MessageCountsProvider
import app.k9mail.legacy.search.SearchAccount
import app.k9mail.legacy.ui.folder.DisplayFolderRepository
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
Expand All @@ -20,7 +20,7 @@ import kotlinx.coroutines.launch

@OptIn(ExperimentalCoroutinesApi::class)
class FoldersViewModel(
private val folderRepository: FolderRepository,
private val folderRepository: DisplayFolderRepository,
private val messageCountsProvider: MessageCountsProvider,
private val isShowUnifiedInbox: () -> Boolean,
private val getUnifiedInboxTitle: () -> String,
Expand All @@ -33,7 +33,7 @@ class FoldersViewModel(
if (account == null) {
flowOf(0 to emptyList())
} else {
folderRepository.getDisplayFoldersFlow(account)
folderRepository.getDisplayFoldersFlow(account.uuid)
.map { displayFolders ->
account.accountNumber to displayFolders
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package app.k9mail.feature.widget.unread

import android.content.Context
import app.k9mail.core.mail.folder.api.Folder
import app.k9mail.core.mail.folder.api.FolderType
import app.k9mail.legacy.account.Account
import app.k9mail.legacy.folder.Folder
import app.k9mail.legacy.folder.FolderType
import app.k9mail.legacy.mailstore.FolderRepository
import app.k9mail.legacy.message.controller.MessageCounts
import app.k9mail.legacy.message.controller.MessageCountsProvider
Expand Down
1 change: 1 addition & 0 deletions legacy/core/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ dependencies {
api(projects.backend.api)
api(projects.library.htmlCleaner)
api(projects.core.android.common)
api(projects.core.mail.folder.api)

api(projects.legacy.account)
api(projects.legacy.di)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,12 @@ import com.fsck.k9.message.extractors.MessagePreviewCreator
import org.koin.dsl.module

val mailStoreModule = module {
single { FolderRepository(messageStoreManager = get(), accountManager = get()) }
single {
FolderRepository(
messageStoreManager = get(),
accountManager = get(),
)
}
single { MessageViewInfoExtractorFactory(get(), get(), get()) }
single { StorageManager.getInstance(get()) }
single { SpecialFolderSelectionStrategy() }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.fsck.k9.mailstore

import app.k9mail.legacy.folder.FolderType
import app.k9mail.core.mail.folder.api.FolderType
import app.k9mail.legacy.folder.RemoteFolder

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.fsck.k9.mailstore

import app.k9mail.core.common.mail.Protocols
import app.k9mail.core.mail.folder.api.FolderType
import app.k9mail.legacy.account.Account
import app.k9mail.legacy.account.Account.SpecialFolderSelection
import app.k9mail.legacy.folder.FolderType
import app.k9mail.legacy.folder.RemoteFolder
import app.k9mail.legacy.mailstore.FolderRepository
import com.fsck.k9.Preferences
Expand Down
2 changes: 2 additions & 0 deletions legacy/folder/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,6 @@ android {

dependencies {
implementation(projects.mail.common)

implementation(projects.core.mail.folder.api)
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package app.k9mail.legacy.folder

import app.k9mail.core.mail.folder.api.FolderType

data class RemoteFolder(
val id: Long,
val serverId: String,
Expand Down
1 change: 1 addition & 0 deletions legacy/mailstore/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ dependencies {
implementation(projects.legacy.search)

implementation(projects.mail.common)
implementation(projects.core.mail.folder.api)
}
Loading

0 comments on commit e06f57f

Please sign in to comment.