Fix memory leak

Stephen Paul Weber created

Change summary

src/main/java/eu/siacs/conversations/entities/Conversation.java   |  6 
src/main/java/eu/siacs/conversations/ui/ConversationFragment.java |  3 
src/main/java/eu/siacs/conversations/ui/XmppFragment.java         | 43 
3 files changed, 49 insertions(+), 3 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/entities/Conversation.java 🔗

@@ -1388,7 +1388,11 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
                 oldConversation.pagerAdapter.mTabs = null;
             }
 
-            if (mPager == null) return;
+            if (mPager == null) {
+                page1 = null;
+                page2 = null;
+                return;
+            }
             if (sessions != null) show();
 
             if (pager.getChildAt(0) != null) page1 = pager.getChildAt(0);

src/main/java/eu/siacs/conversations/ui/ConversationFragment.java 🔗

@@ -1215,7 +1215,7 @@ public class ConversationFragment extends XmppFragment
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setHasOptionsMenu(true);
-        activity.getOnBackPressedDispatcher().addCallback(backPressedLeaveSingleThread);
+        activity.getOnBackPressedDispatcher().addCallback(this, backPressedLeaveSingleThread);
     }
 
     @Override
@@ -1378,6 +1378,7 @@ public class ConversationFragment extends XmppFragment
         messageListAdapter.setOnContactPictureClicked(null);
         messageListAdapter.setOnContactPictureLongClicked(null);
         messageListAdapter.setOnInlineImageLongClicked(null);
+        binding.conversationViewPager.setAdapter(null);
         if (conversation != null) conversation.setupViewPager(null, null, false, null);
     }
 

src/main/java/eu/siacs/conversations/ui/XmppFragment.java 🔗

@@ -32,9 +32,15 @@ package eu.siacs.conversations.ui;
 import android.app.Activity;
 import android.app.Fragment;
 
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleRegistry;
+import androidx.lifecycle.LifecycleOwner;
+
 import eu.siacs.conversations.ui.interfaces.OnBackendConnected;
 
-public abstract class XmppFragment extends Fragment implements OnBackendConnected {
+public abstract class XmppFragment extends Fragment implements OnBackendConnected, LifecycleOwner {
+
+	protected LifecycleRegistry lifecycle = new LifecycleRegistry(this);
 
 	abstract void refresh();
 	public void refreshForNewCaps() { }
@@ -45,4 +51,39 @@ public abstract class XmppFragment extends Fragment implements OnBackendConnecte
 			activity.runOnUiThread(runnable);
 		}
 	}
+
+	@Override
+	public void onStart() {
+		super.onStart();
+		lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START);
+	}
+
+	@Override
+	public void onResume() {
+		super.onResume();
+		lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
+	}
+
+	@Override
+	public void onPause() {
+		lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
+		super.onPause();
+	}
+
+	@Override
+	public void onStop() {
+		lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
+		super.onStop();
+	}
+
+	@Override
+	public void onDestroy() {
+		lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
+		super.onDestroy();
+	}
+
+	@Override
+	public Lifecycle getLifecycle() {
+		return lifecycle;
+	}
 }