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