diff --git a/app/core/src/main/java/com/fsck/k9/Core.kt b/app/core/src/main/java/com/fsck/k9/Core.kt index 0128027449..1defecc5f1 100644 --- a/app/core/src/main/java/com/fsck/k9/Core.kt +++ b/app/core/src/main/java/com/fsck/k9/Core.kt @@ -45,7 +45,7 @@ object Core : EarlyInit { @JvmStatic fun setServicesEnabled(context: Context) { val appContext = context.applicationContext - val acctLength = Preferences.getPreferences().accounts.size + val acctLength = Preferences.getPreferences().getAccounts().size val enable = acctLength > 0 setServicesEnabled(appContext, enable) @@ -82,7 +82,7 @@ object Core : EarlyInit { private fun restoreNotifications() { appCoroutineScope.launch(Dispatchers.IO) { - val accounts = preferences.accounts + val accounts = preferences.getAccounts() notificationController.restoreNewMailNotifications(accounts) } } diff --git a/app/core/src/main/java/com/fsck/k9/Preferences.kt b/app/core/src/main/java/com/fsck/k9/Preferences.kt index a8ab74c4fe..0ac085fcf7 100644 --- a/app/core/src/main/java/com/fsck/k9/Preferences.kt +++ b/app/core/src/main/java/com/fsck/k9/Preferences.kt @@ -98,19 +98,18 @@ class Preferences internal constructor( } } - val accounts: List - get() { - synchronized(accountLock) { - if (accountsMap == null) { - loadAccounts() - } - - return accountsInOrder.toList() + override fun getAccounts(): List { + synchronized(accountLock) { + if (accountsMap == null) { + loadAccounts() } + + return accountsInOrder.toList() } + } private val completeAccounts: List - get() = accounts.filter { it.isFinishedSetup } + get() = getAccounts().filter { it.isFinishedSetup } override fun getAccount(accountUuid: String): Account? { synchronized(accountLock) { @@ -203,7 +202,7 @@ class Preferences internal constructor( } val defaultAccount: Account? - get() = accounts.firstOrNull() + get() = getAccounts().firstOrNull() override fun saveAccount(account: Account) { ensureAssignedAccountNumber(account) @@ -236,7 +235,7 @@ class Preferences internal constructor( } fun generateAccountNumber(): Int { - val accountNumbers = accounts.map { it.accountNumber } + val accountNumbers = getAccounts().map { it.accountNumber } return findNewAccountNumber(accountNumbers) } diff --git a/app/core/src/main/java/com/fsck/k9/controller/NotificationOperations.kt b/app/core/src/main/java/com/fsck/k9/controller/NotificationOperations.kt index ee3e77ea53..b40c436cb2 100644 --- a/app/core/src/main/java/com/fsck/k9/controller/NotificationOperations.kt +++ b/app/core/src/main/java/com/fsck/k9/controller/NotificationOperations.kt @@ -30,7 +30,7 @@ internal class NotificationOperations( } private fun clearUnifiedInboxNotifications() { - for (account in preferences.accounts) { + for (account in preferences.getAccounts()) { val messageStore = messageStoreManager.getMessageStore(account) val folderIds = messageStore.getFolders(excludeLocalOnly = true) { folderDetails -> @@ -46,7 +46,7 @@ internal class NotificationOperations( } private fun clearAllNotifications() { - for (account in preferences.accounts) { + for (account in preferences.getAccounts()) { notificationController.clearNewMailNotifications(account, clearNewMessageState = false) } } diff --git a/app/core/src/main/java/com/fsck/k9/controller/push/PushController.kt b/app/core/src/main/java/com/fsck/k9/controller/push/PushController.kt index e3b3412efe..b4606e6b15 100644 --- a/app/core/src/main/java/com/fsck/k9/controller/push/PushController.kt +++ b/app/core/src/main/java/com/fsck/k9/controller/push/PushController.kt @@ -74,7 +74,7 @@ class PushController internal constructor( Timber.v("PushController.disablePush()") coroutineScope.launch(coroutineDispatcher) { - for (account in preferences.accounts) { + for (account in preferences.getAccounts()) { account.folderPushMode = FolderMode.NONE preferences.saveAccount(account) } @@ -191,18 +191,22 @@ class PushController internal constructor( realPushAccounts.isEmpty() -> { stopServices() } + backgroundSyncDisabledViaSystem -> { setPushNotificationState(WAIT_BACKGROUND_SYNC) startServices() } + networkNotAvailable -> { setPushNotificationState(WAIT_NETWORK) startServices() } + arePushersActive -> { setPushNotificationState(LISTENING) startServices() } + else -> { stopServices() } @@ -210,7 +214,7 @@ class PushController internal constructor( } private fun getPushAccounts(): List { - return preferences.accounts.filter { account -> + return preferences.getAccounts().filter { account -> account.folderPushMode != FolderMode.NONE && backendManager.getBackend(account).isPushCapable } } diff --git a/app/core/src/main/java/com/fsck/k9/job/K9JobManager.kt b/app/core/src/main/java/com/fsck/k9/job/K9JobManager.kt index 1328476521..752b2a2967 100644 --- a/app/core/src/main/java/com/fsck/k9/job/K9JobManager.kt +++ b/app/core/src/main/java/com/fsck/k9/job/K9JobManager.kt @@ -23,7 +23,7 @@ class K9JobManager( private fun scheduleMailSync() { cancelAllMailSyncJobs() - preferences.accounts.forEach { account -> + preferences.getAccounts().forEach { account -> mailSyncWorkerManager.scheduleMailSync(account) } } diff --git a/app/core/src/main/java/com/fsck/k9/notification/NotificationChannelManager.kt b/app/core/src/main/java/com/fsck/k9/notification/NotificationChannelManager.kt index b91c9665fe..f62c1650f4 100644 --- a/app/core/src/main/java/com/fsck/k9/notification/NotificationChannelManager.kt +++ b/app/core/src/main/java/com/fsck/k9/notification/NotificationChannelManager.kt @@ -41,7 +41,7 @@ class NotificationChannelManager( backgroundExecutor.execute { addGeneralChannels() - val accounts = preferences.accounts + val accounts = preferences.getAccounts() removeChannelsForNonExistingOrChangedAccounts(notificationManager, accounts) addChannelsForAccounts(notificationManager, accounts) diff --git a/app/core/src/main/java/com/fsck/k9/preferences/AccountManager.kt b/app/core/src/main/java/com/fsck/k9/preferences/AccountManager.kt index 4037932c77..beb811028c 100644 --- a/app/core/src/main/java/com/fsck/k9/preferences/AccountManager.kt +++ b/app/core/src/main/java/com/fsck/k9/preferences/AccountManager.kt @@ -6,6 +6,7 @@ import com.fsck.k9.AccountsChangeListener import kotlinx.coroutines.flow.Flow interface AccountManager { + fun getAccounts(): List fun getAccountsFlow(): Flow> fun getAccount(accountUuid: String): Account? fun getAccountFlow(accountUuid: String): Flow diff --git a/app/core/src/main/java/com/fsck/k9/search/LocalSearchExtensions.kt b/app/core/src/main/java/com/fsck/k9/search/LocalSearchExtensions.kt index d528446987..00c939dc9c 100644 --- a/app/core/src/main/java/com/fsck/k9/search/LocalSearchExtensions.kt +++ b/app/core/src/main/java/com/fsck/k9/search/LocalSearchExtensions.kt @@ -19,7 +19,7 @@ val LocalSearch.isSingleFolder: Boolean @JvmName("getAccountsFromLocalSearch") fun LocalSearch.getAccounts(preferences: Preferences): List { - val accounts = preferences.accounts + val accounts = preferences.getAccounts() return if (searchAllAccounts()) { accounts } else { diff --git a/app/k9mail/src/main/java/com/fsck/k9/account/AccountColorPicker.kt b/app/k9mail/src/main/java/com/fsck/k9/account/AccountColorPicker.kt index e9392e2df6..afb835ad3d 100644 --- a/app/k9mail/src/main/java/com/fsck/k9/account/AccountColorPicker.kt +++ b/app/k9mail/src/main/java/com/fsck/k9/account/AccountColorPicker.kt @@ -9,7 +9,7 @@ class AccountColorPicker( private val resources: Resources, ) { fun pickColor(): Int { - val accounts = preferences.accounts + val accounts = preferences.getAccounts() val usedAccountColors = accounts.map { it.chipColor }.toSet() val accountColors = resources.getIntArray(R.array.account_colors).toList() diff --git a/app/k9mail/src/test/java/com/fsck/k9/account/FakeAccountManager.kt b/app/k9mail/src/test/java/com/fsck/k9/account/FakeAccountManager.kt index 57e78c6f14..7362b26f75 100644 --- a/app/k9mail/src/test/java/com/fsck/k9/account/FakeAccountManager.kt +++ b/app/k9mail/src/test/java/com/fsck/k9/account/FakeAccountManager.kt @@ -11,6 +11,8 @@ class FakeAccountManager( private val isFailureOnSave: Boolean = false, ) : AccountManager { + override fun getAccounts(): List = accounts.values.toList() + override fun getAccountsFlow(): Flow> { TODO("Not yet implemented") } diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt b/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt index 509c2ad31c..5f26a5ab19 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/activity/MessageList.kt @@ -138,7 +138,7 @@ open class MessageList : return } - val accounts = preferences.accounts + val accounts = preferences.getAccounts() deleteIncompleteAccounts(accounts) val hasAccountSetup = accounts.any { it.isFinishedSetup } if (!hasAccountSetup) { @@ -332,9 +332,11 @@ open class MessageList : DisplayMode.MESSAGE_LIST -> { showMessageList() } + DisplayMode.MESSAGE_VIEW -> { showMessageView() } + DisplayMode.SPLIT_VIEW -> { val messageListFragment = checkNotNull(this.messageListFragment) @@ -712,6 +714,7 @@ open class MessageList : return true } } + KeyEvent.KEYCODE_VOLUME_DOWN -> { if (messageViewContainerFragment != null && displayMode != DisplayMode.MESSAGE_LIST && K9.isUseVolumeKeysForNavigation @@ -720,10 +723,12 @@ open class MessageList : return true } } + KeyEvent.KEYCODE_DEL -> { onDeleteHotKey() return true } + KeyEvent.KEYCODE_DPAD_LEFT -> { return if (messageViewContainerFragment != null && displayMode == DisplayMode.MESSAGE_VIEW) { showPreviousMessage() @@ -731,6 +736,7 @@ open class MessageList : false } } + KeyEvent.KEYCODE_DPAD_RIGHT -> { return if (messageViewContainerFragment != null && displayMode == DisplayMode.MESSAGE_VIEW) { showNextMessage() @@ -745,22 +751,27 @@ open class MessageList : messageListFragment!!.onCompose() return true } + 'o' -> { messageListFragment!!.onCycleSort() return true } + 'i' -> { messageListFragment!!.onReverseSort() return true } + 'd' -> { onDeleteHotKey() return true } + 's' -> { messageListFragment!!.toggleMessageSelect() return true } + 'g' -> { if (displayMode == DisplayMode.MESSAGE_LIST) { messageListFragment!!.onToggleFlagged() @@ -769,6 +780,7 @@ open class MessageList : } return true } + 'm' -> { if (displayMode == DisplayMode.MESSAGE_LIST) { messageListFragment!!.onMove() @@ -777,6 +789,7 @@ open class MessageList : } return true } + 'v' -> { if (displayMode == DisplayMode.MESSAGE_LIST) { messageListFragment!!.onArchive() @@ -785,6 +798,7 @@ open class MessageList : } return true } + 'y' -> { if (displayMode == DisplayMode.MESSAGE_LIST) { messageListFragment!!.onCopy() @@ -793,6 +807,7 @@ open class MessageList : } return true } + 'z' -> { if (displayMode == DisplayMode.MESSAGE_LIST) { messageListFragment!!.onToggleRead() @@ -801,30 +816,35 @@ open class MessageList : } return true } + 'f' -> { if (messageViewContainerFragment != null) { messageViewContainerFragment!!.onForward() } return true } + 'a' -> { if (messageViewContainerFragment != null) { messageViewContainerFragment!!.onReplyAll() } return true } + 'r' -> { if (messageViewContainerFragment != null) { messageViewContainerFragment!!.onReply() } return true } + 'j', 'p' -> { if (messageViewContainerFragment != null) { showPreviousMessage() } return true } + 'n', 'k' -> { if (messageViewContainerFragment != null) { showNextMessage() diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/ui/messagelist/MessageListFragment.kt b/app/ui/legacy/src/main/java/com/fsck/k9/ui/messagelist/MessageListFragment.kt index b3faefeeb3..f06d04e329 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/ui/messagelist/MessageListFragment.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/ui/messagelist/MessageListFragment.kt @@ -460,7 +460,7 @@ class MessageListFragment : } val subtitle = account.let { account -> - if (account == null || isUnifiedInbox || preferences.accounts.size == 1) { + if (account == null || isUnifiedInbox || preferences.getAccounts().size == 1) { null } else { account.displayName diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/export/SettingsExportViewModel.kt b/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/export/SettingsExportViewModel.kt index 70f0b73209..7c68edaabf 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/export/SettingsExportViewModel.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/export/SettingsExportViewModel.kt @@ -58,7 +58,7 @@ class SettingsExportViewModel( uiModelLiveData.value = uiModel viewModelScope.launch { - val accounts = withContext(Dispatchers.IO) { preferences.accounts } + val accounts = withContext(Dispatchers.IO) { preferences.getAccounts() } accountsMap = accounts.map { it.accountNumber to it.uuid }.toMap()