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

Commit c7ecd908 authored by Vasyl Gello's avatar Vasyl Gello
Browse files

Add the per-folder local message cleanup

parent 26b78233
Loading
Loading
Loading
Loading
+62 −1
Original line number Diff line number Diff line
package com.fsck.k9.ui.managefolders

import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View
import androidx.navigation.fragment.findNavController
import androidx.preference.Preference
import com.fsck.k9.fragment.ConfirmationDialogFragment
import com.fsck.k9.fragment.ConfirmationDialogFragment.ConfirmationDialogFragmentListener
import com.fsck.k9.ui.R
import com.fsck.k9.ui.folders.FolderNameFormatter
import com.fsck.k9.ui.observeNotNull
@@ -12,7 +17,7 @@ import org.koin.android.ext.android.inject
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.parameter.parametersOf

class FolderSettingsFragment : PreferenceFragmentCompat() {
class FolderSettingsFragment : PreferenceFragmentCompat(), ConfirmationDialogFragmentListener {
    private val viewModel: FolderSettingsViewModel by viewModel()
    private val folderNameFormatter: FolderNameFormatter by inject { parametersOf(requireActivity()) }

@@ -21,6 +26,26 @@ class FolderSettingsFragment : PreferenceFragmentCompat() {
        setPreferencesFromResource(R.xml.empty_preferences, null)
    }

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        super.onCreateOptionsMenu(menu, inflater)
        inflater.inflate(R.menu.folder_settings_option, menu)
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            R.id.clear_local_folder -> {
                viewModel.showClearFolderConfirmationDialog()
                true
            }
            else -> super.onOptionsItemSelected(item)
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setHasOptionsMenu(true)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

@@ -35,6 +60,8 @@ class FolderSettingsFragment : PreferenceFragmentCompat() {
                    is FolderSettingsData -> initPreferences(folderSettingsResult)
                }
            }

        viewModel.getActionEvents().observeNotNull(this) { handleActionEvents(it) }
    }

    private fun navigateBack() {
@@ -53,10 +80,44 @@ class FolderSettingsFragment : PreferenceFragmentCompat() {
        findPreference<Preference>(PREFERENCE_TOP_CATEGORY)!!.title = folderDisplayName
    }

    private fun handleActionEvents(action: Action) {
        when (action) {
            is Action.ShowClearFolderConfirmationDialog -> showClearFolderConfirmationDialog()
        }
    }

    private fun showClearFolderConfirmationDialog() {
        val dialogFragment = ConfirmationDialogFragment.newInstance(
                DIALOG_CLEAR_FOLDER,
                getString(R.string.dialog_confirm_clear_local_folder_title),
                getString(R.string.dialog_confirm_clear_local_folder_message),
                getString(R.string.okay_action),
                getString(R.string.cancel_action)
        )
        dialogFragment.setTargetFragment(this, REQUEST_CLEAR_FOLDER)
        dialogFragment.show(requireFragmentManager(), TAG_CLEAR_FOLDER_CONFIRMATION)
    }

    override fun doPositiveClick(dialogId: Int) {
        when (dialogId) {
            DIALOG_CLEAR_FOLDER -> {
                viewModel.onClearFolderConfirmation()
            }
        }
    }

    override fun doNegativeClick(dialogId: Int) = Unit

    override fun dialogCancelled(dialogId: Int) = Unit

    companion object {
        const val EXTRA_ACCOUNT = "account"
        const val EXTRA_FOLDER_ID = "folderId"

        private const val DIALOG_CLEAR_FOLDER = 1
        private const val REQUEST_CLEAR_FOLDER = 1
        private const val TAG_CLEAR_FOLDER_CONFIRMATION = "clear_folder_confirmation"

        private const val PREFERENCE_TOP_CATEGORY = "folder_settings"
    }
}
+32 −4
Original line number Diff line number Diff line
@@ -7,6 +7,8 @@ import androidx.lifecycle.viewModelScope
import com.fsck.k9.Account
import com.fsck.k9.Preferences
import com.fsck.k9.activity.FolderInfoHolder
import com.fsck.k9.controller.MessagingController
import com.fsck.k9.helper.SingleLiveEvent
import com.fsck.k9.mailstore.Folder
import com.fsck.k9.mailstore.FolderDetails
import com.fsck.k9.mailstore.FolderRepository
@@ -17,10 +19,15 @@ import timber.log.Timber

class FolderSettingsViewModel(
    private val preferences: Preferences,
    private val folderRepositoryManager: FolderRepositoryManager
    private val folderRepositoryManager: FolderRepositoryManager,
    private val messagingController: MessagingController
) : ViewModel() {
    private val actionLiveData = SingleLiveEvent<Action>()
    private var folderSettingsLiveData: LiveData<FolderSettingsResult>? = null

    private lateinit var folderAccount: Account
    private lateinit var folderServerId: String

    fun getFolderSettingsLiveData(accountUuid: String, folderId: Long): LiveData<FolderSettingsResult> {
        return folderSettingsLiveData ?: createFolderSettingsLiveData(accountUuid, folderId).also {
            folderSettingsLiveData = it
@@ -32,8 +39,9 @@ class FolderSettingsViewModel(
        folderId: Long
    ): LiveData<FolderSettingsResult> {
        return liveData(context = viewModelScope.coroutineContext) {
            val account = loadAccount(accountUuid)
            val folderRepository = folderRepositoryManager.getFolderRepository(account)
            folderAccount = loadAccount(accountUuid)

            val folderRepository = folderRepositoryManager.getFolderRepository(folderAccount)
            val folderDetails = folderRepository.loadFolderDetails(folderId)
            if (folderDetails == null) {
                Timber.w("Folder with ID $folderId not found")
@@ -41,8 +49,10 @@ class FolderSettingsViewModel(
                return@liveData
            }

            folderServerId = folderDetails.folder.serverId

            val folderSettingsData = FolderSettingsData(
                folder = createFolderObject(account, folderDetails.folder),
                folder = createFolderObject(folderAccount, folderDetails.folder),
                dataStore = FolderSettingsDataStore(folderRepository, folderDetails)
            )
            emit(folderSettingsData)
@@ -70,8 +80,26 @@ class FolderSettingsViewModel(
            type = folderType
        )
    }

    fun showClearFolderConfirmationDialog() {
        sendActionEvent(Action.ShowClearFolderConfirmationDialog)
    }

    fun onClearFolderConfirmation() {
        messagingController.clearFolder(folderAccount, folderServerId, null)
    }

    fun getActionEvents(): LiveData<Action> = actionLiveData

    private fun sendActionEvent(action: Action) {
        actionLiveData.value = action
    }
}

sealed class FolderSettingsResult
object FolderNotFound : FolderSettingsResult()
data class FolderSettingsData(val folder: Folder, val dataStore: FolderSettingsDataStore) : FolderSettingsResult()

sealed class Action {
    object ShowClearFolderConfirmationDialog : Action()
}
+1 −1
Original line number Diff line number Diff line
@@ -5,5 +5,5 @@ import org.koin.dsl.module

val manageFoldersUiModule = module {
    viewModel { ManageFoldersViewModel(foldersLiveDataFactory = get()) }
    viewModel { FolderSettingsViewModel(preferences = get(), folderRepositoryManager = get()) }
    viewModel { FolderSettingsViewModel(preferences = get(), folderRepositoryManager = get(), messagingController = get()) }
}
+10 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/clear_local_folder"
        android:title="@string/folder_settings_clear_local_folder_action"
        app:showAsAction="never" />

</menu>
+4 −0
Original line number Diff line number Diff line
@@ -662,6 +662,7 @@ Please submit bug reports, contribute new features and ask questions at
    <string name="folder_settings_folder_notify_mode_first_class">1st Class</string>
    <string name="folder_settings_folder_notify_mode_second_class">2nd Class</string>
    <string name="folder_settings_folder_notify_mode_inherited">Same as push class</string>
    <string name="folder_settings_clear_local_folder_action">Clear local messages</string>

    <string name="account_settings_incoming_label">Incoming server</string>
    <string name="account_settings_incoming_summary">Configure the incoming mail server</string>
@@ -893,6 +894,9 @@ Please submit bug reports, contribute new features and ask questions at

    <string name="select_text_now">Select text to copy.</string>

    <string name="dialog_confirm_clear_local_folder_title">Confirm local folder clear</string>
    <string name="dialog_confirm_clear_local_folder_message">Do you really want to delete all local messages from this folder?</string>

    <string name="dialog_confirm_delete_title">Confirm deletion</string>
    <string name="dialog_confirm_delete_message">Do you want to delete this message?</string>