diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index dcf461bb48..fdd72c3466 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -254,6 +254,11 @@
+
+
.
+
+ Copyright 2018-2021 by Marcel Bokhorst (M66B)
+*/
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.text.method.LinkMovementMethod;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageButton;
+import android.widget.TextView;
+
+public class ActivityError extends ActivityBase {
+ static final int PI_ERROR = 1;
+ static final int PI_ALERT = 2;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ getSupportActionBar().setSubtitle(getString(R.string.title_setup_error));
+
+ View view = LayoutInflater.from(this).inflate(R.layout.activity_error, null);
+ setContentView(view);
+
+ TextView tvTitle = view.findViewById(R.id.tvTitle);
+ TextView tvMessage = view.findViewById(R.id.tvMessage);
+ ImageButton ibInfo = view.findViewById(R.id.ibInfo);
+
+ Intent intent = getIntent();
+ String type = intent.getStringExtra("type");
+ String title = intent.getStringExtra("title");
+ String message = intent.getStringExtra("message");
+ int faq = intent.getIntExtra("faq", -1);
+
+ tvTitle.setText(title);
+ tvMessage.setMovementMethod(LinkMovementMethod.getInstance());
+ tvMessage.setText(message);
+
+ ibInfo.setVisibility(faq > 0 ? View.VISIBLE : View.GONE);
+ ibInfo.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View view) {
+ Helper.viewFAQ(view.getContext(), faq);
+ }
+ });
+ }
+}
diff --git a/app/src/main/java/eu/faircode/email/ActivityView.java b/app/src/main/java/eu/faircode/email/ActivityView.java
index ef2ce168f7..47509e26cd 100644
--- a/app/src/main/java/eu/faircode/email/ActivityView.java
+++ b/app/src/main/java/eu/faircode/email/ActivityView.java
@@ -19,6 +19,10 @@ package eu.faircode.email;
Copyright 2018-2021 by Marcel Bokhorst (M66B)
*/
+import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
+import static androidx.drawerlayout.widget.DrawerLayout.LOCK_MODE_LOCKED_OPEN;
+import static androidx.drawerlayout.widget.DrawerLayout.LOCK_MODE_UNLOCKED;
+
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.app.NotificationManager;
@@ -81,10 +85,6 @@ import java.util.List;
import javax.net.ssl.HttpsURLConnection;
-import static android.content.res.Configuration.ORIENTATION_PORTRAIT;
-import static androidx.drawerlayout.widget.DrawerLayout.LOCK_MODE_LOCKED_OPEN;
-import static androidx.drawerlayout.widget.DrawerLayout.LOCK_MODE_UNLOCKED;
-
public class ActivityView extends ActivityBilling implements FragmentManager.OnBackStackChangedListener {
private String startup;
@@ -121,13 +121,12 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
static final int PI_UNIFIED = 1;
static final int PI_WHY = 2;
- static final int PI_ALERT = 3;
- static final int PI_THREAD = 4;
- static final int PI_OUTBOX = 5;
- static final int PI_ERROR = 6;
- static final int PI_UPDATE = 7;
- static final int PI_WIDGET = 8;
- static final int PI_POWER = 9;
+ static final int PI_THREAD = 3;
+ static final int PI_OUTBOX = 4;
+ static final int PI_ERROR = 5;
+ static final int PI_UPDATE = 6;
+ static final int PI_WIDGET = 7;
+ static final int PI_POWER = 8;
static final String ACTION_VIEW_FOLDERS = BuildConfig.APPLICATION_ID + ".VIEW_FOLDERS";
static final String ACTION_VIEW_MESSAGES = BuildConfig.APPLICATION_ID + ".VIEW_MESSAGES";
@@ -1166,11 +1165,11 @@ public class ActivityView extends ActivityBilling implements FragmentManager.OnB
Helper.viewFAQ(this, 2);
}
- } else if ("alert".equals(action) || "error".equals(action)) {
+ } else if ("error".equals(action)) {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
getSupportFragmentManager().popBackStack("unified", 0);
- Helper.viewFAQ(this, "alert".equals(action) ? 23 : 22);
+ Helper.viewFAQ(this, 22);
} else if ("outbox".equals(action)) {
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED))
diff --git a/app/src/main/java/eu/faircode/email/Core.java b/app/src/main/java/eu/faircode/email/Core.java
index 1fa37930e9..35fd8c21de 100644
--- a/app/src/main/java/eu/faircode/email/Core.java
+++ b/app/src/main/java/eu/faircode/email/Core.java
@@ -632,7 +632,7 @@ class Core {
String title = (resid == 0 ? null : context.getString(resid));
if (title != null) {
NotificationCompat.Builder builder =
- getNotificationError(context, "warning", title, ex);
+ getNotificationError(context, "warning", account, message.id, new Throwable(title, ex));
nm.notify(op.name + ":" + op.message,
NotificationHelper.NOTIFICATION_TAGGED,
builder.build());
@@ -4852,19 +4852,26 @@ class Core {
// MailConnectException
// - on connectivity problems when connecting to store
- static NotificationCompat.Builder getNotificationError(Context context, String channel, String title, Throwable ex) {
+ static NotificationCompat.Builder getNotificationError(Context context, String channel, EntityAccount account, long id, Throwable ex) {
+ String title = context.getString(R.string.title_notification_failed, account.name);
+ String message = Log.formatThrowable(ex, "\n", false);
+
// Build pending intent
- Intent intent = new Intent(context, ActivityView.class);
- intent.setAction("error");
+ Intent intent = new Intent(context, ActivityError.class);
+ intent.setAction(channel + ":" + account.id + ":" + id);
+ intent.putExtra("type", channel);
+ intent.putExtra("title", title);
+ intent.putExtra("message", message);
+ intent.putExtra("faq", 22);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pi = PendingIntentCompat.getActivity(
- context, ActivityView.PI_ERROR, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+ context, ActivityError.PI_ERROR, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// Build notification
NotificationCompat.Builder builder =
new NotificationCompat.Builder(context, channel)
.setSmallIcon(R.drawable.baseline_warning_white_24)
- .setContentTitle(context.getString(R.string.title_notification_failed, title))
+ .setContentTitle(title)
.setContentText(Log.formatThrowable(ex, false))
.setContentIntent(pi)
.setAutoCancel(false)
@@ -4873,8 +4880,7 @@ class Core {
.setOnlyAlertOnce(true)
.setCategory(NotificationCompat.CATEGORY_ERROR)
.setVisibility(NotificationCompat.VISIBILITY_SECRET)
- .setStyle(new NotificationCompat.BigTextStyle()
- .bigText(Log.formatThrowable(ex, "\n", false)));
+ .setStyle(new NotificationCompat.BigTextStyle().bigText(message));
return builder;
}
diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java
index 938fa7dd48..380f1f45b3 100644
--- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java
+++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java
@@ -1160,19 +1160,25 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
return builder;
}
- private NotificationCompat.Builder getNotificationAlert(String account, String message) {
+ private NotificationCompat.Builder getNotificationAlert(EntityAccount account, String message) {
+ String title = getString(R.string.title_notification_alert, account.name);
+
// Build pending intent
- Intent alert = new Intent(this, ActivityView.class);
- alert.setAction("alert");
- alert.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ Intent intent = new Intent(this, ActivityError.class);
+ intent.setAction("alert:" + account.id);
+ intent.putExtra("type", "alert");
+ intent.putExtra("title", title);
+ intent.putExtra("message", message);
+ intent.putExtra("faq", 23);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent piAlert = PendingIntentCompat.getActivity(
- this, ActivityView.PI_ALERT, alert, PendingIntent.FLAG_UPDATE_CURRENT);
+ this, ActivityError.PI_ALERT, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// Build notification
NotificationCompat.Builder builder =
new NotificationCompat.Builder(this, "alerts")
.setSmallIcon(R.drawable.baseline_warning_white_24)
- .setContentTitle(getString(R.string.title_notification_alert, account))
+ .setContentTitle(title)
.setContentText(message)
.setContentIntent(piAlert)
.setAutoCancel(false)
@@ -1275,7 +1281,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify("alert:" + account.id,
NotificationHelper.NOTIFICATION_TAGGED,
- getNotificationAlert(account.name, message).build());
+ getNotificationAlert(account, message).build());
} catch (Throwable ex) {
Log.w(ex);
}
@@ -1309,7 +1315,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify("receive:" + account.id,
NotificationHelper.NOTIFICATION_TAGGED,
- Core.getNotificationError(this, "error", account.name, ex)
+ Core.getNotificationError(this, "error", account, 0, ex)
.build());
} catch (Throwable ex1) {
Log.w(ex1);
@@ -2035,7 +2041,7 @@ public class ServiceSynchronize extends ServiceBase implements SharedPreferences
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify("receive:" + account.id,
NotificationHelper.NOTIFICATION_TAGGED,
- Core.getNotificationError(this, "warning", account.name, warning)
+ Core.getNotificationError(this, "warning", account, 0, warning)
.build());
} catch (Throwable ex1) {
Log.w(ex1);
diff --git a/app/src/main/res/layout/activity_error.xml b/app/src/main/res/layout/activity_error.xml
new file mode 100644
index 0000000000..0458bc30dc
--- /dev/null
+++ b/app/src/main/res/layout/activity_error.xml
@@ -0,0 +1,81 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file