diff --git a/app/src/main/java/eu/faircode/email/ActivityBase.java b/app/src/main/java/eu/faircode/email/ActivityBase.java index ab58484b80..ce9e7d22eb 100644 --- a/app/src/main/java/eu/faircode/email/ActivityBase.java +++ b/app/src/main/java/eu/faircode/email/ActivityBase.java @@ -35,10 +35,15 @@ import java.util.List; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Lifecycle; +import androidx.lifecycle.LifecycleObserver; +import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.OnLifecycleEvent; import androidx.preference.PreferenceManager; abstract class ActivityBase extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener { private boolean contacts; + private List backPressedListeners = new ArrayList<>(); @Override protected void attachBaseContext(Context base) { @@ -148,16 +153,19 @@ abstract class ActivityBase extends AppCompatActivity implements SharedPreferenc return findViewById(android.R.id.content); } - private List backPressedListeners = new ArrayList<>(); + void addBackPressedListener(final IBackPressedListener listener, LifecycleOwner owner) { + owner.getLifecycle().addObserver(new LifecycleObserver() { + @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) + public void onDestroyed() { + Log.i("Removing back listener=" + listener); + backPressedListeners.remove(listener); + } + }); - public void addBackPressedListener(IBackPressedListener listener) { + Log.i("Adding back listener=" + listener); backPressedListeners.add(listener); } - public void removeBackPressedListener(IBackPressedListener listener) { - backPressedListeners.remove(listener); - } - @Override public void onBackPressed() { for (IBackPressedListener listener : backPressedListeners) diff --git a/app/src/main/java/eu/faircode/email/FragmentBase.java b/app/src/main/java/eu/faircode/email/FragmentBase.java index 1eee675a60..4dd8b026a4 100644 --- a/app/src/main/java/eu/faircode/email/FragmentBase.java +++ b/app/src/main/java/eu/faircode/email/FragmentBase.java @@ -148,4 +148,8 @@ public class FragmentBase extends Fragment { return false; return activity.hasPermission(name); } + + void addBackPressedListener(ActivityBase.IBackPressedListener listener) { + ((ActivityBase) getActivity()).addBackPressedListener(listener, getViewLifecycleOwner()); + } } diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index d4b7ad5f5e..6a81ec7cf0 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -406,8 +406,7 @@ public class FragmentCompose extends FragmentBase { } }); - ((ActivityBase) getActivity()).addBackPressedListener(onBackPressedListener); - + addBackPressedListener(onBackPressedListener); // Initialize setSubtitle(R.string.title_compose); @@ -613,8 +612,6 @@ public class FragmentCompose extends FragmentBase { if (pgpService != null) pgpService.unbindFromService(); - ((ActivityBase) getActivity()).removeBackPressedListener(onBackPressedListener); - super.onDestroyView(); } diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 08e4b6f1de..18cda94223 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -511,7 +511,7 @@ public class FragmentMessages extends FragmentBase { } }); - ((ActivityBase) getActivity()).addBackPressedListener(onBackPressedListener); + addBackPressedListener(onBackPressedListener); // Initialize swipeRefresh.setEnabled(false); @@ -1607,12 +1607,6 @@ public class FragmentMessages extends FragmentBase { }.execute(FragmentMessages.this, args, "messages:move"); } - @Override - public void onDestroyView() { - ((ActivityBase) getActivity()).removeBackPressedListener(onBackPressedListener); - super.onDestroyView(); - } - @Override public void onSaveInstanceState(Bundle outState) { outState.putString("fair:searching", searching);