Back exists single thread view

Stephen Paul Weber created

Change summary

src/main/java/eu/siacs/conversations/ui/ConversationFragment.java  | 28 
src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java |  6 
2 files changed, 34 insertions(+)

Detailed changes

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());

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();