From 58a8902d4ede78e03ca34c47c8c84dda56a9cc2f Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 19 Aug 2021 15:43:19 -0300 Subject: [PATCH] Only finish action mode after forwards are sent. --- .../securesms/conversation/ConversationFragment.java | 12 +++++++++--- .../mutiselect/MultiselectItemDecoration.kt | 8 ++++++-- .../mutiselect/forward/MultiselectForwardFragment.kt | 12 +++++++++++- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java index 28474cc0a..d0ef8d80a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationFragment.java @@ -177,7 +177,7 @@ import java.util.Objects; import java.util.Set; @SuppressLint("StaticFieldLeak") -public class ConversationFragment extends LoggingFragment { +public class ConversationFragment extends LoggingFragment implements MultiselectForwardFragment.Callback { private static final String TAG = Log.tag(ConversationFragment.class); private static final int SCROLL_ANIMATION_THRESHOLD = 50; @@ -976,7 +976,7 @@ public class ConversationFragment extends LoggingFragment { MultiselectForwardFragmentArgs.create(requireContext(), multiselectParts, - args -> MultiselectForwardFragment.show(getParentFragmentManager(), args)); + args -> MultiselectForwardFragment.show(getChildFragmentManager(), args)); } private void handleResendMessage(final MessageRecord message) { @@ -1278,6 +1278,13 @@ public class ConversationFragment extends LoggingFragment { .count()); } + @Override + public void onFinishForwardAction() { + if (actionMode != null) { + actionMode.finish(); + } + } + public interface ConversationFragmentListener extends VoiceNoteMediaControllerOwner { void setThreadId(long threadId); @@ -1914,7 +1921,6 @@ public class ConversationFragment extends LoggingFragment { return true; case R.id.menu_context_forward: handleForwardMessageParts(getListAdapter().getSelectedItems()); - actionMode.finish(); return true; case R.id.menu_context_resend: handleResendMessage(getSelectedConversationMessage().getMessageRecord()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration.kt index c99fe6351..4f0b57e3e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/MultiselectItemDecoration.kt @@ -123,7 +123,6 @@ class MultiselectItemDecoration( canvas.save() canvas.clipPath(path, Region.Op.DIFFERENCE) - val view: View = child as View val selectedParts: Set = SetUtil.intersection(parts.toSet(), adapter.selectedItems) if (selectedParts.isNotEmpty()) { @@ -131,7 +130,7 @@ class MultiselectItemDecoration( val shadeAll = selectedParts.size == parts.size || (selectedPart is MultiselectPart.Text && child.hasNonSelectableMedia()) if (shadeAll) { - rect.set(0, view.top, view.right, view.bottom) + rect.set(0, child.top, child.right, child.bottom) } else { rect.set(0, child.getTopBoundaryOfMultiselectPart(selectedPart), parent.right, child.getBottomBoundaryOfMultiselectPart(selectedPart)) } @@ -250,6 +249,11 @@ class MultiselectItemDecoration( unselectedPaint.alpha = alpha } + /** + * Update the start-aligned gutter in which the checks display. This is called in onDraw to + * ensure we don't hit situations where we try to set offsets before items are laid out, and + * called in getItemOffsets to ensure the gutter goes away when multiselect mode ends. + */ private fun updateChildOffsets(parent: RecyclerView, child: View) { val adapter = parent.adapter as ConversationAdapter val isLtr = ViewUtil.isLtr(child) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt index be1e644db..2fe84675f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/mutiselect/forward/MultiselectForwardFragment.kt @@ -26,6 +26,7 @@ import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialog import org.thoughtcrime.securesms.contacts.ContactsCursorLoader import org.thoughtcrime.securesms.conversation.ui.error.SafetyNumberChangeDialog import org.thoughtcrime.securesms.database.IdentityDatabase +import org.thoughtcrime.securesms.keyboard.findListener import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.sharing.MultiShareArgs @@ -37,7 +38,6 @@ import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.views.SimpleProgressDialog import org.thoughtcrime.securesms.util.visible import org.whispersystems.libsignal.util.guava.Optional -import java.lang.UnsupportedOperationException import java.util.function.Consumer private const val ARG_MULTISHARE_ARGS = "multiselect.forward.fragment.arg.multishare.args" @@ -57,6 +57,7 @@ class MultiselectForwardFragment : private lateinit var selectionFragment: ContactSelectionListFragment private lateinit var contactFilterView: ContactFilterView private lateinit var addMessage: EditText + private lateinit var callback: Callback private var dismissibleDialog: SimpleProgressDialog.DismissibleDialog? = null @@ -91,6 +92,8 @@ class MultiselectForwardFragment : } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + callback = requireNotNull(findListener()) + selectionFragment = childFragmentManager.findFragmentById(R.id.contact_selection_list_fragment) as ContactSelectionListFragment contactFilterView = view.findViewById(R.id.contact_filter_edit_text) @@ -217,6 +220,7 @@ class MultiselectForwardFragment : private fun dismissAndShowToast(@PluralsRes toastTextResId: Int) { val argCount = getMessageCount() + callback.onFinishForwardAction() dismissibleDialog?.dismiss() Toast.makeText(requireContext(), requireContext().resources.getQuantityString(toastTextResId, argCount), Toast.LENGTH_SHORT).show() dismissAllowingStateLoss() @@ -226,6 +230,8 @@ class MultiselectForwardFragment : private fun handleMessageExpired() { dismissAllowingStateLoss() + + callback.onFinishForwardAction() dismissibleDialog?.dismiss() Toast.makeText(requireContext(), resources.getQuantityString(R.plurals.MultiselectForwardFragment__couldnt_forward_messages, getMultiShareArgs().size), Toast.LENGTH_LONG).show() } @@ -294,4 +300,8 @@ class MultiselectForwardFragment : fragment.show(supportFragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) } } + + interface Callback { + fun onFinishForwardAction() + } }