Loading app/ui/src/main/java/com/fsck/k9/ui/managefolders/FolderSettingsFragment.kt +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 Loading @@ -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()) } Loading @@ -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) Loading @@ -35,6 +60,8 @@ class FolderSettingsFragment : PreferenceFragmentCompat() { is FolderSettingsData -> initPreferences(folderSettingsResult) } } viewModel.getActionEvents().observeNotNull(this) { handleActionEvents(it) } } private fun navigateBack() { Loading @@ -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" } } app/ui/src/main/java/com/fsck/k9/ui/managefolders/FolderSettingsViewModel.kt +32 −4 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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") Loading @@ -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) Loading Loading @@ -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() } app/ui/src/main/java/com/fsck/k9/ui/managefolders/KoinModule.kt +1 −1 Original line number Diff line number Diff line Loading @@ -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()) } } app/ui/src/main/res/menu/folder_settings_option.xml 0 → 100644 +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> app/ui/src/main/res/values/strings.xml +4 −0 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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> Loading Loading
app/ui/src/main/java/com/fsck/k9/ui/managefolders/FolderSettingsFragment.kt +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 Loading @@ -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()) } Loading @@ -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) Loading @@ -35,6 +60,8 @@ class FolderSettingsFragment : PreferenceFragmentCompat() { is FolderSettingsData -> initPreferences(folderSettingsResult) } } viewModel.getActionEvents().observeNotNull(this) { handleActionEvents(it) } } private fun navigateBack() { Loading @@ -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" } }
app/ui/src/main/java/com/fsck/k9/ui/managefolders/FolderSettingsViewModel.kt +32 −4 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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") Loading @@ -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) Loading Loading @@ -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() }
app/ui/src/main/java/com/fsck/k9/ui/managefolders/KoinModule.kt +1 −1 Original line number Diff line number Diff line Loading @@ -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()) } }
app/ui/src/main/res/menu/folder_settings_option.xml 0 → 100644 +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>
app/ui/src/main/res/values/strings.xml +4 −0 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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> Loading