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

Commit d72d8a97 authored by marcRDZ's avatar marcRDZ
Browse files

Migrate choose folder results to new API on message screens

parent 64cf6069
Loading
Loading
Loading
Loading
+41 −44
Original line number Original line Diff line number Diff line
package com.fsck.k9.ui.messagelist
package com.fsck.k9.ui.messagelist


import android.app.Activity
import android.app.SearchManager
import android.app.SearchManager
import android.content.Context
import android.content.Context
import android.content.Intent
import android.content.Intent
@@ -12,6 +11,7 @@ import android.view.MenuItem
import android.view.View
import android.view.View
import android.view.ViewGroup
import android.view.ViewGroup
import android.widget.Toast
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.annotation.StringRes
import androidx.annotation.StringRes
import androidx.appcompat.view.ActionMode
import androidx.appcompat.view.ActionMode
import androidx.core.os.BundleCompat
import androidx.core.os.BundleCompat
@@ -51,6 +51,7 @@ import com.fsck.k9.ui.R
import com.fsck.k9.ui.changelog.RecentChangesActivity
import com.fsck.k9.ui.changelog.RecentChangesActivity
import com.fsck.k9.ui.changelog.RecentChangesViewModel
import com.fsck.k9.ui.changelog.RecentChangesViewModel
import com.fsck.k9.ui.choosefolder.ChooseFolderActivity
import com.fsck.k9.ui.choosefolder.ChooseFolderActivity
import com.fsck.k9.ui.choosefolder.ChooseFolderResultContract
import com.fsck.k9.ui.helper.RelativeDateTimeFormatter
import com.fsck.k9.ui.helper.RelativeDateTimeFormatter
import com.fsck.k9.ui.messagelist.MessageListFragment.MessageListFragmentListener.Companion.MAX_PROGRESS
import com.fsck.k9.ui.messagelist.MessageListFragment.MessageListFragmentListener.Companion.MAX_PROGRESS
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.android.material.floatingactionbutton.FloatingActionButton
@@ -87,6 +88,19 @@ class MessageListFragment :
    private val activityListener = MessageListActivityListener()
    private val activityListener = MessageListActivityListener()
    private val actionModeCallback = ActionModeCallback()
    private val actionModeCallback = ActionModeCallback()


    private val chooseFolderForMoveLauncher: ActivityResultLauncher<ChooseFolderResultContract.Input> =
        registerForActivityResult(ChooseFolderResultContract(ChooseFolderActivity.Action.MOVE)) { result ->
            handleChooseFolderResult(result) { folderId, messages ->
                move(messages, folderId)
            }
        }
    private val chooseFolderForCopyLauncher: ActivityResultLauncher<ChooseFolderResultContract.Input> =
        registerForActivityResult(ChooseFolderResultContract(ChooseFolderActivity.Action.COPY)) { result ->
            handleChooseFolderResult(result) { folderId, messages ->
                copy(messages, folderId)
            }
        }

    private lateinit var fragmentListener: MessageListFragmentListener
    private lateinit var fragmentListener: MessageListFragmentListener


    private lateinit var recentChangesSnackbar: Snackbar
    private lateinit var recentChangesSnackbar: Snackbar
@@ -705,33 +719,6 @@ class MessageListFragment :
        }
        }
    }
    }


    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (resultCode != Activity.RESULT_OK) return

        when (requestCode) {
            ACTIVITY_CHOOSE_FOLDER_MOVE,
            ACTIVITY_CHOOSE_FOLDER_COPY,
            -> {
                if (data == null) return

                val destinationFolderId = data.getLongExtra(ChooseFolderActivity.RESULT_SELECTED_FOLDER_ID, -1L)
                val messages = activeMessages!!
                if (destinationFolderId != -1L) {
                    activeMessages = null

                    if (messages.isNotEmpty()) {
                        MlfUtils.setLastSelectedFolder(accountManager, messages, destinationFolderId)
                    }

                    when (requestCode) {
                        ACTIVITY_CHOOSE_FOLDER_MOVE -> move(messages, destinationFolderId)
                        ACTIVITY_CHOOSE_FOLDER_COPY -> copy(messages, destinationFolderId)
                    }
                }
            }
        }
    }

    private fun onExpunge() {
    private fun onExpunge() {
        currentFolder?.let { folderInfoHolder ->
        currentFolder?.let { folderInfoHolder ->
            messagingController.expunge(account, folderInfoHolder.databaseId)
            messagingController.expunge(account, folderInfoHolder.databaseId)
@@ -1050,7 +1037,6 @@ class MessageListFragment :


        displayFolderChoice(
        displayFolderChoice(
            operation = FolderOperation.MOVE,
            operation = FolderOperation.MOVE,
            requestCode = ACTIVITY_CHOOSE_FOLDER_MOVE,
            sourceFolderId = folderId,
            sourceFolderId = folderId,
            accountUuid = messages.first().accountUuid,
            accountUuid = messages.first().accountUuid,
            lastSelectedFolderId = null,
            lastSelectedFolderId = null,
@@ -1073,7 +1059,6 @@ class MessageListFragment :


        displayFolderChoice(
        displayFolderChoice(
            operation = FolderOperation.COPY,
            operation = FolderOperation.COPY,
            requestCode = ACTIVITY_CHOOSE_FOLDER_COPY,
            sourceFolderId = folderId,
            sourceFolderId = folderId,
            accountUuid = messages.first().accountUuid,
            accountUuid = messages.first().accountUuid,
            lastSelectedFolderId = null,
            lastSelectedFolderId = null,
@@ -1083,29 +1068,43 @@ class MessageListFragment :


    private fun displayFolderChoice(
    private fun displayFolderChoice(
        operation: FolderOperation,
        operation: FolderOperation,
        requestCode: Int,
        sourceFolderId: Long?,
        sourceFolderId: Long?,
        accountUuid: String,
        accountUuid: String,
        lastSelectedFolderId: Long?,
        lastSelectedFolderId: Long?,
        messages: List<MessageReference>,
        messages: List<MessageReference>,
    ) {
    ) {
        val action = when (operation) {
        // Remember the selected messages so they are available in the registerForActivityResult() callbacks
            FolderOperation.COPY -> ChooseFolderActivity.Action.COPY
        activeMessages = messages
            FolderOperation.MOVE -> ChooseFolderActivity.Action.MOVE

        }
        val input = ChooseFolderResultContract.Input(
        val intent = ChooseFolderActivity.buildLaunchIntent(
            context = requireContext(),
            action = action,
            accountUuid = accountUuid,
            accountUuid = accountUuid,
            currentFolderId = sourceFolderId,
            currentFolderId = sourceFolderId,
            scrollToFolderId = lastSelectedFolderId,
            scrollToFolderId = lastSelectedFolderId,
            messageReference = null,
        )
        )
        when (operation) {
            FolderOperation.COPY -> chooseFolderForCopyLauncher.launch(input)
            FolderOperation.MOVE -> chooseFolderForMoveLauncher.launch(input)
        }
    }


        // remember the selected messages for #onActivityResult
    private fun handleChooseFolderResult(
        activeMessages = messages
        result: ChooseFolderResultContract.Result?,
        action: (Long, List<MessageReference>) -> Unit,
    ) {
        if (result == null) return


        startActivityForResult(intent, requestCode)
        val destinationFolderId = result.folderId
        val messages = activeMessages!!

        if (destinationFolderId != -1L) {
            activeMessages = null

            if (messages.isNotEmpty()) {
                MlfUtils.setLastSelectedFolder(accountManager, messages, destinationFolderId)
            }

            action(destinationFolderId, messages)
        }
    }
    }


    private fun onArchive(message: MessageReference) {
    private fun onArchive(message: MessageReference) {
@@ -2073,8 +2072,6 @@ class MessageListFragment :
    }
    }


    companion object {
    companion object {
        private const val ACTIVITY_CHOOSE_FOLDER_MOVE = 1
        private const val ACTIVITY_CHOOSE_FOLDER_COPY = 2


        private const val ARG_SEARCH = "searchObject"
        private const val ARG_SEARCH = "searchObject"
        private const val ARG_THREADED_LIST = "showingThreadedList"
        private const val ARG_THREADED_LIST = "showingThreadedList"
+39 −39
Original line number Original line Diff line number Diff line
@@ -7,6 +7,7 @@ import android.content.Context
import android.content.Intent
import android.content.Intent
import android.content.IntentSender
import android.content.IntentSender
import android.content.IntentSender.SendIntentException
import android.content.IntentSender.SendIntentException
import android.net.Uri
import android.os.Bundle
import android.os.Bundle
import android.os.Parcelable
import android.os.Parcelable
import android.os.SystemClock
import android.os.SystemClock
@@ -18,11 +19,13 @@ import android.view.View
import android.view.ViewGroup
import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager
import android.view.inputmethod.InputMethodManager
import android.widget.Toast
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.core.app.ActivityCompat
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.content.ContextCompat
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
import androidx.fragment.app.Fragment
import androidx.fragment.app.setFragmentResultListener
import androidx.fragment.app.setFragmentResultListener
import app.k9mail.core.android.common.activity.CreateDocumentResultContract
import app.k9mail.core.ui.legacy.designsystem.atom.icon.Icons
import app.k9mail.core.ui.legacy.designsystem.atom.icon.Icons
import app.k9mail.core.ui.theme.api.Theme
import app.k9mail.core.ui.theme.api.Theme
import app.k9mail.legacy.account.Account
import app.k9mail.legacy.account.Account
@@ -49,6 +52,7 @@ import com.fsck.k9.mailstore.MessageViewInfo
import com.fsck.k9.ui.R
import com.fsck.k9.ui.R
import com.fsck.k9.ui.base.extensions.withArguments
import com.fsck.k9.ui.base.extensions.withArguments
import com.fsck.k9.ui.choosefolder.ChooseFolderActivity
import com.fsck.k9.ui.choosefolder.ChooseFolderActivity
import com.fsck.k9.ui.choosefolder.ChooseFolderResultContract
import com.fsck.k9.ui.messagedetails.MessageDetailsFragment
import com.fsck.k9.ui.messagedetails.MessageDetailsFragment
import com.fsck.k9.ui.messagesource.MessageSourceActivity
import com.fsck.k9.ui.messagesource.MessageSourceActivity
import com.fsck.k9.ui.messageview.MessageCryptoPresenter.MessageCryptoMvpView
import com.fsck.k9.ui.messageview.MessageCryptoPresenter.MessageCryptoMvpView
@@ -59,6 +63,7 @@ import org.koin.android.ext.android.inject
import org.openintents.openpgp.util.OpenPgpIntentStarter
import org.openintents.openpgp.util.OpenPgpIntentStarter
import timber.log.Timber
import timber.log.Timber


@Suppress("LargeClass")
class MessageViewFragment :
class MessageViewFragment :
    Fragment(),
    Fragment(),
    ConfirmationDialogFragmentListener,
    ConfirmationDialogFragmentListener,
@@ -71,6 +76,15 @@ class MessageViewFragment :
    private val shareIntentBuilder: ShareIntentBuilder by inject()
    private val shareIntentBuilder: ShareIntentBuilder by inject()
    private val generalSettingsManager: GeneralSettingsManager by inject()
    private val generalSettingsManager: GeneralSettingsManager by inject()


    private val chooseFolderForCopyLauncher: ActivityResultLauncher<ChooseFolderResultContract.Input> =
        registerForActivityResult(ChooseFolderResultContract(ChooseFolderActivity.Action.COPY)) { result ->
            onChooseFolderCopyResult(result)
        }
    private val chooseFolderForMoveLauncher: ActivityResultLauncher<ChooseFolderResultContract.Input> =
        registerForActivityResult(ChooseFolderResultContract(ChooseFolderActivity.Action.MOVE)) { result ->
            onChooseFolderMoveResult(result)
        }

    private lateinit var messageTopView: MessageTopView
    private lateinit var messageTopView: MessageTopView


    private var message: LocalMessage? = null
    private var message: LocalMessage? = null
@@ -512,7 +526,14 @@ class MessageViewFragment :
            return
            return
        }
        }


        startRefileActivity(FolderOperation.MOVE, ACTIVITY_CHOOSE_FOLDER_MOVE)
        chooseFolderForMoveLauncher.launch(
            input = ChooseFolderResultContract.Input(
                accountUuid = account.uuid,
                currentFolderId = messageReference.folderId,
                scrollToFolderId = account.lastSelectedFolderId,
                messageReference = messageReference,
            ),
        )
    }
    }


    fun onCopy() {
    fun onCopy() {
@@ -524,7 +545,14 @@ class MessageViewFragment :
            return
            return
        }
        }


        startRefileActivity(FolderOperation.COPY, ACTIVITY_CHOOSE_FOLDER_COPY)
        chooseFolderForCopyLauncher.launch(
            input = ChooseFolderResultContract.Input(
                accountUuid = account.uuid,
                currentFolderId = messageReference.folderId,
                scrollToFolderId = account.lastSelectedFolderId,
                messageReference = messageReference,
            ),
        )
    }
    }


    private fun onMoveToDrafts() {
    private fun onMoveToDrafts() {
@@ -552,25 +580,6 @@ class MessageViewFragment :
        onRefile(account.spamFolderId)
        onRefile(account.spamFolderId)
    }
    }


    private fun startRefileActivity(operation: FolderOperation, requestCode: Int) {
        val action = if (operation == FolderOperation.MOVE) {
            ChooseFolderActivity.Action.MOVE
        } else {
            ChooseFolderActivity.Action.COPY
        }

        val intent = ChooseFolderActivity.buildLaunchIntent(
            context = requireActivity(),
            action = action,
            accountUuid = account.uuid,
            currentFolderId = messageReference.folderId,
            scrollToFolderId = account.lastSelectedFolderId,
            messageReference = messageReference,
        )

        startActivityForResult(intent, requestCode)
    }

    @Deprecated("Switch to Activity Result API")
    @Deprecated("Switch to Activity Result API")
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (requestCode and REQUEST_MASK_LOADER_HELPER == REQUEST_MASK_LOADER_HELPER) {
        if (requestCode and REQUEST_MASK_LOADER_HELPER == REQUEST_MASK_LOADER_HELPER) {
@@ -585,8 +594,6 @@ class MessageViewFragment :


        when (requestCode) {
        when (requestCode) {
            REQUEST_CODE_CREATE_DOCUMENT -> onCreateDocumentResult(data)
            REQUEST_CODE_CREATE_DOCUMENT -> onCreateDocumentResult(data)
            ACTIVITY_CHOOSE_FOLDER_MOVE -> onChooseFolderMoveResult(data)
            ACTIVITY_CHOOSE_FOLDER_COPY -> onChooseFolderCopyResult(data)
        }
        }
    }
    }


@@ -613,11 +620,11 @@ class MessageViewFragment :
        createAttachmentController(currentAttachmentViewInfo).saveAttachmentTo(documentUri)
        createAttachmentController(currentAttachmentViewInfo).saveAttachmentTo(documentUri)
    }
    }


    private fun onChooseFolderMoveResult(data: Intent?) {
    private fun onChooseFolderMoveResult(result: ChooseFolderResultContract.Result?) {
        if (data == null) return
        if (result == null) return


        val destinationFolderId = data.getLongExtra(ChooseFolderActivity.RESULT_SELECTED_FOLDER_ID, -1L)
        val destinationFolderId = result.folderId
        val messageReferenceString = data.getStringExtra(ChooseFolderActivity.RESULT_MESSAGE_REFERENCE)
        val messageReferenceString = result.messageReference
        val messageReference = MessageReference.parse(messageReferenceString)
        val messageReference = MessageReference.parse(messageReferenceString)
        if (this.messageReference != messageReference) return
        if (this.messageReference != messageReference) return


@@ -628,11 +635,11 @@ class MessageViewFragment :
        moveMessage(messageReference, destinationFolderId)
        moveMessage(messageReference, destinationFolderId)
    }
    }


    private fun onChooseFolderCopyResult(data: Intent?) {
    private fun onChooseFolderCopyResult(result: ChooseFolderResultContract.Result?) {
        if (data == null) return
        if (result == null) return


        val destinationFolderId = data.getLongExtra(ChooseFolderActivity.RESULT_SELECTED_FOLDER_ID, -1L)
        val destinationFolderId = result.folderId
        val messageReferenceString = data.getStringExtra(ChooseFolderActivity.RESULT_MESSAGE_REFERENCE)
        val messageReferenceString = result.messageReference
        val messageReference = MessageReference.parse(messageReferenceString)
        val messageReference = MessageReference.parse(messageReferenceString)
        if (this.messageReference != messageReference) return
        if (this.messageReference != messageReference) return


@@ -971,11 +978,6 @@ class MessageViewFragment :
        activity?.invalidateMenu()
        activity?.invalidateMenu()
    }
    }


    private enum class FolderOperation {
        COPY,
        MOVE,
    }

    companion object {
    companion object {
        const val REQUEST_MASK_LOADER_HELPER = 1 shl 8
        const val REQUEST_MASK_LOADER_HELPER = 1 shl 8
        const val REQUEST_MASK_CRYPTO_PRESENTER = 1 shl 9
        const val REQUEST_MASK_CRYPTO_PRESENTER = 1 shl 9
@@ -987,9 +989,7 @@ class MessageViewFragment :
        private const val STATE_WAS_MESSAGE_MARKED_AS_OPENED = "wasMessageMarkedAsOpened"
        private const val STATE_WAS_MESSAGE_MARKED_AS_OPENED = "wasMessageMarkedAsOpened"
        private const val STATE_IS_ACTIVE = "isActive"
        private const val STATE_IS_ACTIVE = "isActive"


        private const val ACTIVITY_CHOOSE_FOLDER_MOVE = 1
        private const val REQUEST_CODE_CREATE_DOCUMENT = 1
        private const val ACTIVITY_CHOOSE_FOLDER_COPY = 2
        private const val REQUEST_CODE_CREATE_DOCUMENT = 3


        fun newInstance(reference: MessageReference, showAccountChip: Boolean): MessageViewFragment {
        fun newInstance(reference: MessageReference, showAccountChip: Boolean): MessageViewFragment {
            return MessageViewFragment().withArguments(
            return MessageViewFragment().withArguments(