diff --git a/app/src/main/java/eu/faircode/email/ActivityBase.java b/app/src/main/java/eu/faircode/email/ActivityBase.java index 869442e862..185e678d32 100644 --- a/app/src/main/java/eu/faircode/email/ActivityBase.java +++ b/app/src/main/java/eu/faircode/email/ActivityBase.java @@ -97,6 +97,10 @@ abstract class ActivityBase extends AppCompatActivity implements SharedPreferenc 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/FragmentAnswer.java b/app/src/main/java/eu/faircode/email/FragmentAnswer.java index 977c66a90a..f099c68907 100644 --- a/app/src/main/java/eu/faircode/email/FragmentAnswer.java +++ b/app/src/main/java/eu/faircode/email/FragmentAnswer.java @@ -35,6 +35,7 @@ import com.google.android.material.bottomnavigation.BottomNavigationView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.constraintlayout.widget.Group; +import androidx.lifecycle.Lifecycle; import androidx.lifecycle.Observer; public class FragmentAnswer extends FragmentEx { @@ -84,6 +85,8 @@ public class FragmentAnswer extends FragmentEx { } }); + ((ActivityBase) getActivity()).addBackPressedListener(onBackPressedListener); + // Initialize grpReady.setVisibility(View.GONE); pbWait.setVisibility(View.VISIBLE); @@ -91,6 +94,12 @@ public class FragmentAnswer extends FragmentEx { return view; } + @Override + public void onDestroyView() { + ((ActivityBase) getActivity()).removeBackPressedListener(onBackPressedListener); + super.onDestroyView(); + } + @Override public void onActivityCreated(@Nullable final Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); @@ -187,4 +196,31 @@ public class FragmentAnswer extends FragmentEx { } }.load(this, args); } + + private void handleExit() { + if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) + new DialogBuilderLifecycle(getContext(), getViewLifecycleOwner()) + .setMessage(R.string.title_ask_save) + .setPositiveButton(R.string.title_yes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + onActionSave(); + } + }) + .setNegativeButton(R.string.title_no, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + finish(); + } + }) + .show(); + } + + ActivityBase.IBackPressedListener onBackPressedListener = new ActivityBase.IBackPressedListener() { + @Override + public boolean onBackPressed() { + handleExit(); + return true; + } + }; } diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 0a901354bd..cef6177c70 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -263,13 +263,7 @@ public class FragmentCompose extends FragmentEx { } }); - ((ActivityBase) getActivity()).addBackPressedListener(new ActivityBase.IBackPressedListener() { - @Override - public boolean onBackPressed() { - handleExit(); - return true; - } - }); + ((ActivityBase) getActivity()).addBackPressedListener(onBackPressedListener); setHasOptionsMenu(true); @@ -372,6 +366,8 @@ public class FragmentCompose extends FragmentEx { if (pgpService != null) pgpService.unbindFromService(); + ((ActivityBase) getActivity()).removeBackPressedListener(onBackPressedListener); + super.onDestroyView(); } @@ -1731,4 +1727,12 @@ public class FragmentCompose extends FragmentEx { return view; } } + + private ActivityBase.IBackPressedListener onBackPressedListener = new ActivityBase.IBackPressedListener() { + @Override + public boolean onBackPressed() { + handleExit(); + return true; + } + }; } \ No newline at end of file diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 8dccfd4b24..9ac5eff7e6 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -754,16 +754,7 @@ public class FragmentMessages extends FragmentEx { } }); - ((ActivityBase) getActivity()).addBackPressedListener(new ActivityBase.IBackPressedListener() { - @Override - public boolean onBackPressed() { - if (selectionTracker != null && selectionTracker.hasSelection()) { - selectionTracker.clearSelection(); - return true; - } - return false; - } - }); + ((ActivityBase) getActivity()).addBackPressedListener(onBackPressedListener); // Initialize tvNoEmail.setVisibility(View.GONE); @@ -778,6 +769,12 @@ public class FragmentMessages extends FragmentEx { return view; } + @Override + public void onDestroyView() { + ((ActivityBase) getActivity()).removeBackPressedListener(onBackPressedListener); + super.onDestroyView(); + } + @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); @@ -1329,4 +1326,15 @@ public class FragmentMessages extends FragmentEx { } }.load(this, args); } + + ActivityBase.IBackPressedListener onBackPressedListener = new ActivityBase.IBackPressedListener() { + @Override + public boolean onBackPressed() { + if (selectionTracker != null && selectionTracker.hasSelection()) { + selectionTracker.clearSelection(); + return true; + } + return false; + } + }; } diff --git a/app/src/main/java/eu/faircode/email/FragmentWebView.java b/app/src/main/java/eu/faircode/email/FragmentWebView.java index 4d8fa83114..5b7b51406c 100644 --- a/app/src/main/java/eu/faircode/email/FragmentWebView.java +++ b/app/src/main/java/eu/faircode/email/FragmentWebView.java @@ -39,13 +39,16 @@ import androidx.annotation.Nullable; // https://developer.android.com/reference/android/webkit/WebView public class FragmentWebView extends FragmentEx { + private ProgressBar progressBar; + private WebView webview; + @Override @Nullable public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_webview, container, false); - final ProgressBar progressBar = view.findViewById(R.id.progressbar); - final WebView webview = view.findViewById(R.id.webview); + progressBar = view.findViewById(R.id.progressbar); + webview = view.findViewById(R.id.webview); progressBar.setProgress(0); progressBar.setVisibility(View.VISIBLE); @@ -105,21 +108,29 @@ public class FragmentWebView extends FragmentEx { }.load(this, args); } - ((ActivityBase) getActivity()).addBackPressedListener(new ActivityBase.IBackPressedListener() { - @Override - public boolean onBackPressed() { - boolean can = webview.canGoBack(); - if (can) - webview.goBack(); - - Bundle args = getArguments(); - if (args.containsKey("from") && !webview.canGoBack()) - setSubtitle(args.getString("from")); - - return can; - } - }); + ((ActivityBase) getActivity()).addBackPressedListener(onBackPressedListener); return view; } + + @Override + public void onDestroyView() { + ((ActivityBase) getActivity()).removeBackPressedListener(onBackPressedListener); + super.onDestroyView(); + } + + ActivityBase.IBackPressedListener onBackPressedListener = new ActivityBase.IBackPressedListener() { + @Override + public boolean onBackPressed() { + boolean can = webview.canGoBack(); + if (can) + webview.goBack(); + + Bundle args = getArguments(); + if (args.containsKey("from") && !webview.canGoBack()) + setSubtitle(args.getString("from")); + + return can; + } + }; } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1af2c931fd..8b4ffdf28a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -223,6 +223,7 @@ Delete selected messages permanently? Delete reply template permanently? Discard draft? + Save changes? Report message as spam? Showing the original message can leak privacy sensitive information Showing images can leak privacy sensitive information