Skip to content

Commit

Permalink
Migrate choose folder and create doc results to new API on message sc…
Browse files Browse the repository at this point in the history
…reens
  • Loading branch information
marcRDZ committed Jan 16, 2025
1 parent 64cf606 commit a6c7dd1
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 92 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.fsck.k9.ui.messagelist

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

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

private lateinit var fragmentListener: MessageListFragmentListener

private lateinit var recentChangesSnackbar: Snackbar
Expand Down Expand Up @@ -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() {
currentFolder?.let { folderInfoHolder ->
messagingController.expunge(account, folderInfoHolder.databaseId)
Expand Down Expand Up @@ -1050,7 +1037,6 @@ class MessageListFragment :

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

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

private fun displayFolderChoice(
operation: FolderOperation,
requestCode: Int,
sourceFolderId: Long?,
accountUuid: String,
lastSelectedFolderId: Long?,
messages: List<MessageReference>,
) {
val action = when (operation) {
FolderOperation.COPY -> ChooseFolderActivity.Action.COPY
FolderOperation.MOVE -> ChooseFolderActivity.Action.MOVE
}
val intent = ChooseFolderActivity.buildLaunchIntent(
context = requireContext(),
action = action,
// remember the selected messages for #onActivityResult
activeMessages = messages

val input = ChooseFolderResultContract.Input(
accountUuid = accountUuid,
currentFolderId = sourceFolderId,
scrollToFolderId = lastSelectedFolderId,
messageReference = null,
)
when (operation) {
FolderOperation.COPY -> chooseFolderToCopyResultLauncher.launch(input)
FolderOperation.MOVE -> chooseFolderToMoveResultLauncher.launch(input)
}
}

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

val destinationFolderId = result.folderId
val messages = activeMessages!!

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

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

action(destinationFolderId, messages)
}
}

private fun onArchive(message: MessageReference) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package com.fsck.k9.ui.messageview

import android.app.Activity
import android.content.ActivityNotFoundException
import android.content.ContentResolver
import android.content.Context
import android.content.Intent
import android.content.IntentSender
import android.content.IntentSender.SendIntentException
import android.net.Uri
import android.os.Bundle
import android.os.Parcelable
import android.os.SystemClock
Expand All @@ -18,11 +17,13 @@ import android.view.View
import android.view.ViewGroup
import android.view.inputmethod.InputMethodManager
import android.widget.Toast
import androidx.activity.result.ActivityResultLauncher
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.Fragment
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.theme.api.Theme
import app.k9mail.legacy.account.Account
Expand All @@ -49,6 +50,7 @@ import com.fsck.k9.mailstore.MessageViewInfo
import com.fsck.k9.ui.R
import com.fsck.k9.ui.base.extensions.withArguments
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.messagesource.MessageSourceActivity
import com.fsck.k9.ui.messageview.MessageCryptoPresenter.MessageCryptoMvpView
Expand All @@ -71,6 +73,19 @@ class MessageViewFragment :
private val shareIntentBuilder: ShareIntentBuilder by inject()
private val generalSettingsManager: GeneralSettingsManager by inject()

private val createDocumentResultLauncher: ActivityResultLauncher<CreateDocumentResultContract.Input> =
registerForActivityResult(CreateDocumentResultContract()) { documentUri ->
onCreateDocumentResult(documentUri)
}
private val chooseFolderToCopyResultLauncher: ActivityResultLauncher<ChooseFolderResultContract.Input> =
registerForActivityResult(ChooseFolderResultContract(ChooseFolderActivity.Action.COPY)) { result ->
onChooseFolderCopyResult(result)
}
private val chooseFolderToMoveResultLauncher: ActivityResultLauncher<ChooseFolderResultContract.Input> =
registerForActivityResult(ChooseFolderResultContract(ChooseFolderActivity.Action.MOVE)) { result ->
onChooseFolderMoveResult(result)
}

private lateinit var messageTopView: MessageTopView

private var message: LocalMessage? = null
Expand Down Expand Up @@ -512,7 +527,7 @@ class MessageViewFragment :
return
}

startRefileActivity(FolderOperation.MOVE, ACTIVITY_CHOOSE_FOLDER_MOVE)
startRefileActivity(FolderOperation.MOVE)
}

fun onCopy() {
Expand All @@ -524,7 +539,7 @@ class MessageViewFragment :
return
}

startRefileActivity(FolderOperation.COPY, ACTIVITY_CHOOSE_FOLDER_COPY)
startRefileActivity(FolderOperation.COPY)
}

private fun onMoveToDrafts() {
Expand Down Expand Up @@ -552,23 +567,19 @@ class MessageViewFragment :
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,
private fun startRefileActivity(operation: FolderOperation) {
val input = ChooseFolderResultContract.Input(
accountUuid = account.uuid,
currentFolderId = messageReference.folderId,
scrollToFolderId = account.lastSelectedFolderId,
messageReference = messageReference,
)

startActivityForResult(intent, requestCode)
if (operation == FolderOperation.MOVE) {
chooseFolderToMoveResultLauncher.launch(input)
} else {
chooseFolderToCopyResultLauncher.launch(input)
}
}

@Deprecated("Switch to Activity Result API")
Expand All @@ -580,14 +591,6 @@ class MessageViewFragment :
val maskedRequestCode = requestCode xor REQUEST_MASK_CRYPTO_PRESENTER
messageCryptoPresenter.onActivityResult(maskedRequestCode, resultCode, data)
}

if (resultCode != Activity.RESULT_OK) return

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

private fun onMessageDetailsResult(requestKey: String, result: Bundle) {
Expand All @@ -606,18 +609,18 @@ class MessageViewFragment :
}
}

private fun onCreateDocumentResult(data: Intent?) {
val documentUri = data?.data ?: return
require(documentUri.scheme == ContentResolver.SCHEME_CONTENT) { "content: URI required" }
private fun onCreateDocumentResult(uri: Uri?) {
if (uri == null) return
require(uri.scheme == ContentResolver.SCHEME_CONTENT) { "content: URI required" }

createAttachmentController(currentAttachmentViewInfo).saveAttachmentTo(documentUri)
createAttachmentController(currentAttachmentViewInfo).saveAttachmentTo(uri)
}

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

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

Expand All @@ -628,11 +631,11 @@ class MessageViewFragment :
moveMessage(messageReference, destinationFolderId)
}

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

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

Expand Down Expand Up @@ -950,17 +953,12 @@ class MessageViewFragment :
override fun onSaveAttachment(attachment: AttachmentViewInfo) {
currentAttachmentViewInfo = attachment

val intent = Intent(Intent.ACTION_CREATE_DOCUMENT).apply {
type = attachment.mimeType
putExtra(Intent.EXTRA_TITLE, attachment.displayName)
addCategory(Intent.CATEGORY_OPENABLE)
}

try {
startActivityForResult(intent, REQUEST_CODE_CREATE_DOCUMENT)
} catch (e: ActivityNotFoundException) {
Toast.makeText(requireContext(), R.string.error_activity_not_found, Toast.LENGTH_LONG).show()
}
createDocumentResultLauncher.launch(
input = CreateDocumentResultContract.Input(
title = attachment.displayName,
mimeType = attachment.mimeType,
),
)
}

private fun createAttachmentController(attachment: AttachmentViewInfo?): AttachmentController {
Expand All @@ -987,10 +985,6 @@ class MessageViewFragment :
private const val STATE_WAS_MESSAGE_MARKED_AS_OPENED = "wasMessageMarkedAsOpened"
private const val STATE_IS_ACTIVE = "isActive"

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

fun newInstance(reference: MessageReference, showAccountChip: Boolean): MessageViewFragment {
return MessageViewFragment().withArguments(
ARG_REFERENCE to reference.toIdentityString(),
Expand Down

0 comments on commit a6c7dd1

Please sign in to comment.