diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 9b1d5dd721e688083906979514e642d66990149e..1c938f913e2737bf3c7791172110a57690a7d7b6 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -53,6 +53,7 @@ import android.widget.PopupMenu; import android.widget.TextView.OnEditorActionListener; import android.widget.Toast; +import androidx.activity.OnBackPressedCallback; import androidx.annotation.IdRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -575,6 +576,16 @@ public class ConversationFragment extends XmppFragment } } }; + private OnBackPressedCallback backPressedLeaveSingleThread = new OnBackPressedCallback(false) { + @Override + public void handleOnBackPressed() { + conversation.setLockThread(false); + this.setEnabled(false); + conversation.setUserSelectedThread(false); + refresh(); + updateThreadFromLastMessage(); + } + }; private int completionIndex = 0; private int lastCompletionLength = 0; private String incomplete; @@ -1153,6 +1164,7 @@ public class ConversationFragment extends XmppFragment public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); + activity.getOnBackPressedDispatcher().addCallback(backPressedLeaveSingleThread); } @Override @@ -1261,6 +1273,7 @@ public class ConversationFragment extends XmppFragment binding.threadIdenticonLayout.setOnClickListener(v -> { boolean wasLocked = conversation.getLockThread(); conversation.setLockThread(false); + backPressedLeaveSingleThread.setEnabled(false); if (wasLocked) { conversation.setUserSelectedThread(false); refresh(); @@ -1275,6 +1288,7 @@ public class ConversationFragment extends XmppFragment binding.threadIdenticonLayout.setOnLongClickListener(v -> { boolean wasLocked = conversation.getLockThread(); conversation.setLockThread(false); + backPressedLeaveSingleThread.setEnabled(false); setThread(null); conversation.setUserSelectedThread(true); if (wasLocked) refresh(); @@ -1527,6 +1541,7 @@ public class ConversationFragment extends XmppFragment return true; case R.id.only_this_thread: conversation.setLockThread(true); + backPressedLeaveSingleThread.setEnabled(true); setThread(selectedMessage.getThread()); refresh(); return true; @@ -1610,6 +1625,19 @@ public class ConversationFragment extends XmppFragment return super.onOptionsItemSelected(item); } + public boolean onBackPressed() { + boolean wasLocked = conversation.getLockThread(); + conversation.setLockThread(false); + backPressedLeaveSingleThread.setEnabled(false); + if (wasLocked) { + conversation.setUserSelectedThread(false); + refresh(); + updateThreadFromLastMessage(); + return true; + } + return false; + } + private void startSearch() { final Intent intent = new Intent(getActivity(), SearchActivity.class); intent.putExtra(SearchActivity.EXTRA_CONVERSATION_UUID, conversation.getUuid()); diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java index a7e7685b9be70210d1b59a281b1e6ac074bdbb49..eebec59891c9624f5a7780a077f5a69cf874ef47 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java @@ -492,6 +492,12 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio switch (item.getItemId()) { case android.R.id.home: FragmentManager fm = getFragmentManager(); + Fragment f = fm.getFragments().get(fm.getFragments().size() - 1); + if (f != null && f instanceof ConversationFragment) { + if (((ConversationFragment) f).onBackPressed()) { + return true; + } + } if (fm.getBackStackEntryCount() > 0) { try { fm.popBackStack();