Only finish action mode after forwards are sent.
This commit is contained in:
parent
e582976293
commit
58a8902d4e
3 changed files with 26 additions and 6 deletions
|
@ -177,7 +177,7 @@ import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@SuppressLint("StaticFieldLeak")
|
@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 String TAG = Log.tag(ConversationFragment.class);
|
||||||
|
|
||||||
private static final int SCROLL_ANIMATION_THRESHOLD = 50;
|
private static final int SCROLL_ANIMATION_THRESHOLD = 50;
|
||||||
|
@ -976,7 +976,7 @@ public class ConversationFragment extends LoggingFragment {
|
||||||
|
|
||||||
MultiselectForwardFragmentArgs.create(requireContext(),
|
MultiselectForwardFragmentArgs.create(requireContext(),
|
||||||
multiselectParts,
|
multiselectParts,
|
||||||
args -> MultiselectForwardFragment.show(getParentFragmentManager(), args));
|
args -> MultiselectForwardFragment.show(getChildFragmentManager(), args));
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleResendMessage(final MessageRecord message) {
|
private void handleResendMessage(final MessageRecord message) {
|
||||||
|
@ -1278,6 +1278,13 @@ public class ConversationFragment extends LoggingFragment {
|
||||||
.count());
|
.count());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onFinishForwardAction() {
|
||||||
|
if (actionMode != null) {
|
||||||
|
actionMode.finish();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public interface ConversationFragmentListener extends VoiceNoteMediaControllerOwner {
|
public interface ConversationFragmentListener extends VoiceNoteMediaControllerOwner {
|
||||||
void setThreadId(long threadId);
|
void setThreadId(long threadId);
|
||||||
|
@ -1914,7 +1921,6 @@ public class ConversationFragment extends LoggingFragment {
|
||||||
return true;
|
return true;
|
||||||
case R.id.menu_context_forward:
|
case R.id.menu_context_forward:
|
||||||
handleForwardMessageParts(getListAdapter().getSelectedItems());
|
handleForwardMessageParts(getListAdapter().getSelectedItems());
|
||||||
actionMode.finish();
|
|
||||||
return true;
|
return true;
|
||||||
case R.id.menu_context_resend:
|
case R.id.menu_context_resend:
|
||||||
handleResendMessage(getSelectedConversationMessage().getMessageRecord());
|
handleResendMessage(getSelectedConversationMessage().getMessageRecord());
|
||||||
|
|
|
@ -123,7 +123,6 @@ class MultiselectItemDecoration(
|
||||||
canvas.save()
|
canvas.save()
|
||||||
canvas.clipPath(path, Region.Op.DIFFERENCE)
|
canvas.clipPath(path, Region.Op.DIFFERENCE)
|
||||||
|
|
||||||
val view: View = child as View
|
|
||||||
val selectedParts: Set<MultiselectPart> = SetUtil.intersection(parts.toSet(), adapter.selectedItems)
|
val selectedParts: Set<MultiselectPart> = SetUtil.intersection(parts.toSet(), adapter.selectedItems)
|
||||||
|
|
||||||
if (selectedParts.isNotEmpty()) {
|
if (selectedParts.isNotEmpty()) {
|
||||||
|
@ -131,7 +130,7 @@ class MultiselectItemDecoration(
|
||||||
val shadeAll = selectedParts.size == parts.size || (selectedPart is MultiselectPart.Text && child.hasNonSelectableMedia())
|
val shadeAll = selectedParts.size == parts.size || (selectedPart is MultiselectPart.Text && child.hasNonSelectableMedia())
|
||||||
|
|
||||||
if (shadeAll) {
|
if (shadeAll) {
|
||||||
rect.set(0, view.top, view.right, view.bottom)
|
rect.set(0, child.top, child.right, child.bottom)
|
||||||
} else {
|
} else {
|
||||||
rect.set(0, child.getTopBoundaryOfMultiselectPart(selectedPart), parent.right, child.getBottomBoundaryOfMultiselectPart(selectedPart))
|
rect.set(0, child.getTopBoundaryOfMultiselectPart(selectedPart), parent.right, child.getBottomBoundaryOfMultiselectPart(selectedPart))
|
||||||
}
|
}
|
||||||
|
@ -250,6 +249,11 @@ class MultiselectItemDecoration(
|
||||||
unselectedPaint.alpha = alpha
|
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) {
|
private fun updateChildOffsets(parent: RecyclerView, child: View) {
|
||||||
val adapter = parent.adapter as ConversationAdapter
|
val adapter = parent.adapter as ConversationAdapter
|
||||||
val isLtr = ViewUtil.isLtr(child)
|
val isLtr = ViewUtil.isLtr(child)
|
||||||
|
|
|
@ -26,6 +26,7 @@ import org.thoughtcrime.securesms.components.FixedRoundedCornerBottomSheetDialog
|
||||||
import org.thoughtcrime.securesms.contacts.ContactsCursorLoader
|
import org.thoughtcrime.securesms.contacts.ContactsCursorLoader
|
||||||
import org.thoughtcrime.securesms.conversation.ui.error.SafetyNumberChangeDialog
|
import org.thoughtcrime.securesms.conversation.ui.error.SafetyNumberChangeDialog
|
||||||
import org.thoughtcrime.securesms.database.IdentityDatabase
|
import org.thoughtcrime.securesms.database.IdentityDatabase
|
||||||
|
import org.thoughtcrime.securesms.keyboard.findListener
|
||||||
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
import org.thoughtcrime.securesms.keyvalue.SignalStore
|
||||||
import org.thoughtcrime.securesms.recipients.RecipientId
|
import org.thoughtcrime.securesms.recipients.RecipientId
|
||||||
import org.thoughtcrime.securesms.sharing.MultiShareArgs
|
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.views.SimpleProgressDialog
|
||||||
import org.thoughtcrime.securesms.util.visible
|
import org.thoughtcrime.securesms.util.visible
|
||||||
import org.whispersystems.libsignal.util.guava.Optional
|
import org.whispersystems.libsignal.util.guava.Optional
|
||||||
import java.lang.UnsupportedOperationException
|
|
||||||
import java.util.function.Consumer
|
import java.util.function.Consumer
|
||||||
|
|
||||||
private const val ARG_MULTISHARE_ARGS = "multiselect.forward.fragment.arg.multishare.args"
|
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 selectionFragment: ContactSelectionListFragment
|
||||||
private lateinit var contactFilterView: ContactFilterView
|
private lateinit var contactFilterView: ContactFilterView
|
||||||
private lateinit var addMessage: EditText
|
private lateinit var addMessage: EditText
|
||||||
|
private lateinit var callback: Callback
|
||||||
|
|
||||||
private var dismissibleDialog: SimpleProgressDialog.DismissibleDialog? = null
|
private var dismissibleDialog: SimpleProgressDialog.DismissibleDialog? = null
|
||||||
|
|
||||||
|
@ -91,6 +92,8 @@ class MultiselectForwardFragment :
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
|
callback = requireNotNull(findListener())
|
||||||
|
|
||||||
selectionFragment = childFragmentManager.findFragmentById(R.id.contact_selection_list_fragment) as ContactSelectionListFragment
|
selectionFragment = childFragmentManager.findFragmentById(R.id.contact_selection_list_fragment) as ContactSelectionListFragment
|
||||||
|
|
||||||
contactFilterView = view.findViewById(R.id.contact_filter_edit_text)
|
contactFilterView = view.findViewById(R.id.contact_filter_edit_text)
|
||||||
|
@ -217,6 +220,7 @@ class MultiselectForwardFragment :
|
||||||
private fun dismissAndShowToast(@PluralsRes toastTextResId: Int) {
|
private fun dismissAndShowToast(@PluralsRes toastTextResId: Int) {
|
||||||
val argCount = getMessageCount()
|
val argCount = getMessageCount()
|
||||||
|
|
||||||
|
callback.onFinishForwardAction()
|
||||||
dismissibleDialog?.dismiss()
|
dismissibleDialog?.dismiss()
|
||||||
Toast.makeText(requireContext(), requireContext().resources.getQuantityString(toastTextResId, argCount), Toast.LENGTH_SHORT).show()
|
Toast.makeText(requireContext(), requireContext().resources.getQuantityString(toastTextResId, argCount), Toast.LENGTH_SHORT).show()
|
||||||
dismissAllowingStateLoss()
|
dismissAllowingStateLoss()
|
||||||
|
@ -226,6 +230,8 @@ class MultiselectForwardFragment :
|
||||||
|
|
||||||
private fun handleMessageExpired() {
|
private fun handleMessageExpired() {
|
||||||
dismissAllowingStateLoss()
|
dismissAllowingStateLoss()
|
||||||
|
|
||||||
|
callback.onFinishForwardAction()
|
||||||
dismissibleDialog?.dismiss()
|
dismissibleDialog?.dismiss()
|
||||||
Toast.makeText(requireContext(), resources.getQuantityString(R.plurals.MultiselectForwardFragment__couldnt_forward_messages, getMultiShareArgs().size), Toast.LENGTH_LONG).show()
|
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)
|
fragment.show(supportFragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface Callback {
|
||||||
|
fun onFinishForwardAction()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue